逻辑综合入门:从RTL到门级网表的第一次握手
逻辑综合,说白了就是把我们写的RTL代码(Verilog/VHDL)翻译成门级网表的过程。你想想看,我们写的是行为级的描述——"我要一个加法器"、"我要一个状态机",但芯片里实际跑的是一个个标准单元:与非门、或非门、触发器、锁存器。综合工具就是那个翻译官。
我刚入行那会儿,总觉得综合就是点一下按钮的事。直到有一次,我写了一个看起来很漂亮的状态机,综合出来面积大得离谱,时序还一塌糊涂。嗯,从那以后我才明白——不懂综合,后端设计寸步难行。
综合的输入与输出
综合的输入文件,其实就三样东西:
- RTL代码:你写的Verilog或VHDL,描述芯片功能
- 约束文件:通常是SDC(Synopsys Design Constraints),告诉工具时钟频率、输入输出延迟、驱动强度等
- 标准单元库:Foundry提供的工艺库,包含每个单元的时序、功耗、面积信息
输出呢?主要也是三样:
- 门级网表:由标准单元组成的电路连接描述
- 时序报告:setup/hold检查结果,告诉你能不能跑到目标频率
- 面积/功耗报告:芯片用了多少门,功耗多少
核心要点:综合不是"翻译"那么简单。它要在面积、时序、功耗之间做权衡。同样的RTL,不同的约束和策略,出来的网表可能天差地别。
标准单元库简介
标准单元库,就是Foundry给你的一堆"积木块"。每个积木块都是一个基本逻辑功能,比如:
| 单元类型 | 功能 | 典型用途 |
|---|---|---|
| INV | 反相器 | 信号取反、驱动增强 |
| NAND2 | 2输入与非门 | 基本逻辑运算 |
| NOR2 | 2输入或非门 | 基本逻辑运算 |
| DFF | D触发器 | 时序逻辑、寄存器 |
| MUX2 | 2选1多路选择器 | 数据选择 |
| AOI22 | 与或非复合门 | 复杂逻辑压缩 |
每个单元还有不同驱动强度的版本。比如INV可能有INV_X1、INV_X2、INV_X4……数字越大,驱动能力越强,但面积和功耗也越大。我记得有一次,一个同事为了省面积,全用了最小驱动单元,结果信号斜率太大,时序全崩了。所以驱动强度的选择是个平衡艺术。
我的习惯:综合时先让工具自动选驱动强度,然后看时序报告。如果某条路径的transition太大,手动把该路径上的单元换成高驱动版本。别一上来就全用大驱动,面积会爆炸。
综合策略
综合策略,说白了就是你怎么指挥工具干活。常用的策略有几种:
- 面积优先:让工具尽量用最小面积的单元,适合成本敏感的设计
- 时序优先:让工具尽量用高驱动单元,适合高性能设计
- 功耗优先:让工具尽量用低功耗单元,适合移动设备
- 平衡策略:三者兼顾,适合大多数通用设计
我个人习惯是先用平衡策略跑一版,看看时序余量。如果时序太紧,再切到时序优先;如果面积超标,再切到面积优先。别一上来就极端优化,容易出问题。
综合约束
约束是综合的灵魂。没有约束,工具不知道你要跑多快。常用的约束包括:
- 时钟约束:定义时钟周期、占空比、抖动
- 输入延迟:外部信号到达芯片输入端口的时间
- 输出延迟:芯片输出信号被外部采样的时间
- 驱动约束:输入端口的外部驱动强度
- 负载约束:输出端口的外部负载电容
避坑指南:我曾经见过一个项目,综合约束里时钟周期设了1ns,但实际芯片只能跑到1.2ns。流片回来,芯片在高温下直接罢工。所以约束一定要留余量,一般留10%-20%比较稳妥。
综合流程概览
下面这张图展示了逻辑综合的核心流程:
综合的迭代过程
综合不是一次就能搞定的。我一般会这样迭代:
- 第一轮:用默认约束跑,看看工具报什么warning,有没有语法错误
- 第二轮:加上时钟约束,看看时序余量。如果setup violation太多,说明RTL可能有问题
- 第三轮:调整综合策略,比如把某些模块设成时序优先,某些设成面积优先
- 第四轮:加input/output delay,模拟真实环境,做最终收敛
小技巧:综合时记得开"时序驱动"模式。不开的话,工具只做逻辑优化,不管时序。我见过有人综合出来网表面积很小,但时序一塌糊涂,就是因为没开时序驱动。
综合中的常见陷阱
最后说几个我踩过的坑:
- 时钟没定义清楚:综合工具不知道时钟周期,默认用无限大周期,时序检查全pass,但实际芯片跑不起来
- 异步逻辑没处理:跨时钟域的信号没加同步器,综合工具会报warning,但很多人直接忽略
- 组合逻辑环路:代码里不小心写了组合反馈,综合出来会锁死
- 忘记加set_dont_touch:有些关键路径的单元,你希望保持不动,但工具会优化掉
曾经有一次,我综合一个高速接口模块,忘了设set_max_transition。结果工具把信号斜率搞到1ns,时序全崩。从那以后,我每次综合都会检查transition约束。
逻辑综合是后端设计的起点。你综合出来的网表质量,直接决定了后面布局布线的难度。所以,花时间把综合做好,后面能省一半的功夫。