这篇文章主要整理静态时序分析(STA)的一些基本概念
1. setup time & hold time
数字电路中最重要的时序单元是触发器,而最常用的触发器就是 DFF
对于任何一个 DFF, 都有两个重要的参数: setup time 和 hold time
这两个参数是相对于时钟信号上升沿(或者下降沿)来定义的:
setup time 是指:在 CLK 端的时钟信号上升沿到来之前, D 端数据信号必须保持稳定的最短时间,这个最短时间长度记为 Tsu
hold time 是指:在 CLK 端的时钟信号上升沿到来之后, D 端数据信号必须继续维持稳定的最短时间,这个时间长度记为 Th
也就是说,D 端的数据信号必须比时钟上升沿提前至少 Tsu 时间到达D端,且在时钟上升沿到来之后的 Th 时间长度内依然保持稳定,才能保证 DFF 将 D 端的数据信号稳定的锁存下来。
换句话说,如果时钟上升沿出现在时间 Tr,那么在(Tr - Tsu,Tr + Th)这个时间区间内,DFF 的 D 端数据必须保持稳定不变,否则 DFF 就无法准确地锁存数据,导致电路出错。
数字电路设计的重中之重就是要保证每一个 DFF 都能够将其输入端的数据稳定地锁存住,也就是要保证每个 DFF 的 setup time 和 hold time 都不出现违例。
2. 静态时序分析(STA)基本模型
下图就是一个最简单的静态时序分析模型:
在时钟上升沿的驱动下,REG1 将其 D 端的数据锁存下来并且输出到 Q 端, Q 端的数据经过组合逻辑运算后传输到 REG2 的 D 端,然后在下一个时钟上升沿的驱动下,REG2 将其 D 端的数据锁存下来,这样就完成了一次数据运算,并将运算结果保存在 REG2 中,整个过程需要在一个时钟周期内完成。
在这个过程中,最重要的是当数据到达 REG2 的 D 端时,必须满足 REG2 的 setup time 和 hold time,这样才能准确地锁存数据。
静态时序分析的目的,就是分析 REG2 的 setup time 和 hold time 是否得到满足,如果不满足,就需要报出 timing violation,引导工具或者设计人员修改。
3. setup check & hold check
setup check 和 hold check 可以用波形图直观地表示出来:
setup check:
时钟 clk1 的 launch edge 驱动 REG1 发出数据,经过组合逻辑运算后传输到 REG2 的 D 端,然后被 clk2 的 capture edge 锁存到 REG2 中,如果组合逻辑很复杂,导致数据传输路径太长,那么数据就可能侵入 REG2 的 setup time,导致数据无法准确锁存,所以 setup check 就要求数据传输不能太慢,否则会引起 setup violation
hold check:
上面说到如果数据传输路径太长,可能导致setup violation,那么如果数据传输路径非常短,数据就会在很短时间内到达 REG2 的 D 端,此时 REG2 可能还正在锁存上一个数据,也就是数据侵入了 REG2 的 hold time,导致上一个数据无法准确锁存,所以 hold check 就要求数据传输不能太快,否则会引起 hold violation
总结来讲,setup check 和 hold check 要求数据传输路径既不能太长,又不能太短,数据必须在如下图所示的 timing window 内到达,才能保证电路正常工作。
4. synchronous & asynchronous
在静态时序分析中,有一个很重要的概念是同步和异步
如果 launch clock 与 capture clock 有固定的相位差,那就是同步时序
如果两者没有固定的相位差,那就是异步时序
一般情况下,STA 只检查同步时序,不用检查异步时序
同步时序又分为以下几种情况:
a) launch 和 capture 的周期相同:
这种情况最简单,launch clock 发出的数据被一个周期后的capture clock 锁存,setup check 和 hold check 如下图:
b) launch 和 capture 的周期不同,且 launch 周期小于 capture 周期
这是典型的快时钟域到慢时钟域,此时有多个上升沿发出的数据可能被同一个capture 上升沿采集到,如下图:
那么在这种情况下,STA 工具会选择哪些边沿来做时序分析呢?
首先,launch 的周期是10ns,capture 的周期是 15ns,可以看出每隔30ns形成一个循环,所以只需要考虑30ns 以内的情况,后面的都是无限重复
工具会从这 30ns 内找出最苛刻的时钟边沿来做时序分析,对于 setup 来说,从 10ns 到 15 ns 这组的时序是最严格的,所以工具会选择这组来做 setup check; 而对于 hold, 从 0ns 到 0ns 这组的时序最严格,所以选择这组做 hold check,保证从 0ns 发出的数据不会干扰到capture edge 在 0ns 采集上一组数据
c) launch 和 capture 的周期不同,且 launch 的周期大于 capture 的周期
这是慢时钟域到快时钟域,那么此时又该选择哪些边沿来做时序分析?
首先,launch 的周期是 15, capture 的周期是10, 两者的最小共同周期就是 30ns, 而在 30ns 内,对于 setup 最严格的时序是从 15ns 到 20ns 这一组,所以工具会选择这组做 setup check,而对于hold, 最严格的依然是从 0ns 到 0ns, 所以选择这组做 hold check
总之,对于 launch 和 capture 周期不同的同步时序电路,只要先找出两者的最小共同周期,然后在这个周期内找到最苛刻的那组时钟沿,就可以快速分析出用来做 setup check 和 hold check 的时钟沿;比如下面这个例子,launch clock 的周期是6ns,capture 的周期是10ns,那么两者的最小周期就是 30ns,在这 30ns 内,最严格的 setup 是从 18ns 到 20ns,而最严格的 hold 依然是从 0ns 到 0ns 。
对于异步时序来说,由于无法确定launch 和 capture 的最小共同周期,各个时钟边沿之间也没有固定的时间差,所以是无法做时序分析的,对于跨时钟域的异步电路,需要在设计阶段就做好防护,采用多级 register、异步 FIFO 等方法确保数据的准确传输。
|------------------------------------------|