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
语句中使用通配符,则必须使用 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
或者,因为 ?
是 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
也是)。通过这个,我的意思是输入表达式中的 casex
和 X
(在您的示例中为 in
)也意味着不在乎,这意味着如果输入表达式转到 X
然后所有分支匹配(第一个被执行,因为第一个匹配的分支是在 Verilog case
语句中执行的)。这样做的结果是,如果网络或变量转到 X
,casex
将过滤掉它而不是传播它,这意味着可能会隐藏错误。 case
inside
不会发生这种情况,因为输入表达式 中的 X
(或 Z
)并不 表示不不在乎(这就是我所说的 不对称 的意思)。
因此,您可以在需要带有通配符或范围的 case
语句的任何地方使用 case
inside
。是的 - 它是可合成的。
casez
在 Verilog 中被认为更安全,因为输入表达式不太可能虚假地转到 Z
.
在 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
语句中使用通配符,则必须使用 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
或者,因为 ?
是 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
也是)。通过这个,我的意思是输入表达式中的 casex
和 X
(在您的示例中为 in
)也意味着不在乎,这意味着如果输入表达式转到 X
然后所有分支匹配(第一个被执行,因为第一个匹配的分支是在 Verilog case
语句中执行的)。这样做的结果是,如果网络或变量转到 X
,casex
将过滤掉它而不是传播它,这意味着可能会隐藏错误。 case
inside
不会发生这种情况,因为输入表达式 中的 X
(或 Z
)并不 表示不不在乎(这就是我所说的 不对称 的意思)。
因此,您可以在需要带有通配符或范围的 case
语句的任何地方使用 case
inside
。是的 - 它是可合成的。
casez
在 Verilog 中被认为更安全,因为输入表达式不太可能虚假地转到 Z
.