速查手册
面试前扫一眼,或者做题时对照。所有公式与结论都与课程、题库保持一致。
① 核心公式
② 方向速记(最容易记反的地方)
| Setup | Hold | |
|---|---|---|
| 怕什么 | 数据到得太晚 | 数据到得太早 |
| 用哪条路径延迟 | Tcomb_max | Tcomb_min |
| 工艺角 | ss(慢)+ 低电压 | ff(快)+ 高电压 |
| 受 Tclk 影响 | 是 | 否 |
| derate 方向 | data late ×1.1,clock early ×0.9 | data early ×0.9,clock late ×1.1 |
| uncertainty 含 jitter | 含 | 同域 hold 不含(jitter 抵消) |
| 何时修 | CTS 之前 | CTS 之后、布线之后才算数 |
| 怎么修 | 让数据更快 | 让数据更慢 |
① 降频能修 setup,完全不能修 hold。
② 在数据路径上加延迟 → setup 变差、hold 变好(永远相反)。
③ useful skew 修 setup 是延后 capture 时钟;修 hold 是延后 launch 时钟。
③ Clock Uncertainty 组成
| 阶段 | Setup | Hold |
|---|---|---|
| pre-CTS | jitter + margin + skew | margin + skew |
| post-CTS | jitter + margin | margin(很多流程设为 0) |
典型值:pre-CTS setup ≈ 0.1–0.2 ns;post-CTS 可降至 0.05–0.1 ns。margin 是流程选择,不是物理量。
CTS 后必须把 uncertainty 调小,否则白白浪费裕量。
④ 时序约束优先级(高 → 低)
set_multicycle_path N -setup 必须配 set_multicycle_path (N−1) -hold。
只设 setup 会让 hold 检查被意外推到第 N 个沿,要求数据保持 N 个周期 → 大量莫名其妙的 hold 违例。
⑤ CTS 检查清单
CTS 之前(六项)
- 布局完成且合法
- 电源地已预布线(PG pre-routed)
- 预估拥塞可接受
- 预估时序可接受(setup)
- 无 max transition / cap 违例
- 高扇出网络(HFNS)已处理
CTS 之后(五项)
- Skew report
- Clock tree report(级数、buffer 数、latency)
- Timing report(setup / hold)
- Power & area
- 时钟树自身 DRC
最小化 skew、最小化 insertion delay、最小化 功耗。 三者是 trade-off 关系,不可能同时最优。答题时一定要补上这一句。
⑥ 平衡点:把某棵子树整体做长 / 做短
平衡点是一份契约:从我往下的所有叶子必须互相配平,
但我这一整棵子树相对上一级可以整体偏移。
组内严格对齐,组间允许错开——这正是 useful skew 要的效果。
-balance_points 是复数,给的是 sink 引脚本身。
不同工具/版本对 -delay 的符号方向与单位约定不同,必须实测确认,不要照抄。| 参数 | 作用 | 注意 |
|---|---|---|
-balance_points | 哪些节点成为平衡点 | 复数,可一次给多个;给 sink 引脚(如 .../U_MEM/CLK) |
-delay | 延迟偏移 —— 产生 useful skew 的旋钮 | 带符号;方向(负=提前还是推迟)各工具不同,必须实测确认 |
-scenarios | 限定在指定 scenario 生效 | 复数;setup 与 hold 方向相反,必须分开设 |
① 先跑一次不带 -delay 的 CTS,用 report_clock_timing -type latency 记录这组 sink 的插入延迟;
② 加一个很小的 -delay(如 0.05)重跑,再看同一个 sink 的插入延迟;
③ 看它变大还是变小,就确定了符号方向。之后再用它去修真正的问题。
| 这组 sink 的角色 | 违例类型 | 该让它… |
|---|---|---|
| capture 端 | setup | 更晚到(capture 晚到 → Tskew ↑) |
| launch 端 | hold | 更晚到(数据晚出发) |
| capture 端 | hold | 更早到(或把对端做晚) |
| launch 端 | setup | 更早到(或把对端做晚) |
前两行都要"更晚到",后两行都要"更早到"。
本质就一句:让数据相对时钟更宽裕——救 setup 是给数据更多时间,救 hold 是让数据别太早。
① "更早到"比"更晚到"难:时钟延迟有物理下限,所以实践中"做短"常靠"把对端做晚"等效实现。
② 平衡点必须选公共祖先:选低了会漏掉兄弟节点,组内配平被破坏,反而制造新 skew。
③ 必须按 scenario 分开设:setup 与 hold 方向相反,不写 -scenarios 会同时作用于所有 corner,自相矛盾。
④ 幅度要克制:故意加的 skew 会被 OCV derate 放大(derate 作用于独有段),
单点通常 100–150 ps 以内,且必须 MCMM 多 corner 验证实际达成的量。
物理上只有一棵时钟树,不可能对同一 sink 呈现不同延迟。工具是在做多目标折中:
找一棵物理上唯一的树,使所有 scenario 的加权代价之和最优。
所以不要指望"setup +0.15、hold −0.08"能精确实现——设值要留余量,
并且必须在所有 signoff corner 上核对实际达成的 skew,而不是假定它按你写的值实现了。
⑦ set_clock_tree_options 选项分类
| 类别 | 管什么 | 代表性选项 |
|---|---|---|
| ① 偏斜 / 延迟目标 | 树长成什么样 | -target_skew、-max_insertion_delay、-global_skew、-local_skew |
| ② 单元选择 | 允许用哪些 buffer/inverter | -buffer_list、-inverter_list、-cell_list |
| ③ 走线规则 | 时钟线的物理规格 | -ndr_rule、shielding 相关 |
| ④ 结构控制 | 树的形状与规模 | -level、-max_fanout、聚类/平衡相关 |
它是成本旋钮,不是"越紧越好":每收紧一点都要用缓冲器级数、面积、功耗和插入延迟来换。
实用起点:周期的 2%–5%。例:周期 2 ns(500 MHz)→ 从 0.05–0.08 ns 起步,
跑一轮看实际达成的 skew 分布和功耗,再决定收紧还是放松。
常见误用:CTS 不收敛时继续收紧目标。应该先查驱动梯度和floorplan 是否太散。
⑧ 术语中英对照
| 中文 | 英文 | 一句话 |
|---|---|---|
| 建立时间 | Setup Time | 时钟沿前数据需稳定的时间 |
| 保持时间 | Hold Time | 时钟沿后数据需稳定的时间 |
| 恢复时间 | Recovery Time | 异步复位释放相对时钟沿的要求(类比 setup) |
| 移除时间 | Removal Time | 异步复位释放后的保持要求(类比 hold) |
| 时钟偏斜 | Clock Skew | 两点到达时间之差(相对量) |
| 时钟延迟 | Clock Latency | 单点的绝对到达时间 |
| 源延迟 | Source Latency | 时钟源 → 时钟定义点 |
| 网络延迟 | Network Latency | 定义点 → 触发器时钟端(= 时钟树延迟) |
| 插入延迟 | Insertion Delay | 时钟树本身引入的延迟 |
| 抖动 | Jitter | 同一位置每个周期边沿位置的漂移 |
| 不确定性 | Uncertainty | jitter + margin(+ skew,CTS 前) |
| 有用偏斜 | Useful Skew | 故意制造 skew 搬运裕量(可修 setup 和 hold) |
| 时间借用 | Time Borrowing | 靠 latch 透明窗口借下一个周期的时间 |
| 片上变异 | OCV | 同芯片不同位置的延迟差异 |
| 先进 OCV | AOCV | derate 随级数/距离变化(查表) |
| 参数化 OCV | POCV / SOCV | 延迟建模为分布,按 ±3σ 计算,σ 用 RSS 合成 |
| 共同路径悲观消除 | CRPR / CPPR | 把共同段被重复降额的悲观度加回来 |
| 伪路径 | False Path | 结构存在但功能上无法敏化的路径 |
| 多周期路径 | Multicycle Path | 放宽到 N 个周期(setup N 配 hold N−1) |
| 串扰 | Crosstalk | 耦合电容导致延迟偏移(delta delay)或毛刺(glitch) |
| 非默认规则 | NDR | 加宽/加间距/屏蔽,降低 EM 和 SI 风险 |
| 多角多模 | MCMM | 多工艺角 × 多工作模式的分析矩阵 |
| 时钟门控 | Clock Gating | 用 ICG 关掉空闲模块的时钟翻转省动态功耗 |
| 亚稳态 | Metastability | 采样窗口内数据变化导致的中间不确定态 |
| 平均无故障时间 | MTBF | 衡量同步器可靠性的指标 |
| 最差负裕量 | WNS | 最差路径差多少 |
| 总负裕量 | TNS | 所有违例路径 slack 之和 |
| 工程变更 | ECO | 后期小范围修改(metal-only 成本最低) |
⑨ 高频易错点(网上流传的错误说法)
- "false path 和功能无关" → 错。恰恰相反,false path 的本质就是功能上不可能被敏化(或被有意排除的异步 CDC)。
- "useful skew 只能修 setup" → 错。延后 capture 时钟利于 setup,延后 launch 时钟利于 hold。
- "降频可以修 setup 违例" → 这是改规格,不是 PD 修复手段。产品性能降级不叫修复。
- "插 buffer 一定能改善 setup" → 有条件。只有省下的线延迟 > 新增的 cell 延迟时才有效,且应靠近 capture 端。
- "clock buffer 的 rise/fall time 完全相同" → 不准确。被设计成对称的是 rise/fall delay(保证占空比),transition time 仍可能不同。
- "7 层金属时钟固定走 M4/M5" → 是 PDK/层栈/floorplan 相关的。只有"电源走顶层金属"比较通用。
- "zero skew 不可能因为路径长度不同" → 理由站不住。H-tree 可以把长度做等;做不到是因为 OCV/PVT/负载与噪声不匹配。
- "clock gating 是修剪 clock tree" → 不准确。它不改变树的拓扑,只是关闭空闲模块的时钟翻转。
- "SDC 包含功耗约束" → 错。功耗意图属于 UPF/CPF;SDC 管 timing / DRC / area / 例外。
⑩ 延伸阅读
- OpenSTA — 开源 STA 引擎,命令与报告格式参考价值高
- VLSIDA/chip-tutorials — STA / 约束 / 报告 / 多角分析实操教程
- OpenROAD — 开源 RTL-to-GDS 流程,含 TritonCTS
- OpenSTA 命令手册 (PDF)
做题卡住时对照 ①②;面试前扫 ②④⑦。真正的理解来自课程里的推导过程—— 手册只负责在你已经懂了之后帮你快速回忆。