FOGA毕竟不是ASIC,对时序收敛的要求更加严格,本文主要介绍本人在工程中学习到的各种时序约束技巧。

首先强烈推荐阅读官方文档UG903和UG949,这是最重要的参考资料,没有之一。它提倡要在设计的早期阶段就要排除问题,越到后期时序的改善就越困难。其中HLS层次对性能的影响是最大的。

本文将从代码风格,时序修正,工程设置等几个方面介绍本人的实践经验,希望让各位初学者快速提高,也希望FPGAer能给出宝贵建议。

1. 代码风格

推荐使用Xilinx language templates的代码块,这里的代码能够综合出正确且结构简洁的电路,包括移位寄存器,乘法,复数乘法,FIR滤波器等,凡是涉及到的模块尽量使用官方写法。

合理的设计代码框架。IO相关的代码、时钟管理单元尽量放在顶层,后者有助于以共享资源从而提高性能降低功耗。模块的输出最好是使用寄存器输出,有助于降低路径延时帮助时序收敛。

复位也是非常重要的问题。和ASIC不同,Xilinx FPGA的寄存器是高电平复位,支持异步复位和同步复位,但是DSP和BRAM内部的寄存器不支持异步复位。因此,官方更推荐设计采用高电平同步复位,可以降低资源的使用和功耗,有助于时序收敛。由于FPGA的初始状态是确定的(可以在定义说明中指定),为了更快地时序收敛,官方文档认为,能不用复位是最好的,尤其数据路径和移位寄存器的设计中。不过使用同步复位仍需要注意控制集不能太多的问题。关于这方面的内容,UG949第三章Control Signals and Control Sets给了详细的说明。

数学运算使用DSP单元速度会更快一些,根据DSP的结构重组数学运算,充分利用FPGA的DSP、BRAM资源。并且能做到对代码映射的硬件资源心里有数。

如果并不需要优先级,尽量将If语句转化为case语句。

尽量不要使用Don''t Touch这类语句。如今Vivado综合工具已经很完善了,除非代码有问题或者手动复制寄存器,否则一般不会发生电路被综合掉的现象。使用这些语句会覆盖Vivado综合设置,导致电路没有得到充分的优化,给时序收敛造成困难。

2. 时序修正

严格遵守Vivado开发流程,在第一次跑综合时最好是在没有任何物理约束的情况下,Vivado在越少物理约束的情况下综合出来的效果越好。查看每个阶段的时序报告,将每一阶段的时序违例控制在300ps以内,尽早消除问题。以前本人RTL Analysis阶段过了之后选择运行Implementation跳过Synthesis报告,这是不可取的行为。有时候会发现Synthesis有时序问题而在ImplementaTIon阶段反而没问题,这是因为Vivado在ImplementaTIon阶段对时序不满足的地方倾斜了更多的资源保证时序收敛。但是忽略Synthesis的时序问题会在后期顶层模块集成占用大资源时爆发出来。

下面介绍主要面对的两个时序问题的处理技巧。

1)setup TIme 建立时间问题

建立时间是工程设计中最常遇到的问题了。一般说来,导致建立时间违例主要有两个原因:逻辑级数太大或者扇出太大。

打开Report TIming Summary界面查看路径延迟信息,如下图所示。

Levels指的是逻辑级数logic level,一个logic level的延迟对应的是一个LUT和一个Net的延迟,对于不同的器件,不同频率的设计能容纳的logic level是不同的。假设7系列的-2速度等级250MHz的设计,电路设计的大部分levels最好不要超过8,否则会造成时序收敛困难。

Logic level太大的处理方法就是重定时(Retiming)了,典型的重定时方法就是流水线,将过于冗长的组合逻辑增加寄存器进行打拍。

High Fanout指的是扇出,同样和器件、设计频率等有关,如下图所示:

降低扇出最好不要在综合设置中指定,过低的扇出限制会造成设计堵塞反而不利于时序收敛,最好的方法是根据设计中时序最差路径的扇出进行针对性的优化。如果是寄存器的输出扇出很大,可以使用max_fanout属性标记寄存器声明,也可以手动复制寄存器,具体可参考:https://blog.csdn.net/shshine/article/details/52451997

如果不是关键时序路径,而且高扇出网络直接连接到触发器,对扇出超过25K的net插入BUFG:

set_property CLOCK_BUFFER_TYPE BUFG [get_nets netName]

当然,也可以在后期Implementation的物理优化设置中优化扇出。

2)hold time 保持时间问题

在实践中,我发现保持时间问题的问题往往是异步处理的问题。

对于一个信号的跨时钟域问题,一般使用双寄存器法(对于慢采快的结绳法这里不讨论)。为了降低MTBF(Mean Time Between Failures,平均无障碍时间),这两个寄存器最好位于同一个slice中。可以使用tcl语言指定,如:

set_property ASYNC_REG TRUE [get_cells [list sync0_reg sync1_reg]]

也可以直接在代码中指定:

(* ASYNC_REG = "TRUE" *) (* keep = "true" *)reg sync0_reg, sysnc1_reg;

也可以参考代码模板使用XPM模板进行处理。

多个信号一般是使用FIFO或者握手的方法,这里不再赘述原理。同步CDC处理比较复杂,本人打算之后另外写一篇文章详细讲述。

3. 工程设置

