陳琳娜, 孟建熠, 林志濤
(1.浙江大學 電氣工程學院,浙江 杭州 310027; 2.復旦大學 微電子學院,上海 201203)
提高芯片的驗證效率至關重要[1],現有的驗證平臺大部分是基于通用驗證方法學(universal verification methodology,UVM)環境開發的[2],然而驗證組件的實現與被測器件(device under test,DUT)緊耦合,導致其可重用性需要通過更改或替換已有驗證平臺的部分代碼來實現[3,4];另一方面,在一個含有上千個測試用例的大型項目里,仿真測試需要的時間變得很長。因此如何提高驗證組件代碼的可重用性和縮短測試用例仿真時間已成為驗證平臺開發的困難與挑戰之一。標準化串行總線接口作為設備之間信息交流的主要通道,是片上系統(system on chip,SOC)芯片不可缺少的部分[5]。針對廣泛應用的串行總線協議,以及現有的UVM驗證組件代碼可重用性差和仿真時間長等缺陷,本文提出了一種面向串行總線協議的層次化公用庫設計,同時對UVM transaction定義進行改進,加快仿真速度,實現了快速驗證。
UVM繼承了 SystemVerilog驗證語言面向對象的思想,實現了驗證的重用性和清晰的層次結構。UVM常用類的層次結構如圖1所示[6,7]。
公用庫的設計是將環境模型和功能模塊抽象出來,定義為可重用的通用庫文件。串行總線協議通常具有共性:1)支持主從或對等模式;2)支持大端或小端;3)支持同步或異步模式。
層次化的公用庫主要基于驗證平臺的重用層級來進行建模和管理,主要分為以下幾個層級建模:1)事務級建模;2)組件級建模;3)功能級建模。圖2為在原有的庫基礎上添加的層次化公用庫。

圖1 UVM常用類層次結構

圖2 層次化公用庫類
2.1.1 事務級建模
該層次的建模主要包括具體協議內容的transaction定義以及相關語義類型定義,一個標準串行總線協議的transaction通常是定義一些數據包類型,數據傳送格式,數據傳送長度等基礎內容。
2.1.2 組件級建模
該層次的建模與協議內容無關,主要包括驗證組件基本功能的實現。組件級的建模包括:
1)lib_driver:所有協議的driver設計都有一個共同功能:當檢測到一個復位信號到來時,立刻退出所有的接口驅動。可以設計一個公用組件lib_driver派生自driver,并在該組件中加入該功能。
2)lib_monitor:該組件派生自monitor, 不同的協議對接口的monitor方式各不同,故在該組件中加入一個虛函數并通過無限循環來不斷收集DUT 接口的輸出。
3)lib_scoreboard:該組件派生自scoreboard,用于比較期望數據和實際數據。可在lib_scoreboard中聲明2個imp端口,同時另設2個 Buffer 用于緩沖數據。在check_phase里檢查Buffer是否為空。
4)lib_test:該組件派生自uvm_test,并包含基本功能:a.設置整個驗證平臺的超時退出時間;b.設置用例跑的次數;c.在report_phase中根據UVM_ERROR的數量來打印不同的信息。
2.1.3 功能級建模
該層次的建模主要包括協議通用的功能和任務函數。串行總線協議的通用函數包括:
1)傳輸起始與停止條件:主從模式下的串行協議,起始和停止條件由主機產生;對等模式則由發送模式產生。無論是何種模式,都需要實時監測起始與停止條件。這些過程可封裝成公用函數。
2)時鐘線驅動:同步傳輸模式下的串行協議,需要時鐘信號確定同步傳輸的速度;異步傳輸通過配置波特率對時鐘進行采樣。該過程可封裝成公用函數實現不同頻率的時鐘產生。
3)數據線驅動/監測:同步傳輸模式下,不同的時鐘極性和相位決定了在時鐘不同的跳變沿對數據線進行驅動或監測;異步傳輸數據的驅動與監測由采樣時鐘確定。數據傳輸有大端和小端模式。該過程可封裝成公用函數。
UVM各個組件之間的信息傳遞基于transaction。transaction中數據變量通過Field-Automation宏機制注冊,簡化了transaction的處理過程[8]。
Field-Automation宏機制的實現過程如圖3所示。′uvm_object_utils_begin()為宏開始定義,用于注冊transaction類,該宏擴展為一個內部方法: __m_uvm_field_automation()。′uvm_filed_*系列宏體用于注冊transaction內部定義的變量[9],每個宏體的聲明都會擴展成一個case語句的實現。當用戶調用print,copy,compare等函數對transaction進行處理時,如果該transaction使用了Field-Automation機制,那么這些函數就會自動調用內部方法,并把第二個參數what_設置成對應的函數處理字段。宏體的聲明導致相應case語句分支操作的執行,而分支操作里的函數又通過調用其他方法實現。過長的調用路徑導致過多的冗余代碼執行,使得測試用例的運行時間和調試難度大大地提高。

