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