王慧麗,郭 陽(yáng)
(國(guó)防科技大學(xué)計(jì)算機(jī)學(xué)院,湖南 長(zhǎng)沙,410073)
隨著基于集成電路硬件實(shí)現(xiàn)的深度學(xué)習(xí)算法在氣象預(yù)測(cè)、生物識(shí)別和人工智能等應(yīng)用中的迅速發(fā)展,集成電路硬件設(shè)計(jì)規(guī)模逐漸擴(kuò)大。作為處理器核心部件的指令流控單元,其設(shè)計(jì)復(fù)雜度日益增加,指令流控的驗(yàn)證難度隨之增大。在一個(gè)控制復(fù)雜的應(yīng)用場(chǎng)景中,指令流控錯(cuò)誤可能會(huì)付出非常慘痛的代價(jià)。因此,對(duì)指令流控的高效、完備、精確的驗(yàn)證,是微處理器設(shè)計(jì)及驗(yàn)證中必須攻克的重要難題。
硬件設(shè)計(jì)的驗(yàn)證方法主要有2種[1]:基于模擬的定向功能驗(yàn)證和基于隨機(jī)激勵(lì)的形式化驗(yàn)證?;谀M的定向驗(yàn)證一般采用人工編寫的方式,針對(duì)指定功能進(jìn)行測(cè)試激勵(lì),包括模塊級(jí)驗(yàn)證和系統(tǒng)級(jí)驗(yàn)證2種。定向功能驗(yàn)證方法的主觀依賴性較高,其驗(yàn)證的正確性、效率和完備性等與驗(yàn)證人員的經(jīng)驗(yàn)素質(zhì)密切相關(guān),并且由于定向功能驗(yàn)證往往針對(duì)特定模塊進(jìn)行人工編制,導(dǎo)致激勵(lì)可重用性不高[2,3]?;陔S機(jī)激勵(lì)的形式化驗(yàn)證能夠?qū)υO(shè)計(jì)進(jìn)行狀態(tài)遍歷,驗(yàn)證覆蓋率高,但是在復(fù)雜的控制系統(tǒng)中,隨著控制流程的增加,會(huì)出現(xiàn)狀態(tài)爆炸問(wèn)題。并且隨機(jī)激勵(lì)約束編寫要求驗(yàn)證人員具有很高的設(shè)計(jì)水平,否則可能會(huì)出現(xiàn)隨機(jī)激勵(lì)的驗(yàn)證盲區(qū),或者產(chǎn)生對(duì)驗(yàn)證功能點(diǎn)的重復(fù)覆蓋,進(jìn)而降低驗(yàn)證效率[4,5]。
基于參考模型的隨機(jī)驗(yàn)證方法介于傳統(tǒng)驗(yàn)證和形式化驗(yàn)證之間,該方法一般適用于數(shù)據(jù)密集型設(shè)計(jì)的模塊級(jí)驗(yàn)證(如DMA、Cache和運(yùn)算單元等)。對(duì)于控制復(fù)雜型的設(shè)計(jì)(如指令流控、中斷系統(tǒng)等),其與外部有復(fù)雜的協(xié)議,且內(nèi)部功能復(fù)雜,因此很難在模塊級(jí)生成隨機(jī)激勵(lì)并構(gòu)造參考模型,而是將其嵌入到整個(gè)DSP核系統(tǒng)級(jí)環(huán)境中,進(jìn)行基于參考模型(模擬器)的驗(yàn)證[6]。這種系統(tǒng)級(jí)的驗(yàn)證存在調(diào)試不便、無(wú)法大批量運(yùn)行和EDA軟件仿真速度慢等缺點(diǎn)。
無(wú)論采用哪種驗(yàn)證方法,驗(yàn)證的目標(biāo)都是達(dá)到較高的覆蓋率來(lái)保證驗(yàn)證的完備性和覆蓋的全面性。覆蓋率一般包括代碼覆蓋率、功能覆蓋率和斷言覆蓋率[7]。在覆蓋率驅(qū)動(dòng)的驗(yàn)證中,參考功能覆蓋率和代碼覆蓋率能夠快速評(píng)估當(dāng)前的設(shè)計(jì)和驗(yàn)證情況。如果出現(xiàn)2種覆蓋率不一致的情況時(shí),可能需要考慮設(shè)計(jì)是否合理,功能點(diǎn)提取是否準(zhǔn)確,是否需要形式化驗(yàn)證工具輔助進(jìn)行狀態(tài)遍歷等一系列問(wèn)題[8]。
本文以自主高性能GPDSP處理器FT-xDSP的指令流控部件為研究對(duì)象,通過(guò)對(duì)其邏輯進(jìn)行合理劃分簡(jiǎn)化了其與外部的協(xié)議,然后經(jīng)過(guò)一些侵入式驗(yàn)證設(shè)計(jì)方法處理之后,降低了在模塊級(jí)進(jìn)行隨機(jī)驗(yàn)證的難度。最終針對(duì)難以進(jìn)行定向模擬驗(yàn)證的功能點(diǎn),提出了一種基于指令重排參考模型的指令流控自動(dòng)驗(yàn)證方法。實(shí)驗(yàn)及實(shí)際驗(yàn)證的結(jié)果表明,該方法能夠發(fā)現(xiàn)隱藏的驗(yàn)證邊緣情況,并針對(duì)設(shè)計(jì)中的薄弱點(diǎn)進(jìn)行定向的隨機(jī)驗(yàn)證,從而大大提高指令流控的驗(yàn)證效率。
FT-xDSP是國(guó)防科技大學(xué)自主研發(fā)的高性能浮點(diǎn)向量DSP,采用了基于VLIW的標(biāo)量/向量協(xié)同架構(gòu),40/80位可變長(zhǎng)度指令集,單時(shí)鐘周期可并行發(fā)射1~11條指令[9]。FT-xDSP的指令流控部件主要包括一級(jí)程序Cache(L1P)、取指部件(PG,PW,IF三級(jí)流水線)、指令派發(fā)部件(DP)和流控指令處理部件(BR)。
圖1給出了其指令流水線結(jié)構(gòu)。其中,PG根據(jù)分支、中斷和順序自加地址生成指令包(512 bit對(duì)齊)請(qǐng)求地址;L1P向外部存儲(chǔ)獲取指令包并提供給取指部件和DP。DP對(duì)指令包進(jìn)行拼接和譯碼,將指令派發(fā)到對(duì)應(yīng)功能部件;BR處理流控指令,改變程序運(yùn)行的軌跡,分支指令SBR執(zhí)行程序的跳轉(zhuǎn),中斷返回指令SIERT控制程序在中斷程序執(zhí)行完畢后返回主程序;其他10個(gè)功能部件負(fù)責(zé)運(yùn)算或者訪存操作。
Figure 1 Instruction pipeline structure圖1 指令流水線結(jié)構(gòu)
FT-xDSP包按照512 bit對(duì)齊,指令在取指包中緊密排列。指令格式如圖2所示,其中并行位P表示下一條指令是否可以與當(dāng)前指令并行派發(fā),L標(biāo)記指令長(zhǎng)度為40位或80位,Type表示該指令所對(duì)應(yīng)的功能部件,Op為指令的其他操作碼。
Figure 2 Instruction format圖2 指令格式
單時(shí)鐘周期內(nèi)可并行發(fā)射的指令稱為一個(gè)執(zhí)行包(EP)。如圖3所示,EP0~EP2分別為連續(xù)的3個(gè)時(shí)鐘周期發(fā)射的執(zhí)行包,每個(gè)執(zhí)行包中可以包含多條緊密排列的80位指令或40位指令。
Figure 3 Execution package in the fetched package圖3 指令包中的執(zhí)行包
FT-xDSP中的程序執(zhí)行順序有3種:順序、分支跳轉(zhuǎn)和中斷響應(yīng),圖4為其所對(duì)應(yīng)的程序流示意圖,其中:
(1)圖4a為順序程序流,程序運(yùn)行軌跡為:EP1→EP2→EP3→…。
(2)圖4b為分支跳轉(zhuǎn)程序流:EP1中包含一條分支指令,經(jīng)過(guò)6個(gè)分支延遲槽后,程序跳轉(zhuǎn)到分支目標(biāo)地址(圖4b中示例為EP10)。程序運(yùn)行軌跡為:EP1→EP2→EP3→…→EP7→EP10→EP11→…。
(3)圖4c為中斷響應(yīng)程序流:程序執(zhí)行過(guò)程中發(fā)生了中斷事務(wù),當(dāng)前程序被中斷執(zhí)行并跳轉(zhuǎn)至中斷程序,直至中斷事務(wù)處理完畢后,再返回至原來(lái)程序被打斷的地方繼續(xù)執(zhí)行。程序運(yùn)行軌跡為:EP1→…→EP5→Int_EP1→…→Int_EPn→EP6→…。
Figure 4 Three kinds of program execution sequence圖4 3種程序流的執(zhí)行順序
指令流控部件驗(yàn)證的核心工作是驗(yàn)證用戶程序中的所有指令是否按照預(yù)定的程序流被正確地派發(fā)到相應(yīng)的功能部件中,而不需要驗(yàn)證一條非流控部件指令(如運(yùn)算指令、訪存指令等)是否可以被正確執(zhí)行。驗(yàn)證過(guò)程中難以用傳統(tǒng)模擬方式進(jìn)行驗(yàn)證的功能點(diǎn)主要有如下幾個(gè):
(1)協(xié)議驗(yàn)證:指令流水線中幾個(gè)控制功能部件之間存在著繁雜的通信協(xié)議,而在遇到分支與中斷時(shí),驗(yàn)證會(huì)變得很復(fù)雜,通過(guò)手工編寫測(cè)試激勵(lì)難以遍歷所有情況。
(3)程序流驗(yàn)證:分支跳轉(zhuǎn)程序流中,涉及到分支延遲槽的處理、分支延遲槽或者分支目標(biāo)執(zhí)行包跨邊界、分支延遲槽對(duì)中斷的抑制等情況;中斷響應(yīng)程序流中,當(dāng)前中斷地址保存、當(dāng)前流水線排空(Flush)和中斷返回地址處理等情況都是驗(yàn)證過(guò)程中的難點(diǎn),也是在DSP芯片單核設(shè)計(jì)中最容易出現(xiàn)設(shè)計(jì)缺陷的地方。尤其當(dāng)分支和中斷發(fā)生頻率較高,且存在大量跨邊界執(zhí)行包時(shí),驗(yàn)證工作更加艱難。
傳統(tǒng)模擬驗(yàn)證方法,通過(guò)手工匯編用戶程序,在用戶程序中加入分支、中斷等相關(guān)配置,構(gòu)造可以觸發(fā)相應(yīng)功能點(diǎn)的測(cè)試激勵(lì)程序(指令包)。激勵(lì)輸入到DUT中,最終輸出為測(cè)試激勵(lì)程序所預(yù)定的程序軌跡和對(duì)應(yīng)執(zhí)行包。
表 1所示為圖4b分支跳轉(zhuǎn)程序流的人工匯編程序示例。其中EP2中僅有1條指令,EP11則包含11條指令。程序運(yùn)行時(shí),指令被派發(fā)至功能部件的時(shí)間順序如表 2所示。此激勵(lì)可驗(yàn)證包括分支延遲槽計(jì)數(shù)、取指地址緩沖、各部件協(xié)議、指令包譯碼、跨邊界執(zhí)行包(如EP6,EP11)、PC值維護(hù)和指令并行度等硬件邏輯,而不需要關(guān)注其中每一條指令執(zhí)行結(jié)果是否正確。如果在分支延遲槽(EP2~EP7)中再插入分支指令構(gòu)造多層循環(huán)嵌套,或者期間發(fā)生中斷響應(yīng),匯編程序本身變得復(fù)雜的同時(shí),表 2中對(duì)程序正確派發(fā)順序的分析也非常耗時(shí)耗力,容易因繁瑣的細(xì)節(jié)而導(dǎo)致設(shè)計(jì)錯(cuò)誤未被及時(shí)發(fā)現(xiàn)。
Table 1 Example of a branch jump program
Table 2 Execution sequence of branch jump program
綜上所述,指令流控部件的自動(dòng)化驗(yàn)證策略需要解決以下問(wèn)題:
(1)可以自動(dòng)生成執(zhí)行包并行度可配置的隨機(jī)指令測(cè)試激勵(lì),并且能夠在執(zhí)行包中加入合法可控的分支指令,在程序流中插入中斷事件,構(gòu)造合法的分支跳轉(zhuǎn)程序流和中斷響應(yīng)程序流,縮短編寫驗(yàn)證激勵(lì)的時(shí)間。
(2)需要一個(gè)高層次參考模型,能夠快速準(zhǔn)確地得到隨機(jī)測(cè)試激勵(lì)的正確結(jié)果,減少驗(yàn)證人員結(jié)果分析的時(shí)間。
(3)具有結(jié)果自動(dòng)對(duì)比功能和收集覆蓋率的功能,便于錯(cuò)誤定位和覆蓋率統(tǒng)計(jì)。
基于以上分析,本文提出基于指令重排參考模型的自動(dòng)驗(yàn)證方法,用于提高指令流控的驗(yàn)證效率和驗(yàn)證完備性。
如圖5所示:基于參考模型的自動(dòng)驗(yàn)證方法以抽象的參考模型為基礎(chǔ),將批量自動(dòng)生成的隨機(jī)測(cè)試激勵(lì)同時(shí)輸入?yún)⒖寄P秃椭噶盍骺夭考﨑UT,監(jiān)測(cè)二者的輸出,并進(jìn)行結(jié)果自動(dòng)對(duì)比,然后根據(jù)覆蓋率情況調(diào)整產(chǎn)生隨機(jī)激勵(lì)的約束,實(shí)現(xiàn)功能點(diǎn)和代碼的快速全覆蓋。
Figure 5 Automatic verification based on reference model圖5 基于參考模型的自動(dòng)驗(yàn)證方法
基于參考模型的自動(dòng)化驗(yàn)證方法包含3個(gè)重要部分:
(1)激勵(lì)生成:生成符合條件的隨機(jī)測(cè)試指令包,并在這些測(cè)試激勵(lì)中插入合法的全局控制信號(hào)和分支/中斷操作。
(2)參考模型:對(duì)指令包進(jìn)行譯碼,并根據(jù)分支指令/中斷響應(yīng)進(jìn)行分支/中斷程序流的處理,產(chǎn)生標(biāo)準(zhǔn)結(jié)果隊(duì)列。
(3)結(jié)果分析:以SVA(SystemVerilog Assertion)斷言的方式,實(shí)時(shí)監(jiān)控DUT的輸出是否與參考模型的標(biāo)準(zhǔn)結(jié)果保持一致,并對(duì)覆蓋率進(jìn)行統(tǒng)計(jì)和分析。
激勵(lì)的自動(dòng)生成包括3部分:一是指令碼的生成;二是全局控制信號(hào)的生成,如全局停頓信號(hào)、中斷清空流水線信號(hào)IH_Flush等;三是取指地址生成,包括分支跳轉(zhuǎn)目標(biāo)地址、中斷程序入口地址和中斷返回地址的生成。
4.1.1 指令碼生成
隨機(jī)指令碼生成主要是針對(duì)執(zhí)行包并行度的驗(yàn)證,以及不同指令流在遇到不同并行度執(zhí)行包時(shí),觸發(fā)其他復(fù)雜功能點(diǎn)的驗(yàn)證。指令碼生成采用受約束的隨機(jī)方法[10],以保證執(zhí)行包合法有效,其生成過(guò)程如圖6所示,分別為11個(gè)功能部件(U0~U10)建立有效指令集合,即每個(gè)功能部件中包含所有合法的Type和L組合。在隨機(jī)生成指令執(zhí)行包時(shí),根據(jù)限定的并行度P,隨機(jī)選中P個(gè)功能部件,并在這P個(gè)功能部件中隨機(jī)選擇一組有效的Type/L組合,與完全隨機(jī)值Op進(jìn)行拼接,最后緊密排列構(gòu)成一個(gè)執(zhí)行包。重復(fù)以上過(guò)程,將生成的執(zhí)行包在存儲(chǔ)模型中依次排列,作為參考模型和DUT的測(cè)試指令包。圖6中示例了并行度為3的執(zhí)行包EP0和并行度為4的執(zhí)行包EP1的產(chǎn)生過(guò)程。
Figure 6 Random generation of instructions with constraint圖6 受約束的指令碼隨機(jī)生成
隨機(jī)生成的指令碼直接輸入?yún)⒖寄P椭羞M(jìn)行指令解析,同時(shí)搭建一個(gè)存儲(chǔ)體模型ASRAM實(shí)現(xiàn)與DUT中L1P的取指包通信,將激勵(lì)輸入至DUT中,如圖5所示。
4.1.2 全局控制信號(hào)生成
流水線停頓信號(hào)G_Stall可在沒(méi)有取指缺失造成的全局暫停的情況下隨機(jī)產(chǎn)生;中斷事件引起的清空流水線信號(hào)IH_Flush可在程序沒(méi)有處于分支延遲槽中的情況下隨機(jī)產(chǎn)生。
4.1.3 取指地址產(chǎn)生
在基于模擬的驗(yàn)證中,分支地址、中斷地址由編譯器輔助生成[11],而中斷返回地址由硬件記錄。在指令重排參考模型中,這些地址需要采用非完全隨機(jī)的方式,按照4.2節(jié)中不同程序流的處理方法而采用不同的產(chǎn)生策略。
4.1.4 可參數(shù)配置的定向激勵(lì)生成
為了針對(duì)特定功能進(jìn)行驗(yàn)證,可以通過(guò)對(duì)隨機(jī)數(shù)進(jìn)行參數(shù)配置實(shí)現(xiàn)激勵(lì)的定向隨機(jī)產(chǎn)生,包括以下特征配置:
(1) 并行度可配置:可以配置激勵(lì)中執(zhí)行包的并行度P為固定值,或者為一個(gè)范圍內(nèi)的隨機(jī)值;
(2) 指令長(zhǎng)度可配置:一個(gè)執(zhí)行包中80位/40位指令出現(xiàn)的概率;
(3) 異??膳渲茫阂粋€(gè)執(zhí)行包中是否出現(xiàn)指令派發(fā)異常或者流控部件指令錯(cuò)誤異常;
(4) 分支指令和中斷事件發(fā)生的概率可配置。
指令重排參考模型的核心工作是對(duì)順序程序流、分支程序流和中斷程序流的處理,如圖7所示,該模型對(duì)輸入的測(cè)試程序指令包(如表 1中示例)和中斷控制信號(hào)進(jìn)行執(zhí)行包和程序流的分析,將解析出的執(zhí)行包按程序?qū)嶋H運(yùn)行順序在時(shí)間上進(jìn)行重新排列(如表 2中示例),生成標(biāo)準(zhǔn)結(jié)果隊(duì)列。其中,分支/中斷地址的產(chǎn)生需要在程序流處理過(guò)程中以受約束的隨機(jī)方法產(chǎn)生,以保證其合法有效性。
Figure 7 Modeling for instruction flow control圖7 指令流控建模
4.2.1 順序程序流處理
當(dāng)激勵(lì)中不包含分支類指令且無(wú)中斷事件發(fā)生時(shí),參考模型根據(jù)指令的P,L,Type域,對(duì)指令包進(jìn)行由低位到高位的順序譯碼,將譯碼后得到的執(zhí)行包首地址PC_x(x=1,2,…)、執(zhí)行包內(nèi)包含的功能部件指令Uy(y=0,2,…,10)和該執(zhí)行包的異常信息保存至一個(gè)順序指令隊(duì)列,如圖8所示。圖8中x為用戶程序指令包在存儲(chǔ)中的實(shí)際位置編號(hào);y為功能部件標(biāo)號(hào)(0~10);Mem_ptr為該指令隊(duì)列的讀指針,表示當(dāng)前執(zhí)行包在存儲(chǔ)中的絕對(duì)位置。在順序程序中,Mem_ptr與標(biāo)準(zhǔn)結(jié)果隊(duì)列讀指針DP_ptr相同。圖8的順序程序流的結(jié)果隊(duì)列中,PC_n+2的執(zhí)行包包含2條屬于同一功能部件的指令U1,引發(fā)指令派發(fā)過(guò)程中的功能部件沖突異常,因此異常信息一列標(biāo)注為1。
Figure 8 Instruction queues of sequential program圖8 順序程序流的指令隊(duì)列
4.2.2 分支跳轉(zhuǎn)程序流處理
在進(jìn)行分支跳轉(zhuǎn)程序流處理時(shí),先按順序程序流處理方式將指令包解析為順序排列的執(zhí)行包,如圖9a所示。在此基礎(chǔ)上,增加一個(gè)分支控制處理隊(duì)列,如圖9b所示,分支控制隊(duì)列與順序隊(duì)列共用一個(gè)指針Mem_ptr。分支跳轉(zhuǎn)程序流處理主要包括以下幾個(gè)方面:
Figure 9 Processing of branch test program圖9 分支測(cè)試程序處理
(1)分支指令識(shí)別及分支地址產(chǎn)生。
在DUT中,分支指令的分支目標(biāo)地址由指令Op域計(jì)算得出,或由Op域指定的寄存器中的值決定。在參考模型中,由于分支指令部分指令碼是隨機(jī)生成的,因此為了保證分支目標(biāo)地址的合法性,同時(shí)降低驗(yàn)證的難度,分支目標(biāo)地址在所有有效的執(zhí)行包地址PC_x中隨機(jī)產(chǎn)生,并在DUT頂層對(duì)分支目標(biāo)地址進(jìn)行旁路,使得DUT的分支目標(biāo)地址與參考模型保持一致。如圖9a所示的測(cè)試程序,當(dāng)某個(gè)Mem_ptr所指向的執(zhí)行包中出現(xiàn)分支指令(如屬于U4功能部件的BR1和BR2)時(shí),則在圖9b的分支控制隊(duì)列中對(duì)應(yīng)Mem_ptr指向的行中標(biāo)記BR_Valid為1,同時(shí),在順序隊(duì)列中隨機(jī)選擇一行作為分支目標(biāo)執(zhí)行包,將其Mem_ptr保存至該行BR_ptr中。
(2)執(zhí)行包重排序。
根據(jù)圖9中的信息,將分支指令流按照指令派發(fā)的順序?qū)懭胍粋€(gè)新的隊(duì)列中。如圖10所示。圖10a中分支指令BR1之后,經(jīng)過(guò)6個(gè)延遲槽,程序跳轉(zhuǎn)至BR1的隨機(jī)分支目標(biāo)地址PC_n繼續(xù)執(zhí)行;分支指令BR2之后,經(jīng)過(guò)6個(gè)延遲槽,程序跳轉(zhuǎn)至BR2的隨機(jī)分支目標(biāo)地址PC_1繼續(xù)執(zhí)行。分支跳轉(zhuǎn)程序流重排序后,分支控制處理隊(duì)列也隨之重新排序,新的隊(duì)列指針為DP_ptr。重排后的指令隊(duì)列即為分支跳轉(zhuǎn)程序流的標(biāo)準(zhǔn)指令派發(fā)結(jié)果隊(duì)列。
Figure 10 Reordering branch jump program圖10 分支跳轉(zhuǎn)程序流重排序
(3)循環(huán)次數(shù)計(jì)數(shù)。
圖10中,分支指令BR2會(huì)使程序在PC_1~PC_8這8個(gè)執(zhí)行包之間不斷循環(huán),導(dǎo)致其他隨機(jī)生成的執(zhí)行包無(wú)法被驗(yàn)證。因此,圖10b中加入分支指令執(zhí)行次數(shù)Cnt的計(jì)數(shù)。Cnt對(duì)包含分支指令的執(zhí)行包的派發(fā)次數(shù)進(jìn)行累加,當(dāng)Cnt超過(guò)某一閾值時(shí)(例如10),則將參考模型中的分支指令標(biāo)志位BR_Valid置0,并通過(guò)旁路將BR_Valid輸入DUT作為分支的跳轉(zhuǎn)條件,使DUT中的分支指令不再執(zhí)行,從而規(guī)避程序進(jìn)入死循環(huán)的情況,確保隨機(jī)激勵(lì)的高效性。
Figure 11 Processing of interruption test program圖11 中斷測(cè)試程序處理
4.2.3 中斷響應(yīng)程序流處理
在實(shí)際應(yīng)用中,不同中斷事件具有不同的中斷響應(yīng)程序。在本文的參考模型中,因?yàn)椴恍枰P(guān)心中斷程序的具體功能,因此所有的中斷均采用相同的中斷響應(yīng)程序,并將中斷響應(yīng)程序放置于生成的隨機(jī)激勵(lì)最末端的特定地址。
中斷響應(yīng)程序流的測(cè)試程序如圖11a所示,在隨機(jī)生成的測(cè)試激勵(lì)最末端,增加一段中斷服務(wù)程序(Mem_ptr=m),該程序中包含3條指令(可擴(kuò)展為多條),其中IRET為中斷返回指令,NOP6為空轉(zhuǎn)指令用來(lái)填充6個(gè)延遲槽。中斷響應(yīng)程序流處理時(shí),在分支跳轉(zhuǎn)程序流的基礎(chǔ)上增加了一個(gè)中斷標(biāo)志隊(duì)列,如圖11c所示,該隊(duì)列中隨機(jī)標(biāo)記分支延遲槽以外的執(zhí)行包所在行為1,表示執(zhí)行當(dāng)前執(zhí)行包時(shí),發(fā)生了中斷響應(yīng)IH_Flush,并觸發(fā)清空流水線的操作。同時(shí)將此時(shí)的程序地址指針作為中斷返回地址指針Ret_ptr保存至圖11b的BR_ptr中。
圖12為中斷響應(yīng)程序流重排序處理。當(dāng)執(zhí)行到IH_Flush為1的執(zhí)行包時(shí)(PC_n+1),當(dāng)前程序停止執(zhí)行,清空在指令流水線中的所有指令,并將該執(zhí)行包地址指針(Mem_ptr=n+1)作為中斷返回地址指針Ret_ptr寫入IRET指令所在行的BR_ptr中。然后,程序跳轉(zhuǎn)至激勵(lì)尾部的中斷響應(yīng)服務(wù)子程序處(Mem_ptr=m)開始執(zhí)行。在Mem_ptr=m+1處中斷響應(yīng)程序處理完畢,執(zhí)行中斷返回指令I(lǐng)RET,6個(gè)延遲槽后,程序流返回到保存的中斷返回地址Ret_ptr(Mem_ptr=n+1)處繼續(xù)執(zhí)行主程序。IRET指令的Cnt始終為0,以確保每次中斷響應(yīng)后,均可以正確地返回到主程序。圖12a即為中斷響應(yīng)程序流的正確派發(fā)結(jié)果。
4.2節(jié)中測(cè)試程序經(jīng)過(guò)分析處理后,生成一個(gè)按照指令派發(fā)順序排序的標(biāo)準(zhǔn)結(jié)果隊(duì)列,如圖8、圖10a和圖12a所示。為方便描述,將結(jié)果隊(duì)列中包含的3列信息分別命名如下:EP首地址為ResultPC_Mem,EP中指令為ResultU_Mem,異常信息為ResultExp_Mem。以圖10a中分支跳轉(zhuǎn)程序流的驗(yàn)證為例,其波形如圖13所示,其中Ux_Inst和DP_PC分別為每個(gè)時(shí)鐘周期DUT輸出的執(zhí)行包及其首地址,Ux_Inst中陰影部分表示當(dāng)前時(shí)鐘周期派發(fā)了一條該部件的指令,Exprition為異常事件。在沒(méi)有全局停頓信號(hào)G_Stall時(shí),結(jié)果隊(duì)列讀指針DP_ptr由0開始遞增讀取標(biāo)準(zhǔn)結(jié)果,并通過(guò)SVA斷言監(jiān)控DUT的運(yùn)行結(jié)果是否與結(jié)果隊(duì)列保持一致[12],同時(shí)對(duì)功能點(diǎn)覆蓋率和覆蓋次數(shù)進(jìn)行統(tǒng)計(jì)。如下所示為部分基于SVA斷言的結(jié)果對(duì)比和功能覆蓋點(diǎn)。若結(jié)果對(duì)比失敗則打印錯(cuò)誤發(fā)生的時(shí)間和錯(cuò)誤類型,保存相應(yīng)激勵(lì)進(jìn)行調(diào)試和回歸驗(yàn)證;功能覆蓋點(diǎn)則可以統(tǒng)計(jì)該功能點(diǎn)是否被覆蓋,以及被覆蓋的次數(shù),從而評(píng)估該組激勵(lì)對(duì)功能點(diǎn)的驗(yàn)證分布情況。
Figure 13 Debug waveform of branch test program圖13 分支測(cè)試程序的調(diào)試波形
基于SVA的結(jié)果自動(dòng)對(duì)比示例:
assert_DP_PC:assert property (@(posedge clk)
disable iff (~rst_n) if (!G_Stall)ResultPC_Mem[DP_ptr]==DP_PC);
assert_U1_Inst:assert property (@(posedge clk)
disable iff (~rst_n) if (!G_Stall)ResultU_Mem[DP_ptr]==U1_Inst);
基于SVA的功能覆蓋點(diǎn)統(tǒng)計(jì)示例:
cover_TH_Flush_U1:cover property (@(posedge clk)
disable iff (~rst_n) if (!G_Stall)U1_Valid&&TH_Flush);
cover_TH_Flush_with_GStall:assert property (@(posedge clk)
disable iff (~rst_n)TH_Flush&&G_Stall);
本文采用Verilog/SystemVerilog語(yǔ)言對(duì)基于參考模型的指令流控自動(dòng)驗(yàn)證平臺(tái)進(jìn)行設(shè)計(jì)實(shí)現(xiàn),進(jìn)行了大量的模擬驗(yàn)證并對(duì)覆蓋率信息進(jìn)行統(tǒng)計(jì)收集。實(shí)驗(yàn)從激勵(lì)有效性、覆蓋率、仿真效率和可移植性等方面進(jìn)行了分析。
在對(duì)測(cè)試激勵(lì)的自動(dòng)生成進(jìn)行了參數(shù)配置后,通過(guò)檢測(cè)激勵(lì)運(yùn)行過(guò)程中斷言被觸發(fā)的情況,判斷激勵(lì)生成是否符合參數(shù)配置。如表 3中所示,配置執(zhí)行包中是否生成VLS0/VLS1指令,分別批量生成測(cè)試激勵(lì)后,對(duì)比驗(yàn)證過(guò)程中斷言觸發(fā)次數(shù),可以看到參數(shù)配置是有效的。如果將功能點(diǎn)全部由斷言進(jìn)行描述,則可以根據(jù)斷言被觸發(fā)的次數(shù),清晰地得到某類激勵(lì)驗(yàn)證的功能點(diǎn)的分布情況,進(jìn)而調(diào)整測(cè)試激勵(lì)參數(shù)配置,避免對(duì)同一個(gè)功能點(diǎn)密集覆蓋而其他功能點(diǎn)無(wú)覆蓋或覆蓋較少的情況。
代碼覆蓋率中,塊覆蓋率(Block Coverage)一般要求達(dá)到100%,表達(dá)式覆蓋率(Expression Coverage)一般要求達(dá)到95%以上。如表4所示,模擬覆蓋率為基于模擬的人工編寫代碼驗(yàn)證的覆蓋率數(shù)據(jù),合并覆蓋率為在增加了基于參考模型的
Table 3 Evaluation of effectiveness of parameter configuration
隨機(jī)激勵(lì)驗(yàn)證后, DUT的覆蓋率數(shù)據(jù)(其中未覆蓋的項(xiàng)為ET測(cè)試相關(guān))。2組覆蓋率數(shù)據(jù)表明,基于指令重排參考模型的隨機(jī)激勵(lì)驗(yàn)證方法是有效且全面的。
功能覆蓋點(diǎn)在本文中由2部分組成:驗(yàn)證前期根據(jù)功能驗(yàn)證文檔,基于模擬驗(yàn)證所進(jìn)行的功能點(diǎn)驗(yàn)證統(tǒng)計(jì),以及驗(yàn)證后期基于參考模型隨機(jī)激勵(lì)的驗(yàn)證中,使用SystemVerilog進(jìn)行Coverage point描述的覆蓋點(diǎn)統(tǒng)計(jì),二者最終實(shí)現(xiàn)所有功能點(diǎn)的全覆蓋。本文驗(yàn)證方法的代碼覆蓋率如表4所示。
Table 4 Evaluation of code coverage表4 代碼覆蓋率評(píng)估
在FT_xDSP中,傳統(tǒng)模擬驗(yàn)證與參考模型隨機(jī)驗(yàn)證對(duì)指令流控部件驗(yàn)證進(jìn)度的貢獻(xiàn)如圖14所示。在驗(yàn)證中后期,傳統(tǒng)模擬驗(yàn)證效率開始降低。增加參考模型隨機(jī)驗(yàn)證后,受益于隨機(jī)激勵(lì)可以通過(guò)腳本快速迭代生成,以及對(duì)各種復(fù)雜隨機(jī)激勵(lì)的結(jié)果可以自動(dòng)對(duì)比分析的優(yōu)勢(shì),更多處于模擬驗(yàn)證盲區(qū)的錯(cuò)誤得以快速暴露,加快了驗(yàn)證收斂速度。
Figure 14 Contribution of simulation verification and random verification to instruction flow control verification圖14 模擬驗(yàn)證與隨機(jī)驗(yàn)證對(duì)指令流控驗(yàn)證的貢獻(xiàn)
為了評(píng)估模擬驗(yàn)證和參考模型隨機(jī)驗(yàn)證在同等條件下的驗(yàn)證效率,人為在已經(jīng)成熟驗(yàn)證的指令流控中插入10個(gè)不同類型的錯(cuò)誤。2種驗(yàn)證方法在仿真時(shí)間上的對(duì)比如圖15所示。雖然2種方法在驗(yàn)證某些類型的功能點(diǎn)時(shí)分別出現(xiàn)了效率降低的情況,但是,參考模型隨機(jī)驗(yàn)證在總體仿真時(shí)間上較傳統(tǒng)模擬驗(yàn)證更有優(yōu)勢(shì),足以彌補(bǔ)其在參考模型搭建和受約束的隨機(jī)激勵(lì)生成等方面所花費(fèi)的時(shí)間。
Figure 15 Comparison of simulation time between simulation verification and random verification圖15 模擬驗(yàn)證與隨機(jī)驗(yàn)證仿真時(shí)間對(duì)比
由圖14可知,減少平臺(tái)開發(fā)時(shí)間(t)可以更早發(fā)現(xiàn)驗(yàn)證盲區(qū),縮短驗(yàn)證周期?;谥噶钪嘏诺膮⒖寄P停橄髮哟胃?,只需要對(duì)取指地址產(chǎn)生邏輯進(jìn)行修改,便可集成在系統(tǒng)級(jí)環(huán)境中。激勵(lì)自動(dòng)產(chǎn)生方法和參考模型的指令隊(duì)列重排方法,適用于多數(shù)指令集系統(tǒng)和指令流水線結(jié)構(gòu),可以通過(guò)微調(diào)移植到不同的硬件設(shè)計(jì)中,從而大大節(jié)省驗(yàn)證平臺(tái)開發(fā)時(shí)間。
本文重點(diǎn)介紹了自主高性能GPDSP處理器FT-xDSP的指令流控系統(tǒng)的驗(yàn)證方法,在基于人工編寫測(cè)試激勵(lì)的模擬驗(yàn)證已經(jīng)完成,但是仍有一些復(fù)雜功能以及驗(yàn)證薄弱點(diǎn)難以通過(guò)人工編寫測(cè)試激勵(lì)進(jìn)行代碼覆蓋的情況下,提出了一種基于參考模型的隨機(jī)驗(yàn)證方法。實(shí)驗(yàn)及實(shí)際驗(yàn)證的結(jié)果表明,這種隨機(jī)驗(yàn)證方法能夠快速生成大量可配置的定向隨機(jī)激勵(lì),大幅度提升驗(yàn)證效率,并且在不同芯片設(shè)計(jì)中具有可移植性。但是,本文中的參考模型在處理分支跳轉(zhuǎn)和中斷事件響應(yīng)時(shí),對(duì)原設(shè)計(jì)DUT的地址產(chǎn)生有侵入式設(shè)計(jì),在整個(gè)芯片的設(shè)計(jì)驗(yàn)證流程中要注意防范因此造成的代碼版本管理問(wèn)題。另外,指令流控部件的功能覆蓋率依靠簡(jiǎn)單SystemVerilog描述實(shí)現(xiàn),且未對(duì)所有功能點(diǎn)進(jìn)行描述,統(tǒng)計(jì)方法過(guò)于簡(jiǎn)陋,在下一步的工作中將對(duì)本文提出的方法做出進(jìn)一步的實(shí)驗(yàn)和完善,在驗(yàn)證平臺(tái)中加入covergroup進(jìn)行功能點(diǎn)的自動(dòng)收集。