首页 > 解决方案 > 在 verilog 中 case 'inside's 的用途是什么?可以合成吗?

问题描述

在verilog中,我们有case'inside's。它的用途是什么?它可以合成吗?

例如:

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

标签: verilogsystem-verilog

解决方案


在 Verilog 你没有case inside- 那是SystemVerilog。在Verilog中,如果要在case语句中使用通配符,则必须使用casezor casex。在casez声明中,Z手段不在乎;在casex声明中,aZX手段不关心,例如

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

或者,因为 a?是 的确切同义词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 added case inside,这更好,因为它允许使用范围(就像在您的原始示例中一样):

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

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

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


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


推荐阅读