SystemVerilog 数组的位到国际强制转换



我有以下SystemVerilog变量:

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

我想获取它的逐位逆运算,然后将该结果放入int变量中,将底层位视为无符号,因此首先我这样做:

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:

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( 宽度。

还要考虑:

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

输出:

000001
11111111111111111111111111000001

最新更新