我们可以先重点研究一下reg2reg的时序约束。如图1所示,一般的时序分析我们都可以来看看他们的数据路径(data path)和时钟路径(clock path)。所谓数据路径,就是数据在整个传输起点到传输终点所走过的路径;所谓时钟路径,则是指时钟从源端到达各个寄存器输入端的路径。
图1 reg2reg的数据路径和时钟路径
如图2所示,为了便于后续的时序余量分析和计算,我们提出了data arrival path和data required path的概念。data arrival path是指数据在两个寄存器间传输的实际所需时间;data required path则是指为了确保稳定、可靠且有效的传输(即满足相应的建立时间和保持时间要求),数据在两个寄存器间传输的理论所需时间(也就是最基本的必须满足的传输时间要求,对于建立时间是最大值,对于保持时间则是最小值)。很明显,从图中,我们就可以看出data arrival path传输的起点是时钟源,达到源寄存器,然后是实际的数据从源寄存器到目的寄存器时间;而data required path的传输起点也是源时钟,但却是达到目的寄存器,然后再考虑目的寄存器的建立时间和保持时间要求。
图2 reg2reg的数据传输路径
如图3所示,对于上面所提出的data arrival path和data required path,我们做了一些细化,将实际的各个路径示意了出来。
Tc2t表示时钟源到源寄存器reg1所经过的时钟网络延时。
Tc2r表示时钟源到目的寄存器reg2所经过的时钟网络延时。
Tco表示数据在被锁存后在寄存器内所经过的延时。
Tr2r表示数据从上一级寄存器(源寄存器)的输出端到下一级寄存器(目的寄存器)的输入端所经过的延时。
Tsu表示目的寄存器的建立时间。
Th表示目的寄存器的保持时间。
图3 reg2reg的详细路径分析
在开始这些路径公式的分析前,我们还需要了解Setup relationship和Hold relationship及其与launch edge和latch edge之间的关系。如图8.21所示,对于一个寄存器到寄存器的传输来说,正常情况下,各个寄存器都是在时钟的控制下,每个上升沿锁存一次数据,那么也就意味着,两个相邻的寄存器,后一级寄存器每次锁存的数据应该是前一级寄存器上一个时钟周期锁存过的数据。基于此,我们来讨论建立时间,即setup relationship时,源寄存器为lauch clock,目的寄存器为latch clock,而lauch edge从时间上看就要比latch edge早一个时钟周期,即他们之间通常是相差一个时钟周期的关系。反观保持时间则不然,即hold relationship实际上是同一个edge,也就是说后一级寄存器的保持时间很可能遭到上一级寄存器同一个时钟周期所传输数据的“侵犯”。我们的hold relationship分析就是为了防备这种情况的,因此这里的launch edge和latch edge实际上是同一个时钟沿,那么他们的关系通常只是Tc2t(源时钟传输到源寄存器的时间)和Tc2r(源时钟传输的目的寄存器的时间)的时间差。
图4基本的时钟分析概念
因此,对照上面给出的3的示意图,理想情况下,抛开什么时钟的抖动以及其他不确定时间,我们可以得到比较理想的reg2reg传输的建立时间和保持时间余量(slack)计算公式:
建立时间余量的计算公式:
Setup time slack = Data Required Time – Data Arrival Time
Data Arrival Time = Launch Edge + Tc2t + Tco + Tr2r
Data Required Time = Latch Edge + Tc2r - Tsu
保持时间余量的计算公式:
Hold time slack = Data Arrival Time – Data Required Time
Data Arrival Time = Launch Edge + Tc2t + Tco + Tr2r
Data Required Time = Latch Edge + Tc2r + Th