本节摘要:目标频率进工具的第一站是时钟定义。create_clock 只给出理想周期,真实的时钟沿还要叠加时钟树延迟、偏斜与不确定度三类修正。本节把这三类修正的物理来源与取值构成讲透——公式里每一个减项,从这节起都有出处。
某天深夜,一位工程师盯着违例报告问了一个直击要害的问题:约束里写的明明是 0.5ns 周期,为什么建立检查的可用时间不是 0.5ns,而是被扣掉了一截?那一截去了哪里?答案是三个地方:捕获沿可能迟到也可能早到(偏斜),时钟源本身有抖动(jitter),以及工程师自己预留的保守余量。这三项在工具里统一折算成"时钟不确定度"(clock uncertainty),它是纸面周期与实际可用窗口之间的差价。读懂这个差价,才算真正读懂时钟建模。
SDC 里定义时钟的最小集合是三条信息:名字、周期、波形。波形用两个沿的位置描述占空比,例如周期 0.5ns、上升沿在 0、下降沿在 0.25:
create_clock -name clk -period 0.5 -waveform {0 0.25} [get_ports clk_p] set_propagated_clock [all_clocks] ;# 布线后用真实时钟树传播 set_clock_uncertainty -setup 0.05 [get_clocks clk] set_clock_uncertainty -hold 0.03 [get_clocks clk]
这四行之间有一条重要的分界线:布局布线之前,时钟树还不存在,工具把时钟当成理想网络(ideal clock),所有触发器看到的时钟沿完全对齐,时钟网络延迟为零;布线完成后加上 set_propagated_clock,工具改用真实的时钟树延迟——每个触发器看到的沿不再对齐,偏差就是时钟偏斜(skew)。同一个设计在两个阶段的违例结论可以完全不同,这不是工具出问题,而是时钟模型换了个世界观。
时钟延迟(latency)与偏斜(skew)需要分清:latency 是时钟源到某个触发器时钟引脚的绝对延迟,skew 是两个触发器之间的 latency 之差。对建立检查有帮助的是"正偏斜"——捕获触发器的时钟来得比启动触发器晚,等于白送了一点时间;对保持检查恰恰相反,捕获沿晚到会让本拍数据更容易冲掉上一拍。所以偏斜是一把双刃剑,签核时不能指望它,只能约束它。
工程上 set_clock_uncertainty 的数值不是拍脑袋定的,它由三层来源叠加。第一层是时钟源抖动:锁相环输出的沿位置会在一个小窗口里漂移,先进工艺的 PLL 抖动典型在 20ps 上下,这一层是物理事实,躲不掉。第二层是偏斜预算:在时钟树综合之前(预 CTS 阶段),真实 skew 未知,只能先按目标扣一块——典型做法是在 setup 不确定度里含 20 到 50ps 的 skew 预算,CTS 完成后这一层可以回收。第三层是串扰与信号完整性的保守余量:时钟线受邻近信号干扰会引起沿位置微移,先进工艺给 10 到 20ps。

保持检查的不确定度符号与建立检查相反:建立是"可用时间被扣掉",保持是"要求被抬高"——数据必须在捕获沿之后继续稳定一段更长的时间。两本账各自设值(示例中 setup 50ps、hold 30ps),因为它们的物理来源并不对称:hold 侧通常不含 PLL 抖动的全额(同一沿的比较抵消了一部分),但含偏斜风险的全额。
还有两类时钟对象容易被忽略。一是虚拟时钟(virtual clock):输入输出延迟引用的参考时钟如果不在芯片内部(外部器件的时钟),要先用 create_clock 定义一个不挂任何引脚的虚拟时钟,端口延迟才有坐标系——漏定义虚拟时钟时,外部接口路径的检查关系会退化或悬空。二是时钟树上的"非时钟单元":时钟经过多路选择器或逻辑门时,若这些单元没有被生成时钟链覆盖,传播会在这里断线。1.3 的时钟族检查因此有一条朴素的验收法:从时钟源出发,沿着真实时钟树走一遍,每个分支都能走到某个触发器的 CLK 引脚——走不到的地方就是账本缺口。
片上时钟很少是单根直线。锁相环输出先分频,再经门控单元分发到各个子系统,子系统内部还有分频与门控。每一条衍生时钟都要用 create_generated_clock 显式声明,告诉工具它的源时钟、分频比与沿的对应关系。漏定义生成时钟是最常见的约束缺口之一——下游触发器因此处于无时钟约束状态,违例被静默吞掉,这正是 4.3 的 check_timing 要抓的头号问题。
另一个容易踩的坑是把不确定性当垃圾桶。有人为了"让时序好过一点"把不确定度设小,有人怕出事把它设成 100ps 以上。前者是把物理风险转嫁给了硅片,后者则会让后端为一个不存在的敌人消耗面积与功耗——每一皮秒的保守都会变成优化工具的额外工作量。合理姿势是让时钟部门、封装与签核团队共同给出分项预算,写进约束管理文档,约束里只体现总和。
留一道思考题作为本节的收束:如果一颗芯片的两个时钟域频率相同但来自不同的锁相环,它们之间的路径该按同步还是异步检查?答案在第四章的时钟组一节——先提示一句:频率相同从来不等于相位相关,把"同频"当成"同步"是跨域设计里最经典的认知陷阱,也是不少偶发性功能错误的最终根因。
至此,问题链第一站"卡在哪儿"的世界观齐备:路径是账本(1.2),时钟沿是标尺(1.3)。下一章把两道门槛的判定公式完整写出来,并用 0.5ns 周期的数字例子手算一遍——那是全册唯一必须动手的一节。