FPGA时序约束

作者&投稿:仉苇 (若有异议请与网页底部的电邮联系)
~ https://my.oschina.net/u/4583591/blog/4455472

时序分析本质上就是一种时序检查,目的是检查设计中所有的D触发器是否能够正常工作,也就是检查D触发器的同步端口(数据输入端口)的变化是否满足建立时间要求(Setup)和保持时间要求(Hold);检查D触发器的异步端口(异步复位端口)的变化是否满足恢复时间要求(Recovery)和移除时间要求(Removal)。

时序分析包括静态时序分析(STA)和动态时序分析。

静态时序分析使用的工具:

动态时序分析使用的工具:

撰写基本的时序约束文件,告知时序引擎一些必要的信息(比如时钟,输入输出延时等)。若没有正确的时序约束,那么时序分析的结果是没有意义的。

第一种,从FPGA的输入端口到目的寄存器的数据输入端口 。

第二种,从源寄存器的时钟端口到目的寄存器的数据输入端口。

第三种,从源寄存器的时钟端口到FPGA的输出端口。

第四种,从FPGA的输入端口到FPGA的输出端口。

Data Arrival time = lauch_edge + Tclka + Tco + Tdata(Tlogic+Tnet)

Data Require Time = capture edge + Tclkb - Tsu

Setup Slack= Data Require Time - Data Arrival Time

Setup Slack = (Capture edge – Launch edge)+ (destination clk delay – source clk delay)- Setup time - clk uncertainty – datapath delay

Setup Slack = Setup Requirement(一定大于0) + clk skew – Tsu – Tclk uncertainty – Tlogic – Tnet - Tco

① Setup Requirement 与实际情况不符

建立时间需求过小,这种情况通常会在同步跨时钟域路径中出现,在同步跨时钟域路径中的源时钟频率与目的时钟频率的相位关系虽然是已知的,但是时序引擎默认选择的捕获沿通常都是错误的,需要用户通过多周期路径约束的方式手动修正建立时间需求。比如下图中,两个同频不同相的同步时钟,时序引擎默认选择的捕获沿是目的时钟第二个上升沿,导致建立时间需求非常小,最终肯定会导致时序违例。

② clk skew为负值,且很大

通常情况下,同一个时钟下的时钟歪斜不应该超过300ps,同步跨时钟域路径的时钟歪斜不应该超过500ps,异步跨时钟域路径的时钟歪斜一般比较大,因为它们的时钟源不同。当出现时钟歪斜大的情况时:

③Tsu/Tco大

当设计中使用Block(DSP/Block RAM等)时,应该要注意以下问题。对于以这些Block为时序路径的起点或终点的时序路径,这些Block的Tsu/Th/Tco都比普通的寄存器大,而且这些Block的布线延时和时钟歪斜比较大。所以当使用这些Block作为时序路径的终点时,它的起点一定要是触发器,比如说一个Block RAM的写数据信号,输入进Block前最好打一拍。当使用这些Block作为时序路径的起点时,应该使用Block 内部的输出寄存器,比如使用由Block RAM组成的FIFO时,尽量不要使用首字置出的,而使用打一拍后输出的,使用后者可以显著降低Tco。当时序路径为从一个Block到另一个Block时,中间需要进行打拍操作。当使用这些Block的控制端口时,应该保证这些控制信号的低扇出,如使用由Block RAM组成的FIFO时,应该尽量降低读/写能信/地址信号的扇出。

④Tlogic大

一般情况下,逻辑延时与时序路径的逻辑层级数息息相关,逻辑层级是指时序路径的起点和终点之间组合逻辑单元(LUT)的个数,而逻辑层级多一级意味着多1个LUT的延时加1条连接LUT的网线延时。通常一级逻辑层级的延时标准是1个LUT加1根网线的总延迟为0.5ns,如果某条路径的逻辑级数大于时钟周期/0.5ns,那么这条路径就被称为长路径。

常用的处理长路径的方案有两种:

⑤Tnet大

一般情况下,布线延迟与设计整体或局部模块的资源利用率以及拥塞程度息息相关。在正常情况下,一条网线的延时小于1ns,在发生拥塞的区域,网线的延时可能达到若干ns,导致布线延时显著增加。为了解决布线延迟大,需要从降低资源利用率和降低拥塞程度下手,比如某个模块使用了大量的寄存器堆,占用了大量的资源,此时应该考虑使用Block RAM代替这些寄存器堆;某个模块使用了大量的数据选择器,此时应该考虑如何优化这些数据选择器;某个模块的控制信号扇出比较大,与其他模块的互联很重,此时应该考虑如何降低这些信号的扇出;某条时序路径的起点或终点是Block,由于Block的位置比较固定,所以Block的布线延迟会大一些。最后需要强调的是,一定要额外关注高扇出的网线也会对布线延时产生影响。🔺TimeQuest时序分析(Setup)[图片上传失败...(image-23b6a0-1596829289696)]

