2013-04-17 31 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

相关问题