FPGA时序约束篇之时序约束中的一些基础概念

写在前面

  在讲解时序分析过程中常见的概念之前,我们需要先解释一下 时间点时间段 的区别,时间点是指一个具体的时间点,比如:我今天17:30要去吃海底捞;而时间段(时间长度)是指一个时间点与另一个时间点之间的时间差,比如:我今天17:30去吃海底捞,在19:30吃完,那么17:30与19:30之间相差2h,那么2h就是时间段。
  为什么要讲这么简单的概念?那么请在注意,下面这些概念中区分哪些是时间点,而哪些又是时间段。

1、建立时间Tsu、保持时间Th与输出延迟Tco

  对于一个D触发器,其工作在时钟CLK的上升沿,如下图所示。

在这里插入图片描述

  由于时钟的上升沿(0—>1)在实际的电路中并不是一瞬间产生跳变的,是需要一定的时间才能稳定在高电平,如下图所示。

在这里插入图片描述

  那么,问题来了,时钟信号CLK的跳变实际上是下图中实际波形中所示,那D触发器工作在时钟的上升沿处,有可能在a处就对D触发器的输入数据D进行寄存,也有可能在b处对D触发器的输入数据D进行寄存,这不是我们所能决定的。
在这里插入图片描述

  由于我们我们无法确定D触发器的准确采样时间,而数据传入D触发器中D端如下图所示,图中DATA灰色部分是我们需要的正确数据。
  对于左图,如果D触发器对数据DATA进行寄存的时间在b处,则得到我们需要的正确数据;那如果是在a处进行数据寄存,则我们得到的数据是不正确的数据。
  同样的,对于右图,如果D触发器对数据DATA进行寄存的时间在a处,则得到我们需要的正确数据;那如果是在b处进行数据寄存,则我们得到的数据是不正确的数据。

在这里插入图片描述

  那么,对于上图中的两种情况,我们有没有办法解决呢?答案是肯定的:有。假设我们D触发器的D端输入的数据DATA在CLK上升沿的这一小段时间内保持不变,只在时钟信号CLK的跳变开始时间之前或者跳变时钟之后发生变化,那么无论是在时钟信号CLK从低电平到高电平的任何时间处,我们进行数据的寄存,都能获得正确的数据,如下图所示。

在这里插入图片描述

  于是,在这里引入两个概念:建立时间保持时间

  • 建立时间Tsu:D触发器的D端输入数据DATA必须在时钟信号CLK的上升沿到来之前的一定时间内已经保持稳定,那么这段时间称为D触发器的建立时间Tsu
  • 保持时间Th:D触发器的D端输入数据DATA必须在时钟信号CLK的上升沿到来之后的一定时间内继续保持稳定,那么这段时间称为D触发器的保持时间

  另外,还有一个概念也是需要我们知道的,对于D触发器,其D端的数据从D端更新到Q端中间也是需要一段时间的,不是一蹴而就的。那么,从时钟上升沿(理想时钟)到D端数据稳定的出现在Q端的时间称为寄存器的时钟到输出延迟,即输出延迟Tco,如下图所示。
在这里插入图片描述

  我们还是用一张时序图来说明建立时间Tsu保持时间Th输出延迟Tco三者之间的关系吧。

在这里插入图片描述

2、数据到达时间

  数据到达时间 (Data Arrival Time)在这里并不是指时间段(或者时间长度),而是指一个时间点。由于在这里进行静态时序分析的路径是寄存器到寄存器之间的路径,所以假设这两个寄存器分别为REG_1与REG_2,那么数据到达时间指的是从源时钟上升沿,到寄存器REG_2的D端的时间。那么这里需要经过寄存器REG_1的时钟延迟、寄存器REG_1的输出延迟以及寄存器REG_1和REG_2之间的逻辑运算的延迟。

  在这里,我们还有几个概念需要解释,方便下面的说明。

  • Launch Edge:发射沿,时序分析中两个寄存器工作时钟的源时钟的第一个上升沿;
  • Latch Edge(Capture Edge):锁存沿(捕获沿),时序分析中两个寄存器工作时钟的源时钟的第二个上升沿;
  • Tclk1:端口输入时钟信号CLK到寄存器REG_1的工作时钟CLK_1的时钟延迟时间;
  • Tclk2:端口输入时钟信号CLK到寄存器REG_2的工作时钟CLK_2的时钟延迟时间;
  • Tdata:两个寄存器REG_1与REG_2之间的进行逻辑运算时间,即数据从REG_1的Q端到REG_2的D端经过的时间;

  同样的,这里还是用一张图来说明吧。

