fpga时序约束

[复制链接]
查看543 | 回复4 | 2023-6-25 17:18:37 | 显示全部楼层 |阅读模式
[color=rgba(0, 0, 0, 0.9)]FPGA时序不收敛,会出现很多随机性问题,上板测试大概率各种跑飞,而且不好调试定位原因,所以在上板测试前,先优化时序,再上板。
[color=rgba(0, 0, 0, 0.9)]今天我们就来唠一唠解决时序不收敛的问题,分享一些常用的解决办法和思路。
一、模块运行时钟频率
[color=rgba(0, 0, 0, 0.9)]设计模块前,需明确模块运行的最大时钟频率。
[color=rgba(0, 0, 0, 0.9)]不同时钟频率下,对应的时序约束最大延时是不一样的。
[color=rgba(0, 0, 0, 0.9)]比如100MHz时钟下运行的HDL逻辑,比200MHz时钟下的HDL逻辑,支持的组合逻辑层数多。
[color=rgba(0, 0, 0, 0.9)]根据最大时钟频率,来设计HDL代码的层级,时钟频率越高,插入寄存器要更多,增加流水线级数,减少过长的组合逻辑。
[color=rgba(0, 0, 0, 0.9)]
二、HDL代码
1、HDL代码风格
[color=rgba(0, 0, 0, 0.9)]优先参考FPGA开发软件提供的HDL Template,比如Vivado的language template。
[color=rgba(0, 0, 0, 0.9)]2、HDL代码逻辑优化
[color=rgba(0, 0, 0, 0.9)]对于复杂的算法代码逻辑,需要结合FPGA并行计算和最小处理单位为bit的特性,对逻辑代码进行优化实现。
[color=rgba(0, 0, 0, 0.9)]明确变量最大的数据位宽。
[color=rgba(0, 0, 0, 0.9)]逻辑代码中,一些软件逻辑实现起来较复杂,尽量简化,删除掉一些不可能出现的情况。
[color=rgba(0, 0, 0, 0.9)]这部分代码逻辑,可能需要重复迭代几遍实现才行。
三、组合逻辑层数
1、插入寄存器
[color=rgba(0, 0, 0, 0.9)]将计算逻辑分成多个时钟周期实现,这是常用的时序优化方法,可以减少过多的组合逻辑层数,但会增加延时。如100MHz时钟下运行的HDL逻辑,比200MHz时钟下的HDL逻辑,支持的组合逻辑层数多。
[color=rgba(0, 0, 0, 0.9)]根据最大时钟频率,来设计HDL代码的层级,时钟频率越高,插入寄存器要更多,增加流水线级数,减少过长的组合逻辑。
2、逻辑展平设计
[color=rgba(0, 0, 0, 0.9)]优化代码中优先级译码电路逻辑,主要出现在IF/ELSE结构语句中,这样逻辑结构被展平,路径延迟得以缩短。
[color=rgba(0, 0, 0, 0.9)]IF ELSE结构语句存在明显的优先级,建议尽量用CASE语句来替代。
3、防止变量被优化
[color=rgba(0, 0, 0, 0.9)]HDL综合布线软件会根据实际情况,自动优化代码逻辑,可能存在将多个不同寄存器变量合并成一个寄存器变量的情况。
[color=rgba(0, 0, 0, 0.9)]对于不希望被优化的变量,可以在变量定义前,添加(* keep = "ture" *)
四、高扇出
[color=rgba(0, 0, 0, 0.9)]高扇出问题,原因是一个寄存器驱动后级数超过了它本身的驱动能力,导致延迟时间过大,不满足时序。
1、使用max_fanout
[color=rgba(0, 0, 0, 0.9)]在变量定义前,可以添加(* max_fanout = n *),来设置变量的最大扇出数,超过这个扇出数,综合软件会自动复制多份变量。
2、复位信号高扇出
[color=rgba(0, 0, 0, 0.9)]复位信号是常见的高扇出问题,主要解决办法有:
[color=rgba(0, 0, 0, 0.9)](1)减少复位信号的使用,能使用使能信号控制的,就用使能信号。
[color=rgba(0, 0, 0, 0.9)](2)对于大型模块,复位信号可以使用BUFG来驱动复位信号,可以增加复位信号的驱动能力
五、资源消耗
[color=rgba(0, 0, 0, 0.9)]FPGA器件的整个工程资源消耗,不管是LUT还是BRAM等资源,建议不超过80%。
[color=rgba(0, 0, 0, 0.9)]一旦资源消耗超过80%,在布线综合时,就出现布线资源不够,导致出现布线拥塞,从而出现了时序不收敛的情况。
[color=rgba(0, 0, 0, 0.9)]布线拥塞也分为全局拥塞和局部拥塞,可能是高扇出信号过多,也可能是局部布线资源不够用,导致时序路径过长。
1、优化代码逻辑,减少资源消耗。
[color=rgba(0, 0, 0, 0.9)]    在资源不够用的情况下,建议检查代码是否可优化,设置的RAM大小是否过大等等。
2、使用替代资源实现
[color=rgba(0, 0, 0, 0.9)]    在FPGA中实现RAM时,可以根据整个资源的使用情况,考虑使用Distributed RAM、URAM等资源来减少BRAM的消耗。




刘宇 | 2023-6-25 19:55:59 | 显示全部楼层
好帖 顶了
神医再世 | 2023-7-5 13:56:40 | 显示全部楼层
楼主继续加油啊
Ben笨蛋 | 2023-8-10 16:13:42 | 显示全部楼层
元芳你怎么看
tyhrtrtt | 2023-8-12 09:12:11 | 显示全部楼层
有图有正想
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1

主题

0

回帖

5

积分

微纳列兵

积分
5