解决时序问题
文章目录
- 解决时序问题
- 前言
- 一、常见的时序问题
- 二、解决方式
- 2.1 扇出问题
- 2.2 资源拥塞
- 2.3 逻辑级数
- 2.4 vivado版本过低
- 2.3 最后
- 总结
前言
如果设计验证和测试已经接近尾声,偶尔进行小改可能出现几条时序违例的情况
这个时候就不建议通过修改代码来进行优化了,首先在设计验证和测试几乎完成的情况下,证明你这套逻辑已经经过了层层考验,不会出什么问题。如果这个时候还通过改功能模块来优化时序有可能引入新的不确定因素,还得花很多时间来验证才行。
在这个时候一般的做法是多开几个策略来进行综合或者布局布线。举个简单的例子,因为只是偶尔会出现时序不过的情况,假设概率为0.3。那么如果有3个策略同时编译,则3个都不过的概率就变成0.027了。这样只要哪个策略时序通过了我们就用哪个策略生成的结果即可。
参考资料:
FPGA之逻辑级数
一、常见的时序问题
1、 时钟频率过高
2、 资源利用率过大
3、 逻辑级数过大
4、 扇出过大
5、 资源拥塞
二、解决方式
2.1 扇出问题
首先这个最有可能出现的就是复位信号了
Always @(posedge i_clk or negedge i_rst_n)
i_rst_n是整个工程扇出最大的信号了。这个特别是资源用的比较多得时候就会暴雷了,每次时序违例都是一大堆跟i_rst_n有关的。但绝大多数时候我们的功能是不需要i_rst_n复位的。
能不用就不用。判断原则,如果后面寄存器的输出,之后前面信号的输入有关,这里的寄存器只起到传递的作用,那么就不用加复位。
如果是无法忽略的信号,那要么就做
(1) 逻辑复制,以增加资源来减少扇出。
(2) 或者某些情况下我们了解其信号特性,并不需要下一个时钟周期就做出响应的话,可以使用multicycle约束。这样,触发器之间的时延就可以成倍增加了,大大缓解了其布线压力
2.2 资源拥塞
某一块的逻辑功能特别大,组合逻辑也多,但又不太容易优化,只能说我们在设计的时候不要引入太多不必要的一些控制信号,这里有一个控制集的概念:
2.3 逻辑级数
什么是逻辑级数?所谓逻辑级数就是指路径起点和重点之间的组合逻辑单元个数,这些逻辑单元可能是查找表(LUT1、LUT2、LUT4、LUT5、LUT6)、进位链(Carry4,进位链:进位溢出,为了连接一个过大位宽累加器而存在的逻辑工具)、数据选择器(F7MUX/F8MUX/F9MUX)、IBUF等。
在Vivado时序报告中逻辑级数为中间的组合逻辑器件个数加一个触发器,可以看见下图所示,中间组合逻辑器件为8个,再加一个触发器,逻辑级数为9。
查看逻辑级数的命令:输入命令前需要打开synthesized design或者implemented design
report_design_analysis -logic_level_distribution -logic_level_dist_paths 5000 -name design_analysis_prePlace
通常,一个“LUT+一根走线”的延迟为0.5ns(经验值,适用于Xilinx7系列FPGA和UltraScale/UltraScale+FPGA),假定寄存器时钟周期为T,那么该路径所能承载的最大逻辑级数为T/0.5,也就是2T。如果逻辑级数大于2T,而时序未能收敛,就可以怀疑时序违例跟逻辑级数较高有关。
过大的计数器位宽会带来过多的进位链,从而造成过多的逻辑级数;尽量避免大位宽计数器,250M以内的设计,最好不要超过16bits;4bits位宽会占用一个进位链。
关于优化逻辑级数:可以参考下面文章
FPGA速度优化
2.4 vivado版本过低
vivado升级到最新的,实际上还有一个最大的变量就是,你的时序还跟vivado软件的布局布线的内部算法有很大的关系。
2.3 最后
大范围时序违例,时序违例路径成百上千。用了上述的一些方法不管用
当前的时钟和资源利用率已经超出了片子的承受范围。这种情况下无法通过小修小补就能让时序收敛,只能从整个方案设计来看是否有妥协的办法。
(1) 降时钟频率了。但大部分情况下是不能这么降系统时钟的,降系统时钟很有可能意味着整体性能的下降,很可能出现无法达成既定指标的情况。
(2) 审视所有功能模块,看看所有模块的数据吞吐量是否有不同的情况。例如我之前弄过FPGA暴力破解算法。A模块是接口模块和路由通路,B模块是解密核心算法。B模块的时钟快慢决定性能的好坏,因此B模块时钟越快越好。但B模块运算时间较长,因此不要A模块这么快的速度传递数据。因此A模块时钟可以用更慢的时钟。
这样比A/B模块都用一个时钟对于时序的压力会减轻。当然这只是一个例子,每个不同的功能都要进行具体的分析,有些是可以优化的,有些的实在没办法就只能从性能上进行取舍了。
总结
时序问题总结就是布局布线导致两个ff之间建立和保持时间不满足,从布线困难上考虑:布局布线策略,资源使用率过高导致布线很困难,扇出过大导致布线困难。从ff之间就考虑组合逻辑级数,实际上就是考虑综合后的电路是怎么样的,优化逻辑处理就是让两个ff之间更近,方式如,组合逻辑的处理逻辑(操作符平衡 即并行处理,优先级的影响),使得两个ff之间在同一个slice。从时钟上就是时钟频率