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

时间:2019-08-13 03:26:20

标签: verilog system-verilog

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

例如:

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

1 个答案:

答案 0 :(得分:7)

在Verilog中,您没有case inside-即 SystemVerilog 。在 Verilog 中,如果要在case语句中使用通配符,则必须使用casezcasex。在casez语句中,Z表示无关。在casex语句中,ZX表示无关,例如

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

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

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

或者,用casex

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

SystemVerilog添加了case inside,这更好,因为它允许使用 ranges (就像您的原始示例一样):

  [5:7]: ; // 5,6,7

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

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


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