FPGA是一個很特殊的芯片,,可能在2個月前,,我還對它一無所知,。我們熟知的芯片都是CPU,,GPU,,或者知道ASIC的概念。但實際上,,F(xiàn)PGA已經(jīng)走過了30個年頭,,它目前已經(jīng)成為一個包含各種先進電路,邏輯單元,,接口,,芯片封裝,制造等技術的“集大成者”,。在硬件不斷發(fā)展的同時,,F(xiàn)PGA的開發(fā)軟件和設計工具也在不斷迭代和更新?;谟布枋稣Z言HDL,,抽象出HLS(High-Level Synthesis)(翻譯為高層次綜合?怎么聽起來都沉得別扭)技術,,通過高層設計去隱藏很多底層邏輯和細節(jié),,讓FPGA的開發(fā)更加簡單。即使這樣,,F(xiàn)PGA開發(fā)還是同CPU,,GPU不一樣,它需要設計者在一定程度上了解FPGA的內(nèi)部架構,,這樣才能引導高層語言綜合工具睡時到優(yōu)化的系統(tǒng)性能,。
一:開發(fā)FPGA的痛點
首先,F(xiàn)PGA的體量非常大,,大得驚人,,英特爾最新的StraTIx10 GX 10M 有 433億只晶體管,1020萬個可編程邏輯單元,,以及2304個可編程的I/O接口,。這些數(shù)量龐大的晶體管組成了大量的可編程邏輯單元和查找表結(jié)構,大量運算單元,,各種類型和大小的內(nèi)存資源,,高速串行I/O,多個嵌入式處理器,,還有成百上午種不同功能的軟核和硬核IP,。因為可編程,可以通過定制實現(xiàn)極高吞吐量和極低的功耗,。
當這么多硬件資源都集成到了一個芯片上,,用戶如何對這些硬件進行編程呢,?
通常來說,我們要解決一個復雜問題,,常用的辦法就是分解任務,,我們需要劃分清楚哪些是在硬件上完成,哪些通過軟件完成,。在FPGA,,這種分解非常困難和復雜。例如:哪部分用編程邏輯(硬件),,哪部分使用片上的芯片,。如何合理分配片上內(nèi)存,內(nèi)不足時,,如何優(yōu)化……
如何降低FPGA的開發(fā)難度,,EDA軟件一定要好用,所以,,不管英特爾還是賽靈思,,包括我了解的一個新創(chuàng)團隊,都會在EDA軟件團隊上做大力投入,,甚至做EDA軟件開發(fā)的人員要多于FPGA本身的工程師數(shù)量,。另外,業(yè)界也出現(xiàn)了大量的第三方公司,,負責FPGA設計咨詢公司,,IP提供商,外包公司等……,,業(yè)務已經(jīng)發(fā)展產(chǎn)生了很多特定的分工,。
當前,F(xiàn)PGA還在進入更多的市場,,比如:嵌入式應用,,5G和汽車市場,這些領域中的大多數(shù)開發(fā)團隊都沒有FPGA相關的設計專業(yè)知識和經(jīng)驗,。而且,他們更多是純軟件開發(fā),,更多依賴于人工智能技術,。這些也使得FPGA的開發(fā)難度被放大。
二:HLS——讓軟件工程師開發(fā)FPGA
HLS指的是通過EDA工具,,將描述的邏輯結(jié)構轉(zhuǎn)換成低抽象級語言描述的電路模型的過程,。
這里,我不得不再強調(diào)一下HLS的概念,,因為記不住,,搞不太懂,。
High-Level Synthesis 簡稱:HLS 指的是將高層次語言描述的邏輯結(jié)構,自動轉(zhuǎn)換成低抽象級語言描述的電路模型的過程,。有點象我們軟件領域講的 Java 語法在運行時,,根據(jù)不同的機器翻譯成不同的機器字節(jié)碼。所謂高層次語言,,通常指的是 C,,C++,SystemC等,,通常有點較高的抽象度,,并且往往不具有時鐘或時序的概念,相比之下,,諸如Verilog,,VHDL,SystemVerilog等低層次語言,,通常用來描述時鐘周期精準的寄存器傳輸級電路模型,,這也就是當前ASIC或者FPGA設計最為普遍使用的電路建模和描述方法。
為什么要使用HLS,?
1: 這是一個趨勢,。因為集成電路的復雜度太高,已經(jīng)逐漸超過人類可以手工管理的范疇,。使用RTL代碼,,代碼行過多,不現(xiàn)實,。而使用C,,C++ 等高層語言,可以將代碼縮至10%,。
根據(jù)NEC2004年發(fā)布的研究,,一個擁有100萬邏輯門的芯片設計通常要編寫30萬行RTL代碼。
2: 高層語言更善于復用,,特別是對于IP的重用,。
因為傳統(tǒng)的RTL的IP 往往需要定義固定的架構和接口標準,在IP重用時,,需要大量的時間運行系統(tǒng)互聯(lián)和接口驗證,。高層語言屏蔽了這些要求,轉(zhuǎn)而由HLS工具具體來負責完成?,F(xiàn)代FPGA有大量的IP單元,,這些IP有固定功能,一定需要大量復用,。
3: HLS能幫到軟件和算法工程師參與主導芯片設計,,這是因為HLS能夠屏蔽實現(xiàn)細節(jié),。對于硬件工程師,HLS也能幫助他們快速設計迭代,,專注于性能,,面積或功耗模塊,不用關注上層的算法實現(xiàn),。
我們在談HLS前,,先看看RTL的發(fā)展:
通過描述寄存器到寄存器之間的邏輯功能描述電路的HDL層次。RTL級是比門級更高的抽象層次,,使用RTL級語言描述硬件電路一般比門級描述簡單高效得多,。這個時期,工程師們都在關注RTL,。
HLS經(jīng)過發(fā)展,,產(chǎn)生了以C++ 為主的目標語言,從而被很多不少不了解RTL的工程師所接受,。而且,,HLS在性能上也近似RTL的水平。
到現(xiàn)在,,英特爾,,賽靈思,包括多倫多大學都推出了各自的HLS工具,。
其中比較成功的工具是AutoPilot,,
前端,它使用了LLVM的編譯器架構,,能夠使用C,,C++,OSCI SystemC等語言,,使用llvm-gcc編譯器將高層語言模型轉(zhuǎn)換為IR,,優(yōu)化后,再根據(jù)具體的硬件平臺,,生成RTL代碼,。
AutoPilot在某些領域完勝人工優(yōu)化RTL的結(jié)果。說明了HLS的潛力,。
HLS的主流優(yōu)化方法有以下幾種:
1: 字長分析和優(yōu)化,。
FPGA的一個最主要特點可以使用任意字長,所以 HLS工具也不需要拘泥于某種固定的長度,。好處呢,,對性能提升和面積縮減有幫助,。
2: 循環(huán)優(yōu)化
可以使用多面體模型來達成循環(huán)優(yōu)化,,可以幫助實現(xiàn)性能和面積優(yōu)化,,同時也能幫助提升內(nèi)存的使用效率。
3: 對并行的支持,。
RTL是可以直接實例化成多個運算單元并行執(zhí)行的,,C/C++ 一開始是順序執(zhí)行,但后面也引入的并行支持,。如:pthreads和OpenMP等多線程并行編程方法,,以及OpenCL等針對GPU異桅系統(tǒng)進行并行編程的擴展。
作為HLS工具,,一定要支持并行,。比如:lgeup就整合了對pthead,OpenMP的支持。英特爾推出了OpenCL SDK,,將其引和HLS,,并生成FPGA硬件電路邏輯和CPU代碼兩部分,從而實現(xiàn)FPGA作為硬件加速模塊的快速開發(fā),。
盡管如此,,HLS要完全替代人工的RTL建模,還有很長的路要走,。對于FPGA而言,,內(nèi)存瓶頸是制約性能的關鍵要素,所以,,如何有效利用片上和片外的各類存儲單元,,是HLS的研究熱點。
P4 語言是實現(xiàn)SDN 的重要手段,,所以,,新型的FPGA開發(fā)工具,需要對P4進行編譯和支持,。
三:商業(yè)級的開發(fā)工具
3.1 賽靈思ViTIs 開源開發(fā)工具
ViTIs花費了 1000人,。年的開發(fā)工作量。
ViTIs的核心架構示意圖如下:
3.2 英特爾oneAPI
OneAPI 可以針對英特爾的所有芯片進行編程,。
英特爾將旗下的芯片分成了SVMS四類:
標量架構(Scalar):CPU
矢量架構(Vector):GPU
短陣架構(Matrix):AI芯片
空間架構(Special): FPGA.
四:業(yè)界看法
業(yè)界普遍認為,,GPU之所以在人工智能獲得成功,很大程度上取決于對軟件和算法工程師的友好,。而FPGA雖然在不斷擴展應用范圍,,在性能和功耗上也不比GPU差,但是,,它的編程仍然是以RTL開發(fā)為主,,這對開發(fā)者并不算友好。
所以,,F(xiàn)PGA在HLS上的發(fā)展和突破,,可能是FPGA能否有更廣泛應用的最后一塊拼圖,。
更多信息可以來這里獲取==>>電子技術應用-AET<<