在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文章
131瀏覽量
24649
原文標(biāo)題:HLS中的數(shù)組初始化問題
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
STM32CubeMX用于STM32配置和初始化C代碼生成
初始化AFE4400的時(shí)候,哪些控制字是必須最先寫的?
AFE031初始化的過程應(yīng)該是什么?
EE-359:ADSP-CM40x啟動(dòng)時(shí)間優(yōu)化和器件初始化

EE-88:使用21xx編譯器在C中初始化變量

OMAP5912多媒體處理器初始化參考指南

STM32F407 MCU使用SD NAND?不斷電初始化失效解決方案

segger編譯器初始化問題
請(qǐng)問LMX2595配置時(shí)如何進(jìn)行初始化?
TLV320AIC3254初始化的時(shí)間大概是多長?
基于旋轉(zhuǎn)平移解耦框架的視覺慣性初始化方法

TMS320C6000 McBSP初始化

如何避免自動(dòng)初始化組件被截?cái)嗟那闆r?
Keil中變量不被初始化方法

瀚海微SD NAND應(yīng)用之SD協(xié)議存儲(chǔ)功能描述2 初始化命令

評(píng)論