verilog中的case'inside'有什么用?它可以合成吗?

yas*_*han 3 verilog system-verilog

在verilog中,我们有'inside'的情况。它的用途是什么?它可以综合吗?

例如:

case(in) inside
  4'b0000, 4'b00?1: ; // 0 and 1,3
  [5:7]: ; // 5,6,7
  default: ;
endcase
Run Code Online (Sandbox Code Playgroud)

Mat*_*lor 7

在Verilog中你没有case inside-那就是SystemVerilog的。在Verilog中,如果要在case语句中使用通配符,则必须使用casezcasex。在casez声明中,一种Z手段无关紧要;在casex声明中,一个Z或一个X手段无关紧要,例如

casez (in)
  4'b0000, 4'b00z1: ; // 0 and 1,3
  4'b0101, 4'b0110, 4'b0111: ; // 5,6,7
  default: ;
endcase
Run Code Online (Sandbox Code Playgroud)

或者,因为a ?是的确切同义词Z

casez (in)
  4'b0000, 4'b00?1: ; // 0 and 1,3
  4'b0101, 4'b0110, 4'b0111: ; // 5,6,7
  default: ;
endcase
Run Code Online (Sandbox Code Playgroud)

或者,使用casex

casez (in)
  4'b0000, 4'b00x1: ; // 0 and 1,3
  4'b0101, 4'b0110, 4'b0111: ; // 5,6,7
  default: ;
endcase
Run Code Online (Sandbox Code Playgroud)

添加了SystemVerilog case inside,它更好,因为它允许使用范围(如您的原始示例一样):

  [5:7]: ; // 5,6,7
Run Code Online (Sandbox Code Playgroud)

并且因为它是不对称的。使用casex是Verilog中第二大罪过(仅次于使用有序端口映射)。这是因为casex对称的(是casez)。通过这个,我的意思是在输入表达式中casex使用Xin(in在您的示例中)也表示无关紧要,这意味着如果输入表达式转到,X则所有分支都匹配(并且第一个执行,因为第一个匹配的分支已执行在Verilog case语句中)。其结果是,如果网络或变量转到Xcasex将过滤掉它而不是传播它,这意味着可能会隐藏一个错误。不会发生这种情况case inside,因为XZ)在输入表达式中并不表示无关(这就是我所说的不对称)。

因此,您将case inside在需要case通配符或范围的语句的任何地方使用。是的-它是可综合的。


casez在Verilog中被认为更安全,因为输入表达式不太可能虚假地转到Z

  • Verliog 中的一个不错的小技巧是使用 casez(in | 'h0)。将高 Z 与 0 进行“或”运算会得到 X。允许在 case 语句中使用通配符,同时在模拟过程中仍将高 Z 和 X 作为未知数传播。综合将忽略多余的 OR 与 0 (2认同)