在HLS中使用數(shù)組時,尤其是對數(shù)組初始化時,盡可能加上關鍵字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關鍵字的變量,VitisHLS在生成RTL代碼時會對其先進行初始化。
如果數(shù)組在整個函數(shù)執(zhí)行過程中只發(fā)生讀操作而沒有寫操作,那么建議添加關鍵字const,以保證VitisHLS能正確推斷出ROM。
如果在ROM的初始化過程中出現(xiàn)復雜的運算,例如使用了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,并添加關鍵字static。在代碼第17行調(diào)用了函數(shù)init_sin_table完成數(shù)組初始化。第18行則是從sin_table中獲取相應地址上的數(shù)據(jù)完成最終的乘法運算。
從HLS綜合后的報告來看,最終sin_table的存儲形式(報告中的Storage列)為rom_1p,實現(xiàn)方式為auto,Latency為1。在資源評估報告中可以看到消耗了1個BRAM。
編輯:jq
-
HLS
+關注
關注
1文章
133瀏覽量
24876
原文標題:HLS中的數(shù)組初始化問題
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
定義IO初始化結(jié)構(gòu)體
IM 系列設備過載保護機制下界面初始化中斷的底層邏輯與解決方案
STM32CubeMX用于STM32配置和初始化C代碼生成
AFE031初始化的過程應該是什么?
EE-359:ADSP-CM40x啟動時間優(yōu)化和器件初始化

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

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

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

segger編譯器初始化問題
TLV320AIC3254初始化的時間大概是多長?
如何避免自動初始化組件被截斷的情況?
Keil中變量不被初始化方法

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

評論