2013-04-17 30 views
1

有沒有辦法使用傳遞給父模塊的參數值選擇要實例化的模塊?下面使用SystemVerilog參數來決定實例化哪個模塊

module parent(); 

parameter WORD = 1; 

child_`WORD child(); // obviously does not work 

endmodule 

例如如果WORD == 1,我想實例化child_1模塊,用於WORD == 2,所述child_2模塊等。當然,有人需要這樣做嗎?

+0

我不認爲這是可能的,如果這個詞已經成爲一個參數。您可以使WORD成爲文本宏,也可以使用非預處理器機制來組合字符串。如果你描述原始問題是什麼,你可能會得到更好的答案。 – Andy

+0

我想第二個意見,這是不可能的,並要求你解釋你爲什麼要這樣做,或者你想解決什麼問題。 – dwikle

回答

5

如果要有條件地實例化模塊,則需要使用generate塊。

generate 
    if (WORD == 1) begin 
    child_1 child(); 
    end 
    if (WORD == 2) begin 
    child_2 child(); 
    end 
endgenerate 

下面是一個完整的工作示例。請注意,它只是說明了child_1和child_2的存在。您不能將該參數用作您正在實例化的模塊類型名稱的一部分。如果你有N個子模塊,並且你不想在generate塊中明確枚舉它們,你可能需要創建一個輔助宏。

順便說一下,這是有效的Verilog代碼;它不使用任何SystemVerilog功能。從精闢

module child_1(); 
    initial begin 
    $display("child_1 %m"); 
    end 
endmodule 

module child_2(); 
    initial begin 
    $display("child_2 %m"); 
    end 
endmodule 

module parent(); 
    parameter WORD = 1; 

    // Conditionally instantiate child_1 or child_2 depending 
    // depending on value of WORD parameter. 
    generate 
    if (WORD == 1) begin 
     child_1 child(); 
    end 
    if (WORD == 2) begin 
     child_2 child(); 
    end 
    endgenerate 

endmodule 

module top(); 
    parent #(.WORD(1)) p1(); 
    parent #(.WORD(2)) p2(); 
endmodule 

輸出:

child_1 top.p1.genblk1.child 
child_2 top.p2.genblk2.child 
+0

感謝您的回覆。這就是我要做的 – user2292757

+0

@ user2292757你可以將答案標記爲接受,如果這是你想要的。 :-) – Paddu

相關問題