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"——您使用它来指定宽度接口信号因此暴露在模块外部。至少我是这样向自己解释情况的。
我正在尝试在 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"——您使用它来指定宽度接口信号因此暴露在模块外部。至少我是这样向自己解释情况的。