面向兼容設(shè)計(jì)的微處理器硅后驗(yàn)證裝置與驗(yàn)證方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及微處理器硅后功能驗(yàn)證領(lǐng)域,特別涉及一種兼容性芯片指令集運(yùn)算硅后功能驗(yàn)證的裝置和方法。
【背景技術(shù)】
[0002]軍用微處理器(包括CPU與DSP)普遍應(yīng)用于導(dǎo)彈、衛(wèi)星、飛機(jī)、艦艇、雷達(dá)、坦克和軍用保密通信等領(lǐng)域。由于大量進(jìn)口國外芯片,面臨禁運(yùn)和斷檔的威脅、安全和可靠性的隱患,自主研制兼容軍用微處理器、實(shí)現(xiàn)國產(chǎn)化替代意義重大。
[0003]本發(fā)明所指的兼容,主要是指自主研制微處理器、實(shí)現(xiàn)對國外微處理器的可插拔替換使用,要求在外形和封裝、功能、性能、電氣參數(shù)等多個(gè)方面與國外產(chǎn)品一致。為描述方便,本發(fā)明將擬研制的國外微處理器稱為目標(biāo)芯片,將我們自主研制的兼容的微處理器稱為兼容芯片。
[0004]武器系統(tǒng)中微處理器的國產(chǎn)化替換要求與國外主流微處理器的指令、封裝、接口時(shí)序完全兼容,兼容性的驗(yàn)證面臨巨大挑戰(zhàn)。本發(fā)明主要針對功能兼容驗(yàn)證,其含義是指兼容芯片相比目標(biāo)芯片具有以下特征:程序員可見的硬件資源與目標(biāo)芯片一致;正確、一致地實(shí)現(xiàn)CPU指令全集;代碼執(zhí)行的結(jié)果與可觀測狀態(tài)一致;外設(shè)部件功能和使用方法一致;硬件配置方法和啟動(dòng)模式設(shè)置一致。
[0005]功能兼容驗(yàn)證可以包含在投片前的驗(yàn)證和投片后的驗(yàn)證(即硅后驗(yàn)證)兩個(gè)階段。傳統(tǒng)投片前驗(yàn)證使用的手段有兩個(gè),一是基于軟件的模擬驗(yàn)證,二是基于仿真器的硬件仿真。模擬驗(yàn)證靈活度高、可觀測性強(qiáng)、成本低廉,但是速度慢、驗(yàn)證周期長,適于對功能部件進(jìn)行驗(yàn)證。硬件仿真將寄存器級設(shè)計(jì)代碼下載到硬件仿真器中,采用硬件執(zhí)行測試激勵(lì),其速度快、可觀測性強(qiáng),但是成本高昂,為復(fù)雜多核芯片搭建硬件仿真平臺需要多個(gè)仿真器協(xié)同工作,維護(hù)困難。無論軟件模擬還是硬件仿真,測試激勵(lì)都是驗(yàn)證的瓶頸,對于模擬驗(yàn)證而言,大量的測試激勵(lì)將增加驗(yàn)證周期時(shí)間,而為了控制時(shí)間減少測試激勵(lì)則意味著功能覆蓋率的降低;對于硬件仿真而言,傳統(tǒng)產(chǎn)生激勵(lì)的方式,其速度遠(yuǎn)遠(yuǎn)不能滿足仿真器速度的需要,這對于加速平臺是極大的浪費(fèi)。
[0006]硅后驗(yàn)證速度快,可在較短時(shí)間內(nèi)對芯片進(jìn)行全方面的功能驗(yàn)證,保證較高的覆蓋率。傳統(tǒng)的硅后功能兼容驗(yàn)證通常采用人工比較的方法,在硅后驗(yàn)證階段把兼容芯片運(yùn)行的結(jié)果與目標(biāo)芯片運(yùn)行結(jié)果進(jìn)行人工比較,其難點(diǎn)在于難以窮舉各種邊界處理的情況,難以保證驗(yàn)證覆蓋率,驗(yàn)證效率很低,驗(yàn)證周期很長。而且,與硬件仿真一樣,硅后驗(yàn)證同樣面臨著測試激勵(lì)生成速度的瓶頸,理想的測試激勵(lì)生成方法應(yīng)當(dāng)速度快、覆蓋率高、冗余度低。大部分硅后驗(yàn)證需要硬件加速模塊提供大量測試激勵(lì)輸入,不同的測試模板對應(yīng)不同的硬件加速模塊,為保證激勵(lì)產(chǎn)生速度,硬件加速模塊不能過于復(fù)雜。這種方法的缺點(diǎn)在于硬件加速模塊和處理器芯片間的帶寬會成為系統(tǒng)瓶頸,另一方面,當(dāng)測試模板較多時(shí),需要大量硬件加速模塊,模塊間的控制和調(diào)度變得復(fù)雜。也有一些方法在生成測試激勵(lì)時(shí)已經(jīng)隱含了處理器的執(zhí)行結(jié)果,這簡化了結(jié)果比對的工作,但是對測試激勵(lì)生成方案要求較高,且應(yīng)用范圍不廣。更常用的方法是單獨(dú)設(shè)計(jì)運(yùn)算邏輯,將加載到處理器的激勵(lì)也加載到運(yùn)算邏輯上,并將產(chǎn)生的結(jié)果與處理器產(chǎn)生的結(jié)果作比較,以此判斷處理器執(zhí)行是否正確。這種方法的問題在于作為參考的運(yùn)算邏輯可能會很復(fù)雜,或者時(shí)間開銷很大,影響驗(yàn)證速度。
【發(fā)明內(nèi)容】
[0007]本發(fā)明要解決的技術(shù)問題是:針對實(shí)現(xiàn)微處理器硅后功能兼容驗(yàn)證技術(shù)存在的測試激勵(lì)生成速度慢、驗(yàn)證結(jié)果檢查效率低和控制復(fù)雜等問題,提出一種準(zhǔn)確、高效驗(yàn)證微處理器功能兼容的裝置與方法,解決兼容性芯片驗(yàn)證時(shí)測試激勵(lì)生成緩慢、驗(yàn)證結(jié)果檢查效率低和硬件平臺控制復(fù)雜等問題,提高驗(yàn)證質(zhì)量,縮短驗(yàn)證周期。
[0008]具體技術(shù)方案為:
[0009]本發(fā)明面向兼容設(shè)計(jì)的微處理器硅后驗(yàn)證裝置為“主-從”雙芯片結(jié)構(gòu),由調(diào)試主機(jī)、開發(fā)板、主控芯片和從控芯片組成。
[0010]調(diào)試主機(jī)是運(yùn)行開發(fā)環(huán)境并控制主控芯片和從控芯片行為的計(jì)算機(jī),與主控芯片和從控芯片相連。調(diào)試主機(jī)和主控芯片通過第一聯(lián)合測試工作組(J1ntTestAct1nGroup,JTAG) JTAGl相連,調(diào)試主機(jī)和從控芯片通過第二聯(lián)合測試工作組JTAG2相連。調(diào)試主機(jī)上安裝有商用軟件一代碼調(diào)試器(CodeComposerStud1,CCS)集成開發(fā)環(huán)境。調(diào)試主機(jī)上有利用CCS集成開發(fā)環(huán)境開發(fā)的兩套軟件:主控程序和從控程序,主控程序是負(fù)責(zé)生成主控芯片測試激勵(lì)、控制主控芯片執(zhí)行測試激勵(lì)、比對主控芯片與從控芯片執(zhí)行測試激勵(lì)結(jié)果和處理從控芯片執(zhí)行結(jié)果錯(cuò)誤的軟件;從控程序是負(fù)責(zé)生成從控芯片測試激勵(lì)、控制從控芯片執(zhí)行測試激勵(lì)的軟件。
[0011]開發(fā)板是配備了多種接口和總線的通用開發(fā)板,可以部署多個(gè)處理器芯片,芯片間由數(shù)據(jù)總線連接,每個(gè)芯片擁有與調(diào)試主機(jī)通信的獨(dú)立接口。主控芯片、從控芯片插到開發(fā)板上。
[0012]主控芯片為目標(biāo)芯片,主控芯片與調(diào)試主機(jī)和HPI總線即主機(jī)接口(HostPortInterface)總線相連。主控芯片通過JTAGl與調(diào)試主機(jī)相連,通過HPI總線與開發(fā)板上其它資源進(jìn)行通信。主控芯片從調(diào)試主機(jī)下載并運(yùn)行主控程序。
[0013]主控程序流程為:
[0014]第一步,定義驗(yàn)證過程中的敏感點(diǎn)集,敏感點(diǎn)集由敏感點(diǎn)構(gòu)成,敏感點(diǎn)為浮點(diǎn)運(yùn)算中對運(yùn)算結(jié)果精度和準(zhǔn)確度影響較大的特殊數(shù)值,包括正負(fù)零、正負(fù)無窮大以及無效數(shù);令敏感點(diǎn)集中敏感點(diǎn)個(gè)數(shù)為KpNum(KpNum為正整數(shù));在主控芯片地址空間中分別定義以ADDRl、ADDR2、ADDR3、ADDR4、ADDR5、ADDRlI和ADDR12為起始地址的存儲空間,用于存放主控程序在后續(xù)執(zhí)行過程中臨時(shí)產(chǎn)生的數(shù)據(jù)和代碼,因?yàn)橹骺爻绦蛟跍y試過程中生成多段第一測試激勵(lì)程序,在主控芯片上將會占用一片存儲空間,定義RADDR2等于ADDR2,RADDR2的值為所述多段第一測試激勵(lì)程序在主控芯片中存儲的起始地址;
[0015]第二步,定義指令模型和測試激勵(lì)模板;通過面向?qū)ο蟮姆椒▽Υ郎y功能指令進(jìn)行抽象建模,定義指令模型,過程如下:根據(jù)指令內(nèi)部不同指令位的作用將指令劃分為若干字段,如操作碼字段、操作數(shù)字段、條件執(zhí)行位字段、平行位字段等,每個(gè)字段均為一個(gè)有約束條件的隨機(jī)變量,約束條件規(guī)定了隨機(jī)變量字段的類型、取值范圍和隨機(jī)分布的比例;為不同結(jié)構(gòu)類型的指令建立不同的指令模型,包括雙操作數(shù)指令、單操作數(shù)指令和無操作數(shù)指令,令指令操作數(shù)的個(gè)數(shù)為OpNum (雙操作數(shù)指令的OpNum等于2,單操作數(shù)指令的OpNum等于I,無操作數(shù)指令的OpNum等于O),令指令模型個(gè)數(shù)為InsNum(InsNum的取值與指令集有關(guān));在指令模型的基礎(chǔ)上,為運(yùn)算類指令和控制類指令分別建立測試激勵(lì)模板;運(yùn)算類指令測試激勵(lì)模板包含三部分:并行地將OpNum個(gè)操作數(shù)搬移至OpNum個(gè)寄存器中、執(zhí)行指令、將結(jié)果寫回到存儲空間;控制類指令測試激勵(lì)模板包括三部分:存儲當(dāng)前狀態(tài)寄存器值、執(zhí)行指令、存儲執(zhí)行后狀態(tài)寄存器值;根據(jù)執(zhí)行控制類指令的類型選擇需要保存的狀態(tài)寄存器,控制類指令功能包括:改變程序執(zhí)行順序、改變流水線狀態(tài)、改變執(zhí)行權(quán)限和改變緩存狀態(tài);
[0016]第三步,定義主控程序循環(huán)變量LoopNuml = 0,LoopNuml控制驗(yàn)證過程中主控程序隨機(jī)生成測試數(shù)據(jù)的循環(huán)遍數(shù),定義程序預(yù)定循環(huán)次數(shù)MAXL00P1 (MAXL00P1為正整數(shù),MAXL00P1取能使驗(yàn)證達(dá)到目標(biāo)覆蓋率的經(jīng)驗(yàn)值,通常覆蓋率目標(biāo)設(shè)置為運(yùn)算空間的1% ),定義臨時(shí)變量j = 0,定義主控程序同步標(biāo)志位MFlag,MFlag為I時(shí)表示主控芯片已經(jīng)處于等待接收從控芯片發(fā)送第二測試激勵(lì)程序的狀態(tài);
[0017]第四步,復(fù)位主控程序同步標(biāo)志位,即MFlag置O ;
[0018]第五步,生成第一測試數(shù)據(jù),構(gòu)成第一測試數(shù)據(jù)集DataSetl,方法是:主控程序?qū)γ舾悬c(diǎn)集中的每一個(gè)敏感點(diǎn),利用正態(tài)分布隨機(jī)數(shù)生成函數(shù)生成KN(KN為正整數(shù),KN通常取100?1000)個(gè)以敏感點(diǎn)為中心、固定值(固定值可以取敏感點(diǎn)浮點(diǎn)表示中尾數(shù)變化范圍內(nèi)的任意值)為方差、符合正態(tài)分布的第一測試數(shù)據(jù);正態(tài)分布隨機(jī)數(shù)生成函數(shù)包含兩步:第一步利用C語言庫函數(shù)中隨機(jī)數(shù)生成器生成符合均勻分布的隨機(jī)數(shù);第二步使用經(jīng)典的 BoxMuller 算法(見 baike.baidu.com/view/1710258.htm ? fr = aladdin)將這些均勻分布的隨機(jī)數(shù)轉(zhuǎn)換為符合正態(tài)分布的隨機(jī)數(shù);敏感點(diǎn)集中KpNum個(gè)敏感點(diǎn)生成出的KpNum*KN個(gè)第一測試數(shù)據(jù)構(gòu)成第一測試數(shù)據(jù)集DataSetl,DataSetl存放在主控芯片中以ADDRl為起始地址的存儲空間;DataSetl生成過程如下:
[0019]5.1 定義變量 i = O ;
[0020]5.2對敏感點(diǎn)集中的第i個(gè)敏感點(diǎn),生成KN個(gè)以敏感點(diǎn)為中心、固定值為方差、符合正態(tài)分布的測試數(shù)據(jù),將生成的測試數(shù)據(jù)添加到DataSetl中,i增I ;
[0021]5.3 若 i〈KpNum,車專 5.2 ;若 i ^ KpNum,執(zhí)行第六步;
[0022]第六步,按照第二步定義的指令模型隨機(jī)生成IN(IN為正整數(shù),IN>KpNum*KN/2)條待測試指令;對于每條待測試指令,根據(jù)第二步定義的測試激勵(lì)模板隨機(jī)生成第一測試激勵(lì)程序;串行地為IN條待測試指令生成IN段第一測試激勵(lì)程序,為每條待測試指令生成第一測試激勵(lì)程序的過程相同,均包括以下步驟:
[0023]6.1若待測試指令為運(yùn)算類指令,首先從DataSetl中隨機(jī)選擇OpNum個(gè)操作數(shù);然后在待測試指令前生成搬移指令,搬移指令作用為將操作數(shù)搬移到對應(yīng)的寄存器中;在待測試指令后生成第一存儲指令,第一存儲指令作用為將運(yùn)算結(jié)果存儲到主控芯片地址為ADDR4的存儲空間;最后將第一測試激勵(lì)程序存儲到主控芯片地址為ADDR2的存儲空間;轉(zhuǎn)6.3 ;
[0024]6.2若待測試指令為控制類指令,首先在待測試指令前生成第二存儲指令,第二存儲指令作用為將當(dāng)前狀態(tài)寄存器值存儲到主控芯片地址為ADDR4的存儲空間;然后在待測試指令后生成第三存儲指令,第三存儲指令作用為將執(zhí)行后狀態(tài)寄存器值存儲到主控芯片地址為ADDR4的存儲空間;最后將第一測試激勵(lì)程序存儲到主控芯片地址為ADDR2的存儲空間;轉(zhuǎn)6.3 ;
[0025]6.3ADDR2增加一個(gè)地址位(地址位=機(jī)器字寬/8,地址位與機(jī)器字寬相關(guān),如32位機(jī)器的一個(gè)地址位為4,64位機(jī)器的一個(gè)地址位為8),ADDR4增加一個(gè)地址位,j增1,若j〈InsNum,表示所述待測試指令尚有指令模型沒有生成第一測試激勵(lì)程序,轉(zhuǎn)第六步,若j ^ InsNum,表示主控程序已經(jīng)為該待測試指令的所有指令模型生成第一測試激勵(lì)程序,若已經(jīng)為IN條待測試指令生成IN段第一測試激勵(lì)程序,轉(zhuǎn)第七步,否則,轉(zhuǎn)第六步,為下一條待測試指令生成第一測試激勵(lì)程序;
[0026]第七步,檢測從控程序同步標(biāo)志位SFlag,如果SFlag = I,表示從控程序處于等待狀態(tài),將第六步生成的IN個(gè)第一測試激勵(lì)程序全部發(fā)送到從控芯片地址為ADDR8的存儲空間,轉(zhuǎn)第八步;如果SFlag = 0,表示從控程序處于忙碌狀態(tài),轉(zhuǎn)第七步;
[0027]第八步,MFlag置為I,表示主控芯片進(jìn)入等待狀態(tài);
[0028]第九步,接收從控程序發(fā)送的IN個(gè)第二測試激勵(lì)程序,存入主控芯片地址為ADDR3的存儲空間;
[0029]第十步,主控程序根據(jù)RADDR2的值重載地址ADDR2并跳轉(zhuǎn)到地址ADDR2,順序執(zhí)行主控程序生成的IN個(gè)第一測試激勵(lì)程序,然后跳轉(zhuǎn)到地址ADDR3,順序執(zhí)行從控程序生成的IN個(gè)第二測試激勵(lì)程序,第一測試激勵(lì)程序執(zhí)行結(jié)果記錄在起始地址為ADDR4的存儲空間,第二測試激勵(lì)程序執(zhí)行結(jié)果記錄在起始地址為ADDR5的存儲空間;
[0030]第十一步,主控程序檢測從控程序執(zhí)行結(jié)果已返回標(biāo)志位ResultFlag,若ResultFlag = 1,表示從控程序已經(jīng)將從控芯片執(zhí)行的IN個(gè)第一測試激勵(lì)程序和IN個(gè)第二測試激勵(lì)程序執(zhí)行結(jié)果返回給主控芯片,轉(zhuǎn)第十二步;若ResultFlag = 0,表示從控程序還未將從控芯片執(zhí)行的IN個(gè)第一測試激勵(lì)程序和IN個(gè)第二測試激勵(lì)程序執(zhí)行結(jié)果返回給主控芯片,轉(zhuǎn)第十一步;
[0031]第十二步,對比主控芯片和從控芯片分別執(zhí)行IN個(gè)第一測試激勵(lì)程序和IN個(gè)第二測試激勵(lì)程序的結(jié)果,如執(zhí)行結(jié)果不同,轉(zhuǎn)第十三步;否則,LoopNuml增1,若LoopNumKMAXLOOPl,表示主控程序尚未達(dá)到程序預(yù)定的循環(huán)次數(shù),轉(zhuǎn)第四步,若LoopNuml ^ MAXL00P1,表示主控程序已經(jīng)達(dá)到程序預(yù)定的循環(huán)次數(shù),向調(diào)試主機(jī)返回完成信號,轉(zhuǎn)第十四步;
[0032]第十三步,記錄發(fā)生錯(cuò)誤的第一測試激勵(lì)程序或第二測試激勵(lì)程序以及主控芯片和從控芯片執(zhí)行第一測試激勵(lì)程序或第二測試激勵(lì)程序的結(jié)果,并將記錄內(nèi)容通過JTAGl傳給調(diào)試主機(jī);
[0033]第十四步,主控程序結(jié)束。
[0034]從控芯片為待驗(yàn)證的兼容芯片,從控芯片與調(diào)試主機(jī)和HPI總線相連。從控芯片通過JTAG2與調(diào)試主機(jī)相連,通過HPI總線與開發(fā)板上其它資源進(jìn)行通信。從控芯片從調(diào)試主機(jī)下載并運(yùn)行從控程序。
[0035]從控程序流程為:
[0036]1.與主控程序的第一步相同,定義敏感點(diǎn)集;在從控芯片地址空間中分別定義以ADDR6、ADDR7、ADDR8、ADDR9和ADDR10為起始地址的存儲空間,用于存放從控程序在后續(xù)執(zhí)行過程中臨時(shí)產(chǎn)生的數(shù)據(jù)和代碼,因?yàn)閺目爻绦蛟跍y試過程中生成多段第二測試激勵(lì)程序,在從控芯片上將會占用一片存儲空間,定義RADDR7等于ADDR7,RADDR7的值為所述多段第二測試激勵(lì)程序在從控芯片中存儲的起始地址,用于對地址ADDR7進(jìn)行重載;
[0037]2.與主控程序的第二步相同,定義指令模型和測試激勵(lì)模板;
[0038]3.定義程序循環(huán)變量LoopNum2 = 0,LoopNum2控制驗(yàn)證過程中從控程序隨機(jī)生成測試數(shù)據(jù)的循環(huán)遍數(shù),定義與主控程序相同的預(yù)定循環(huán)次數(shù)MAXLOOP2 (即MAXLOOP2等于MAXLOOPI);定義臨時(shí)變量k = O ;定義從控程序同步標(biāo)志位SFlag,SFlag為I時(shí)表示從控芯片已經(jīng)處于等待接收主控芯片發(fā)送第一測試激勵(lì)程序的狀態(tài);定義從控程序執(zhí)行結(jié)果已返回標(biāo)志位ResultFlag,ResultFlag為I時(shí)表示從控程序已經(jīng)將第一測試激勵(lì)程序和第二測試激勵(lì)程序執(zhí)行結(jié)果寫回到主控芯片存儲空間;
[0039]4.復(fù)位從控程序同步標(biāo)志位,即SFlag置0,ResultFlag置O ;
[0040]5.與主控程序的第五步相同,生成第二測試數(shù)據(jù),構(gòu)成第二測試數(shù)據(jù)集DataSet2,DataSet2存放在從控芯片中以ADDR6為起始地址的存儲空間;
[004