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

Is it possible to pass constant parameters UPWARDS through module hierarchy in Verilog / SystemVerilog?

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

在(System)Verilog中有没有办法在计算高层模块的参数时从底层模块的实例化中读取参数?

当然,您可以尝试在此处使用 'interface'...

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 进行模拟将 return 错误 "Parameter initial value cannot contain external references: 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  

...但它又会导致错误 "Parameter initial value cannot contain external references: ll.VERY_COMPLEX_PARAM+1."

总是可以简单地重新组织实现,以便常量参数严格向下传递,但我觉得这是一个乏善可陈的解决方案。在那种情况下,更高级别的模块现在计算常量,这些常量引用层次结构中低得多的实现细节。仅仅为了满足 constants.

的计算限制而将低级模块中的依赖项添加到高级模块似乎很愚蠢

那么,有没有更好的方法呢?

参数评估必须从上到下进行。您的接口示例应该作为接口端口工作,不被视为分层参考(它确实适用于我尝试过的其他两个工具)。

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

const int OTHER_PARAM = ll.VERY_COMPLEX_PARAM + 1;  

只要OTHER_PARAM没有用在需要常量的地方。您可能对综合工具支持有同样的问题。

另一种选择是将参数放在一个包中,并让下层和上层模块导入相同的包。