案例复盘:关键路径从 WNS -0.82ns 到全角 clean
更新时间:2026-09-14。本文是芯片设计专家层案例文。前置知识见 SDC 约束实战、STA 报告解读、MMMC 与高级 STA、物理 ECO。案例为教学化虚构,但定位路径和收敛顺序是真实项目的常见模式。
一、项目背景
一颗多核 SoC,目标功能频率 1.2GHz,周期 0.833ns。关键模块是 CPU 到 L2 缓存的 load-store 单元。第一次 post-route STA 结果:
| 报告项 | 慢角 setup | 快角 hold |
|---|---|---|
| WNS / WHS | -0.82ns | +0.04ns |
| TNS / THS | -41.6ns | 0 |
| 违例路径数 | 236 | 少数接近边界 |
-0.82ns 接近一个周期,说明不是简单「差一点」,很可能是架构/约束问题;TNS 集中在 load bypass 路径组,说明不是全芯片都差。
二、第一步:不要立刻插 buffer
团队第一次尝试让 EDA 工具自动插 buffer/upsize,结果:
- WNS 从 -0.82 只改善到 -0.68;
- 局部面积增加 3.8%,拥塞变严重;
- 若干非关键路径因输入电容变大变成新违例;
- 快角出现 18 条 hold 违例。
这说明违例不是单纯驱动不足。物理 ECO 只能修局部尾巴,修不了「逻辑层级本来就塞不进一个周期」。
三、读路径:真正的关键链是什么
打开 worst path report,路径为:
EX/MEM 流水线寄存器
→ tag compare mux
→ RAW hazard 比较
→ bypass 选择 mux(4:1)
→ ALU 操作数 mux
→ MEM/WB 终点寄存器共 11 级逻辑,其中 RAW bypass 选择和 ALU 输入选择串在同一周期。数据依赖关系决定它天然很长。进一步核查:
- 时钟周期 0.833ns,路径数据到达约 1.65ns,相当于约 2 拍;
- launch/capture 是同一 PLL 时钟,不是异步误报;
- SDC 没有把该路径错误标 multicycle;
- PBA(path-based analysis)比 GBA 模式好 0.12ns,但仍差 0.70ns;
- 物理上 launch 和 capture 单元分处拥塞宏单元两侧,长线再贡献约 0.18ns。
结论:主要问题是微架构级联过长,次要问题是 floorplan/布局把终点放远了。
四、修复 1:RTL 把 bypass 判定提前一拍
与设计团队确认后,把 hazard 判断和 bypass select 的高位选择从「数据最后一拍」拆出:
旧:同一拍完成 tag compare → hazard → bypass mux → operand mux → 采样
新:上一拍生成 bypass_sel,本拍只做 operand mux;
数据路径保留必要旁路,控制路径预计算这不是增加功能延迟,而是把控制选择信号预译码。重跑综合和 STA:
| 阶段 | WNS | TNS | 说明 |
|---|---|---|---|
| 初始 postroute | -0.82ns | -41.6 | 控制和数据长链串联 |
| RTL 预计算后 | -0.31ns | -8.7 | 主因消除,剩余物理问题 |
违例路径从 236 条降到 47 条,说明根因找对了。
五、修复 2:综合 retiming 与 floorplan 微调
剩余路径有两类:
- 数据经大 mux 后还要穿过一块拥挤区域;
- EX/MEM 与 MEM/WB 寄存器围绕 SRAM 宏分布不均。
措施:
- 对非功耗关键的少数 mux 单元从 HVT 换成 SVT/LVT(只在违例路径,不全芯片换 VT);
- 对 hazard 寄存器组做 retiming,让综合把等值寄存器位置前后移动,平衡两级逻辑;
- 调整 floorplan guidance,把 bypass 相关寄存器和 mux 放到同一 data path aisle;
- 限制大单元密集 upsizing,避免重新制造拥塞。
结果 WNS 到 -0.12ns,TNS 到 -0.9ns,只剩十几条边缘路径。此时才进入物理 ECO 的适用范围。
六、修复 3:受控 useful skew 与最后 setup 收敛
最差路径的 capture 寄存器时钟比 launch 稍早到,天然少了余量。CTS 团队给该 capture 路径加 0.06ns 延迟(positive useful skew),相当于让数据多拿一点时间:
原:capture edge 提前,setup 更紧
调:capture clock 延迟 0.06ns → setup +0.06ns
代价:检查下一级路径和 hold同时做少量 driver upsize 和长线换层。结果:
- 慢角 WNS = +0.021ns,setup 勉强过;
- 工具做多场景验证,确认相邻路径没有变差;
- 保留 margin 评审,因为 +0.021ns 太接近零,后续任何 ECO 都可能打翻。
团队没有用更大 useful skew 硬顶,而是再把两个非关键 mux 换成稍快单元,把 WNS 拉到 +0.057ns,给后续 metal ECO 和模型误差留余量。
七、修复 4:hold 必须多角一起清
setup 修完后,快角 hold 问题出现:
- LVT 单元更快;
- useful skew 改变了 capture 沿;
- 布线后短路径数据到得更早。
处理原则:
- 等布线和时钟最终稳定;
- 对短路径插入最小延迟单元,而不是降低一串 driver;
- delay 加在数据路径且靠近发送端,避免增加接收端负载;
- 每个 hold ECO 后回查慢角 setup;
- 所有功能、Scan、低功耗 scenario 一起跑。
最终结果:
| Scenario | setup WNS | hold WHS |
|---|---|---|
| FUNC_SS_125C | +0.057ns | +0.031ns |
| FUNC_FF_M40 | +0.180ns | +0.018ns |
| SCAN_FF | +0.092ns | +0.026ns |
| SLEEP_SS | +0.110ns | +0.040ns |
TNS/THS 全零。
八、最后回归:不只时序数字
最终 ECO 后又做了:
- LEC:RTL 预计算/retiming 后逻辑等价;
- SI-aware STA:耦合 delta 后仍有正余量;
- DRC/LVS/ANT:最后换层、插 cell 后重跑,见 物理验证;
- Power/IR/EM:LVT 替换只影响少量单元,局部功耗和压降仍在预算内;
- 路由拥塞:没有因 buffer/upsize 引入新的 routing hot spot。
任何一项没回查,都可能出现「时序绿了但物理验证或功耗挂了」的假收敛。
九、经验提炼
- WNS 接近一个周期,先查架构/约束,不要先插 buffer。
- TNS 路径组集中时,先找共同拓扑根因。
- PBA 可以去掉部分悲观,但救不了真正两拍路径。
- RTL/微架构调整收益最大,其次 floorplan/综合,最后才是物理 ECO。
- LVT/useful skew/hold buffer 都是借账,必须全角偿还。
- setup、hold、SI、功耗、DRC/LVS 是一个联动系统,不能只追一个绿色数字。
- 收敛后期要留 margin,零余量不是可签核状态。
十、可复用检查清单
- [ ] 按路径组和共同终点聚合 worst paths;
- [ ] 核查时钟、generated clock、例外约束、CDC 后再相信违例;
- [ ] 比较 GBA/PBA 和物理布局,区分悲观量与真实长路径;
- [ ] 深逻辑优先 RTL 打拍/控制预计算/retiming;
- [ ] upsizing/buffer 只用于尾部物理延迟;
- [ ] useful skew 记录依据并检查相邻路径;
- [ ] hold 在最终布线/CTS 后多角修复;
- [ ] 最终跑 LEC、SI-STA、DRC/LVS、power/IR/EM;
- [ ] 每个签核角保留明确 margin,不靠 waiver 压线。
总结
这个案例的关键不是工具自动插了多少 buffer,而是先从 WNS≈一个周期、TNS 集中在 RAW bypass 判断出根因是控制链和数据链被错误地塞进一拍;盲目 upsizing 只换来面积、拥塞和 hold 问题,真正的收敛顺序是 RTL 预计算/打拍消除主因、retiming 与 floorplan 缩短物理路径、谨慎换 LVT 和受控 useful skew 处理尾部、在布线稳定后用最小延迟单元清快角 hold,最后把 LEC、SI-aware STA、DRC/LVS、功耗 IR/EM 全部回归——时序收敛永远是架构、约束、逻辑、物理和多角签核的联合问题,越靠后的 ECO 越只能修尾巴、越要为借到的余量付出代价。