【发布时间】:2018-08-17 17:15:47
【问题描述】:
假设您在层次结构的低层有一个模块,该模块具有相当复杂的参数计算。此参数计算不能方便地在更高级别的模块中复制,因为它使用来自低级别其他参数的信息。现在假设您在层次结构中还有一个更高级别的模块,需要引用该参数来计算不同的参数。
(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
...但尝试编译此 sn-p 以使用 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计算的限制,将低级模块中的依赖项添加到高级模块似乎很愚蠢。
那么,有没有更好的办法呢?
【问题讨论】:
标签: parameters verilog constants hardware hdl