Vitis HLS 是一種高層次綜合工具,支持將 C、C++ 和 OpenCL 函數(shù)硬連線到器件邏輯互連結(jié)構(gòu)和 RAM/DSP 塊上。Vitis HLS 可在Vitis 應(yīng)用加速開發(fā)流程中實(shí)現(xiàn)硬件內(nèi)核,并使用 C/C++ 語(yǔ)言代碼在 Vivado Design Suite 中為賽靈思器件設(shè)計(jì)開發(fā) RTL IP。
Vitis 高層次綜合用戶指南(UG1399)包括Vitis HLS 入門、Vitis HLS 硬件設(shè)計(jì)方法論、Vitis HLS C 語(yǔ)言驅(qū)動(dòng)程序參考資料、Vitis HLS 命令參考資料、Vitis HLS 庫(kù)參考資料,以及Vitis HLS 移植指南。由于本指南較長(zhǎng),下文僅摘錄部分內(nèi)容。如果您希望查閱完整版,請(qǐng)至文末鏈接點(diǎn)擊下載。
Vitis HLS 簡(jiǎn)介
在 Vitis 應(yīng)用加速流程中,在可編程邏輯中實(shí)現(xiàn)和最優(yōu)化 C/C++ 語(yǔ)言代碼以及實(shí)現(xiàn)低時(shí)延和高吞吐量所需的大部分代碼修改操作均可通過(guò) Vitis HLS 工具來(lái)自動(dòng)執(zhí)行。在應(yīng)用加速流程中,Vitis HLS 的基本作用是通過(guò)推斷所需的編譯指示來(lái)為函數(shù)實(shí)參生成正確的接口,并對(duì)代碼內(nèi)的循環(huán)和函數(shù)執(zhí)行流水打拍。Vitis HLS 還支持自定義代碼以實(shí)現(xiàn)不同接口標(biāo)準(zhǔn)或者實(shí)現(xiàn)特定最優(yōu)化以達(dá)成設(shè)計(jì)目標(biāo)。
Vitis HLS 設(shè)計(jì)流程如下所述:
編譯、仿真和調(diào)試 C/C++ 語(yǔ)言算法。
查看報(bào)告以分析和最優(yōu)化設(shè)計(jì)。
將 C 語(yǔ)言算法綜合到 RTL 設(shè)計(jì)中。
使用 RTL 協(xié)同仿真來(lái)驗(yàn)證 RTL 實(shí)現(xiàn)。
將 RTL 實(shí)現(xiàn)封裝到已編譯的對(duì)象文件(.xo) 擴(kuò)展中,或者導(dǎo)出到 RTL IP。
高層次綜合基礎(chǔ)
賽靈思 Vitis HLS 工具可將 C 語(yǔ)言或 C++ 語(yǔ)言函數(shù)綜合到 RTL 代碼中,用于在可編程邏輯內(nèi)進(jìn)行加速。Vitis HLS 與Vitis 核開發(fā)套件和應(yīng)用加速設(shè)計(jì)流程緊密集成。
使用高層次綜合(HLS) 設(shè)計(jì)方法論的優(yōu)勢(shì)包括但不限于:
編譯、仿真和調(diào)試 C/C++ 語(yǔ)言算法。
查看報(bào)告以分析和最優(yōu)化設(shè)計(jì)。
將 C 語(yǔ)言算法綜合到 RTL 設(shè)計(jì)中。
使用 RTL 協(xié)同仿真來(lái)驗(yàn)證 RTL 實(shí)現(xiàn)。
將 RTL 實(shí)現(xiàn)封裝到已編譯的對(duì)象文件(.xo) 擴(kuò)展中,或者導(dǎo)出到 RTL IP。
HLS 包含以下階段:
1調(diào)度可根據(jù)下列條件判定每個(gè)時(shí)鐘周期內(nèi)發(fā)生的運(yùn)算:
運(yùn)算的依賴關(guān)系何時(shí)已得到滿足或者變?yōu)榭捎谩?/p>
時(shí)鐘周期長(zhǎng)度或時(shí)鐘頻率。
運(yùn)算完成所需時(shí)間(由目標(biāo)器件來(lái)定義)。
可用資源分配。
整合任意用戶指定的最優(yōu)化指令。
2綁定會(huì)分配硬件資源用于實(shí)現(xiàn)調(diào)度的每項(xiàng)運(yùn)算,并將運(yùn)算符(例如,加法、乘法和移位)映射到特定 RTL 實(shí)現(xiàn)。例如,mult 運(yùn)算可在 RTL 內(nèi)作為組合乘法器或流水打拍乘法器來(lái)實(shí)現(xiàn)。
3控制邏輯抽取可創(chuàng)建有限狀態(tài)機(jī)(FSM),根據(jù)定義的調(diào)度按順序執(zhí)行 RTL 設(shè)計(jì)中的運(yùn)算。
以調(diào)度和綁定為例,下圖顯示了此代碼示例的調(diào)度和綁定階段的示例:


