何正浩 李威震
(江蘇海洋大學(xué)電子工程學(xué)院 江蘇省連云港市 222005)
伴隨著集成電路技術(shù)的進(jìn)步,SoC 設(shè)計的規(guī)模和復(fù)雜性也隨之快速增長,此時對于驗證人員而言,高效、結(jié)構(gòu)化的驗證環(huán)境變得比以往任何時候都更加重要。在實際芯片驗證工作當(dāng)中,在人力資源分配方面,很多時候驗證人員是設(shè)計人員的1.5 倍,而對于實際工作量,“驗證人員的工作量基本占到整體驗證工作量的60%~80%”[1]。就通常情況而言,由于芯片設(shè)計的長周期特性,約在早期發(fā)現(xiàn)bug,所修補花費的成本也就越低,若是直至流片后才檢查出,有可能造成芯片報廢,需要重新更改設(shè)計后送交流片。這就對驗證工作提出了更高要求,盡可能提高驗證效率以滿足工作進(jìn)度需求,這就需要驗證組件具有較強的可復(fù)用性,在不同層級驗證時,驗證組件能夠復(fù)用,減少驗證人員工作量,從而加快對目標(biāo)模塊的仿真速度,以達(dá)到快速驗證,最終實現(xiàn)設(shè)計的快速迭代。
“對于驗證,最傳統(tǒng)的方法是直接使用Verilog 來編寫testbench”[2]。這種方法對于簡單的模塊尚可一用,在復(fù)雜的設(shè)計當(dāng)中,Verilog 就越來越力不從心。于是Verisity Design 公司(2005年被Cadence 收購)在2000年提出了e 語言,一種面向?qū)ο蟮木幊陶Z言。e 語言包括激勵生成,結(jié)果對比,覆蓋率模型等內(nèi)容。“這是業(yè)內(nèi)首次使用面向?qū)ο蟮木幊陶Z言來構(gòu)建驗證平臺”[3]。2002年,Verisity 提出了第一個驗證庫,eRM(elanguage Reusable Methodology)。“2003年Synopsys 公司推出了采用Vera 語言的RVM(Reuseable Verification Methodology) 驗證庫”[4]。2006年,Menter 公布了基于System C 的AVM(Advanced Verification Methodology)。
2006年,Synopsys 推出了基于新語言System Verilog 的VMM(Verification Methodology Manual), 放棄了Vera 語言。次年Cadence 公司也放棄e 語言,全面過渡至System Verilog,并退出URM(Universal Reusable Methodology)。
2008年,“Cadence 與Mentor 聯(lián)合推出開源的OVM(Open Verification Methodology)”[6]。2010年,Accellera 公 司 基 于OVM,推出了UVM(Universal Verification Methodology),UVM綜合了VMM 和OVM 的優(yōu)點,從VMM 中引入了寄存器解決方案。
2010年,“Synopsys 公司推出VMM1.2,這個版本參考了OVM 的TLM 通信機制和implicit phase,并進(jìn)一步優(yōu)化驗證流程”[7]。2011年,“Accellera 公司正式宣布了UVM 1.0 版本,同時得到各EDA 廠商的大力支持”[8],目前最新框架版本是1.2 版本,由于UVM 作為新一代驗證方法學(xué),沒有舊版本的兼容性負(fù)擔(dān),同時綜合過往驗證方法學(xué)的優(yōu)點,目前UVM 已成為驗證領(lǐng)域事實上的統(tǒng)一標(biāo)準(zhǔn)。
隨著驗證方法學(xué)的發(fā)展,作為硬件驗證語言(Hardware Verification Language,HVL)的最新成果,System Verilog 目前已經(jīng)成為使用最廣泛的IC 驗證語言。其綜合了Verilog,VHDL,C++的語法特性,兼容Verilog。此外在不斷演變過程中OpenVera發(fā)展成為SystemVerilog 中硬件驗證語言子集,進(jìn)一步擴展了語言特性。2005年,SystemVerilog 獲批成為IEEE 1800-2005 標(biāo)準(zhǔn)。當(dāng)時Verilog 作為IEEE 1364-2005 標(biāo)準(zhǔn)尚獨立存在。2009年,SystemVerilog 與的Verilog 進(jìn)行了合并,成為了新的IEEE 1800-2009 標(biāo)準(zhǔn)。現(xiàn)在的最新標(biāo)準(zhǔn)是IEEE 1800-2012 標(biāo)準(zhǔn)。
UVM 自身主要給出一套驗證標(biāo)準(zhǔn)庫,包含常用的基類和方法,這使得驗證人員在搭建驗證環(huán)境時,它的結(jié)構(gòu)得以標(biāo)準(zhǔn)化。由于驗證常常需要眾多人員共同參與,一個標(biāo)準(zhǔn)化且組織良好的testbench結(jié)構(gòu),一致性的驗證平臺就顯得尤為重要。同時可以減少多個驗證工程師完成的驗證工作之間的質(zhì)量差距。UVM 給出了一種方法來提高驗證的工作效率,驗證代碼的可移植性以及EDA 軟件與VIP之間的互操作性。UVM 的所有功能并非都能適用于所有情況,UVM 的應(yīng)用取決于用戶和設(shè)計環(huán)境。
UVM 提供一系列的標(biāo)準(zhǔn)單元組件包括:Sequence 和Sequencer,負(fù)責(zé)激勵的產(chǎn)生。Sequence 會借助SV 的隨機化方法,產(chǎn)生符合要求目標(biāo)數(shù)量和要求的事務(wù),每個事務(wù)的數(shù)據(jù)均不相同。transaction 經(jīng)由Sequencer 發(fā)往Driver。Sequencer 是uvm_component 類型,其自身并不產(chǎn)生激勵,作用是作為sequence 與driver 之間的管道。transaction 是封裝好的一組數(shù)據(jù),一般是按照總線通信協(xié)議要求的各種參數(shù)的數(shù)據(jù)包。Driver 承擔(dān)向Sequencer發(fā)出請求的責(zé)任,不斷地要求transaction,除非仿真停止,否則這一過程會一直進(jìn)行下去。在拿到事務(wù)數(shù)據(jù)后,driver 利用TLM 通信機制把收到的事務(wù)數(shù)據(jù)轉(zhuǎn)化為實際信號發(fā)送給DUT。Monitor 負(fù)責(zé)的內(nèi)容與driver 相反,monitor 負(fù)責(zé)從DUT 上采集信號,并轉(zhuǎn)化為transaction 交給scoreboard。Agent 自身沒有實際的操作內(nèi)容,它主要用于將sequencer、driver 和monitor 進(jìn)行一個簡單封裝,便于不同項目或仿真層次下,相同協(xié)議模塊的復(fù)用,以減少驗證人員的工作量,優(yōu)化工作效率。Reference module 是用于模擬DUT 的功能,它會將和DUT 接收相同的數(shù)據(jù),并將各自輸出交由scoreboard進(jìn)行比較。Environment 是對整個驗證環(huán)境的封裝,便于復(fù)用。
UVM 的主要特性:
(1)UVM 加入了Phase 機制,利用這一機制,即可在仿真階段就開始進(jìn)行組件層次化。
(2)UVM Factory 機制的存在使得在驗證環(huán)境中替換實例和類型更容易、更靈活。但是被替換的組件必須與被替換的組件兼容。
(3)在UVM 則通過objection 機制來控制驗證平臺的關(guān)閉。
(4)利用域的自動化有關(guān)的宏,可以簡化對象的復(fù)制。
(5)config 提供這樣一個機制,來實現(xiàn)仿真時的環(huán)境控制。
本文的待設(shè)計模塊是soc 系統(tǒng)當(dāng)中的一部分。設(shè)計是基于平頭哥的無劍100 開源平臺實現(xiàn)音頻播放,無劍100 開源平臺是一個以E902 為核心的soc 系統(tǒng),此平臺搭載了gpio,uart,iic 等基礎(chǔ)外設(shè)模塊,內(nèi)部也集成了DMA 等模塊,功能較為齊全。設(shè)計就是在此平臺基礎(chǔ)之上實現(xiàn)MP3 播放。采用sd card 存放MP3 文件,在sd card 上掛載FATFS。通過FATFS 來讀取MP3 文件,使用開源的helixMP3 解碼庫,helix 是一個定點的解碼庫,其占用內(nèi)存較小,比較適合用在小型的32 位處理器上。解碼之后的數(shù)據(jù)通過DMA 復(fù)制到IIS 模塊,而CPU 與此同時繼續(xù)解碼,并行工作,增強CPU 工作效率。此外添加了vga 顯示模塊,用于實時展示播放狀態(tài)和簡單外部按鍵操作提示。至此實現(xiàn)了一個完整的應(yīng)用場景。
本模塊是屬于音頻傳輸部分。在CPU 對音頻數(shù)據(jù)解碼完成后,即可將解碼后的數(shù)據(jù)傳輸給本模塊,本模塊負(fù)責(zé)將從ahb 接收到的數(shù)據(jù)緩存并轉(zhuǎn)換為iis 接口格式的數(shù)據(jù),隨后發(fā)送給音頻芯片。功能可以概括為協(xié)議轉(zhuǎn)換,狀態(tài)寄存器控制,fifo 數(shù)據(jù)緩存,數(shù)據(jù)發(fā)送。
之所以只用fifo 是由于ahb 與iis 時鐘處在不同時鐘域,解決跨時鐘域問題。在CPU 利用AHB 端口發(fā)送數(shù)據(jù)時,本設(shè)計會檢測ahb 控制信號,判斷是否選通當(dāng)前設(shè)計,trans,write 是否有效,將檢測后的數(shù)據(jù)寫入狀態(tài)寄存器,作為fifo 的控制使能。而fifo 的時鐘自然為ahb 時鐘,同時fifo 會返回一個狀態(tài)信號給hrdata。
對于數(shù)據(jù)發(fā)送,模塊首先檢測IIS LRC 字段選擇信號的跳變,在這里我們默認(rèn)左右聲道數(shù)據(jù)相同。檢測IIS CK 串行時鐘線,利用計數(shù)器,作為數(shù)據(jù)指針將數(shù)據(jù)并轉(zhuǎn)串發(fā)送數(shù)據(jù)。
I2S 模塊接口如圖1所示。

