国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于DPI-C的脈動(dòng)陣列模塊驗(yàn)證平臺(tái)

2023-07-06 12:42:24鑫,陳
關(guān)鍵詞:浮點(diǎn)數(shù)參考模型代碼

王 鑫,陳 博

(江南大學(xué) 物聯(lián)網(wǎng)工程學(xué)院,江蘇 無錫 214122)

0 引言

人工智能(AI,artificial intelligence)加速芯片[1]很大一部分的算法涉及到矩陣運(yùn)算,在矩陣運(yùn)算過程中,其中的數(shù)學(xué)算術(shù)包括乘法運(yùn)算,加法運(yùn)算。矩陣乘法是一種計(jì)算量很大的算術(shù)運(yùn)算,它被認(rèn)為是許多信號(hào)處理應(yīng)用的關(guān)鍵。同時(shí),隨著AI加速芯片的巨大進(jìn)步,邊緣計(jì)算[2]開始進(jìn)入人們的視野,邊緣設(shè)備功能也變得強(qiáng)大,AI向邊緣的移動(dòng)更是一種必然。研發(fā)人員在開發(fā)AI芯片時(shí)需要設(shè)計(jì)并實(shí)現(xiàn)有關(guān)AI算法單元,對(duì)于AI算法而言主要進(jìn)行的數(shù)學(xué)運(yùn)算是卷積操作。在硬件上經(jīng)常使用到的卷積硬件結(jié)構(gòu)有加法樹、Eyeriss和脈動(dòng)陣列,其中的脈動(dòng)陣列就常常應(yīng)用于AI加速芯片領(lǐng)域之中[3]。

在芯片設(shè)計(jì)人員設(shè)計(jì)并實(shí)現(xiàn)芯片內(nèi)部模塊時(shí),后續(xù)的驗(yàn)證工作也是不可忽略的,設(shè)計(jì)的模塊只有經(jīng)過了驗(yàn)證人員的全面驗(yàn)證,排查一切可能出錯(cuò)的點(diǎn)并加以改正之后,才可以讓它應(yīng)用于芯片中,否則在后續(xù)流片時(shí)可能會(huì)出現(xiàn)致命的錯(cuò)誤,從而導(dǎo)致之前的努力和投入的金錢都付之一炬。對(duì)脈動(dòng)陣列模塊進(jìn)行驗(yàn)證時(shí),其參考模型在整個(gè)驗(yàn)證平臺(tái)的實(shí)現(xiàn)中較為繁瑣和耗時(shí),主要原因出現(xiàn)在浮點(diǎn)數(shù)乘加運(yùn)算。為了解決這一問題并鑒于C/C++等高級(jí)語言可以更加方便的實(shí)現(xiàn)激勵(lì)讀取、參考模型構(gòu)建等功能,本文采用C語言來輔助完成參考模型的編寫。本文的驗(yàn)證環(huán)境使用UVM(universal verification methodology)[4-5]來搭建,利用SystemVerilog的DPI[6-8]技術(shù)將C 代碼與驗(yàn)證環(huán)境連接起來,有效地提高驗(yàn)證效率,實(shí)現(xiàn)驗(yàn)證平臺(tái)的重用。

1 所驗(yàn)脈動(dòng)陣列結(jié)構(gòu)

脈動(dòng)陣列(systolic array)的架構(gòu)是簡單的、有規(guī)律的、模塊化的和并發(fā)的,它可以有效計(jì)算矩陣-向量相乘或者矩陣-矩陣相乘[9-11],它是一種應(yīng)用在片上多處理器的體系結(jié)構(gòu)。在這一節(jié)中,主要簡單列舉兩個(gè)矩陣相乘的具體計(jì)算過程從而引出脈動(dòng)陣列,并介紹本文中所使用脈動(dòng)陣列的具體結(jié)構(gòu)。

1.1 基本矩陣運(yùn)算及PE單元

給出兩個(gè)2×2階的A矩陣和B矩陣,兩矩陣相乘如式(1)所示。C矩陣由A、B矩陣相乘得出,其元素的具體計(jì)算過程如式(2)所示:

