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 根本没法做。

  1. 读取 RTL 与库:Yosys 读入 Verilog 文件和 Liberty 库文件。
  2. 高层次综合:Yosys 做资源共享、常量传播、状态机编码等优化。
  3. 逻辑综合与映射:Yosys 调用 ABC,将通用逻辑映射到工艺库中的标准单元。
  4. 输出网表:生成门级 Verilog 网表,供后端使用。
Yosys + ABC 综合流程 读取 RTL 与库 高层次综合 逻辑综合与映射 输出网表 流程说明 1. Yosys 读入 RTL 和 Liberty 库,做语法检查和层次展开。 2. Yosys 执行高层次优化:资源共享、常量传播、状态机编码。 3. Yosys 调用 ABC 做技术映射,将通用逻辑映射到工艺库。 4. 输出门级 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 的组合非常灵活,你可以根据设计需求定制综合流程。多动手写脚本,多跑几次,慢慢就能找到感觉。