综合器怎样把 RTL 变成网表:EDA 入门 02
本文承接 从 RTL 到 GDS 的第二阶段。综合的设计概念见 综合是什么,格式基础见 EDA 数据格式与标准;本文从工具流程看 RTL 如何变成可交给后端的网表。
一、综合器的输入输出
综合不是“Verilog 翻译器”,而是在工艺库、时序约束和优化目标下做选择。同一份 RTL,目标频率、库角、功耗约束不同,生成的网表可以完全不同。
| 输入/输出 | 形式 | 作用 |
|---|---|---|
| RTL | Verilog/SystemVerilog/VHDL | 描述寄存器、状态机、数据通路 |
| Liberty 库 | .lib/.db | 提供单元功能、延迟、功耗、面积和时序弧 |
| SDC | 时钟、IO 延迟、例外 | 告诉工具设计想跑多快、哪些路径不按默认检查 |
| 物理估计 | floorplan/RC/TLEF | 提前估计线延迟和拥塞 |
| 门级网表 | Verilog/EDIF/LEF/DEF 配套数据 | 映射后的标准单元和互连 |
| 报告 | timing/area/power/DRC | 供设计者判断 QoR 和后端风险 |
| 交付约束 | SDC/SDF/SPEF 交接数据 | 供 P&R、STA、门级仿真使用 |
二、标准命令流:先读对,再优化

一个工具无关的 Tcl 骨架通常如下,真实项目会拆成多个可复用脚本:
tcl
# 1. 库与路径
set search_path [concat . $search_path $lib_dir]
set target_library [list slow.db]
set link_library [concat * $target_library]
# 2. 读 RTL(filelist 由流程生成)
analyze -format sverilog [glob ./rtl/*.sv]
elaborate $top
current_design $top
link
# 3. 约束
source ./constraints/top.sdc
# 4. 优化与映射
compile_ultra
# 5. QoR 与交付
report_timing > reports/timing.rpt
report_area > reports/area.rpt
report_power > reports/power.rpt
write -format verilog -output outputs/top.netlist.v不同工具命令名不同,但阶段相同:先保证读入世界完整,再让工具优化。如果 link 阶段还有 unresolved module,后面的 timing 报告没有意义。
三、优化时工具到底在权衡什么
综合器先把 RTL 转成与工艺无关的布尔逻辑,再进行多级优化和工艺映射:
- 资源共享与逻辑重构:一个大加法器/乘法器能否分时复用,取决于时序余量和调度方式。
- 时序驱动优化:沿关键路径选择更强、更大的单元,或插入缓冲降低负载;非关键路径可用小尺寸低漏电单元。
- 面积与功耗折中:高频设计可能复制逻辑、增大驱动;低功耗设计可能降面积、换高阈值单元。
- 设计规则修复:满足 max_fanout、max_capacitance、max_transition 等库/工艺限制。
- DFT 准备:扫描触发器替换、测试时钟/测试模式约束可能在综合中或综合后插入。
因此,QoR(Quality of Results)不是单个数字,而是时序、面积、功耗、可布线性、可测试性的组合。
四、怎样读第一批综合报告
| 报告 | 关键字段 | 怎么行动 |
|---|---|---|
| timing | WNS、TNS、start/end point、path group | 先修最差路径,再看违例数量 |
| area | combinational/sequential/black box | 区分逻辑面积与 SRAM/IP 宏面积 |
| power | internal/switching/leakage | RTL 早期功耗依赖翻转率,注意 SAIF 来源 |
| constraint | virtual clock、unconstrained endpoint | 查漏时钟、漏 IO 约束和伪路径 |
| DRC | fanout/cap/transition | 让工具修复,长期问题回到 RTL/架构 |
| reference | unresolved/black box | 禁止带缺失模块进入后端 |
**WNS(Worst Negative Slack)**是最差一条路径的余量;**TNS(Total Negative Slack)**是所有负余量路径的总和。WNS 为正但 TNS 很大通常表示还有一批接近极限的路径;WNS 很负时,不要急着让工具再跑一遍,先确认时钟和例外是否真实。
五、失败应退回到哪里

- 约束问题:忘了 generated clock、把真实路径设成 false path、输入输出无预算,会造成假违例或假收敛。
- RTL 问题:case 缺分支产生锁存器、大 mux 级联、数组未推断 SRAM、复位过多,都会恶化面积和时序。
- 架构问题:单周期做完本该多周期完成的运算、模块布局天然跨越芯片两端,只靠工具无法根治。
- 物理问题:综合阶段线延迟只是估计;topographical 模式或更早的 floorplan 反馈能减少“综合过、后端不过”。
时序例外必须像 RTL 一样评审。set_false_path 不是清报告按钮,错误例外可能让真实路径完全不被检查。
常见误区
| 误区 | 更准确的理解 |
|---|---|
| 综合通过说明 RTL 没问题 | 只能说明可映射并满足当时的库、约束和估计模型 |
| 频率不达标就盲目过约束 | 过约束会增大面积功耗,还可能扭曲优化方向 |
| WNS 为正就万事大吉 | 还要看 TNS、面积、功耗、DRC、未约束端点和后端余量 |
| 面积报告变大就是工具差 | 可能是时序驱动换大单元、存储未推断或约束不同 |
| 网表写出就能交付 | 还要 LEC、DFT、门级仿真、后端约束和版本追溯 |
总结
逻辑综合器在 LIB 提供的真实单元空间里,按 SDC 表达的性能意图,把 RTL 优化并映射成门级网表;它吐的不只是网表,还有决定后端风险的 QoR 报告。 学综合不要只背 compile 命令,关键是保证库、RTL、约束三者完整一致,并能判断违例应回到约束、RTL、架构还是 floorplan。