时序约束

一、在给 FPGA做逻辑综合和布局布线时,需要在工具中设定时序的约束。通常,在FPGA 设计工具中都FPGA中包含有4种路径:从输入端口到寄存器,从寄存器到寄存器,从寄存器到输出,从输入到输出的纯组合逻辑。通常,需要对这几种路径分别进行约束,以便使设计工具能够得到最优化的结果。下面对这几种路径分别进行讨论。 
1.从输入端口到寄存器:
        这种路径的约束是为了让FPGA设计工具能够尽可能的优化从输入端口到第一级寄存器之间的路径延迟,使其能够保证系统时钟可靠的采到从外部芯片到FPGA的信号。约束名称:input delay.    约束条件的影响主要有4个因素:外部芯片的Tco,电路板上信号延迟Tpd,FPGA的Tsu, 时钟延迟Tclk.    Tco的参数通常需要查外部芯片的数据手册。计算公式:input delay = Tco+Tpd+Tsu-Tclk.    FPGA的Tsu也需要查FPGA芯片的手册。 FPGA速度等级不同,这个参数也不同。 Tpd和Tclk需要根据电路板实际的参数来计算。通常,每10cm的线长可以按照1ns来计算.    例如:系统时钟100MHz,    电路板上最大延迟2ns, 时钟最大延迟 1.7ns, Tco 3ns, FPGA的Tsu(触发器固有的建立时间)为0.2ns. 那么输入延迟的值: max Input delay = 2+3+0.2-1.7=3.5ns.    这个参数的含义是指让FPGA的设计工具把FPGA的输入端口到第一级寄存器之间的路径延迟(包括门延迟和线延迟)控制在 10ns-3.5ns=6.5ns 以内。这个3.5ns在quartus timequest中的约束就是input delay。这个6.5ns在xilinx的约束中就是OFFSET IN。具体写法依约束参考对象不同有两种,NET DATA_IN  OFFSET = IN 3.5ns AFTER CLK(这个clk是launch clk);NET DATA_IN  OFFSET = IN 6.5ns  BEFORE CLK(这个clk明显是latch clk了)。
后记:关于这个约束,参考 http://www.doc88.com/p-112663065567.html(偏移约束详解,王春平)。对于初始时钟沿的问题之前没有注意过,这个学习了,就是说你的offset是相对于初始时钟沿来说的。但是对于fpga来讲,就拿他的例子来说,外部芯片是下降沿出数据,相对于随路时钟的上升沿2ns之前数据准备好了,那么fpga是要控制它的delay在2ns之内还是12ns之内呢,或者说fpga是怎么知道它的采样沿是上升沿还是下降沿呢,代码里反映的吗?
2.寄存器到寄存器: 
     这种路径的约束是为了让FPGA设计工具能够优化FPGA内寄存器到寄存器之间的路径,使其延迟时间必须小于时钟周期,这样才能确保信号被可靠的传递。由于这种路径只存在于FPGA内部,通常通过设定时钟频率的方式就可以对其进行约束。对于更深入的优化方法,还可以采用对寄存器的输入和寄存器的输出加入适当的约束,来使逻辑综合器和布线器能够对某条路径进行特别的优化。还可以通过设定最大扇出数来迫使工具对其进行逻辑复制,减少扇出数量,提高性能。 
3.寄存器到输出:
      这种路径的约束是为了让FPGA设计工具能够优化FPGA内部从最后一级寄存器到输出端口的路径,确保其输出的信号能够被下一级芯片正确的采到。约束的名称: output delay,                约束条件的影响主要有3个因素:外部芯片的Tsu,电路板上信号延迟Tpd,时钟延迟Tclk.    Tsu的参数通常需要查外部芯片的数据手册。计算公式:output delay = Tsu+Tpd-Tclk.            例如:系统时钟100MHz,    电路板上最大延迟2ns, 时钟最大延迟 1.7ns, Tsu 1ns, 输出延迟的值: max output delay = 1+2-1.7=1.3ns .    这个参数的含义是指让FPGA的设计工具把最后一级寄存器到输出端口之间的路径延迟(包括门延迟和线延迟)控制在 10ns-1.3ns=8.7ns 以内。
这个6.5ns在xilinx的约束中就是OFFSET OUT。同样有两种写法,NET DATA_OUT OFFSET = OUT 8.7ns AFTER CLK;NET DATA_OUT OFFSET = OUT 1.3ns  BEFORE CLK。
4.从输入端口到输出端口:
      这种路径是指组合逻辑的延迟,指信号从输入到输出没有经过任何寄存器。给这种路径加约束条件,需要虚拟一个时钟,然后通过约束来指定哪些路径是要受该虚拟时钟的约束。在Synplifypro和Precision中都有相应的约束来处理这种路径。
