verilog 中 case 'inside's 的用途是什么?它是可合成的吗?

what are the uses of case 'inside's in verilog ? is it synthesizable?

在 verilog 中,我们有“内部”案例。它的用途是什么?它可以合成吗?

例如:

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

在 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

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

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


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