《ALTERA Cyclone 10器件的使用-7:FPGA片内RAM资源利用率思考》
概述
项目使用的FPGA目标器件为Cyclone 10 GX系列规模最大一颗料,由于功能升级增加了功能模块更多,发现器件片内RAM不够使用了。为了探索片内RAM使用的利用率问题,从代码RTL级与编译软件的优化选项方面进行了思考。表1是器件手册中给出的C10GX器件片内RAM颗粒,即M20K,可配置模式。
表1:Intel Cyclone 10 GX器件单端口片内存储器配置
表2:Intel Cyclone 10 GX器件中片内存储器性能及分布
升级的项目,在之前逻辑设计的基础上增加了两个模块,理论上存储器消耗要增加一倍。逻辑修改后,工程全编译时,在Fit阶段报错,提示目标器件无法提供足够的RAM来完成布局,如图1所示。
Info(170034): Selected device has 587 memory locations of type M20K block. The current design requires 626 memory locations of type M20K block to successfully fit.
Info(170033): Memory usage required for the design in the current device: 107% M20K block memory block locations required
Info(170043): The Fitter setting for Equivalent RAM and MLAB Paused Read Capabilities is currently set to Care. More RAMs may be placed in MLAB locations if a different paused read behavior is allowed.
在Quartus的Settings设置中,找到编译器设置页面,并在该页面中找到属于Fitter的Settings高级设置按钮,如图2所示,并点击此按钮进入高级Fitter设置页面。
如图3所示,为Fitter的高级设置页面,找到“Equivalent RAM and MLAB Paused Read Capabilities”设置选项,可以将默认设置“Care”修改为“Don’t Care”,如此再重新编译后则可以解决上述报错问题,如图4。
如图4所示,虽然经过上述修改解决该报错问题,但是整个RAM消耗已经达到了100%。100%的RAM消耗率,如果设计功能已经达到目标要求,则是可以作为最终设计提交,但是这仅仅这是项目的预先编译评估,所以并不能就此停止。比如,在后期调试时需要添加SignalTap功能的时候,就可能面临无RAM可用的情况。同时,还需要了解上述设置修改对逻辑设计是否产生负面影响进行评估,即需要对该设置进行深入了解,否则不要轻易修改默认设置。
如果需要进一步减小RAM消耗,那么就需要针对当前设计进行深度优化,这是下一节的内容。
片内RAM耗尽后,优化思考
Cyclone 10 GX最大型号器件,总共有587颗片内M20K颗粒,如图4所示,按照图3所示对Fitter高级设置进行修改后,对工程再编译,全编译无报错通过,编译报告提示所有M20K颗粒已经100%耗尽。
如果查看Fitter给出的各个M20K颗粒使用详尽信息,可以发现,各个颗粒容量的使用率不尽相同,有些颗粒甚至使用了不到1%,如图5所示,这些颗粒有12个。
上述不到1%利用率的M20K颗粒很大可能是为了与其它颗粒“凑整”过程中被消耗的,一旦被占据,该M20K颗粒空余空间就无法开放给其它逻辑使用了。如此大大降低了RAM颗粒的利用率,在进行逻辑设计的初始阶段就应该核算RAM、FIFO或ROM的大小与实际片内RAM颗粒的尺寸来进行规划,提高资源的利用效率。
举个简单的例子说明RAM被“奢侈”利用,AD9633分解为8个LVDS接收器通道,解串后得到了48-bit的并行数据,这时创建了一个FIFO来缓冲该数字转换数据,所以FIFO的位宽48-bit,深度选择为8。所以一个FIFO实际消耗384-bit的RAM,但是经过编译,该FIFO必须要使用2个M20K颗粒(共40960-bit)来实现,RAM利用率不到1%。是不是很奢侈,很浪费?!
这个FIFO的读写时钟不一样,所以属于异步FIFO,修改图3所示的高级设置选项也无法将FIFO转换为MLAB来实现。在例化FIFO的时候倒是可以强制指定使用MLAB来实现它。
参考
Intel Cyclone 10 Devvices Overview.
(请备注来意,加群请备注城市-称呼-行业岗位信息)