4. 传统OCV降额方法
在进入统计时序分析(SSTA)之前,PrimeTime 处理片上偏差(OCV)的主流手段是“降额”(derating)。它的核心思想非常朴素:既然同一芯片上不同位置的晶体管、互连和时钟路径实际速度存在随机差异,那么就在确定性的时序计算上人为加一层悲观余量,让 setup 检查更保守、hold 检查也更保守。传统 OCV 降额主要落在三个对象上:数据/时钟路径延迟的 derate、clock uncertainty 和 clock latency。理解这三者的作用位置和相互关系,是正确设置 OCV 约束的前提。
一、derate:对路径延迟直接加权
derate 是 PrimeTime 中最直接的 OCV 建模方式,通过 set_timing_derate 命令对单元延迟和线延迟施加缩放因子。它的基本语义是:对某类路径、某个方向、某类延迟,乘以一个大于 1 或小于 1 的系数。大于 1 表示“变慢”,用于 setup 的悲观化;小于 1 表示“变快”,用于 hold 的悲观化。
# 对数据路径单元延迟施加晚路径降额(setup 悲观)
set_timing_derate -late -cell_delay 1.10
# 对数据路径单元延迟施加早路径降额(hold 悲观)
set_timing_derate -early -cell_delay 0.90
# 对时钟网络单独设置,通常比数据路径更紧
set_timing_derate -late -cell_delay -clock 1.15
set_timing_derate -early -cell_delay -clock 0.85
# 对互连线延迟降额
set_timing_derate -late -net_delay 1.05
set_timing_derate -early -net_delay 0.95
这里的关键在于“late/early”与“setup/hold”的对应关系。做 setup 检查时,我们希望数据尽量晚到、捕获时钟尽量早到,因此对数据路径用 late derate(放大延迟),对捕获时钟路径用 early derate(缩小延迟)。做 hold 检查时方向相反:数据要尽量早到,捕获时钟要尽量晚到。PrimeTime 会根据检查类型自动选取 late 或 early 值,但前提是 derate 的作用对象(cell、net、clock、data)设置正确。
derate 的局限也很明显。第一,它是全局或按对象类别施加的,无法区分同一类别内不同路径的实际敏感度;第二,它把随机偏差和系统性偏差混在一起,用同一个系数覆盖,容易在某些路径上过度悲观、在另一些路径上又不够悲观;第三,derate 不区分路径的物理距离和共同路径,AOCV/POCV 正是为弥补这一点而出现。因此传统 derate 更适合作为早期阶段或保守兜底手段。
二、clock uncertainty:为时钟抖动与偏差留余量
clock uncertainty 在 PrimeTime 中通过 set_clock_uncertainty 设置,它并不改变时钟路径的实际延迟,而是在时序检查的公共点上增加一个不确定量。它通常覆盖两类来源:时钟源抖动(jitter)和时钟网络偏差(skew 中未被显式建模的部分)。
# 对某时钟域统一设置不确定量
set_clock_uncertainty 0.12 [get_clocks CLK_MAIN]
# 分别设置 setup 与 hold 的不确定量
set_clock_uncertainty -setup 0.15 [get_clocks CLK_MAIN]
set_clock_uncertainty -hold 0.08 [get_clocks CLK_MAIN]
# 对跨时钟域接口单独设置
set_clock_uncertainty -from [get_clocks CLK_A] -to [get_clocks CLK_B] 0.20
clock uncertainty 的用法要点是:它作用在时钟到达时间的比较上,setup 检查中会从数据要求时间中扣除,hold 检查中会加到数据要求时间上,从而同时收紧两个方向的余量。它适合表达“无法用 derate 精确描述”的抖动和残余偏差,但它的局限在于粒度较粗——通常按时钟域或时钟对设置,无法反映具体路径的物理位置差异。若把本应由 derate 或 AOCV 表达的偏差也塞进 uncertainty,会导致约束含义混乱,后续难以定位悲观来源。
三、clock latency:区分源延迟与网络延迟
clock latency 描述时钟信号从源点到寄存器时钟引脚所经历的延迟,分为 source latency(从时钟源到芯片时钟输入端口)和 network latency(从端口到寄存器时钟引脚)。在 PrimeTime 中通过 set_clock_latency 设置。
# 源延迟:时钟源到芯片端口
set_clock_latency -source 1.20 [get_clocks CLK_MAIN]
# 网络延迟:端口到寄存器时钟引脚(在时钟树综合前估算)
set_clock_latency 0.35 [get_clocks CLK_MAIN]
# 分别设置早/晚网络延迟,体现时钟路径偏差
set_clock_latency -early 0.30 [get_clocks CLK_MAIN]
set_clock_latency -late 0.40 [get_clocks CLK_MAIN]
clock latency 与 OCV 的关系在于:在时钟树综合(CTS)之前,网络延迟是估算值,此时用 early/late 两个值之间的差来近似时钟偏差;CTS 之后,实际时钟树已经存在,network latency 应尽量由真实传播延迟取代,只保留 source latency 和必要的 uncertainty。若 CTS 后仍保留较大的 network latency 估算值,会与真实时钟树延迟叠加,造成双重悲观。这是传统 OCV 流程中非常常见的错误来源。
四、三者的协同与常见误区
把三者放在同一条时序路径上看,它们的作用位置并不相同。derate 直接缩放数据路径和时钟路径的延迟;clock uncertainty 在时序检查的公共点上加减一个量;clock latency 则决定时钟到达时间的基准值。一个典型的 setup 检查中,数据要求时间大致由“捕获时钟 latency + 时钟路径 derate + uncertainty”共同决定,而数据到达时间由“发射时钟 latency + 数据路径 derate”决定。三者叠加时,必须避免同一偏差被重复计入。
常见误区有三个。其一,在 CTS 后仍然保留较大的 network latency 估算值,同时又用 derate 对时钟路径降额,导致时钟偏差被计算两次。其二,把本应由 derate 表达的单元延迟偏差写进 clock uncertainty,使 uncertainty 数值虚高,掩盖了真正的偏差来源。其三,对 setup 和 hold 使用相同的 derate 方向,例如 hold 检查时仍对数据路径用 late derate,结果 hold 余量被人为放大,漏掉真实违例。
set_clock_latency 与 set_timing_derate -clock 的设置,避免双重悲观。
五、设置顺序与检查方法
在 PrimeTime 中设置传统 OCV 约束,建议按以下顺序进行,便于逐层定位悲观来源:
- 先设置 clock latency(source 与 network),建立时钟到达时间基准。
- 再设置 clock uncertainty,覆盖 jitter 和残余 skew。
- 最后设置 derate,分别针对 cell_delay、net_delay、clock 路径,并区分 late/early。
- 用
report_timing查看路径上各段延迟与 derate 的实际作用,确认没有重复计入。 - 用
report_clock_timing -type latency检查时钟 latency 与 uncertainty 的汇总值。
检查时重点关注:setup 路径中数据路径是否用了 late derate、捕获时钟是否用了 early derate;hold 路径方向是否相反;clock uncertainty 是否被同时用于 setup 和 hold 且数值合理;CTS 后 network latency 是否已收敛到真实值附近。只有这三类约束各司其职、不重叠,传统 OCV 降额才能在保守与准确之间取得可接受的平衡,也才能为后续引入 AOCV、POCV 和 SSTA 打下清晰的对比基础。