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.
谁能解释为什么会这样?和自决规则有关系吗?
- 显式 int'() 强制转换是不必要的,因为对 int 变量的赋值会创建对 int 的隐式强制转换。还要意识到您正在尝试使用这些变量声明初始化,因为它们的执行顺序是未定义的。但这对给出的答案没有影响。
-
感谢 Dave 的提醒。通常,为了清楚起见,我尝试明确使用强制转换,在我的实际应用程序中,这些是始终块中的自动变量,因此应该明确定义顺序。但是,您是说程序上下文之外的静态变量初始化没有顺序?所以不可能可靠地初始化模块中依赖于模块中其他静态变量初始值的静态变量?
-
stackoverflow.com/questions/29822181/…
-
这不是指跨多个类的静态变量的情况吗?我不知道在单个 C 比较单元或 C 类中发生的排序问题,或者在 SV 中的单个模块中发生的排序问题。我的意思是我们已经用参数和 localparams 解决了一段时间,为什么这里会有回归?
-
在类或模块中初始化静态变量的问题没有区别。 (除了静态类变量,该问题更可能导致致命的空句柄引用)我提出的具体问题是依赖于使用另一个静态变量的初始化来初始化一个静态变量。这不是在过程代码中使用静态变量。
-
是的,我们在谈论我认为的同一件事。具体来说,我想知道在单个模块中初始化两个静态变量,例如:module top; int a = 5; int b = a+1; endmodule。在这种情况下,您是说 b 的值有时是未定义的?
-
根据 LRM 正确。可能需要作为一个新问题提出,因为我们对这个问题不感兴趣
您的诊断是正确的。这在 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 |