Parameters 是否可以通过Verilog/SystemVerilog中的模块层次结构向上传递常量参数?

Parameters 是否可以通过Verilog/SystemVerilog中的模块层次结构向上传递常量参数?,parameters,verilog,constants,hardware,hdl,Parameters,Verilog,Constants,Hardware,Hdl,假设层次结构中有一个低级模块,该模块的参数计算相当复杂。此参数计算无法方便地复制到更高级别的模块中,因为它使用来自低级别其他参数的信息。现在假设层次结构中还有一个更高级别的模块,需要引用该参数来计算不同的参数 在(系统)Verilog中,在计算高级模块的参数时,是否有方法从低级模块的实例化中读取参数 当然,您可以尝试在此处使用“接口” interface interface_low ();

假设层次结构中有一个低级模块,该模块的参数计算相当复杂。此参数计算无法方便地复制到更高级别的模块中,因为它使用来自低级别其他参数的信息。现在假设层次结构中还有一个更高级别的模块,需要引用该参数来计算不同的参数

在(系统)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。”

总是可以简单地重新组织实现,以便严格地向下传递常量参数,但我觉得这是一个平淡无奇的解决方案。在这种情况下,更高级别的模块现在正在计算引用层次结构中更低的实现细节的常量。将低级模块中的依赖项添加到高级模块中只是为了满足有关常数计算的限制,这似乎很愚蠢


那么,有更好的方法吗?

参数计算必须自上而下进行。您的接口示例本应作为接口端口使用,但不被视为分层引用(它在我尝试过的其他两个工具上也可以使用)

对于您的特定示例,您可以使用

const int OTHER_PARAM = ll.VERY_COMPLEX_PARAM + 1;  
只要在需要常数的地方没有使用其他参数,就可以。对于合成工具支持,您可能会遇到同样的问题

另一个选项是将参数放入一个包中,并让较低和较高模块导入同一个包