我的Verilog testbench代码定义了一个模块,有这些参数。
parameter PHASE_BITS = 32;
parameter real MAX_PHASE = 1 << PHASE_BITS;
我无法得到 MAX_PHASE
具备预期值 4294967296
或其近似值;ModelSim向我展示了 0
而不是。尽管事实是 MAX_PHASE
被声明为实数。
我想这其中涉及到一些整数溢出,因为如果将 PHASE_BITS
是降低到31。
如何使这个参数等于2的另一个参数的幂?
问题出在右手表达式本身。
1 << PHASE_BITS
它是在考虑它被存储到的变量类型之前被评估的。因为 1
是一个整数文字,而Verilog中的整数是有符号的32位,所以 <<
操作符(左移操作符)将输出一个相同类型的整数,并将导致溢出,如果 PHASE_BITS
是高于31的。
我们可以强迫 1
来代替一个真实的文字。
1.0 << PHASE_BITS
但这会导致编译时的错误,因为... <<
对于实值没有定义。
让我们使用普通的2-power-to-N。
2.0 ** PHASE_BITS
这将产生预期的结果。4.29497e+09
.