芯片设计之网表介绍
·
芯片设计之网表详解
1. 什么是网表?
网表 是芯片设计中的一个核心数据表示形式,它是电路连接关系的结构化描述。你可以把网表看作是电路的"连线图"或"接线表",详细记录了电路中各个元件(逻辑门、晶体管等)之间的连接关系。
2. 网表的抽象层次
网表可以在不同抽象层次上描述电路:
| 抽象层次 | 描述内容 | 用途 |
|---|---|---|
| RTL级 | 寄存器传输级,用硬件描述语言(HDL)描述 | 设计输入、行为仿真 |
| 门级 | 逻辑门(AND, OR, NOT等)和触发器之间的连接 | 逻辑综合、静态时序分析 |
| 晶体管级 | 晶体管(MOSFET)之间的连接 | 模拟电路、定制数字电路设计 |
| 物理级 | 带有几何尺寸和位置的单元互连 | 物理实现、版图设计 |
3. 网表的常见格式
3.1 Verilog网表(最常用)
// 模块声明和端口定义
module my_design (
input clk,
input reset,
input [7:0] data_in,
output [7:0] data_out
);
// 内部连线声明
wire [7:0] reg_q;
wire [7:0] mux_out;
// 实例化标准单元(来自工艺库)
DFF_REG8 U1 (
.clk(clk),
.reset(reset),
.d(data_in),
.q(reg_q)
);
MUX2x8 U2 (
.sel(reset),
.a(data_in),
.b(reg_q),
.out(mux_out)
);
BUF8 U3 (
.in(mux_out),
.out(data_out)
);
endmodule
3.2 SPICE网表(用于模拟电路)
* 简单反相器电路
M1 OUT IN VDD VDD PMOS W=0.5u L=0.05u
M2 OUT IN 0 0 NMOS W=0.25u L=0.05u
VDD VDD 0 1.8V
VIN IN 0 PULSE(0 1.8 1n 0.1n 0.1n 5n 10n)
.tran 0.1n 20n
.end
3.3 EDIF网表(交换格式)
(edit my_design
(cell my_design
(view netlist
(interface
(port clk direction INPUT)
(port reset direction INPUT)
(port data_out direction OUTPUT)
)
(contents
(instance U1 (viewRef netlist (cellRef DFF)))
(net clk (joined (portRef clk) (instanceRef U1 clk)))
...
)
)
)
)
4. 网表的关键组成要素
4.1 基本元素
- 模块/单元(Module/Cell):电路的功能块,可以有层次结构
- 实例(Instance):模块的具体化,有唯一的名字
- 端口(Port):模块的输入输出接口
- 连线(Net/Wire):连接实例之间的信号线
- 引脚(Pin):实例上的连接点
4.2 层次化结构
top_module (顶层)
├── sub_module_A (子模块A)
│ ├── and_gate_1
│ ├── or_gate_1
│ └── flipflop_1
├── sub_module_B (子模块B)
│ ├── multiplexer_1
│ └── adder_1
└── sub_module_C (子模块C)
5. 网表在芯片设计流程中的位置
RTL设计(Verilog/VHDL)
↓
逻辑综合(Logic Synthesis) ← 工艺库(标准单元库)
↓
门级网表(Gate-level Netlist)
├──→ 形式验证(Formal Verification)
├──→ 静态时序分析(STA)
├──→ DFT插入(扫描链等)
│ ↓
│ DFT网表
│ ↓
└──→ ATPG(自动测试向量生成)
↓
物理设计(Physical Design)
↓
布局规划(Floorplan)
↓
放置(Placement)
↓
时钟树综合(CTS)
↓
布线(Routing)
↓
版图(Layout) GDSII
6. 网表的生成过程
6.1 逻辑综合
# 典型的综合脚本示例(Synopsys Design Compiler)
read_verilog my_design.v
current_design my_design
link
read_liberty typical.lib # 工艺库
create_clock -period 10 -name clk [get_ports clk]
set_input_delay 2 -clock clk [all_inputs]
set_output_delay 1 -clock clk [all_outputs]
compile
write -format verilog -hierarchy -output my_design_gate.v
6.2 综合后的变化
- 技术映射:RTL结构映射到工艺库中的具体标准单元
- 优化:面积、时序、功耗优化
- 层次扁平化:可能将层次结构展平以便后续处理
7. 网表的质量指标
7.1 关键指标
- 时序:是否满足时钟频率要求(setup/hold time)
- 面积:逻辑门的总面积
- 功耗:静态功耗和动态功耗
- 可测试性:故障覆盖率
- 时钟域:跨时钟域处理是否妥当
7.2 验证点
# 检查网表质量
report_timing # 时序报告
report_area # 面积报告
report_power # 功耗报告
check_design # 设计规则检查
8. 特殊类型的网表
8.1 DFT网表
插入扫描链后的网表,增加了:
- 扫描触发器(Scan Flip-Flops)
- 扫描输入/输出端口(scan_in, scan_out)
- 测试模式控制信号(test_mode, scan_enable)
8.2 物理网表
包含物理信息的网表:
- 单元的位置坐标
- 连线的具体走向
- 时钟树的结构
9. 网表处理工具
| 工具类别 | 代表工具 | 主要功能 |
|---|---|---|
| 综合工具 | Synopsys Design Compiler, Cadence Genus | RTL转门级网表 |
| 形式验证 | Synopsys Formality, Cadence Conformal | 等价性检查 |
| 静态时序分析 | Synopsys PrimeTime, Cadence Tempus | 时序验证 |
| 物理设计 | Cadence Innovus, Synopsys IC Compiler | 布局布线 |
| 网表查看 | Synopsys Custom Designer, nWave | 可视化分析 |
10. 实际示例:简单电路的门级网表
RTL代码:
module counter (
input clk, reset,
output [3:0] count
);
reg [3:0] count_reg;
always @(posedge clk or posedge reset) begin
if (reset)
count_reg <= 4'b0000;
else
count_reg <= count_reg + 1;
end
assign count = count_reg;
endmodule
综合后的门级网表(简化版):
module counter (
clk, reset, count
);
input clk, reset;
output [3:0] count;
wire [3:0] count;
wire [3:0] count_reg;
wire [3:0] next_count;
wire n_0, n_1, n_2, n_3;
// 4个D触发器实例化
DFFRX1 FF_0 (.D(next_count[0]), .CK(clk), .RN(n_0), .Q(count_reg[0]));
DFFRX1 FF_1 (.D(next_count[1]), .CK(clk), .RN(n_1), .Q(count_reg[1]));
DFFRX1 FF_2 (.D(next_count[2]), .CK(clk), .RN(n_2), .Q(count_reg[2]));
DFFRX1 FF_3 (.D(next_count[3]), .CK(clk), .RN(n_3), .Q(count_reg[3]));
// 加法逻辑
HA1X1 ADD_0 (.A(count_reg[0]), .B(1'b1), .CO(n_4), .S(next_count[0]));
FA1X1 ADD_1 (.A(count_reg[1]), .B(1'b0), .CI(n_4), .CO(n_5), .S(next_count[1]));
FA1X1 ADD_2 (.A(count_reg[2]), .B(1'b0), .CI(n_5), .CO(n_6), .S(next_count[2]));
FA1X1 ADD_3 (.A(count_reg[3]), .B(1'b0), .CI(n_6), .CO(open), .S(next_count[3]));
// 复位逻辑
INVX1 INV_0 (.A(reset), .Y(n_7));
AND2X1 AND_0 (.A(n_7), .B(next_count[0]), .Y(n_0));
// ... 更多连接
// 输出驱动
BUFX4 BUF_0 (.A(count_reg[0]), .Y(count[0]));
// ... 其他位
endmodule
11. 网表的挑战与最佳实践
常见挑战:
- 网表膨胀:优化不足导致门数过多
- 时序违例:关键路径不满足时序要求
- 测试覆盖率低:DFT插入不充分
- 时钟问题:时钟偏斜、时钟域交叉
最佳实践:
- 保持干净代码:RTL代码质量直接影响网表质量
- 合理约束:提供准确的时序约束
- 增量编译:局部修改时减少重新综合时间
- 版本控制:管理不同版本的网表
总结
网表是连接芯片设计前端(逻辑设计)和后端(物理设计)的桥梁。它不仅仅是电路的文本描述,更是EDA工具进行优化、验证和物理实现的基础。理解网表的结构、生成过程和验证方法,对于芯片设计师至关重要。从RTL到GDSII的整个流程中,网表扮演着承上启下的关键角色,其质量直接决定了芯片的最终性能、面积和功耗。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)