在HLS中使用数组时,尤其是对数组初始化时,尽可能加上关键字static,这样C++中数组的行为才能与RTL中存储单元的行为保持一致。例如:将FIR滤波器系数存储在数组coeff中,由于系数固定不变,可以断定该数组最终映射为RTL中的ROM。
添加static之后,每次函数在被执行时,数组coeff都会记住其前一次被调用时的值。这就要理解static在C++中的含义,即static规定其指定的变量存储方式为静态存储方式,每次调用的初始值为上一次调用的值,调用结束后存储空间不释放。对于指定static关键字的变量,VitisHLS在生成RTL代码时会对其先进行初始化。

如果数组在整个函数执行过程中只发生读操作而没有写操作,那么建议添加关键字const,以保证VitisHLS能正确推断出ROM。
如果在ROM的初始化过程中出现复杂的运算,例如使用了math.h中的函数等,建议将初始化过程单独封装为一个函数。我们来看一个案例。在下面的代码中,函数init_sin_table用于初始化数组sin_table。在其初始化过程中会调用math.h中的函数sin。
sin要求其形参为float或double。函数lookup_math中声明了数组sin_table,并添加关键字static。在代码第17行调用了函数init_sin_table完成数组初始化。第18行则是从sin_table中获取相应地址上的数据完成最终的乘法运算。

从HLS综合后的报告来看,最终sin_table的存储形式(报告中的Storage列)为rom_1p,实现方式为auto,Latency为1。在资源评估报告中可以看到消耗了1个BRAM。


编辑:jq
-
HLS
+关注
关注
1文章
133浏览量
25599
原文标题:HLS中的数组初始化问题
文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
瀚海微SD NAND TF卡硬件识别与初始化类问题探讨
串口通信基石:Air8000下Modbus RTU串口初始化详解!
GraniStudio:IO初始化以及IO资源配置例程
GraniStudio:初始化例程
MCU外设初始化:为什么参数配置必须优先于使能
定义IO初始化结构体
IM 系列设备过载保护机制下界面初始化中断的底层逻辑与解决方案
STM32CubeMX用于STM32配置和初始化C代码生成
AFE031初始化的过程应该是什么?
EE-359:ADSP-CM40x启动时间优化和器件初始化
STM32F407 MCU使用SD NAND 不断电初始化失效解决方案

简述HLS中的数组初始化遇到的那些个问题
评论