假设您在层次结构中的低层有一个模块,该模块具有相当复杂的参数计算。此参数计算不能方便在更高级别的模块中进行复制,因为它使用了低级别其他参数的信息。现在,假设您在层次结构中还有一个更高级别的模块,需要引用该参数来计算其他参数。
(System)Verilog中是否有一种方法可以在计算较高层模块的参数时从较低层模块的实例中读取参数?
当然,您可以在此处尝试使用“接口” ...
interface interface_low ();
localparam VERY_COMPLEX_PARAM = 1 + 1;
endinterface;
interface interface_high (interface_low if_low);
localparam OTHER_PARAM = if_low.VERY_COMPLEX_PARAM + 1;
endinterface
...,但是尝试编译此片段以使用Riviera-PRO进行仿真将返回错误“参数初始值不能包含外部引用:if_low.COMPLEX_PARAM + 1。”。或者,您可以尝试类似...
module low_level #(parameter SOME_NUM = 1, localparam VERY_COMPLEX_PARAM = SOME_NUM + 1) (output logic [31 : 0] out);
always_comb
begin
out = VERY_COMPLEX_PARAM;
end
endmodule
module high_level (output logic [31:0] out);
logic [31:0] low_out;
low_level #(.SOME_NUM (4)) ll (low_out);
localparam OTHER_PARAM = ll.VERY_COMPLEX_PARAM + 1;
always_comb
begin
out = OTHER_PARAM;
end
endmodule
...但是再次导致错误“参数初始值不能包含外部引用:ll.VERY_COMPLEX_PARAM + 1。”
始终可以简单地重新组织实现,以便将常量参数严格向下传递,但是我觉得这是一个乏味的解决方案。在那种情况下,更高级别的模块现在正在计算常量,这些常量引用层次结构中低得多的实现细节。将低级模块中的依赖项添加到高级模块中只是为了满足有关 constants 的计算的限制,这似乎很愚蠢。
那么,有没有更好的方法?
答案 0 :(得分:1)
参数评估必须自上而下进行。您的接口示例应该已经用作接口端口,而不被视为层次结构引用(它确实可以在我尝试过的其他两个工具上运行)。
对于您的特定示例,您可能已经使用
const int OTHER_PARAM = ll.VERY_COMPLEX_PARAM + 1;
只要在需要常量的地方不使用OTHER_PARAM
,就可以。综合工具支持可能会遇到相同的问题。
另一种选择是将参数放入程序包中,使下部模块和上部模块都导入同一程序包。