物理 ECO 与时序收敛:useful skew、resize、hold ECO 与 metal-only
更新时间:2026-09-25。本文是芯片设计专家层正文。时序基础见 STA 入门,多角多模签核见 MMMC 与高级 STA。这一篇聚焦 P&R 之后工程师最常做的「外科手术」——物理 ECO(Engineering Change Order)。
一、先分清问题属于哪一层
不是所有时序违例都该在 ECO 阶段硬修。正确顺序是从便宜到昂贵:
微架构/RTL 打拍 → 约束修正 → 综合优化 → 布局/CTS/布线优化 → 物理 ECO → 重新实现如果关键路径本质上是跨模块组合链太长、漏了一拍流水线,靠插一堆 buffer 通常只会牺牲面积和功耗。物理 ECO 只适合「局部、小范围、物理实现造成」的违例。
二、读报告:WNS/TNS/WHS/THS
| 指标 | 含义 | 关注点 |
|---|---|---|
| WNS | worst setup slack,最差建立余量 | 定位最痛路径 |
| TNS | total negative slack,所有 setup 违例之和 | 问题是一条还是一片 |
| WHS | worst hold slack | 快角最危险 |
| THS | total hold slack 负值和 | hold 违例路径数量 |
TNS 很大、WNS 一般,说明是系统性问题(频率太高、floorplan、时钟树),不能逐条修;WNS 很差但只有几条路径,适合 ECO。还要按 corner、scenario、路径组(input/reg2reg/output)分类,见 STA 报告解读。
三、setup ECO 的常用手段
按侵入程度从低到高:
- cell sizing(换大单元):增大驱动、降低延迟,但增加输入电容和功耗,可能把问题推给前级;
- HVT→SVT→LVT 换阈值:低阈值更快但漏电更高,只用于真关键路径;
- buffer insertion:分割长 RC 线,但 buffer 自身有延迟,过多会增加功耗;
- move cell:把终点或驱动单元挪近,缩短长线;
- net rerouting / layer promotion:换更高层更宽金属、减少绕线;
- pin swapping / 等价逻辑重构:把晚到信号接到更快输入或简化逻辑;
- useful skew:调整 capture 时钟延迟借余量,但必须全角验证 setup/hold;
- RTL ECO:实在不行增加一级寄存器,代价最大。
修 setup 时要警惕:增强驱动会增加前级负载,插 buffer 会影响布线,换 LVT 会推高漏电。任何局部动作都可能让另一条路径变差。
举一个具体例子说明手段怎么选。假设报告显示一条 reg2reg 路径 WNS = -0.12ns,路径中段是一根从一个 bank 跨到另一个 bank、长约 800μm 的连线,驱动它的是一个 SVT 小驱动反相器。第一步不是立刻换 LVT,而是先判断违例来源:展开 path schema,若延迟大头在那根长线的 wire delay(典型占了 60% 以上),正确动作是在线中段插一个 buffer 把长 RC 切成两段,wire delay 往往立刻塌下来;若延迟大头在驱动单元本身、线并不长,则 sizing 或 VT swap 更对症。用错手段——比如对一根短线猛换 LVT——不仅救不回多少,还白白增加漏电。这个「先看延迟构成、再选单一动作」的判断,正是第八节强调单变量工作流的原因。
useful skew 单独多说一句,因为它最容易被滥用。它的原理是:如果 capture 触发器的时钟天然到得晚一点,就等于给数据多留了一点到达时间。工程师可以通过在 capture 时钟路径加延迟,主动「借」这部分余量。但借来的余量不是免费的:capture 时钟变晚,会让这条路径对下一级的 hold 约束变紧,同时对 launch 一侧的前级路径也是隐患。所以 useful skew 只在局部、且能用工具在所有 scenario 验证不引发新违例时才用;把它当成普适手段到处加延迟,等于把时序债从一条路径搬到一圈路径上。
四、hold ECO 为什么通常最后修
hold 违例是数据到得太快,修法一般是在数据路径插入延迟单元(delay buffer)或降小驱动。它依赖真实布线延迟,所以应在时钟和线延迟稳定后处理;太早插 delay,后续布线变化会让 hold 结论反复。
hold ECO 风险:
- 延迟单元本身占用面积,可能引入 setup 问题;
- 快角必须 clean,慢角不能被拖崩;
- 时钟树后续改动会让所有 hold 结果失效;
- 大量 hold buffer 是 floorplan/CTS 质量差的信号。
五、pre-mask、post-mask 与 metal-only ECO
| 阶段 | 可改内容 | 成本 |
|---|---|---|
| pre-mask ECO | 可加/删/换单元、重新布线 | 低,仍是迭代 |
| post-mask/metal-only | 只改金属层,利用 spare cell | 中,省部分掩模 |
| base layer ECO | 连扩散/多晶硅层都要改 | 高,接近重新流片 |
为支撑 metal-only ECO,设计早期会散布 spare cell / eco cell:未使用但已连好电源地的备用门和寄存器,后期只用金属线把它们接入逻辑。若没预留 spare,很多后期修复无法只靠金属层完成。
metal-only 与 spare cell 的关系如下图。左半是已经做完的下层(base + 前段互连),右半是只用顶层金属做的接入动作:
读图抓一个前提:spare cell 之所以能「零成本接入」,是因为它的电源地在第一次流片时就已经连好,输出却悬空着不参与任何逻辑。后期 ECO 只动顶层金属,把需要的信号引到 spare 输入、再把输出接回去。代价因此主要剩一到两层金属掩模,而不是整套重制。反过来,如果 spare 数量不够、或离待修路径太远(金属线连不过去),就只能退回改 base layer,成本接近重新流片。所以 spare 的数量、种类(门/多路器/寄存器比例)和物理散布要在 floorplan 阶段就规划,而不是等 ECO 来了才发现够不着。
六、多目标冲突:不能只让一个角变绿
一个 ECO 必须同时满足:
- 所有签核 scenario 的 setup/hold;
- max capacitance / max transition / max fanout;
- DRC/LVS/antenna;
- power/EM/IR-drop;
- area 和 routing congestion;
- 逻辑等价性(LEC)。
典型冲突:LVT 修 setup 增加漏电;delay buffer 修 hold 恶化 setup;挪单元改善一条线但阻塞 congestion;useful skew 借了余量却让相邻路径 hold 爆掉。成熟流程用 ECO 工具做 multi-corner multi-scenario 优化,但工程师仍要审它改了哪些结构。
为什么必须在 MMMC 下而不是单角看 ECO,可以用一个常见反例说明。工程师常在最差慢角(slow-slow、高温、低电压、最坏 RC)下修 setup:换大单元、插 buffer 把这个角救绿。但同一个换大的单元,在快角(fast-fast、低温、高电压)下开关更快,它驱动的下游路径更容易 hold 违例;如果只看慢角就提交,等签核跑到快角才会发现凭空多出一批 hold 问题。反过来,在快角为修 hold 加的延迟单元,到慢角又可能把本来勉强过的 setup 拖崩。所以正确的验证次序是:每次 ECO 都让工具在同一组签核 scenario 上同时重算 setup 和 hold,确认 worst-of 全部为正,而不是分别在不同角各自调一套。相关的 scenario 组织和 derate 背景见 MMMC 与高级 STA,串扰角下还要叠加 SI 影响,见 串扰与 SI 签核。
七、标准闭环
报告定位 → 判断根因(RTL/约束/物理) → 最小 ECO → 增量实现
→ 全角增量 STA → LEC → DRC/LVS → power/IR/EM 复核 → 版本记录把这条闭环画出来,重点看其中两道「回路」:
图里有两条容易被忽略的反向边:增量 STA 发现「修好了目标角、却把另一个角或相邻路径拖崩」时,必须退回到 ECO 步骤重做,而不是再加一个补丁去掩盖;LEC 或物理验证不过,更要退回到根因判断,因为这往往说明改动本身在逻辑或物理上不成立。闭环的意义不是把节点从头走一遍,而是任何一道闸门失败都沿反向边回到上游,绝不带着已知问题往下走。
每次 ECO 都要有记录:路径、scenario、动作、对面积/功耗/其他角的影响。否则后期几十个 ECO 叠加后,没人能解释为什么某处有一串奇怪 buffer。
八、一次 ECO 的最小工作流
建议把每个 ECO 当作一次受控变更,而不是在版图上直接手工试错:
- 保存违例路径报告,记录 scenario、corner、slack、起点终点;
- 展开 schematic 和 physical view,判断长线、驱动、逻辑层级还是时钟偏移主导;
- 选择一种最小动作,不一次同时 resize、插 buffer、挪单元、改 skew;
- 跑增量实现和增量 STA,验证目标路径及相邻路径;
- 扩大到全部 scenario,检查 hold、max transition/cap、DRC、功耗;
- 通过后在 ECO 日志里写清动作和原因;失败则回滚,不叠加猜测性修改。
这种「单变量」方法尤其重要,因为物理 ECO 的结果高度耦合。一次改五件事即使变绿,也没人知道是哪项有效,更无法判断哪个副作用在硅片上会回来。
九、检查清单
- [ ] 先区分架构/约束问题与局部物理问题;
- [ ] 报告覆盖 WNS/TNS/WHS/THS 与所有路径组/scenario;
- [ ] setup 优先综合/布局阶段解决,hold 在延迟稳定后修;
- [ ] 每次 sizing/buffer/VT swap 都复查前后级和功耗;
- [ ] useful skew 在所有角验证,不制造新 hold;
- [ ] 预留 spare/eco cell,post-mask 优先 metal-only;
- [ ] ECO 后跑增量 STA、LEC、DRC/LVS、power/IR/EM;
- [ ] 所有 ECO 有路径依据和 waiver/评审记录。
总结
物理 ECO 是在 P&R 后用最小改动修局部时序:setup 靠换大/低阈值单元、增强驱动、插 buffer、缩短长线和受控的 useful skew,hold 靠在数据路径加延迟但通常最后做,所有动作都必须在 MMMC 下同时不破坏 setup、hold、DRC、功耗、IR/EM 和等价性;越接近流片改动越贵,因此要靠预留 spare cell 尽量做 metal-only ECO,并坚持「报告定位根因—最小修改—增量 STA/LEC/物理验证—记录影响」的闭环,避免用 ECO 掩盖本应在 RTL 或约束阶段解决的问题。