2017-05-04 68 views
0

我在Verilog中有一個自定義模塊,它需要幾個輸入和幾個參數。在Verilog中使用附加參數實例化自定義模塊的向量

module modA ( 
    input inp1, input inp2, ... output out); 
    parameter my_addr; 
... 
endmodule 

對於我使用的具體硬件相關的各種原因,我需要創建這個模塊,使用不同的參數,每次(因爲my_addr對應於特定內存位置,我的許多實例然後從主機訪問)。此外,我想要一個簡單的方法來訪問所有的輸出。我覺得做這樣

wire [9:0] outputs; 
modA #(.my_addr) all_modA[9:0](.inp1(inp1), .inp2(inp2), .out(outputs)); 

東西於是我不得不all_modA的元素的載體,和輸出的第n個元素將對應於MODA的第n個實例。這聽起來像它會工作得很好,除了我需要傳遞一個唯一的地址到每個實例。當我一次只做一個實例化時,僅定義一個參數非常容易,但我不明白每次如何傳遞唯一標識符。

有什麼辦法可以做到這一點?問題是,如果我使用for循環,那麼我不會看到如何使用唯一標識符來實例化每個modA。如果我不使用for循環,那麼我不確定如何添加唯一標識符。

回答

2

您可以在此處使用generate塊。 生成塊在設計的制定過程中進行評估。它們不會在仿真時執行,並且在模擬開始之前確定結果。因此,生成方案中的所有表達式應該是在制定時確定的恆定表達式

根據需要給my_addr賦予不同的值。另外,您可以將一些標籤標識符應用於begin-end塊。這作爲可選功能用於生成塊,但非常強烈推薦。通過這樣做,一個獨特的分層路徑可以看出,modA的每個實例對於每個模塊都是不同的。

對於您的代碼,我創建了一個測試平臺,用於更改值my_addroutputs總線驅動out信號的實例化模塊。

module modA #(parameter int my_addr) (input inp1, input inp2,output out); 

    initial $display("%m: %d",my_addr); 
endmodule 

module top(); 
wire [9:0] outputs; 
    genvar i; // generate iterator 
    generate 
    for(i=0;i<9;i++) begin: some_identifier 
     // my_addr = i+1 for every module 
     modA #(.my_addr(i+1)) all_modA(.inp1(inp1), .inp2(inp2), .out(outputs[i])); // Multiple modules 
     end 
    endgenerate 
endmodule 

欲瞭解更多信息,請參閱IEEE 1800-2012第27章類似的問題可以發現herehere

+0

我將如何確定some_identifier是什麼? – user147177

+0

它是'begin..end'塊的任何**標識符。這是生成塊的用戶定義標籤。可以在這裏使用任何字符串。 – sharvil111

+0

在我的特殊情況下,每個輸出都是16位線。我會寫 「wire [15:0] outputs [0:10];」? – user147177

相關問題