我們在設計硬件時,它往往是要求更精確的位寬。例如,一個filter的輸入是12位和一個累加器的結果只需要一個最大范圍為27位。然而對于硬件設計來說,使用標準的C數據類型會造成硬件成本的浪費。這就會造成我們要使用更多的LUT和寄存器,延遲甚至可能超過時鐘周期和需要更多的周期來計算結果。這往往不是我們需要的結果。因此下面我將介紹如何利用Vivado HLS處理許多位準確或任意精度數據類型,以及允許使用任何(任意)寬度的模型變量。
C-base 數據類型
我們從硬件的角度來看數據類型,采用C/C++的數據類型都是以8bit為邊界,即:
? char (8-bit)
? short (16-bit)
? int (32-bit)
? long long (64-bit)
? float (32-bit)
? double (64-bit)
? 確切的寬度的整數類型如int16_t (16-bit) 和 int32_t (32-bit)
注意:char16_t和char32_t在Vivado Hls 中是不支持的
從上面發現,C的數據位寬是比較死板的,然而描述RTL里面的位寬是任意的。
例如,采用C語言去描述一個18*18 bits的乘法器,那么就需要將輸入數據都聲明為32 bits(int),結果聲明為64 bits(long long),這將會在FPGA中消耗4個DSP48E1,顯然這是很浪費資源的。
任意精度數據類型 Language Integer Data Type Required Header
C ? [u]int< W>(1024 bits) ? .#include< ap_cint.h>
C++ ? ap_[u]int< W>(1024 bits) ? .#include< ap_int.h>
C++ ? ap_[u]fixed< W,I,Q,O,N> ? .#include< ap_fixed.h>
其優點有:1.更高的時鐘頻率 2.更好的數據吞吐率 3.消耗資源更少
因此,使用任意精度數據類型能以更少的資源,獲得相同的精度,同時可以運行在更高的時鐘頻率下。
注意:在聲明任意數據類型的時候,我們往往在頭文件里面聲明,這會使得我們在做debug的時候會非常有用。
C-base 數據類型project
Step1 創建和打開project
I.打開Vivado HLS Command Prompt,按照下圖輸入命令
II.輸入vivado_hls -p window_fn_prj
Step2 Review Test Bench 和run C SimulaTIon
I.在Source打開window_fn_top.cpp
II.找到window_fn_top.h,按住Control鍵,并右擊,打開window_fn_top.h(頭文件)
在這里,我們可以看到,本設計所有數據類型的操作都是標準C/C++的浮點型。
III點擊Run C SimulaTIon
Step3 Run C SimulaTIon 和 Review Results
I.點擊Run C Synthesis
圖中我們發現,頂層中的instances占用了大部分資源。
II.打開Interface Summary
III.點擊Analysis,打開winfn_loop
這是浮點型乘法器(fmul),圖中可以看出,第一個狀態是讀取內存操作(兩個周期),然后是fmul操作(五個周期),最后的操作狀態是一個寫內存操作(一個周期)
III.退出Vivado Hls,并返回到command prompt
任意數據類型project
Step1 創建和仿真project
I.打開Vivado HLS Command Prompt,按照下圖輸入命令
II.輸入vivado_hls -p window_fn_prj
III.在Source打開window_fn_top.cpp
IV.找到window_fn_top.h,按住Control鍵,并右擊,打開window_fn_top.h(頭文件)
這里的數據類型的操作是ap_fixed點類型,它類似于float和double(因為它們支持整數和分數位表示的類型),window_fn_top.h是唯一不同于上一個project的頭文件。這些數據類型是在頭文件中定義的ap_fixed。
注意:你可以通過修改C代碼,將任意精度類型代替標準C類型,在這里必須做的更改是減少數據類型的大小。在這例子中,我們使用8位,24位,和18位,而不是32位浮點類型。通過較少的操作,減少面積,和更少的時鐘周期就可以完成project。我們也可以改變更常見的C類型(如int,short,和char),例如,更改數據類型(18位int(32位))可以確保只要一個dsp48就可以執行任何乘法,但是你必須確認設計仍然執行正確的操作和它這樣做所需的精度。由VIvado Hls提供的任意精度類型的好處是,可以仿真更新的C代碼來確認其功能和準確性。
V.點擊Run C SimulaTIon
控制臺面板顯示了C仿真的結果。隨著數據類型的更新,結果不再跟預期結果相同,然而他們是在誤差范圍內。
Step2 Run C Synthesize和 Review Results
I.點擊Run C Synthesis
注意:通過使用任意精度類型,已經減少了延遲和面積(50%和80%),并簡化了RTL硬件的操作。由于memory中的總位小于1024 bit,所以現在是自動執行LUTs和FFS而不是模塊RAM。
II.打開Interface Summary
注意:現在的數據端口是8 bits和24 bits
III.點擊Analysis,打開winfn_loop
總結
本文介紹任意精度數據類型的處理方法。通過Vivado HLs中兩個project的比較,得到結論,跟C-base 數據類型相比,使用任意精度數據類型能以更少的資源,獲得相同的精度,同時可以運行在更高的時鐘頻率下。