【问题标题】:Is it possible to pass constant parameters UPWARDS through module hierarchy in Verilog / SystemVerilog?是否可以通过 Verilog / SystemVerilog 中的模块层次结构向上传递常量参数?
【发布时间】: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


    【解决方案1】:

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

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

    const int OTHER_PARAM = ll.VERY_COMPLEX_PARAM + 1;  
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      相关资源
      最近更新 更多