时序为什么不满足:建立时间、保持时间,频率为何不能无限高
更新时间:2026-09-05。本文是「集成电路大类 · 芯片设计」入门层(beginner)第十五篇新正文。时钟与复位 说过「时钟周期是给组合逻辑算题留的时间,留太短就算不完」。这一篇把「算不完」到底是什么意思讲透——建立时间、保持时间、关键路径,这是理解最高频率和时序收敛的根。工具怎么静态地算遍所有路径见 静态时序分析入门。
本文要回答的问题
- 为什么芯片不能想跑多快就跑多快?频率上限由什么决定?
- 「建立时间 setup」「保持时间 hold」到底是什么?
- 什么是关键路径(critical path)?为什么它决定最高频率?
- 加流水线为什么能提高频率?保持时间违例为什么和频率无关、必须修?
一、一条寄存器到寄存器路径
数字芯片里绝大多数时序路径长这样:数据从一个触发器(起点)出发,穿过一段组合逻辑(加法器、MUX、比较器……),到达**下一个触发器(终点)**的 D 端,必须在下一个时钟沿被正确采样。
二、建立时间(setup):数据必须「提前到」
真实触发器不是理想开关:为了可靠采样,输入 D 的值必须在时钟沿到来之前提前一小段时间就稳定下来,这段最小提前量叫建立时间(setup time, Tsu);沿之后还要短暂保持不变,叫保持时间(hold time, Th)。
于是一个周期内的时间预算大致是:
时钟周期 T ≥ 触发器时钟→Q 延迟(Tco)
+ 组合逻辑延迟(T_logic)
+ 建立时间(Tsu)
(还要留时钟偏差 skew 的余量)当某条路径的 Tco + T_logic + Tsu 超过了时钟周期 T,下一个沿到来时数据还没算稳,Q2 就会采到错误值(甚至进入亚稳态)——这叫建立时间违例(setup violation)。
三、关键路径:最慢的那条路决定最高频率
芯片里有亿万条寄存器到寄存器路径,延迟各不相同。最慢的那一条(延迟最大)就是关键路径(critical path)。因为时钟是全局统一的,周期必须容下最慢的路径,其他路径再快也得等它。所以:
最高时钟频率 ≈ 1 ÷ 关键路径总延迟。
想提频,就得找到关键路径、想办法缩短它——这就是时序优化的核心。常见手段:
- 加流水线(pipelining):把一段很长的组合逻辑从中间切开、插入一级触发器,让每个周期只走一半逻辑,关键路径变短、频率就能提高(代价是多花一拍延迟、多用寄存器)。CPU 主频比拼很大程度是流水线和微架构的比拼。
- 用更强的单元:综合/后端换驱动能力更大、更快的门(更费电、更占面积);
- 缩短连线:把相关单元摆近(见 P&R 入门);
- 改微架构/RTL:减少一条路径上串的门、把大加法器/比较器拆分。
这也解释了 从代码到门电路 说的「for 展开成多份电路」——用面积换并行、缩短关键路径。
四、保持时间(hold):和频率无关,必须无条件满足
保持时间要求数据在时钟沿之后一小段时间内保持不变。保持时间违例(hold violation) 发生在数据传得太快:起点触发器新值沿极短路径(或时钟偏差)在同一个沿还没结束就冲到了终点,冲掉了本该被采样的旧值。
关键点:hold 违例不能靠降频解决(它检查的是同一个沿附近、与周期长短无关),所以工具必须通过插入延迟缓冲(buffer)等方式无条件修好,否则芯片在任何频率下都会出错。相比之下 setup 违例还能靠「降频松周期」缓解。
| 建立时间 setup | 保持时间 hold | |
|---|---|---|
| 要求 | 数据在沿前提前稳定 | 数据在沿后短暂保持 |
| 违例原因 | 路径太慢、周期太短 | 路径太快/时钟偏差 |
| 与频率关系 | 频率越高越易违例 | 与频率无关 |
| 修法 | 提频受限:加流水线、换快单元、降频 | 必须修:插缓冲延迟、调时钟树 |
五、时序收敛与「时序余量 slack」
工具用 静态时序分析 对每条路径算一个时序余量(slack):
- setup slack = 要求时间 − 实际到达时间。slack ≥ 0 表示来得及(时序满足);slack < 0 就是违例,负值越大越严重。
- 设计的目标就是让所有路径的 setup/hold slack 都 ≥ 0——这叫时序收敛(timing closure),常需综合、P&R、改 RTL 反复迭代(见 物理实现上手)。
六、这一篇在知识体系里的位置
- 想知道工具怎么不用仿真就把所有路径算一遍、slack 报告怎么读 → 静态时序分析入门、时序分析;
- 想看时钟偏差、时钟树怎么影响时序 → 时钟与复位、P&R 入门;
- 想理解流水线/关键路径怎么在 RTL 层面优化 → RTL 设计入门、微架构入门;
- 想知道提频和功耗的矛盾 → 芯片功耗从哪来、低功耗设计直觉。
总结
一句话总结:数据从一个触发器出发、穿过组合逻辑到达下一个触发器,必须在一个时钟周期内算稳,并满足触发器的建立时间(沿前提前稳定)和保持时间(沿后短暂保持);当「时钟到 Q 延迟 + 组合逻辑延迟 + 建立时间」超过周期就发生建立时间违例,而亿万条路径里最慢的那条关键路径决定了整颗芯片的最高频率(频率 ≈ 1÷关键路径延迟),提频要靠加流水线切开长逻辑、换更快单元、缩短连线或改微架构——本质是拿面积/功耗换速度;保持时间违例则相反,是数据传太快在同一沿冲掉旧值,它与频率无关、降频救不了,必须靠插缓冲延迟无条件修复;STA 给每条路径算 slack,让全部 setup/hold slack ≥ 0 就是时序收敛,是综合与布局布线反复迭代的目标。