圖1為A、B矩陣相乘得出C矩陣的空間表示法,呈正方體結(jié)構(gòu)。每個(gè)節(jié)點(diǎn)上執(zhí)行乘加運(yùn)算,在脈動(dòng)陣列的體系結(jié)構(gòu)中這些節(jié)點(diǎn)稱為處理元素(PEs,processing elements)。在圖1中可以看出A矩陣中的元素都是從正面進(jìn)入,B矩陣的元素是從左側(cè)面進(jìn)入,C矩陣元素從正方體上方得出。其中A矩陣的單個(gè)元素經(jīng)過一個(gè)處理元素運(yùn)算后,并不會(huì)即刻消失,而是繼續(xù)與走向下一個(gè)處理元素,同理B矩陣的元素也是以這種方式進(jìn)行運(yùn)動(dòng)。從圖中可以看出,整個(gè)矩陣的運(yùn)算是從正方體的底面開始,在頂面結(jié)束,正方體的每一面的每一個(gè)橫邊所表示的是A、B矩陣內(nèi)的元素,而豎邊所表示的是中間運(yùn)算結(jié)果,可以看出底面的4個(gè)處理單元經(jīng)過計(jì)算得出結(jié)果后,各自把得到的結(jié)果發(fā)射到上面的處理元素作為被加數(shù)。經(jīng)過這種空間表示法可以形象地解釋矩陣相乘其實(shí)是以向量的形式進(jìn)行運(yùn)算,同時(shí)又把向量拆分至元素,從而更加形象地描述了矩陣運(yùn)算過程。

圖1 A×B矩陣的空間表示法

A、B矩陣在陣列中的運(yùn)算方式以及矩陣元素在PE中的運(yùn)算過程如圖2所示。在圖2中,左圖可以看出A、B矩陣內(nèi)的元素是以西、北方向進(jìn)入陣列中進(jìn)行運(yùn)算,輸出結(jié)果在南方;右圖是C矩陣中的元素在PE單元中具體運(yùn)算過程剖析圖,其中的橢圓表示一個(gè)PE單元。

圖2 二維陣列和PE單元運(yùn)算過程

在圖2中,B矩陣以列向量的形式送進(jìn)陣列中,4個(gè)元素分布在對(duì)應(yīng)的位置,如圖2左圖中的左上角是b0,0,右下角是b1,1,A矩陣則以行向量的形式進(jìn)入陣列與排布好的B矩陣進(jìn)行運(yùn)算。我們可以看出A矩陣的行向量進(jìn)入陣列后,它在未完全涉及所有陣列之前,并不會(huì)發(fā)生變化,例如a0,0元素在向右游走時(shí),是貫穿兩個(gè)PE單元后變?yōu)闊o效,這樣才能保證A矩陣的行向量與B矩陣的列向量進(jìn)行運(yùn)算,A、B矩陣完成了標(biāo)準(zhǔn)的矩陣運(yùn)算。

1.2 脈動(dòng)陣列內(nèi)部結(jié)構(gòu)

脈動(dòng)陣列是由多個(gè)PE單元編排而成。本文中的待測(cè)設(shè)計(jì)(DUT,design under test)是由32×32個(gè)PE 單元組成的脈動(dòng)陣列,其二維空間分布如圖3所示,呈正方形結(jié)構(gòu)。此陣列把每列的32個(gè)PE單元?jiǎng)澐譃橐粋€(gè)DOT(vector dot product unit),每一個(gè)DOT 運(yùn)算后會(huì)產(chǎn)生1個(gè)運(yùn)算結(jié)果作為新矩陣的元素。

圖3 脈動(dòng)陣列內(nèi)部結(jié)構(gòu)

