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)
在Verilog中你没有case inside-那就是SystemVerilog的。在Verilog中,如果要在case语句中使用通配符,则必须使用casez或casex。在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语句中)。其结果是,如果网络或变量转到X,casex将过滤掉它而不是传播它,这意味着可能会隐藏一个错误。不会发生这种情况case inside,因为X(Z)在输入表达式中并不表示无关(这就是我所说的不对称)。
因此,您将case inside在需要case通配符或范围的语句的任何地方使用。是的-它是可综合的。
casez在Verilog中被认为更安全,因为输入表达式不太可能虚假地转到Z。