13

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

例子 :

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

3 回答 3

25

来自 IEEE 标准 1364-2001:

12.1.3.3 generate-conditional generate-conditional 是一个 if-else-if 生成结构,它允许模块、用户定义的原语、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
于 2013-03-07T06:41:07.623 回答
4

您可以使用编译器指令,例如

`define FOO
`ifdef FOO
    module1 ...
`else
    module2 ...
`endif

在编译时选择实例化。

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

于 2013-03-06T06:47:01.963 回答
4

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

预编译器技术通常与 Tim 提到的 ``defines`(tick 定义)一样使用。

它们将由解析模板文件的 Perl、ruby 等脚本组成。

我以前使用 ruby​​ 脚本和模板的答案

于 2013-03-06T08:44:46.250 回答