簡體   English   中英

是否可以在Verilog / SystemVerilog中通過模塊層次結構傳遞常量參數UPWARDS?

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

假設您的層次結構中有一個低級別的模塊,該模塊具有相當復雜的參數計算。 此參數計算無法在更高級別的模塊中方便地復制,因為它使用來自低級別的其他參數的信息。 現在假設您在層次結構中還有一個更高級別的模塊,需要引用該參數來計算不同的參數。

(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”。

總是可以簡單地重新組織實現,以便不斷向下傳遞常量參數,但我覺得這是一個平淡無奇的解決方案。 在這種情況下,更高級別的模塊現在正在計算常量,這些常量引用層次結構中低得多的實現細節。 將低級模塊中的依賴項添加到更高級別的模塊似乎很愚蠢,只是為了滿足有關常量計算的限制。

那么,有更好的方法嗎?

參數評估必須自上而下。 您的接口示例應該作為接口端口工作,不被視為分層引用(它可以在我嘗試的其他兩個工具上工作)。

對於您的特定示例,您可以使用

const int OTHER_PARAM = ll.VERY_COMPLEX_PARAM + 1;  

只要OTHER_PARAM不在需要常量的地方使用。 您可能在綜合工具支持方面遇到同樣的問題。

另一種選擇是將參數放在一個包中,讓下層和上層模塊導入同一個包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM