时序裕量(slack)
想象你得在 3:00 前赶到登机口,而你其实 2:48 就慢悠悠地走到了。那多出来的十二分钟就是你的缓冲——就算走错一个路口、排队慢了一点,你也还赶得上。在芯片时序里,时序裕量(slack)正是这样的缓冲,只不过是以零点几纳秒来计:它衡量一个信号到达目的地时,比它必须赶上的截止时刻还多出多少富余时间。
更准确地说,两个寄存器之间的每一条路径都有一个要求到达时间(信号最晚允许在什么时刻到达,仍能在下一个时钟边沿被安全锁存)和一个实际到达时间(信号经过逻辑层层传递后真正出现的时刻)。对于建立时间检查,裕量就是二者之差:要求减去实际。裕量为正,说明信号提前赶到、还留有余地——这条路径通过。裕量为零,说明它在最后一刻才到。裕量为负则意味着它迟到了:时钟想抓取数据时,数据还没稳定下来,于是这条路径时序失败,芯片在那个时钟速度下就跑不可靠。
时序裕量是静态时序分析为设计中每一条路径给出的头号数字,而裕量最差(最小)的那条路径就是关键路径——它是决定你最高时钟频率的瓶颈,无论这个最差裕量是勉强为正、还是已经深陷负值。整个时序收敛的核心,就是把负裕量的路径揪出来逐一修复:加速慢逻辑、调整单元尺寸、重构路径——或者,如果目标本就定得太激进,就放宽一条时序约束(这会拉低你最终签核的频率),直到每条路径都落到零或更高。工程师常用最差负裕量(WNS)来指最差的那一条路径,用总负裕量(TNS)来指所有失败端点累加起来的亏欠。
建立时间裕量等于截止时刻减去信号实际到达的时刻;为正就表示它赶到时还有富余。
「slack」这个词听起来像坏事——偷懒、松懈——但在时序里恰恰相反:正裕量正是你想要的,是一份从容的余地。容易搞混的是它的正负号约定。裕量为 −0.2 ns 的路径是失败的,差了 200 皮秒;而 +0.2 ns 则表示你还有 200 皮秒的富余,甚至可以把时钟再往上推一点。