时钟设定预算
每一颗同步芯片都随着一个时钟前进——一个方波,比方说每秒跳动十亿次。把每个有效边沿想成发令枪和截止线合二为一:在一个边沿上,你的触发器把新数据发射到线上;到了紧接着的下一个边沿,下游的触发器就抓取已经到达的东西。逻辑需要做的每一件事——它经过的每一个门——都必须在一个时钟周期之内完成。那个窗口就是你的全部预算。
所以时钟周期设定了上限。一个 1 GHz 的时钟给你每一级1 纳秒的预算——也就是 1000 皮秒。想跑得更快?把周期缩短。但你没法把它缩到比你那一堆最慢的逻辑真正需要稳定下来的时间还短。时钟只能快到你最慢的那条路径所允许的程度。这种张力——把时钟往上推,但不能越过逻辑能完成的极限——就是整个时序游戏的核心。
关键路径
想象数据从一个寄存器流向下一个,穿过一丛组合逻辑——加法器、多路复用器、一摞摞逻辑门。每个门翻转要花几皮秒,每根线充电也要花时间。把从发射触发器到捕获触发器这一条路上的延迟全加起来,你就得到了那条路径的总传播时间。你的设计里可以有数以百万计的这种路径。
关键路径就是最慢的那一条——裕量最差(最负)的路径,也就是相对于发射触发器与捕获触发器之间可用时间而言延迟最长的那一条。它之所以要紧,是因为它独自决定了你的速度上限:时钟周期至少得和那条路径所需的一样长,否则数据还没到,下一拍就来捕获了。芯片只能和它最慢的那条路径一样快——就像一支车队只能以它最慢那辆卡车的速度行进。
// Long combinational chain between two registers = a candidate critical path always @(posedge clk) begin sum_q <= a + b + c + d; // the adder tree here must settle within ONE period end
规模化的建立/保持 → STA
触发器对数据*什么时候*到达很挑剔。数据必须在捕获时钟边沿之前稳定那么一小段时间——这就是建立要求——并在边沿之后也保持稳定一小段时间——这就是保持要求。错过建立,数据到得太晚,没法被可靠地捕获;错过保持,数据在边沿之后变得太早,触发器还没来得及安全锁存旧的值。无论哪种,捕获到的位都不可靠——它可能陷入亚稳态。(完整图景见建立与保持时间。)
现在把这件事乘上数百万个触发器、数百万条路径。你根本不可能靠跑仿真来抓出每一个违例——你得在每一时刻喂进每一种输入组合,那是毫无希望地不切实际。这正是静态时序分析,也就是 STA,改变局面的地方。
STA 校验时序完全不需要任何激励。它不运行你的设计;它构建一张涵盖每一条触发器到触发器路径的图,把每条路上的门延迟和线延迟加起来,再拿这个总和去对照目的端的建立和保持要求。没有测试向量,没有波形——只是在这张延迟图上做算术。正因为它是穷举的数学而不是抽样的仿真,STA 校验每一条路径,每一次都校验,绝不会因为你忘了测某一条而漏掉它。(建立按慢角校验,保持按快角校验——工艺角稍后再说。)
裕量:非过即败
STA 是这样把每条路径化成一个判决的。对一次建立检查,它算两个数:到达时间(信号实际出现在捕获触发器的时刻)和要求时间(它*被允许*出现、同时仍满足建立的最晚时刻)。两者之差就是这条路径的裕量:
裕量 = 要求 − 到达 正裕量意味着信号到达时还有富余——通过,而那个数告诉你你有多少余量。零裕量意味着它正好压在截止线上——刚刚好满足。负裕量意味着它到得太晚——失败。−50 ps 的裕量是说这条路径超出预算 50 皮秒;芯片在这个时钟速度下跑不可靠。整个设计里最差(最小)的那个裕量叫 WNS——最差负裕量——它就是那个让你一眼看出自己过没过的数。(保持检查用的是同一个裕量思路,只不过那里*太快*到达才是危险,所以算式翻转:保持裕量 = 到达 − 要求。)
现在我们可以勾勒出速度上限了。把建立预算拆成它的各个部分,你能跑的最快时钟大致是:
f_max = 1 / (t_clk-to-q + t_logic + t_setup - t_skew)
时钟偏斜与真正的预算
到目前为止,我们一直假装时钟边沿在完全相同的瞬间打到每一个触发器。它并不会。时钟在芯片上沿着真实的导线、穿过真实的缓冲器传播,所以它到达某些触发器要早那么一丁点,到达另一些则晚那么一丁点。发射触发器的时钟与捕获触发器的时钟之间这个到达时间的差,就是时钟偏斜——也就是上面公式里的 `t_skew` 项。
偏斜是把双刃剑。如果捕获时钟相对发射时钟晚到,它会慷慨地给你的数据一点额外的到达时间——偏斜帮了你的建立检查。但同样这个迟到的捕获边沿会从你的保持余量里偷走一块,因为现在新数据有更长的时间冲向一个还没锁存的触发器。救了建立的偏斜可能毁掉保持——这也是为什么保持违例有时更难缠:把时钟放慢解决不了它们,因为保持是一场同一边沿上的竞赛,跟时钟周期无关。
收敛时序
「收敛时序」是从业者对那场苦工的说法:把每一条路径的裕量都赶到零或为正——任何地方都没有负裕量,建立和保持都干干净净,跨越所有工作工艺角(高温、低温、快硅、慢硅,以及电压的极端)。在时序收敛之前,这个设计不应该流片;一颗通不过时序的芯片,就是一颗有可能在高速下算出错误答案的芯片。
- 跑 STA,找出最差负裕量(WNS)——失败得最厉害的那条路径。
- 攻击那条关键路径:简化逻辑、换上更快的标准单元、调整门的尺寸,或加缓冲器去驱动长线。
- 如果逻辑确实塞不进一个周期,就把它拆到更多流水线级里,让每一跳少干一点活。
- 再跑一遍 STA——修好最差的那条,通常会把*一条新的*路径顶上关键位置。重复。
- 循环下去,直到建立*和*保持在每一个工艺角下 WNS ≥ 0。这时时序就收敛了。
拉远来看,这个循环始终是同一个:时钟交给你一笔预算,关键路径花掉其中最多的,STA 拿着截止线去稽核每一条路径,而裕量就是那张收据。让裕量在每个地方都非负,芯片就能跑。这就是一口气说完的时序收敛。