有沒有辦法使用傳遞給父模塊的參數值選擇要實例化的模塊?下面使用SystemVerilog參數來決定實例化哪個模塊
module parent();
parameter WORD = 1;
child_`WORD child(); // obviously does not work
endmodule
例如如果WORD == 1
,我想實例化child_1模塊,用於WORD == 2
,所述child_2模塊等。當然,有人需要這樣做嗎?
有沒有辦法使用傳遞給父模塊的參數值選擇要實例化的模塊?下面使用SystemVerilog參數來決定實例化哪個模塊
module parent();
parameter WORD = 1;
child_`WORD child(); // obviously does not work
endmodule
例如如果WORD == 1
,我想實例化child_1模塊,用於WORD == 2
,所述child_2模塊等。當然,有人需要這樣做嗎?
如果要有條件地實例化模塊,則需要使用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
感謝您的回覆。這就是我要做的 – user2292757
@ user2292757你可以將答案標記爲接受,如果這是你想要的。 :-) – Paddu
我不認爲這是可能的,如果這個詞已經成爲一個參數。您可以使WORD成爲文本宏,也可以使用非預處理器機制來組合字符串。如果你描述原始問題是什麼,你可能會得到更好的答案。 – Andy
我想第二個意見,這是不可能的,並要求你解釋你爲什麼要這樣做,或者你想解決什麼問題。 – dwikle