【问题标题】:Verilog floating point arithmetic at compile time?编译时的Verilog浮点运算?
【发布时间】:2026-01-22 00:35:01
【问题描述】:

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

parameter PHASE_BITS = 32;
parameter real MAX_PHASE = 1 << PHASE_BITS;

我无法让MAX_PHASE 具有预期值4294967296 或其近似值; ModelSim 向我展示了0。尽管MAX_PHASE 被声明为真实,但还是会这样做。

我猜这涉及到一些整数溢出,因为如果将PHASE_BITS 降低到 31,它就可以正常工作。

如何使这个参数等于另一个参数的 2 次方?

【问题讨论】:

    标签: verilog modelsim


    【解决方案1】:

    问题在于右手表达式本身:

    1 << PHASE_BITS
    

    在考虑存储变量的类型之前对其进行评估。因为1是一个整数字面量,而Verilog中的整数是32位有符号的,所以&lt;&lt;运算符(左移运算符)会输出一个相同类型的整数,如果PHASE_BITS大于31会导致溢出。

    我们可以强制 1 成为真正的文字:

    1.0 << PHASE_BITS
    

    但这会导致编译时错误,因为&lt;&lt; 没有为实际值定义。

    让我们使用简单的 2-power-to-N:

    2.0 ** PHASE_BITS
    

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

    【讨论】: