setup hold 违例修复:数据路径与时钟路径两套工具箱怎样选,为什么修完必须双向回归
建立时间违例和保持时间违例根源不同 讲清了两类违例「为什么发生」:setup 嫌数据太慢、盯最长路径,hold 嫌数据太快、盯最短路径。那一篇解决的是认知问题,这一篇解决动手问题——STA 报告里刷出一片负 slack 之后,鼠标该点向哪个单元、该放大还是该插缓冲、什么情况下允许去调时钟。在 建立时间违例和保持时间违例根源不同 的认知基础上,本篇把全部常用修复手段收进两个工具箱:动数据路径的和动时钟路径的,逐项交代它们改变的是路径延迟的哪一项、对 setup 还是 hold 有效、附带什么代价,最后讲清为什么任何单点修复都必须跑 max/min 双向回归。亚稳态的物理后果在 建立保持时间与亚稳态深入 里展开,本篇只在 hold 风险处点到。
本文要回答的问题
- STA 报告里的负 slack 分哪两类,setup hold 违例修复的第一刀为什么是先分诊再选手段?
- upsize driver、downsize receiver、插 buffer、Vt 换型、delay cell、长绕线,各自动的是数据路径还是时钟路径,治 setup 还是治 hold?
- 降频和 useful skew 都动时钟,它们的作用层次和工程边界有什么不同?
- 为什么修 setup 可能反噬 hold、修 hold 也可能拖垮 setup,反噬在延迟公式里是怎么发生的?
- 一条违例路径修完之后,回归检查要覆盖哪些路径、哪些工艺角落?
先给一张修复前后的对照卡,建立全篇的目标图景:左侧是报告里的病态路径,右侧是同一类路径经过工具箱处理后的收敛状态。卡中 slack 只给符号方向,不代表任何具体工艺数值。
读这张卡抓住一点:右侧的绿色状态不是「把一个数字改正」那么简单,第四行的 hold 重新签核与第三行的延迟均匀分布,才是修复真正成立的条件。后面所有章节都是在解释这张卡每一行背后的手段与代价。
一、先分诊:slack 符号决定用哪套箱子
正式打开工具箱之前,只用一小段回顾 slack 的读法,完整推导留给根因篇。STA 对每条寄存器到寄存器路径同时记两本账:
# setup 账(max 分析,盯最长路径)
setup slack = 数据要求到达时间 - 数据实际到达时间
# slack 为负:数据到得太晚,下一个捕获沿采样不稳
# hold 账(min 分析,盯最短路径)
hold slack = 数据最早到达时间 - 保持要求时间
# slack 为负:新数据到得太早,同一沿上的旧数据被冲掉两本账的检查沿配对不同:setup 跨一个完整时钟周期,hold 在同一个发射沿内闭合。这个差异直接决定了两件事:其一,降频拉长周期只对 setup 账有效,hold 账里根本没有周期这个变量;其二,数据路径上的任何一次改动,只要同时改变了路径的最大延迟和最小延迟,就会同时翻动两本账——这是本篇第六节反噬问题的总根源。
| 分诊信号 | 违例类型 | 延迟方向 | 频率能否救 | 开箱方向 |
|---|---|---|---|---|
| setup slack 为负 | setup 违例 | 数据太慢 | 能,降频放宽周期 | 让数据变快,或借/放时钟预算 |
| hold slack 为负 | hold 违例 | 数据太快 | 不能,同沿检查与周期无关 | 让数据变慢,垫足最小延迟 |
| 两类同时为负 | 路径离散度不足 | 快慢两头都不达标 | 只能救 setup 一头 | 先收 setup,再垫 hold,双向回归 |
第三行是真实工程里的常见局面:同一块设计的长路径上报 setup、短路径上报 hold 并不矛盾,因为它们检查的本来就是不同路径的不同端点。修复这类并存违例的标准顺序是先 setup 后 hold,理由第六节展开。
二、第一刀分岔:动数据路径还是动时钟路径
分诊完成后,所有修复手段沿一条清晰的界线分成两族。数据路径手段改变组合逻辑本身的传播延迟,是修复的主力;时钟路径手段改变发射沿或捕获沿的到达时刻,不动功能逻辑,属于预算调剂。下面这张分类图把两族手段与它们主治的违例画在一起,颜色只表达语义:红色是报告入口,橙色手段给数据加速、主治 setup,紫色手段给数据垫延迟、主治 hold,蓝色是时钟侧的调剂手段,灰色容器标出两条路径边界。
读图抓两条主线:从红色入口向左进数据路径,是按违例方向给延迟做加减法;向右进时钟路径,是不动数据、只重分时间预算。注意两个灰色容器里的手段不是并列任选——数据路径手段改的是物理延迟,时钟路径手段改的是记账时刻,后者的余量全部来自相邻路径的让渡,第五节专门讲这笔债怎么还。
三、setup 工具箱:把数据提前送到捕获沿
setup 违例的修复方向只有一个:缩小数据实际到达时间,或者放宽要求到达时间。下表把数据路径上的四种主力手段与两种时钟侧手段并排,代价一列是选型时真正的决策依据。
| 手段 | 动哪条路径 | 直接效果 | 代价与副作用 | 适用场景 |
|---|---|---|---|---|
| upsize driver 放大驱动 | 数据 | 降低输出电阻,RC 延迟下降 | 输入电容增大,前级负载变重;面积、功耗上升 | 末端驱动不足、负载电容重的单元 |
| downsize receiver 缩小接收管 | 数据 | 减小前级看到的负载电容 | 接收管自身变慢,收益可能被抵消 | 接收端尺寸明显过剩时 |
| 插 buffer 重驱动 | 数据 | 长线切段,重置驱动能力与斜率 | 增加级数与面积,缓冲器自身有延迟 | 高扇出网络、长互连线 |
| Vt 换型(换 LVt/ULVt 单元) | 数据 | 降低阈值电压,单元提速 | 漏电功耗显著增大,可选库受限 | 关键路径上的少量瓶颈单元 |
| 逻辑重构 / 插流水线 | 数据(架构层) | 切短组合路径,级数重新分配 | 改 RTL、增加延迟拍数、验证重来 | 违例深、单元级手段救不动 |
| useful skew 调晚捕获沿 | 时钟 | 要求到达时间后移 | 侵蚀下游 hold 裕量与邻路预算 | 局部路径救急,见第五节 |
| 降频 | 时钟(规格层) | 周期拉长,全局预算放宽 | 性能规格损失,通常不算真修复 | 架构手段耗尽后的兜底 |
up size 与插 buffer 是日常使用频率最高的两件工具,但它们都不是「做了就赚」。放大一个单元会同时加重它前级的电气努力,盲目沿链逐级放大,总延迟可能不降反升;逻辑努力与扇出 用等努力原则解释了根因——最快的链路上每一级承担的努力应当均匀,尺寸优化必须沿整条链施力,而不是盯着报告里最差的那一个单元猛换。插 buffer 同理:缓冲器切断了长线的 RC 累积,却也插入了自己的两级门延迟,只有当线延迟被切掉的部分大于新增门延迟时才净赚,这也是 互连线延迟与 Elmore 模型 给出的插入点判据。
Vt 换型是另一种性质的手段:同一个逻辑功能、同一个尺寸,低阈值电压单元就是更快,代价是亚阈值漏电按指数上升。所以 LVt 单元是稀缺资源,工程上只撒在关键路径的瓶颈级,整片换型会把功耗签核打穿。四种数据路径手段的详细副作用与工程选择顺序,setup 修复工具箱:Vt 换型与尺寸放大 做了 EDA 视角的展开,本篇不再重复其操作细节,只强调它们在整张决策图里的位置:全部作用于数据路径的最大延迟,全部对 hold 账中性偏正面(加速数据会同时减小最小延迟,反而可能惹出 hold 问题,第六节细说)。
四、hold 工具箱:把新数据拦在保持窗口之外
hold 违例的修复方向与 setup 恰好相反:抬高数据最早到达时间,让新数据晚一点抵达捕获端。由于 hold 检查与周期无关,时钟侧只有 skew 调剂这一条窄路,主力全部在数据路径上做「加法」。
| 手段 | 动哪条路径 | 直接效果 | 代价与副作用 | 适用场景 |
|---|---|---|---|---|
| 插 delay cell / delay buffer | 数据 | 垫足最小延迟,推高最早到达时间 | 最大延迟同步增加,可能压 setup;占面积 | 后端批量修 hold 的主流手段 |
| downsize driver 减弱驱动 | 数据 | 驱动电阻上升,沿变慢 | 斜率退化、噪声容限下降 | 违例量小、原驱动过剩 |
| 加长绕线 | 数据 | 用线延迟垫高最小延迟 | 耗布线资源,耦合噪声上升 | CTS 后的细微量调 |
| 调整捕获时钟 skew | 时钟 | 改变保持记账时刻 | 影响同一时钟域其他路径 | 数据路径无空间时的补充 |
delay cell 本质上就是专门设计的「只贡献延迟、不改变逻辑」的缓冲单元,标准单元库通常提供多档延迟规格供后端工具按违例量选配。它之所以能成为主流,是因为 hold 修复发生在时钟树综合(CTS)之后:时钟偏斜一旦定了,hold 账才算得准,此时布局布线已冻结,插延迟单元对版图的扰动最小。downsize 与长绕线更像微调手段——前者让沿变缓来换延迟,代价是对噪声更敏感;后者借用绕线的 RC,但长线会引入耦合串扰,能用单元延迟解决就不优先占用布线资源。
需要点到风险的一层是:hold 违例若流片后仍存在,触发的是同一时钟沿上的采样冲突,后果直接通向亚稳态,平均无故障时间的量化分析见 建立保持时间与亚稳态深入。这也是 hold 修复虽然手段简单、却必须在签核阶段清零、不带负裕量出厂的原因。
五、时钟路径手段:借来的时间总要还
时钟路径不动任何组合逻辑,只改变寄存器时钟引脚的跳变时刻,手法分全局与局部两种。
全局手法是降频:周期 T 变大,setup 公式里的要求到达时间整体后移,所有 setup 路径同时受益。它的局限也写在公式里——hold 公式不含 T,降频对 hold 违例零作用;更现实的约束是产品规格,频率写在数据手册上,降频等于降级出货,所以工程上只把它当架构手段耗尽后的兜底,而不是收敛方案。
局部手法是 useful skew:把捕获寄存器的时钟有意调晚一点,让这条路径的要求到达时间后移,相当于从下一级路径的时间预算里「借」时间。它对局部深违例常常立竿见影,但记账上是一笔转移支付而非新增预算——捕获沿调晚,同一个沿对下游路径而言就是发射沿变晚,下游的 hold 裕量被直接侵蚀,借得过多会在邻路上造出新开箱的 hold 违例。时钟偏差与 useful skew 给出了完整的不等式推导、代数算例与 OCV 降额下的借用上限,本篇只立一条使用纪律:useful skew 是带着还款计划的救急手段,任何一次借用都必须把被借路径列进回归清单。
六、反噬机理与权衡决策流程
setup hold 违例修复最容易栽的坑,是以为两本账可以独立修。实际上数据路径的每次延迟改动都同时影响最大延迟与最小延迟,方向相反的手段会互相拆台。典型的反噬链条有三条:
- 为救 setup 而 upsize、换 LVt、插 buffer,数据更快意味着最小延迟也更小,原本勉强达标的 hold 可能当场转负;
- 为救 hold 而插 delay cell,路径最大延迟同步抬高,同一条路径的 setup 裕量被等量吃掉;
- useful skew 调晚捕获沿救了本路 setup,却把下游 hold 裕量掏空,违例只是搬家、没有消失。
正因为存在这三条链,修复不能「见一个负 slack 修一个」,而要走一条带分诊与回归的决策流程。下图颜色对应节点角色:红色是报告现象,蓝色是读报告的分析动作,绿色是违例类型判定,橙色是对应修复动作,紫色是任何分支都必须回到的回归环节。
这张流程图的关键不是两个橙色分支,而是紫色节点回连蓝色分诊的那条边:回归一旦发现新增违例,流程就地回到分诊而不是继续叠加修复。无限制地叠 buffer、叠 delay cell 是新手收敛失败的典型模式——每一轮修复都在制造下一轮的违例,面积和功耗先于时序崩盘。
为什么工程顺序固定为「先 setup 后 hold」也可以在图上解释:setup 修复手段密集、改动面大,常常重排单元与缓冲;hold 修复依赖 CTS 之后稳定的时钟偏斜,若先垫好 delay cell,后续 setup 改动一搅动布局,延迟账全部作废返工。先把 setup 收敛到接近达标、CTS 完成后再一次性垫 hold,返工量最小。
七、手段副作用速查与双向回归清单
把第六节的三条反噬链展开成可执行的核对表,每修一类违例,对照最右一列圈定回归范围。
| 修复手段 | 主治 | 可能伤到 | 回归必须检查 |
|---|---|---|---|
| upsize / LVt 换型 | setup | 前级 setup(负载加重)、本路 hold(最小延迟变小)、漏电 | 前级路径 max、本路 min、功耗签核 |
| 插 buffer 重驱动 | setup | 面积、本路 hold | 同节点 max/min 双账、面积预算 |
| delay cell | hold | 同路 setup(最大延迟抬高) | 本路 max、相邻快路径 min |
| downsize driver | hold | 本路 setup、信号完整性 | max 账、噪声与斜率报告 |
| 长绕线 | hold | setup、耦合串扰 | max 账、SI 分析 |
| useful skew | setup | 下游 hold、同一时钟域邻路 | 被借路径 min、全时钟域 setup |
| 降频 | setup | 性能规格 | 无物理反噬,确认规格允许 |
回归清单本身可以固化为四个动作:第一,对修改路径同时重跑 max 与 min 分析,不允许只看被修的那本账;第二,把前级、后级与同时钟域相邻路径纳入范围,反噬几乎都发生在邻居身上;第三,跨工艺角落签核,慢角落(慢管、高压低温之外的恶劣组合)压 setup、快角落压 hold,单角落通过不等于收敛,静态时序分析 STA 入门 的多角落与 OCV 流程是这一步的工具基础;第四,复核面积、功耗与布线资源,任何让三项签核之一超标的修复都要回炉重选手段。
最后用一张思维导图把整套工具箱收束成四个分支,读图时沿「治什么、用什么、怕什么、怎么验」的顺序,即可重建全篇的决策结构。