在这里插入图片描述

  那么,根据上上图中的相关概念,在这里**数据到达时间(Data Arrival Time)**可以用公式体现:

						Data Arrival Time = Launch Edge + Tclk1 + Tco + Tdata 

3、数据需求时间

  数据需求时间(Data Require Time)是指数据被存入目的寄存器最短时间,即在这个时间点前输入目的寄存器D端的数据必须保持稳定。这里与前面所讲的数据到达时间一致的是,两个都是表示一个时间点,而不是时间段。我们平常一般认为数据被存入目的寄存器REG_2的最早时间是在寄存器REG_2的时钟上升沿处,但是实际上并不是这样,在前面我们讲到建立时间Tsu时,我们知道,要保证寄存器REG_2能够正确的接收数据,则必须在寄存器REG_2的时钟上升沿的前Tsu的时间就保证数据稳定的出现在寄存器REG_2的D端。于是,数据需求时间的公式可以表示为:

									Data Require Time = 时钟CLK_2到达时间 - Tsu 

  这里,再补充一个概念:时钟到达时间(Clock Arrival Time),是指时钟达到寄存器的时间。那么,在这里源时钟到达寄存器REG_2的时间为锁存沿(捕获沿)加上CLK_2的时钟延迟时间,即:

									    时钟CLK_2到达时间 = Latch Edge + Tclk2 

  于是,**数据需求时间(Data Require Time)**可以进一步表示为:

									Data Require Time = Latch Edge + Tclk2 - Tsu 

  这里就不再贴图了,可以参照上面那张图中进行理解。

4、建立时间余量与保持时间余量

  建立时间余量Tslack即数据需求时间与数据到达时间的差值,经过前面的学习,我们知道要使得寄存器能够在上升沿处捕获到正确的数据,就必须要求数据在上升沿的建立时间Tsu之前保证数据稳定的输入到寄存器的D端。但是数据到达寄存器D端的时间有可能早于建立时间Tsu,也有可能晚于建立时间Tsu,这里早到的时间或者晚到的时间就称为建立时间余量。如下图中蓝色部分所示。
在这里插入图片描述
  那么,建立时间余量Tslack也有可能是负值,即数据到达寄存器的D端的时间晚于建立时间Tsu,如下图所示。
在这里插入图片描述
  根据前面两张图,容易得出建立时间余量Tslack的计算公式:

						Tslack = Data Require Time - Data Arrival Time
							   = Latch Edge + Tclk2 - Tsu - (Launch Edge + Tclk1 + Tco + Tdata)
							   = (Latch Edge - Launch Edge) + (Tclk2 - Tclk1) - Tsu - Tco - Tdata
							   = Tcycle + Tskew - Tsu - Tco - Tdata

  备注:这里Tcycle表示时钟周期,Tskew表示时钟偏斜,在下文中会讲解。

  既然有建立时间与保持时间,那么对应建立时间余量也就有保持时间余量 Hold Slack。在前面我们已经学习了保持时间Th,要使得时序收敛,则必需要求寄存器D端的输入数据在上升沿后继续保持一段时间(Th)的稳定。但是我们实际上寄存器D端的输入数据在上升沿后继续保持稳定的时间有可能大于Th或者小于Th,当然,也有可能等于。那么,这里数据到达时间加上数据保持稳定的时间与数据上升沿加保持时间的差值。这样讲还是太绕了,看下面这张图吧。
在这里插入图片描述

  同样的,保持时间余量也有可能为负值,即此时不满足时序收敛的要求,如下图所示。
