FPGA时序约束——理论篇

2023-05-19,,

在FPGA 设计中,很少进行细致全面的时序约束和分析,Fmax是最常见也往往是一个设计唯一的约束。这一方面是由FPGA的特殊结构决定的,另一方面也是由于缺乏好用的工具造成的。好的时序约束可以指导布局布线工具进行权衡,获得最优的器件性能,使设计代码最大可能的反映设计者的设计意图。

花些功夫在静态时序分析上既可以保证设计质量,也可以促使设计者再认识自己的代码。这后一点,对于我们这些逻辑设计初学者来说,尤为重要。从门级(在Altera的FPGA器件中是LE 级)再认识自己的代码,可以更深入地体会语言的特点,也可以更深入地理解综合工具对语言的处理,对于设计能力的提高帮助很大。

1. 基本术语和概念

1.1 网表基本单元

节点(nodes)

包含了大部分基本的时序网表单元,常常代表端口、引脚和寄存器。
单元(cells)

Altera 器件中的基本结构单元(例如,查找表、寄存器、IO 单元、PLL、存储器块等),LE 可以看作是Cell。
引脚(pins)

基本结构单元cell的输入输出,这里不包括器件的物理引脚。
连线(nets)

两个pin之间的连线。(参考文献《timequest就一定要搞定

》中的定义与官方手册中好像略有不同,文献中定义是:同一个Cell中,从输入Pin到输出Pin经过的逻辑。特别注意:网表中连接两个相邻Cell的连线不被看作Net,被看作同一个点,等价于Cell的Pin。还要注意:虽然连接两个相邻Cell的连线不被看作Net,但是这个连线还是有其物理意义的,等价于Altera器件中一段布线逻辑,会引入一定的延迟(IC,Inter-Cell)。)
端口(ports)

顶层逻辑的输入输出端口。对应已经分配的器件引脚。
时钟(clock)

约束文件中指定的时钟,不仅指时钟输入引脚,还包括内部时钟。

1.2 时序路径(Timing Paths)

时序路径是两个节点的连接,如一个寄存器的输出到另一个寄存器的输入。理解时序路径的类型对定时分析和优化是非常重要的。TimeQuest通常使用如下几种类型的时序路径:

Edge paths(边缘路径)

从端口(port)到引脚(pin),引脚到引脚,以及引脚到端口之间的连接。
Clock paths(时钟路径)

从器件端口或内部产生的时钟引脚到一个寄存器的时钟引脚之间的连接。
Data paths(数据路径)

从一个端口或一个时序电路的数据输出引脚,到另一端口或者另一个时序电路的数据输入引脚之间的连接。
Asynchronous paths(异步路径)

从端口到另一个时序电路的异步引脚之间的连接,如异步置位或异步清除。

除了标识出设计中的不同路径,TimeQuest还分析时钟特征,以单个register-to-register路径来计算在任何两个寄存器之间最坏情况的要求。在分析时钟特征之前,必须对设计中的所有时钟进行约束。

1.3 时间术语

以下在时序分析中常常遇到的术语或概念,一开始不能理解不要紧,结合后面的时序分析例子,慢慢就会理解其含义。

f_MAX(最大时钟频率)

在不违背内部建立时间tSU和保持时间tH要求下可以达到的最大时钟频率;
T_CO(时钟到输出延时)

时钟信号在寄存器引脚上发生转变以后,在由寄存器馈送信号的输出引脚上获得有效输出所需的最大时间;
T_PD(引脚到引脚延时)

输入引脚上的信号在经由组合逻辑进行处理传输,出现在外部输出引脚上时所需的时间;
T_SU(建立时间)

是指在时钟沿到来之前数据从不稳定到稳定所需的时间,如果建立的时间不满足要求那么数据将不能在这个时钟上升沿被稳定的打入触发器。

T_H(保持时间)

是指数据稳定后保持的时间,如果保持时间不满足要求那么数据同样也不能被稳定的打入触发器。

Launch Edge Time(启动沿时刻)

