存储器实现方式转换
0赞存储器实现方式转换
最近在搭建一个系统中遇到了一些问题,使用的FPGA器件逻辑资源很充足,而内嵌存储器资源却相当紧张。因此在优化内部RAM使用率时,正如《榨干 FPGA偏上存储资源》(http://blog.ednchina.com/ilove314/1811482/message.aspx)一文所分析 的,发现了有些存储器的利用率相当低。如果是自己例化的RAM/ROM/FIFO一般配置时会出现“What should the memory block type be?”相应选项,可以是Auto也可以是M?K(如M4K,M9K等)。就拿FIFO来说,如图1所示,有这样的选项。
图1
其实如果仅仅停留于此,会让人觉得altera很欠扁。选择Auto和M?K有区别吗?99%的时候需要我们去例化的片内存储器type会被编译为 M?K,而不可能是Auto的另一个选项:LEs。那么首先我们会问:Auto到底是如何Auto的?有什么基准?其次我们可能还要问:既然出现了M?K 的选项,它是Auto可能实现的一种方式,那么当我们要使用Auto可能的另一种方式即逻辑资源来构建存储器的时候,没有选项,我们又该怎么办?
如图2所示,特权同学的系统中,在查看综合报告里RAM Summary时,发现了一些只有1024bit存储量却占用一整个M9K的情况。不到1/8的利用率,如果逻辑资源充足,存储资源紧张的时候,这是无论 如何不可以容忍的,特权同学就处在这种尴尬境地之中。因此,上文提到的问题势必要打破沙锅问到底了。
图2
说白了,就是要用逻辑资源换存储资源。特权同学在遇到此种情况时,会想当然的认为有两种解决办法:其一是实践——到相关存储器配置的页面海找设置选项,也 许会发现设置存储器实现type的选项;其二是理论——还是要海找,用关键词去搜handbook,也许能够找到解决方案。
在Handbook中找到一个RAM to Logic Cell Conversion的选项设置。Handbook中对RAM to Logic Cell Conversion(不用急,下面再说它是干什么用的,不妨先理解一下对它的介绍)的说明如下:
The Auto RAM to Logic Cell Conversion option allows the Quartus II integrated synthesis to convert RAM blocks that are small in size to logic cells if the logic cell implementation is deemed to give better quality of results. Only single-port or simple-dual port RAMs with no initialization files can be converted to logic cells. This option is off by default. You can set this option globally or apply it to individual RAM nodes.
For FLEX 10K, APEX, Arria GX, and the Stratix series of devices, the software uses the following rules to determine whether a RAM should be placed in logic cells or a dedicated RAM block:
■ If the number of words is less than 16, use a RAM block if the total number of bits is greater than or equal to 64.
■ If the number of words is greater than or equal to 16, use a RAM block if the total number of bits is greater than or equal to 32.
■ Otherwise, implement the RAM in logic cells.
For the Cyclone series of devices, the software uses the following rules:
■ If the number of words is greater than or equal to 64, use a RAM block.
■ If the number of words is greater than or equal to 16 and less than 64,use a RAM block if the total number of bits is greater than or equal to 128.
■ Otherwise, implement the RAM in logic cells.
看完这些单词,其实两个问题我们都解决了。当然如果你对软件不够熟悉,对这段介绍所处的背景不够熟悉,那么也许你只明白了第一个问题。那么我们在唠叨下第 一个问题怎么回事。它说到了Cyclone系列(我想也应该包括了Cyclone II/III)的Auto规则是判断存储量若大等于64个words则使用RAM块,若大等于16个且小于64个words时总bits数大等于128则 使用RAM块,其它时候使用逻辑资源实现。
好,下面我们来解决第二个问题,做RAM to Logic Cell Conversion约束。在做这个约束之前,其实是有一些限制的,并不是所有的存储器都可以随意的实现用逻辑资源代替RAM块。
首先,在Fitter后,只有single-port 或 simple-dual port RAMs并且没有被初始化的存储器才可以实现RAM to Logic Cell Conversion约束。看到这句话的时候特权同学比较伤心,因为回头看看自己期望优化的占用率低的存储器居然恰好没有满足条件。其次,这个功能有一个 大大的背景,特权同学绕了好久也试了好久才发现,作为读者肯定是幸运的,不用再绕了,且听特权同学分解。
这个功能其实对于在Megawizard中例化的存储器是不太适用的,或者确切的说转换的对象不是针对这类存储器。它是针对设计者代码写出来的一些比较大 的寄存器(或相关存储器)而言的,在开启该选项后,设计者代码所用到的这些寄存器就会遵循上文所述的规则来决定是用逻辑资源实现还是嵌入式存储器实现。
通常我们可以通过Fitter报告里的RAM Summary来了解设计实现的存储器情况。如图3所示,这里我们看到Location选项里罗列出了每个存储器所使用的具体的M9K块名称。
图3
如果用前面说到的代码综合成的嵌入式存储块占用的情况,那么可以右击相应的存储器名称,然后选择LocationàLocation In Assignment Edit。进入如图4所示的Assignment约束窗口中,Assignment Name一栏选择Auto RAM to Logic Cell Conversion.
图4
保存设置后,重新Fitter。Fitter完毕,首先我们会发现资源占用率提高了,多使用了一些LEs。其次,再看Fitter报告里的RAM Summary时,之前被约束的存储器不见了。当然了,这些可能情况必须是在我们所约束的存储器满足特定条件的情况下。
除此以外,关于内部代码综合成片内存储器的相关选项还有Auto ROM Replacement、Auto RAM Replacement等,在RAM Style and ROM Style—for Inferred Memory一小节中也介绍了使用代码注释的方式来强制约束综合的结果。感兴趣的朋友也可以自己到Handbook中搜索一下。
回到Megawizard中例化的存储器上来,如果非要它们也完全使用逻辑资源实现也还是有办法的。答案和特权同学一开始推测的一样。还是拿FIFO来 说,如图5所示的配置页面中,勾选上“Implement FIFO storage with logic cells only, even……”即可。
图5
到底是使用逻辑资源实现还是嵌入式存储块实现其实本不存在问题,开发工具其实都在做一些很智能的选择和配置。但是在特定的应用场合中,难免会有一些特殊的用法牵涉其中在,这时候就要有一些特殊的方式来重新改变工具默认的处理方法。