Modelsim:局部参数的范围错误

Modelsim: wrong scope for localparam

我正在尝试在 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 Starter Edition 10.3c

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

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

正如您所发现的,较新的样式参数声明(LRM 语法定义中的"module_parameter_port_list")仅支持参数而不支持本地参数,并且如前所述,它需要在使用前声明,所以这留下了您可以选择使用旧式语法或使用 parameter.

每当我有一个 I/O 宽度依赖于从我希望能够覆盖的另一个参数派生的常量时,我​​总是使用 parameter 出于这个原因。按照我的想法,像这样的情况不一定适合“localparam”,因为它不是 truly/completely "local"——您使用它来指定宽度接口信号因此暴露在模块外部。至少我是这样向自己解释情况的。