為了盡快把新產(chǎn)品推向市場(chǎng),數(shù)字系統(tǒng)的設(shè)計(jì)者需要考慮如何加速設(shè)計(jì)開發(fā)的周期。設(shè)計(jì)加速主要可以從“設(shè)計(jì)的重用”和“抽象層級(jí)的提升”這兩個(gè)方面來考慮。Xilinx 推出的 Vivado HLS 工具可以直接使用C、C++或 System C 來對(duì) Xilinx 系列的 FPGA 進(jìn)行編程,從而提高抽象的層級(jí),大大減少了使用傳統(tǒng) RTL描述進(jìn)行 FPGA 開發(fā)所需的時(shí)間。
一、高層綜合簡(jiǎn)介
如圖 1.1.1 所示,F(xiàn)PGA 設(shè)計(jì)中從底層向上一共存在著四種抽象層級(jí),依次為:結(jié)構(gòu)性的、RTL、行為性的和高層。其中最底層的抽象(結(jié)構(gòu)性的)涉及到對(duì)底層硬件單元直接的例化,比如邏輯門,甚至是更底層的 LUT 或者觸發(fā)器。設(shè)計(jì)者更常用的是在“寄存器傳輸級(jí)(Register Transfer Level,RTL)” 進(jìn)行設(shè)計(jì),這個(gè)層級(jí)的抽象隱藏了底層的細(xì)節(jié),是在描述寄存器和寄存器之間可執(zhí)行的操作。更上層的“行為性的”描述是對(duì)電路的算法描述,也就是描述電路表現(xiàn)出什么樣的功能(行為),而不是描述每個(gè)寄存器該如何進(jìn)行操作。
前面介紹的幾種抽象層級(jí)都是在使用硬件描述語言 HDL 進(jìn)行設(shè)計(jì),可以看出,隨著抽象層級(jí)的提升,設(shè)計(jì)最終在硬件上實(shí)現(xiàn)的細(xì)節(jié)逐漸被弱化。而本章重點(diǎn)介紹的“高層”設(shè)計(jì)方法則直接使用高級(jí)語言,如C/C++進(jìn)行設(shè)計(jì),然后由 Vivado HLS 編譯器將 C 代碼綜合成 HDL 描述,最后再進(jìn)行邏輯綜合得到網(wǎng)表,這個(gè)網(wǎng)表最終會(huì)被映射到具體的 FPGA 器件上。
就像 C 語言或者其他高級(jí)語言針對(duì)不同的處理器架構(gòu)有著不同的編譯器,Xilinx Vivado High-Level Synthesis(高層綜合,HLS)工具同樣是一種編譯器,只不過它是用來將 C 或者 C++程序部署到 FPGA 上,而不是部署到傳統(tǒng)的處理器上。
在 Vivado HLS 中可以使用三種語言進(jìn)行設(shè)計(jì)開發(fā),分別是 C、C++ 和 SystemC。
二、HLS 設(shè)計(jì)流程
Vivado HLS 的功能簡(jiǎn)單地來說就是把 C、C++ 或 SystemC 的設(shè)計(jì)轉(zhuǎn)換成 RTL 實(shí)現(xiàn),然后就可以在Xilinx FPGA 或 Zynq 芯片的可編程邏輯中綜合并實(shí)現(xiàn)了。需要注意的是,這里我們說的使用 C/C++完成的設(shè)計(jì)與運(yùn)行在處理器(ZYNQ 中的 ARM 處理器或 MicroBlaze 軟核處理器)中的軟件代碼是截然不同的。在 HLS 中,所有的 C 設(shè)計(jì)都是要在可編程邏輯中實(shí)現(xiàn)的,也就是說,我們?nèi)匀皇窃谶M(jìn)行硬件設(shè)計(jì),只不過使用的不再是硬件描述語言。
使用 Vivado HLS 進(jìn)行設(shè)計(jì)的流程如下圖所示:
HLS 設(shè)計(jì)的主要輸入是一個(gè) C/C++/SystemC 設(shè)計(jì),以及一個(gè)基于 C 的測(cè)試集(TestBench)。我們首先要知道 C 語言的本質(zhì)就是函數(shù),那么這個(gè)測(cè)試集就是用于驗(yàn)證 C 設(shè)計(jì)中的函數(shù),驗(yàn)證過程需要一個(gè)“黃金參考”。這個(gè)“黃金參考”類似于一個(gè)標(biāo)準(zhǔn)答案,用來和 C 設(shè)計(jì)中函數(shù)所產(chǎn)生的輸出做比對(duì)。
在對(duì) HLS 設(shè)計(jì)進(jìn)行綜合之前,我們要先對(duì)其進(jìn)行“功能性驗(yàn)證”,也就是 C 仿真,其目的是驗(yàn)證 HLS 輸入的 C 代碼的功能是否正確。驗(yàn)證的方式就是在 TestBench 中調(diào)用 C 設(shè)計(jì)的函數(shù),然后將其輸出與“黃金參考”進(jìn)行比對(duì),如果與黃金參考有差異就需要先對(duì) C 設(shè)計(jì)進(jìn)行修改調(diào)試。
接下來就是對(duì)設(shè)計(jì)進(jìn)行高層綜合,即 HLS 過程本身。該過程涉及到分析和處理基于 C 的代碼,加上用戶所給出的指令和約束,來創(chuàng)建 RTL 描述。高層綜合結(jié)束后會(huì)產(chǎn)生一組輸出文件,包括以 Veilog 或者VHDL 語言編寫的 RTL 設(shè)計(jì)文件。
綜合過程結(jié)束后得到的 RTL 模型,可以在 Vivado HLS 中進(jìn)行 C/RTL 協(xié)同仿真,來進(jìn)一步驗(yàn)證綜合得到的 RTL 設(shè)計(jì)的正確性。在這個(gè)過程中 Vivao HLS 會(huì)自動(dòng)產(chǎn)生一個(gè)測(cè)試集為 RTL 設(shè)計(jì)提供輸入,然后拿它的輸出與預(yù)期的值做比對(duì)。C 功能性驗(yàn)證和 C/RTL 協(xié)同仿真的區(qū)別如下圖所示:
在圖 1.2.2 左側(cè)的功能性驗(yàn)證(C 仿真)中,原始測(cè)試集是用戶輸入的測(cè)試文件 TestBench。而右側(cè)的C/RTL 協(xié)同仿真所需的 RTL 測(cè)試集是由 Vivado HLS 自動(dòng)產(chǎn)生的,這樣就不再需要人工創(chuàng)建了,所產(chǎn)生的測(cè)試集包括了原始測(cè)試集和被測(cè) RTL 模塊之間的數(shù)據(jù)傳遞。
除了對(duì)功能進(jìn)行驗(yàn)證,我們還要評(píng)估 RTL 設(shè)計(jì)的實(shí)現(xiàn)和性能。比如,在 FPGA 中所需的資源的數(shù)量,設(shè)計(jì)的延遲、所支持的最高時(shí)鐘頻率等是否滿足要求。如果不滿足要求,那么就需要設(shè)計(jì)者通過修改指令和約束,然后再次進(jìn)行高層綜合,如圖 1.2.1 中右側(cè)的回路所示。一個(gè)設(shè)計(jì)可能要做多次 HLS 設(shè)計(jì)迭代,來找到“最佳 ”的解決方案。如果有必要,設(shè)計(jì)者也可以返回修改 C 設(shè)計(jì)代碼,然后從頭開始重新對(duì)設(shè)計(jì)進(jìn)行驗(yàn)證。
在設(shè)計(jì)被驗(yàn)證了之后,而且實(shí)現(xiàn)也滿足了期望的設(shè)計(jì)目標(biāo),那么就可以集成進(jìn)更大的系統(tǒng)里了。我們可以直接使用 HLS 過程所產(chǎn)生的 RTL 文件(即 VHDL 或 Verilog 代碼),更方便的做法是使用 Vivado HLS 的 IP 打包功能。對(duì) Vivado HLS 所產(chǎn)生的輸出打包意味著 HLS 設(shè)計(jì)能夠以 IP 核的形式引入其他 Xilinx 工具中,比如 Vivado 中的 IP 集成器。這兩種類型的輸出如下圖所示:
三、 接口綜合
在做 HLS 的時(shí)候,設(shè)計(jì)者需要分析設(shè)計(jì)的兩個(gè)主要方面:
設(shè)計(jì)的接口,也就是它的頂層連接;
設(shè)計(jì)的功能,也就是它所實(shí)現(xiàn)的算法;
我們給出一個(gè) HLS 設(shè)計(jì)中接口和功能的概念圖,如圖 1.3.1 所示。
在上圖中,兩端的綠色區(qū)域表示設(shè)計(jì)的輸入和輸出接口,其中展示了部分接口類型,如 RAM 接口、FIFO 接口,以及總線類型的接口等。這些接口可以是工具從代碼中通過接口綜合(Interface Synthesis)得到的,也可以由設(shè)計(jì)者手動(dòng)指定具體的接口類型。
圖中間黃色的區(qū)域表示 HLS 設(shè)計(jì)具體能夠?qū)崿F(xiàn)的功能,對(duì)于不同的應(yīng)用,其功能也各不相同。在 Vivado HLS 設(shè)計(jì)中,功能是從輸入的代碼中,經(jīng)過算法綜合(Algorithm Synthesis)的過程得到的。
在這里我們先簡(jiǎn)單介紹一下接口綜合。顧名思義,Interface Synthesis 指的是 HLS 設(shè)計(jì)中對(duì)接口的綜合,綜合出來的接口能夠與系統(tǒng)中的其他模塊通信,還有可能需要與系統(tǒng)中的處理器進(jìn)行通信。
這里接口的概念既包括端口(port),也包含所使用的協(xié)議。所有端口的細(xì)節(jié)(如類型、位寬和方向)是從 C/C++ 文件中頂層函數(shù)的參數(shù)和返回值里推斷出來的;而協(xié)議是從端口的表現(xiàn)(行為)推斷出來的。比如,最簡(jiǎn)單的接口可以是一條 1 比特的線(wire),而更復(fù)雜的接口,可能要用總線或 RAM 接口。接口綜合能夠推斷出來的接口類型包括:線、寄存器、單向和雙向握手信號(hào)、FIFO、存儲(chǔ)器和總線等。
下面我們給出一個(gè)簡(jiǎn)單的 C 設(shè)計(jì)的頂層函數(shù),函數(shù)名為 find_average_of_best_X(),其參數(shù)如下圖所示:
圖 1.3.2 中函數(shù)內(nèi)部工作的詳細(xì)情況無關(guān)緊要,不過每個(gè)參數(shù)的讀/寫操作將決定綜合出來的端口的方向。這個(gè)函數(shù)定義包含三個(gè)參數(shù),數(shù)組“sample”和整數(shù)“X”是函數(shù)的輸入,而 average 作為函數(shù)的輸出。因此,簡(jiǎn)單來說,這三個(gè)函數(shù)參數(shù)要被 HLS 轉(zhuǎn)換成兩個(gè)輸入接口和一個(gè)輸出接口,如下圖所示:
需要注意的是,圖 1.3.3 只是一個(gè)簡(jiǎn)化了的接口示意圖。根據(jù)所用的協(xié)議,這些接口可能包括數(shù)據(jù)端口自身以外的控制輸入或輸出,如下圖所示:
圖 1.3.4 是函數(shù) find_average_of_best_X()經(jīng) HLS 綜合出來的完整的 RTL 模塊的接口圖。從圖中可以看到由函數(shù)的三個(gè)參數(shù)所綜合出來的接口分別擁有了各自的協(xié)議,如 ap_memory 協(xié)議、ap_none 協(xié)議和 ap_vld協(xié)議。同時(shí)模塊還多出來了一些端口,如 ap_clk 和 ap_rst 等,它們使用的是 ap_ctrl_hs 協(xié)議。這些協(xié)議決定了相應(yīng)的接口是如何與系統(tǒng)中其他模塊進(jìn)行交互的,至于各協(xié)議具體的含義以及如何為接口選擇其協(xié)議,我們將在后續(xù)的章節(jié)中介紹。
四、算法綜合
算法綜合關(guān)注的是設(shè)計(jì)的功能,即設(shè)計(jì)所期望的行為,它是由輸入的 C 設(shè)計(jì)所描述的。算法綜合從代碼中推出各種運(yùn)算操作,然后轉(zhuǎn)換成一組 RTL 語句。
算法綜合包括三個(gè)主要階段,依次是:
解析出數(shù)據(jù)通路和控制電路;
調(diào)度和綁定;
優(yōu)化;
解析出數(shù)據(jù)通路和控制電路
HLS 的第一個(gè)階段是分析 C/C++/SystemC 代碼,并且解釋所需的功能。Vivado HLS 從以下幾個(gè)方面分析程序:邏輯和算法的運(yùn)算、條件語句和分支、數(shù)組運(yùn)算和循環(huán)等。
所產(chǎn)生的實(shí)現(xiàn)會(huì)具有一個(gè)數(shù)據(jù)通路元件,一般還會(huì)有一個(gè)控制元件。需要澄清的是,這里的“數(shù)據(jù)通路”處理指的是在數(shù)據(jù)樣本上作的運(yùn)算,而“控制”是需要協(xié)同數(shù)據(jù)流處理所需的電路。算法的本質(zhì)定義出數(shù)據(jù)通路和控制元件,設(shè)計(jì)者可以在 HLS 中采取專門的步驟來最小化控制元件的復(fù)雜度。
調(diào)度和綁定
HLS 是由兩個(gè)主要過程組成的:調(diào)度(Scheduling)和綁定(Binding)。它們是交替進(jìn)行的,彼此互相影響,如下圖所示:
調(diào)度是把由 C 代碼解釋得到的 RTL 語句翻譯成一組運(yùn)算,每個(gè)運(yùn)算都關(guān)聯(lián)著一定的執(zhí)行時(shí)間,以時(shí)鐘周期為單位。這個(gè)階段所作的決策,受時(shí)鐘頻率和不確定度、目標(biāo)芯片的技術(shù)和用戶所施加的指令所影響。
綁定是調(diào)度好了的運(yùn)算和目標(biāo)芯片上的實(shí)際資源聯(lián)系起來的過程。這些資源的功能和時(shí)序特征可能會(huì)影響調(diào)度,因此綁定信息會(huì)反饋給調(diào)度過程。比如使用 DSP48x 資源就表明關(guān)鍵路徑比采用邏輯資源的方案要短。
優(yōu)化
約束 :設(shè)計(jì)者可以對(duì)設(shè)計(jì)的某些指標(biāo)加以限制。比如,可以指定最低的時(shí)鐘周期。這樣就能確保實(shí)現(xiàn)結(jié)果能夠滿足要集成進(jìn)去的系統(tǒng)的要求。類似的,設(shè)計(jì)者可以選擇約束資源的利用情況或其他的指標(biāo),從而優(yōu)化應(yīng)用的設(shè)計(jì)。
指令:設(shè)計(jì)者可以通過指令對(duì) RTL 的實(shí)現(xiàn)參數(shù)施加更具體的影響。有各種類型的指令,分別映射在代碼的某些特征上,比如讓設(shè)計(jì)者可以指定 HLS 引擎如何處理 C 代碼中識(shí)別出來的循環(huán)或數(shù)組,或是某個(gè)特定運(yùn)算的延遲。這能導(dǎo)致 RTL 輸出的巨大改變。因此,具有了指令的知識(shí),設(shè)計(jì)者就可以根據(jù)應(yīng)用的需求來做優(yōu)化了。
五、 HLS 庫(kù)
Vivado HLS 中包含了一系列的 C 庫(kù)(包括 C 和 C++),方便對(duì)一些常用的硬件結(jié)構(gòu)或功能使用 C/C++進(jìn)行建模,并且能夠綜合成 RTL。在 Vivado HLS 中提供的 C 庫(kù)有下面幾種類型:
1、任意精度數(shù)據(jù)類型庫(kù)
2、HLS Stream 庫(kù)
3、HLS 數(shù)學(xué)庫(kù)
4、HLS 視頻庫(kù)
5、HLS IP 庫(kù)
6、HLS 線性代數(shù)庫(kù)
在 HLS 設(shè)計(jì)中調(diào)用庫(kù)中的函數(shù)可以大大提高開發(fā)效率。
-
FPGA
+關(guān)注
關(guān)注
1642文章
21920瀏覽量
612003 -
Xilinx
+關(guān)注
關(guān)注
73文章
2179瀏覽量
123911 -
代碼
+關(guān)注
關(guān)注
30文章
4880瀏覽量
69999 -
Vivado
+關(guān)注
關(guān)注
19文章
825瀏覽量
67912 -
HLS
+關(guān)注
關(guān)注
1文章
131瀏覽量
24562
原文標(biāo)題:一文了解Vivado HLS
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
探索Vivado HLS設(shè)計(jì)流,Vivado HLS高層次綜合設(shè)計(jì)
請(qǐng)問如何只下載Vivado HLS 2015.2
Vivado HLS設(shè)計(jì)流的相關(guān)資料分享
嵌入式硬件開發(fā)學(xué)習(xí)教程——Xilinx Vivado HLS案例 (流程說明)
Hackaday讀者有話說:Vivado HLS使用經(jīng)驗(yàn)分享

用Vivado-HLS實(shí)現(xiàn)低latency 除法器

TCL腳本簡(jiǎn)介 vivado hls 的設(shè)計(jì)流程

如何創(chuàng)建Vivado HLS項(xiàng)目
如何使用Tcl命令語言讓Vivado HLS運(yùn)作
關(guān)于Vivado HLS錯(cuò)誤理解

Vivado HLS和Vitis HLS 兩者之間有什么區(qū)別
UltraFast Vivado HLS方法指南

將VIVADO HLS設(shè)計(jì)移植到CATAPULT HLS平臺(tái)

評(píng)論