时序分析:基础知识整理(二)
搬运自:
孤独的单刀;
大佬后面的是付费项目,所以涉及付费项目的我不会公开,
本博客纯方便自己看做笔记。
launch edge 和 latch edge 延迟以及静态时序分析相关概念_latching edge-CSDN博客
输出延时时间Tco
由 clk 触发到输出数据有效之间最大延 迟时间,对应图1的Tco(clock output delay)
组合逻辑与时序逻辑
组合逻辑电路
数字电路根据逻辑功能的不同特点,可以分成两大类:组合逻辑电路与时序逻辑电路。
组合逻辑电路的最大特点是输出是实时跟随输入变化的,
如下面的组合逻辑,如果两个输入之间到达的路径延时不一致的话,则很容易产生毛刺。
(个人见解:纯组合逻辑一定会有不符合需要的输出的时刻,但是通过时序逻辑去获取,也可以得到正确的结果)
(位宽过大的时候会有难以估计的问题)
偏偏FPGA又不是理想器件,在资源被大量使用的情况下,要做到不同的路径达到门电路的延时一致几乎是不可能的,
所以可以说纯组合逻辑电路的毛刺现象几乎是不可避免的。
毛刺的产生很多时候都是个灾难,因为它并不是你预期设计的一部分,这相当于你的设计遇上了没有预料到的输入情况,所以输出在很大程度上也会变得不可控。
时序逻辑电路
时序逻辑电路的最大特点是输出不是实时跟随输入变化的,而是在时钟的上升沿(或下降沿,一般以上升沿为主流)统一发生变化
(诚然这个变化也不是瞬时的,还需要一定的Tco时间)。
在时钟的上升沿之前,只要输入满足建立时间和保持时间的要求,则任你如何有毛刺也不会对输出造成影响,
这很容易理解,因为在非上升沿不会发生采样,自然也不会有输出。
时序逻辑电路解决了组合逻辑电路无法解决的毛刺问题,将电路的行动全部置于统一的行动之下----时钟。
在时钟信号的控制下,整个电路可以有条不紊的运行。
当然,组合逻辑电路并不是被替代,因为我们仍然需要其实现逻辑功能。
所以组合逻辑与时序逻辑可以说是共生,你中有我我中有你----组合逻辑实现逻辑功能,而时序逻辑则将电路的运行置于统一的管理之下。
同步电路和异步电路
基于FPGA的设计几乎都是时序逻辑电路,极少会有设计纯组合逻辑电路的情况。
因此,时序逻辑电路在FPGA的设计中占有非常重要的地位。
对于时序逻辑,按信号间关系来看,又可分为同步时序逻辑和异步时序逻辑,简称同步逻辑和异步逻辑。
简单来讲,FPGA 设计中寄存器全部使用一个时钟的设计是同步设计电路,FPGA 设计寄存器使用多个时钟的设计是异步设计电路。
我们说的所有时序分析都是建立在同步电路的基础上的,异步电路不能做时序分析(或者说只能做伪路径约束)。
异步电路由于使用的时钟不同,导致上游寄存器的输出数据进入下游寄存器的时间是任意的,这非常可能导致不满足下游寄存器的建立时间要求和保持时间要求,从而导致亚稳态。
同样的原因,由于两者时钟不同,所以也不法建立对应的模型来分析异步电路是否能满足时序要求。
所以,对FPGA的时序分析其实主要就是对同步时序逻辑电路进行分析,然后再做约束。那么到底要约束些什么?
建立时间与保持时间
时序逻辑电路的基础是触发器FF,对FF的使用有两个要求是必须满足的----建立时间与保持时间。
- 建立时间:Setup Time,缩写是 Tsu,即在时钟上升沿之前数据必须稳定的最短时间
- 保持时间:Hold Time,缩写是 Th,即在时钟上升沿之后数据必须稳定的最短时间
通俗来讲:建立时间和保持时间就是在寄存器采样窗口中输入数据必须保持不变,以免寄存器无法稳定采样。也就是说,在我寄存器的采样窗口之前你输入数据就必须要保持稳定,即输入数据不能来的太晚(建立时间);同样的,你寄存器的输入数据也必须在我寄存器的采样窗口结束后才变化,在此之前必须保持问题,即输入数据不能走的太早(保持时间)。
建立时间和保持时间的示意图如下:
建立时间和保持时间是触发器的固定属性,也就是说同一FPGA型号其所有的FF的建立时间和保持时间都是相同的,
而不同的FPGA型号之间,其建立时间与保持时间则不同。
关于FPGA对应的建立时间和保持时间可以通过手册来查询,也可以用vivado做时序分析时查询。
高级的FPGA芯片其建立时间和保持时间会比低级的FPGA芯片较小,这也是其能运行频率更高的原因。
了解FPGA的建立时间和保持时间非常重要,它是我们进行时序分析的基础,
甚至可以说,时序分析就是要分析所有的FF是不是都满足建立时间与保持时间的要求。
如果建立时间或者保持时间的要求无法被满足,那么就会发生亚稳态现象。
亚稳态 (Metastability)和决断时间Tmet(resolution time):
如果数据传输中不满足触发器的Tsu和Th不满足,就可能产生亚稳态,
此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间里Q端在0和1之间处于振荡状态,
而不是等于数据输入端D的值。
这段时间称为决断时间Tmet(resolution time)。
经过resolution time之后Q端将稳定到0或1上,
但是稳定到0或者1,是随机的,与输入没有必然的关系。
恢复时间与去除时间
异步信号距离下一个时钟沿的时间和上一个时钟沿的时间。
恢复时间(Recovery Time)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“下个时钟沿”来临之前变无效的最小时间长度。
这个时间的意义是,如果保证不了这个最小恢复时间,也就是说这个异步控制信号的解除与“下个时钟沿”离得太近(但在这个时钟沿之前),没有给寄存器留有足够时间来恢复至正常状态,
(不能让异步控制的挂起时间离同步时钟沿太近)
那么就不能保证“下个时钟沿”能正常作用,也就是说这个“时钟沿”可能会失效。
去除时间(Removal)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“有效时钟沿”之后变无效的最小时间长度。
这个时间的意义是,如果保证不了这个去除时间,也就是说这个异步控制信号的解除与“有效时钟沿”离得太近(但在这个时钟沿之后),
那么就不能保证有效地屏蔽这个“时钟沿”,也就是说这个“时钟沿”可能会起作用。
换句话来说,
如果你想让某个时钟沿起作用,那么你就应该在“恢复时间”之前是异步控制信号变无效,
如果你想让某个时钟沿不起作用,那么你就应该在“去除时间”过后使控制信号变无效。
如果你的控制信号在这两种情况之间,那么就没法确定时钟沿是否起作用或不起作用了,也就是说可能会造成寄存器处于不确定的状态。
而这些情况是应该避免的。所以恢复时间和去除时间是应该遵守的。
比如下图中:
复位信号rst_n作为一个异步控制型号,
需要在下一个时钟有效沿之前就变无效(拉高),以保证Recovery恢复时间,这样寄存器才有足够的时间恢复到正常状态(这有点类似建立时间);
同样的,复位信号rst_n的移除不能与上一个时钟有效沿间隔太近,以保证其无法影响上一个时钟有效沿(这有点类似保持时间)。
4种基本的时序路径
下图是一张典型的FPGA与上游、下游器件通信的示意图。
其可以划分为基本的四条数据路径,这四条路径也是需要进行时序约束的最基本的路径。
- 路径1,上游器件通过FPGA管脚到FPGA的寄存器的时序路径,即pin2reg(管脚到寄存器),需要对其进行约束,以满足FPGA端寄存器的建立时间和保持时间要求;
- 路径2,FPGA内部的寄存器到另一个寄存器, 即reg2reg(寄存器到寄存器),需要对其进行约束,以满足FPGA端寄存器的建立时间和保持时间要求;
- 路径3,FPGA管脚到下游器件的寄存器的时序路径,即reg2pin(寄存器到管脚),需要对其进行约束,以满足下游器件的寄存器的建立时间和保持时间要求;
- 路径4,FPGA管脚到FPGA管脚的时序路径(不通过任何寄存器),其本质上是纯组合逻辑电路,仅仅需要约束其值在一个指定范围,不需要满足建立时间和保持时间要求。
(1)管脚到寄存器
路径1,上游器件通过FPGA管脚到FPGA的寄存器的时序路径,即pin2reg(管脚到寄存器),需要对其进行约束以满足FPGA端寄存器的建立时间和保持时间要求。
路径1约束的是上游器件的源寄存器(起点)和FPGA内部的目的寄存器(终点)的数据路径,其目的是要满足后端即FPGA内部寄存器的建立时间要求和保持时间要求。
路径1可以视为是路径2的一种,只不过路径1的源寄存器和目的寄存器都在FPGA内部,而路径2的源寄存器在上游器件中。
(2)寄存器到寄存器
路径2,FPGA内部的寄存器到另一个寄存器, 即reg2reg(寄存器到寄存器),需要对其进行约束以满足FPGA端寄存器的建立时间和保持时间要求。
路径2约束的是FPGA内部源寄存器(起点)和FPGA内部目的寄存器(终点)的数据路径,其目的是要通过提供要求的方式来使得综合工具vivado满足所有FPGA内部寄存器的建立时间要求和保持时间要求。
(3)寄存器到管脚
路径3,FPGA管脚到下游器件的寄存器的时序路径,即reg2pin(寄存器到管脚),需要对其进行约束以满足下游器件的寄存器的建立时间和保持时间要求。
路径3约束的是FPGA内部的源寄存器(起点)和下游器件的目的寄存器(终点)的数据路径,其目的是要满足前端即FPGA内部寄存器的建立时间要求和保持时间要求。
路径3同样可以视为是路径2的一种,只不过路径1的源寄存器和目的寄存器都在FPGA内部,而路径3的目的寄存器在下游器件中。
(4)管脚到管脚
路径4,FPGA管脚到FPGA管脚的时序路径(不通过任何寄存器),其本质上是纯组合逻辑电路,仅仅需要将其值约束在一个指定范围,不需要满足建立时间和保持时间要求。
路径4中不存在任何寄存器,通常都是纯组合逻辑或者走线延迟等,所以也就不需要满足寄存器的建立时间要求和保持时间要求。需要的仅仅是根据开发需求约束其延迟的最小值和最大值。
发射沿(Launch Edge)与锁存沿(Latch Edge)
路径1、2、3实际上都是对寄存器到寄存器之间的数据路径之间的约束,而路径4则是约束纯组合逻辑。
由于寄存器的采样往往都发生在时钟的边沿,所以目的寄存器采样的值实际上是上个时钟周期的源寄存器的值,也就是说在源寄存器与目的寄存器之间其采样时间相差一个时钟周期。
- 发射沿(Launch Edge) :是源寄存器采样的时间点,也是时序分析路径的起点
- 锁存沿(Latch Edge):是目的寄存器采样的时间点,也是时序分析路径的终点
数据到达时间(Data Arrival Time)
由于2个寄存器之间存在的组合逻辑和走线延迟等,使得在发射沿采样到的数据需要一定的时间才能到达后级的锁存沿,这个时间就被称为数据到达时间(Data Arrival Time)。
- Tclk1:时钟信号从起点到达源寄存器REG1的时钟端口的时钟网络延时,产生原因一般是走线延迟
- Tco:源寄存器REG1内部的数据输出延迟,这个延迟时间是寄存器的固有属性,只和使用的FPGA芯片型号有关
- Tdata:数据从源寄存器REG1输出Q端到下级目的寄存器REG2的数据输入D之间的延时,一般是组合逻辑器件产生的固有延时和走线延时
根据上图可以算出数据到达时间:Data Arrival Time = launch edge + Tclk1 + Tco +Tdata
Data Required Time(setup/hold)
launch edge = 0ns
latch edge = 1 clk period
数据需求时间--建立时间(Data Required Time - Setup)
在时钟锁存的建立时间和保持时间之间数据必须稳定,从源时钟起点达到这种稳定状态需要的时间即为数据需求时间。
建立时间要考虑到走线延迟的影响!
时序约束的本质就是要满足所有寄存器的建立时间要求和保持时间要求,所以在数据经过一定的延迟从源寄存器到达目的寄存器后,同样需要满足目的寄存器的建立时间要求(Tsu)。
如上图,在计算数据需求时间--建立时间时,存在2个时间参数:
- Tclk2:时钟信号从起点到达目的寄存器REG2的时钟端口的时钟网络延时,产生原因一般是走线延迟
- Tsu :在时钟有效边沿到达之间,输入数据必须保持不变的时间,这意味着上级寄存器的输入至少要在这之前就保持稳定
根据上图可以算出: Data Required Time + Tsu = latch edge + Tclk2 ,即 Data Required Time = latch edge + Tclk2 - Tsu
Tsu 表示的是时钟沿到来前数据需要提前来到的时间,当锁存沿来到前( latch edge + Tclk2 )的这部分时间就:数据请求+提前到达的时间。
数据需求时间--建立时间,实际上是一种对时钟沿到来之前数据保持稳定的最极端时间要求。
比如为了满足目的寄存器的建立时间要求,计算得到上级寄存器的输出必须至少在3ns之前即保持稳定,这也就意味着上级数据能到达的最晚时间是3ns,那么1ns、2ns到达自然是可以的。
建立时间裕量(Setup Slack)
数据需求时间--建立时间实际上是一种对数据到来之前保持稳定的最极端的时间要求,
比如为了满足目的寄存器的建立时间要求,计算得到上级寄存器的输出必须至少在时间刻度3ns之前即保持不变,
这也就意味着上级数据能到达的最晚时间是3ns,那么1ns、2ns到达自然是可以的。
如果数据在1ns即到达了目的寄存器,那么建立时间裕量就是3ns-1ns = 2ns,那么这个裕量有什么作用呢或者说代表着什么?
前面我们知道到寄存器之间可能会存在一段组合逻辑和走线延迟,
如果你的设计中某2个寄存器之间的建立时间裕量是2ns,则意味着你还有空间去折腾,
比如寄存器彼此之间还可以增加一些组合逻辑器件或者更长的走线。
根据上图,可以算出:
Setup Slack = Data Required Time – Data Arrival Time,
即Setup Slack = (latch edge + Tclk2 - Tsu ) – (launch edge + Tclk1 + Tco +Tdata )
= (latch edge - launch edge) +(Tclk2 - Tclk1 )- (Tsu + Tco +Tdata)
= Tperiod + Tskew - (Tsu + Tco +Tdata)。
数据需求时间--保持时间(Data Required Time - Hold)
建立时间和保持时间是寄存器的2个固定需求属性,所以在数据经过一定的延迟从源寄存器到达目的寄存器后,同样需要满足目的寄存器的保持时间要求(Th)。
如上图,在计算数据需求时间--保持时间时,存在2个时间参数:
- Tclk2:时钟信号从起点到达目的寄存器REG2的时钟端口的时钟网络延时,产生原因一般是走线延迟
- Th:在时钟有效边沿到达之后,输入数据必须保持不变的时间,这意味着上级寄存器的输入至少要在这之后才能发生变化
所以可以算出: Data Required Time = latch edge + Tclk2 + Th
保持时间裕量(Hold Slack)
数据需求时间--保持时间实际上是一种对时钟沿到来之后数据保持稳定的最极端的时间要求,
比如为了满足目的寄存器的保持时间要求,计算得到上级寄存器的输出必须至少在时间刻度3ns之前都保持不变,
这也就意味着上级数据能变化的最早时间是3ns,那么4ns、5ns到达自然是可以的。
如果数据在5ns处才在目的寄存器发生了变化,那么保持时间裕量就是5ns-3ns = 2ns。
根据上图,可以算出:
Hold Slack = Data Arrival Time - Data Required Time,
即Hold Slack = (latch edge + Tclk1 + Tco +Tdata) - (latch edge + Tclk2 + Th)
= (Tco +Tdata - Th)-(Tclk2 - Tclk1)+ (latch edge - latch edge)
= (Tco +Tdata - Th) - Tskew 。
如果Hold Slack为正,则认为数据在被锁存的时候有足够多的稳定时间,是有效的;反之则认为数据可能是亚稳态状态。
意外情况:
极端情况下需要考虑时钟抖动带来的不确定延迟和时钟到达不同寄存器的延迟。
即:
时钟悲观去除时间:CPR
不确定时间:Clock Uncertainty
这种情况下:
建立时间余量Slack:
data arrival time = Tclk1 + Tco + Tdata + Launch Edge
data required time(set up) = Tclk2+Latch Edge - Tsu - Clock Uncertainty + CPR
Slack = data required time(set up) - data arrival time = Tperiod + Tskew - (Tsu + Tco + Tdata) - Clock Uncertainty + CPR
保持时间余量Slack:
data arrival time = Tclk1 + Tco + Tdata + Launch Edge
data required time(hold) = Tclk2+Latch Edge + Thold - Clock Uncertainty + CPR
Slack = data arrival time - data required time(set up)
参考特权同学时序约束P24。
总结
搞明白了这些概念,那么静态时序分析其实也就很简单了。
上文出现了很多的公式,看起来有点晦涩难懂,但是没关系,
这些公示实际上仅仅是起到一个辅助理解时序分析的作用,并不需要去记忆,更也不需要熟练掌握这些公式来生搬硬套时序分析。
因为现在的综合工具已经足够智能了,你只需要提出时序约束的要求,综合工具vivado自然会对这些路径一一进行计算,
你所要做的仅仅是找到时序裕量为负的路径并想办法改善即可。
此外,通过对上面公式的分析,可以让我们更好的了解静态时序分析的本质。
根据上文有(1)和(2)两式:
- 建立时间裕量:Setup Slack = Tperiod + Tskew - (Tsu + Tco +Tdata)----(1)
- 保持时间裕量:Hold Slack = (Tco +Tdata - Th) - Tskew ----(2)
其中,Tperiod 是时钟周期;Tskew 是寄存器之间的时钟偏差,产生的原因是时钟到达不同的寄存器的时钟端口有延迟;Tsu 与 Th分别是寄存器的建立时间要求和保持时间要求,这是寄存器的固有属性,只和FPGA的型号相关;Tco 是从寄存器的输入端口到输出端口所需要的延时时间,同样是寄存器的固有属性;Tdata是寄存器之间的组合逻辑和走线延迟等之和,这与具体设计有关,平时我们大多都是通过减少Tdata来使得时间裕量为正,以此实现设计的时序收敛。
Tskew实际上是一个可以被忽略掉的较小值(走了全局时钟树),所以把它去掉,再对 (1)和(2)两式做变形(Slack>0需被满足),然后有(3)和(4)两式
重要!
- Tperiod >(Tsu + Tco +Tdata)----(3)
- (Tco +Tdata ) > Th ----(4)
(3)式子中的(Tsu + Tco +Tdata)代表数据从源寄存器到目的寄存器所消耗的时间,
即(Tsu + Tco +Tdata)< Tperiod 表示数据从源寄存器的采样时刻传到目的寄存器的采样时刻,不能超过一个时钟周期。
如果数据传输超过一个时钟周期,那么就会导致目的寄存器器开始采样的时候,从源寄存器出发的数据还没有传过来。
对于(4)式可以两边同时加上Tsu ,得到(5)式:
- (Tco +Tdata + Tsu ) > (Th + Tsu) ----(5)
(5)式子中的(Tsu + Tco +Tdata)代表数据从源寄存器到目的寄存器所消耗的时间,(Th + Tsu)是建立时间和保持时间之和,即寄存器的采样窗口时间。
那么(Tsu + Tco +Tdata) > Th + Tsu表示数据从源寄存器的采样时刻传到目的寄存器的采样时刻,至少要大于寄存器的采样窗口。
假如数据传输时间不大于采样窗口,则意味着数据的传输是特别快的,有可能目的寄存器开始采样时,源寄存器的采样仍没有结束,如果这个时候输入端数据有变化,那么不仅源寄存器处于亚稳态,目的寄存器也将处于亚稳态!
所以,数据传输延时既不能太大以至于超过一个时钟周期,也不能太小以至于小于触发器采样窗口的宽度。这就是静态时序分析的物理意义了。