case语句,多个case执行相同的操作

时间:2017-12-07 19:15:10

标签: verilog system-verilog

我需要使用一个case语句,控制信号为4位。我有多个这4位执行相同操作的情况,如何使代码更简洁?

例如:

  casez (fbe)  //fbe is defined as logic [3:0] fbe;
   4'b0000: begin
    // operation a
   end
   4'b???1 : begin
    // operation b
   end

操作a和操作b完全相同。如何将这2个折叠成一个案例?像(fbe == 4' b0000)| (fbe == 4' b ??? 1)成一个案例?

2 个答案:

答案 0 :(得分:4)

您可以使用逗号分隔将执行操作的所有案例表达式。 default条件不能在此列表中(因为它将是多余的)。

示例:

casez(fbe)
  4'b0000, 4'b???1 : begin /* do same stuff */ end
  4'b??10 : begin /* do other stuff */ end
  default : begin ... end
endcase

IEEE Verilog和SystemVerilog LRM中记录了这些示例。例如IEEE1364-1995§9.5案例陈述IEEE1800-2012§12.5案例陈述

答案 1 :(得分:4)

在SystemVerilog中,您应该使用case (expression) inside语句。 (§12.5.4设置成员资格案例陈述)。这使您可以使用inside运算符使用的相同类型的表达式列表,例如一系列值。它还具有不对称的通配符匹配。这意味着只有案例项中的Z变为通配符,而不是案例表达式中的Z.例如

case (fbe) inside
  4'b0000, 4'b0??1: begin end // 0, and 1,3,7
  [9:11]: begin end // 9,10,11
  default: begin end //2,4,6,8,12-15
endcase

如果由于某种原因fbe4'bz000,则会采用默认值。 casez会匹配4'b0000