FPGA代码优化方法和准则

【时间:2013 年 10 月 28 日, 来源:本站原创, 作者:】

骏龙科技 云德志 收集

 

一、 面积类

1、不进行不必要的数据清零。

    说明:一般在数据总线赋值额时候,习惯加上例如的:“else dout [15:0] <= 16’d0”,实际上这种清零并不是必要的,因为一般写使能就已经控制了数据的有效性,数据即使保持原值也没有问题,加入上述语句后,综合其会用多余的资源实现这个没有必要的清零分支。

2、多路数据进行相同处理时,先选择后处理优于先处理后选择。

3、采用合适的编码方式(one hot bit速度更快,但是资源消耗得也更多)。

4、多拍串行计算打开为一拍并行计算

5、统计寄存器位宽根据需要来确定,不需一位的32bit大位宽。

6、异步配置信号(CPU)可根据配置模块所在不同时钟域分别进行处理。

7、尽可能实现资源共享(计数器、比较器等),节省资源。

8、采用迭代算法节省资源。

10、使用reg代替FIFO接口。

11、状态机状态不要在比较器中使用。

12、3倍插值FIR滤波器优化。

13、用减法器借位位代替比较器。

14、利用ROM代替较大的组合逻辑。

15、利用多周期约束或通过RAM换LE的方法来节省CIC滤波器LE资源。

16、Multiplexer重编码节省LUT资源。

17、合理设置MUX默认条件有利于资源优化。例如:“default:dout <= 1’dx;”

18、合理设置QuartusII软件中auto packed register选项

20、建议使用“减法溢出”来设计Timer。

21、简化环回设计,节省资源。

22、减少时钟域,节省资源。

23、复数乘法公式展开,利用加法部分代替乘法。

24、禁止使用shift reg自动替换功能,避免小的的移位寄存器浪费M9K。

25、基于RAM的交换架构。

26、用RAM存放统计值来代替统计寄存器。

28、多通道分时处理时,功能相同的模块可以考虑复用。

29、复用没有全速运行的模块,多通道RAM使用复用模块代替。

RAM节省部分

1、 使用根据器件RAM块的位宽和深度合理选择。

2、 使用分布式RAM替换寄存器资源

3、 2倍插值滤波器优化。

其他部分

1、 根据器件内部block RAM特点,选择合理的拼接模式,可以减小RAM块地址译码和数据选择的LE。

2、 路由查表优化。

 

 二、 时序类

1、打平逻辑可以提高时序。

2、配平寄存器以提高时序。

3、尽可能减少组合逻辑。

4、在输出到IOB时安排布线时延要求低的路径,要求高的放在内部逻辑。

5、降低高速时钟域布线资源。

6、加法时,将位宽较宽的放在多周期中,全速率中尽量减少加法位宽。

7、加法时,将高位宽拆分成两级进行运算。

8、使用RAM、DSP中流水reg,不增加额外延时。

9、使用multicycle。

10、减少扇出fanout。

11、功能等价法均匀分散组合逻辑。

12、设置QuartusII软件综合选项。

13、功能没有优先级的if-else将关键路径放在最前。

14、物理综合优化removal和recovery时序。

  

三、 功耗类

1、避免小fanout的信号也使用全局clock网络。

2、尽可能使用区域clock代替全局clock network。

3、关闭非持续工作的模块时钟(通过IPCORE、clock_ctrl模块)。

4、条件允许小选择低功耗管脚和设置电压电流约束。

 5、控制RAM组合形式,减少每次操作的RAM块个数。

6、代码中才用关断使能、数据等降低功耗。

  

四、 案例类

1、减少调度模块的调度颗粒,提高系统吞吐率。

2、从方案角度优化降低编码实现复杂度。

3、保证外部总线错误时,逻辑内部可以检查到。

4、多带宽滤波器实现时,可考虑使用通用混模filter实现多个不同带宽filter,以节省资源。

 

 五、其他

1、可靠性—板级信号传递握手机制为送耦合机制。