建立时间违例和保持时间违例根源不同:一个嫌数据太慢,一个嫌数据太快
更新时间:2026-10-28。本文是「集成电路大类 · 芯片设计」入门层的一篇问答式短文。在 时序分析入门 和 静态时序分析(STA)是什么 里我们见过 setup/hold 这两个词,面试和 STA 报告里它们更是成对出现。很多人把两类违例当成「同一类问题的两个方向」,其实它们的根源、与频率的关系、修复手段完全不同,搞混了会用错药。
本文要回答的问题
- 建立时间(setup)违例和保持时间(hold)违例,各自的物理根源是什么?
- 为什么说 setup 违例「降频能救」,hold 违例「降频没用」?
- 两类违例分别用什么手段修?为什么修 hold 反而更「便宜」?
- 新手最容易混淆的几个误区是什么?
简短结论
setup 违例的根源是数据来得太慢——两个寄存器之间的组合逻辑路径太长、延迟太大,数据没赶上下一个时钟沿;它跟时钟频率强相关,降频能缓解。hold 违例的根源是数据变得太快——路径太短、延迟太小,新数据在旧数据还没被「抓稳」的保持窗口内就冲到了;它跟时钟频率几乎无关,降频救不了,只能靠加延迟(插 buffer、换慢单元)把数据「拖住」。一句话:setup 嫌路太长,hold 嫌路太短。
三个理由:为什么根源完全不同
理由一:检查的时间窗口不一样
寄存器(触发器)对输入数据有两个要求,定义在时钟沿前后的不同时刻:
- 建立时间(setup time):时钟沿到来之前,数据必须提前稳定好的一段时间。检查的是「上一个沿发出的数据,经过组合逻辑,能不能在下一个沿之前到」。这是最长路径问题——怕慢。
- 保持时间(hold time):时钟沿过去之后,旧数据还必须继续稳定的一段时间。检查的是「同一个沿发出的新数据,会不会太快冲到下一家,把人家正在采样的旧数据冲掉」。这是最短路径问题——怕快。
所以 setup 检查盯的是组合逻辑的最大延迟,hold 检查盯的是最小延迟。一个管上限,一个管下限,从根源上就是两个方向的问题。背景知识见 锁存器与触发器 对寄存器采样行为的讲解。
理由二:与时钟周期的关系不一样
setup 检查跨越一个完整时钟周期:可用时间 ≈ 周期 − 组合逻辑最大延迟 − setup time。周期越短(频率越高),留给数据的预算越紧,所以 setup 违例是频率的直接函数——这就是为什么 STA 报告里 setup 违例降频就能「过关」(虽然产品规格不允许时这不算真修好)。
hold 检查发生在同一个时钟沿上:发射沿和捕获沿是同一拍,可用时间与周期长度无关,只取决于两条路径的相对延迟差。所以把 1 GHz 降到 100 MHz,hold 违例一个都不会少——这是新手最容易栽跟头的地方。
下面这张波形图把两类违例画在同一条数据路径上。读法:CLK 是两个寄存器共享的时钟;D_slow 模拟一条延迟过大的路径——数据在捕获沿之前还没稳定,落进了 setup 窗口(违例);D_fast 模拟一条延迟过小的路径——上一拍数据刚被采走,新数据立刻就变,落进了捕获沿之后的 hold 窗口(违例)。
两个红色窗口分别卡在捕获沿前后:setup 窗在沿前,抓「来得晚的」;hold 窗在沿后,抓「变得快的」。看懂这张图,两类违例的根源差异就再也不会记反。
理由三:修复手段的方向相反
- 修 setup(让数据变快):流水线插寄存器把长路径切断、逻辑重构、换更快的单元(低阈值电压/大驱动)、优化布局布线缩短线延迟。这些手段往往动架构、动 RTL,代价大。
- 修 hold(让数据变慢):在路径上插 delay buffer、换更慢(更小驱动)的单元、加长绕线。不动功能逻辑,后端工具在 signoff 阶段批量插 buffer 就能修掉一大片,代价小得多。
所以业界的经验法则是:setup 违例是设计问题,hold 违例是工程问题。流程上通常先保证 setup 收敛,hold 留给后端修——因为修 hold 加的延迟可能反过来恶化 setup,顺序反了会来回打架。两类违例的对比如下:
这张对照卡覆盖了两类违例的五个维度,其中「与频率的关系」和「修法方向」是最常被考、也最容易记反的两行——记住「setup 管最慢路径、hold 管最快路径」,其余四行都能推出来。
一个具体例子
假设一条寄存器到寄存器的路径:寄存器 A 输出经过三级组合逻辑到达寄存器 B,时钟周期 2 ns(500 MHz),B 的 setup time 是 0.1 ns、hold time 是 0.05 ns。
- setup 场景:三级逻辑加上走线,最大延迟 2.3 ns。数据从 A 发出后要 2.3 ns 才稳定,但 B 在 2 ns 时就要采样(还要求提前 0.1 ns 稳定)——数据晚了 0.4 ns,setup 违例。把频率降到 400 MHz(周期 2.5 ns)就不违例了,这就是「降频能救 setup」。
- hold 场景:如果 A 和 B 摆得很近、中间只有一级小逻辑,最小延迟只有 0.03 ns。时钟沿一到,A 的输出 0.03 ns 后就变了,而 B 要求旧数据在沿后再稳 0.05 ns——新数据把旧数据冲了,hold 违例。这时把周期从 2 ns 放到 20 ns,违例原封不动,因为发射沿和捕获沿是同一个沿。修法是在 A→B 之间插两个 delay buffer,把最小延迟垫过 0.05 ns。
同一个设计里,长路径上可能 setup 违例、短路径上同时 hold 违例,两者互不矛盾——它们检查的是不同路径的不同端点。这也正是 STA 入门 里「max/min 两种分析」的由来:max 分析查 setup,min 分析查 hold。
常见误区
- 「hold 违例降频试试」:没用。hold 检查在同一拍内完成,跟周期长短无关。仿真里降频后 hold 违例「消失」,往往是仿真精度或激励时序掩盖了问题,不是真修好。
- 「setup 和 hold 是同一个窗口的两半」:不是。setup 检查用的是下一个时钟沿、看最大延迟;hold 检查用的是同一个时钟沿、看最小延迟。两者的「发起沿—捕获沿」配对都不同。
- 「修 hold 只要猛插 buffer 就行」:插 buffer 会占用面积功耗,还会增加路径最大延迟,可能把旁边裕量本就不大的 setup 拖下水。所以后端修 hold 要看 setup 裕量,且通常在时钟树(CTS)完成后才动手——时钟偏斜定了,hold 账才算得准。
- 「功能仿真能查出 setup/hold 违例」:功能仿真只看逻辑对不对,不看真实延迟。时序违例要靠 STA 或带时序反标的门级仿真发现,见 时序分析入门。
- 「只要最慢路径不违例就万事大吉」:最快路径同样能致命。数据来得太快和数据来得太慢一样会采样错误,只是错的方向不同。
这一篇在知识体系里的位置
本篇是时序系列的一篇问答短文:上游是 锁存器与触发器(寄存器采样行为)与 时钟与复位入门;同层的 时序分析入门 讲时序约束的整体框架,STA 是什么 讲静态时序分析工具如何系统性地检查这两类违例;再往后可以接到 逻辑综合入门 看工具如何在综合阶段就为时序收敛做准备。
一句话总结
建立时间违例和保持时间违例根源不同:setup 违例是组合逻辑路径太长、数据在下一个时钟沿前没赶到,与频率强相关,要靠流水线、重构、换快单元等设计手段修;hold 违例是路径太短、新数据在同一个时钟沿后太快冲掉旧数据,与频率无关、降频无效,只能靠插 delay buffer 加延迟修——前者管最慢路径,后者管最快路径,方向相反,用药绝不能混。