编译时的 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
。
我的 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
。