目录

  1. 模块例化概述
  2. 模块例化的语法
  3. 命名规则与端口连接
  4. 模块例化的实例
  5. 参考资料

模块例化概述

在 Verilog 中,模块例化(Module Instantiation)是指在一个模块中创建另一个模块的实例,并通过端口连接实现信号传递。模块例化使得设计模块化,能够将复杂的电路设计拆分成较小的、易于管理的单元。

通过模块例化,可以在一个顶层模块中复用已有的功能模块。模块实例之间通过端口连接,允许不同模块之间进行信息交换,从而实现更复杂的逻辑功能。

模块例化是 Verilog 设计中非常重要的一个概念,它支持分层设计,增强了模块的可重用性。


模块例化的语法

在 Verilog 中,模块例化的基本语法如下:

<module_name> <instance_name> (
    .<port_name1>(<signal_name1>),
    .<port_name2>(<signal_name2>),
    ...
);

  • <module_name>:要实例化的模块的名称。
  • <instance_name>:实例化模块的实例名。
  • .port_name:模块端口的名称。
  • <signal_name>:连接到该端口的信号。

示例:

module top_module(
    input a, b,
    output y
);
    // 实例化子模块 and_gate
    and_gate u1 (
        .a(a),
        .b(b),
        .y(y)
    );
endmodule

module and_gate (
    input a, b,
    output y
);
    assign y = a & b;  // AND 操作
endmodule

在上面的代码中,top_module 模块实例化了一个 and_gate 模块。ab 输入端口连接到 and_gate 模块的端口,y 输出端口连接到外部信号 y


命名规则与端口连接

1. 命名规则

  • 实例名:模块实例化时,可以自定义实例名称。实例名称应该是唯一的,以便区分不同的实例。通常,实例名称以模块名称或其他标识符为基础命名。
  • 端口连接:端口连接使用点号连接,即通过 .port_name(signal_name) 方式来连接端口。这样做可以清晰地将模块的端口与信号进行映射。

2. 端口连接方式

Verilog 支持以下几种端口连接方式:

  1. 位置连接(Positional Connection):按照端口的顺序连接信号。例如,连接模块时,端口顺序与实例化时的端口顺序一致。 and_gate u1(a, b, y); // 按顺序连接
  2. 命名连接(Named Connection):显式指定端口名称与信号的映射关系,避免顺序错误。 and_gate u1 (.a(a), .b(b), .y(y)); // 显式指定端口名
  3. 混合连接(Mixed Connection):结合了位置连接和命名连接的方式。可以选择部分端口使用位置连接,其他端口使用命名连接。 and_gate u1 (.a(a), b, .y(y)); // 位置和命名混合连接

模块例化的实例

示例 1:基本的模块例化

在这个示例中,创建一个 and_gate 模块并将其实例化为 u1,然后连接端口:

module top_module(input a, input b, output y);
    // 实例化 and_gate 模块,命名为 u1
    and_gate u1 (
        .a(a),
        .b(b),
        .y(y)
    );
endmodule

module and_gate(input a, input b, output y);
    assign y = a & b;  // 执行与操作
endmodule

在上面的示例中:

  • top_module 是顶层模块,它实例化了一个 and_gate 模块,并通过命名连接将 aby 连接到 and_gate 的端口。
  • and_gate 模块实现了一个简单的与门逻辑。

示例 2:多个实例化和命名连接

在此示例中,top_module 实例化多个 and_gate 模块,并分别连接不同的信号。

module top_module(input a, input b, input c, output y1, output y2);
    // 实例化 and_gate 模块
    and_gate u1 (
        .a(a),
        .b(b),
        .y(y1)
    );
    and_gate u2 (
        .a(b),
        .b(c),
        .y(y2)
    );
endmodule

module and_gate(input a, input b, output y);
    assign y = a & b;  // 与操作
endmodule

在这个例子中,top_module 实例化了两个 and_gate 模块,分别计算 a & bb & c,并将结果赋值给 y1y2

示例 3:使用位置连接和命名连接

在此示例中,结合了位置连接和命名连接的方法进行模块实例化:

module top_module(input a, input b, input c, output y);
    // 使用位置连接
    and_gate u1(a, b, y);  // 位置连接
    
    // 使用命名连接
    or_gate u2 (
        .a(b),
        .b(c),
        .y(y)
    );  // 命名连接
endmodule

module and_gate(input a, input b, output y);
    assign y = a & b;  // 与操作
endmodule

module or_gate(input a, input b, output y);
    assign y = a | b;  // 或操作
endmodule

在这个例子中,top_module 使用位置连接将 ab 连接到 and_gate 的端口,并使用命名连接将 bc 连接到 or_gate 的端口。


参考资料