你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在工程中学习到的各种时序约束技巧

[复制链接]
gaosmile 发布时间:2020-10-5 21:28
FPGA毕竟不是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界面查看路径延迟信息,如下图所示。

微信图片_20201005212846.jpg

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

微信图片_20201005212850.jpg

Logic level太大的处理方法就是重定时(Retiming)了,典型的重定时方法就是流水线,将过于冗长的组合逻辑增加寄存器进行打拍。
High Fanout指的是扇出,同样和器件、设计频率等有关,如下图所示:

微信图片_20201005212854.jpg

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

如果不是关键时序路径,而且高扇出网络直接连接到触发器,对扇出超过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工程师的悲哀吧。

收藏 评论0 发布时间:2020-10-5 21:28

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版