亚稳态
1.概念
亚稳态是指触发器无法在某个规定时间内达到一个确定的状态,当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
从CMOS层级分析亚稳态产生的原因,下图是一个CMOS反相器的传输特性曲线:
其中BC段为MOS的放大器区,在BC端具有无限大的增益。将输入电压和输出电压相等的点即Vm=VDD/2称作是反相器的阈值电压,电平在这个点附近迅速完成了电平切换。
当输入电压处于0—V_IL时,反相器认为输入为低电平;当输入电压处于V_IH—VDD时,反相器认为输入为高电平。当输入电压处于V_IL—VIH之间时,反相器有可能会将其判断为低电平或高电平中的任意一种。
当输入数据不能够满足寄存器的建立时间和保持时间要求时,采样到的电压就可能会处于上述的V_IL和V_IH之间的区间,就会导致输出处于亚稳态。
2.危害
由于产生亚稳态后,寄存器Q端输出在稳定下来之前可能是毛刺、振荡、固定的某一电压值。在信号传输中产生亚稳态就会导致与其相连其他数字部件将其作出不同的判断,有的判断到“1”有的判断到“0”,有的也进入了亚稳态,数字部件就会逻辑混乱。
3.平均故障时间
平均故障时间指的是系统两次发生故障之间系统平均正常工作的时间,他是系统发生故障概率的倒数。用MTBF表示。平均故障间隔时间越长,系统越可靠。
t_MET代表寄存器从时钟上升沿触发后的时序余量时间;
C1、C2与器件有关的参数,器件的建立时间和保持时间越小,C2越小
f_DATA是数据的变化频率
f_CLK是接收时钟域的时钟频率
4.解决亚稳态的方法
亚稳态不能消除,只能降低其发生的概率。
我们从MTBF入手:当数据的变化频率和接收时钟域的时钟频率越低,C2越小,MTBF越大。
因此可有以下几种方法:
(1)降低时钟频率;
(2)采用反应更快的触发器;
(3)跨时钟域处理。
如果数字电路中出现了亚稳态现象,则可能导致整个系统失效;而出现亚稳态现象的最主要的原因就是寄存器在传输数据过程中发生了建立时间tsu或者保持时间th的违规。因此时序分析至关重要,只有正确的时序才能让整个系统无异常的跑起来。
时序分析
1.基本概念
1.1时钟抖动
理想的时钟信号是非常完美的正弦波,但是实际晶振产生的正弦波是存在一些时钟抖动的。那么什么是时钟抖动呢?时钟抖动,英文名叫做 Clock Jitter,是相对于理想时钟沿实际时钟存在不随时间积累的、时而超前、时而滞后的偏移称为时钟抖动,如下图所示:
1.2 时钟偏斜
时钟偏差:Clock Skew,是指同一个时钟域内的时钟信号到达数字电路各个部分(一般是指寄存器)所用时间的差异。时序分析的起点一般是源寄存器,终点一般是目标寄存器。时钟和其它信号的传输一样会有延时的。
1.3 时钟不确定性Uncertainty
Clock Uncertainty就是时钟的不确定性。时钟的不确定性主要是由 Clock Skew 和 Jitter 构成。因此 Clock Uncertainty = Clock Skew + Clock Jitter。一般标准的时序约束文件中,都需要加 Clock Uncertainty 的约束,这个约束是为了让时序分析更贴近真实的电路设计。
1.4 建立时间和保持时间
建立时间:Setup Time,缩写是 Tsu ,即在时钟上升沿之前数据必须稳定的最短时间。若不满足 setup time,数据无法进入寄存器,也就是说寄存器的数据采样会失败。(简单来说,建立时间就是数据变化必须在目标寄存器采样沿之前的最短时间)。
保持时间:Hold Time,缩写是 Th ,即在时钟上升沿之后数据必须稳定的最短时间。若不满足 hold time,数据也无法进入寄存器,也就是说寄存器的数据采样也会失败。(简单来说,保持时间就是数据变化必须在目标寄存器采样沿之后的最短时间)
总体来说,寄存器的采样需要同时满足建立时间和保持时间,如果不满足任何一个,那么寄存器可能采样失败从而进入亚稳态。
1.5 启动沿和锁存沿
寄存器发送数据和接收数据都是需要在时钟边沿进行的,因此对寄存器来说,都有一个发起沿和一个采样沿。
启动沿:lunch edge,是发送数据的时钟边沿,通常选择上升沿。
锁存沿:latch edge,是采样到该数据的时钟边沿,通常也是上升沿。理想情况这两个边沿会有一个时钟周期的差别。
2.基本步骤
2.1时序基本分析
时序分析是两个节点之间的时序分析,分为四种类型:
a. 管脚输入(PAD)和寄存器之间的路径(即 pin2reg)
从外部芯片到FPGA 的第一级寄存器的输入端口,这个部分包括 3 个延迟,分别是 Tco(外部芯片时钟到外部芯片寄存器输出延时),Input Delay(PCB 板子的输入走线延迟)和Internal Delay(FPGA 内部的输入走线延迟)。
b. 寄存器和寄存器之间的路径(即 reg2reg)
FPGA内部两个寄存器之间的路径包括 2 个延迟,分别是 Tco(FPGA内部时钟到内部寄存器输出延时)和 Data Path Delay(FPGA 内部的组合逻辑和数据走线延迟)。
c. 寄存器和管脚输出(PAD)之间的路径(即 reg2pin)
最后一级寄存器到外部芯片数据端口的路径部分包括 3 个延迟,分别是 Tco(FPGA内部时钟到内部寄存器输出延时),Internal Delay(FPGA 内部的输入走线延迟)和Output Delay(PCB 板子的输出走线延迟)。
d. 管脚输入(PAD)和管脚输出 (PAD)之间的路径(即 pin2pin)
端口到端口的路径这个部分包括 1 个延迟,即 Data PathDelay(FPGA 内部的组合逻辑和数据走线延迟)。
2.2 理想建立时间和保持时间
在 T0 的时候,reg1 向 reg2 发送数据1,该数据长达一个周期时间,这段时间也称为“建立关系时间”,也就是图中T0红色箭头(启动沿)和T1红色箭头(锁存沿)之间的时间。理想情况下,CLK1与CLK2同频率,所以:
理想建立时间关系值=时钟周期
保存时间:reg2 用来锁存 reg1 发送过来数据所需的“最小时间”
在 T0 的时候 CLK1 的启动沿(红色的箭头↑)使得 reg1 向 reg2 发送数据。然后在 T1 的时候CLK2 的锁存沿(绿色箭头↑)使得 reg2 保存 reg1 发送过来的数据。换句话说,reg1 在 T0 向 reg2 发送的数据,而 reg2 乘数据还没有更新之前,reg2 必须迅速的将 reg1 在 T0 发送过来的数据保存起来。保持关系值 = 0ns
2.3实际建立时间和余量分析
在实际电路传输过程中,时钟和数据传输有一定的延迟,寄存器锁存数据和寄存器输出数据都有一定延迟,如下图所示:
Tclk1和Tclk2是时钟走线延时,由时钟源到两个寄存器的延迟时间
Tdata 是指数据路径延迟,数据由上一节点输出端,经过走线到下一节点输入端的延迟时间
Tco 是数据从寄存器输入端到寄存器输出端需要的延迟时间
Tsu是寄存器在锁存沿之前需要的数据"最小准备时间"
Th 是寄存器在锁存数据过后需要的数据“最小保持时间
其中Tco、Tsu、Th是由FPGA出厂就自带的,不同的工艺、不同的芯片型号,这三个都不同。
3.总结
数据到达时间 Data Arrival time = Tclk1 + Tco + Tdata
数据锁存时间 Data Required Time = 锁存沿时间 + Tclk2 - Tsu
建立余量公式Setup Slack= 数据锁存时间 - 数据抵达时间
数据保持时间 Data Hold Time = Tclk1 + Tco + Tdata +时钟周期
数据锁存时间 Data Required Time = 锁存沿 + Tclk2 + Th
保持余量 = 数据保持时间 - 数据锁存时间
vivado时序报告
最左边框中:
design timing summary:整个设计的时序总结,如右边两个方框所示
clock summary:整个设计里所有使用的时钟
intra clock paths:相同时钟域路径
inter clock paths:异步时钟域路径
中间显示的是建立时间总共的信息:
①:最差建立时间余量
②:总的负建立时间余量之和
③:建立时间违规的节点路径数量
④:总的节点建立时间路径数量
偏右显示的是保持时间总共的信息:
①:最差的保持时间余量
②:总的负保持时间余量之和
③:保持时间违规的节点路径数量
④:总的节点保持时间路径数量
点击intra clock paths中的一个:
右侧会显示最差的时序的路径(默认十条),点击path1:
slack为该路径的时序余量,等于Data Required Time - Data Arrival time
source该路径源时钟,这里是50M,周期20.000ns
destinnationi该路径目的时钟,因为这里是同时钟域下的节点路径,所以也是50M,周期20.000ns
理想的建立时间为一个周期,参考FPGA静态时序分析与约束(二)、时序分析
data path delay这条路径总的数据延迟时间,Tdata
skew时钟偏斜
source clock path源时钟路径:
时钟从外部管脚进来,经过IBUF,延迟了0.845ns
再经过走线net 延迟了2.140ns
然后进入BUFG延迟了0.120ns
最后经过走线net延迟了1.624ns,到达源寄存器时钟端口
总共源时钟路径Tclk1 = 0.845 + 2.14 + 0.12 + 1.624 = 4.729ns
数据路径(数据抵达时间):14.635 ns
目的时钟路径(数据锁存时间):16.965 ns
根据建立余量公式Setup Slack= 数据锁存时间 - 数据抵达时间=16.965-14.635=2.33ns
时钟约束
我们已经掌握了时序分析基本原理。但是,综合工具不知道我们的设计时钟频率是多大,我们想要的设计需求延时是多少,外部进来的时钟和数据之间的走线延时是多少,就没办法给出正确的时序报告以及违规路径。因此时序约束是必不可少的,只有正确的时序设计加上合理的时序约束,整个设计系统才能高效的运转。
一、什么是时序约束?
简单理解为:
设计者根据实际的系统功能,通过时序约束的方式提出时序要求
FPGA 编译工具根据设计者的时序要求,进行布局布线
编译完成后,FPGA 编译工具还需要针对布局布线的结果,套用特定的时序模型(FPGA 器件厂商能够使用这样的模型,对 FPGA 布局布线后的每一个逻辑电路和走线计算出延时信息),给出最终的时序分析和报告
设计者通过查看时序报告;确认布局布线后的时序结果是否满足设计要求
二、约束文件
vivado的约束文件后缀为.XDC。文件里的语法为XDC语言,和TCL语言类似,都属于顺序语言。
必须先定义变量,然后才能加以使用。同样,必须先定义时序时钟,然后才能将其用于其他约束中
对于覆盖相同路径并具有相同优先级的等效约束,适用最后一项约束
当多个时序例外覆盖同一条路径时,适用具有更高优先级的约束
因此在进行时序约束时需要考虑一下约束的顺序。以下是xilinx官方推荐的约束顺序:
从时序约束本身来说,如上图所示,通常可以分为以下 4 个主要步骤进行,即时钟约束(Create Clock)、输入/输出接口约束(Input/Output Delays,I/O 约束)、时钟分组和跨时钟约束(Clock Groups and CDC)、时序例外约束(Timing Exceptions)。
一个工程里可以拥有多个约束文件,根据设计需求可以有以下建议:
对于小型设计团队开发的简单设计:
1 个文件存储所有约束
1 个文件存储物理约束 + 1 个文件存储时序约束
1 个文件存储物理约束 + 1 个文件存储时序(综合)+ 1 个文件存储时序(实现)
对于复杂设计(含多个 IP 核或多个设计团队):
1 个文件存储顶层时序约束 + 1 个文件存储顶层物理约束 + 1 个文件对应 1 个 IP
当使用多个 XDC 文件时,必须特别留意时钟定义,并确认从属关系排序是否正确,物理约束可能位于任意约束文件中的任意位置。