← Back
2026-05-13-clock_tree_hold_violation
2026-05-13
这是一个非常典型的先进工艺下时钟树保持时间违例案例。你提供的背景、现象、Root
Cause和Debug过程已经非常详实。接下来,我将基于你的分析,提供一个工程化的修复策略与实施步骤,重点解决“时钟偏斜过大”和“局部负载不均”这两个核心问题。
工程化修复策略
针对你总结的三大Root
Cause(时钟树深度不均衡、局部负载差异、工艺角效应),修复策略应遵循
“先平衡时钟树,后插入延迟单元”
的原则,以最小化面积和功耗代价。
1. 时钟树结构优化(核心手段)
目标:将违例路径的时钟偏斜从55-78ps降低至目标值30ps以下。
- 操作1:调整缓冲器级数与位置
- 在捕获时钟路径(当前仅2级buffer)上插入1-2级延迟缓冲器(如CLKINV或CLKBUF),使其级数与启动路径(4级)匹配。
- 注意:插入位置应靠近时钟树分支点,而非直接加在寄存器时钟端,以避免引入新的不平衡。
- 操作2:平衡扇出
- 将违例区域(扇出128)的时钟树分支进行复制(cloning)。例如,将一个大扇出缓冲器拆分为两个扇出64的缓冲器,分别驱动不同子区域。
- 使用命令(Innovus):
clockDesign -specifyClockTree <clk_name> -balanceFanout
或手动调整 setCTFanoutLimit。
- 操作3:利用有用偏斜(useful skew)
- 对于启动路径(launch
path)延迟较小的路径,可以主动增加启动时钟的延迟(而非减少捕获时钟延迟),使两者对齐。
- 方法:在启动时钟路径上插入延迟单元(如DCLK或可编程延迟单元),但需确保不破坏其他路径的setup时序。
2. 局部延迟插入(针对剩余违例)
经过时钟树优化后,若仍有少量违例(如WNS -0.02ps ~
-0.05ps),采用最小面积延迟单元修复。
- 选择延迟单元:
- 优先使用高驱动强度、低泄漏的延迟缓冲器(如
delay_cell_1x 或 CLK_DLY)。
- 避免使用标准反相器链,因其延迟不稳定且面积大。
- 插入策略:
- 仅插入数据路径:在违例路径的数据端(如
reg_out_reg[0]/Q 到 reg_out_reg[1]/D
之间)插入延迟单元。
- 位置选择:靠近捕获寄存器(endpoint)的D端,以减少对其他路径的影响。
- 批量修复:使用工具自动修复(如PrimeTime的
fix_hold_violations),设置
-max_buffer_levels 2 避免过度插入。
3.
跨时钟域与低功耗单元专项处理
- 跨时钟域同步器:
- 在同步器输出路径上插入两级延迟缓冲器,确保数据在异步时钟域间有足够保持时间。
- 考虑使用双锁存器(dual-latch)
结构替代部分同步器,以容忍更大时钟偏斜。
- 低功耗隔离单元(ISO):
- 在ISO单元输出端增加延迟缓冲器,或更换为带延迟特性的ISO单元(如
ISO_DLY)。
- 检查ISO控制信号(enable)的时钟域是否