劃分后的DOT 是執(zhí)行一次矩陣乘運(yùn)算中一個(gè)矩陣的行向量乘一個(gè)矩陣的列向量的運(yùn)算操作。選擇的行向量會(huì)不斷的向右方向進(jìn)行延續(xù)并與下一個(gè)列向量進(jìn)行運(yùn)算,即一個(gè)行向量需要游歷32個(gè)DOT 后才會(huì)失效,此時(shí)下一個(gè)行向量便會(huì)進(jìn)入。脈動(dòng)陣列中參與運(yùn)算的數(shù)都是浮點(diǎn)數(shù),經(jīng)過脈動(dòng)陣列運(yùn)算之后,最終會(huì)形成一個(gè)由32個(gè)浮點(diǎn)數(shù)所組成的向量,每經(jīng)過32 次運(yùn)算就會(huì)組成一個(gè)32×32 矩陣。1.3小節(jié)詳細(xì)地描述了矩陣是如何在脈動(dòng)陣列中進(jìn)行運(yùn)算的。

1.3 矩陣送入脈動(dòng)陣列進(jìn)行運(yùn)算

在脈動(dòng)陣列中,實(shí)現(xiàn)32×32矩陣運(yùn)算分為以下步驟:

1)先將一個(gè)n=32的B矩陣分成32個(gè)列向量送入脈動(dòng)陣列中的每一個(gè)DOT,等待另一個(gè)行向量a的進(jìn)入,a向量與每一個(gè)DOT 進(jìn)行運(yùn)算。經(jīng)過32個(gè)DOT 的運(yùn)算之后可以得到新向量。

2)每產(chǎn)生32次新的a向量并與之前在脈動(dòng)陣列中排布好的B矩陣相乘,便可以得到C矩陣。

3)在完成一次C矩陣的計(jì)算后,開始更換新的B矩陣與新的a向量,這樣經(jīng)過再一次的運(yùn)算便形成新的C矩陣。

在每個(gè)DOT 中,每個(gè)PE 單元同時(shí)進(jìn)行乘加運(yùn)算。每兩個(gè)相鄰的積相加,參與一次加法的積不可以與另一個(gè)相鄰的數(shù)進(jìn)行相加。得出的和再一次跟另一個(gè)和進(jìn)行相加,逐步重復(fù)下去,便形成加法樹的形式。其運(yùn)算過程如圖4表示。

圖4 單個(gè)DOT 結(jié)果運(yùn)算輸出過程

2 基于DPI-C的驗(yàn)證方案

驗(yàn)證人員在正常情況下,可以利用SystemVerilog直接完成參考模型的編寫,但是在一定情況下,利用C/C++是唯一解決參考模型編寫問題的途徑。例如,當(dāng)遇到復(fù)雜的函數(shù)、SystemVerilog中不存在的、復(fù)雜的數(shù)據(jù)類型時(shí),便可以使用C/C++來輔助完成驗(yàn)證環(huán)境的搭建,這樣既快捷又高效。對(duì)于脈動(dòng)陣列中的浮點(diǎn)數(shù)運(yùn)算,主要是利用C程序進(jìn)行建模,之后通過DPI技術(shù)把C 代碼放進(jìn)驗(yàn)證平臺(tái)所需的位置來輔助完成脈動(dòng)陣列的驗(yàn)證。

2.1 直接編程接口

DPI-C利用了SystemVerilog的直接編程接口連接C 編程語言,實(shí)現(xiàn)了SystemVerilog 和C 語言之間的數(shù)據(jù)通信[12]。一旦聲明或者使用了import語言 “導(dǎo)入”了一個(gè)子程序,就可以像調(diào)用SystemVerilog中的子程序一樣去調(diào)用它,使用起來非常方便。通過較為高級(jí)的編程語言實(shí)現(xiàn)復(fù)雜模型比使用HDL語言要輕便很多,并且仿真速度也比較快。比如,在C 語言中,它已經(jīng)提供了很多庫函數(shù),直接調(diào)用即可,無需重新編寫。這樣既保證了激勵(lì)編寫的正確性,又提高了可重用性。同時(shí)C 語言目標(biāo)代碼的執(zhí)行速度比HDL仿真速度至少要提高一個(gè)數(shù)量級(jí)。在本文中通過DPI技術(shù)實(shí)現(xiàn)C代碼的更高層次的復(fù)用。

在對(duì)特殊的DUT 進(jìn)行驗(yàn)證時(shí),采用直接編程接口也可以很便利地把C 代碼與UVM 驗(yàn)證環(huán)境連接起來,按照下面4個(gè)步驟進(jìn)行。