二、分析时序
不断学习,不断更新...
1.通过creat timing constraints来建立约束,包括offset in、offset out和period,它们属于全局的约束,然后点valid constraints,设计的约束便自动生成在ucf文件里了,前提是之前得有ucf文件。
2.经过布局布线以后,可以查看static timing,看设计的时序约束是否能满足。还看到说查看综合报告或映射后静态时序报告可以看到你的约束是否现实,这个要继续了解一下。
3.通过这个analyze timing/floor plan design(plan ahead)可以查看各个约束的路径的实际位置。还可以看到具体到路径它的逻辑延时占多少时间,布线延迟占多少时间,一般来讲符合60/40原则,即逻辑延迟占到60%以下设计就很容易满足要求。
4.周期约束覆盖同步单元之间的延时路径,如果系统有多个时钟,各自约束之,应该就可以了我理解。然而单纯的只使用全局约束往往会导致过约束,道理很简单,因为有的路径是不需要加上这个约束的(不需要加的加上了属于过约束),像多周期路径、跨时钟域的路径等。你如果加上了,只能让综合工具做一些无谓的努力(侵占了本应该属于其它逻辑的布局布线资源,反而可能造成其它关键路径时序的违规和时序余量变小)。所以这个时候就需要特定路径的时序约束,它的目的并不是给路径多大的优化,而是给你的综合工具更大的灵活性来满足你的时序要求。
5.关于路径终点的定义:IO PADS、FF、FL、RAM。可以通过creat timing constraints来方便的将路径终点进行分组,从而进行组间的时序约束。全局约束默认是将所有的终点作为一个group。
6.相关时钟域的约束:为一个时钟进行周期约束,以这个周期约束确定相关的时钟。像DCM有多个时钟输出,只需要确定输入时钟的周期约束,那么执行工具会自动推导出其它输出时钟的约束。
  不相关时钟域的约束:例如有clka和clkb两个时钟域,分别做了周期约束,那么它们之间的延时路径默认是没有覆盖到的,这个时候就可以在两个group之间做特定路径的约束(快速/慢速/例外),由于clka和clkb都分别做了约束,两个group已经被自动分好了,就以时钟为依据就行了。
7.看到一段话,说的是附加时序约束的基本策略,很好,拿过来。附加时序约束的一般策略是先附加全局约束,然后对快速和慢速例外路径附加专门约束。附加全局约束时,首先定义设计的所有时钟,对各时钟域内的同步元件进行分组,对分组附加周期约束,然后对FPGA/CPLD输入输出PAD附加偏移约束、对全组合逻辑的PAD TO PAD路径附加约束。附加专门约束时,首先约束分组之间的路径,然后约束快、慢速例外路径和多周期路径,以及其他特殊路径。

8.对自己在做的一个工程,原先什么约束都没有加,运行结果会偶尔出现读写SRAM出错的情况,有时候加上chipscope反而没错了,稍作改动综合之后结果也不一样。再遇到这样的情况,肯定就能知道是关键路径的时序问题。就加了一个全局时钟的约束,它是DCM的输入。经过PR以后,看它的STA,发现提示了几个路径的错误,其中有一条就是从PC104接口过来的地址送到我内部一个模块的时候路径的setup time不满足,slack为负。slack是时序余量,是用周期减去时序通路上消耗的时间,正的为满足时序要求,负的就表示不满足。有网友说了几个改正的方案:

1)修改PR的布局布线策略,比如改成时间优化,允许duplication(禁止逻辑优化)等
2) 加强placement constraint
5)使用floorplanner
以上几点不需要修改设计。如果还不行就要优化code了。
3)减少fanout (尤其中间的组合逻辑)
4)插入额外的flip-flop等。

本项目实际的修改就是在中间将逻辑打断,加了一级flip-flop。然后就不报timing error了。

9.一般同一个时钟域的话不用考虑hold time,因为tco+tdelay>t_hold肯定可以满足,就算是加上始终偏斜,那么应该满足tco+tdelay-tpd>t_hold也是没有问题的,因为tdelay跟tpd和thold比不一个等级的。

三、详细看了一下ISE生成的timing report,做以下分析。

1.只做了一个输入全局时钟的约束,经过DCM以后生成三个时钟,一个CLK0,一个八倍频的时钟和一个八分频的时钟。timing report以时钟为条件分了四个部分做分析。

2.每一部分基本包括两个方面,一个是component switching limit,还有一个就是路径的分析。其中component switching limit是跟器件相关的,对输入时钟的占空比有一个容忍的范围,参数值包括低电平最低持续多长时间(low pulse limit)和高电平最低持续多长时间(high pulse limit),而这个两个值根据输入时钟的大小是有变化的,这个都是器件固有的特性。

3.路径的分析呢,分为setup和holdup进行分析,如果有不满足时序要求的路径(slack为负)那么就列出来,如果这个时钟下没有不满足时序要求的路径,那么同样会列出三个最坏情况的路径,setup的三个,holdup的三个。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
时序约束是在数字电路设计中用于确保设计在时序要求下正确运行的一种方法。Lattice是时序约束的一种类型。它是由Lattice Semiconductor公司提出并广泛使用的一种约束关系。Lattice时序约束主要用于确保设计满足条件时钟的时序要求。 Lattice时序约束主要涉及到时钟、数据路径和时序意图。时钟是指设计中使用的周期性信号,数据路径是指信号在电路中传输的路径,而时序意图是指设计者对信号在电路中的传输方式的理解和意图。 时序约束主要包括最大延迟和最小延迟。最大延迟是指信号传输经过的最长时间,而最小延迟是指信号传输经过的最短时间。通过对时钟、数据路径和时序意图进行合理的约束设置,可以确保设计在时序要求下正常运行。 Lattice时序约束的设置包括时钟频率、时钟起始时间、时钟边沿、数据路径延迟等方面。设计人员需要详细了解设计的时序要求,根据具体的应用情况来设置约束。通过合理设置时序约束,可以更好地控制时序和时钟的关系,从而提高电路的稳定性和可靠性。 总结来说,Lattice时序约束是一种用于确保电路设计在时序要求下正确运行的方法。通过合理设置时钟、数据路径和时序意图的约束,可以确保设计在时序要求下正常工作。Lattice时序约束的设置对于电路的稳定性和可靠性至关重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值