Verilog 的 结构级(Structural Level) 建模是最接近实际硬件电路的抽象层次,通过实例化已有模块(如逻辑门、寄存器或其他自定义模块)并连接它们的端口来构建系统。它类似于绘制电路原理图,强调模块的层次化组织和物理连接关系,适用于中大规模数字系统的模块化设计。
一、结构级建模的核心特点
-
模块化设计:
- 通过实例化子模块(如 AND、OR 门或自定义模块)组合成复杂电路。
- 支持层次化设计(Top-Down/Bottom-Up),便于团队协作和复用。
-
明确硬件结构:
- 直接描述电路的实际组成(如门级网表)。
- 所有连线(
wire
)和模块实例需显式定义。
-
适用场景:
- 基于现有 IP 核(如 PLL、存储器)的系统集成。
- 门级网表实现(综合后的电路)。
- 需要精确控制硬件结构的场景(如低功耗优化、时序约束)。
二、结构级建模语法与规则
1. 模块实例化
- 语法:
[模块名] [实例名] ( .端口1(连线1), .端口2(连线2), ... );
- 两种连接方式:
- 按顺序连接:端口顺序必须与模块定义一致。
AND_gate U1 (a, b, y); // 端口顺序:input a, input b, output y
- 按名称连接:显式指定端口与连线的对应关系(推荐,避免顺序错误)。
AND_gate U1 ( .a(a), .b(b), .y(y) );
- 按顺序连接:端口顺序必须与模块定义一致。
2. 层次化设计
- 子模块定义:先定义底层模块(如半加器),再在顶层模块中实例化。
- 示例:全加器由两个半加器和一个或门组成。
// 底层模块:半加器 module HalfAdder ( input a, b, output sum, cout ); assign sum = a ^ b; // 异或 assign cout = a & b; // 与 endmodule // 顶层模块:全加器(结构级) module FullAdder ( input a, b, cin, output sum, cout ); wire s1, c1, c2; // 实例化两个半加器和一个或门 HalfAdder HA1 (.a(a), .b(b), .sum(s1), .cout(c1)); HalfAdder HA2 (.a(s1), .b(cin), .sum(sum), .cout(c2)); OR_gate OR1 (.a(c1), .b(c2), .y(cout)); endmodule
三、结构级建模示例
1. 4 位行波进位加法器
// 1 位全加器模块(假设已定义)
module FullAdder (input a, b, cin, output sum, cout);
// 4 位加法器(实例化 4 个全加器)
module RippleCarryAdder4bit (
input [3:0] a,
input [3:0] b,
input cin,
output [3:0] sum,
output cout
);
wire [3:0] c; // 内部进位信号
FullAdder FA0 (.a(a[0]), .b(b[0]), .cin(cin), .sum(sum[0]), .cout(c[0]));
FullAdder FA1 (.a(a[1]), .b(b[1]), .cin(c[0]), .sum(sum[1]), .cout(c[1]));
FullAdder FA2 (.a(a[2]), .b(b[2]), .cin(c[1]), .sum(sum[2]), .cout(c[2]));
FullAdder FA3 (.a(a[3]), .b(b[3]), .cin(c[2]), .sum(sum[3]), .cout(cout));
endmodule
2. 基于门电路的 2 选 1 多路选择器
module MUX2to1 (
input a, b, sel,
output y
);
wire not_sel, and_a, and_b;
// 实例化基本门电路
NOT_gate U1 (.a(sel), .y(not_sel));
AND_gate U2 (.a(a), .b(not_sel), .y(and_a));
AND_gate U3 (.a(b), .b(sel), .y(and_b));
OR_gate U4 (.a(and_a), .b(and_b), .y(y));
endmodule
四、结构级 vs. 其他抽象层次
特性 | 结构级 | 数据流级 | 行为级 |
---|---|---|---|
抽象层次 | 低(门级/模块连接) | 中(逻辑表达式) | 高(算法/状态) |
核心语法 | 模块实例化 + 端口连接 | assign 连续赋值 | always 块 + 过程赋值 |
可读性 | 中(需理解模块间连接关系) | 高(直接逻辑) | 高(类似软件) |
适用场景 | 模块化设计、IP 核集成、门级网表 | 组合逻辑设计 | 复杂逻辑、状态机、时序逻辑 |
五、结构级建模注意事项
-
端口匹配:
- 实例化时端口数量、方向和位宽必须与模块定义一致。
- 示例:若子模块输出为
output [3:0] data
,实例化时需连接 4 位信号。
-
连线声明:
- 所有模块间的连接信号需显式定义为
wire
(默认类型)或其他线网类型。
- 所有模块间的连接信号需显式定义为
-
模块复用:
- 多次实例化同一模块时,需为每个实例分配唯一名称(如
AND_gate U1, U2;
)。
- 多次实例化同一模块时,需为每个实例分配唯一名称(如
-
延迟与时序:
- 结构级可指定门级延迟(仅用于仿真),如
AND_gate #(2) U1 (a, b, y);
表示 2 单位延迟。
- 结构级可指定门级延迟(仅用于仿真),如
六、总结
结构级建模是 Verilog 中最接近物理电路的描述方式,核心价值在于:
- 模块化:通过实例化子模块构建复杂系统,支持团队协作和 IP 复用。
- 精确控制:明确硬件结构,便于优化时序、功耗和面积(PPA)。
- 综合友好:结构级代码通常可直接映射到目标工艺库(如 FPGA 或 ASIC 标准单元)。
适用场景:
- 基于标准单元库的门级设计。
- 集成第三方 IP 核(如存储器、PLL)。
- 需要精确描述电路结构的场合(如教学、反向工程)。
局限性:
- 代码冗长,不适合复杂算法或行为描述。
- 对设计者的硬件知识要求较高。
掌握结构级建模后,可结合行为级和数据流级,实现从高层次抽象到低层次实现的全流程设计。