
摘 要: 基于VMM方法學設計和實現了一個隨機驗證環境,驗證一個64位ALU。該驗證環境具備一套功能完備的隨機測試程序發生器,可以生成覆蓋率指導的有約束的定點、浮點指令序列,調用一個由C語言實現的參考模型進行運算結果自檢,并采用覆蓋率收斂技術實現覆蓋率快速收斂。實踐結果表明,設計的隨機驗證環境,能夠高效驗證ALU的各項邏輯功能,減少測試時間,且隨機測試程序生成模塊可以簡單移植應用于處理器其他模塊的功能驗證。
關鍵詞: SystemVerilog; VMM; 驗證; 算數邏輯單元
中圖分類號: TN407?34 文獻標識碼: A 文章編號: 1004?373X(2015)07?0144?04
隨著高性能處理器設計日趨復雜,如何對處理器各設計模塊進行有效而充分的驗證,是芯片設計成功的關鍵因素之一[1]。目前芯片的研發過程中,功能驗證會消耗70%以上的資源,驗證的自動化程度、驗證語言的使用、驗證平臺的可重用性等問題都嚴重制約著驗證的進度。為此,Synopsys推出了VMM(Verification Methodology Manual)驗證方法學解決了上述問題。VMM使用SystemVerilog驗證語言,采用了覆蓋率主導、隨機約束生成、基于斷言的層次化驗證結構。本文圍繞Synopsys的VMM,構建了一個ALU(Arithmetic Logic Unit,算術邏輯單元)的隨機驗證環境。
1 DUT
ALU是微處理器中最重要和最常用的部件之一,它是集多種算術功能和邏輯功能于一體的單元電路[2]。一般來講,微處理器內部主要由數據通路和控制通路兩部分組成,ALU是數據通路的重要組成部分,是微處理器的核心功能部件,對微處理器性能具有決定性的影響[3?6]。
該環境驗證了一款高性能處理器的64位ALU,其支持123條定點、浮點運算指令。ALU接收Decode(譯碼)模塊的譯碼信息(包括指令類型、寄存器號、線程號等控制信息),從下級模塊Register File(寄存器堆)相應位置取出操作數進行運算。其控制邏輯alu_ctrl分為salu_ctrl和calu_ctrl兩個模塊,分別控制SALU和CALU。ALU內部結構如圖1所示。
圖1 ALU內部結構
SALU的控制模塊將定點和浮點比較/選擇指令的r stage譯碼信號轉換成fx1 stage的控制信號,并根據ELU(Error Logic Unit,異常邏輯單元)的flush指示判斷是否將salu_dph的運算結果寫回寄存器堆。SALU的data_path負責定點指令(乘加/除法除外)和浮點選擇/比較類指令的執行,執行流水線經歷fx1→fx2→fx3→w。
CALU的控制模塊將定點乘法/除法和浮點乘加/除法、開方、轉換、舍入指令的r stage譯碼信號轉換成fx1 stage的控制信號,同樣的也根據ELU是否發生flush決定是否寫回calu_dph的運算結果。CALU的data_path負責浮點運算指令(加減、乘法、除法、開方、舍入、轉換)和定點乘加、除法的執行。執行流水線有3條:
(1) 定點乘加類指令,流水線經歷fx1→fx2→fx3→fx4→fx5→fx6→fw;
(2) 浮點乘加、加減、舍入、轉換運算,流水線經歷fp1→fp2→...→fp8→fpw;
(3)浮點除法、定點除法運算、浮點開方運算,為Blocking執行,經歷34個cycle。
考慮到定點與符點運算的指令類型非常多,控制信號的數量龐大,對該模塊各種輸入信息的隨機控制非常繁瑣復雜,而且測試過程中很多功能點的驗證容易遺漏,所以采用了從Decode模塊開始注入激勵的驗證方案,即DUT為Decode、ALU、Register File三個模塊。這樣可以直接對DUT注入十六進制指令碼,而不需要對ALU的控制信號逐一約束,采用這種方案極大地減少了隨機信號生成的工作量,測試的覆蓋點也非常全面且容易控制。
2 基于VMM的ALU驗證結構
基于VMM的ALU驗證需充分利用VMM的特點,即有約束的隨機激勵生成,自動數據對比檢查和功能覆蓋率收集。
2.1 有約束的隨機激勵生成
VMM提供了有約束的隨機數生成。根據指令語意將ALU指令集進行分類,這樣可以通過一定的約束隨機的生成指令以及指令所需的參數[7?8],在下一節的指令生成中會詳細介紹指令的分類及指令參數的生成方法。指令生成后,需要通過一個由C代碼實現的匯編器對指令進行處理,這樣匯編指令可以實時轉化為十六進制代碼,并可以直接讀入DUT進行仿真測試。
2.2 自動數據對比檢查
由于ALU是進行各種算數運算和邏輯運算的部件,傳統的注入匯編代碼,通過觀測仿真波形來確定結果正確性的驗證方法需要消耗大量人工成本,而且測試數量非常有限,不適用于遞歸以及大量Test Case的驗證,所以需要一個參照模型能夠生成對應的參照結果,以便快速找出bug。驗證環境里實現了一個用C語言描述的ALU參照模型。該模型以十六進制指令碼作為輸入,在每條指令執行完畢后會寫出對應參考結果。ALU通過Register File來保存數據和狀態,可以通過對比Register File的內容,來保證ALU的每一條指令的工作狀態都是和參考模型是一致的。驗證環境可以讀出ALU執行指令后的運算結果并傳遞給Scoreboard,環境里C參考模型執行的每一條指令的結果也都會保存下來供Scoreboard讀入,Scoreboard可以實現運算結果的自動對比,并且在log中打印出來。
2.3 覆蓋率收集
為設計中的特征單獨編寫一套定向測試的方法需要人工編寫代碼,這需要消耗大量的時間和精力,并且很難統計指令的執行情況,依靠這種方法得到滿意的覆蓋率非常困難。基于VMM的驗證環境中,鑒于C模型與DUT實現的功能相同,可利用C模型的運行結果來實現對指令執行情況的統計。由于在每條指令執行完畢后都會自檢,可將C模型執行的結果作為功能覆蓋率的采集點,根據DUT的設計特征、需要使用的輸入條件等信息提取出覆蓋率模型,在仿真執行過程中自動收集,仿真結束后將所有測試用例的覆蓋率信息合并,給出最終的覆蓋率結果[9?10]。一般來說,要求代碼覆蓋率及功能覆蓋率都需要達到100%。
3 驗證環境各功能模塊的具體實現
基于VMM,實現了一個64位ALU的隨機驗證平臺,該平臺能夠隨機產生長度可控的定點和浮點指令序列,并在每一條指令執行結束后進行結果對比檢測,圖2即為該驗證的詳細框圖。下面將該平臺的詳細實現加以介紹。
圖2 驗證平臺框圖
3.1 指令生成及Generator模塊
該64位ALU的設計基于ARMv8架構,支持所有的ARMv8定點和浮點指令。首先根據功能對指令分類,如Arithmetic(immediate)類指令包括ADD、ADDS、SUB、SUBS、CMP、CMN、MOV這7條指令。而對于ADD指令,根據操作數還分為兩種情況:
ADD Wd|WSP, Wn|WSP, #aimm
Add(immediate): Wd|WSP = Wn|WSP + aimm.
ADD Xd|SP, Xn|SP, #aimm
Add(extended immediate): Xd|SP = Xn|SP + aimm.
這就需要對位寬進行約束,代碼如下:
constraint c_width_sel
{
width_sel inside {32, 64};
}
另外,還要對寄存器號進行約束,代碼如下:
constraint c_reg_num
{
source_reg_num0 inside {[0:31]};
dest_reg_num0 inside {[0:31]};
}
對立即數的范圍進行約束,代碼如下:
constraint c_aimm
{
aim inside{[0:2047]}
}
對寄存器間的依賴關系也可以進行約束,代碼如下:
constraint c_correlation_S0
{
S0_correlation_mode_sel inside {′S_NONE, ′S_S, ′S_D};
S0_correlation_depth inside {[0:′CORRE_DEPTH - 1]};
S0_corre_select inside {0, 1};
S0_corre_select dist {0:=10, 1:=10};
}
確定了指令類型,隨機得到指令助記符、指令相關參數,在以上約束下便可以生成一條滿足語法要求的指令[11]。在測試用例中對指令配比、地址、數據等信息進行約束,便能夠控制Generator生成的指令。通過變換隨機種子就可以生成各種各樣不同的指令序列。驗證環境里可以改變各類指令的配比,寄存器關聯模式的配比,以便將一些邊緣情況測到。得到了匯編指令序列后,通過匯編器,將匯編指令編譯成十六進制指令碼。為了方便Scoreboard進行結果比對,隨機環境還利用腳本處理,將生成的匯編指令的助記符提取出來以確定指令執行的時鐘周期長度。此外,Generator還可以隨機獲取線程號、分支預測指令的目的地址、方向等信息。
3.2 Driver模塊
Driver實現的功能比較簡單,將Generator產生的十六進制代碼及其他隨機參數依次送入DUT中。另外,Driver也可以直接從外部文件得到asm代碼或十六進制代碼,這樣已有的ALU測試程序都可以在這個環境中直接調用。
3.3 Assert模塊
Assert用于加強環境的驗證能力,使用它可以很容易對設計者期望的行為進行描述,并在環境中捕捉設計者的這些期望,代碼如下:
assert(valid = 1)
3.4 Scoreboard
Scoreboard根據Decode模塊譯碼出來的目的寄存器號,從Register File中相應的位置取出寄存器的值,與ALU的C模型運算出來的寄存器結果作對比。由于ALU模型寫出的值是每條指令執行之后的值,而Register File傳遞過來的數據是每個時鐘周期的值,為了保證結果對比的正確性,必須確定好結果對比的時機。這里根據Generator模塊生成的助記符可以確定該條指令執行的時鐘周期長度,Scoreboard不但要負責解讀C模型運算出的參照Register File的結果文件,還要從Register File模型傳遞過來的數據中選取該指令執行完畢后的一個時鐘周期的數據與參照數據進行對比,如果對比失敗,Scoreboard的自檢機制會終止測試。需要補充的是,因為DUT是由時鐘驅動,而C語言實現的參照模型不帶時序關系,有些指令運算結束后可能會亂序提交執行結果,這就需要根據具體情況做出時序調整。
3.5 C模型
環境中使用了匯編器和仿真器兩個C模型。由Generator生成的指令代碼會被寫入asm文件,通過makefile調用一個由C語言實現的匯編器來處理該asm文件,生成一個HEX代碼文件,命令如下:
aarch64?linux?gnu?objdump ?D asm_file > hex_file
Generator再讀入這個HEX代碼并傳送給下級模塊。
仿真器是用C語言實現的ALU模型,該模型可以實時寫出每一條指令執行結束后Register File的狀態,這是判斷ALU的運算結果是否正確的依據。驗證環境通過DPI調用C函數的代碼如下:
import \"DPI?C\" function void AddsIm32(input bit [31:0] inst, input bit [1:0] threadid)
3.6 功能覆蓋率模型
對于ALU這樣的DUT,代碼覆蓋率已經不能夠代表驗證進度,需要把重心放到功能覆蓋率的收斂上。VMM驗證方法學的核心優勢是具備了功能覆蓋率驅動的隨機約束能力,能夠比較方便地得到更高的功能覆蓋率。
為了使ALU的功能覆蓋更快收斂,使用了兩種方法:
一是改變隨機種子,如圖3所示。由于運行一次仿真,只能測試到一種配置、一次激勵,得到相應的功能覆蓋率,那么每次仿真,可以通過命令選項的形式來制定不同的隨機種子(Random Seed),從而改變生成的隨機變量,以得到不同的配置來測試與前一次不同的功能,命令如下:
vcs +ntb_random_seed = 999 …
通過腳本控制,可以實現自動運行多次仿真,并且每次仿真都使用不同的隨機種子,這樣可以在某種程度上降低重復的隨機變量的生成,快速達到較為理想的功能覆蓋率。然而這種方式存在一定弊端,即仿真運行的次數無法事先確定,需要人為判斷覆蓋率的收斂情況,再確定是否需要繼續執行仿真,及執行次數,這是個需要重復多次的過程。而且通過變換隨機種子的方式來控制隨機變量的生成,具有一定盲目性,并存在較多的重復配置,因此功能覆蓋率的收斂仍然需要較多的運行次數,增加了總的運行時間。
鑒于改變隨機種子的收斂方法的弊端,在后續的測試中采用了第二種方法,即功能覆蓋率收斂技術(Coverage Convergence Technology,CCT),如圖4所示,這是Synopsys公司推出的一項技術[9]。與改變隨機種子方法的思路一樣,CCT的基本原理同樣是根據每次仿真后的Coverage值來控制下一次隨機變量的生成,所不同的是不再是簡單地改變隨機種子,而是會根據當前的覆蓋率來指導測試向量的生成,減少重復的測試向量生成,以便實現覆蓋率的快速收斂。
圖3 改變隨機種子的 圖4 CCT驗證流程
方法的驗證流程
通過腳本可以在覆蓋率結果與測試向量生成之間形成一個反饋環路,避免了手動反饋覆蓋率帶來的大量時間精力消耗,在功能覆蓋率達到理想狀態時可以自動停止仿真。實現CCT需要如下兩個步驟:首先,將 DUT設計結構的功能點及需要隨機的輸入條件等信息提取來建立功能覆蓋率模型,即在驗證平臺里將需要監測的隨機變量定義覆蓋組和覆蓋點,然后在類里對這些變量進行創建和隨機,同時對已建立的功能點進行采樣。其次,腳本控制過程分為四個階段實現功能覆蓋率的收集與反饋,一是在編譯時加上?ntb_opts cct選項,去掉+ntb_random_seed 選項;二是首次運行仿真,建立覆蓋率反饋控制的偏差記錄;第三多次運行仿真,每一次的仿真過程中,Synopsys的VCS仿真工具中的CCT功能,可以實現通過當前覆蓋率反饋指導隨機變量生成,進一步減少重復的測試向量生成,加速功能覆蓋率的收斂,節省了流片前的寶貴時間[12];最后利用腳本提取每次仿真后的功能覆蓋率增加情況,并判斷覆蓋率是否已收斂,若收斂則自動終止仿真。
4 結 語
本文實現了一個基于VMM的ALU隨機驗證環境。該環境不但可以生成隨機指令作為DUT和C模型的輸入,也可以使用已有的測試程序;另外提供了Register File檢測環境,可以在每一條指令執行后檢查Register File 的值,從最全面角度保證每條指令執行結果的正確性;此外還建立了功能覆蓋率模型,收集覆蓋率信息。
參考文獻
[1] 張瑾,王劍.基于龍芯2F處理器的硬件驗證平臺的設計與實現[J].計算機工程與科學,2009(z1):270?275.
[2] 游肖君.高性能ALU優化設計研究[D].西安:西安電子科技大學,2009.
[3] 雷普紅.高速算術邏輯部件的設計與驗證[D].長沙:國防科學技術大學,2006.
[4] 王大宇.高性能浮點加法器的研究與設計[D].南京:南京航空航天大學,2012.
[5] 王重陽.單、雙、擴展精度自適應浮點乘、除和開方運算單元的實現[D].北京:華北電力大學(北京),2011.
[6] 梅家祥.64位流核心運算部件的設計與實現[D].長沙:國防科學技術大學,2012.
[7] 潘能剛,曾凡平,曹青.隨機測試用例的自動化生成和約簡[J].小型微型計算機系統,2011(10):2035?2040.
[8] 于伽,黑勇,陳黎明.隨機測試程序發生器的設計與實現[J].微電子學與計算機,2012(7):103?111.
[9] 黃思遠,邵智勇,于承興,等.VMM中功能覆蓋率收斂技術[J].現代電子技術,2010,33(4):16?21.
[10] 石君友,王璐,李海偉,等.基于設計特性覆蓋的測試性定量分析方法[J].系統工程與電子技術,2012(2):418?423.
[11] 朱思良.基于VMM驗證方法學的MCU驗證環境[J].中國集成電路,2011(1):53?59.
[12] 沈海華,衛文麗,陳云霽.覆蓋率驅動的隨機測試生成技術綜述[J].計算機輔助設計與圖形學學報,2009(4):419?431.