在这里插入图片描述
  根据前面两张图,可以知道保持时间余量Thold slack实际上就是寄存器REG_1的D输入端下次发生变化的时间与保持时间要求的差值,而寄存器REG_1的D输入端下次发生变化的时间 = 数据到达时间Data Arrival Time + Tcycle,所以保持时间余量的计算公式可以表示为:

				   Thold slack = Data Arrival Time + Tcycle - Data Require Time
							   = (Launch Edge + Tclk1 + Tco + Tdata) + Tcycle - (Latch Edge + Tclk2 + Th)
							   = (Launch Edge - Latch Edge + Tcycle) + Tco + Tdata - (Tclk2 - Tclk1) - Th 
							   = Tco + Tdata - Tskew - Th

5、最高运行时钟频率Fmax

  在这之前,我们先补充一点知识,系统晶振频率与系统时钟周期之间的关系如下:
时钟周期 = 1 晶振频率 \begin{align} 时钟周期=\frac{1}{晶振频率} \end{align} 时钟周期=晶振频率1
  以我们常见的50M Hz的系统晶振频率为例,其时钟周期为20ns。
T = 1 50000000 s = 20 n s \begin{align} T=\frac{1}{50 000 000} s=20 ns \end{align} T=500000001s=20ns
  在前面,我们讲了建立时间余量Tslack,若建立时间余量Tslack为正值,则目标寄存器可以正确接收数据;若为负值,则目标寄存器无法正确接收数据。
  在这里,如果建立时间余量Tslack为正值,也就是说我们数据到达的时间(Data Arrival Time)要比数据需求的时间(Data Require Time)要早的多,那么我们保证寄存器能够正确采集到我们需要的数据的要求仅仅是:数据到达的时间(Data Arrival Time)要比数据需求的时间(Data Require Time)要早,早多少呢?答:多少都行。也就是说我们可以通过减小时钟周期尽量把数据需求时间缩小到最小,以达到提升最高主频的目的。
  好了,什么是最高主频?在我们评价一个系统的性能时,常常会被问到“你这个系统能跑到多少MHz?”,这里的多少兆赫兹就是最高主频,即最高运行时钟频率Fmax,其计算公式如下:
F m a x = 1 T − T s l a c k \begin{align} Fmax=\frac{1}{T - Tslack} \end{align} Fmax=TTslack1
  其中,T表示我们在时钟约束文件中(.sdc文件或者.xdc文件)约束的系统时钟周期,Tslack表示建立时间余量。
  在上面,我们讨论的是建立时间余量Tslack为正值的情况,即相较于我们给我们设计的系统所约束的时钟频率,我们还可以进一步提升。那么,如果Tslack为负值,也就是说我们目前给设计的系统所约束的时钟频率还是太高了,无法使得系统正常运行,得到我们预期的结果,那么必须通过优化我们硬件代码里面的结构,通常就是上寄存器大法,在分析的两个寄存器之间的逻辑运算中再插入一级或者多级寄存器,减少组合逻辑链路的长度(在这里暂时不对RTL级路径优化的方法进行详细解释,可以百度或者在下面的学习笔记处查看)。

6、时钟偏斜Tskew

  时钟偏斜Tskew指的就是源时钟到达源寄存器和源时钟到达目的寄存器的时间差值,即

											Tskew = Tclk2 - Tclk1

  如下图所示。

在这里插入图片描述
  那么,在这里,由于布局布线的原因,源时钟CLK有可能先到寄存器REG_1(即Tclk2>Tclk2),也可能先到寄存器REG_2(即Tclk1>Tclk2),也就是说时钟偏斜Tskew可能为正,也可能为负。

写在最后

  这么对概念,我都记不住啊!为什么它要叫A,为什么不叫B。

  • Tsu(Time of set up,建立时间)
  • Th(Time of hold,保持时间)
  • Tco(Time of clock to output,输出延迟)
  • Tskew(Time of skew,时钟偏斜)

  另外,还记得在开头中讲到的:哪些是时间点?哪些是时间段?
  时间点:

  • 数据到达时间Data Arrival Time
  • 数据需求时间Data Required Time

  时间段:

  • 建立时间Tsu
  • 保持时间Tsu
  • 输出延迟Tco
  • 建立时间余量Set Up Slack
  • 保持时间余量Hold Slack
  • 时钟偏斜Tskew

  好了,上面就是关于时序约束里面一些概念的解释,如果有疑义的地方欢迎评论区友好探讨学习!!!!!
在这里插入图片描述

  • 46
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值