我有以下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