ZedBoard 實(shí)例證明采用無縫環(huán)境可以快速構(gòu)建并優(yōu)化設(shè)計。
在賽靈思 SDSoC 開發(fā)環(huán)境發(fā)布前,標(biāo)準(zhǔn) SoC 設(shè)計方法涉及一系列不同的工程設(shè)計技巧。通常來說,如果系統(tǒng)架構(gòu)師根據(jù)要求生成系統(tǒng)架構(gòu)和子系統(tǒng),那么解決的方案會分為硬件功能的實(shí)現(xiàn)(邏輯側(cè))和軟件功能的實(shí)現(xiàn)(處理器側(cè))。這樣,FPGA 和軟件工程師要分別開發(fā)各自的功能,再根據(jù)集成測試計劃進(jìn)行組成和測試。這種方法持續(xù)運(yùn)用了多年,但賽靈思 Zynq?-7000 All Programmable SoC 以及即將推出的賽靈思 Zynq UltraScale+TM MP-SoC 等功能更強(qiáng)的 SoC 的問世要求采用新的設(shè)計方法。
SDSoC 方法能幫助更廣泛的工程師用戶群開發(fā)極高性能系統(tǒng)。在 SDSoC 開發(fā)環(huán)境中進(jìn)行開發(fā)的工程師新手會發(fā)現(xiàn),可以輕松快速地啟動并運(yùn)行系統(tǒng),而且系統(tǒng)優(yōu)化也同樣便捷。
我們舉一個簡單而具代表性的例子來說明如何完成上述任務(wù)并獲得相應(yīng)的收益。我們針對的是運(yùn)行 Linux 的 ZedBoard,并采用內(nèi)置示例之一:矩陣乘法器和加法模板。
?
設(shè)計方法簡史
可編程邏輯器件自 1980 年推出以來一直迅速發(fā)展。起初,工程師通過原理圖輸入法對器件進(jìn)行編程(雖然 22v10 等較早期的可編程邏輯器件 (PLD) 是通過邏輯方程編程的)。這需要電子工程師執(zhí)行大部分 PLD 開發(fā)工作,因?yàn)檫壿嬙O(shè)計和優(yōu)化通常屬于電子工程學(xué)范疇。隨著器件尺寸和功能的不斷提升,這種原理圖輸入法自然開始面臨局限性問題,因?yàn)樵O(shè)計和驗(yàn)證時間會隨著設(shè)計復(fù)雜性的增加而顯著延長。工程師需要具備在更高抽象層上工作的能力。
VHDL 和 Verilog 應(yīng)運(yùn)而生。二者開始都是用來描述和模擬邏輯設(shè)計(特別是 ASIC)的語言。VHDL 甚至有自己的軍用標(biāo)準(zhǔn)。既然我們要在硬件描述語言 (HDL) 中描述邏輯行為,那么自然應(yīng)該綜合所需的邏輯電路。綜合工具的開發(fā)使得工程師能描述通常在寄存器傳輸層的邏輯行為。HDL 也能大幅改進(jìn)驗(yàn)證方法,有助于開發(fā)行為測試平臺,支持結(jié)構(gòu)化驗(yàn)證。HDL 也首次支持模塊化和廠商獨(dú)立性。
HDL 內(nèi)在并行性、寄存器傳輸層設(shè)計法和實(shí)現(xiàn)流程則需要了解優(yōu)化和時序收斂,這就意味著 PLD 開發(fā)任務(wù)大部分落到了電子工程師的身上。
HDL 一直是 PLD 開發(fā)領(lǐng)域的事實(shí)標(biāo)準(zhǔn),但多年發(fā)展中也考慮到整體產(chǎn)業(yè)的發(fā)展需求。單就 VHDL而言,相繼于 1987 年(IEEE 采用的第一年)、1993年、2000 年、2002 年、2007 年、2008 年進(jìn)行了修訂。不過,跟原理圖輸入法一樣,HDL 也逐漸開始面臨一系列局限性問題,包括開發(fā)和驗(yàn)證時間太長、器件功能要求提高等。
隨著 PLD 的角色從膠合邏輯向加速外設(shè)甚至最終向系統(tǒng)核心發(fā)展,業(yè)界需要新的設(shè)計方法來滿足有關(guān)發(fā)展需求。近年來,高層次綜合 (HLS) 越來越受歡迎。根據(jù)高層次綜合法,設(shè)計通過 C/C++(用賽靈思的 Vivado? HLS)或其他工具(如 MathWorks 公司的 MATLAB? 或國家儀器公司的 LabVIEW)輸入。由于新的設(shè)計方法能夠充分發(fā)揮器件的功能,這種方法開始將設(shè)計和實(shí)現(xiàn)從電子工程領(lǐng)域轉(zhuǎn)向軟件領(lǐng)域,從而顯著擴(kuò)大了潛在的 PLD 設(shè)計人員群體,并鞏固了 PLD 作為系統(tǒng)核心的地位。
因此,SoC 設(shè)計自然能用 HLS 來生成緊密集成的開發(fā)環(huán)境,工程師則能在環(huán)境中無縫加速設(shè)計邏輯側(cè)功能。在此情況下,SDSoC 環(huán)境應(yīng)運(yùn)而生。
熟悉的環(huán)境
SDSoC 開發(fā)環(huán)境基于 Eclipse,大多數(shù)軟件開發(fā)人員對這種環(huán)境應(yīng)該是比較熟悉的(圖1)。該環(huán)境通過采用能處理 C 或C++ 程序的全新 SDSoC 編譯器無縫支持器件可編程邏輯 (PL)側(cè)功能加速。
SDSoC 環(huán)境中使用最高抽象層進(jìn)行開發(fā),具體如下:
1. 在 C 或 C++ 中開發(fā)應(yīng)用。
2. 對應(yīng)用進(jìn)行特性分析,明確性能瓶頸問題。
3. 使用特性分析信息,明確器件 PL 側(cè)哪些功能需要加速。
4. 隨后構(gòu)建系統(tǒng)并生成 SD 卡映像。
5. 硬件到位后,進(jìn)一步分析性能并根據(jù)要求優(yōu)化加速功能。
我們能在 SDSoC 環(huán)境中開發(fā)出可在裸機(jī)、FreeRTOS 或 Linux 操作系統(tǒng)上運(yùn)行的各種不同應(yīng)用。該環(huán)境內(nèi)置支持 ZedBoard、MicroZed 和Digilent ZYBO 等大部分 Zynq SoC 開發(fā)板。這樣,我們不僅能加速開發(fā)應(yīng)用,還能通過該功能定義自己的底層硬件平臺,在自己的定制硬件平臺能用于集成時使用。
在 SDSoC 環(huán)境中編譯程序時,構(gòu)建過程輸出提供了從 SD 卡配置 Zynq SoC 所需的系列文件。該系列文件包括一級和二級引導(dǎo)載入程序,以及操作系統(tǒng)所需的應(yīng)用和映像。
SDSOC 實(shí)例
下面我們看看 SDSoC 環(huán)境如何工作,多快就能讓實(shí)例啟動并運(yùn)行起來。我們針對的 ZedBoard 開發(fā)板運(yùn)行 Linux 操作系統(tǒng)并使用內(nèi)置矩陣乘法器和加法模板。
首先一如既往地創(chuàng)建項(xiàng)目。我們能通過歡迎窗口(圖 1)或通過菜單選擇“File -> New -> SDSoC”項(xiàng)目來創(chuàng)建項(xiàng)目。這兩種方法都能打開對話框,讓我們給項(xiàng)目命名,選擇開發(fā)板和操作系統(tǒng)(圖 2)。
這將在 SDSoC GUI 左側(cè) Project Explorer 下生成項(xiàng)目。我們在該項(xiàng)目下會看到以下文件夾,每個文件夾都有自己唯一的圖標(biāo):
? SDSoC 硬件功能:這里我們能看到轉(zhuǎn)移到硬件的功能。一開始這個文件夾是空的,等待我們轉(zhuǎn)移。
? Includes:展開這個文件夾能看到構(gòu)建過程中使用的所有 C/C++ 報頭文件。
? src:包含演示用源代碼。
為確保我們正確配置所有事項(xiàng),包括 SDSoC 安裝和環(huán)境以及開發(fā)板,我們要構(gòu)建演示,其只在器件片上處理系統(tǒng) (PS) 側(cè)運(yùn)行。
當(dāng)然,下一步就是構(gòu)建項(xiàng)目了。在菜單上選中項(xiàng)目,我們選擇“Project->Build Project”。構(gòu)建時間不會太長。完成后,會看到如圖 3 所示的文件夾出現(xiàn)在 Project Explorer 中的項(xiàng)目下。除了上述文件夾之外,還有:
? 二進(jìn)制文件:這里能找到軟件編譯過程生成的可執(zhí)行連接 (ELF) 文件。
? 歸檔:鏈接對象文件,創(chuàng)建其中的二進(jìn)制文件。
? SDRelease:包含我們的引導(dǎo)文件和報告。
我們已經(jīng)構(gòu)建了首個演示,只能在 Zynq SoC 的 PS 上運(yùn)行,下面我們來看看如何確保其按預(yù)期正常運(yùn)行。對應(yīng)用進(jìn)行特性分析,明確 SDSoC 加速運(yùn)行。工程師用特性分析信息明確應(yīng)該移動哪些功能。
我們用已提供的 sds_lib.h 庫在基本層面進(jìn)行特性分析,這能在 64 位全局計數(shù)器上獲得基本時間戳 API,讓我們測出每個功能的用時。我們用API 能簡單記錄功能開始和停止時間,這一時間差就是整個過程的執(zhí)行時間。
源代碼包括兩個版本的矩陣乘法和加法算法。所謂的黃金版不用于轉(zhuǎn)移到片上可編程邏輯 (PL);另一版則針對這個目的。通過在 PS 中構(gòu)建并運(yùn)行,我們能確保有針對性地對比,而且兩個流程執(zhí)行時間基本相同。
構(gòu)建完成后,我們能拷貝“Project Explorer 下 SDRelease -> sd_card”文件夾中的所有文件到 SD 卡,然后將 SD 卡插到 ZedBoard 上(SD 卡配置的模式引腳要正確設(shè)置)。終端程序連接以及引導(dǎo)序列完成后,我們就要運(yùn)行程序。輸入“/mnt/mult_add.elf”(這里的 mult_add 是我們創(chuàng)建的項(xiàng)目的名稱)。在 ZedBoard 上運(yùn)行,得到如圖 4 所示的結(jié)果,顯示兩個功能運(yùn)行的時間基本相同。
驗(yàn)證執(zhí)行時間基本相同后,我們將乘法函數(shù)移到 SoC 的 PL 側(cè),這步很容易實(shí)現(xiàn)。
分析實(shí)例中 src 目錄的文件結(jié)構(gòu),我們看到:
? main.cpp:這包含主函數(shù)、黃金計算、時間戳和器件硬件側(cè)所用的乘法加法函數(shù)調(diào)用。
? mmult.cpp:這包含在硬件部分運(yùn)行的乘法函數(shù)。
? madd.cpp:這包含在硬件部分運(yùn)行的加法函數(shù)。
完成上述步驟后,下次構(gòu)建項(xiàng)目時,SDSoC 鏈接器會自動調(diào)用賽靈思 Vivado HLS 和Vivado 來執(zhí)行 SoC 中 PL 側(cè)的功能。
下一步就是將一個函數(shù)轉(zhuǎn)移到 SoC 的 PL 側(cè)。我們通過以下兩種方法之一能完成這一任務(wù):
1. 在 Project Explorer 中,我們展開文件,看到文件中的函數(shù),選擇感興趣的函數(shù),右鍵點(diǎn)擊并選擇“Toggle HW/SW [H]”(圖5)。
2. 打開文件并執(zhí)行右側(cè)“outline”標(biāo)簽下的同樣選項(xiàng),這也能顯示函數(shù)(圖 6)。
開關(guān)硬件中加速的 mmult() 函數(shù)能讓 [H] 添加到函數(shù)后面(圖 7)。
我們還會看到 SDSoC Hardware Functions 下選擇的功能(“Project Explorer”標(biāo)簽中項(xiàng)目下方,圖 8)。這能讓我們方便地看到設(shè)計中加速的所有功能。
完成上述步驟后,下次構(gòu)建項(xiàng)目時,SDSoC 鏈接器會自動調(diào)用賽靈思 Vivado HLS和Vivado Design Suite 其余部分來執(zhí)行 SoC 中 PL 側(cè)的功能。與此同時,會創(chuàng)建軟件驅(qū)動程序,支持功能加速。我們看到,功能轉(zhuǎn)移到器件 PL 側(cè)是無縫的,而且還會提高性能。
編譯和生成 SD 卡映像后,我將 mmult() 函數(shù)移到硬件,在 ZedBoard 上運(yùn)行。如圖 9 所示,執(zhí)行時間(處理器工作循環(huán))只有 52,444 / 183,289 = 0.28,也就是此前期間 PS 側(cè) 183,289 個處理器工作循環(huán)(執(zhí)行時間)的 28%(圖 4)。考慮到器件 PS 側(cè)相同功能的性能,我們看到只需簡單點(diǎn)擊鼠標(biāo)就能大幅改進(jìn)執(zhí)行時間。
這里給出的例子可以直接看出 SDSoC 環(huán)境和緊密集成的 HLS 功能的強(qiáng)大無縫功能。
評論