综合约束工程:让 SDC 既不欠约束、也不过约束(C2)
SDC 的字段语法在 F4 SDC 生命周期,设计侧概念在 SDC 约束实战;本篇讲综合这一站把约束写对、管好的工程纪律。综合是约束第一次被工具真实优化执行的地方——RTL 仿真里 SDC 根本不参与,写错了要到综合才暴露。综合实操见 C1。
一、约束在综合里扮演什么角色
综合器本质上是在「满足约束的前提下最小化面积/功耗」。约束就是它的优化目标和边界条件:时钟周期决定每条路径能花多少级逻辑,IO 延迟决定边界预算,例外告诉它哪些路径不该按单周期同步路径去优化。
约束过松(欠约束)→ 工具不优化那条路径 → 时序轻松「全绿」但后端大面积违例
约束过紧(过约束)→ 工具拼命插 buffer/放大 cell → 面积功耗暴涨、hold 更难收
约束错误(错例外)→ 直接放弃优化真实关键路径 → 绿色是假的所以约束工程的目标不是「让报告变绿」,而是让约束精确描述芯片真实的时序意图。

二、时钟:先把时间基准钉准
| 命令 | 用途 | 坑 |
|---|---|---|
create_clock | 定义主时钟周期/波形/名称 | 时钟名要与后端、CTS 一致;一个端口只定义一次 |
create_generated_clock | 分频/倍频/MUX 后派生时钟 | 不要用虚拟时钟糊弄,否则 CTS 与 CDC 对不上源 |
set_clock_uncertainty | 抖动 + 余量(setup/hold 分设) | 把不确定度当「万能裕量」猛加 = 过约束 |
set_clock_latency | 综合前预估延迟(CTS 后改 propagated) | 忘了 CTS 后切换会造成前后端口径不一致 |
set_propagated_clock | 用真实时钟树延迟 | 后端必做,见 D3 CTS |
时钟不确定度应来自抖动数据 + 签核降额(OCV/POCV)的合理拆分,而不是拍脑袋加一大截让工具「多努力点」。
三、IO 预算:芯片边界的时间怎么切
外部路径不在本芯片内,工具看不到,必须用预算告诉它「进来的数据已经在路上走了多久、出去的数据还剩多少时间」:
set_input_delay -clock clk <t> [all_inputs]:数据相对捕获时钟在端口处已经消耗的时间(含上游触发器到本端口、板级/封装延迟)。set_output_delay -clock clk <t> [all_outputs]:本端口到下游触发器还需要预留的时间。- 配套
set_driving_cell/set_input_transition(输入端驱动强度)与set_load(输出端容性负载),否则工具按理想零阻抗/零负载估,IO 时序全是虚的。
预算来源应是与上下游芯片/封装/板级共同冻结的接口时序预算表,不能综合工程师一个人填。多周期才握手一次的接口,配合下面的例外,而不是无脑按最快周期约束。
四、时序例外:权力越大,纪律越严
false path / multicycle 是「命令工具不要按默认单周期同步关系去优化」,一旦写错就是把真实路径主动免检,危害比单纯不约束更大。
| 例外 | 正确用途 | 红旗(多半写错) |
|---|---|---|
set_false_path | 真正永不被同时采样的路径(静态配置、复位、跨已同步域的特殊线) | 为了「消红」整组 -to [all_registers] 一刀切掉 |
set_multicycle_path | 数据确实隔 N 个周期才被用(使能信号、慢配置接口) | setup 放宽了却不设对应 hold,hold 反而爆炸 |
set_disable_timing | 屏蔽某单元内部弧(如伪路径 MUX) | 滥用会破坏时序图连通性,后端难查 |
纪律三条:① 每条例外在评审表里写明「为什么这条路径不需要单周期」,能指向 RTL/协议证据;② 尽量用 set_max_delay 等带数值约束替代纯 false path,至少留个上界;③ 综合与后端共用同一份受控的例外清单,不允许在综合脚本里私藏一份(版本基线见 F10 PDK/版本)。
五、综合到后端:一份黄金 SDC 的演化
综合 SDC 不是写完即弃,它要一路交接,但每站增补而非另起炉灶:
- 综合:用理想时钟 + 预估 latency/uncertainty,IO 用预算;
- 布局布线:同一份 SDC,补充物理约束;CTS 后把 latency 切成
set_propagated_clock,uncertainty 换成签核降额; - 签核 STA:在黄金 SDC 上加 OCV/AOCV/POCV、SI/串扰(见 E2 MMMC、E1 黄金 STA)。
每一站都要跑 report_constraint 完备性检查:是否存在无时钟驱动的寄存器(no_clock)、未约束端口(unconstrained_internal_endpoints)、失效例外(被更早规则覆盖的死例外)、不可达路径。「零违例」必须配上「零未约束」才有意义——这与 C3 读 QoR 的第一原则一致。
相关与延伸
总结
综合约束工程的本质是让 SDC 精确等于芯片真实时序意图:时钟用 generated_clock 与来自抖动/降额的合理 uncertainty 钉死基准,IO 用上下游冻结的 delay/driving/load 预算给边界,false path/multicycle 必须带证据评审、优先用带数值约束并在综合到后端共用一份黄金 SDC;每站增补而非重写、CTS 后切 propagated、签核加 OCV,并坚持「零违例必须和零未约束同时成立」——绿色只有在约束完备时才可信。