在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文章
129瀏覽量
24099
原文標題:HLS中的數組初始化問題
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論