1)編寫C代碼,實(shí)現(xiàn)所需算法。在編寫C 代碼時(shí),需要聲明包含頭文件svdpi.h,是因?yàn)樵趕vdpi.h 中包含了SystemVerilog DPI結(jié)構(gòu)和方法的定義。

2)完成C 與SystemVerilog的通信。在UVM 驗(yàn)證平臺(tái)中,通過導(dǎo)入函數(shù)或者任務(wù)的方式來調(diào)用C 代碼,DPI也允許在C代碼中通過導(dǎo)出函數(shù)和任務(wù)來調(diào)用SystemVerilog中的方法。

3)匹配數(shù)據(jù)類型映射。由于SystemVerilog與C 語言數(shù)據(jù)類型差異較大,SystemVerilog中定義了通過DPI傳遞的每個(gè)數(shù)據(jù)類型的匹配模式。需要注意的是,DPI并不會(huì)檢查數(shù)據(jù)類型的兼容性,需要使用者自己保證數(shù)據(jù)匹配的正確性。

4)利用仿真工具編譯C程序的方法,生成最終的目標(biāo)碼,并與SystemVerilog混合運(yùn)行。

2.2 非標(biāo)準(zhǔn)化的浮點(diǎn)數(shù)

IEEE二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)(IEEE754)是20 世紀(jì)80年代以來最廣泛使用的浮點(diǎn)數(shù)運(yùn)算標(biāo)準(zhǔn)[13],許多CPU以及浮點(diǎn)運(yùn)算器都采用了這一標(biāo)準(zhǔn)。一個(gè)浮點(diǎn)數(shù)的表示方法可以為:

其中:sign為符號(hào)位,exponent為指數(shù)位,fraction為小數(shù)位。對(duì)于指數(shù)位而言,它實(shí)際上是指數(shù)的實(shí)際值加上某個(gè)固定值,這個(gè)固定值在IEEE754標(biāo)準(zhǔn)中被稱為偏置并規(guī)定該值為127,即2e-1-1,e取數(shù)字8。這里需要注意的是,IEEE754標(biāo)準(zhǔn)中存在3個(gè)特殊值:

1)如果指數(shù)位是0,并且小數(shù)位為0,那么這個(gè)數(shù)是±0(和符號(hào)位相關(guān))。

2)如果指數(shù)位是255(2e-1),并且小數(shù)位為0,那么這個(gè)數(shù)是±∞(和符號(hào)位相關(guān))。

3)如果指數(shù)位是255(2e-1),并且小數(shù)位不為0,那么這個(gè)數(shù)表示不為一個(gè)數(shù)(NaN)。

常見的浮點(diǎn)數(shù)有:半精度浮點(diǎn)數(shù)(16bit)、單精度浮點(diǎn)數(shù)(32bit)、雙精度浮點(diǎn)數(shù)(64bit)。在本文中的脈動(dòng)陣列所運(yùn)算的浮點(diǎn)數(shù)是半精度浮點(diǎn)數(shù)和單精度浮點(diǎn)數(shù),其中單精度浮點(diǎn)數(shù)是定制的,即在IEEE754標(biāo)準(zhǔn)的基礎(chǔ)上進(jìn)行了修改,把標(biāo)準(zhǔn)中特殊值NaN更改為無窮大或無窮?。ê头?hào)位相關(guān))。

2.3 參考模型的編寫

參考模型用于完成和DUT 相同的功能,其輸出用于與DUT 的輸出相比較。根據(jù)脈動(dòng)陣列內(nèi)部體系結(jié)構(gòu)以及定制化的浮點(diǎn)數(shù)算術(shù)運(yùn)算規(guī)則,設(shè)計(jì)并完成驗(yàn)證平臺(tái)中的參考模型?;诿}動(dòng)陣列運(yùn)算要求,需要實(shí)現(xiàn)乘法和加法的模型建設(shè)。

