QuickPlay 的高級工作流程讓軟件開發(fā)人員迅速構建基于 FPGA 的高效應用。
隨著物聯(lián)網(wǎng)和大數(shù)據(jù)處理的崛起,人們對數(shù)據(jù)傳輸和處理的需求急劇增長,僅靠 CPU 再也不能滿足這一指數(shù)級增長需求。添加更多處理器和更多虛擬機來運行給定應用并不能徹底解決這一問題,因為對給定應用而言,能夠在多個 CPU 上并行處理的應用有限。另一方面,現(xiàn)場可編程門陣列 (FPGA)具有所需的 I/O 帶寬和處理能力,這一點無論是從純粹的處理角度考慮,還是從功耗的角度考慮都非常重要。FPGA 對數(shù)據(jù)中心設備制造商而言,長期以來一直頗具吸引力。英特爾近期收購了第二大FPGA 廠商,這一舉措是純 CPU 解決方案再也不能滿足應用需求的又一力證。
FPGA 實現(xiàn)相當復雜,這也是阻礙其廣泛采用的主要障礙。到目前為止,在基于 FPGA 的平臺上開發(fā)應用的唯一途徑仍是采用一些最底層的硬件實現(xiàn)方案。這不僅讓軟件開發(fā)人員這一龐大的潛在客戶群無法使用 FPGA 器件,還讓傳統(tǒng) FPGA 設計人員的日子越來越不好過。
近期涌現(xiàn)的 FPGA 設計方法以高層次綜合(HLS)工具為中心,充分利用 OpenCL ?、C 和C++ 等軟件編程語言的優(yōu)勢,為軟件開發(fā)人員提供了沙盒效應,在大量應用中能從基于 FPGA 的硬件加速中大受裨益。但這些方法往往存在一個關鍵的不足,即無法讓軟件開發(fā)人員定義并配置最適合其應用的硬件基礎架構。業(yè)界一直都在追尋高級工作流程的圣杯,從而無需 FPGA 專業(yè)技術即可在基于FPGA 的平臺上實現(xiàn)應用。
PLDA 在過去五年中已經(jīng)開發(fā)出一種這樣的工作流程。稱作 QuickPlay 的工作流程能夠高效解決實現(xiàn)復雜性問題,為 FPGA 開發(fā)提供多種使用模式。但其價值的核心源頭之一是它讓軟件開發(fā)人員將原本用于 CPU 的應用部分或全部地實現(xiàn)在 FPGA硬件上的方式。QuickPlay 能夠全面發(fā)揮 FPGA 資源的作用,將這些功能強大而復雜的器件轉(zhuǎn)化為軟件定義平臺,無需艱苦的硬件設計即能獲得 FPGA 帶來的優(yōu)勢。
試想一種可以細分為兩項功能的軟件算法: 其中一項功能用于數(shù)據(jù)處理,然后另一項功能用于數(shù)據(jù)的進一步處理。從軟件角度看,這種實現(xiàn)方案相當簡單,就是先調(diào)用 Function1(),接著再單獨調(diào)用Function2(),使用指針來定位待處理數(shù)據(jù)的位置。
如果沒有合適的硬件抽象工具流程輔助,在基于 FPGA 的硬件平臺上實現(xiàn)這種算法需要軟件開發(fā)人員處理圖 1 所示的硬件設計(其中內(nèi)核 1 和內(nèi)核2 分別是 Function 1 和 Function 2 的硬件實現(xiàn))。該硬件設計需要包含兩個元素:控制層面和數(shù)據(jù)層面。
控制層面起著執(zhí)行引擎的作用,用于生成時鐘與復位、管理系統(tǒng)啟動、編排數(shù)據(jù)層面運行以及執(zhí)行所有維護功能。數(shù)據(jù)層面例化并連接處理元件元、內(nèi)核 1 和內(nèi)核 2 以及用于讀入數(shù)據(jù)和寫出處理后數(shù)據(jù)所需的必備 I/O 接口。雖然不同的應用會要求使用不同的 I/O 接口,不過在我們的實例中使用的是以太網(wǎng)和 PCI Express(PCIe)這些接口,如圖1 所示。
?
圖 1 — 使用傳統(tǒng) FPGA 工具實現(xiàn)兩功能算法的詳細硬件實現(xiàn)
無需硬件專業(yè)知識,軟件開發(fā)人員使用編譯軟件功能 Function1() 和Function2()(一般用 C 或 C++語言編寫)的 HLS 工具就可以輕松地生成內(nèi)核 1 和內(nèi)核 2 到采用 VHDL 或 Verilog 等的 FPGA 硬件描述中。但是設計中每一個從性質(zhì)上不屬于算法的其他元素(接口、控制、時鐘及復位)都不能用 HLS工具生成,硬件設計人員必須將它們設計為自定義硬件描述語言功能或 IP。獲得這些元素并將它們連接起來構成了另一個難題,因為部分元素可能并非是現(xiàn)成的,或是具有不同的接口(類型和大小)、時鐘要求以及專門的啟動順序等。
QuickPlay 能夠充分利用 FPGA 資源,將這些功能強大而復雜的器件轉(zhuǎn)化為軟件定義平臺,無需艱苦的硬件設計即能獲得由FPGA 帶來的優(yōu)勢。
除了設計工作,同樣具有難度的是實現(xiàn)工作。這包括將設計映射到選定 FPGA 平臺上的資源、生成適當?shù)募s束以及確認在 FPGA 硬件上完成邏輯綜合與實現(xiàn)后滿足這些約束要求。在新的 FPGA 硬件上實現(xiàn)有效設計也需要耗費一名經(jīng)驗豐富的硬件設計人員數(shù)星期的時間。
因此,任何旨在使用自定義硬件幫助軟件開發(fā)人員來增強其應用的工具必須能夠:
?從純軟件代碼中創(chuàng)建功能硬件;
?根據(jù)需要采用現(xiàn)有的硬件 IP 模塊;
?調(diào)用并創(chuàng)建所有的支持硬件(接口、控制、時鐘等);
?支持使用現(xiàn)成商用開發(fā)板以及自定義平臺;
?確保生成的硬件能自動建構校正,這樣無需進硬件調(diào)試;
?且支持僅使用標準軟件調(diào)試工具即可調(diào)試功能模塊。
PLDA 重新設計 QuickPlay 以滿足所有各項要求,讓純軟件開發(fā)人員以極小工作量就能指定、構建和集成 FPGA 到自己的軟件架構中。
以軟件為中心的方法
使用 QuickPlay 實現(xiàn)整個設計流程相當簡單直觀:
1. 開發(fā)硬件引擎的 C/C++ 語言功能模型。
2. 使用標準的 C/C++ 語言調(diào)試工具來驗證功能模型。
3. 指定目標 FPGA 平臺和 I/O 接口(PCIe、以太網(wǎng)、DDR、QDR 等)。
4. 編譯并構建硬件引擎。
該流程看似簡單,但如果要無縫地工作,關鍵在于保證生成的硬件引擎在功能上與初始軟件模型完全相同。換言之,功能模型必須具有確定性,這樣無論硬件實現(xiàn)方案的運行速度有多快,軟硬件執(zhí)行的結果都是完全一致的。
但令人遺憾的是大多數(shù)并行系統(tǒng)都屬于非確定性執(zhí)行。例如多線程軟件執(zhí)行取決于 CPU、操作系統(tǒng)以及運行在同一主機上的無關進程。多次運行相同的多線程程序可能會得到不同的行為。硬件中這樣的非確定性將會是一場災難,因為這樣會要求在電氣波形層面調(diào)試硬件引擎本身,從而妨礙工具為軟件開發(fā)人員抽象硬件的目的。
QuickPlay 使用直觀的數(shù)據(jù)流模型,能從數(shù)學角度保證可確定性執(zhí)行,與執(zhí)行引擎無關。該模型由稱之為內(nèi)核的并行功能組成,負責與流通道進行通信。因此它與軟件開發(fā)人員在白板上勾勒應用草圖關聯(lián)緊密。為確保行為的確定性,這些內(nèi)核必須彼此進行通信,以防發(fā)生競態(tài)條件和死鎖等數(shù)據(jù)沖突。實現(xiàn)這一要求的方法是使用具備下列特點的流通道:(1)基于 FIFO,(2)阻塞式讀取和阻塞式寫入,以及(3)點對點。
這些就是 PLDA 據(jù)以構建 QuickPlay 的計算模型—— 卡恩進程網(wǎng)絡(KPN)的特點。圖 2 的QuickPlay 設計實例描述了 KPN 模型。
?
圖2 — QuickPlay 中的設計實例
任何內(nèi)核的內(nèi)容都可以是任意 C/C++ 語言代碼、第三方 IP,甚至是 HDL 代碼(對硬件設計人員而言)。QuickPlay 采用相當簡單直觀的設計流程(圖 3)。
?
圖 3 — QuickPlay 采用簡單直觀的設計流。
當您完成軟件調(diào)試階段,并且糾正了所有的功能問題,就無需在硬件層面上進一步開展調(diào)試。
下面詳細介紹 QuickPlay 設計流程的每一個步驟。
步驟 1 : 純軟件設計。在這個階段,您可以用C 語言添加并連接處理內(nèi)核,創(chuàng)建自己的FPGA 設計,然后使用自己的主機軟件來指定通信通道。QuickPlay 基于 Eclipse 的集成開發(fā)環(huán)境(IDE)通過簡單的 API 提供 C/C++ 語言庫,用于創(chuàng)建內(nèi)核、流、流端口和存儲器端口,以及從流端口和存儲器端口讀取/ 寫入。
此外,QuickPlay IDE 還提供直觀的圖形編輯器,便于您拖放內(nèi)核與其他設計元素并繪制流。
步驟 2 :功能驗證。這一步的重點是確保步驟 1編寫的軟件模型能正確工作。實現(xiàn)的方法是先在桌面上編譯軟件模型,然后使用測試程序發(fā)送數(shù)據(jù)到輸入以執(zhí)行軟件模型,最后驗證輸出的正確性。并行執(zhí)行 FPGA 設計的軟件模型,為每個內(nèi)核提供獨立的線程,以模擬實際硬件實現(xiàn)的并行性。
然后您可以使用標準軟件調(diào)試方法和工具,如斷點、檢測點、分步執(zhí)行以及格式化輸出函數(shù)來調(diào)試軟件模型。(在實現(xiàn)到硬件中之后您可能還想運行更多測試。我們將對此做簡要描述。)從設計流程來看,這是您完成全部驗證工作的步驟。一旦您完成這個調(diào)試步驟,您完成這個調(diào)試步驟,并且糾正了所有的功能問題,您就無需在硬件層面上進一步開展調(diào)試。
需要提醒的是: 功能模型完全不涉及任何硬件基礎架構元素。上述實例的重點是簡單的兩功能模型。圖1 中添加的系統(tǒng)構成(如通信組件、控制層面、時鐘及復位)在這個建模和驗證階段完全不涉及。
步驟 3 : 硬件生成。這一步用于從用戶的軟件模型生成 FPGA 硬件。它涉及三個簡單的操作:
1. 在 QuickPlay GUI 的下拉菜單中選擇您想要實現(xiàn)到自己的設計中的 FPGA 硬件。QuickPlay 能夠使用品種不斷豐富的現(xiàn)成開發(fā)板來實現(xiàn)設計。這些開發(fā)板采用先進的賽靈思All Programmable FPGA、PCIe 3.0、10 Gb 以太網(wǎng)、DDR3 SDRAM、QDR2+SRAM 等。
2. 選擇需要映射到設計輸入及輸出端口的物理接口(以及協(xié)議)。這些通過菜單都能方便選擇。具體選擇取決于用戶選定的 FPGA 板件上提供的接口,例如 PCIe、10 Gb 以太網(wǎng) TCP/IP 和 10 Gb 以太網(wǎng) UDP。選擇通信協(xié)議即自動調(diào)用實現(xiàn)連接所需的硬件 IP 模塊以及其上分層的任何軟件協(xié)議棧,從而完成整個系統(tǒng)的創(chuàng)建。
3. 啟動構建流程這個過程包括運行 HLS 引擎(從 C 語言代碼創(chuàng)建硬件),創(chuàng)建所需的系統(tǒng)硬件功能(我們原始實例中的控制層邏輯)和運行構建板件要求的硬件鏡像所需的其他工具(例如賽靈思Vivado? 集成設計環(huán)境)。完成這個過程無需手動干預。
步驟 4 : 系統(tǒng)執(zhí)行。這個步驟與步驟 2 中的功能模型執(zhí)行(功能驗證)相似,除了現(xiàn)在雖然主機應用仍然運行在軟件中,但 FPGA 設計運行在選定的 FPGA 板件上。這意味著您可以從 FPGA 板件輸入輸出真實數(shù)據(jù),從而進一步驗證其功能的完整性。由于這樣可以顯著加快運行速度,而且因為您可以使用實時數(shù)據(jù)資源,您在這個階段與在功能驗證階段相比可以運行數(shù)量多得多的測試。
步驟 5 : 系統(tǒng)調(diào)試。因為與功能驗證階段相比現(xiàn)在您可以運行數(shù)量多得多的測試,您可以發(fā)現(xiàn)在步驟 2 中未能發(fā)現(xiàn)的功能缺陷。那么您現(xiàn)在該如何調(diào)試呢?
如前文所述,您永遠不必在硬件層面進行調(diào)試,即便缺陷是在在硬件中運行功能后發(fā)現(xiàn)的。由于 QuickPlay 保證軟件模型和硬件實現(xiàn)之間的功能等效性,因此任何硬件版本中發(fā)生的缺陷也必然存在于軟件版本中。這就是您無需在硬件中進行調(diào)試的原因;您只需要在軟件域中調(diào)試就足夠了。
作為由 QuickPlay 提供的抽象結果,算法保持純粹性,著重處理數(shù)據(jù)操作,獨立于底層通信細節(jié)。
只要您發(fā)現(xiàn)測試序列在硬件中失敗,QuickPlay就能采集在設計輸入端造成錯誤操作的事件序列,然后在軟件環(huán)境中將其回放,以便您使用 Eclipse 調(diào)試器進行調(diào)試,從而找出缺陷的源頭。
由于 QuickPlay 能自動為基礎架構配置硬件,以便觀察設計中的所有關鍵點,因此這樣做的是可行的。您還可以禁用該基礎架構以釋放寶貴的硬件資源。圖 4 所示即為添加了調(diào)試電路的實例系統(tǒng)。如果沒有 QuickPlay,就必須插入某種調(diào)試基礎架構并進行手動管理。而在使用 QuickPlay 的 情況下,這一切對軟件開發(fā)人員來說都是自動化和透明化的。
?
圖 4 — 自動創(chuàng)建調(diào)試基礎架構
整個流程就是先在軟件中建模,然后在硬件中構建并測試系統(tǒng)。如果存在缺陷,將失敗的測試序列導回軟件環(huán)境中,在軟件環(huán)境中調(diào)試,修改源代碼,然后重復這一過程。與傳統(tǒng)流程相比這能顯著提高生產(chǎn)力。
步驟 6(可選): 系統(tǒng)優(yōu)化。在您完成調(diào)試階段后,就會擁有一個能夠在 FPGA 開發(fā)板上正確運行的功能設計。不過您可能想要進行一些性能優(yōu)化,而且這也是性能優(yōu)化的合適時間,因為您已經(jīng)知道自己的系統(tǒng)能正確運行。
首先應該考慮的優(yōu)化是優(yōu)化功能模型。有可能存在更多并行的機會。例如您可以嘗試使用不同的辦法來分解或重構各項功能。在這個層面優(yōu)化可以帶來顯著的性能提升。勿庸置疑,使用 VHDL 或Verilog 設計來開展優(yōu)化工作需要占用大量的時間,而在 C 語言中進行調(diào)整則非常迅速與簡捷。
其次您可以嘗試使用其他速度更快的 FPGA 開發(fā)板。因為從功能模型映射到開發(fā)板十分容易,嘗試各種不同開發(fā)板并從中選優(yōu)是件簡單的事情。
第三項需要優(yōu)化的對象是 QuickPlay 使用高級綜合創(chuàng)建的硬件內(nèi)核。雖然得到的硬件能保證正確高效地運行,不過其運行效率未必有硬件工程人員手動編制的硬件高。在這個階段您有多種選擇: 您可以優(yōu)化代碼和 HLS 設置來改善生成的硬件;可以使用 Vivado HLS 來生成更高效的硬件;或是讓硬件工程人員手動編制 HDL 中最關鍵的模塊。
這些優(yōu)化步驟并非是強制要求,不過在可用的硬件資源有限、而您又需要提升硬件性能時不妨一試。硬件工程師可可協(xié)助開展這些優(yōu)化工作。當您完成任何此類調(diào)整后,只需重復構建流程。
通用流通道
QuickPlay 提供的通用流 API 完全抽象并獨立于底層物理通信協(xié)議。流數(shù)據(jù)通過 ReadStream() 函數(shù)接收,使用WriteStream() 函數(shù)。這些函數(shù)可用于在內(nèi)核之間、向嵌入式或板級存儲器、向嵌入式或外部主機 CPU 發(fā)送與接收數(shù)據(jù),從而無需開發(fā)人員理解或管理底層低級協(xié)議即可提供開發(fā)板架構靈活性。
選擇的協(xié)議決定了通過什么硬件接收與發(fā)送數(shù)據(jù)。目前 QuickPlay 支持 ARM?AMBA? AXI4-Stream、DDR3、PCIe( 具備 DMA 功能) 以及 TCP/IP ; 更多協(xié)議正在添加中,也可根據(jù)需求添加協(xié)議。選擇所需的協(xié)議不僅是設置實現(xiàn)協(xié)議所需的硬件,也是支持較高級協(xié)議層所需的軟件協(xié)議棧,如圖 5 所示。
?
圖5 — 選擇所需的協(xié)議對所要求的硬件與軟件棧進行設置。
QuickPlay 負責管理這些讀寫的具體實現(xiàn)(大小、對齊、封送處理等)。ReadStream() 和 WriteStream()語句最重要的特征是它們是阻塞式的: 如果遇到這兩種語句之一,在所有預期的數(shù)據(jù)讀或?qū)懲瓿汕埃粫M入到下一語句。這對實現(xiàn)算法的確定性有重要意義。
通用的 ReadStream() 和 WriteStream() 語句與實際底層協(xié)議硬件的“綁定”借助 QuickPlay 庫發(fā)生在運行時間中。這不僅能防止通信細節(jié)讓軟件程序雜亂無章,還能夠提供模塊化和可移植性。改變通信協(xié)議無需對實際內(nèi)核代碼或主機軟件做任何改動。Read-Stream() 和WriteStream() 語句會自動綁定到任何已選定的協(xié)議,不會給程序語義造成影響。
在由 QuickPlay 提供抽象的影響下,軟件算法能保持純粹性,著重處理數(shù)據(jù)操作,完全獨立于底層的通信細節(jié)。
量產(chǎn)質(zhì)量級輸出
根據(jù)使用的 HLS 工具,通過學習編碼方式,提高硬件生成效率,結果質(zhì)量可得以進一步提高,不過這只是一種選擇。
雖然在其他情況下您使用的硬件平臺可能被簡單地視為一種原型設計平臺,但是您使用 QuickPlay創(chuàng)建的系統(tǒng)具有生產(chǎn)價值。在過去,從純粹的軟件設計到硬件輔助或純硬件設計一般需要數(shù)月時間。QuickPlay 將其縮短為數(shù)天時間。
QuickPlay 方法實現(xiàn)了長期以來尋求的讓軟件開發(fā)人員為其全部或部分應用開發(fā)硬件設計的目標。通過在自己熟悉的領域中開展工作,軟件工程師能夠根據(jù)需要來使用定制硬件,自動生成工作效率更高的硬件強化應用,而且與手動設計相比能提前數(shù)月實現(xiàn)量產(chǎn)。
評論
查看更多