使用Python功能驗(yàn)證Vitis HLS內(nèi)核
掃描二維碼
隨時(shí)隨地手機(jī)看文章
我們最近一直在研究的一件事是,在與Versal Devices合作時(shí),使用Vitis開(kāi)發(fā)解決方案。例如,請(qǐng)參閱我的項(xiàng)目在Vitis系統(tǒng)設(shè)計(jì)的Versal和使用芯片范圍調(diào)試Versal設(shè)計(jì)。
在這個(gè)項(xiàng)目中,我們將研究如何在AIE和HLS開(kāi)發(fā)中使用Vitis功能仿真。
但什么是功能模擬?在為通用設(shè)備開(kāi)發(fā)時(shí),我們通常有獨(dú)立的PL或AIE設(shè)計(jì),或者需要在組合設(shè)計(jì)中同時(shí)使用PL和AIE的異構(gòu)設(shè)計(jì)。
功能仿真使我們能夠在進(jìn)行循環(huán)精確仿真之前驗(yàn)證行為和驗(yàn)證設(shè)計(jì)的功能正確性(Vitis子系統(tǒng)仿真)。
以前,我們已經(jīng)能夠使用x86模擬器進(jìn)行AIE引擎開(kāi)發(fā),并使用C-Sim進(jìn)行HLS內(nèi)核功能仿真。然而,Vitis功能仿真為開(kāi)發(fā)人員提供了一系列新的更高層次的抽象框架,我們可以使用這些框架執(zhí)行功能仿真。
Vitis Functional Simulation,使開(kāi)發(fā)人員能夠使用Python或MATLAB單獨(dú)或組合地模擬HLS和AIE引擎。這種使用高級(jí)框架的能力可以加快開(kāi)發(fā)時(shí)間,并使功能驗(yàn)證與算法開(kāi)發(fā)時(shí)使用的語(yǔ)言保持一致。
Vitis功能仿真
當(dāng)使用Vitis功能仿真時(shí),我們?cè)谠O(shè)計(jì)中獲得了幾個(gè)好處,包括
?編譯HLS內(nèi)核或AIE引擎圖(如果需要)。
?能力模擬和調(diào)試,因?yàn)槲覀冋诮⒌脑O(shè)計(jì)。
?仿真性能顯著提高,使仿真運(yùn)行速度更快,因此能夠捕獲數(shù)百萬(wàn)個(gè)樣本來(lái)計(jì)算性能,例如信號(hào)噪聲等。
由于VFS支持MATLAB和Python框架,因此VFS需要能夠有效地處理Python或MATLAB原生不支持的一系列類型,例如bfloat16, mex9, float8。為了使VFS能夠使用變量來(lái)轉(zhuǎn)換MATLAB數(shù)組和Python Numpy數(shù)組,列表和元組。varray的工作方式類似于Python中的numpy數(shù)組或MATLAB中的數(shù)組,但將所有所需的數(shù)據(jù)類型放在一個(gè)保護(hù)傘下。
支持的數(shù)據(jù)類型,取決于所使用的框架和AIE、AIE- ml和AIE- mlv2的目標(biāo)設(shè)備,下表提供了一個(gè)很好的參考。
而對(duì)于HLS內(nèi)核,類型如下。
有兩種方法可以實(shí)例化AIE或HLS內(nèi)核對(duì)象。
?配置文件-定義構(gòu)建細(xì)節(jié),如果存在將使用的構(gòu)建。如果沒(méi)有一個(gè)將被編譯和使用。
?鍵值對(duì)——定義輸入文件、平臺(tái)和仿真參數(shù)。然后,這些將用于創(chuàng)建配置文件。
在這個(gè)項(xiàng)目中,我們將探索使用Python流來(lái)驗(yàn)證HLS設(shè)計(jì)。我們可以在通用設(shè)備上這樣做,但也可以在任何我們想要放置HLS IP核的設(shè)備上使用這種方法。
環(huán)境設(shè)置
要開(kāi)始使用VFS,我們需要在安裝了Vitis 2025.1的Linux機(jī)器上進(jìn)行開(kāi)發(fā)。
對(duì)于這個(gè)例子,我將使用我的一臺(tái)Linux開(kāi)發(fā)機(jī)器。
首先要做的是設(shè)置Vitis環(huán)境,這將允許我們的腳本根據(jù)需要調(diào)用Vitis。
在這個(gè)演示中,我將使用VSCode,因?yàn)樗情_(kāi)發(fā)python應(yīng)用程序的流行框架。因此,我使用集成終端。
建立了Vitis環(huán)境后,下一步是確保我們擁有所有必要的附加條件。在python中,我們唯一需要的VFS是NumPy。
如果您沒(méi)有,我們可以使用命令安裝它
請(qǐng)等待NumPy安裝完成。
為了檢查我們是否擁有我們需要的一切,我們可以在終端中啟動(dòng)python3,并檢查我們是否能夠?qū)氡匾膒ython
如果沒(méi)有問(wèn)題,我們就可以開(kāi)始創(chuàng)建測(cè)試應(yīng)用程序了。
測(cè)試應(yīng)用程序
對(duì)于這個(gè)模塊,我們將編寫一個(gè)簡(jiǎn)單的HLS模塊,它將兩個(gè)數(shù)字相加。
這將使用AXI流輸入,每個(gè)輸入最多可達(dá)64位,并將它們加在一起。
這段代碼定義了兩個(gè)實(shí)現(xiàn)流(FIFO通道)的輸入,它們攜帶64位無(wú)符號(hào)不帶小數(shù)位的定點(diǎn)數(shù)字。
結(jié)果創(chuàng)建一個(gè)流(FIFO通道),它也攜帶64位無(wú)符號(hào)定點(diǎn)數(shù)。
然后將這兩個(gè)輸入加在一起,以創(chuàng)建一個(gè)結(jié)果,該結(jié)果在編譯時(shí)采用該類型。
最后,將結(jié)果寫入輸出。
雖然簡(jiǎn)單,但這演示了我們?nèi)绾卧贖SL IP內(nèi)核上使用流接口。
VFS測(cè)試應(yīng)用
VFS測(cè)試應(yīng)用程序如下所示
讓我們來(lái)分析一下
我們要做的第一件事是正確設(shè)置python腳本中所需的模塊。
在這種情況下,我們將導(dǎo)入VFS模塊,使我們能夠支持Vitis功能仿真。該模塊將為腳本提供所有必要的函數(shù)來(lái)定義HLS內(nèi)核,檢查其輸入和輸出,當(dāng)然在模擬中運(yùn)行HSL內(nèi)核。
然后我們還需要導(dǎo)入數(shù)組類型,使我們能夠與HLS內(nèi)核共享數(shù)據(jù)。
要導(dǎo)入的最后一個(gè)模塊是numpy,它使我們能夠創(chuàng)建隨機(jī)數(shù)數(shù)組。
導(dǎo)入模塊后,下一步是創(chuàng)建HLS內(nèi)核對(duì)象,在此流程中,我使用鍵值對(duì)方法。在這種方法中,我們提供了HLS內(nèi)核的源代碼,所針對(duì)的部分板和要模擬的實(shí)際HLS函數(shù)的名稱。
下一步是設(shè)置我們希望生成的隨機(jī)樣本的數(shù)量。
然后還創(chuàng)建了兩個(gè)NumPy數(shù)組,其中包含0到63之間的隨機(jī)數(shù)。創(chuàng)建的隨機(jī)樣本的數(shù)量取決于前面定義的隨機(jī)樣本的數(shù)量。這使得測(cè)試平臺(tái)可以根據(jù)需要進(jìn)行縮放。
但是,我們需要將NumPy數(shù)組轉(zhuǎn)換為一種不同的格式,以便能夠?qū)㈦S機(jī)數(shù)應(yīng)用于HLS內(nèi)核。
我們使用va模塊數(shù)組類型,對(duì)于我們用來(lái)將NumPy數(shù)組轉(zhuǎn)換為無(wú)符號(hào)(0),64位寬(64)和0小數(shù)的固定類型的varray,因?yàn)槲覀兊哪繕?biāo)是HLS內(nèi)核中的ap_unit類型。
接下來(lái)的兩行報(bào)告HLS內(nèi)核上的輸入格式和輸出類型。
這應(yīng)該與我們期望的類型和寬度保持一致。
最后,內(nèi)核可以運(yùn)行,VFS的結(jié)果可以在輸出數(shù)組中捕獲。當(dāng)然,這將被格式化為一個(gè)數(shù)組。
然后我們可以顯示輸入值和輸出結(jié)果,當(dāng)然結(jié)果應(yīng)該是兩個(gè)輸入值的相加。
運(yùn)行模擬將顯示HLS內(nèi)核的編譯,因?yàn)闆](méi)有進(jìn)行預(yù)編譯。
編譯完成后,將加載hlkernel,并完成Vitis功能仿真。
總結(jié)
該項(xiàng)目展示了如何使用Python模擬Vitis HLS內(nèi)核,這為我們提供了一種非常靈活的方法,可以使用最流行的算法開(kāi)發(fā)框架之一來(lái)驗(yàn)證功能。
本文編譯自hackster.io