Vivado综合实现本质是时序驱动的,和ISE不同,因此再也没有ISE那种用随机种子综合实现满足时序收敛的工具。不过Vivado在布局布线方面提供了几种不同的策略(directive),通过不同策略的组合可以产生上千种不同的布局布线结果,还可以使用tcl钩子脚本自定义布局布线过程,足以满足需求。而且,Vivado可支持同时运行多个Implementation,这为这种设计时间换取性能的方法提供了工具上的便利。

Implementation里Post-place Phys Opt Design和Post-route Phys Opt Design是没有使能的。工程后期使能这两个配置也能在一定程度上改善时序收敛。

FPGA工程师的工作不只是将电路功能实现,由于器件和工具不是理想的,所以还需要研究器件特性和工具的局限,尤其是在如今算法结构越来越成熟的背景下,不断被工具折磨,也许这也是FPGA工程师的悲哀吧。

时序约束优先级_Vivado工程经验与各种时序约束技巧分享相关推荐

  1. 时序约束优先级_VIVADO之时序约束

    1 时钟约束 1.1 主时钟(primary clock) 主时钟应首先被定义,因为其他时序约束往往以主时钟为参照标准.主时钟的定义往往应定义在输入端口,而不是clock buffer的输出端口.如下 ...

  2. 6 FPGA时序约束理论篇之xdc约束优先级

    xdc约束优先级   在xdc文件中,按约束的先后顺序依次被执行,因此,针对同一个时钟的不同约束,只有最后一条约束生效.   虽然执行顺序是从前到后,但优先级却不同:就像四则运算一样,±x÷都是按照从 ...

  3. 只有20%的iOS程序员能看懂:详解intrinsicContentSize 及 约束优先级/content Hugging/content Compression Resistance

    在了解intrinsicContentSize之前,我们需要先了解2个概念: AutoLayout在做什么 约束优先级是什么意思. 如果不了解这两个概念,看intinsic content size没 ...

  4. 经验 | 深度学习中从基础综述、论文笔记到工程经验、训练技巧

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:本文授权转自知乎作者跑者小越,https://zhuanla ...

  5. 从基础综述、论文笔记到工程经验、训练技巧:值得一看的目标检测好文推荐...

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文授权转自知乎作者跑者小越,https://zhuanlan.z ...

  6. 【转载】CDC的那些事:CDC工程经验总结

    转载自https://my.oschina.net/u/4579683/blog/4487378 这一篇老李给大家简单介绍一下工业界常用的CDC检查工具Spyglass,然后奉上CDC设计和验证中的工 ...

  7. 网络施工总结的工程经验

    为了保证网络施工的质量,总结的工程经验如下: 一 .明确要求.方法 施工负责人和技术人员要熟悉网络施工要求.施工方法.材料使用,并能向施工人员说明网络施工要求. 施工方法.材料使用,而且要经常在施工现 ...

  8. FPGA时序约束与分析 (3)--- 虚拟时钟约束

    虚拟时钟定义   在一些时序路径中,一些引脚上的数据信号,其同步时钟只存在于外部芯片,并不存在于FPGA器件内.这种情况下,为了时序分析需要定义一个时钟用于描述时序数据引脚的外部时钟信号,这个时钟就称 ...

  9. 【约束布局】ConstraintLayout 约束布局 ( 简介 | 引入依赖 | 基本操作 | 垂直定位约束 | 角度定位约束 | 基线约束 )

    文章目录 一. ConstraintLayout 简介 1. 引入 约束 布局 ( 1 ) 约束性布局 作用 和 简介 2. 约束 简介 ( 1 ) 约束个数要求 ( 2 ) 约束设置 与 显示位置 ...

最新文章

  1. 微信内置浏览器的JsAPI(WeixinJSBridge续)[转载]
  2. java数组二分查找的简单例题_Java基础-练习 数组元素二分查找(折半查找)
  3. Laravel 日期时间处理包 Carbon 的应用
  4. 一人之力也能抬起一辆大型箱车?
  5. .Net Framework SDK下的命令汇总
  6. require.js使用(一)
  7. 域名备案以及再次白嫖阿里云
  8. 【演化计算】【论文研读】Completely Automated CNN Architecture Design Based on Blocks
  9. 数论二(hdoj 卡特兰数)
  10. Rufus --工具制作镜像
  11. 显著性检验:P值和置信度
  12. Allegro如何更改铜皮的网络操作指导
  13. MATLAB实现空间前方交会-后方交会计算
  14. 超级经典的图书下载网站:梦远书城
  15. java学习笔记第三周(二)
  16. Krpano元素的一些解析
  17. Flutter 移动光标 关闭弹出的键盘
  18. 嵌入式Linux磁盘(硬盘、SD卡)读写性能测试
  19. unity3d四元数和旋转矩阵
  20. Android 天气APP(三十四)语音搜索

热门文章

  1. 漫画 | 浏览器一个比一个“无耻”
  2. TED演讲的字幕下载
  3. Keil中使用arm section进行绝对地址定位并进行O2等级代码优化时报错: Error: L6982E
  4. 【CSS3】CSS3 学习笔记(1w字+)
  5. GoAccess 分析nginx日志
  6. JS检索下拉列表框中被选项目的索引号(selectedIndex)
  7. 《幸福的勇气》——“我”的价值由自己来决定,这叫“自立”
  8. 熵(Entropy) 条件熵 (Conditional Entropy) 相对熵(Relative Entropy)- 学习笔记
  9. 盘古越狱工具在用户空间的行为
  10. 如何执行大型会议活动现场管理