1. 时序优化概述:什么是时序收敛、为什么时序会违例、时序优化的核心思想
各位同学,欢迎来到《综合实现时序优化方法》的第一章。
做数字芯片设计,说白了就是在跟时间赛跑。你写的 RTL 代码再漂亮,如果综合后时序不收敛,那一切都是白搭。我见过太多项目,前端设计跑得欢,一到后端实现阶段就卡在时序上,最后不得不降频、改版,甚至重流片。
这一章,我们先打好基础。搞清楚三个核心问题:时序收敛到底是什么?时序违例是怎么发生的?时序优化的核心思路是什么?
1.1 什么是时序收敛
时序收敛,简单说就是:芯片里所有的时序路径,都能在时钟周期内完成数据传递。
你想想看,一个数字电路由无数条路径组成。数据从寄存器 A 出发,经过组合逻辑,到达寄存器 B。这条路径的延迟,必须小于时钟周期减去建立时间。如果所有路径都满足这个条件,我们就说时序收敛了。
用公式表达就是:
数据路径延迟 + 时钟偏斜 < 时钟周期 - 建立时间
反过来,如果有一条路径不满足,那就是时序违例。芯片就可能出现功能错误。
关键指标:
- WNS(最差负时序裕量):所有路径中,最差的那条路径还差多少时间
- TNS(总负时序裕量):所有违例路径的负裕量总和
- WNS = 0 且 TNS = 0,才算时序收敛
我记得刚入行时带我的老工程师说过一句话:「时序收敛不是终点,而是起点。只有时序收敛了,你才有资格谈功耗、面积。」这话我一直记着。
1.2 为什么时序会违例
时序违例的原因,我归纳为三大类。咱们一个一个说。
1.2.1 组合逻辑路径太长
这是最常见的原因。组合逻辑级数太多,数据路径延迟超过了时钟周期。比如一个 32 位加法器,如果不用流水线,直接连一串组合逻辑,那延迟肯定大得吓人。
我在项目中遇到过这样的情况:一个复杂的数学运算模块,综合后 WNS 是 -1.2ns。查了半天,发现是一条 40 级组合逻辑的路径。拆成 4 级流水线后,WNS 直接变成 +0.3ns。
1.2.2 时钟偏斜过大
时钟信号到达不同寄存器的时刻不一致,这叫时钟偏斜。偏斜太大,会导致建立时间或保持时间违例。
举个例子:时钟从源端到寄存器 A 的延迟是 0.5ns,到寄存器 B 的延迟是 1.2ns。那偏斜就是 0.7ns。如果数据从 A 到 B 的路径本身就很紧张,这 0.7ns 的偏斜就可能让时序崩掉。
1.2.3 信号完整性与串扰
这个在先进工艺节点下越来越突出。线间距变小,相邻信号线之间会互相干扰。一根线跳变时,可能通过耦合电容影响旁边的线,导致延迟变化。
我曾经在一个 7nm 项目上,前仿时序全过,后仿却冒出一堆违例。最后定位到是一条长走线被旁边的翻转率高的信号串扰了,延迟增加了 15%。
| 违例类型 | 典型原因 | 常见场景 |
|---|---|---|
| 建立时间违例 | 组合逻辑太深、负载太大 | 多级加法器、乘法器、译码器 |
| 保持时间违例 | 数据路径太短、时钟偏斜 | 扫描链、低功耗隔离单元 |
| 时钟偏斜违例 | 时钟树不平衡 | 跨时钟域、门控时钟 |
| 串扰违例 | 线间距小、翻转率高 | 先进工艺、高速总线 |
1.3 时序优化的核心思想
时序优化,说白了就是「拆、搬、调、换」四个字。
我给大家画一张图,把核心思路理清楚。
1.3.1 拆——流水线插入
这是最直接的方法。把一条长路径拆成多段,每段插入寄存器。代价是增加延迟(多了一个时钟周期的 latency)和面积。
举个例子:一个 64 位加法器,组合逻辑延迟 2.5ns。如果时钟周期是 1ns,那肯定违例。插入两级流水线后,每段延迟降到 0.9ns,时序就收敛了。
我的经验:流水线插入不是越多越好。每级流水线都有建立时间和时钟偏斜的开销。一般建议每级组合逻辑延迟控制在时钟周期的 60%-70%。
1.3.2 搬——逻辑重定时
逻辑重定时(Retiming)是 EDA 工具自动做的优化。它会在不改变功能的前提下,把组合逻辑在寄存器之间重新分配。
比如路径 A→B 延迟 0.3ns,路径 B→C 延迟 1.2ns。工具可以把 B→C 的一部分逻辑搬到 A→B 上,让两条路径都变成 0.75ns。
嗯,这里要注意:逻辑重定时对时序改善有限,一般只能优化 10%-20%。如果违例超过 30%,还是得靠流水线。
1.3.3 调——门级尺寸调整
EDA 工具在综合和物理实现阶段,会自动调整标准单元的尺寸。把驱动能力弱的单元换成驱动能力强的,减小路径延迟。
但代价是面积和功耗会增加。我见过一个项目,为了修一条关键路径,把 2X 的 buffer 换成了 16X 的,结果那条路径修好了,但局部功耗密度超标,又得加 decap 电容。
避坑指南:我曾经在一个项目中过度依赖门级尺寸调整,结果芯片流片回来,局部温度过高,导致时序漂移。从那以后,我给自己定了个规矩:门级尺寸调整只用来修小违例(WNS < 5% 时钟周期),大违例必须从架构层面解决。
1.3.4 换——结构替换
这是最根本的方法。用更快的逻辑结构替换原来的慢结构。
常见的替换思路:
- 行波进位加法器 → 进位选择加法器 / 超前进位加法器
- 二进制乘法器 → Wallace 树乘法器
- 普通译码器 → 优先译码器
- 同步 FIFO → 异步 FIFO(跨时钟域场景)
结构替换的收益最大,但改动也最大。需要 RTL 设计、综合、验证全流程配合。
1.4 本章小结
这一章我们讲了三个核心概念:
- 时序收敛:所有路径延迟小于时钟周期,WNS = 0
- 时序违例:组合逻辑太长、时钟偏斜、串扰是三大元凶
- 优化核心:拆(流水线)、搬(重定时)、调(尺寸)、换(结构)
记住一句话:时序优化不是事后补救,而是从架构设计阶段就要开始考虑的事情。我见过太多团队,RTL 写完了才想起来做时序分析,结果改得死去活来。