①确定保持时间要求(确定发起时钟沿和捕获时钟沿)

保持时间要求是以建立时间要求为基础的,保持时间要求有两种:

根据所有的建立时间需求找到所有的保持时间需求,并从保持时间需求(可正可负)中找到最大的保持时间需求。

②计算数据的需求时间

③计算数据的到达时间

④计算Hold up的裕量(slack)

Data Arrival time(new data) = lauch edge + Tclka + Tco + Tdata(Tlogic+Tnet)

Data Require time = capture edge + Tclkb + Th

Hold up slack = Data Arrival time - Data Require time

Holdup Slack = (lauch edge - capture edge) + (Tclka – Tclkb) + Tco + Tdata(Tlogic+Tnet) -Th

Holdup Slack = Tco + Tdata(Tlogic+Tnet) -Th - Holdup Requirement - clk skew

Hold up Slack为负的情况比较少见,当Setup Slack有较大裕量时,通常工具会自动插入延时来增加Hold up Slack。

①保持时间需求大于0(通常由时序引擎选择错误的捕获沿导致)

②时钟歪斜大于300ps(通常由时钟路径上的组合逻辑导致)

③Th过大(通常由时序路径终点为Block导致)

时序引擎能够正确分析4种时序路径的前提是,用户已经进行了正确的时序约束。时序约束本质上就是告知时序引擎一些进行时序分析所必要的信息,这些信息只能由用户主动告知,时序引擎对有些信息可以自动推断,但是推断得到的信息不一定正确。

首先用户必须要正确的约束时钟,时序引擎才能根据时钟信息进行各种时序检查。

用户约束时钟时,一般有两种类型的时钟需要约束。

①主时钟(Primary Clock)约束

使用Create_clock进行时序约束

全局时钟输入引脚是ClkIn,时钟周期10ns,占空比25%,相移90度。

②生成时钟(Generated Clock)约束

用Create_generated_clock进行时序约束 每个生成时钟都会对应一个时钟源(Master_clk),这个时钟源可以是Primary Clock或者另一个Generated Clock。在约束生成时钟时,用户不需要描述生成时钟的周期和波形,只需要描述由Master_clk经过了怎样的变化而产生的生成时钟即可。比如经过分频(-devide_by),倍频(-multiply_by),反相(-invert),相移(-edge_shift)等等操作。

当生成时钟需要进行相移时,使用-edge_shift选项。-edge_shift不能与-divide_by/-multipl_by/-invert同时使用 。

时序引擎默认情况下会分析所有时钟之间的时序路径,用户可以通过时钟分组( set_clock_group)命令或伪路径(set_false_path)命来关闭一部分路径的时序分析。

①同步时钟(synchronous clock)

两个时钟之间的相对相位关系是固定的(两个时钟来源于同一个Primary clock),并且这两个时钟的频率的最小公共周期是个整数。比如一个生成时钟(200M)和该生成时钟的Master_clk(100M)之间就属于同步时钟关系,因为这两个时钟的相位关系肯定是确定的,并且可以找到两个时钟的最小公共周期。通常情况下,一个Primary Clock和它产生的生成时钟之间都属于同步时钟关系,除非找不到最小公共周期。 **属于同步时钟关系的两个时钟之间的路径是可以进行时序分析的。

②异步时钟( asynchronous clock )

两个时钟之间的相对相位关系不确定。比如FPGA上两个晶振分别产生两个Primary clock(相对相位关系不固定),这两个Primary clock分别从FPGA的两个全局时钟引脚输入给两个MMCM,由两个MMCM分别产生的生成时钟之间属于异步时钟。一般情况下,不同的Primary clock之间都属于异步时钟,这些Primary clock分别产生的生成时钟之间也属于异步时钟关系。 **属于异步时钟关系的两个时钟之间的路径无法进行正确的时序分析。

一般情况下,如果用户不通过时钟分组对时钟之间的关系进行约束,时序引擎会默认所有的时钟之间都属于同步时钟关系。

③不可扩宽的时钟(unexpandable clock)

对于这类时钟,时序引擎无法在1000个时钟周期内找到两个时钟的公共周期,时序引擎就会从这1000个时钟周期中找到建立时间需求最差的情况,并进行时序分析,然而它不一定FPGA实际允许过程中建立时间需求最差的情况,因为在1000个时钟周期外可能还会有建立时间需求更差的情况,这样一来,时序引擎的分析结果就无法保证该路径一定不会出现问题,所以时序引擎的分析结果也就变的无意义。比如说由同一个Primary Clock驱动的两个MMCM的生成时钟分别是clk0(5.125ns)和clk1(6.666ns),虽然它们的相对相位关系是固定的,但是时序引擎无法保证对两个时钟之间路径的分析属于最差情况,这种情况和异步时钟之间的时序分析类似,时序分析的结果都看起来正常,但是这个结果确是不可信的。所以对这种时钟的处理方式与处理异步时钟是相同的,用户都需要进行跨时钟域的操作。