乘法模型使兩個(gè)16位半精度浮點(diǎn)數(shù)相乘能夠得到一個(gè)32位的單精度浮點(diǎn)數(shù);加法模型是為了實(shí)現(xiàn)32位單精度浮點(diǎn)數(shù)相加的功能。在模型搭建之前就需要引入利用C 語言寫好的乘加運(yùn)算模型,把它們當(dāng)作函數(shù)來使用。

對(duì)于在參考模型中所使用的乘法和加法函數(shù)而言,在函數(shù)形式上這兩個(gè)函數(shù)后面都有3個(gè)參數(shù),第一個(gè)參數(shù)表示結(jié)果輸出,第二和第三個(gè)參數(shù)都表示輸入。因?yàn)槌朔ㄆ鲗?shí)現(xiàn)的是兩個(gè)半精度浮點(diǎn)數(shù)乘法運(yùn)算,因此兩個(gè)輸入都是16bit,其輸出結(jié)果就變成了32bit的單精度浮點(diǎn)數(shù)。加法器的兩個(gè)輸入是乘法器的輸出,即都是32bit。在對(duì)加法樹進(jìn)行建模時(shí)需要用到加法器。

由于在設(shè)計(jì)并考慮到對(duì)脈動(dòng)陣列進(jìn)行建模時(shí)整個(gè)代碼頁太多,我們?cè)诰帉憛⒖寄P蜁r(shí),使用了extern virtual task關(guān)鍵字。其中的extern是為了控制class的長度,如果在class中想使用一些函數(shù)或者任務(wù),用這個(gè)關(guān)鍵字就可以另起一頁代碼去編寫代碼行較長的函數(shù)或者任務(wù),這樣就可以避免一頁代碼行過多;virtual就是簡單的虛函數(shù)功能;task是簡單的任務(wù)關(guān)鍵字。這樣只需要在新的代碼頁中編寫有關(guān)脈動(dòng)陣列的模型代碼即可。

參考模型的編寫思路如下:

首先是實(shí)現(xiàn)一個(gè)DOT 中的乘法運(yùn)算,并把運(yùn)算結(jié)果寄存到一個(gè)數(shù)組中,這種數(shù)組需要聲明32個(gè),數(shù)組的位寬為32bit。完成一個(gè)DOT 中的乘法運(yùn)算后,便是開始建立加法樹模型,從而得出最終結(jié)果。經(jīng)過上文的介紹后,我們可以得知,加法樹的底部是由32個(gè)乘法運(yùn)算結(jié)果而組成的,而這些結(jié)果已經(jīng)存入了所聲明的數(shù)組中。從數(shù)組中取出這32個(gè)乘法運(yùn)算結(jié)果并作為加法器的輸入,按照兩兩結(jié)合的方式進(jìn)行相加,其過程如1.3小節(jié)中所描述的一致,此時(shí)所需要的加法器數(shù)量為16個(gè)。經(jīng)過相加后便可以得出16個(gè)數(shù)據(jù),這16個(gè)數(shù)據(jù)會(huì)存入到新聲明的數(shù)組中去,然后從新聲明的數(shù)組中取出數(shù)據(jù),繼續(xù)兩兩相加,這時(shí)候會(huì)比上次減少8個(gè)加法器,以此類推,最終會(huì)得到一個(gè)輸入結(jié)果,即一個(gè)DOT 的輸出,最終使用了32 個(gè)乘法器,31 個(gè)加法器。

其次,由于脈動(dòng)陣列中劃分了32個(gè)DOT,因此只需要在上述步驟情況下,利用一個(gè)for循環(huán)即可實(shí)現(xiàn)整個(gè)脈動(dòng)陣列的運(yùn)算過程。經(jīng)過運(yùn)算后,32個(gè)DOT 會(huì)產(chǎn)生32個(gè)運(yùn)算結(jié)果,這些運(yùn)算結(jié)果也會(huì)根據(jù)DOT 的排列順序而進(jìn)行排序,從而組成一個(gè)向量。例如,處于脈動(dòng)陣列中最左邊的DOT,那么它產(chǎn)生的結(jié)果就會(huì)在結(jié)果向量的第一個(gè)位置,同理,其它DOT 產(chǎn)生的結(jié)果就會(huì)在結(jié)果向量中相對(duì)應(yīng)的位置,這一功能只需要利用移位便可以實(shí)現(xiàn)。具體的實(shí)現(xiàn)過程是,每得到一個(gè)32bit的數(shù)據(jù)時(shí),都把它排在向量的最左端,然后把它和向量的高992 位進(jìn)行組合,利用System-Verilog中的{},以此往復(fù)32次。

