多个执行相同操作的案例的陈述

Gau*_*pte 0 verilog system-verilog

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

例如:

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

操作a和操作b完全相同。如何将这两个折叠成一个盒子?像(fbe == 4'b0000)| (fbe == 4'b ??? 1)变成单个情况?

dav*_*_59 7

在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
Run Code Online (Sandbox Code Playgroud)

如果fbe4'bz000出于某种原因,默认将采取。casez本来可以匹配的4'b0000

  • 所有支持 SystemVerilog 的仿真工具都支持这一点。综合工具通常有点落后。见 http://sutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_paper.pdf (2认同)

Gre*_*reg 6

您可以使用逗号分隔将执行操作的所有大小写表达式。该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
Run Code Online (Sandbox Code Playgroud)

这在IEEE Verilog和SystemVerilog LRM中带有示例记录。如IEEE1364-1995 §9.5 Case语句IEEE1800-2012 §12.5 Case语句