在此示例的調(diào)度階段,根據(jù)高層次綜合的調(diào)度,在每個(gè)時(shí)鐘周期內(nèi)將執(zhí)行以下操作:
第一個(gè)時(shí)鐘周期:乘法和第一次加法
第二個(gè)時(shí)鐘周期:如果在第二個(gè)時(shí)鐘周期內(nèi)第一次加法的結(jié)果可用,則執(zhí)行第二次加法并輸出生成。
在最終的硬件實(shí)現(xiàn)中,高層次綜合將頂層函數(shù)的實(shí)參實(shí)現(xiàn)為輸入和輸出 (I/O) 端口。在此示例中,實(shí)參是簡(jiǎn)單數(shù)據(jù)端口。因?yàn)槊總€(gè)輸入變量都是 char 類型,所以輸入數(shù)據(jù)端口位寬均為 8 位。return 函數(shù)為 32 位 int 數(shù)據(jù)類型,而輸出數(shù)據(jù)端口位寬為 32 位。
在此示例的初始綁定階段,高層次綜合使用組合乘法器(Mul)實(shí)現(xiàn)乘法運(yùn)算,并使用組合加法器/減法器(AddSub)實(shí)現(xiàn)兩次加法運(yùn)算。
在目標(biāo)綁定階段,高層次綜合使用 DSP 模塊資源實(shí)現(xiàn)乘法器和其中一項(xiàng)加法運(yùn)算。部分應(yīng)用使用大量二進(jìn)制乘法器和累加器,這些乘法器和累加器最好在專用 DSP 資源內(nèi)實(shí)現(xiàn)。DSP 模塊是 FPGA 架構(gòu)中可用的計(jì)算塊,可在高性能和高效實(shí)現(xiàn)之間達(dá)成理想的平衡。
Vitis HLS 進(jìn)程概述
Vitis HLS 基于工程,可包含多個(gè)變體(稱為“解決方案”)以驅(qū)動(dòng)綜合與仿真。每個(gè)解決方案均可將 Vivado IP 流程或Vitis 內(nèi)核流程設(shè)定為目標(biāo)?;谀繕?biāo)流程,每個(gè)解決方案都將指定不同的約束和最優(yōu)化指令,如 啟用 Vivado IP 流程和啟用 Vitis 內(nèi)核流程中所述。
以下提供了典型設(shè)計(jì)流程中的綜合、分析與最優(yōu)化步驟:
1創(chuàng)建新的 Vitis HLS 工程。
2利用 C 語(yǔ)言仿真來(lái)驗(yàn)證源代碼。
3運(yùn)行高層次綜合以生成 RTL 文件。
4分析結(jié)果,包括檢驗(yàn)時(shí)延、啟動(dòng)時(shí)間間隔 (II)、吞吐量和資源使用情況。
5執(zhí)行最優(yōu)化,并按需重復(fù)此步驟。
6使用 C/RTL 協(xié)同仿真驗(yàn)證結(jié)果。
Vitis HLS 基于目標(biāo)流程、默認(rèn)工具配置、設(shè)計(jì)約束和您指定的任意最優(yōu)化編譯指示或指令來(lái)實(shí)現(xiàn)解決方案。您可使用最優(yōu)化指令來(lái)修改和控制內(nèi)部邏輯和 I/O 端口的實(shí)現(xiàn),以覆蓋工具的默認(rèn)行為。
C/C++ 代碼綜合方式如下:
1頂層函數(shù)實(shí)參由 Vitis HLS 自動(dòng)綜合到 RTL I/O 端口接口內(nèi)。如 定義接口 中所述,該工具創(chuàng)建的默認(rèn)接口取決于目標(biāo)流程、函數(shù)實(shí)參的數(shù)據(jù)類型和方向、默認(rèn)接口模式以及用戶指定的任何 INTERFACE 編譯指示或指令(用于手動(dòng)定義接口)。
2頂層 C/C++ 函數(shù)的子函數(shù)綜合到 RTL 設(shè)計(jì)的層級(jí)內(nèi)的各塊中。
最終 RTL 設(shè)計(jì)包含與原始頂層 C 語(yǔ)言函數(shù)層級(jí)相對(duì)應(yīng)的模塊或?qū)嶓w層級(jí)。
Vitis HLS 會(huì)將子函數(shù)根據(jù)需要自動(dòng)內(nèi)聯(lián)到更高層次的函數(shù)中或者內(nèi)聯(lián)到頂層函數(shù)中,以提升性能。
您可通過(guò)在解決方案中向子函數(shù)指定 INLINE 編譯指示,或者使用 set_directive_inline 并將其設(shè)置為OFF 來(lái)禁用自動(dòng)內(nèi)聯(lián)。
默認(rèn)情況下,C 語(yǔ)言子函數(shù)的每次調(diào)用使用的 RTL 模塊的實(shí)例是相同的。但您可以通過(guò)在解決方案中指定ALLOCATION 編譯指示或者使用 set_directive_allocation 來(lái)實(shí)現(xiàn)多個(gè) RTL 模塊實(shí)例以提升性能。
3控制邏輯抽取可創(chuàng)建有限狀態(tài)機(jī)(FSM),根據(jù)定義的調(diào)度按順序執(zhí)行 RTL 設(shè)計(jì)中的運(yùn)算。
Vitis HLS 工具將不會(huì)展開循環(huán),除非這樣能夠提升解決方案性能,如展開嵌套的循環(huán)以對(duì)頂層函數(shù)進(jìn)行流水打拍。收起循環(huán)時(shí),綜合會(huì)為循環(huán)的單次迭代創(chuàng)建邏輯,RTL 設(shè)計(jì)會(huì)為序列中循環(huán)的每次迭代都執(zhí)行此邏輯。展開循環(huán)允許循環(huán)的部分或全部迭代并行發(fā)生,但也會(huì)耗用更多器件資源。
您可以使用 UNROLL 編譯指示或 set_directive_unroll 命令來(lái)手動(dòng)展開循環(huán)。
循環(huán)還可通過(guò)如下任一方法進(jìn)行流水打拍:通過(guò)有限狀態(tài)機(jī)高精度實(shí)現(xiàn)(循環(huán)流水打拍)或者采用基于較低精度的握手的實(shí)現(xiàn)(數(shù)據(jù)流)。
4代碼中的陣列將綜合到最終 FPGA 設(shè)計(jì)中的塊 RAM (BRAM)、LUT RAM 或 UltraRAM 中。
如果陣列位于頂層函數(shù)接口上,那么高層次綜合可將此陣列作為端口來(lái)實(shí)現(xiàn),以便訪問(wèn)設(shè)計(jì)外部的塊 RAM。
您可使用 ARRAY_PARTITION 或 ARRAY_RESHAPE 編譯指示或者關(guān)聯(lián)的 set_directive_array 命令更改。
綜合后,您可以對(duì)先前生成的各項(xiàng)報(bào)告中的結(jié)果進(jìn)行分析,以確定結(jié)果質(zhì)量。分析結(jié)果后,您可以為工程創(chuàng)建其它解決方案,指定不同的約束和最優(yōu)化指令,并對(duì)這些結(jié)果進(jìn)行綜合與分析。您可對(duì)不同解決方案的結(jié)果進(jìn)行比較,查看哪些有效,哪些無(wú)效。您可重復(fù)此過(guò)程,直至設(shè)計(jì)達(dá)成所期望的性能特性為止。您可使用多種解決方案持續(xù)進(jìn)行開發(fā),同時(shí)仍可保留先前的解決方案。
原文標(biāo)題:Vitis 高層次綜合用戶指南
文章出處:【微信公眾號(hào):Xilinx賽靈思官微】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
賽靈思
+關(guān)注
關(guān)注
33文章
1798瀏覽量
133677 -
C語(yǔ)言
+關(guān)注
關(guān)注
183文章
7646瀏覽量
146196 -
Vitis
+關(guān)注
關(guān)注
0文章
158瀏覽量
8433
原文標(biāo)題:Vitis 高層次綜合用戶指南
文章出處:【微信號(hào):賽靈思,微信公眾號(hào):Xilinx賽靈思官微】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何使用AMD Vitis HLS創(chuàng)建HLS IP
使用AMD Vitis Unified IDE創(chuàng)建HLS組件
如何在Unified IDE中創(chuàng)建視覺(jué)庫(kù)HLS組件
FPGA高層次綜合HLS之Vitis HLS知識(shí)庫(kù)簡(jiǎn)析
使用Vitis HLS創(chuàng)建屬于自己的IP相關(guān)資料分享
Vivado HLS和Vitis HLS 兩者之間有什么區(qū)別
基于Vitis HLS的加速圖像處理
Vitis HLS如何添加HLS導(dǎo)出的.xo文件
Vitis HLS前端現(xiàn)已全面開源
Vitis HLS知識(shí)庫(kù)總結(jié)
理解Vitis HLS默認(rèn)行為
HLS最全知識(shí)庫(kù)
AMD全新Vitis HLS資源現(xiàn)已推出
如何在Vitis HLS GUI中使用庫(kù)函數(shù)?
Vitis HLS工具簡(jiǎn)介及設(shè)計(jì)流程
評(píng)論