时序分析起点(launch edge):指的是一个时钟沿,这个时钟沿将一个寄存器或一个时序电路的数据送出,即第一级寄存器数据变化的时钟边沿,因此这个时钟沿充当数据传输的源,即静态时序分析的起点,只是一个开始时刻的概念。
Latch Edge Time(锁存沿时刻)

时序分析终点(latch edge):指的也是一个时钟沿,这个时钟沿将一个寄存器或一个时序电路的输入端口的数据锁存起来,即数据锁存的时钟边沿,因此这个时钟沿充当数据传输的目的,也是静态时序分析的终点,同样只是一个结束时刻的概念。

蓝色的启动沿(即Launch Edge Time时刻)之后由REG1输出有效数据,并在红色的边沿被锁存(即锁存沿时刻)进REG2并输出到下级。一般时序分析,就是分析的从启动沿到锁存沿之间的时间,看是否满足需求。

理解上图,launch edge在0ns将数据data_a从寄存器REG1输出,但是注意,这并不意味着data_a在0ns就从REG1中输出,这儿存在一个延迟,这个延迟指的是当时钟有效沿变化后,将数据推倒同步时序路径的输出端的最小时间间隔,即utCO。数据data_a顺着路径传递到REG2,REG2在10ns处的latch edge捕捉data_a。显然在10ns处的data_a必须到达REG2,因此这就是一个数据建立的时间关系,也就是图中红线所谓的Setup Relationship。

如何理解图中的Hold relationship呢?显然,图中所指示的Hold relationship并不是与当前这个数据(data_a,就是0ns要launch的数据,或10ns要latch的数据)有保持关系,而是上一个数据(比如data_b)的Hold关系。

2. 时序参数计算

2.1 Data Arrival Time(数据到达时间)

TimeQuest计算数据到达时间,包括以下4部分时间之和:启动沿时间(Launch Edge Time)、从时钟源到源寄存器的时钟pin的延迟(Source Clock Delay)、时钟源寄存器的micro clock-to-output延迟(utCO,这个时间指的是当时钟有效沿变化后,将数据推倒同步时序路径的输出端的最小时间间隔。)以及从源寄存器的数据输出Q到目的寄存器的数据输入D的延迟(Register-to-Register Delay)。

Data Arrival Time = Launch Edge + Source Clock Delay + μtCO + Register-to-Register Delay

举例说明,两个寄存器采用同步时钟:

如图所示,比照官方手册给出的定义,计算数据到达时间还需知道3个延迟:

T_clk1(即从时钟源到源寄存器的时钟pin的延迟,Source Clock Delay)

时钟信号从起点(一般是PLL输出或者外部时钟输入引脚)到达启动寄存器(或说启动触发器)的相应clk端口所耗的时间;

假如CLK是由PLL发出的时钟信号(称之为源时钟),这个信号经过FPGA内部的“连线”最终来到了REG1(启动触发器)的clk端,所以此时在REG1的clk端口处也会有周期性的时钟信号REG1.CLK,如图所示;可以看到,此时的CLK(源时钟)和REG1.CLK实际上有个时间差(相位差),这个时间差就是Tclk1;
T_CO

启动寄存器内部延时,是寄存器REG1在接收到有效的上升沿后,到数据真正从从REG1的Q输出之间延时,这是内部寄存器的固有属性,一般取最小值,即文档中的μtCO;请注意:上述所谓的有效的上升沿,就是REG1.CLK,而不是CLK;所以实际的有效数据输出的时序如上图的REG1.Q;
T_data(即Register-to-Register Delay)

数据从上级寄存器输出Q(经过所有其他组合逻辑以及FPGA内部走线)到下级寄存器的数据输入D之间的延时;如图所示,数据从从REG1的Q流向了REG2的D,所以REG2.D实际接收到的数据时序是REG2.D,注意这里没有涉及到REG2的锁存;

假如将上图中的launch Edge作为0点时刻,将一系列的延时累加,所得结果称之为数据到达时间,DAT:

DAT= T_clk1+T_co+T_data;

2.2 Data Required Time(数据要求时间)

