4. 逻辑综合基础:Yosys 与 ABC 工具介绍、综合流程、读取 RTL 与库、综合策略与脚本编写
逻辑综合,说白了就是把我们写的 RTL 代码(Verilog/VHDL)翻译成门级网表。这个过程不是简单的「翻译」,它还要考虑时序、面积、功耗。今天我们就来聊聊 OpenROAD 里的综合工具——Yosys 和 ABC。
4.1 Yosys 与 ABC:综合双引擎
Yosys 是一个开源的综合框架,它负责前端工作:读取 RTL、解析库、做高级优化。ABC 则是伯克利开发的逻辑综合与验证工具,专攻后端技术映射和工艺优化。两者配合,构成了 OpenROAD 的综合流水线。
| 工具 | 职责 | 核心能力 |
|---|---|---|
| Yosys | 前端综合 | RTL 解析、层次展开、高级综合优化(资源共享、常量传播) |
| ABC | 后端映射 | 技术映射、时序驱动优化、面积优化、重定时 |
我个人习惯把 Yosys 看作「翻译官」,ABC 则是「精装师傅」。Yosys 把 RTL 转成内部通用网表,ABC 再根据工艺库把它映射成具体的标准单元。
关键点:Yosys 的输出是 ABC 的输入。两者通过 abc 命令在 Yosys 脚本中调用。
4.2 综合流程:从 RTL 到门级网表
整个流程可以概括为四个步骤。我在项目中遇到过不少新手直接跳过「层次展开」这一步,结果综合出来的网表结构混乱,后端的 floorplan 根本没法做。
- 读取 RTL 与库:Yosys 读入 Verilog 文件和 Liberty 库文件。
- 高层次综合:Yosys 做资源共享、常量传播、状态机编码等优化。
- 逻辑综合与映射:Yosys 调用 ABC,将通用逻辑映射到工艺库中的标准单元。
- 输出网表:生成门级 Verilog 网表,供后端使用。
4.3 读取 RTL 与库
Yosys 使用 read_verilog 和 read_liberty 命令来加载设计文件和工艺库。这里有个坑:库文件的顺序很重要。我曾经因为先读了慢库后读快库,导致综合结果时序悲观,白白浪费了两天调试时间。
# 读取 RTL 文件
read_verilog -sv top.v
read_verilog -sv module_a.v
read_verilog -sv module_b.v
# 读取 Liberty 库文件
read_liberty -lib /path/to/slow.lib
read_liberty -lib /path/to/fast.lib
# 设置顶层模块
hierarchy -top top
注意:Yosys 默认只读 Verilog-2001。如果你用 SystemVerilog,记得加 -sv 选项。否则会报语法错误。
4.4 综合策略与脚本编写
综合策略直接影响芯片的最终质量。我一般会根据设计目标选择不同的策略:
| 策略 | 适用场景 | 关键命令 |
|---|---|---|
| 面积优先 | 低成本、低功耗设计 | synth -top top -flatten |
| 时序优先 | 高性能设计 | synth -top top -retime |
| 平衡策略 | 通用设计 | synth -top top |
下面是一个完整的综合脚本示例。嗯,这里要注意:dfflibmap 和 abc 的顺序不能搞反,否则触发器映射会出问题。
# 综合脚本:synth.tcl
# 读取设计
read_verilog -sv rtl/top.sv
read_verilog -sv rtl/sub_module.sv
# 读取库
read_liberty -lib libs/slow.lib
read_liberty -lib libs/fast.lib
# 层次化设计
hierarchy -top top
# 高层次综合
synth -top top -flatten
# 触发器映射到工艺库
dfflibmap -liberty libs/slow.lib
# ABC 技术映射
abc -liberty libs/slow.lib -script +strash;scorr;ifraig;retime;strash;dch;ps;map
# 优化
opt_clean -purge
# 输出网表
write_verilog -noattr outputs/top_synth.v
stat -liberty libs/slow.lib
我的经验:ABC 的 -script 参数可以自定义优化流程。比如 retime 命令做重定时,能改善时序,但会增加面积。我一般先跑一次默认脚本,再根据结果微调。
4.5 综合结果分析
综合完成后,Yosys 会输出统计信息。你需要关注几个关键指标:
- 单元数量:组合逻辑和时序逻辑的比例。
- 面积估算:基于库单元面积的累加。
- 时序报告:关键路径的延迟估算。
我曾经接手过一个项目,综合出来的网表面积比预期大了 30%。排查后发现是 Yosys 的 flatten 选项把层次结构全打散了,导致 ABC 无法做层次化优化。后来我改用 -noflatten,面积立刻降下来了。
核心原则:综合不是一次就能搞定的。你需要反复迭代,调整脚本参数,直到面积、时序、功耗都满足要求。
好了,这一章的内容就到这里。Yosys 和 ABC 的组合非常灵活,你可以根据设计需求定制综合流程。多动手写脚本,多跑几次,慢慢就能找到感觉。