在HLS中使用數(shù)組時(shí),尤其是對(duì)數(shù)組初始化時(shí),盡可能加上關(guān)鍵字static,這樣C++中數(shù)組的行為才能與RTL中存儲(chǔ)單元的行為保持一致。例如:將FIR濾波器系數(shù)存儲(chǔ)在數(shù)組coeff中,由于系數(shù)固定不變,可以斷定該數(shù)組最終映射為RTL中的ROM。
添加static之后,每次函數(shù)在被執(zhí)行時(shí),數(shù)組coeff都會(huì)記住其前一次被調(diào)用時(shí)的值。這就要理解static在C++中的含義,即static規(guī)定其指定的變量存儲(chǔ)方式為靜態(tài)存儲(chǔ)方式,每次調(diào)用的初始值為上一次調(diào)用的值,調(diào)用結(jié)束后存儲(chǔ)空間不釋放。對(duì)于指定static關(guān)鍵字的變量,VitisHLS在生成RTL代碼時(shí)會(huì)對(duì)其先進(jìn)行初始化。

如果數(shù)組在整個(gè)函數(shù)執(zhí)行過程中只發(fā)生讀操作而沒有寫操作,那么建議添加關(guān)鍵字const,以保證VitisHLS能正確推斷出ROM。
如果在ROM的初始化過程中出現(xiàn)復(fù)雜的運(yùn)算,例如使用了math.h中的函數(shù)等,建議將初始化過程單獨(dú)封裝為一個(gè)函數(shù)。我們來看一個(gè)案例。在下面的代碼中,函數(shù)init_sin_table用于初始化數(shù)組sin_table。在其初始化過程中會(huì)調(diào)用math.h中的函數(shù)sin。
sin要求其形參為float或double。函數(shù)lookup_math中聲明了數(shù)組sin_table,并添加關(guān)鍵字static。在代碼第17行調(diào)用了函數(shù)init_sin_table完成數(shù)組初始化。第18行則是從sin_table中獲取相應(yīng)地址上的數(shù)據(jù)完成最終的乘法運(yùn)算。

從HLS綜合后的報(bào)告來看,最終sin_table的存儲(chǔ)形式(報(bào)告中的Storage列)為rom_1p,實(shí)現(xiàn)方式為auto,Latency為1。在資源評(píng)估報(bào)告中可以看到消耗了1個(gè)BRAM。


編輯:jq
-
HLS
+關(guān)注
關(guān)注
1文章
135瀏覽量
25829
原文標(biāo)題:HLS中的數(shù)組初始化問題
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
PC強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制(一):C#的EtherCAT總線初始化(下)
RK平臺(tái)網(wǎng)絡(luò)問題排查指南:從初始化到吞吐量,一文搞定常見故障
國民技術(shù)發(fā)布N32Cube芯片配置與初始化代碼生成工具
MCU工程初始化,到底該不該交給工具?
EtherCAT總線初始化步驟
數(shù)組的初體驗(yàn)
瀚海微SD NAND TF卡硬件識(shí)別與初始化類問題探討
串口通信基石:Air8000下Modbus RTU串口初始化詳解!
NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)33:初始化功能驗(yàn)證與分析
GraniStudio:IO初始化以及IO資源配置例程
GraniStudio:初始化例程
簡述HLS中的數(shù)組初始化遇到的那些個(gè)問題
評(píng)論