TimeQuest计算数据要求时间,包括以下3部分时间:锁存沿时间(Latch Edge)、时钟端口到目的寄存器的时钟引脚之间的所有延迟(这包括时钟端口所有缓冲的延迟,Destination Clock Delay)、减掉目标寄存器的最小建立时间(μt_SU,这是FPGA内部寄存器的固有属性)。

Data Required Time = Latch Edge + Destination Clock Delay – μt_SU

数据要求时间包括数据建立要求时间(DRT_su)和数据保持要求时间(DRT_H)。

2.1.1 数据建立要求时间

T_clk2(即Destination Clock Delay)

不同于上述的T_clk1,这个延时是时钟从起点(一般是PLL或者时钟输入引脚)到锁存触发器之间的延时;如上图所示,REG2实际感受到的时钟来自于其本身的clk端口,而不是源时钟CLK,他们之间存在一个延时,即T_clk2;所以REG2实际感受到的时钟,实际上是上图的REG2.CLK;
T_su:

上面分析过了,每一个数据被锁存都要满足建立时间和保持时间,T_su就是建立时间,也就是在REG2实际感受到Latch Edge时,数据如果需要被正确锁存,就必须提前Tsu这么长的时间到达REG2的D端口;

综合时钟走线延时Tclk2以及T_su,我们得到了数据建立时间DRT_su:

DRT_su=锁存沿+T_clk2-T_su。

在DRTsu时刻之前,数据必须已经有效且稳定。

2.1.2 数据保持要求时间

DRTh=锁存沿+T_clk2+T_h;

也就是说,数据在DRT_h时间之前必须保持住不变;

2.3 Clock Setup Check(时钟建立检查)

要实现时钟建立检查,TimeQuest analyzer首先分析出每个寄存器之间的启动沿和锁存沿路径,从而获知他们之间的建立关系。

对于每个目标寄存器的锁存沿,TimeQuest analyzer利用源寄存器先前最近的一个时钟沿作为启动沿(launch edge)。举例说明,如上图所示为两个建立关系,建立关系A和建立关系B。10ns处的锁存沿,先前离它最近的源时钟位于3ns处,因此就将该时钟沿作为启动沿,从而确定了建立关系A(图中已表明)。同样,20ns处的锁存沿,它的启动沿是位于19ns处的源时钟沿,从而确定了建立关系B。TimQuest会分析出最严苛的建立关系,在本例中即为关系B。如果关系B都能满足设计需求,那么关系A自然也就满足需求了。

TimeQuest analyzer将时钟建立检查的结果表示为裕量(slack)。裕量是表示是否满足设计需求的时序余量。建立时间裕量指的是数据到达时间和数据建立时间之间的关系,裕量为正,表示余量满足设计需求。为负,则表示余量不满足设计需求。

如上图所示,在0时刻(launch edge),源时钟clk产生一个上升沿表示准备让REG1发送数据,但是该启动沿并没有马上传到REG1,而是经过了延时Tclk1,所以在T_clk1时刻,REG1才准备发送数据,再经过寄存器内部固有延时Tco,终于在REG1的Q端输出了数据Data_Valid(时序REG1.Q)。Data_Valid再经过内部延时T_data到达REG2的D端(时序REG2.D),所以数据经历了T_clk1+T_co+T_data才到达REG2,这就是我们之前分析的数据到达时间。源时钟CLK在第一个时钟上升沿完成了数据的发送,在第二时钟的上升沿要实现数据的锁存,这个上升沿即为锁存沿(latch edge)。但是源时钟产生的锁存沿要经过T_clk2才能到达REG2,此时REG2要“识别”D端口有没有数据,同时还要判断该数据是否满足建立时间要求和保持时间要求,如果都满足,则REG2能正确锁存该数据。如果REG1的数据传递太慢(没有提前T_su到达),或者消失太快(T_h太短),则都不能稳定接收数据。

由前面的知识可以知道,分析时序以启动沿时刻为起点,以锁存沿时刻为终点。根据以上分析,建立时间裕量可表示为:

Clock Setup Slack =(锁存沿+T_clk2-T_su)-( T_clk1+T_co+T_data)

