我需要使用一个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)成一个案例?
答案 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
如果由于某种原因fbe
为4'bz000
,则会采用默认值。 casez
会匹配4'b0000
。