圖3 宏的實現
UVM庫里提供另一種方法來實現函數print,copy,compare,pack,unpack,即do_
do_compare的重寫只需添加下面幾行代碼即可實現compare的功能:
function bit do_compare(uvm_object rhs);
transaction rhs_;∥transaction為自定義的類
do_compare=(S|cast(rhs_,rhs)&&addr==rhs_.addr);∥添加要比較的變量
endfunction
相比原有的transaction定義,改進的transaction定義沒有宏體的聲明,避免了過長的路徑調用;重寫的do_
本文以通用串行接口(universal serial interface,USI)模塊的快速驗證為例,對文中提到的方法進行評估。USI 為自行開發,該模塊包括了高級外圍總線(advanced peripheral bus,APB)接口,寄存器TX FIFO和RX FIFO,功能模塊(UART,I2CM,I2CS,SPIM,SPIS)和串行接口,通過配置控制寄存器,可使相應的功能模塊工作,實現了UART, I2C, SPI 3種協議。
基于層次化公用庫的思想和高效的transaction定義,設計了如圖4所示的USI模塊驗證平臺。該平臺構建了APB UVC,INTR UVC,Reset UVC,DMA UVC(Reset UVC和DMA UVC圖中未標出),包含SPI ,I2C,UART UVC的Peripheral。SPI ,I2C,UART UVC均有2個Monitor port,分別用于傳遞期望的數據和實際的數據。Reference model包含了TX,RX FIFO,APB,SPI,UART,I2C等模型,功能行為與DUT一致。 用戶在case里通過寄存器模型操作APB_UVC配置控制寄存器選擇相應的功能模塊。寫操作時,APB UVC向DUT TX FIFO寫數據,寫入當前數據同時也傳給reference model的TX FIFO模型,根據配置選擇相應的功能模型(SPI,I2C或UART)讀出數據,發送給Scoreboard,作為期望的數據;實際的數據則是設備UVC監測DUT接口得到的數據。讀操作時,通過case啟動sequencer,將得到的transaction數據寫入reference model RX FIFO, 并通過APB模型讀出發送給Scoreboard,作為期望的數據;實際的數據由寄存器模型操作APB UVC讀取DUT的RX FIFO數據。
USI驗證以高效性為原則。原有的驗證平臺的代碼量有一萬行之多,基于公用庫的驗證平臺將代碼量減少到數千行之內,60 %以上的功能代碼可通過調用公用庫實現。由于使用了公用庫,驗證不同串行總線IP時,驗證工程師只需在此基礎上進行功能擴展,實現了驗證組件可重用性。

圖4 USI驗證結構
與傳統的transaction定義方法相比,改進的transaction定義縮短了仿真運行時間。表1列出在回歸測試之前相同測試用例下,2種不同的transaction定義對仿真時間的影響。I2C,SPI模塊對transaction的操作相對復雜,調用了copy,compare,print函數,與改進前的transaction定義相比,仿真速度提升了6 %~7 %左右;而UART模塊相對簡單,對transaction的處理次數少,仿真速度只提升了3 %。

表1 仿真時間對比
圖5為同期開展的USI回歸測試2種不同transaction定義,達到規定覆蓋率要求所需驗證時間的對比結果。可以看出,使用改進的transaction 的驗證平臺在50 h左右的測試時間內,完成USI模塊100 %的功能覆蓋率驗證,96.6 %的代碼覆蓋率驗證;使用Field-Automation機制的transaction 驗證平臺則在56 h左右達到相同的覆蓋率。測試結果表明,改進的transaction定義使USI驗證時間縮短10.7 %。對于在大型的驗證項目中,對transaction處理的次數越多,仿真速度提升效果將會越明顯。

圖5 不同transaction定義達到96 %覆蓋率所需驗證時間
本文設計了一種面向串行總線的層次化UVM驗證平臺。相對于已有的UVM驗證平臺,引進了公用庫的概念,使得驗證平臺能最大限度重用,同時對傳統的transaction定義進行改進,縮短了仿真測試時間。實驗表明:基于公用庫的多標準串行總線協議驗證平臺和改進的transaction定義使驗證效率得到了提升。下一步將根據配置文件,用腳本自動生成公用庫,實現驗證組件的自動化生成。