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