劉春銳,張宏奎,黃旭東,陳振嬌
(中科芯集成電路有限公司,江蘇無(wú)錫214072)
隨著大規(guī)模集成電路技術(shù)的不斷發(fā)展,數(shù)字集成電路的規(guī)模不斷增大,功能不斷增強(qiáng),這給完備性驗(yàn)證帶來(lái)了更大的挑戰(zhàn)[1]。在CPU芯片的設(shè)計(jì)中,高效和完備的功能驗(yàn)證已成為CPU可靠性的重要依據(jù)[2],為了全面驗(yàn)證CPU的功能,驗(yàn)證工程師通常需要編寫成千上萬(wàn)條驗(yàn)證用例[3],并且需要逐一運(yùn)行測(cè)試并分析結(jié)果。據(jù)統(tǒng)計(jì),驗(yàn)證時(shí)間通常占到處理器芯片研發(fā)流程的60%以上[4]。如果完全采用人工的方法分析和查錯(cuò),驗(yàn)證效率極低,正確性難以保證,驗(yàn)證周期長(zhǎng)且驗(yàn)證完成時(shí)間無(wú)法預(yù)估。因此,一個(gè)快速、完備、系統(tǒng)的功能驗(yàn)證平臺(tái)對(duì)于CPU的設(shè)計(jì)來(lái)說至關(guān)重要,可有效縮短芯片設(shè)計(jì)周期并提高設(shè)計(jì)質(zhì)量[5]。除此之外,由于CPU指令多,指令組合場(chǎng)景多,驗(yàn)證用例非常龐大,除了驗(yàn)證平臺(tái)外,通過編寫自動(dòng)化腳本,批量構(gòu)建用例和統(tǒng)計(jì)驗(yàn)證結(jié)果,對(duì)提高整個(gè)驗(yàn)證效率也是至關(guān)重要的[6]。本文提出了一種高效率可重構(gòu)的CPU驗(yàn)證平臺(tái),可通過自動(dòng)化腳本構(gòu)建用例和統(tǒng)計(jì)結(jié)果,通過代碼覆蓋率標(biāo)志驗(yàn)證結(jié)束。
高效率可重構(gòu)的CPU驗(yàn)證平臺(tái)采用了模塊化結(jié)構(gòu),具有更強(qiáng)的可重復(fù)使用性和可移植性,有效提高了驗(yàn)證效率,縮短了芯片驗(yàn)證周期[7]。不同指令集架構(gòu)可以使用驗(yàn)證平臺(tái)設(shè)計(jì)思路修改參考模型后即可重復(fù)使用。另外,該設(shè)計(jì)平臺(tái)提供了自動(dòng)調(diào)試功能,自動(dòng)比較CPU執(zhí)行指令的結(jié)果值和參考模型執(zhí)行指令的結(jié)果值,為分析、調(diào)試和定位錯(cuò)誤提供了有效的手段,可以大大提高設(shè)計(jì)迭代效率。CPU驗(yàn)證平臺(tái)由驗(yàn)證用例生成模塊、匯編器模塊、CPU模塊、參考模型模塊、結(jié)果比較模塊、參考模型監(jiān)視模塊、CPU監(jiān)視模塊、程序RAM和數(shù)據(jù)RAM構(gòu)成,該驗(yàn)證平臺(tái)可以實(shí)現(xiàn)從驗(yàn)證程序開發(fā)到驗(yàn)證結(jié)果查錯(cuò)的整個(gè)流程,其結(jié)構(gòu)如圖1所示。
圖1 CPU驗(yàn)證平臺(tái)結(jié)構(gòu)
CPU模塊是驗(yàn)證平臺(tái)的驗(yàn)證主體,本文的CPU為基于TI指令集架構(gòu)的某CPU微處理器,該CPU微處理器的特性如下:
1)哈佛結(jié)構(gòu);
2)8級(jí)流水線結(jié)構(gòu);
3)單發(fā)射順序執(zhí)行;
4)支持32 bit單精度浮點(diǎn)計(jì)算;
5)支持32 bit定點(diǎn)計(jì)算;
6)指令長(zhǎng)度支持16 bit和32 bit兩種。
一般CPU的流水線結(jié)構(gòu)包括取指、譯碼、訪存、執(zhí)行和寫回等階段,其中指令便是CPU的輸入源。為驗(yàn)證CPU的功能,需要編寫指令并將其加載到CPU的程序RAM,然后啟動(dòng)CPU,CPU讀取程序RAM中的指令并運(yùn)行指令,最后根據(jù)CPU的指令執(zhí)行結(jié)果驗(yàn)證設(shè)計(jì)的正確性。
為完備驗(yàn)證CPU的功能,在開發(fā)CPU的驗(yàn)證用例前,需要分析CPU的特性,根據(jù)CPU的特性進(jìn)一步將其分解成功能測(cè)試點(diǎn),形成驗(yàn)證規(guī)格表,驗(yàn)證人員據(jù)此開發(fā)驗(yàn)證用例覆蓋所有的測(cè)試點(diǎn)。由于CPU指令多,CPU相關(guān)流水線結(jié)構(gòu)沖突和數(shù)據(jù)沖突場(chǎng)景多,驗(yàn)證用例數(shù)量龐大,所以大部分驗(yàn)證用例通過驗(yàn)證用例生成模塊的自動(dòng)化腳本批量生成,邊界驗(yàn)證用例由人工編寫生成。為全面覆蓋CPU的功能,驗(yàn)證用例采用匯編代碼編寫,通過驗(yàn)證用例生成模塊生成后綴為.asm的匯編驗(yàn)證用例。
驗(yàn)證用例生成模塊主要由生成驗(yàn)證用例的Perl(Practical Extraction and Report Language)[8]腳本構(gòu)成。為保證生成的匯編驗(yàn)證用例的正確性,在Perl腳本中將CPU的每條指令均單獨(dú)構(gòu)建子函數(shù),每個(gè)子函數(shù)使用編號(hào)命名,子函數(shù)內(nèi)部將該指令的限制用法單獨(dú)編程。以UI16TOF32指令為例,其子函數(shù)Perl腳本如下:
將待驗(yàn)證的超過400條CPU指令分類并逐條編寫Perl子函數(shù),Perl主函數(shù)通過調(diào)用編號(hào)隨機(jī)的Perl子函數(shù)實(shí)現(xiàn)各指令間的隨機(jī)組合,并按照匯編格式生成匯編驗(yàn)證用例。
現(xiàn)有CPU驗(yàn)證平臺(tái)的驗(yàn)證用例通常使用C語(yǔ)言或者高級(jí)語(yǔ)言隨機(jī)生成,通過編譯器編譯后加載到CPU中進(jìn)行驗(yàn)證。使用高級(jí)語(yǔ)言編寫的驗(yàn)證用例由于編譯器的優(yōu)化,通常不能實(shí)現(xiàn)CPU內(nèi)部資源的高效利用,從而不能覆蓋到CPU數(shù)據(jù)相關(guān)沖突和流水線相關(guān)沖突的部分場(chǎng)景,造成CPU功能驗(yàn)證不全、功能覆蓋率難收斂的情況。本文使用自動(dòng)化Perl腳本直接構(gòu)建匯編驗(yàn)證用例,而匯編驗(yàn)證用例會(huì)直接指定指令使用的CPU內(nèi)部資源,從而可以覆蓋到CPU數(shù)據(jù)相關(guān)沖突和流水線相關(guān)沖突的各種場(chǎng)景。這不僅提高了CPU驗(yàn)證的可靠性,而且由于無(wú)需使用編譯器編譯,提高了仿真效率,縮短了驗(yàn)證周期。
匯編驗(yàn)證用例構(gòu)建完成后,使用TI公司的CCS匯編器編譯,通過格式轉(zhuǎn)換器轉(zhuǎn)換成Verilog代碼能識(shí)別的存儲(chǔ)器存儲(chǔ)文件,該存儲(chǔ)文件是后綴為.hex的程序機(jī)器碼文件。格式轉(zhuǎn)換器采用Perl語(yǔ)言編寫,可生成多種Verilog能夠識(shí)別的文件。
程序RAM內(nèi)部通過Verilog的$readmemh系統(tǒng)函數(shù)讀取后綴為.hex的存儲(chǔ)器文件,存入程序RAM中,CPU模塊通過存儲(chǔ)器接口讀取該程序RAM空間的程序數(shù)據(jù)。
數(shù)據(jù)RAM主要存儲(chǔ)CPU流水線訪存和回寫的數(shù)據(jù)。
參考模型模塊是針對(duì)CPU模塊提出的,參考模型模塊和CPU模塊是對(duì)產(chǎn)品特性的兩個(gè)獨(dú)立的實(shí)現(xiàn),也就是說,參考模型模塊功能上與CPU模塊等價(jià),但參考模型模塊與CPU模塊的設(shè)計(jì)不同,兩者區(qū)別如下。
1)輸入:參考模型模塊的輸入是匯編驗(yàn)證用例,而CPU模塊的輸入是存儲(chǔ)在程序RAM中的經(jīng)匯編器模塊編譯后的二進(jìn)制指令碼。
2)指令處理流程:參考模型模塊逐行讀取匯編驗(yàn)證用例中的指令,每條指令執(zhí)行完成后才會(huì)繼續(xù)讀取下一條匯編指令,而CPU模塊是基于流水線的設(shè)計(jì),讀取當(dāng)前指令不需要上一條指令執(zhí)行完成。
3)運(yùn)算單元:參考模型使用SystemVerilog[9]語(yǔ)言完成指令的乘、加、移位等運(yùn)算,其具有接口、斷言、受約束的隨機(jī)化激勵(lì)等特點(diǎn),能夠大幅提高測(cè)試效率,且具有較高的功能測(cè)試覆蓋率[10],而CPU模塊的乘、加、移位等運(yùn)算是基于電路的設(shè)計(jì)。
根據(jù)上述參考模型模塊和CPU模塊設(shè)計(jì)的主要區(qū)別,可以得出參考模型模塊的設(shè)計(jì)思想:逐行讀取匯編文件中的匯編指令,通過SystemVerilog字符串匹配技術(shù)完成匯編指令匹配,從而識(shí)別出匯編指令功能,然后實(shí)現(xiàn)指令功能。參考模型對(duì)指令的串行執(zhí)行方式巧妙地驗(yàn)證了CPU模塊的流水線相關(guān)沖突和數(shù)據(jù)相關(guān)沖突設(shè)計(jì)的正確性。同時(shí),由于參考模型模塊和CPU模塊的運(yùn)算單元設(shè)計(jì)不一致,CPU模塊運(yùn)算單元的正確性也可以得到驗(yàn)證。參考模型的設(shè)計(jì)流程如圖2所示。
圖2 參考模型模塊設(shè)計(jì)流程
參考模型模塊的設(shè)計(jì)流程描述如下:
1)參考模型模塊使用Perl腳本讀入驗(yàn)證用例生成模塊產(chǎn)生的后綴為.asm的匯編驗(yàn)證用例,將匯編驗(yàn)證用例中的注釋去掉,并在匯編驗(yàn)證用例中的每行指令結(jié)束位置添加行結(jié)束標(biāo)志;
2)參考模型模塊讀入Perl腳本處理后的匯編驗(yàn)證用例,通過SystemVerilog的$feof系統(tǒng)任務(wù)判斷該驗(yàn)證用例是否結(jié)束,當(dāng)驗(yàn)證用例沒有被讀完時(shí),轉(zhuǎn)步驟3,否則參考模型模塊的流程結(jié)束;
3)參考模型模塊使用$fscanf系統(tǒng)任務(wù)按字符讀取匯編驗(yàn)證用例,并存入指令字符數(shù)組中,然后通過步驟1添加的行結(jié)束標(biāo)志判斷該行指令是否結(jié)束,如果該行指令未結(jié)束,則重復(fù)步驟3,否則,跳轉(zhuǎn)至步驟4;
4)參考模型模塊讀取指令字符數(shù)組,通過字符串匹配功能識(shí)別匯編指令的操作碼和操作數(shù),如MOV32 R0,R1,操作碼是MOV32,目的操作數(shù)是寄存器R0,源操作數(shù)是寄存器R1;
5)參考模型模塊根據(jù)步驟4識(shí)別出的指令功能和操作數(shù)執(zhí)行該指令,如MOV32 R0,R1,將寄存器R1的值送到R0中,然后開始下一條指令的讀取,跳轉(zhuǎn)至步驟2。
參考模型模塊對(duì)比驗(yàn)證CPU模塊的方式為:將驗(yàn)證用例生成模塊生成的同一驗(yàn)證用例送入?yún)⒖寄P湍K和CPU模塊,然后比較參考模型模塊和CPU模塊所有指令的執(zhí)行結(jié)果,如果參考模型模塊和CPU模塊的行為不一致,或者CPU模塊的功能實(shí)現(xiàn)出現(xiàn)錯(cuò)誤,或者參考模型模塊的功能實(shí)現(xiàn)出現(xiàn)錯(cuò)誤,或者兩者實(shí)現(xiàn)功能均出現(xiàn)錯(cuò)誤,通過定位修改參考模型模塊和CPU模塊的錯(cuò)誤。如果CPU模塊和參考模型模塊的行為一致,或者兩者都對(duì),這是希望的結(jié)果;或者兩者犯同樣的錯(cuò)誤,那么需要想辦法減小這種情況出現(xiàn)的可能性,比如參考模型模塊的設(shè)計(jì)人員不能為CPU模塊設(shè)計(jì)人員,或者引入第三方,例如VIP、FPGA[11]原型等。本文采用參考模型模塊設(shè)計(jì)人員不為CPU模塊設(shè)計(jì)人員的方法降低參考模型和CPU模塊設(shè)計(jì)同時(shí)出錯(cuò)的可能性。
參考模型模塊是該驗(yàn)證平臺(tái)中最重要的組件,參考模型模塊是保證功能驗(yàn)證正確性的核心[12],也是該驗(yàn)證平臺(tái)實(shí)現(xiàn)高效率和重構(gòu)優(yōu)勢(shì)的核心組件?,F(xiàn)有CPU驗(yàn)證平臺(tái)參考模型的設(shè)計(jì)基本分為兩類,一類是使用編譯器自帶的由高級(jí)語(yǔ)言編寫的軟件參考模型,軟件參考模型復(fù)雜難懂,某些軟件參考模型的核心代碼甚至是加密的,這增大了驗(yàn)證人員的調(diào)試難度。搭建基于軟件參考模型的驗(yàn)證平臺(tái)通常工作量大,人力投入高,且調(diào)試周期長(zhǎng)。另一類是基于指令碼匹配技術(shù)設(shè)計(jì)的參考模型,該類參考模型通常會(huì)遵照CPU流水線時(shí)序編寫,其工作量與CPU設(shè)計(jì)工作量相當(dāng),人力投入和調(diào)試周期依然較長(zhǎng)。本文通過SystemVerilog的字符串匹配技術(shù)串行識(shí)別匯編文件,無(wú)需嚴(yán)格按照流水線時(shí)序設(shè)計(jì),參考模型的工作量大大減少,人力投入和周期均減少,不僅提高了CPU的驗(yàn)證效率,而且縮短了驗(yàn)證周期。
CPU監(jiān)視模塊主要完成CPU模塊指令執(zhí)行結(jié)果的監(jiān)測(cè)功能,CPU模塊通常的指令執(zhí)行結(jié)果是修改CPU模塊內(nèi)部資源和數(shù)據(jù)RAM,CPU模塊內(nèi)部資源包括通用寄存器和輔助寄存器等,CPU監(jiān)視模塊主要將CPU模塊對(duì)寄存器和數(shù)據(jù)RAM的執(zhí)行結(jié)果打印到日志中。
參考模型監(jiān)視模塊主要完成參考模型模塊指令執(zhí)行結(jié)果的監(jiān)測(cè)功能,參考模型模塊模擬CPU模塊的行為,參考模型模塊內(nèi)部的通用寄存器、輔助寄存器和數(shù)據(jù)RAM資源也同樣參照CPU模塊定義,參考模型監(jiān)視模塊主要是將參考模型模塊對(duì)寄存器和數(shù)據(jù)RAM的執(zhí)行結(jié)果打印到日志中。
結(jié)果比較模塊通過對(duì)比CPU監(jiān)視模塊和參考模型監(jiān)視模塊提供的指令運(yùn)行的打印結(jié)果,給出比較結(jié)果,幫助驗(yàn)證人員快速完成CPU驗(yàn)證結(jié)果的分析和判斷。
本文采用Synopsys公司的VCS作為仿真工具,為實(shí)現(xiàn)批量驗(yàn)證,編寫了基于Perl的批處理程序,該程序可一次批量驗(yàn)證多個(gè)用例,并統(tǒng)計(jì)驗(yàn)證結(jié)果,生成驗(yàn)證報(bào)告。批量驗(yàn)證流程如圖3所示。
圖3 批量驗(yàn)證流程
批量驗(yàn)證流程描述如下:
1)通過驗(yàn)證用例生成模塊批量生成驗(yàn)證用例,即后綴為.asm的匯編驗(yàn)證用例;
2)將匯編驗(yàn)證用例傳入?yún)R編器模塊,跳轉(zhuǎn)至第3步,將匯編驗(yàn)證用例傳入?yún)⒖寄P湍K,跳轉(zhuǎn)至第6步;
3)匯編器模塊將匯編驗(yàn)證用例編譯成指令碼之后,程序RAM將指令碼讀入RAM中;
4)CPU模塊讀取存在程序RAM中的指令碼指令,并執(zhí)行指令;
5)CPU的監(jiān)視模塊監(jiān)測(cè)CPU模塊的執(zhí)行結(jié)果,并將CPU模塊的執(zhí)行結(jié)果輸出;
6)參考模型模塊讀取驗(yàn)證用例生成模塊產(chǎn)生的匯編指令,并執(zhí)行指令;
7)參考模型監(jiān)視模塊監(jiān)測(cè)參考模型模塊的執(zhí)行結(jié)果,并將參考模型模塊的執(zhí)行結(jié)果輸出;
8)結(jié)果比較模塊比較參考模型的監(jiān)視模塊和CPU監(jiān)視模塊的輸出結(jié)果,如果結(jié)果一致,則輸出該驗(yàn)證用例測(cè)試通過的信息,否則輸出驗(yàn)證用例測(cè)試失敗的信息;
9)重新開始下一個(gè)驗(yàn)證用例的仿真驗(yàn)證,依次循環(huán)直到所有的驗(yàn)證用例全部運(yùn)行結(jié)束,批處理程序顯示本次批量驗(yàn)證的統(tǒng)計(jì)信息,并輸出驗(yàn)證用例通過或者失敗的信息;
10)所有驗(yàn)證用例仿真均通過后,收集并合并驗(yàn)證用例覆蓋率。
運(yùn)用該功能驗(yàn)證平臺(tái)進(jìn)行了32位CPU的驗(yàn)證。根據(jù)該CPU的特性,分別驗(yàn)證了5類共計(jì)1044條驗(yàn)證用例,驗(yàn)證結(jié)果均通過,驗(yàn)證結(jié)果如表1所示。
表1 驗(yàn)證結(jié)果
除此之外,為保證驗(yàn)證的充分性,對(duì)所有驗(yàn)證用例進(jìn)行了代碼覆蓋率收集和合并。通過分析覆蓋率,定向構(gòu)造用例,提高驗(yàn)證的完備性。
本驗(yàn)證平臺(tái)的代碼覆蓋率結(jié)果如下。
1)行覆蓋率:CPU的行覆蓋率為100%。
2)翻轉(zhuǎn)覆蓋率:CPU的翻轉(zhuǎn)覆蓋率為99.81%,覆蓋率較低的原因是輸入和輸出數(shù)據(jù)信號(hào)的翻轉(zhuǎn)覆蓋率低,本文主要關(guān)注控制信號(hào)的翻轉(zhuǎn)覆蓋率,對(duì)不能達(dá)到100%的控制信號(hào)均進(jìn)行了分析,確認(rèn)是否是CPU不能進(jìn)入的值,對(duì)于CPU可能會(huì)翻轉(zhuǎn)的值,定向構(gòu)造用例,進(jìn)行覆蓋。
3)條件覆蓋率:CPU的條件覆蓋率為83.17%,未覆蓋的條件分支是設(shè)計(jì)中不會(huì)出現(xiàn)的分支。
4)狀態(tài)機(jī)覆蓋率:本文的DUT內(nèi)部無(wú)狀態(tài)機(jī)。
5)分支覆蓋率:CPU的分支覆蓋率為100%。
在CPU的設(shè)計(jì)中,高效和完備的功能驗(yàn)證已成為CPU是否可靠的重要參考依據(jù),本文設(shè)計(jì)并實(shí)現(xiàn)了一種基于SystemVerilog的CPU驗(yàn)證平臺(tái),論述了驗(yàn)證平臺(tái)的整體設(shè)計(jì)結(jié)構(gòu)、實(shí)現(xiàn)流程和批量驗(yàn)證的實(shí)現(xiàn)方式。該驗(yàn)證平臺(tái)有較好的通用性和可移植性,對(duì)于不同的指令集架構(gòu),稍加修改參考模型便可使用。該驗(yàn)證平臺(tái)已成功應(yīng)用于32位CPU芯片的功能驗(yàn)證,相比該CPU之前的驗(yàn)證方法,驗(yàn)證周期從預(yù)估的10個(gè)月縮短到3個(gè)月,大大提高了驗(yàn)證效率,縮短了CPU交付周期。另外,該設(shè)計(jì)平臺(tái)可以通過參考模型模塊和監(jiān)視模塊快速定位CPU的設(shè)計(jì)缺陷,縮短設(shè)計(jì)人員迭代開發(fā)的周期。