高層次綜合(HLS)-簡介

    本文是關於Xilinx HLS的簡單介紹,從HLS是什麼以及HLS的優點出發,進一步闡述了其功能,並針對Xilinx官方的例子對其進行了分析。關鍵觀點包括html

  • HLS採用C/C++等高級語言描述功能,能夠下降FPGA代碼的開發時間
  • HLS的應用對象是硬件工程師,IP的架構設計依舊由工程師自行指定
  • Vivado HLS提供了一套較爲完整的代碼開發、性能分析和優化、C/RTL仿真、IP導出流程

1.使用HLS的動機

    HLS(High Level Synthesis,高層次綜合)是一種代碼的綜合技術,特別的,本文中描述的HLS特指Xilinx FPGA上應用的HLS。FPGA的基本知識能夠從FPGA學習之基本結構獲得。Xilinx的文檔《Introduction to FPGA Design with Vivado High-Level Synthesis》中的兩幅圖能夠很好的回答這一問題。算法

image

    上圖代表,雖然FPGA具備的高的性能,然而採用RTL設計FPGA代碼須要較長的開發時間。編程

image

    然而,採用HLS以後,FPGA開發的時間大大下降了,甚至可能低於DSP和GPU;這大大加速的FPGA的開發時間,使得開發具備了更強的靈活性和高效性,HLS的逐步完善使得FPGA的開發高效性更進一步。技術的發展使得人們能夠把精力放在設計上,而更少的去關注底層的具體實現。架構

2.HLS是什麼?

    Vivado的HLS工具的前世此生能夠從AutoESL與Xilinx那些人和事中看到,這篇文章寫得頗有趣。HLS是高層次綜合的的簡稱,「綜合」即「Synthesis」,在ug627《XST User Guide》中解釋綜合是將程序代碼翻譯爲稱爲NGC的特殊網表文件中,這樣纔可以對其進行實現。ide

    至於「層次」,或許能夠這樣理解。書中通常把FPGA設計分爲如下幾個級別(對於這個分級實際上沒有一個特定的說法,能夠參考第13章抽象級別的描述):工具

  • 系統級
  • 算法級
  • RTL級
  • 門級、開關級

    通常認爲RTL級及如下設計是可用的,「層次」即從什麼角度去描述想要實現的功能。譬如,a xor b採用門級描述就是a,b是一個異或門的輸入;而採用高一點層次描述就是a+b。顯然,越低層次的描述越困難,後文例子中也能發現這一點。oop

   HLS就是從高層次描述,以後綜合成可用的網表文件的技術。這裏的「高」指採用C、C++等編寫程序,而不是傳統的HDL語言。然而,實際上Vivado套件中是預先採用Vivado HLS這個軟件將C程序轉換成爲Verilog HDL或者VHDL代碼,以後進行下一步操做的,並非直接綜合C代碼。性能

3.Vivado HLS的使用

    《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 }
View Code

    代碼實現了一個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能夠優化吞吐量,緣由以下圖所示

image

 

image

3.4 C/RTL仿真

    在HLS中進行仿真較爲簡單,採用testbench完成c語言的仿真後,RTL的仿真過程可由綜合器自動完成,點擊按鈕便可。也可具體查看仿真波形。

3.5 導出IP

 

4. 參考資料

ug902《Vivado Design Suite User Guide:High-level Synthesis》

ug871《Vivado Design Suite Tutorial :High-level Synthesis》

相關文章
相關標籤/搜索