(上海交通大學(xué) 軟件學(xué)院,上海 200240)
隨著大數(shù)據(jù)分析和人工智能計(jì)算的大規(guī)模普及和應(yīng)用,數(shù)據(jù)中心的計(jì)算負(fù)載規(guī)模在不斷擴(kuò)大[1].在此背景下,將計(jì)算任務(wù)進(jìn)行分門別類,并根據(jù)不同任務(wù)的特點(diǎn)用專門設(shè)計(jì)的加速處理芯片取代通用處理器,從長(zhǎng)遠(yuǎn)來看成為了一種可行的降低成本或提高服務(wù)質(zhì)量的方式.其中,為人工智能計(jì)算特化的通用圖形處理器(generalpurposed GPU)和應(yīng)用專用處理芯片(application-specific integrated circuit)TPU[2]已在該領(lǐng)域取得了顯著成就.但是,數(shù)據(jù)中心中除了日益龐大的人工智能應(yīng)用以外,其他配套的支持計(jì)算也在相應(yīng)地?cái)U(kuò)大規(guī)模,這些方面包括數(shù)據(jù)庫處理、網(wǎng)絡(luò)通信、虛擬化支持等等.利用專用芯片來加速這些基礎(chǔ)計(jì)算同樣能夠獲得可觀的收益.使用硬件加速的理想情況是能夠直接部署經(jīng)過專門優(yōu)化的ASIC,但是ASIC 的設(shè)計(jì)、生產(chǎn)和部署都需要較長(zhǎng)的周期和較高的成本,在需要快速迭代的生產(chǎn)環(huán)境中或者在需要控制風(fēng)險(xiǎn)的情況下,FPGA 作為一種可重新配置的硬件平臺(tái)成為了一種首選的過渡或者替代方案[3,4].
FPGA 除了能夠在生產(chǎn)環(huán)境中作為專用芯片的一種過渡和替代,其優(yōu)秀的可定制性和可重配特點(diǎn)使得它在異構(gòu)計(jì)算的學(xué)術(shù)研究中也發(fā)揮著重要作用.與ASIC 相比,基于FPGA 的研究主要有兩點(diǎn)優(yōu)勢(shì):(1)區(qū)別于ASIC的靜態(tài)功能,FPGA 可重配特點(diǎn)引入的功能動(dòng)態(tài)變化在系統(tǒng)設(shè)計(jì)時(shí)可創(chuàng)造更多可能;(2)區(qū)別于ASIC 的流片流程,FPGA 的快速燒寫在降低成本的同時(shí)也使應(yīng)用可以快速地在硬件上驗(yàn)證并測(cè)試端到端的性能.這些特性近年來吸引了許多學(xué)者投入到FPGA 的應(yīng)用研究中,這些研究從最初的加速器設(shè)計(jì)慢慢擴(kuò)展到了與FPGA 相關(guān)的操作系統(tǒng)、體系結(jié)構(gòu)等領(lǐng)域[5-7].
然而,面向FPGA 硬件平臺(tái)的硬件設(shè)計(jì)和系統(tǒng)集成方法相較于軟件工程和程序語言領(lǐng)域的發(fā)展仍然處于十分初級(jí)的階段.目前主流的FPGA 加速系統(tǒng)的開發(fā)可以大致分為3 個(gè)部分:硬件加速器設(shè)計(jì)、軟件驅(qū)動(dòng)設(shè)計(jì)和軟件應(yīng)用集成.硬件設(shè)計(jì)雖然經(jīng)過了多年的發(fā)展,已經(jīng)形成了成熟的工具鏈,但是這些初衷是輔助專業(yè)硬件工程師的開發(fā)工具和語言,只提供十分底層的硬件抽象,例如寄存器和邏輯運(yùn)算.由于缺少指令集抽象,軟件工程師無法直接將算法映射成硬件邏輯,對(duì)于希望快速驗(yàn)證硬件加速有效性的云應(yīng)用開發(fā)者和實(shí)驗(yàn)室學(xué)者等非專業(yè)的硬件工程師來說,硬件設(shè)計(jì)無疑成為了利用FPGA 加速上門檻最高的一關(guān).而第2 個(gè)難點(diǎn)是需要實(shí)現(xiàn)驅(qū)動(dòng)軟件來構(gòu)建底層軟件和硬件的數(shù)據(jù)通信機(jī)制并提供接口給上層應(yīng)用.這一部分工作即使利用現(xiàn)成驅(qū)動(dòng)(例如PCIe DMA 驅(qū)動(dòng)),也需要對(duì)底層通信協(xié)議有充足的了解,并從軟硬件兩方面進(jìn)行適配:軟件需要對(duì)數(shù)據(jù)進(jìn)行序列化和反序列化,硬件則需要構(gòu)建加速器的外圍數(shù)據(jù)通信模塊.相比于硬件加速核心的設(shè)計(jì)和驗(yàn)證,這一步的工程量并不遜色甚至猶有過之.克服前兩點(diǎn)之后,需要經(jīng)過最后一步的軟硬件集成,開發(fā)者才能真正地對(duì)應(yīng)用進(jìn)行加速.此時(shí),可能由于前期軟硬件工程師協(xié)同的溝通失誤或者考慮欠缺,應(yīng)用的性能受限于不理想的硬件抽象和接口,如果需要改進(jìn),則往往需要重新進(jìn)行各部分的設(shè)計(jì).
FPGA 的高度可定制化給其帶來靈活性的同時(shí)也引入了功能是由硬件來實(shí)現(xiàn)還是由軟件來實(shí)現(xiàn)的權(quán)衡,如果開發(fā)框架不能提供清晰的軟硬件交互界面和設(shè)計(jì)空間定義,加速系統(tǒng)容易陷入軟硬件功能過于耦合,調(diào)試、迭代、維護(hù)十分困難的境地.為了提高FPGA 加速系統(tǒng)的開發(fā)效率,研究者們?cè)谝幻}相承的傳統(tǒng)硬件開發(fā)工具的基礎(chǔ)上提出了許多針對(duì)FPGA 特點(diǎn)的優(yōu)化框架以應(yīng)對(duì)不同的需求.從傳統(tǒng)的硬件描述語言開始,這些新的框架和工具主要走上了兩條道路:高層次綜合(high-level synthesis)和高級(jí)語言實(shí)現(xiàn)的硬件描述語言(high-level hardware description language).近年來,國內(nèi)外FPGA 應(yīng)用的研究已頗具規(guī)模[8,9],但是與國外傳承有序的EDA(electronic design automation)研究歷史相比,國內(nèi)關(guān)于硬件開發(fā)工具與框架的研究資料依然十分缺乏,本文旨在對(duì)FPGA 相關(guān)開發(fā)工具的發(fā)展?fàn)顩r作一定的總結(jié)和歸納,以提供從事本領(lǐng)域工作的國內(nèi)學(xué)者參考.接下來,本文第1 節(jié)將綜述近年來硬件及硬件加速系統(tǒng)開發(fā)工具相關(guān)的典型工作.第2 節(jié)介紹我們自己針對(duì)FPGA 加速系統(tǒng)開發(fā)框架的設(shè)計(jì)實(shí)踐.第3 節(jié)總結(jié)全文并提出未來展望.
本節(jié)介紹一般硬件以及硬件加速系統(tǒng)開發(fā)工具和框架的相關(guān)工作,并引入硬件加速系統(tǒng)設(shè)計(jì)的基本概念和背景知識(shí).
廣義來說,后文將提到的高層次綜合工具使用的描述語言和高級(jí)硬件描述語言都可以歸納進(jìn)硬件描述語言,本節(jié)討論狹義的硬件描述語言,即以VHDL 和Verilog 為代表的經(jīng)典硬件描述語言.
硬件描述語言的出現(xiàn)可以追溯到20 世紀(jì)60 年代,在1971 年,Bell 和Newell 在他們的教材中提出了影響至今的硬件設(shè)計(jì)抽象級(jí)別——寄存器傳輸級(jí)(register-transfer level)[10].基于該抽象,DEC(digital equipment corporation)首先設(shè)計(jì)了ISP 語言以及其擴(kuò)展版本來描述PDP-8 和PDP-16 機(jī)器中的基于寄存器傳輸模塊(register-tansfer module)的硬件行為[11].1979 年左右,Kaiserslautern 大學(xué)的團(tuán)隊(duì)開發(fā)出KARL,以支持結(jié)構(gòu)化硬件設(shè)計(jì)和日益興起的超大規(guī)模集成電路(VLSI)設(shè)計(jì)[12].同一時(shí)間,為了滿足同樣興起的可編程邏輯設(shè)備(PLD)的商業(yè)化需求,DATA I/O 公司也開始設(shè)計(jì)面向可編程設(shè)備的ABEL[13].
隨著超大規(guī)模集成設(shè)計(jì)的逐漸流行和現(xiàn)場(chǎng)可編程設(shè)備的發(fā)明,傳統(tǒng)的基于電路圖繪制(schematic capture)的硬件設(shè)計(jì)方法受限于適合處理的晶體管數(shù)量(通常是數(shù)百個(gè))已經(jīng)越來越難以滿足設(shè)計(jì)效率的需求,在20 世紀(jì)80 年代,Verilog[14]和VHDL[15]相繼出現(xiàn)并逐步發(fā)展成熟.VHDL 和Verilog 的設(shè)計(jì)初衷都是希望用開發(fā)者熟悉的編程語言來描述設(shè)計(jì)好的電路圖以便于工程管理,其中,VHDL 借鑒了大量Ada 語言的理念和語法而Verilog 借鑒了C 語言的編程風(fēng)格.相比于其他硬件描述語言,類Ada 和類C 的語言風(fēng)格更受開發(fā)者青睞,隨著VHDL 和Verilog 的標(biāo)準(zhǔn)化,兩者逐漸取代了其他硬件描述語言,并統(tǒng)治硬件設(shè)計(jì)領(lǐng)域直到今日.初期版本的VHDL 與Verilog 的功能十分類似,相比于Verilog,VHDL 有更高的抽象級(jí)別和語言復(fù)雜度.但是進(jìn)入21 世紀(jì)以后,經(jīng)過Verilog 到System Verilog 的演變,以及多次迭代(最新標(biāo)準(zhǔn)是IEEE Standard 2017[16]),Verilog 引入了許多提高生產(chǎn)效率的語言特性,并提高了對(duì)大規(guī)模系統(tǒng)的描述能力.在此基礎(chǔ)上,又由于C 語言使用的廣泛性,Verilog相比于VHDL 得到了更大規(guī)模的應(yīng)用.
基于寄存器傳輸級(jí)抽象的硬件描述語言在邏輯綜合技術(shù)引入之前并不足以完成完整的硬件設(shè)計(jì),VHDL 和Verilog 初期都只是用于描述和歸檔門電路級(jí)的電路圖設(shè)計(jì).類比高級(jí)軟件編程語言,邏輯綜合器可以被理解為編譯器,即將寄存器傳輸級(jí)的設(shè)計(jì)翻譯成門電路級(jí)的網(wǎng)表設(shè)計(jì).但是,與高級(jí)語言的編譯器不同,由于沒有統(tǒng)一的指令集抽象和確定的硬件布局,描述門電路連接方式的網(wǎng)表還不足以在硬件上“運(yùn)行”.以一般FPGA 開發(fā)為例,我們還需要經(jīng)過“布局布線(place and route)”步驟,將網(wǎng)表與特定硬件平臺(tái)上的物理資源對(duì)應(yīng)起來,并通過下載配置才能讓FPGA 實(shí)現(xiàn)我們想要的功能(放置與路由由于涉及到FPGA 硬件的技術(shù)細(xì)節(jié),目前這一步一般都是由FPGA 生產(chǎn)商提供的閉源軟件來實(shí)現(xiàn),因此本文討論的開發(fā)框架將不包括這部分內(nèi)容).系統(tǒng)設(shè)計(jì)的經(jīng)驗(yàn)告訴我們,提高抽象層次的代價(jià)往往是性能的損失,而這一點(diǎn)在硬件設(shè)計(jì)上也沒有例外.基于硬件描述語言和邏輯綜合器生成的設(shè)計(jì)相比于有經(jīng)驗(yàn)的工程師使用傳統(tǒng)方法完成設(shè)計(jì),幾乎總是需要更大的硬件面積和提供更低的性能.然而,隨著硬件集成度的提高,硬件本身性能的發(fā)展和綜合算法的改進(jìn),人們?cè)谠O(shè)計(jì)質(zhì)量和開發(fā)效率的權(quán)衡中,最終接受了高開發(fā)效率的工具,這一點(diǎn)與軟件編程語言的發(fā)展是類似的.
硬件描述語言經(jīng)過30 多年的使用,盡管自身依然在迭代和發(fā)展,但面對(duì)新的需求和挑戰(zhàn),它們遇到了與自己前身類似的問題:語言本身的局限性限制了開發(fā)效率的進(jìn)步.近年來,FPGA 應(yīng)用研究的興起吸引了大量非專業(yè)硬件背景的工程師投入到FPGA 的開發(fā)中,不同于C、Ada 等底層語言,他們熟悉的工作語言經(jīng)常是C++、Java、Scala 等面向?qū)ο笳Z言或者是Python、JavaScript 等腳本語言.對(duì)于新的使用群體來說,硬件描述語言曾經(jīng)語言友好的優(yōu)勢(shì)不復(fù)存在,而另一方面,區(qū)別于硬件工程師是從門電路級(jí)抽象提升到寄存器傳輸級(jí)抽象,軟件工程師卻是從算法級(jí)抽象降低到有明顯語義鴻溝的寄存器器傳輸級(jí)抽象,抽象級(jí)別的優(yōu)勢(shì)也不復(fù)存在.而對(duì)于傳統(tǒng)的硬件工程師來說,現(xiàn)代軟件編程框架中體現(xiàn)的軟件工程理念同樣吸引著他們,經(jīng)典硬件描述語言中缺乏面向?qū)ο缶幊?、參?shù)化類型、類型安全等特性,這在項(xiàng)目規(guī)模不斷擴(kuò)大的今天,已經(jīng)開始給項(xiàng)目管理、維護(hù)帶來巨大的困擾.為了適應(yīng)新的需求,在經(jīng)典硬件描述語言的基礎(chǔ)上,新的硬件開發(fā)工具或框架基本走上了兩條道路:高層次綜合[17-19]和高級(jí)硬件描述語言[20].并形成了如圖1 所示的層次,接下來,我們將依次介紹高層次綜合和高級(jí)硬件描述語言.
Fig.1 The hierarchy of development tools圖1 開發(fā)工具層次
事實(shí)上,在基于寄存器傳輸級(jí)抽象的硬件描述語言流行之前,學(xué)術(shù)界就已經(jīng)開始將算法級(jí)或行為級(jí)描述映射成硬件設(shè)計(jì)的研究.這些早期的工作大約從20 世紀(jì)70 年代一直持續(xù)到90 年代初,在這段時(shí)間涌現(xiàn)了許多論文和學(xué)術(shù)著作.其中影響力較大的是Paulin 與Knight[21]、Camposano 與Wolf[22]、Gajski[23]以及De Micheli[24]等學(xué)者的工作.這些工作探索了高層次綜合的基本原理和概念,并發(fā)展出了高層次綜合工具的基本特征:專用輸入語言加編譯綜合器.盡管對(duì)后世影響深遠(yuǎn),但這些工作的商業(yè)化嘗試都失敗了.在當(dāng)時(shí)的背景下,硬件工程師才剛開始接受寄存器傳輸級(jí)的設(shè)計(jì)抽象,硬件描述語言都還沒有普及,高層次綜合技術(shù)的引入過于超前,具體來說該技術(shù)當(dāng)時(shí)存在以下兩個(gè)問題.
(1)較高的學(xué)習(xí)成本和較低的硬件設(shè)計(jì)質(zhì)量.高層次綜合工具一般使用特別定義的行為或算法描述語言作為輸入語言,這些語言與硬件描述語言相比更加專用化且沒有通用的規(guī)范,基本依賴于廠商的支持.同時(shí)在可以預(yù)計(jì)的硬件設(shè)計(jì)質(zhì)量下降的前提下,開發(fā)人員沒有學(xué)習(xí)的欲望;
(2)適用的專用領(lǐng)域沒有廣泛的市場(chǎng).當(dāng)時(shí)的許多高層次綜合工具是為數(shù)字信號(hào)處理器(DSP)的開發(fā)設(shè)計(jì)的,這類設(shè)計(jì)的特點(diǎn)是專注數(shù)據(jù)流和結(jié)構(gòu)化的硬件,這在大部分開發(fā)人員都在進(jìn)行非結(jié)構(gòu)化隨機(jī)邏輯集成這類側(cè)重控制流設(shè)計(jì)的背景下是不合時(shí)宜的.
雖然早期學(xué)術(shù)成果商業(yè)化的嘗試失敗了,但是高層次綜合提升開發(fā)效率的前景以及硬件描述語言蓬勃發(fā)展的現(xiàn)狀依然吸引了Synopsys、Cadence 和Mentor Graphics 這些大型的電子設(shè)計(jì)自動(dòng)化(EDA)公司投入到了高層次綜合工具的研發(fā)中,典型的代表包括Synopsys 公司的Behavioral Compiler[25]、Cadence 公司的Visual Architect 和Mentor Graphics 公司的Monet Tool[26].在20 世紀(jì)90 年代中后期,這些產(chǎn)品一度吸引了廣泛的關(guān)注.這些工具的特點(diǎn)是使用單獨(dú)設(shè)計(jì)的行為級(jí)描述語言作為輸入語言,并直接生成門電路級(jí)的設(shè)計(jì).不過,這次嘗試依然未能取得期待中的成功,并且在之前的基礎(chǔ)上又暴露出了有關(guān)產(chǎn)品定位的新問題.
(1)錯(cuò)誤的目標(biāo)群體,并以經(jīng)典硬件描述語言為競(jìng)爭(zhēng)對(duì)手.這時(shí)期的商業(yè)產(chǎn)品以正在接受寄存器傳輸級(jí)抽象、開始使用VHDL 和Verilog 等硬件描述語言的硬件設(shè)計(jì)師為目標(biāo)用戶,提出了基于算法或行為級(jí)抽象的新語言和相應(yīng)的綜合器.這些工具直接從高抽象級(jí)別的描述綜合生成門電路級(jí)的設(shè)計(jì),與硬件描述語言并不兼容且互相替代,這迫使工程師們必須從中做出選擇.在已經(jīng)逐步接受硬件描述語言的背景下,當(dāng)時(shí)的硬件工程師們關(guān)心的問題是,新的工具能否用相同的工作量設(shè)計(jì)出更高質(zhì)量的硬件、是否可在硬件設(shè)計(jì)質(zhì)量不變的情況下減少工作量,以及學(xué)習(xí)曲線是否陡峭.但是,新的工具不僅學(xué)習(xí)曲線陡峭,而且?guī)缀醪荒芴岣哂布O(shè)計(jì)質(zhì)量或者是降低工作量;
(2)沒有清晰地界定基于控制流的設(shè)計(jì)和基于數(shù)據(jù)流的設(shè)計(jì),導(dǎo)致未能發(fā)揮出自身優(yōu)勢(shì).控制流設(shè)計(jì)大多包含隨機(jī)邏輯和跳轉(zhuǎn)結(jié)構(gòu),而數(shù)據(jù)流的設(shè)計(jì)則大多為結(jié)構(gòu)化硬件.基于寄存器傳輸級(jí)的綜合器可同時(shí)處理好控制流和數(shù)據(jù)流的設(shè)計(jì).高層次綜合由于具有更高的抽象級(jí)別,很難生成性能理想的復(fù)雜控制流硬件,但是對(duì)于更適合抽象和采取針對(duì)優(yōu)化的數(shù)據(jù)流設(shè)計(jì),高層次綜合往往能夠生成性能更加良好的硬件.但是,這時(shí)的高層次綜合工具未能專注于自身的特長(zhǎng),反而試圖在一個(gè)框架上來完成各種類型的硬件設(shè)計(jì),以致失去了自身的競(jìng)爭(zhēng)優(yōu)勢(shì).
時(shí)間進(jìn)入21 世紀(jì),由于超大規(guī)模集成電路的持續(xù)發(fā)展,Verilog 和VHDL 的開發(fā)效率處于瓶頸狀態(tài),同時(shí),由于異構(gòu)計(jì)算和硬件加速的興起,大量軟件工程師和系統(tǒng)架構(gòu)師開始嘗試協(xié)同設(shè)計(jì).在軟硬件工程師對(duì)硬件開發(fā)效率應(yīng)加以提高的共同需求下,之前高層次綜合推廣的失利未能阻止工業(yè)界和學(xué)術(shù)界的新一輪嘗試.與之前的環(huán)境相比,在新世紀(jì)高層次綜合的應(yīng)用有了以下優(yōu)勢(shì).
(1)大數(shù)據(jù)處理相關(guān)應(yīng)用的規(guī)模不斷擴(kuò)大,針對(duì)特定類型應(yīng)用的硬件設(shè)計(jì)工具擁有了可觀市場(chǎng),尤其是有關(guān)人工智能和數(shù)據(jù)庫的應(yīng)用.這些應(yīng)用在規(guī)模大的同時(shí)更側(cè)重?cái)?shù)據(jù)流的處理,讓高層次綜合有了用武之地.
(2)經(jīng)典硬件描述語言開發(fā)效率已經(jīng)達(dá)到瓶頸,開發(fā)人員有了對(duì)更高層次抽象的明確需求.
在這一階段,不斷有新的高層次綜合工具取得學(xué)術(shù)上和工業(yè)上的成功,以至于到了2019 年依然不斷有新的工具被提出,其中影響較大的包括Bluespec[27]、LegUp[28,29]、Vivado HLS[30]和Intel HLS Compiler[31].新的工作吸取了之前工作的教訓(xùn),大多做出了如下改進(jìn).
(1)主要使用或支持C、C++等廣泛使用的通用編程語言作為輸入語言,這使得工具具有了更廣泛的受眾并降低了學(xué)習(xí)成本;
(2)以Verilog 或(和)VHDL 為輸出結(jié)果.這使得新的工具可以兼容老的設(shè)計(jì),并在生成的硬件性能不夠理想時(shí)提供了手動(dòng)優(yōu)化的可能,進(jìn)而豐富了工具的適用場(chǎng)景;
(3)針對(duì)特定類型設(shè)計(jì)的綜合算法進(jìn)行專門優(yōu)化.以犧牲通用性換取性能,這強(qiáng)化了高層次綜合的優(yōu)勢(shì).
到目前為止,我們討論的工作都是針對(duì)單獨(dú)的硬件設(shè)計(jì)而言的,對(duì)于傳統(tǒng)的硬件來說,從硬件設(shè)計(jì)到硬件應(yīng)用中間有較長(zhǎng)的時(shí)間跨度,也會(huì)由各自的團(tuán)隊(duì)來完成.但是,隨著FPGA 的興起,由于FPGA 可以通過快速的下載配置直接形成對(duì)應(yīng)的硬件,設(shè)計(jì)和部署的分工變得模糊起來,人們需要集成的框架來快速構(gòu)建加速應(yīng)用.而要構(gòu)建一個(gè)完整的加速系統(tǒng),如本文開始部分中提到的,我們還需要硬件驅(qū)動(dòng)和軟件集成.將驅(qū)動(dòng)和集成功能包含在一個(gè)框架下,在我們不知道用戶會(huì)設(shè)計(jì)出具有什么功能的硬件和使用什么樣的接口進(jìn)行數(shù)據(jù)傳輸?shù)那闆r下是十分困難的.如果設(shè)計(jì)十分底層的接口來提高適用性和靈活性,則依然會(huì)保留較多的工作量給開發(fā)者;而如果規(guī)定接口協(xié)議和做各種假設(shè)來提高抽象層次,則會(huì)對(duì)用戶的硬件設(shè)計(jì)帶來各種限制.隨著一些高層次綜合工具開始有針對(duì)性地處理特定應(yīng)用,以及OpenCL 等計(jì)算框架的興起,工具開發(fā)人員不再面對(duì)硬件功能未知的情況,而完整的開發(fā)框架設(shè)計(jì)也變得可行.
Xilinx 和Intel 分別推出了SDAccel[32]和Intel SDK for OpenCL[33],用于將OpenCL 定義的加速器部署到FPGA 上,并包含基于PCIe 的主機(jī)與FPGA 數(shù)據(jù)傳輸機(jī)制的集成.對(duì)于特定領(lǐng)域的應(yīng)用,DnnWeaver[34]和Inter OpenVINO[35]可以根據(jù)的Caffe,TensorFlow 等機(jī)器學(xué)習(xí)框架定義的模型自動(dòng)生成硬件并部署到主機(jī)+FPGA 的加速平臺(tái)上,而p4FPGA[36]框架可以將用p4 語言定義的數(shù)據(jù)面板部署成FPGA 包處理器.這些框架相比于通用的高層次綜合工具更受系統(tǒng)架構(gòu)師和軟件工程師的青睞,它們能夠顯著降低開發(fā)門檻,提高開發(fā)效率,方便系統(tǒng)的早期驗(yàn)證.雖然這些框架生成的硬件設(shè)計(jì)與使用硬件描述語言完成的設(shè)計(jì)相比依然存在不小的性能差距,但是,從硬件描述語言的發(fā)展歷史來看,對(duì)開發(fā)效率的需求將推動(dòng)綜合算法的改進(jìn).同時(shí),由于硬件本身性能的提高,具有更高生產(chǎn)效率的工具將逐漸取代生產(chǎn)效率低的工具.
對(duì)依山而建、受山坡地表徑流危害的城鎮(zhèn)、集中居民點(diǎn)、重要設(shè)施等,需修建截洪溝、排洪溝渠,將坡面地表徑流引入溝道排泄。對(duì)溝道內(nèi)淤積的泥沙、亂石、雜物和人為卡口進(jìn)行清理疏挖,提高溝道泄洪能力。重點(diǎn)在城鎮(zhèn)河段清除河道行洪障礙,確保溝道泄洪暢通。疏浚、擴(kuò)挖的淤積物、棄渣等應(yīng)堆放在距溝道有一定距離的低洼處,嚴(yán)禁人為設(shè)障。截洪溝、排洪渠應(yīng)盡量利用坡面原有溝埂、天然溝道,其斷面大小應(yīng)滿足排洪量的要求。在經(jīng)過重要位置或彎道凹岸、跌水等沖刷強(qiáng)烈地帶,需考慮必要的護(hù)砌措施。
高層次綜合工具在側(cè)重?cái)?shù)據(jù)流處理的加速系統(tǒng)中得到了良好應(yīng)用,但對(duì)于控制流復(fù)雜的硬件設(shè)計(jì),比如非結(jié)構(gòu)化的硬件設(shè)計(jì)和基于指令集的處理器設(shè)計(jì),高層次綜合工具往往需要與其他寄存器傳輸級(jí)設(shè)計(jì)工具相互配合.因此,在對(duì)硬件性能要求較高、需要在微架構(gòu)上進(jìn)行創(chuàng)新的設(shè)計(jì)情景下,寄存器傳輸級(jí)設(shè)計(jì)工具依然在發(fā)揮著重要作用.將經(jīng)典硬件描述語言使用新的高級(jí)編程語言重新包裝以獲得高級(jí)語言在編程效率、維護(hù)管理上的優(yōu)勢(shì)同樣吸引了大量研究人員.本文將提供寄存器傳輸級(jí)抽象設(shè)計(jì)接口,并使用高級(jí)編程語言作為輸入語言的硬件描述語言歸納為高級(jí)硬件描述語言.這些高級(jí)硬件描述語言通常會(huì)利用高級(jí)語言中的面向?qū)ο蟆⒄Z法糖等機(jī)制來擴(kuò)展自身的數(shù)據(jù)結(jié)構(gòu)并提供更便利的語法接口,或者以庫的形式來模板化特定類型硬件的設(shè)計(jì).在一定程度上,這些方法提供了更高層次的設(shè)計(jì)抽象,但與高層次綜合不同,這種抽象更多的是語言機(jī)制上的抽象,它沒有隱藏硬件數(shù)據(jù)傳輸?shù)牡讓訖C(jī)制,也就是說,沒有溝通軟硬件描述的語意鴻溝.因此,我們認(rèn)為目前大部分高級(jí)硬件描述語言依然處在寄存器傳輸級(jí)抽象.表1 根據(jù)輸入語言的特征列舉了2000 年以來典型的高級(jí)硬件描述語言.
函數(shù)式編程風(fēng)格一度被認(rèn)為是最適合進(jìn)行硬件描述的編程風(fēng)格,函數(shù)式語言作為輸入語言的開發(fā)工具幾乎涵蓋了硬件設(shè)計(jì)的各個(gè)抽象層次,其中一部分工作可以被歸納為高層次綜合工具,例如Bluespec,還有一部分則可以被歸納為高級(jí)硬件描述語言,例如表1.函數(shù)式硬件定義的優(yōu)勢(shì)十分突出:簡(jiǎn)明的語義結(jié)構(gòu)便于形式化驗(yàn)證和對(duì)遞歸的良好支持.這些優(yōu)點(diǎn)使得函數(shù)式硬件描述語言在定義大規(guī)模組合邏輯電路時(shí)十分簡(jiǎn)練而易于測(cè)試驗(yàn)證.但在定義時(shí)序電路時(shí),函數(shù)式定義卻不夠直觀,以至于各種工具都采取了不同的定義方式,而未能達(dá)成一致的抽象.由于缺乏標(biāo)準(zhǔn)、學(xué)習(xí)成本過高、函數(shù)式編程在應(yīng)用開發(fā)上使用較少等因素,在當(dāng)前背景下,函數(shù)式硬件描述語言大多成為了學(xué)術(shù)語言,較少在實(shí)際生產(chǎn)中得到應(yīng)用.
Table 1 High-level HDLs classified by characteristics of input languages表1 根據(jù)輸入語言特征分類的高級(jí)硬件描述語言
另一方面,基于Java、Python、Scala 等支持面向?qū)ο缶幊毯兔钍秸Z言風(fēng)格的高級(jí)語言構(gòu)建的硬件描述語言,由于本身語言更優(yōu)秀的生態(tài)和更廣泛的用戶基礎(chǔ),近年來我們能觀察到它們持續(xù)的更新和更深入的發(fā)展.尤其是內(nèi)嵌于高級(jí)語言的硬件描述語言,因?yàn)槔^承了原本語言的語法,有更低的學(xué)習(xí)成本,吸引了更多開發(fā)者的使用.其中,基于Scala 語言的Chisel[42],已經(jīng)形成了硬件定義與測(cè)試一體的集成框架,并通過對(duì)RISC-V 設(shè)計(jì)的特化支持,擴(kuò)展了自身的硬件設(shè)計(jì)生態(tài).
高級(jí)硬件描述語言總體來看目前還處于學(xué)術(shù)研究階段.一方面是因?yàn)檫@些語言還沒有形成充實(shí)的生態(tài)基礎(chǔ),無法吸引硬件工程師付出學(xué)習(xí)成本進(jìn)行轉(zhuǎn)型;另一方面則是因?yàn)檫@些語言并不專注于通過提供特定的抽象和完整的集成框架來降低開發(fā)門檻,因而對(duì)軟件工程師也未能構(gòu)成足夠的吸引力.如圖2 所示,與高層次綜合工具正在向應(yīng)用層特化發(fā)展,逐步讓底層硬件細(xì)節(jié)透明化不同,高級(jí)硬件描述語言則在確定了寄存器傳輸級(jí)抽象的基礎(chǔ)上,在擴(kuò)充自身的硬件實(shí)現(xiàn)生態(tài),以形成類似于C++、Java 等語言的豐富庫支持.本文接下來將介紹我們?cè)诟呒?jí)硬件描述語言方向上的實(shí)踐工作,其中包括高級(jí)硬件描述語言ScalaHDL 以及基于ScalaHDL 的系統(tǒng)集成開發(fā)框架VeriScala[47].
Fig.2 The prospectives of high-level HDL and HLS圖2 高層級(jí)硬件描述語言和高層次綜合的發(fā)展方向
在硬件加速的學(xué)術(shù)研究中,我們經(jīng)常需要進(jìn)行微架構(gòu)的創(chuàng)新,常常遇到Verilog 或VHDL 學(xué)習(xí)門檻高、開發(fā)周期長(zhǎng)、軟硬件集成麻煩的困難.Xilinx 推出了Vitis 工具,通過將高層次綜合和細(xì)粒度的RTL 優(yōu)化集成在一個(gè)框架下來滿足這樣的需求.但是,Vitis 雖然提供了統(tǒng)一的框架,開發(fā)者依然需要使用多種語言來進(jìn)行綜合開發(fā),這顯然增加了工程維護(hù)和管理的難度.在高層次硬件描述語言的基礎(chǔ)上構(gòu)建集成開發(fā)框架可以很好地解決這個(gè)問題.本節(jié)將介紹我們實(shí)現(xiàn)的ScalaHDL 硬件描述語言,以及基于ScalaHDL 的開發(fā)框架VeriScala.
基于高級(jí)硬件描述語言的加速系統(tǒng)開發(fā)框架設(shè)計(jì)目標(biāo)主要有兩方面:充分利用高級(jí)語言在開發(fā)效率、維護(hù)管理上的優(yōu)勢(shì)并提供簡(jiǎn)便的集成策略.具體來說有以下幾點(diǎn).
(1)支持豐富的代碼重用機(jī)制.需要提供包括繼承、參數(shù)化類型在內(nèi)的特性來提高代碼重用率和可維護(hù)性.
(2)易用的語言抽象.一方面需要通過支持面向?qū)ο缶幊虂磉M(jìn)行模塊化設(shè)計(jì),另一方面還需要將RTL 抽象在高級(jí)語言中進(jìn)行映射以幫助軟件工程師的理解.
(3)支持庫的設(shè)計(jì)和使用.需要通過支持硬件設(shè)計(jì)的引用方法,讓現(xiàn)有設(shè)計(jì)逐漸形成豐富的生態(tài),進(jìn)一步提高生產(chǎn)效率.
(5)支持快速的系統(tǒng)集成和部署.需要在框架內(nèi)處理好底層硬件數(shù)據(jù)傳輸機(jī)制,并提供簡(jiǎn)潔的軟件接口.
理想的設(shè)計(jì)流程如圖3 所示,軟硬件設(shè)計(jì)在同一種高級(jí)語言的上下文中,其中,軟件計(jì)算需求可以通過函數(shù)接口來定義,而硬件設(shè)計(jì)則可以使用內(nèi)嵌的高級(jí)硬件描述語言來定義.框架本身將包含通信相關(guān)經(jīng)過適配的軟硬件庫,基于基礎(chǔ)通信驅(qū)動(dòng)可以實(shí)現(xiàn)應(yīng)用的后端,而基于硬件通信子系統(tǒng)可以實(shí)現(xiàn)加速硬件的通信外圍.接下來,完成的硬件設(shè)計(jì)可以直接輸入給軟件模擬器進(jìn)行硬件功能測(cè)試,而軟件模擬器又可以作為模擬硬件與驅(qū)動(dòng)對(duì)接,完成整個(gè)加速系統(tǒng)的功能測(cè)試.最后用驗(yàn)證過的加速硬件替換模擬硬件,從而完成加速系統(tǒng)的集成.
面向上文的設(shè)計(jì)目標(biāo)和開發(fā)流程,我們?cè)O(shè)計(jì)實(shí)現(xiàn)了基于ScalaHDL 語言的VeriScala 框架.后面將在第2.2 節(jié)介紹ScalaHDL 語言的設(shè)計(jì),在第2.3 節(jié)介紹VeriScala 中軟硬件協(xié)同的集成支持,在第2.4 節(jié)展示VeriScala 的代碼示例和實(shí)驗(yàn)結(jié)果.
Fig.3 An ideal workflow圖3 理想開發(fā)流程
ScalaHDL 是一種內(nèi)嵌于Scala 語言的硬件描述語言,它被實(shí)現(xiàn)成了Scala 庫而不需要修改Scala 編譯器.選擇Scala 作為框架輸入語言是因?yàn)?(1)Scala 是一種多范式的編程語言,既可以支持面向?qū)ο缶幊?也能良好地支持函數(shù)式編程,提供了更多設(shè)計(jì)的可能性;(2)Scala 基于Java 虛擬機(jī)運(yùn)行,可以受益于豐富的Java 生態(tài).如圖4展示了ScalaHDL 的整體框架,主要分成硬件定義和測(cè)試兩個(gè)模塊.ScalaHDL 使用高擴(kuò)展性、可插拔的模塊化設(shè)計(jì),核心功能實(shí)現(xiàn)在HDLBaseClass 和SimulationSuite 兩個(gè)類中(圖中紅色模塊),分別支持硬件的定義和測(cè)試.而擴(kuò)展的語言特性,例如新的硬件描述語句語義或者更高的設(shè)計(jì)抽象則可以實(shí)現(xiàn)在Scala 的Trait 定義之中(如圖4 中淺綠模塊所示),只需在硬件定義時(shí)指定需要的Trait 即可使用對(duì)應(yīng)的特性.在ScalaHDL 中我們實(shí)現(xiàn)了BasicOps 以支持基本的硬件定義功能,以及通過Translator 來完成ScalaHDL 到Verilog 的翻譯.
Fig.4 The architecture of ScalaHDL圖4 ScalaHDL 架構(gòu)
ScalaHDL 使用Scala 語言中原生的Class 作為硬件模塊定義的容器,通過繼承HDLBaseClass 并引用BasicOps 特性,開發(fā)者可以在原生的Scala 類中使用BasicOps 中定義的類型、語句和結(jié)構(gòu)來描述硬件設(shè)計(jì).ScalaHDL 的設(shè)計(jì)應(yīng)用了Lightweight Modular Staging[48]的思想,即ScalaHDL 的翻譯通過Scala 的反射機(jī)制,依據(jù)運(yùn)行時(shí)掃描類定義中實(shí)體得到的類型信息,來生成對(duì)應(yīng)的Verilog 描述.在一個(gè)硬件定義類中,會(huì)包含兩部分代碼:硬件定義和原生Scala 語句.翻譯時(shí),包含ScalaHDL 特殊硬件類型的語句會(huì)被識(shí)別為硬件描述,而原生的Scala 代碼則會(huì)被執(zhí)行并發(fā)揮類似于編譯指令的功能.這樣的方式使得我們可以很方便地利用類型系統(tǒng),將RTL抽象在Scala 中進(jìn)行映射.具體來說,硬件定義實(shí)體的類型可以為模塊、語句塊、語句和值,其中語句塊包括同步語句塊和異步語句塊.
SimulationSuite 與SimulationSchedule 相結(jié)合實(shí)現(xiàn)了軟件模擬功能.由于我們?cè)谟布愋蛯?shí)現(xiàn)中包含了不同類型在模擬時(shí)的行為,因此可以通過事件接口直接驅(qū)動(dòng)硬件定義類實(shí)例的運(yùn)行來實(shí)現(xiàn)功能模擬,這極大地簡(jiǎn)化了軟件模擬器的實(shí)現(xiàn).通過與實(shí)現(xiàn)好的基礎(chǔ)通信驅(qū)動(dòng)進(jìn)行對(duì)接,測(cè)試平臺(tái)也可以針對(duì)真實(shí)硬件進(jìn)行測(cè)試.
要提供簡(jiǎn)便的軟硬件集成支持,基本思路是通過抽象和包裝將繁瑣的底層數(shù)據(jù)傳輸細(xì)節(jié)隱藏起來.在Verilog 中我們通過用Scala 實(shí)現(xiàn)的基礎(chǔ)通信驅(qū)動(dòng)和根據(jù)用戶模塊定義自動(dòng)生成的硬件數(shù)據(jù)接口層來完成軟硬件的對(duì)接和傳輸細(xì)節(jié)的隱藏.圖5 展示了VeriScala 框架中的運(yùn)行時(shí)系統(tǒng).在軟件方面,Scala 實(shí)現(xiàn)的基礎(chǔ)通信驅(qū)動(dòng)包裝內(nèi)核中的PCIe DMA 驅(qū)動(dòng),將上層Scala 定義的數(shù)據(jù)結(jié)構(gòu)序列化后傳給內(nèi)核模塊,并通過相應(yīng)的接口控制PCIe 通道的負(fù)載.應(yīng)用可以在基礎(chǔ)通信驅(qū)動(dòng)的基礎(chǔ)上開發(fā)特定應(yīng)用的數(shù)據(jù)傳輸后端來實(shí)現(xiàn)類似函數(shù)調(diào)用語義的硬件調(diào)用,也可以直接使用基礎(chǔ)驅(qū)動(dòng)來進(jìn)行數(shù)據(jù)傳輸.在硬件方面,我們?cè)O(shè)計(jì)了通用的接口層實(shí)現(xiàn)庫來處理底層傳輸協(xié)議握手和數(shù)據(jù)緩存.通過用戶頂層設(shè)計(jì)的接口定義,ScalaHDL 的翻譯器可以在生成硬件設(shè)計(jì)時(shí)自動(dòng)識(shí)別接口信號(hào)并進(jìn)行相關(guān)的適配.同時(shí)在調(diào)試時(shí),用戶可以指定需要監(jiān)視的信號(hào),讓翻譯器額外生成調(diào)試服務(wù)硬件,通過與軟件驅(qū)動(dòng)配合來實(shí)現(xiàn)類似于GDB(GNU debugger)風(fēng)格的硬件調(diào)試工具.
Fig.5 The runtime system圖5 運(yùn)行時(shí)系統(tǒng)
基于之前兩節(jié)的闡述,VeriScala 框架中形成了如圖6 所示的代碼流程.圖6 中以簡(jiǎn)單的加法器定義為例,在文件Adder.scala 中首先定義模塊的容器類Adder 及其構(gòu)造接口,然后在類中定義模塊add,add 的邏輯由一個(gè)同步塊來描述,由于加法器的功能簡(jiǎn)單,該同步塊中僅包含一個(gè)條件分支語句.事實(shí)上,在Scala 中,我們可以將運(yùn)算函數(shù)作為參數(shù)來傳遞,如文件Arithmetic.scala 中定義的Arithmetic 類可以在實(shí)例時(shí)接受一個(gè)函數(shù)f作為參數(shù)來生成不同的算術(shù)模塊,這給硬件定義代碼的復(fù)用提供了方便.對(duì)于定義好的硬件,開發(fā)者可以利用VeriScala 中的軟件模擬器,通過編寫測(cè)試平臺(tái)和測(cè)試代碼,進(jìn)行軟件模擬,也可以通過生成的一系列Verilog 代碼,利用對(duì)應(yīng)廠商的工具鏈和VeriScala 的運(yùn)行時(shí)框架進(jìn)行硬件測(cè)試并加速系統(tǒng)構(gòu)建.
為了評(píng)估ScalaHDL 的生成代碼質(zhì)量,我們針對(duì)不同復(fù)雜度的常用電路分別使用ScalaHDL 和Verilog 進(jìn)行定義,并根據(jù)Xilinx Vivado 軟件編譯自動(dòng)生成代碼和手動(dòng)編寫代碼的資源消耗報(bào)告,得到的統(tǒng)計(jì)結(jié)果見表2.
Fig.6 Code overview圖6 代碼流程總覽
Table 2 Resource consumptions of both variants (generated Verilog code and direct Verilog code)表2 生成的Verilog 代碼與手寫Verilog 代碼的資源消耗對(duì)比(生成Verilog 代碼/手寫Verilog 代碼)
我們發(fā)現(xiàn),ScalaHDL 和Verilog 在定義表中電路時(shí)完全消耗相同的硬件資源.由于ScalaHDL 與Verilog 處于相同的抽象層次,這樣的結(jié)果與預(yù)期相吻合.
為了評(píng)估VeriScala框架的實(shí)用性,我們基于VeriScala構(gòu)建了典型的數(shù)據(jù)庫過濾器加速系統(tǒng),該應(yīng)用使用Scala編寫,將Scala 管理的主機(jī)數(shù)據(jù)庫表項(xiàng)發(fā)送給FPGA 處理,再讀回過濾后的數(shù)據(jù).數(shù)據(jù)傳輸通過PCIE 3.0 接口完成.作為對(duì)比基準(zhǔn),我們同樣基于Scala 實(shí)現(xiàn)了使用CPU 完成的過濾程序.該測(cè)試使用的硬件配置見表3.
Table 3 Experiment environment表3 測(cè)試環(huán)境
通過統(tǒng)計(jì)軟件應(yīng)用過濾512MB 隨機(jī)數(shù)據(jù)的平均(1 000 次)任務(wù)運(yùn)行時(shí)間,可以得到表4 展示的隨單次傳輸塊大小的增加而變化的加速比,受限于實(shí)驗(yàn)使用的FPGA 資源總量和我們采用的過濾器設(shè)計(jì),單次傳輸32KB 是我們能在250MHz 下運(yùn)行的最優(yōu)值.從實(shí)驗(yàn)結(jié)果來看,VeriScala 框架能夠有效地構(gòu)建CPU+FPGA 的加速系統(tǒng).
Table 4 Performance comparison between FPGA accelerated filter and CPU filter表4 FPGA 加速過濾器和CPU 過濾器的性能對(duì)比
2009 年,Martin 和Smith 在他們的綜述文章中指出,當(dāng)時(shí)不存在一種開發(fā)框架能夠同時(shí)支持所有的領(lǐng)域:控制流和數(shù)據(jù)流、ASIC 和FPGA、隨機(jī)邏輯和結(jié)構(gòu)化模塊,以及硬件、軟件和軟/硬協(xié)同各自的設(shè)計(jì).他們指出,一個(gè)完整的能夠探索整個(gè)設(shè)計(jì)空間的集成框架是設(shè)計(jì)師們的終極理想,同時(shí)也是未來的發(fā)展方向[18].經(jīng)過10 年的發(fā)展,已經(jīng)形成了如圖1 所示的工具層次,高層次綜合和高級(jí)硬件描述語言似乎都有潛力達(dá)到這一終極目標(biāo),而又有各自的不足.其中,高層次綜合有難以處理復(fù)雜控制流和隨機(jī)邏輯的缺點(diǎn),使其需要高級(jí)語言框架外的經(jīng)典硬件描述語言來輔助優(yōu)化;而高級(jí)硬件描述語言則依然處于較低的抽象層次,其開發(fā)效率瓶頸和軟硬件的語義鴻溝沒有完全消除.那么一個(gè)直接的想法是,這兩者能不能結(jié)合起來呢?
從圖2 中我們可以發(fā)現(xiàn),高級(jí)硬件描述語言和高層次綜合并不完全獨(dú)立.高級(jí)硬件描述語言將高級(jí)語言定義的寄存器傳輸級(jí)描述翻譯成Verilog 或者VHDL,而高層次綜合則是將高級(jí)語言定義的計(jì)算模型翻譯成Verilog 或者VHDL.如果我們?cè)诟呒?jí)硬件描述語言的基礎(chǔ)上構(gòu)建高層次綜合工具,使得高層次綜合首先生成高級(jí)硬件描述語言定義的硬件,然后再生成對(duì)應(yīng)的經(jīng)典硬件描述語言代碼,或者我們將高層次綜合功能實(shí)現(xiàn)為高級(jí)硬件描述語言的一個(gè)特殊庫,是不是這樣就能享受兩者共同的優(yōu)勢(shì)呢?基于這個(gè)想法我們可以得到如圖7 所示的架構(gòu).
Fig.7 The future architecture圖7 未來架構(gòu)
在該框架中,我們可以在同一種高級(jí)語言的上下文中進(jìn)行硬件與軟件設(shè)計(jì),一方面,硬件設(shè)計(jì)可以兼顧控制流與數(shù)據(jù)流,另一方面,軟硬件集成變成了簡(jiǎn)單的庫調(diào)用.該架構(gòu)的實(shí)現(xiàn)在很大程度上可以復(fù)用現(xiàn)有的研究成果,以ScalaHDL 為例,要想支持某種特定硬件的高層次綜合,需要做的是,實(shí)現(xiàn)一個(gè)Scala Trait 來擴(kuò)展已有的硬件類型和硬件定義語句,以及定義這些新的抽象在翻譯時(shí)的機(jī)制.這一點(diǎn)對(duì)于許多基于Java、Scala 等可擴(kuò)展性強(qiáng)的語言實(shí)現(xiàn)的框架來說都會(huì)有類似的解決方案.
硬件及硬件加速系統(tǒng)開發(fā)工具的選擇取決于開發(fā)質(zhì)量與開發(fā)效率的平衡,當(dāng)硬件資源成為瓶頸時(shí),硬件設(shè)計(jì)質(zhì)量就會(huì)發(fā)揮更大的影響,而當(dāng)硬件資源不是瓶頸時(shí),開發(fā)效率則會(huì)發(fā)揮更大的影響.因此,在開發(fā)工具的發(fā)展歷史中,一種抽象層次不會(huì)被輕易淘汰,人們往往希望使用提供更大設(shè)計(jì)空間的開發(fā)工具來面對(duì)復(fù)雜的需求與限制.在當(dāng)前環(huán)境下,我們無法判斷是高層次綜合還是高級(jí)硬件描述語言會(huì)得到更廣泛的應(yīng)用,兩者可能會(huì)長(zhǎng)期共存.因此,可以推測(cè),類似于圖7 所示的綜合開發(fā)框架是未來合理的發(fā)展方向.