上述的步驟就可以實(shí)現(xiàn)脈動(dòng)陣列的模型建立,高效且簡潔明了,對(duì)于其他人而言也方便理解。如果存在相似結(jié)構(gòu)的脈動(dòng)陣列,此模型也可以直接進(jìn)行移植使用,達(dá)到復(fù)用的效果。

3 UVM 驗(yàn)證結(jié)構(gòu)

使用DPI可以很方便地連接C 代碼,這些C 代碼可以讀取激勵(lì)、包含一個(gè)參考模型或僅僅擴(kuò)展SystemVerilog的功能。此外,驗(yàn)證平臺(tái)還使用到了UVM,它是由Cadence、Mentor和Synopsys聯(lián)合推出的新一代驗(yàn)證方法學(xué)。

3.1 關(guān)于UVM

UVM 主要是一個(gè)以SystemVerilog語言為基礎(chǔ)的一個(gè)庫。因?yàn)閁VM 具有層次化的結(jié)構(gòu)、可隨機(jī)化的激勵(lì)、可高度復(fù)用的驗(yàn)證平臺(tái)等優(yōu)點(diǎn)廣泛應(yīng)用于數(shù)字集成電路(IC,integrated circuit)的驗(yàn)證過程之中[14-15]。驗(yàn)證平臺(tái)因?yàn)槭褂昧薙ystemVerilog這一面向?qū)ο笳Z言來構(gòu)建,所以UVM也繼承這一特點(diǎn)。在UVM 中,是通過樹形結(jié)構(gòu)來管理各個(gè)類,各個(gè)類是派生于uvm _object或者uvm _component[16],而UVM 中常用類的繼承關(guān)系如圖5所示。這些通用驗(yàn)證部件不僅具有可配置性、封裝性、可重用等優(yōu)點(diǎn)而且還具有phase自動(dòng)執(zhí)行特性。Phase是將component分割成幾個(gè)不同的執(zhí)行階段并且按照一定的先后順序來執(zhí)行。Phase的引入,在很大程度上避免了由代碼書寫不規(guī)范而引發(fā)的問題。Phase中最常用的由build_phase、connect_phase、run_phase等。在3.2和3.3小節(jié)中,詳細(xì)講述了本實(shí)驗(yàn)的驗(yàn)證平臺(tái)結(jié)構(gòu)。

圖5 UVM 中常用類的繼承關(guān)系

3.2 UVM 驗(yàn)證平臺(tái)組件

UVM 中各個(gè)組件有著不同的功能,包括產(chǎn)生激勵(lì)、發(fā)送激勵(lì)、采集信號(hào)、模擬待驗(yàn)?zāi)K以及輸出接口數(shù)據(jù)對(duì)比等?;诒疚拿}動(dòng)陣列的結(jié)構(gòu),其驗(yàn)證平臺(tái)采用UVM 組件進(jìn)行設(shè)計(jì),具體各個(gè)組件的名稱及其功能見表1。這些組件的繼承關(guān)系會(huì)在1.3小節(jié)中進(jìn)行描述。

表1 驗(yàn)證平臺(tái)組件及其功能

3.3 驗(yàn)證平臺(tái)內(nèi)部通信

當(dāng)設(shè)計(jì)一個(gè)基于UVM 的驗(yàn)證平臺(tái)時(shí),需要完成各個(gè)組件的代碼編寫,其次把編寫好的各個(gè)組件進(jìn)行實(shí)例化并利用事務(wù)級(jí)建模(TLM,transaction level modeling)[17-18]方法進(jìn)行組件之間的通信。其組件之間具體的通信以及驗(yàn)證平臺(tái)部分功能實(shí)現(xiàn)過程:

1)首先是輸入階段,在Transaction中聲明受約束的激勵(lì),激勵(lì)通過Sequence發(fā)送給Driver,之后再由Driver發(fā)送給接口,此時(shí)Monitor對(duì)輸入接口進(jìn)行監(jiān)測(cè),并把監(jiān)測(cè)結(jié)果傳送給Reference Model,這一步便完成了驗(yàn)證平臺(tái)的輸入數(shù)據(jù)包發(fā)送過程以及脈動(dòng)陣列的激勵(lì)產(chǎn)生。

2)輸入階段完成后,脈動(dòng)陣列和Reference Model便會(huì)產(chǎn)生各自的輸出。脈動(dòng)陣列的輸出結(jié)果也是由Monitor進(jìn)行監(jiān)測(cè)脈動(dòng)陣列輸出接口上的數(shù)據(jù)得到的。Reference Model的輸出結(jié)果和脈動(dòng)陣列的輸出結(jié)果會(huì)各自寫入預(yù)置好的FIFO(先入先出,first input first output)中,在Scoreboard會(huì)把兩個(gè)FIFO 中的數(shù)據(jù)進(jìn)行讀取并進(jìn)行對(duì)比,這一階段便完成了輸出階段。

3)由于一些信號(hào)在時(shí)序上需要滿足特定的情況,采用在Interface 中添加斷言的方式去保證信號(hào)時(shí)序符合要求[19-20]。

根據(jù)3.1小節(jié)圖5中UVM 類的繼承關(guān)系、3.2小節(jié)表1中的驗(yàn)證平臺(tái)組件以及上述的內(nèi)部通信過程,本文設(shè)計(jì)的驗(yàn)證平臺(tái)框架如圖6所示。每個(gè)組件名字下面括號(hào)內(nèi)的標(biāo)簽就是其父類,例如Driver繼承于uvm_driver,Reference mode繼承與uvm_component,其他組件同理。

圖6 基于UVM 的驗(yàn)證框架

4 實(shí)驗(yàn)結(jié)果與分析

本節(jié)介紹在完成脈動(dòng)陣列的驗(yàn)證平臺(tái)搭建后,DUT 和參考模型的輸出結(jié)果在Scoreboard中進(jìn)行對(duì)比的過程,并對(duì)比對(duì)結(jié)果進(jìn)行分析。

4.1 結(jié)果對(duì)比過程

激勵(lì)經(jīng)過輸入給脈動(dòng)陣列和參考模型后,脈動(dòng)陣列以及參考模型會(huì)把各自的輸出結(jié)果送進(jìn)預(yù)先定義好且不同的FIFO 中。把脈動(dòng)陣列的輸出結(jié)果定義為actual放進(jìn)一個(gè)FIFO 中,參考模型的輸出結(jié)果定義為expect放進(jìn)一個(gè)FIFO 中,之后分別從兩個(gè)FIFO 中取數(shù)據(jù)來進(jìn)行比對(duì)。

在出現(xiàn)錯(cuò)誤的時(shí)候,先記錄下actual與expect,定位所發(fā)送出現(xiàn)對(duì)比錯(cuò)誤的數(shù)據(jù)并記錄下來。找到目標(biāo)數(shù)據(jù)后,根據(jù)設(shè)定的浮點(diǎn)數(shù)算術(shù)運(yùn)算標(biāo)準(zhǔn)進(jìn)行人工計(jì)算,把人工計(jì)算結(jié)果分別與脈動(dòng)陣列和參考模型輸出的結(jié)果進(jìn)行對(duì)比,然后以此來分析錯(cuò)誤原因并修正錯(cuò)誤。修正錯(cuò)誤后,把記錄下的數(shù)據(jù)以定向激勵(lì)的形式再一次發(fā)送給驗(yàn)證平臺(tái),若此時(shí)輸出為正確結(jié)果,則繼續(xù)進(jìn)行驗(yàn)證,否則重復(fù)上述工作。

4.2 驗(yàn)證結(jié)果分析