这一篇在知识体系里的位置
本篇是时序收敛簇的「动手篇」:上游认知由 建立时间违例和保持时间违例根源不同 承担,时序约束与 slack 的整体框架见 时序分析入门,工具侧的多角落签核流程见 静态时序分析 STA 入门。同层的 时钟偏差与 useful skew 是本篇时钟手段的深化,逻辑努力与扇出 与 互连线延迟与 Elmore 模型 分别解释尺寸优化与缓冲插入的一阶算术,EDA 实操层面的 setup 四手段选择顺序见 setup 修复工具箱:Vt 换型与尺寸放大,hold 失守的物理后果则通向 建立保持时间与亚稳态深入。
总结
setup hold 违例修复的第一动作永远是分诊:setup slack 为负说明数据太慢,工具箱沿「让数据变快」展开——upsize 放大驱动、插 buffer 切段长线、LVt 换型提速、架构层插流水线,时钟侧辅以 useful skew 借周期与降频兜底;hold slack 为负说明数据太快,且因同沿检查与周期无关,只能沿「让数据变慢」处理——CTS 后插 delay cell 为主,downsize 与长绕线做微调。数据路径手段改物理延迟、是主力,时钟路径手段改记账时刻、是带着还款义务的调剂。两本账通过最大/最小延迟耦合在一起:加速数据可能掏空 hold 裕量,垫延迟又会吃掉 setup 预算,useful skew 则让违例在邻路搬家,因此修复顺序固定为先 setup 后 hold,任何改动都必须回到 max/min 双账、相邻路径、多工艺角落与面积功耗四个维度做双向回归——负 slack 被改正只是表象,不引入新负 slack 的收敛才是真收敛。