在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文章
128浏览量
24025
原文标题:HLS中的数组初始化问题
文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论