资源和时序优化之一

本文转载自: FPGA的现今未微信公众号

对于搞FPGA的人来说,资源和时序的优化,应该是一个永恒的话题。每一个技术人随着工作年限的增加,参与的项目越来越多,对这个问题都有着不同维度的发言权,那究竟应该怎么做好时序和资源的平衡?今天来一个漫谈吧。

资源多不多,是一个相对的概念,相对于你用的什么芯片。当然能追求绝对的资源少,那是非常好的,但是很多时候我们追求不了,只能看相对资源了。前不久搞一个项目,需要做一个排序,组内的一个同学说用HLS快速实现一个吧?结果,确实很快,资源也很“快”,但是由于资源还比较充裕,所以这个事情就这样过去了,所谓资源优化,一定是一个相对的概念。

那资源优化到底怎么弄了,最常优化的是资源有2种,RAM和LUT(很少听说REG不够的,至少我没有遇到也没有听说过),这里主要介绍如何优化这2种资源。

对于RAM的优化,更希望换一个名字,叫方案优化,因为只要按照RAM的应用来使用RAM,基本上不会有太多问题,那更多的优化,就只能从方案层面入手了。
(1)、灵活运用真双口RAM,去年一个项目,32个引擎都要访问同样的一个表格,如何处理?最简单的方案就是把表格复制32份,更新的时候统一更新,读的时候32个引擎读各自的表项。如果采用真双口RAM,每2个引擎合用一个表项,即该表项有2个读口,那么表项就由32份减少到16份。
(2)如果采用的是Xilinx的器件,可能会遇到URAM这个资源,当你使用大块的RAM的时候,建议使用URAM,虽然不会减少对资源的消耗,但是可以优化时序,毕竟一个URAM可以抵8个RAM(M36K)。这仅仅是一种经验,适用的范围可能也有一定的局限性。
总之,对于RAM的优化,需要case by case的分析,更多的是从方案入手优化,效果会更好,而不是代码层面的优化。

第二种资源就是LUT了,LUT消耗过多,无非就是组合逻辑过大,比如大位宽的case,复杂且大位宽的加减法等等,都是LUT消耗的大户。LUT资源的优化,很多时候都是凭借经验,对我们觉得消耗LUT过多的逻辑进行优化,这里介绍一种“反向工程”的方法。当一个模块我们觉得LUT资源消耗过多后,先查看网表,确定是哪个逻辑块消耗了过多的LUT,然后有针对性的优化。因为你认为消耗过多LUT的逻辑块和经过工具优化后实际消耗过多LUT的逻辑块可能并不一样,因此有的放矢效果更好。

当综合完成后,打开网表,在implement design窗口中找到Netlist标签,里面展示了各个模块所消耗的资源,主要看Leaf Cells,就可以看到寄存器(FDCE)和LUT资源,如下图所示:

比如out_key_cnt这个信号,一共消耗了32个LUT,因为代码里是一个32bit的加法器,如果要优化,那就从这个加法器入手了。对于LUT的优化,这个方法已使用多年,屡试不爽。

最新文章

最新文章