在Verilog中,大小写“内部”有什么用?它是可合成的吗?

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

提问人:yasara malshan 提问时间:8/13/2019 更新时间:8/13/2019 访问量:5897

问:

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

例如:

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

评论


答:

9赞 Matthew Taylor 8/13/2019 #1

在Verilog中,您没有 - 那就是SystemVerilog。在Verilog中,如果要在语句中使用通配符,则必须使用或。在声明中,手段不在乎;在语句中,a 或 an 表示不在乎,例如caseinsidecasecasezcasexcasezZcasexZX

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 添加了 ,这更好,因为它允许使用范围(如原始示例中所示):caseinside

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

因为它是不对称的。使用是Verilog中的第二大罪过(仅次于使用有序端口映射)。这是因为是对的(原样)。我的意思是,在输入表达式中使用 (在您的示例中)也意味着不在乎,这意味着如果输入表达式转到,则所有分支都匹配(并且执行第一个分支,因为第一个匹配分支是在 Verilog 语句中执行的)。这样做的结果是,如果一个网络或变量转到 ,将过滤掉它而不是传播它,这意味着错误可能会被隐藏。这不会发生在 上,因为输入表达式中的 (or ) 并不意味着不在乎(这就是我所说的不对称的意思)。casexcasexcasezcasexXinXcaseXcasexcaseinsideXZ

因此,你可以使用任何你想要带有通配符或范围的语句。是的 - 它是可合成的。caseinsidecase


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

评论

1赞 onlinespending 2/14/2021
Verliog 中一个不错的小技巧是使用 casez(in |'h0)。对高 Z 进行 0 的 OR 处理会产生 X。允许在 case 语句中使用通配符,同时在仿真期间仍将高 Z 和 X 作为未知数传播。综合将忽略多余的 OR,0