赞
踩
时序分析又叫静态时序分析,它主要是从FPGA设计实现的角度出发得出结论,看所期望的逻辑功能是否能够被目前工艺条件下的某款具体FPGA芯片所实现,和功能仿真类似,时序分析对于任何一个项目的开发来说几乎都是必须的.
基本时序检查 :
(1) 发送沿 : 指发送数据的源时钟的活动边沿
(2) 捕获边沿 :指捕获数据的目的时钟的活动边沿
(3) 源时钟 : 指发送数据的时钟
(4) 目的时钟 : 指捕获数据的时钟
(5) 建立要求 : 指定义了最苛刻建立约束的发送沿和捕获沿之间的关系
(6) 建立关系 : 指由时序分析工具验证的建立检查
(7) 保持要求 : 指定义了最苛刻保持约束的发送沿和捕获沿之间的关系
(8) 保持关系 : 指由时序分析工具验证的保持检查
建立时间(Setup Time):
是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,即在CLK上升沿来之前,数据必须提前一个最小时间量预先准备好。
保持时间(HoldTime):
是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间,即在CLK上升沿到来之后,数据必须保持一个最小时间量不能变化。
D触发器介绍 :
Tsu : 建立时间,时钟信号边沿到来之前,端口D上的数据持续稳定不变的时间。
Th : 保持时间,与建立时间相对应,保持时间是指在有效的时钟边沿信号到来之后,端口D上的数据保持稳定不变的时间。
Tco : 时钟至输出延迟,当寄存器CLK端口的时间信号与D端口的数据信号的时序关系满足建立时间和保持时间要求时,Tco指的就是从时钟有效边沿到达寄存器开始,到端口Q上稳定得到D端口采样的时间。
时序分析原理:
对于一个FPGA设计,在获得了其对应的各种时间参数、时间延迟,就可以利用对应的静态时序分析工具来对其进行时序分析工作。
一道时序分析的案例: 如何通过人脑来进行时序分析
① : 寄存器R1、R2、R3的参数一致,其建立时间要求为2ns,保持时间要求为1ns,Tco均为1.5ns;
②: 时钟信号从输入管脚到达各个寄存器的时间具有一定差别,其中skew1、skew2、skew3、skew4、分别为4ns,3ns,5ns,6ns;
③: 所有数据线的线延迟Tline均为2ns;
④: 非门的门延迟为2ns,与门的门延迟为3ns;
⑤: 输入时钟CLKIN为50Mhz理想时钟,输入数据D1、D2、的采样率也为50Mhz,它们的slew rate均为理想情况(无穷大),并且时钟的有效边沿上升沿对齐数据的中心;
⑥: 输出端要求数据Q相对于CLKOUT的上升沿至少具有3ns的建立时间和2ns的保持时间;
分析电路:
上达FPGA 芯片能否 正路工作取洪子两个系什,第一,其内部的各个奇存器能否正常工作;第二,口 与CIROUT 的关系能吞满足后级电路的要求。如果再细分,FPCA 芯片能否正常工作取決于三个条件:第一,能否正确地买集外部数据;第二,FPGA 内部能否正确地处理数据;第三,FPGA 的输出是否满足后级电路的要求。
而对于三个条件的划分方法,条件一和条件三尽管数据流方向不同,但其共性都是跟外界
打交道,西此可以综合称之为 FPGA 的接口条件。相对应的,条件二可称之为内部时钟条件。
首先,为整个 FPGA 设计指定参考。时刻,并令。时刻时,CIKIN 处正好迎来一个时钟的
上升沿。
由手本例电路中的奇存器在每个时钟有效边沿时刻所面临的工作状态都是一样的,因此,
对于每一个奇存器以区后级电路,只需要分析1个边沿情況即可。
那么,比。时刻的时钟上升沿为参考,对于宥存器 R1 来说,有效时钟上升沿传递到其时
钟端口的时间是0ns+skew1=4 ns,显然,正常工作时,它是应该正确采样到D1 端口从
-10 ns持续到 10 ns 的数据符号。由于2ns 线延迟的影响,导致 R1 的口端口上对应的数据
稳定区间应该是一8ns~12 ns。据此可以求出奇存器 R1 的建立时间和保持时间如下:
Tsu = 4 - (-8) = 12ns
Th = 12 - 4 = 8ns
由于Tsu>=2ns、Th>=1ns,故R1可以正常工作。
时序约束语句 :
对于所有的时序路径,我们都要明确其起点和终点,这4类时序路径的起点和终点分别如下表
时序路径 | 应用约束 |
①输入端口到FPGA内部第一级触发器的路径 | set_input_delay |
②FPGA内部触发器之间的路径 | create_clock |
③FPGA内部末级触发器到输出端口的路径 | set_output_delay |
④FPGA输入端口到输出端口的路径 | set_max_delay |
时序模型:
典型的时序模型如下图所示,一个完整的时序路径包括源时钟路径、数据路径和目的时钟路径,也可以表示为触发器+组合逻辑+触发器的模型。
该时序模型的要求为(公式) :
Tclk ≥ Tco + Tlogic + Trouting + Tsetup - Tskew
其中,Tco为发端寄存器时钟到输出时间;Tlogic为组合逻辑延迟;Trouting为两级寄存器之间的布线延迟;Tsetup为收端寄存器建立时间;Tskew为两级寄存器的时钟歪斜,其值等于时钟同边沿到达两个寄存器时钟端口的时间差;Tclk为系统所能达到的最小时钟周期。
用下面这个图来表示时序关系就更加容易理解了。为什么要减去Tskew,下面这个图也更加直观。
在公式中,Tco跟Tsu一样,也取决于芯片工艺,因此,一旦芯片型号选定就只能通过Tlogic和Trouting来改善Tclk。其中,Tlogic和代码风格有很大关系,Trouting和布局布线的策略有很大关系。
时序约束 :
①延迟约束: 延迟约束用的是set_input_delay
和set_output_delay
,分别用于input端和output端,其时钟源可以是时钟输入管脚,也可以是虚拟时钟。但需要注意的是,这个两个约束并不是起延迟的作用,具体原因下面分析。
inputDelay(max)=Tco(max)+TD(max) | inputDelay(min)=Tco(min)+TD(min) |
T_inputdelay = Tco + TD 当满足图中的时序时,最大延迟为2ns,最小延迟为1ns因此,需要加的时序约束为:
- create_clock -name sysclk -period 10 [get_ports clkin]
- set_input_delay 2 -max -clock sysclk [get_ports Datain]
- set_input_delay 1 -min -clock sysclk [get_ports Datain]
②:时钟周期约束使用create_clock
来创建时钟周期约束。使用方法为:
create_clock -name <name> -period <period> -waveform {<rise_time> <fall_time>} [get_ports <input_port>]
参数 | 含义 |
-name | 时钟名称 |
-period | 时钟周期,单位为ns |
-waveform | 波形参数,第一个参数为时钟的第一个上升沿时刻,第二个参数为时钟的第一个下降沿时刻 |
-add | 在同一时刻源上定义多个时钟时使用 |
这里的时钟必须是主时钟primary clock
,主时钟通常有两种情形:一种是时钟由外部时钟源提供,通过时钟引脚进入FPGA,该时钟引脚绑定的时钟为主时钟:另一种是高速收发器(GT)的时钟RXOUTCLK或TXOUTCLK。
当系统中有多个主时钟,且这几个主时钟之间存在确定的相位关系时,需要用到-waveform
参数。
③则时钟约束为:
- create_clock -name clk0 -period 10.0 -waveform {0 5} [get_ports clk0]
- create_clock -name clk1 -period 8.0 -waveform {2 8} [get_ports clk1]
最大最小延迟约束: 顾名思义,就是设置路径的max/min delay,主要应用场景有两个:
输入管脚的信号经过组合逻辑后直接输出到管脚
异步电路之间的最大最小延迟
- set_max_delay <delay> [-datapath_only] [-from <node_list>][-to <node_list>][-through <node_list>]
- set_min_delay <delay> [-from <node_list>] [-to <node_list>][-through <node_list>]
参数 | 含义 |
-from | 有效的起始节点包含:时钟,input(input)端口,或时序单元(寄存器,RAM)的时钟引脚. |
-to | 有效的终止节点包含:时钟,output(inout)端口或时序单元的数据端口. |
-through | 有效的节点包含:引脚,端口,线网. |
④多周期路径约束:在周期性约束的作用下,时序分析工具会认为该时钟域内寄存器的输出在每个时钟事件的到来都会发生变化,因此,理想情况下每个寄存器的保持时间均为一个时钟周期。可有时候,FPGA 设计的功能特征决定前级寄存器需要经历很发个时钟周期后才会发生次变化,这
样一来,如果仅仅对该时钟域添加周期约束,显然对这部分电路是过约束了如果这部分电路的逻辑比较简单,过约束并不会带来什么大问题;但如果这部分电路的逻辑比较复杂,,过约束很可能会导致时序分析的时候不通过。因此,为了能够正确地对这部分逻辑添加时序约束,需要要使用多周期路径约束,例如如下描述:
多周期约束的语句是:
set_multicycle_path <num_cycles> [-setup|-hold] [-start|-end][-from <startpoints>] [-to <endpoints>] [-through <pins|cells|nets>]
参数 | 含义 |
num_cycles [-setup -hold] | 建立/保持时间的周期个数 |
[-start -end] | 参数时钟选取 |
-from | 发起点 |
-to | 捕获点 |
-through | 经过点 |
⑤伪路径:如果两个时钟之间并不相关,默认情况下,时序分析工具是不会对这种跨时钟域情況进行分析的。但当它们之间又确实有着信息传递,而又关心其问的一些时间延迟时,可以使用跨时钟域路径约束也可以设置成伪路径不观察。
伪路径的约束为:
set_false_path [-setup] [-hold] [-from <node_list>] [-to <node_list>] [-through <node_list>]
-from
的节点应是有效的起始点.有效的起始点包含时钟对象,时序单元的clock引脚,或者input(or inout)原语;
-to
的节点应包含有效的终结点.一个有效的终结点包含时钟对象,output(or inout)原语端口,或者时序功能单元的数据输入端口;
-through
的节点应包括引脚,端口,或线网.当单独使用-through时,应注意所有路径中包含-through节点的路径都将被时序分析工具所忽略.
两个主时钟约束成异步时钟:
- create_clock -period 10 -name clk1 [get_ports clk1]
- create_clock -period 8 -name clk2 [get_ports clk2]
- set_clock_groups -asynchronous -group clk1 -group clk2
约束语句实在太多,这里只列出了一些经常使用的约束语句,使用其他约束语句可以自行查找!
EDA工具使用 :
拿一个时序比较差的案例做为实验对象 :
①建立时间的最差路径为:
建立时间(Setup) | 保持时间(Hold) |
最差的一个:-8.259ns | 最差的一个:-997.648ns |
总共差:-843.298ns | 总共差:-320489.219ns |
②进行时序分析:
打开冒着红点点,表示时序不满足,最上面的最差路径,可以从上到下开始分析可以最大程度上的优化。
Intra-ClockPaths 同步时钟域 OtherPath Groups 异步时钟域
开启一个进行分析 : From 到 TO
路径分析 : u_ad9851: 模块名称 delay_done_reg : 寄存器信号名称 regout: 输出标志
模块查看 :
起始在ad9851 至 终点 si5332 使用 :
使用此信号做了判断 :
时序优化 : 1:减少组合逻辑的使用,尽量使用时序完成操作. 2:减少IF ELSE 的使用尽量使用case来完成操作. : 优化完成后在此进行了时序分析,发现刚才的最差路径已经更换成了别的路径.以此类推一点一点优化可以大幅度提升程序的稳定性。
上面是分析的同步时钟域下的,下面分析异步时钟域.(原理类似,只是需要考虑亚稳态)
路径分析 : 打开第一条最差路径进行分析 ,
模块查看 : pos_cnv_pos_c 的寄存器是在50M下进行的赋值,而却是在dco_pos_i的上升沿使用,所以产生了时序不满足的情况.
时序优化 : 使用寄存器打两拍,或者使用FIFO、RAM 进行缓存。
异步时钟域全部满足拉。
在做时序分析之前还是先建议大家做好程序的流水线,减少时序不满足也可以有效避免亚稳态的产生,还可以加快综合的速度,减少cpu的负载。
常见时序收敛的手段 :
①逻辑化简和结构调整 [程序设计---> 编程思路 ---> 时空变换 ---> 时空变换之时域优化 ---> 分布调整] .
②缓存降频、逻辑拆分、流水线、使能链、模块输入输出寄存器处理.
③时钟上树:时钟树存在的意义就是要尽量保证时钟到达各个寄存器的延时差(skew)尽可 能地小,这也是为什么通常FPGA 设计的建立时间跟时钟周期密切相关,但保持时间却不受其影响。但是一旦在使用时钟信号之前忘记让它先通过时钟树网络,则时钟信号到达各个寄存器的路径长短便不可控,由于此时时钟、数据都是通过最基本的布线资源进行布线的,从而很可能会出现时钟延迟差大手路径延时的情况(也就是常说的数据传得比时钟还快),这样一来,便容易出现保持时间不足的时序冲突情况对于内部时钟域来说,保持时间不足十有八九是由于时钟信号没有上树,因此当出现这类问题时,首先应该仔细检查一下是否正确地使用了时钟信号而对于接口部分的保持时间不足,则依赖于数据和时钟的原始(或理想)相位差,以及时钟即数据的延迟差,不属于此范畴.
④改变设计思路:改变设计思路是解决时序冲突问题的一把双刃剑,它也许可以解决所有的时序冲突问题但也许会带来更令人头痛的问题(不仅仅限于新的时序冲突问题,还可能带来功能仿真资源占有率等方面的问题)。总之,如果己经竭尽全力还不能让当前设计或设计中的某个模块达到时序收敛,那么不妨试试换个思路重新编写某个模块或某个算法,也许会带来意想不到的效果。但是,改变设计思路也有逃避问题的嫌疑,我们不能一碰到难以解决的问题就想着改变设计思路,还是应该多思考如何解决当前问题,而不是总想着要逃避当前问题.
⑤手动布局布线:如果对编译器完成的布局、布线结果不满意,可以尝试通过人工干预或调整布局、布线的手段来达到时序约束的收敛。具体做法就是打开编译器中的布局、布线工具,然后通过拖拽的方式改变寄存器、查找表等资源在 FPGA 芯片中的位置,进而也改变原有的布线情况这样一来相关的路径延迟也会发生改变,从而有可能会产生比较好的结果。不过这种方法带有赌博性质,具有一定的运气成分,并且由于其不具有继承性和可重复性,所以往往不推荐使用.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。