现在的位置: 首页 > 综合 > 正文

FPGA时序约束

2018年01月31日 ⁄ 综合 ⁄ 共 1905字 ⁄ 字号 评论关闭

时序性能是 FPGA 设计最重要的指标之一。造成时序性能差的根本原因有很多,但其直接原因可分为三类:
布局较差、逻辑级数过多以及信号扇出过高。下面通过时序分析实例来定位原因并给出相应的解决方案。

1.布局太差及解决方案
相应的解决方案有 :
1) 在 ISE 布局工具中调整布局的努力程度 (effort level) ;
2) 利用布局布线工具的特别努力程度 (extra effort) 或 MPPR 选项 ;
3) 如果用户熟悉区域约束,则利用 Floorplanner 相对区域约束 (RLOC),重新对设计进行布局规划。

2.逻辑级数过多及解决方案
1) 使用流水线技术,在组合逻辑中插入寄存器,简化原有的逻辑结构 ;
2) 检查该路径是否是多周期路径,如果是,添加相应的多周期约束 ;
3) 具备良好的编码习惯,不要嵌套 if 语句或 if、case 语句,并且尽量用 case 语句代替 if 语句。

3.信号扇出过高及解决方案
相应的解决方案有 :
1)通过逻辑复制的方法来降低信号的高扇出,可在HDL代码中手动复制或通过在综合工具中设置达到目的;
2) 可利用区域约束,将相关逻辑放置在一起,当然本方法仅限于高级用户。

技巧 6、常用选项之二 :register_duplication + max_fanout + equivalent_register_removal +  resource_
sharing - 允许自动复制寄存器,设置最大扇出,禁止资源共享。当Timing不满足时使用复制寄存器的方法
通常能改善一些瓶颈。综合器为了节省面积而做出的某些优化可能导致对时序不利,因此关闭equivalent_
register_removal 和 resource_sharing 可能可以改善时序。

在第一遍实现时,使用全局时序约束和缺省的实现参数选项,如果不能满足时序要求,则可尝试以下方法:
(1) 尝试修改代码,如使用合适的代码风格,增加流水线等 ;
(2) 修改综合参数选项,如 Optimization Effort,Use Synthesis Constraints File,Keep Hierarchy,Register

Duplication,Register Balancing 等 ;
(3) 增加实现工具的努力程度 ;
(4) 在综合和实现时采用指定路径时序约束的方法。

Timing Error 解决方法:
提升是不明显的。我们需要有选择地针对不同的情况使用不同的方法。以下来分析几种常见的情况 :
- Timing 报告显示某一段 net 走线延时特别长 :
通过在FPGA Cross Probing中找到这根net。如果输入输出距离的确比较长,那么是由于Place问题造成的,
要解决 Place 问题,需要检查为什么工具会把两个 LUT/FF 放得那么远,是相关的逻辑布局问题,还是因为引脚
锁定导致无法移动逻辑的问题。
常用的解决方法可以对前级寄存器做复制寄存器的操作。参考Xilinx AR9410。
如果是因为输入/输出端连接的寄存器被Pack到IOB中导致寄存器无法移动,那么可以使用IOB=false
约束将寄存器放在 Slice Logic 中。
- Timing 报告显示逻辑层次比较多,而这些层次中没有延时特别长的 :
如果是 LUT 到 LUT 的层次太多,那么可以先使用 XST 的 register balancing 功能。如果还是无法满足,可
能需要手动调整组合逻辑,在中间插一级寄存器,并修改其他相关的代码,使得相关数据的latency一致。其
他方法参考Xilinx AR9417。如果是进位链太长,那么就要考虑使用两个小一点的计数器/加法器级联。当考虑
到进位逻辑是纵向排列的,当超出一列时,进位会导致延时变长很多时,更需要注意进位链的长度。参考Xilinx
AR9412。
- Hold Violation
Hold Violation 通常都是由 Gated Clock 引起。检查设计中没有使用门控时钟。门控时钟通常会由计数器分
频产生。尽量都使用 FPGA 提供的时钟资源,尽量使用 DCM 做 deskew。
- Offset 约束不满足
首先必须保证 offset 写得是正确的。
然后保证输入/输出数据一进FPGA就用寄存器打一拍,中间不要加组合逻辑。寄存器Pack到IOB中能
最大限度得保证 Offset 约束被满足。( 同理,如上所述,不把寄存器放在 IOB 中将有利于 Period 约束。)
如果还是满足不了,可能需要调整一下时钟和数据的相位。可以使用DCM Phase Shift调整时钟相位或
IDELAY 调整数据相位。
在制定Pinout时可以有意地将一组总线按内部IOB的位置排列,低有效位在下方,高有效位在上方,而不
是按外部Pinout的位置排列。如果以上方法都已经使用并且离目标还差一点点,那么可以试图使用工具的某些

抱歉!评论已关闭.