在HLS中使用數(shù)組時,尤其是對數(shù)組初始化時,盡可能加上關(guān)鍵字static,這樣C++中數(shù)組的行為才能與RTL中存儲單元的行為保持一致。例如:將FIR濾波器系數(shù)存儲在數(shù)組coeff中,由于系數(shù)固定不變,可以斷定該數(shù)組最終映射為RTL中的ROM。
添加static之后,每次函數(shù)在被執(zhí)行時,數(shù)組coeff都會記住其前一次被調(diào)用時的值。這就要理解static在C++中的含義,即static規(guī)定其指定的變量存儲方式為靜態(tài)存儲方式,每次調(diào)用的初始值為上一次調(diào)用的值,調(diào)用結(jié)束后存儲空間不釋放。對于指定static關(guān)鍵字的變量,VitisHLS在生成RTL代碼時會對其先進(jìn)行初始化。
如果數(shù)組在整個函數(shù)執(zhí)行過程中只發(fā)生讀操作而沒有寫操作,那么建議添加關(guān)鍵字const,以保證VitisHLS能正確推斷出ROM。
如果在ROM的初始化過程中出現(xiàn)復(fù)雜的運算,例如使用了math.h中的函數(shù)等,建議將初始化過程單獨封裝為一個函數(shù)。我們來看一個案例。在下面的代碼中,函數(shù)init_sin_table用于初始化數(shù)組sin_table。在其初始化過程中會調(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ù)完成最終的乘法運算。
從HLS綜合后的報告來看,最終sin_table的存儲形式(報告中的Storage列)為rom_1p,實現(xiàn)方式為auto,Latency為1。在資源評估報告中可以看到消耗了1個BRAM。
編輯:jq
-
HLS
+關(guān)注
關(guān)注
1文章
130瀏覽量
24167
原文標(biāo)題:HLS中的數(shù)組初始化問題
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論