目录
一、前言
理解时序报告以及时序约束是掌握FPGA设计必不可少的技能,是FPGA设计中时序收敛的两个关键组成部分。本文将从新手角度介绍相关的内容,从而达到初步理解的水平。
二、时序分析
时序分析是FPGA开发工具如Vivado对用户设计评估在指定工作频率是否存在风险的分析,如果分析结果存在违例(slack小于0),则设计存在风险。
2.1 时序分析
时序分析是基于特定的时序模型(如OCV模型、NLDM模型、AOCV模型、POCV模型等)结合用户做的时序约束进行的。模型的建立和工艺角有关,通常工艺角需从Process(工艺)、Voltage(电压)、Temperature(温度)三个角度考虑,根据这三个条件极端的组合分为slow corner(慢速条件)和fast corner(快速条件)。
2.2 时序路径类型
下图为FPGA芯片与外围电路连接的简略图,中间虚线框内为FPGA器件,左右两侧的开发板器件分别为输入到FPG芯片和FPGA芯片输出到外围器件,FPGA芯片通过DIN和DOUT口与外围电路连接。
将两个寄存器REG A和REG B为界限,时序路径可分为4类:
路径1:外部器件到FPGA内部的寄存器单元REG A,
路径2:输入端口DIN直连的寄存器REG A到输出端口DOUT直连的寄存器REG B
路径3:输入寄存器REG A到输出寄存器REG B
路径4:芯片输入端口DIN到输出端口DOUT间的路径
2.3 时序分析类型
时序分析从信号角度看是对时序单元上时钟信号和非时钟信号间的延时计算,是否满足时序单元中时钟信号正确捕获到非时钟信号的要求,非时钟信号分为普通数据信号和置位/复位信号。如果是普通信号如触发器的D端口,使能端口CE与时钟信号的分析为setup/hold分析;如果是置位/复位信号则为recovery/removal分析
三、时序约束
以Vivado工具为例,时序约束根据约束特性可分为5类:时钟特性约束,端口路径延时,时序例外约束,断言约束,其他类,具体的约束命令如下图
时钟特性约束:Vivado时序工具是通过时钟特性来计算时序路径要求,通过slack计算来报告设计的时序阈值。因此,必须准确的约束时钟的特性才能准确且全面地覆盖到所有时序路径。理想的时钟通过周期,相位,频率即可完整描述其特性,但实际时钟信号是通过时钟树来传播,时钟边沿可能因为噪声和硬件特性而产生延时,即时钟网络延时(clock network latency)和时钟不确定性(clock uncertainty)。时钟不确定性包括时钟抖动,相位错误,以及其他的附加不确定性,这些时钟特性都需要通过对应的时钟约束来加入。
端口约束:FPGA与外部的信号通信都是通过port来实现的,port也是FPGA的边界。因此,必须通过set_input_delay和set_output_delay来准确建模外部时延情况。
例外约束:默认情况下,时序分析的path requirement选取规则是对发起时钟和捕获时钟在公共周期内,捕获时钟的有效沿时间减去启动时钟的有效沿,setup分析取最小值,hold分析取最大值。对于一些场景则不适用该规则,如传输数据从路径的起点到终点需要设置指定的周期数进行分析,使用set_multicycle_path约束;对于一些逻辑路径不应该被分析时,则使用set_false_path路径;对于一些路径需要限制最大和最小时延,则需设置set_max_delay和set_min_delay约束。
断言约束:断言约束是作用于时序路径间的约束,不影响其他约束的优先级,也不会覆盖或者被clock groups,max delays,false paths,multicycle paths四类时序例外约束所覆盖。对于断言约束也不会影响不会影响最终的结果,可理解为人为对一些信号设置检查条件,然后报告出见检查结果。
四、时序报告
4.1 时序报告概览
在执行完时序分析后,在Intra-Clock Paths和Inter-Clock Paths中可以找到时序路径分析结果,选中任意一对时钟,右侧显示时钟对下的时序路径。--------------------
Name: 路径的名称,格式为"Path x",x为软件根据路径的slack值从小到大的顺序进行排序的序号
Slack:Slack值为正值说明在限定的时序约束下,路径满足时序要求,Slack值的计算公式为
最大延时分析(setup/recovery)=数据要求的到达时间-数据实际到达时间
最小延时分析(hold/removal)=数据实际到达时间-数据要求的到达时间
Hign Fanout:数据路径Data Path上取各段net扇出值中的最大值
From: 路径的起点,也是源时钟发送数据的位置,通常是时序单元的时钟引脚或者是输入端口。
To: 时序路径的终点或者是捕获数据的目的时钟,通常是时序单元的数据输入引脚或是输出端口
Exception:如果时序路径上设有时序例外约束(set max delay/set min delay/set multicycle delay/set false path),则该列显示对应时序例外约束
Requirement: 时序路径要求时间,当源时钟和目的时钟是同一个时钟时,通常对于setup/recovery,requirement的值是一个时钟周期,hold/removal分析该值是0ns。当源时钟和目的时钟不是同一个时钟时,requirement是两个时钟对应边沿的最小差值。同时,如果有其他时序例外约束,如multicycle path, max delay and min delay会影响该值的计算。
Total Delay: 数据路径总的延时值,包含逻辑单元延时和逻辑单元间的连线延时,不考虑时钟延时
Levels: 在数据路径上,除去路径的起点和终点,中间连接的逻辑单元的级数
Logic Delay:数据路径中逻辑单元的延时
Net Delay: 数据路径中连接线上的延时
Clock Uncertainty:时钟边沿对上的所有可能导致时钟延时变化的总和,包括系统时钟抖动和离散抖动,以及用户使用set_clock_uncertainty约束的不确定值
Inter SLR Compensation:仅仅在7系列的SSI器件上,穿过SRL边界的路径为确保安全的分析需要另外的裕量。
4.2 Summary
Summary中为具体时序时序路径的总结信息,包含内容如下图
Name: 路径的名称,格式为"Path x",x为软件根据路径的slack值从小到大的顺序进行排序的序号
Slack:Slack值为正值说明在限定的时序约束下,路径满足时序要求,Slack值的计算公式为
最大延时分析(setup/recovery)=数据要求的到达时间-数据实际到达时间
最小延时分析(hold/removal)=数据实际到达时间-数据要求的到达时间
Source: 路径的起点,也是源时钟发送数据的位置,通常是时序单元的时钟引脚或者是输入端口。同时,在后面也显示了时序单元的有效触发边沿是上升沿还是下降沿,以及源时钟的周期与波形
Destination: 时序路径的终点或者是捕获数据的目的时钟,通常是时序单元的数据输入引脚或是输出端口,和Source类似,后面的信息也显示了时序单元的有效触发边沿以及捕获时钟的波形
Path Group: 路径终点所属的时序组,即捕获时钟组,但对于异步时序检查(recovery/removal)是默认属于async_default时序组,用于定义的组也可以出现,改分类主要是方便查看报告
Path Type: 路径类型,分为Max/Min+Slow/Fast的组合,Max表示用最大延时值计算数据路径延时,对应于setup/recovery分析;Min表示用最小延时值计算数据路径延时,对应于hold/removal分析。对于起点为复位端口的setup分析更多是fast corner,其他正常的起点通常是slow corner。
Requirement: 时序路径要求时间,当源时钟和目的时钟是同一个时钟时,通常对于setup/recovery,requirement的值时一个时钟周期,hold/removal分析该值是0ns。当源时钟和目的时钟不是同一个时钟时,requirement是两个时钟对应边沿的最小差值。同时,如果有其他时序例外约束,如multicycle path, max delay and min delay会影响该值的计算。
Data Path Delay: 逻辑单元上的延时,不考虑时钟延时
Logic Levels: 在逻辑路径上,除去起点和终点,中间连接的逻辑单元的级数
Clock Path Skew: 源时钟的启动边沿与目的时钟的捕获沿的延时差,如果存在时钟悲观校正,则要加上改该值
Clock Path Skew的计算公式如下图
a) Destination Clock Delay (DCD):目的时钟到路径终点的延时,如果是最大延时分析(setup/recovery),考虑的是最小的网线延时和单元逻辑延时;如果是最小延时分析(hold/removal),考虑的是最大的网线延时和单元逻辑延时。
b) Source Clock Delay (SCD):源时钟到达路径起点的延时,如果是最大延时分析(setup/recovery),考虑的是最小的网线延时和单元逻辑延时;如果是最小延时分析(hold/removal),考虑的是最大的网线延时和单元逻辑延时。
c) Clock Pessimism Removal (CPR):在源时钟和目的时钟存在共同的路径时,在共同路径上将不会存在时钟偏斜,但在Max/Min分析时将存在时钟偏斜值考虑进去了,导致结果更悲观了
Clock Uncertainty: 时钟边沿对上的所有可能导致时钟延时变化的总和,包括系统时钟抖动和离散抖动,以及用户使用set_clock_uncertainty约束的不确定值,计算公式如下
a)Total System Jitter:包括源时钟和目的时钟的系统抖动,为了修正系统抖动,可以使用set_system_jitter约束,另外,虚拟时钟是理想时钟,无系统抖动
b)Total Input Jitter: 包含了源时钟和目的时钟的输入抖动,使用set_input_jitter可以单独约束每个主时钟的输入抖动。对于生成时钟的输入抖动,是基于主时钟的抖动以及时钟资源穿过的单元。同样的,对于虚拟时钟也没有输入抖动。
c)Discrete Jitte:离散抖动是因为使用了硬件原语如MMCM和PLL将会带来离散抖动
Phase Error:在使用了硬件原语如MMCM和PLL时,也会带来两个时钟信号间的相位错误
d)User Uncertainty:使用set_clock_uncertainty约束的不确定度
以上是默认显示的,在设置了一些约束时会有一些其他uncertainty
Input Delay:使用了set_input_delay约束输入端口时就会有该行,值为约束的值
Output Delay:使用了set_output_delay约束输入端口时就会有该行,值为约束的值
Inter-SLR Compensation:仅仅在7系列的SSI器件上,穿过SRL边界的路径为确保安全的分析需要另外的裕量。
Clock Domain Crossing: 除了被set_clock_groups和set_false_path约束的需不考虑外,其余跨时钟路径将会被分析
4.3 Source Clock Path
源时钟路径是源时钟从来源处到时序路径起点的路径
内容包含五列,Delay Type,Incr,Path,Location,Neetlist Resource(s)
Delay Type:延时类型,主要分为net和cell,net后面带有fo,表示网线的扇出大小。同时net可有3种状态:Unplaced表示net的driver和load还还未进行布局,Estimated表示net的driver和load已布局,但布线不是实际的布线,Routed表示net的driver和load已布局,并且已完成布线。对于cell,后面有描述传输的单元,单击cell,选择“show description”可以查看详细信息,包含改cell的输入pin,以及输出pin以及时序类型
Incr(ns):显示的是各net,cell对应的传输时延值,单位为ns,对于input/output delay或uncertainty约束也会显示约束的值。同时前面会有r或f,分别表示上升riging和下降falling,用于表示该cell启动沿或捕获沿的默认sense
Path(ns):时序路径到达该位置累积的延时值,在任意一行,该值等于该行等于前面所有的值加起来
Location:对于cell布局的位置坐标
Netlist Resource(s):网表对象的名称,前面的符号向右表示输入,向左表示输出
4.4 Data Path
数据路径是数据从路径起点到路径终点的路径,相关内容和源时钟路径类似,该延时值的起点是以源时钟为基础,下图的1.834为源时钟延时1.737加上FDCE的内部延时0.097,可以看出是从一个FDCE的Q端口到另一个FDCE的D端口
4.5 Destination Clock Path
目的时钟路径是目的时钟从时钟来源处到时序路径终点的路径,总体内容和源时钟路径大体相同,但在最后面会多出两行clock pessimism,clock uncertainty,clock pessimism即为前面提到的CPR,uncertainty即为在summary中的clock uncertainty