转自 http://bbs.ednchina.com/BLOG_ARTICLE_3013649.HTM
对于FPGA内部而言,通常我们把它的时序路径分为三类基本的约束路径,即:
● 输入信号 pin2reg
● 内部信号 reg2reg
● 输出信号 reg2pin
我们逐个来看这三类基本路径分别约束的是那个部分的时序。
reg2reg路径约束的对象是路径起始的源寄存器以及最终结束的目的寄存器都在FPGAn内部的路径。如图所示,红色部分是从一个FPGA内部的寄存器到FPGA内部的另一个寄存器的路径,他们共用一个时钟(当然也有不共用一个时钟的reg2reg路径,这种路径的分析会复杂一些,这里不做深入讨论)。对于reg2reg路径,我们只要告诉FPGA时序分析工具他们所使用时钟的频率(或时钟周期),那么FPGA内部通常就“心领神会”的让这条reg2reg的路径总延时不超过这个时钟频率。
我们再来看pin2reg的路径模型,如图所示。虽然和FPGA连接的外部芯片内部寄存器的状态我们无从知晓(一般芯片也不会给出这么detail的内部信息),但是一般芯片都会给出针对于这个芯片管脚的一些时序信息,如Tco、Tsu和Th等,我们其实也是用图示的这个模型来分析的。在这个模型中,红色的大圈所覆盖的路径代表了和FPGA内部reg2reg分析一样的模型,pin2reg原则上只是reg2reg分析的一部分。绿色圆圈则表示我们实际要告诉FPGA的pin2reg约束信息,或者应该这样说,我们希望进行路径延时控制的路径就是这段绿色圆圈覆盖的路径,但是我们需要通过整个reg2reg路径的情况,即根据绿色圆圈以外、红色圆圈以内这部分路径的延时情况去告诉FPGA内部pin2reg路径延时可以在什么样一个范围。
最后,再看reg2pin的路径。如图所示。同样的,红色圆圈部分覆盖了FPGA内部的源寄存器开始,到FPGA外部芯片的目的寄存器为止的reg2reg的路径。外部芯片通常也不会给出detail的信息,也是通过相对他们的管脚给出一些时序的信息。而绿色圆圈所覆盖的路径则是我们需要去约束的reg2pin的延时。它的延时信息同样是需要通过红色大圈以内、绿色小圈以外路径的情况来推测得出。
本节的重点是reg2reg的时钟约束。如图所示,一般的时序分析我们都可以来看看他们的数据路径(data path)和时钟路径(clock path)。所谓数据路径,就是数据在整个传输起点到传输终点所走过的路径;所谓时钟路径,则是指时钟时钟达到各个寄存器的路径。
如图所示,为了便于后续的时序余量分析和计算,我们提出了data arrival path和data required path的概念。Data arrival path是指数据在两个寄存器间传输的实际所需时间;data required path则是指为了确保稳定、可靠且有效的传输,数据在两个寄存器间传输的理论所需时间(也就是最低必须满足的传输时间要求,对于建立时间是最大值,对于保持时间则是最小值)。很明显,从图中,我们就可以看出data arrival path传输的起点是时钟源,达到源寄存器,然后是实际的数据从源寄存器到目的寄存器时间;而data required path的传输起点也是源时钟,但却是达到目的寄存器,然后再考虑目的寄存器的建立时间和保持时间要求(图中未示意)。
如图所示,对于上面所提出的data arrival path和data required path,我们做了一些喜欢,将实际的各个路径示意了出来。
● Tc2t表示时钟源到源寄存器reg1所经过的时钟网络延时;
● Tc2r表示时钟源到目的寄存器reg2所经过的时钟网络延时;
● Tco表示数据在被锁存后在寄存器内所经过的延时;
● Tr2r表示数据从上一级寄存器(源寄存器)的输出端到下一级寄存器(目的寄存器)的输入端所经过的延时;
● Tsu表示寄存器的建立时间;
● Th表示寄存器的保持时间。
在开始这些路径关系公式的分析前,我们还需要了解Setup relationship和Hold relationship及其与launch edge和latch edge之间的关系。如图所示,对于一个寄存器到寄存器的传输来说,正常情况下,各个寄存器都是在时钟的控制下,每个上升沿锁存一次数据,那么也就意味着,两个相邻的寄存器,后一级寄存器每次锁存的数据应该是前一级寄存器上一个时钟周期锁存过的数据。基于此,我们来讨论建立时间,即setup relationship时,源寄存器为lauch clock,目的寄存器为latch clock,而lauch edge从时间上看就要比latch edge早一个时钟周期,即他们之间通常是相差一个时钟周期的关系。反观保持时间则不然,即hold relationship实际上是同一个edge,也就是说后一级寄存器的保持时间很可能遭到上一级寄存器同一个时钟周期所传输数据的违犯。我们的hold relationship就是为了防备这种情况的,因此launch edge和latch edge实际上是同一个时钟沿,那么他们的关系通常只是Tc2t(源时钟传输到源寄存器的时间)和Tc2r(源时钟传输的目的寄存器的时间)的时间差。
因此,如图所示,理想情况下,抛开什么时钟的抖动以及其他不确定时间,我们可以得到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