在本次測(cè)試用例中,給出一個(gè)隨機(jī)種子,其中有1 000個(gè)受約束的隨機(jī)數(shù)據(jù)。在所給的隨機(jī)數(shù)據(jù)中包括vain(A矩陣)、vbin(B矩陣)、ainvld(A矩陣有效信號(hào))、binvld(B矩陣有效信號(hào))。vain、vbin接口在測(cè)試的時(shí)候分為符號(hào)位、指數(shù)位、尾數(shù)位。把這三部分進(jìn)行隨機(jī)約束遍歷,進(jìn)行這一操作是為了實(shí)驗(yàn)后階段能夠收取較好的覆蓋率。隨機(jī)約束遍歷情況如表2所示。

表2 不同接口數(shù)據(jù)遍歷情況

在實(shí)驗(yàn)測(cè)試用例里的隨機(jī)數(shù)據(jù)包全部使用完之后,需要查看FIFO 中是否還有殘留的未發(fā)送的隨機(jī)數(shù)據(jù)包。在實(shí)驗(yàn)中,經(jīng)過多次隨機(jī)種子后,其FIFO 中的殘余數(shù)據(jù)結(jié)果如表3。

表3 各個(gè)FIFO 內(nèi)數(shù)據(jù)情況

運(yùn)行不同的測(cè)試用例的仿真或者不同的種子都會(huì)生成專屬的覆蓋率數(shù)據(jù)。經(jīng)多次仿真且覆蓋率經(jīng)過合并后,根據(jù)覆蓋率情況證明達(dá)到了驗(yàn)收要求。表4所展示的是最終的總的覆蓋率結(jié)果,每個(gè)覆蓋組代表著脈動(dòng)陣列中的一個(gè)功能點(diǎn)。

表4 功能覆蓋率結(jié)果

5 結(jié)束語

本文利用DPI-C 技術(shù)與UVM 相結(jié)合的方法搭建一個(gè)脈動(dòng)陣列的驗(yàn)證環(huán)境。該驗(yàn)證環(huán)境利用了SystemVerilog事務(wù)處理能力強(qiáng)大的優(yōu)點(diǎn)以及C 實(shí)現(xiàn)模型成熟、穩(wěn)定、重用性高的優(yōu)點(diǎn),相對(duì)于傳統(tǒng)的驗(yàn)證方法,平臺(tái)結(jié)構(gòu)較為簡單,可以快速搭建參考模型。本文實(shí)驗(yàn)通過運(yùn)用覆蓋率驅(qū)動(dòng)策略,將驗(yàn)證進(jìn)度進(jìn)行量化,最終達(dá)到功能覆蓋率100%的驗(yàn)證目標(biāo),提高了驗(yàn)證的完備性和準(zhǔn)確性。另外,本文的驗(yàn)證方案不僅能夠?qū)崿F(xiàn)驗(yàn)證環(huán)境的復(fù)用,而且測(cè)試用例也能實(shí)現(xiàn)更高驗(yàn)證層次的復(fù)用,可以大幅縮短片上系統(tǒng)芯片的開發(fā)周期。

猜你喜歡
浮點(diǎn)數(shù)參考模型代碼
四種Python均勻浮點(diǎn)數(shù)生成方法
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
在C語言中雙精度浮點(diǎn)數(shù)線性化相等比較的研究
非精確浮點(diǎn)數(shù)乘法器設(shè)計(jì)
基于環(huán)境的軍事信息系統(tǒng)需求參考模型
語義網(wǎng)絡(luò)P2P參考模型的查詢過程構(gòu)建
基于參考模型的制造業(yè)MES需求建模
临泽县| 英吉沙县| 包头市| 松溪县| 兴城市| 加查县| 江门市| 高平市| 宜州市| 乌拉特后旗| 秦皇岛市| 万盛区| 阜平县| 南安市| 武威市| 吴江市| 龙口市| 叙永县| 固原市| 丰台区| 铁岭县| 广灵县| 滦南县| 区。| 盈江县| 鄯善县| 大埔县| 铜山县| 保亭| 扶风县| 当雄县| 义乌市| 锡林浩特市| 特克斯县| 英山县| 额敏县| 永泰县| 峡江县| 海林市| 高安市| 东安县|