关于verilog:SystemVerilog Array of Bits to Int Casting

SystemVerilog Array of Bits to Int Casting

我有以下 SystemVerilog 变量:

1
bit [5:0] my_bits = 6'h3E;            // my_bits == 6'd62

我想取其按位取反,然后将该结果放入一个 int 变量中,将底层位视为无符号,所以首先我这样做了:

1
2
bit [5:0] my_bits_inv = ~my_bits;     // my_bits_inv = 6'b00_0001
int       my_int = int'(my_bits_inv); // my_int = 1

这给了我想要的。但是,如果我将反转和强制转换合并为一个步骤,我会得到 -63:

1
int       my_int2 = int'(~my_bits); // my_int2 = -63 ???

大概它将 my_bits 视为 32 位,然后取其倒数给出 int'(~32'h0000_003E) = int'(32'hFFFF_FFC1) = -63.

谁能解释为什么会这样?和自决规则有关系吗?


您的诊断是正确的。这在 IEEE Std 1800-2017,第 11.6.1 节表达式位长度规则中进行了解释。在您的情况下,使用 int' 进行强制转换会扩展 my_bits 以匹配按位反转之前的 int (32) 的宽度。

同时考虑:

1
2
$displayb(~my_bits);
$displayb(int'(~my_bits));

输出:

1
2
000001
11111111111111111111111111000001