时钟特性约束(四)
时钟特性约束
文章目录
- 时钟特性约束
- 前言
- 1 提出背景:为什么“时钟”需要单独一节来讲约束?
- 2 基本概念速览
- 3 约束语法与工程用法
- 3.1 时钟不确定度——“买保险”
- 3.2 时钟延迟——“把路程写清楚”
- 4 进阶扩展:四个常被忽略的细节
- 5 小结:记住“3+1”原则
前言
1 提出背景:为什么“时钟”需要单独一节来讲约束?
- 在同步数字电路里,只有时钟是“时间基准”。数据信号只要满足建立/保持时间即可,而时钟信号的任何畸变都会“放大”到整个芯片。
- 先进工艺(≤28 nm)+ 高频(≥500 MHz)+ 低电压(≤0.8 V)使得“ps 级误差”就能让硅片变成“硅砖”。
- 芯片失败成本指数级上升:一次 mask 费用几百万美元,流片失败比多写几行约束昂贵得多。
- 因此,**“把时钟的不确定性提前算清楚”**成为数字后端工程师的刚需,而不是可选项。
2 基本概念速览
名词 | 物理含义 | 量级(28 nm 典型) | 备注 |
---|---|---|---|
Jitter | 时钟周期-周期边沿的随机漂移 | 30–80 ps RMS | 源于 PLL、电源噪声、热噪声 |
Skew | 同一时钟到达不同触发器的系统偏差 | 50–200 ps | 源于 CTS、线长、负载差异 |
Latency | 从时钟源端口到寄存器 CLK pin 的绝对延时 | 1–4 ns | 分为 source + network |
Uncertainty | 人为追加的“保险丝”裕量 | 0–500 ps | 用 set_clock_uncertainty 显式加 |
一句话:Jitter 是“自己抖”,Skew 是“兄弟姐妹不齐”,Latency 是“路上堵车”,Uncertainty 是“再留条活路”。
3 约束语法与工程用法
3.1 时钟不确定度——“买保险”
# 在 sys_clk 域内所有路径追加 500 ps 裕量
set_clock_uncertainty -from sys_clk -to sys_clk 0.5# 跨时钟域再多留 1 ns
set_clock_uncertainty -from clk_a -to clk_b 1.0
- 选项
-setup
/-hold
可分别控制建立/保持侧裕量;缺省同时生效。 - 为什么“过度优化”反而安全?
– 后期 ECO 阶段若发现某条路径因串扰或 IR-drop 突然违规,可直接提高 uncertainty 重新跑 STA,无需动时钟树结构,风险最小。
3.2 时钟延迟——“把路程写清楚”
# 主时钟进入芯片管脚后的片外/片内延迟
set_clock_latency -max 1.0 -source [get_ports I_clk_p]
set_clock_latency -min 0.5 -source [get_ports I_clk_p]# 寄存器时钟引脚的网络延迟(CTS 后)
set_clock_latency -max 3.0 -network [get_pins data_reg0_reg[0]/C]
set_clock_latency -min 2.0 -network [get_pins data_reg0_reg[0]/C]
-source
告诉工具“时钟进来前已经走了多久”,常用于板级/封装延迟反标。-network
在 CTS 前是“估计”,CTS 后会被实际延迟取代;若仍显式写出,可作为“强制下限”防止工具过度优化。
4 进阶扩展:四个常被忽略的细节
-
OCV/AOCV/POCV
传统“flat uncertainty”一刀切太悲观;先进节点使用 On-Chip Variation 模型,按距离、电压、温度随机变量分配更真实裕量。set_timing_derate -early 0.9 -late 1.1 [get_clocks sys_clk]
-
Clock Reconvergence Pessimism (CRPR)
两条分支最终汇合到同一触发器,原本各自算最大/最小延迟会“重复计算”悲观值;工具需自动剪掉这部分悲观(或手动set_analysis_config -enable_crpr
)。 -
Uncertainty ≠ Jitter + Skew
工具默认把 jitter 算进clock_uncertainty
,但 skew 由 CTS 实际网络决定;不要简单把测量到的 jitter 和 skew 相加就填进去,否则双重计数。 -
DFT 模式额外裕量
扫描移位频率低,但 chain 上缓冲器多,串扰大;可单独加 uncertainty:set_clock_uncertainty -from clk_scan -to clk_scan 0.8
项目 | ASIC/SoC | FPGA |
---|---|---|
时钟源 | 片外 PLL + 自己设计 | 片内 ** hardened PLL/MMCM**,数据手册直接给 RMS jitter < 50 ps |
时钟树 | 后端自己绕,skew 100 ps 算优秀 | 全域 Global Clock Network 是硅片级树+铜柱,skew 规格 50 ps 以内 |
不确定性 | 需要工程师逐条估算 | 器件厂商在 Timing Model 里打包好了,叫 “Component Uncertainty” |
5 小结:记住“3+1”原则
步骤 | 目标 | 命令 |
---|---|---|
定义 | 让工具认识时钟 | create_clock |
留裕 | 覆盖 jitter+额外悲观 | set_clock_uncertainty |
标延迟 | 反标板级/封装/网络 | set_clock_latency |
验因果 | 确认悲观/乐观源 | 报告 clock_timing + timing_derate |
写约束的本质是**“把物理世界的不完美提前翻译成工具能懂的悲观值”**,而不是“让工具自己猜”。
时钟约束越早写、越写实,后端就越少熬夜, silicon 就越不容易变 “brick”。