总结:异步时钟和不可扩展的时钟之间的路径都无法进行正确的时序分析,所以在时序分析之前,需要使用set_clock_group对时钟进行分组,从而将这些无法进行正确时序分析的路径忽略掉。

Input delay概念

Input delay计算

Max Input Delay = Tco(Max) + Tpcb(Max) - Clk skew(Min)

Min Input Delay = Tco(Min) + Tpcb(Min) - Clk skew(Max)

Input delay约束

Output delay概念

Output delay计算

Max Output Delay = Tpcb(Max) + Tsu - Clk skew(Min)

Min Output Delay = Tpcb(Min) - Th - Clk skew(Max)

Output delay约束

时序引擎默认情况下会在建立时间需求/保持时间需求最差的情况下进行时序分析,而时序引擎选择的这种需求不一定是用户真正希望的,而且时序引擎默认选择的这种需求是非常严苛的,甚至是根本无法满足的。此时就需要用户进行Multicycle约束,手动修改建立时间需求/保持时间需求。用户希望放松某些路径的约束力度,就可以通过Multicycle约束调整建立时间需求/保持时间需求。

使用set_multicycle_path命令进行约束

注:使用set_multicycle_path命令

①在源时钟和目的时钟相同的情况下进行Multicycle约束

②在源时钟和目的时钟频率相同且有正向偏移的情况下(正向偏移0.3ns)


如何在Quartus II中设置Virtual pin
榈亩酝饨涌谝�呕岫啻锛赴俑觯�云涞ザ婪抡娴幕埃�赡芑岫阅勘闒PGA造成IO资源不足的情况。即使IO资源满足,当众多内部信号变成IO信号时,模块内部的信号将增加额外的IO延时,增加了时序约束的复杂度。 在编译时会出现类似错误: Error: Can't place 108 pins with 2....

澄江县13329088761: fpga时序约束怎么写 -
蒯唯盐酸: verilog本身不包含时序约束信息 时序约束是用tcl脚本写的 design compiler在综合电路时会读入tcl脚本把约束信息加载到电路上 现在FPGA的综合工具也只是tcl的时序约束了

澄江县13329088761: 如何在FPGA设计环境中加时序约束 -
蒯唯盐酸: 你的提问太笼统.在Altera的quartusII下,添加*.sdc文件,使用TQ时序约束器来进行时序验证,具体的语法可以参照altera网站的叙述以及例子工程,当然最简单的方法是买一本altera相关设计的书来看.

澄江县13329088761: 一个关于FPGA时序约束的问题 -
蒯唯盐酸: 1 虚拟时钟就是你希望系统跑的最高频率,软件根据这个时钟对布局布线结果进行计算,看是否有路径不满足建立保持时间. 你要是不给,那系统按照1MHZ时钟来计算时序约束吗?那任何设计都不会有问题了2 芯片内部延迟可以认为是已知的,一般各厂商的软件内都有各器件的详细参数,不需要设置.你既然已经知道关系表达式,那么 时序约束其实就是对关系式里的 Tdata 也就是路径延迟组合逻辑延迟这一步进行计算(周期,建立、保持时间都是固定的无法改变),如有不满足的通过改变布线及寄存器位置减少延迟,若还不满足,只能更改设计了.是否可以解决您的问题?

澄江县13329088761: FPGA时序约束 -
蒯唯盐酸: 可以那么设置,但是如果你只要约束一个时钟,最顶层那个窗口不用设置的

澄江县13329088761: FPGA时序约束,以保持一个时间问题 -
蒯唯盐酸: 看着真累 这么说吧,对于时序来说setup time和hold time必须满足,所有速度等级的片子都是以此为目的 当然对于速度等级来说 对于同样的代码等级低的fpga可能不满足时序,高等级的会满足时序要求

澄江县13329088761: 对哪些信号需要进行约束 FPGA -
蒯唯盐酸: 最常用的约束有IO管脚位置约束和电平幅度约束,这个很好理解,不多解释了.另外,就是对时钟网络约束.这个是很重要的.比如你的系统中,驱动的电路的时钟是27M的,那么你需要在约束文件中增加类似如下的约束语句 NET REF_CLK27...

澄江县13329088761: FPGA/CPLD的时序约束是什么意思? -
蒯唯盐酸: 设定的延时是作为一个最大允许值 布线时如果路径过长就无法通过

澄江县13329088761: fpga 时序约束后 能提高性能吗 -
蒯唯盐酸: 如果你设计的程序不进行时序约束的话,即使程序是对的,因为时序不满足要求,结果也是不对的.你这里说的“高性能”应该是指代码能运行在更高的时钟频率上,可以这么理解.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网