Menu
CoddyTech

模块实例化

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 33 课,共 90 课。

模块实例化是在另一个模块中创建副本的过程。你可以通过连接较小的组件来构建更大的设计。

定义好一个模块后,你可以在另一个模块中使用它。这称为实例化。每次实例化都会创建该模块的一个独立实例。你可以把它想象成使用蓝图来制作同一组件的多个副本。

基本语法

module_name instance_name (connections);
部分含义
module_name要实例化的模块名称
instance_name此副本的唯一名称
connections连接到模块端口的信号

简单示例

步骤 1:定义一个模块

module and_gate (
  input a,
  input b,
  output c
);
  assign c = a & b;
endmodule

第 2 步:在另一个模块中实例化它

module top (
  input x,
  input y,
  output z
);
  and_gate gate1 (x, y, z);
endmodule

这段代码的作用如下:

  • and_gate:要使用的模块名称(必须在某处存在)
  • gate1:我们为这个特定实例指定的唯一名称
  • (x, y, z):连接到模块端口的信号(顺序与它们在模块定义中的出现顺序相同)

第一个信号 x 连接到第一个端口 a。第二个信号 y 连接到第二个端口 b。第三个信号 z 连接到第三个端口 c。

每个端口传入一个信号。Verilog 也接受较少的信号,甚至接受空括号,但每个没有信号的端口都会保持未连接状态,不会连接到设计中的任何内容。传入的信号数量多于模块的端口数量会导致错误。

多个实例

你可以创建同一个模块的多个副本:

module top;
  wire out1, out2;
  wire sig1, sig2, sig3, sig4;
  
  and_gate gate1 (sig1, sig2, out1);
  and_gate gate2 (sig3, sig4, out2);
endmodule

每个实例都有自己的名称(gate1、gate2)和连接。它们独立工作。

实例化时会发生什么

  • 会创建一份硬件副本
  • 每个实例都有自己的一组信号
  • 各实例并行运行(同时运行)
  • 你传递的信号决定实例如何与设计的其余部分连接

实例化规则

规则原因
实例名称必须唯一用于区分不同副本
模块名称必须存在必须在其他位置定义
每个端口传入一个信号没有信号的端口会保持未连接状态,信号数量多于端口数量则会报错
连接顺序必须与端口顺序一致第一个信号连接到第一个端口,以此类推
challenge icon

挑战

通过实例化 or_gate 模块来完成代码。

操作步骤:

  1. 使用实例名称 or1 实例化 or_gate
  2. 按正确顺序传递信号:input_a、input_b、output_y

亲手试试

module or_gate (
  input in1,
  input in2,
  output result
);
  assign result = in1 | in2;
endmodule

module top (
  input input_a,
  input input_b,
  output output_y
);
  
  // TODO:实例化 or_gate,命名为 or1
  // 按顺序传入信号:input_a, input_b, output_y
  // 不要使用 .port(signal) 语法
  

endmodule
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器