verilog模块的条件实例化

时间:2013-03-06 06:35:00

标签: conditional instantiation verilog hdl

是否可以在verliog中有条件地实例化模块?

示例:

if (en==1)  
  then module1 instantiation  
else  
  module2 instantiation  

3 个答案:

答案 0 :(得分:21)

来自IEEE Std 1364-2001:

  

12.1.3.3 generate-conditional生成条件是if-else-if generate构造,允许模块,用户定义的基元,   Verilog门原语,连续分配,初始块和   始终阻止有条件地实例化为另一个模块   基于设计时确定性的表达式   详细阐述。

LRM中给出的示例:

module multiplier(a,b,product);
parameter a_width = 8, b_width = 8;
localparam product_width = a_width+b_width; // can not be modified
// directly with the defparam statement
// or the module instance statement #
input [a_width-1:0] a;
input [b_width-1:0] b;
output [product_width-1:0] product;

generate
    if((a_width < 8) || (b_width < 8))
        CLA_multiplier #(a_width,b_width) u1(a, b, product);
        // instantiate a CLA multiplier
    else
        WALLACE_multiplier #(a_width,b_width) u1(a, b, product);
        // instantiate a Wallace-tree multiplier
endgenerate
// The generated instance name is u1

endmodule

答案 1 :(得分:4)

您可以使用

之类的编译器指令
`define FOO
`ifdef FOO
    module1 ...
`else
    module2 ...
`endif

在编译时选择实例化。

如果您在询问是否可以基于线路值实例化模块,那么您不能这样做。

答案 2 :(得分:4)

您无法在运行时执行此操作,因为您正在描述无法动态更改的硬件。您可以启用或禁用功能以节省电量,但​​不能使其停止存在。假设您正在寻求提高块的重用或配置能力:

经常使用预编译器技术以及Tim提及的``define`(tick定义)。

它们将包含一个解析模板文件的Perl,ruby等脚本。

My Previous answer using ruby scripts and templates