圖1:I2S 模塊接口
驗證實現(xiàn)完成了對接口模塊、事務(wù)級建模、序列發(fā)生器、驅(qū)動器、監(jiān)視器、代理器等模塊的編程設(shè)計。interface 接口模塊是用于連接硬件和軟件部分的橋梁。一般將模塊接口信號在interface 中定義為logic 類型,通過運用modport 來設(shè)置信號的傳輸方向。利用clocking,基于時鐘周期對信號進(jìn)行驅(qū)動和采樣,同時可以一定程度上避免信號競爭。利用clocking 進(jìn)行事件同步。通過定義clocking skew(時鐘偏移量),一般定義輸入采樣為負(fù)值,輸出驅(qū)動為正值。這樣形成事件時間前后的采樣驅(qū)動可以有效避免出現(xiàn)信號競爭。如代碼所示,在這其中我們定義輸入驅(qū)動延時1ps,輸出采樣延時1ps。
接口設(shè)計中部分代碼如下:

驗證仿真工具是采用Mentor 公司的Questa Sim 2020.1。Questa與通常熟知的Modelsim 仿真軟件類似,Questa 是其的升級版,主要是對UVM 的支持更好。驗證過程是采用Makefile 腳本自動管理。通過Questa 通過的命令接口,以命令行的形式來控制仿真的過程。這種方法簡化了復(fù)雜的圖形化界面操作,自動創(chuàng)建過程并添加文件,啟動仿真并添加波形。
使用vlib 指令創(chuàng)建環(huán)境,通過vlog 語句來編譯目標(biāo)文件,在這里要注意,uvm 驗證環(huán)境當(dāng)中類的編譯順序是有要求的,底層的要先編譯,高層的后編譯。隨后利用vsim 語句來啟動仿真,使用附加指令-do,來添加tcl 腳本實現(xiàn)自動添加波形;“使用+UVM_TESTNAME 來指定當(dāng)前仿真的測試激勵”[12]。目前版本需要添加附加選項-voptargs=+acc 來避免設(shè)計被優(yōu)化導(dǎo)致仿真結(jié)果不符合要求。
I2S 時鐘為11.025kHz,量化位寬16bit,DACLRC 則為BCLK的32 分之一,約為344.53Hz。I2S 模塊等待LRC 的跳變邊沿,利用邊沿檢測,在每次下降沿觸發(fā)傳輸。利用移位寄存器進(jìn)行并串轉(zhuǎn)換,隨后發(fā)送至輸出端口。
通過自主搭建一個UVM 驗證環(huán)境,實現(xiàn)按預(yù)定要求生成激勵數(shù)據(jù),并發(fā)送,基本完成設(shè)計目標(biāo)。UVM 極大的提高了驗證的工作效率,每個模塊都是標(biāo)準(zhǔn)的輸入輸出,通過總線互聯(lián)矩陣來進(jìn)行連接。針對不同速率的傳輸,未來需要添加對應(yīng)的時鐘切換模塊,切換時要考慮到時鐘穩(wěn)定時間,切換結(jié)果的確認(rèn);同時對于時鐘切換,需要設(shè)置對應(yīng)的配置寄存器,并開放給CPU 訪問。設(shè)計改進(jìn)需要添加狀態(tài)寄存器,反應(yīng)當(dāng)前模塊的傳輸狀態(tài)信息,提高整個設(shè)計的處理效率。