Modelsim:localparam的范围错误

时间:2015-04-18 12:39:37

标签: verilog system-verilog

我试图在Modelsim中编译以下代码:

    module ctrl_mem
    #(
        parameter BYTE_SIZE = 256
    )
    (
        input [ADDR_W - 1 : 0]  i_addr,
        ...
        ...
    );
    localparam ADDR_W = $clog2(BYTE_SIZE);

Modelsim写道,ADDR_W未知。 我们讨论了类似的问题here,但没有涉及到Modelsim的行为,不幸的是我无法评论它来提出这个问题。

是否可以在不修改代码的情况下解决此问题?

我使用的是Modelsim Altera入门版10.3c

2 个答案:

答案 0 :(得分:5)

您的代码不合法​​。 Verilog / SystemVerilog LRM需要简单的标识符(那些没有后跟' '或 ')的标识符在被引用之前声明。编写此模块的正确方法是

 module ctrl_mem
    #(
        parameter BYTE_SIZE = 256, localparam ADDR_W = $clog2(BYTE_SIZE)
    )
    (
        input [ADDR_W - 1 : 0]  i_addr,
        ...
        ...
    );

答案 1 :(得分:0)

正如您所发现的,较新的样式参数声明(LRM语法定义中的“module_parameter_port_list”)仅支持参数而不支持localparams,并且如前所述,它需要在使用之前声明,因此这将为您提供选项使用旧式语法或使用parameter

每当我的I / O宽度依赖于从我希望能够覆盖的另一个参数派生的常量时,我​​总是因此使用parameter。我认为它是这样的,像这样的情况不一定是'localparam'的好候选者,因为它不是真正/完全“本地” - 你用它来指定接口信号的宽度因此暴露在模块外面。至少我是如何向自己解释这种情况的。