我试图在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
答案 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
'的好候选者,因为它不是真正/完全“本地” - 你用它来指定接口信号的宽度因此暴露在模块外面。至少我是如何向自己解释这种情况的。