Clock Setup Slack = Data Required Time – Data Arrival Time

总结起来,时钟建立裕量对各种情况的描述如下所示:

内部寄存器-寄存器时间的时钟建立裕量

Clock Setup Slack = Data Required Time – Data Arrival Time

Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + μt_CO + Register-to-Register Delay

Data Required Time = Latch Edge + Clock Network Delay to Destination Register – μt_SU – Setup Uncertainty

TimeQuest analyzer在执行建立检查时,计算数据到达时间时用最大延迟,而计算数据需求时间是采用最小延迟。

输入端口到内部寄存器的时钟建立裕量

Clock Setup Slack = Data Required Time – Data Arrival Time

Data Arrival Time = Launch Edge + Clock Network Delay + Input Maximum Delay + Port-to-Register Delay

Data Required Time = Latch Edge + Clock Network Delay to Destination Register – μt_SU – Setup Uncertainty

内部寄存器到输出端口的时钟建立裕量

Clock Setup Slack = Data Required Time – Data Arrival Time

Data Required Time = Latch Edge + Clock Network Delay to Output Port – Output Maximum Delay

Data Arrival Time = Launch Edge + Clock Network Delay to Source Register +μt_CO + Register-to-Port Delay

2.4 Clock Hold Check(时钟保持检查)

要实现时钟保持检查,TimeQuest analyzer从已确定的源和目标寄存器对(source and destination register pairs)之间的建立关系中来确定保持关系。TimeQuest analyzer从所有的建立关系中去分析相邻的时钟沿,从而确定保持关系。

TimeQuest analyzer对每一个建立关系执行两次保持检查。第一次检查确定被当前启动沿推送的数据,但该数据并没有被先前的锁存沿给捕获。第二次检查确定被第二个启动沿推送的数据,但该数据并未被当前的锁存沿给捕获。从所有可能的保持关系中,TimeQuest analyzer选择最苛刻的一个保持关系,它的锁存沿和启动沿之间的差异最小,并且决定了寄存器之间路径的最小延迟。下面的例子中,TimeQuest analyzer选择保持检查A2作为最苛刻的保持关系。

在分析时钟保持裕量的时候要注意到,之前在分析时钟建立裕量时的锁存沿(latch edge)恰好又是下一个数据的启动沿(launch edge),所以要求新的数据到达REG2之前,REG2要有足够时间将上一个数据Data_Valid正确锁存,这个时间即为时钟保持时间裕量。

即:

Clock Hold Slack = (T_clk1+T_co+T_data)-(锁存沿+T_clk2+T_h)

Clock Hold Slack = Data Arrival Time – Data Required Time

同理,总结起来关于时钟保持裕量的计算方式如下所示:

内部寄存器之间路径的时钟保持裕量

Clock Hold Slack = Data Arrival Time – Data Required Time

Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + μt_CO + Register-to-Register Delay

Data Required Time = Latch Edge + Clock Network Delay to Destination Register + μt_H + Hold Uncertainty

TimeQuest analyzer在执行保持检查时,计算数据到达时间时用最小延迟,而计算数据需求时间是采用最大延迟。

输入端口到内部寄存器的时钟保持裕量

Clock Hold Slack = Data Arrival Time – Data Required Time

Data Arrival Time = Launch Edge + Clock Network Delay + Input Minimum Delay + Pin-to-Register Delay

Data Required Time = Latch Edge + Clock Network Delay to Destination Register + μt_H

内部寄存器到输出端口的时钟保持裕量

Clock Hold Slack = Data Arrival Time – Data Required Time

Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + μt_CO + Register-to-Pin Delay

Data Required Time = Latch Edge + Clock Network Delay – Output Minimum Delay

参考文献

    《TimeQuest就一定要搞定》
    《Quartus® Prime Standard Edition Handbook Volume 3: Verification》
    FPGA设计-时序约束(上篇,理论篇)

FPGA时序约束——理论篇的相关教程结束。

《FPGA时序约束——理论篇.doc》

下载本文的Word格式文档,以方便收藏与打印。