HLS高层次设计综合技巧--数组优化设计(二)
2026/8/28 22:26:12 网站建设 项目流程

一、数组优化概述
1.HLS高层次综合的三大部件:函数,循环和数组
2.可见数组在HLS高层次综合中的重要性

二、数组对应硬件
1.数组综合后,通常作为RAM,ROM,FIFO来实现;
2.顶层函数接口的数组作为RTL端口来进行综合的,其内存都是外挂的


三、数组对于HLS优化设计存在瓶颈
1.数组的访问通常会造成性能瓶颈
2.数组的优化设计至关重要
3.数组作为RAM,ROM或者FIFO,端口数量是至关重要的
4.数组端口的数量是对设计的性能和瓶颈至关重要,端口的数量并不是越多越好,端口太多,会造成LUT资源爆炸;
5.数组的初始化至关重要,是否要初始化,如何进行初始化都是一门学问
6.数组初始化如未谨慎执行,则可能导致 RTL 中不必要的长时间复位和初始化。
7.如果要进行读写,指定为RAM,如果只读,指定为ROM


四、数组优化
1.使用数组最优化指令(Array_Partition、Array_Map 或 Array_Reshape)来重新配置数组结构,从而重新配置 I/O 端口数量。
2.使用数组备份的方式来进行优化,间接的扩大数组的的端口数量
3.赛灵思建议(但并不强制)将数组指定为作为含静态 (static) 限定符的内存来实现。这不仅可确保 Vivado®
HLS 以 RTL 中的内存来实现数组,还允许使用静态类型的初始化行为。

五、数组案例
1.案例一
int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8, -2};
这个代码默认是RAM来实现,默认为单口RAM,所以每次运行函数,都会执行这个初始化,
那么由于是单口RAM,那么需要8个clock周期来初始化这个数组;

2.案例二
static int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8, -2};
如果使用static限定符来定义coeff数组,那么该数组开始执行时会使用指定的值进行初始化;
每次执行该函数时,coeff 数组都会保留上次执行的值。静态数组在 C 语言代码中的行为与 RTL 中的内存行为相同。
使用了static限定符后,那么vivdo hls会对RTL设计和FPGA的比特流中的变量进行初始化,因此,无需经历多个时钟周期来初始化内存,并且可确保大型内存初始化不会产生任何运算开销。

3.注意,不管是staic修饰还是没有static修饰coeff,如果执行复位,就是需要额外的时钟开销
如果执行复位操作后内存将返回初始状态,则会导致运算开销,并且需要经历多个周期才能完成值的复位。每个值都必须写入每个内存地址。

六、数组实现ROM
1.ROM 的自动推断的一般规则是局部静态(非全局)数组先写入后读取。在代码中遵循下列实践有助于推断 ROM

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询