本文是關於Xilinx HLS的簡單介紹,從HLS是什麼以及HLS的優點出發,進一步闡述了其功能,並針對Xilinx官方的例子對其進行了分析。關鍵觀點包括html
- HLS採用C/C++等高級語言描述功能,能夠下降FPGA代碼的開發時間
- HLS的應用對象是硬件工程師,IP的架構設計依舊由工程師自行指定
- Vivado HLS提供了一套較爲完整的代碼開發、性能分析和優化、C/RTL仿真、IP導出流程
HLS(High Level Synthesis,高層次綜合)是一種代碼的綜合技術,特別的,本文中描述的HLS特指Xilinx FPGA上應用的HLS。FPGA的基本知識能夠從FPGA學習之基本結構獲得。Xilinx的文檔《Introduction to FPGA Design with Vivado High-Level Synthesis》中的兩幅圖能夠很好的回答這一問題。算法
上圖代表,雖然FPGA具備的高的性能,然而採用RTL設計FPGA代碼須要較長的開發時間。編程
然而,採用HLS以後,FPGA開發的時間大大下降了,甚至可能低於DSP和GPU;這大大加速的FPGA的開發時間,使得開發具備了更強的靈活性和高效性,HLS的逐步完善使得FPGA的開發高效性更進一步。技術的發展使得人們能夠把精力放在設計上,而更少的去關注底層的具體實現。架構
Vivado的HLS工具的前世此生能夠從AutoESL與Xilinx那些人和事中看到,這篇文章寫得頗有趣。HLS是高層次綜合的的簡稱,「綜合」即「Synthesis」,在ug627《XST User Guide》中解釋綜合是將程序代碼翻譯爲稱爲NGC的特殊網表文件中,這樣纔可以對其進行實現。ide
至於「層次」,或許能夠這樣理解。書中通常把FPGA設計分爲如下幾個級別(對於這個分級實際上沒有一個特定的說法,能夠參考第13章抽象級別的描述):工具
通常認爲RTL級及如下設計是可用的,「層次」即從什麼角度去描述想要實現的功能。譬如,a xor b採用門級描述就是a,b是一個異或門的輸入;而採用高一點層次描述就是a+b。顯然,越低層次的描述越困難,後文例子中也能發現這一點。oop
HLS就是從高層次描述,以後綜合成可用的網表文件的技術。這裏的「高」指採用C、C++等編寫程序,而不是傳統的HDL語言。然而,實際上Vivado套件中是預先採用Vivado HLS這個軟件將C程序轉換成爲Verilog HDL或者VHDL代碼,以後進行下一步操做的,並非直接綜合C代碼。性能
《Vivado Design Suite Tutorial :High-level Synthesis》是一本針對Xilinx HLS的很好的入門指南。經過幾個具體的例子,文檔手把手的介紹了Vivado HLS的使用方式以及功能。本節將更進一步的對其進行補充學習
3.1 C代碼編寫優化
Vivado HLS實現的最基本的功能是將C/C++代碼綜合爲HDL代碼。因此編程使用的語言是C/C++語言。下面是其中的一個例子(代碼爲Xilinx例程)
1 *******************************************************************************/ 2 #include "fir.h" 3 4 void fir ( 5 data_t *y, 6 coef_t c[N], 7 data_t x 8 ) { 9 #pragma HLS INTERFACE ap_vld port=x 10 11 #pragma HLS RESOURCE variable=c core=RAM_1P_BRAM 12 13 14 static data_t shift_reg[N]; 15 acc_t acc; 16 data_t data; 17 int i; 18 19 acc=0; 20 Shift_Accum_Loop: for (i=N-1;i>=0;i--) { 21 if (i==0) { 22 shift_reg[0]=x; 23 data = x; 24 } else { 25 shift_reg[i]=shift_reg[i-1]; 26 data = shift_reg[i]; 27 } 28 acc+=data*c[i];; 29 } 30 *y=acc; 31 }
代碼實現了一個FIR濾波器,輸入輸出關係以下式所示
和編寫通常的C代碼不一樣,編寫HLS代碼依舊須要保留硬件的思想,時刻注意硬件的限制。這一點也能夠從工具的名字看出,Vivado這套設計套件是提供給硬件工程師使用的。在進行C代碼設計以前,咱們須要對數據從哪來,寫到哪裏去,計算過程當中的並行度/流水線和各種存儲的訪問有明確的設計。C代碼實際上只是具體設計的描述,其編寫方式不是隨意的。
3.2 Pragma
和通常C代碼不一樣,HLS裏有特定的Pragma來對代碼進行進一步指定,這是由於從C代碼中,編譯器每每得不到足夠的信息來完成優化工做,譬如
這一些沒法在C代碼中指定的內容,能夠採用Pragma進行指定,以對綜合過程進行更高的控制。
譬如在上述FIR濾波器的例子中,可使用採用更多的資源進行乘加操做,以達到更高的性能,同時對存儲進行設計以防止訪存的衝突,具體的pragma爲
#pragma HLS UNROLL
#pragma HLS ARRAY_PARTITION variable=shift_reg complete dim = 1
3.3 性能分析
能夠在綜合後的報告中對Performance進行評估,也能夠在Analysis窗口進行其調度的進一步分析,以判斷性能是否知足預期,以下圖所示
能夠看到當了UNROLL LOOP操做後,吞吐量獲得了提高(solution3 v.s. solution1)。上述優化以吞吐量爲目標的,利用流水結構以及Unrolled loop能夠優化吞吐量,緣由以下圖所示
3.4 C/RTL仿真
在HLS中進行仿真較爲簡單,採用testbench完成c語言的仿真後,RTL的仿真過程可由綜合器自動完成,點擊按鈕便可。也可具體查看仿真波形。
3.5 導出IP
略
ug902《Vivado Design Suite User Guide:High-level Synthesis》
ug871《Vivado Design Suite Tutorial :High-level Synthesis》