编译时的 Verilog 浮点运算?

Verilog floating point arithmetic at compile time?

我的 Verilog 测试平台代码使用这些参数定义了一个模块:

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 次幂到 N:

2.0 ** PHASE_BITS

这将产生所需的结果,4.29497e+09