STA 报告解读:slack、launch/capture 沿与 common path 悲观消除
更新时间:2026-09-06。本文是「集成电路大类 · 芯片设计」进阶层(intermediate)第十二篇新正文(#14)。上一篇 SDC 约束实战 让工具拿到了正确约束,这一篇教你读懂工具吐出的时序报告——收敛阶段 90% 的时间在做「读报告 → 定位瓶颈 → 改设计/约束 → 重跑」的循环。setup/hold 的物理概念入门层 STA 讲过,这里聚焦报告怎么读。修违例的具体手法见 时序收敛基本手法(#15)。
本文要回答的问题
- 一份 timing report 的各段都在说什么?
- slack 的正负号怎么算出来的?违例了先看哪里?
- CPPR 是什么,为什么时钟路径那段被「加回来」?
- setup 和 hold 违例的修法方向为什么相反?
一、报告头:这条路径是谁
Startpoint: u_alu/mul_rslt_reg[17] (rising-edge triggered flip-flop, clk_400)
Endpoint: u_alu/acc_reg[17] (rising-edge triggered flip-flop, clk_400)
Path Group: clk_400
Path Type: setup (max delay)- Startpoint:launch FF——发射数据的触发器;Endpoint:capture FF——捕获数据的触发器;
- Path Group:按捕获时钟分组(报告一般按组内最差 slack 排序,先修最差组);
- Path Type:setup(max,查路径太慢)或 hold(min,查路径太快)。
二、核心算式:两条时间线赛跑
报告主体是两个时间:数据到达时间(data arrival)与数据要求时间(data required):
数据到达(data arrival time)
0.000 × launch 时钟沿(如 0ns 上升沿)
+ 0.820 源端时钟网络延迟(clk pin → launch FF 的 CLK)
+ 0.040 launch FF 的 Tco(CLK→Q)
+ 2.310 组合逻辑延迟(逐级 cell + 网线,明细逐行列出)
= 3.170
数据要求(data required time)
2.500 × capture 时钟沿(setup 检查用下一个周期:0+2.5ns)
+ 0.850 目的端时钟网络延迟(clk pin → capture FF 的 CLK)
− 0.050 捕获 FF 的 setup time
− 0.300 clock uncertainty(jitter/余量)
= 3.000
slack = required − arrival = 3.000 − 3.170 = −0.170 (VIOLATED)要点:① setup 检查 launch 与 capture 用相邻两个周期沿(数据有整整一个周期赶路);hold 检查用同一个沿(数据不能快到侵占同一沿的 hold 窗口);② 明细表里逐级列出 cell delay 和 net delay——违例时找延迟最大的那几级,它们就是瓶颈(网表前期看 cell,布线后 net 往往占一半以上,呼应 物理实现);③ 同类路径先修 slack 最差的,−0.5 的比 −0.05 的优先。
三、CPPR:共同路径悲观消除
注意上面时钟延迟:launch 路径 0.820、capture 路径 0.850,前 0.7ns 其实是同一段时钟树(从 PLL 到两个 FF 分叉点之前)。STA 做 setup(max)时两边都按最慢角算、做 hold(min)时都按最快角算,同一段被用两个相反的极端值算了一遍,过于悲观。工具自动做 CPPR(Clock Path Pessimism Removal,也叫 CRPR):把共同路径上重复计算的差值加回 slack。报告里体现为 clock reconvergence pessimism 一行——看到它是正常的、是工具在帮你,不用修;但要知道它的存在,否则手工估算时会对不上工具的 slack。
四、四类路径
| 路径类型 | startpoint | endpoint | 约束来源 |
|---|---|---|---|
| reg → reg | FF | FF | create_clock(最常见,机器核心) |
| input → reg | 输入端口 | FF | set_input_delay(#13) |
| reg → output | FF | 输出端口 | set_output_delay |
| input → output | 输入端口 | 输出端口 | 两者(纯穿芯片路径) |
报告里 startpoint/endpoint 是端口而非 FF 的,就是 IO 路径——违例先查 IO delay 约束是否合理,再看边界逻辑。
五、setup vs hold:修法方向相反
- setup 违例(slack 负,max 角):数据到得太晚 → 让路径变快或给更多时间:插流水线寄存器切短组合逻辑、降扇出、换快 cell、调 floorplan 缩短网线,或降频/放宽约束(若规格允许);
- hold 违例(min 角):数据到得太早(比同一沿的 capture 还快,冲到上一个数据)→ 让路径变慢:在发送端插 delay buffer 拖时间。hold 修复不能靠降频(降频反而让 hold 窗口更宽松?——hold 与频率无关,只与同沿竞争有关,所以 hold 必须修,且通常在后端布线后用 delay cell 修)。
迭代顺序一般是:先收敛 setup(前端综合/后端布局反复迭代,手法见 #15),CTS 后时钟树定了再集中清 hold(插 buffer 不影响 setup 太多),多角多模(MCMM)同时签核。每次改完重看报告:违例路径是否换了一批(瓶颈转移)、最差 slack 收敛了多少。
相关与延伸
上一篇:SDC 约束实战。下一篇:时序收敛基本手法(#15)。入门铺垫:STA 概念、逻辑综合、物理实现;后端 CTS 与布线签核见进阶 #35/#36,ECO 修违例见 #39,门级 SDF 反标验证见 #47。
总结
STA 报告就是两条时间线:data arrival(launch 沿+时钟延迟+Tco+组合延迟)对 data required(capture 沿+时钟延迟−setup−uncertainty),slack=required−arrival,负值最差的路径先修、明细里延迟最大的级就是瓶颈;setup 用相邻沿查「太慢」(切逻辑/提频率余量)、hold 用同沿查「太快」(插 delay),CPPR 是工具自动消除共同时钟路径的双重悲观。