馬 鵬,劉 佩,張 偉
(華東計(jì)算技術(shù)研究所,上海 201808)
SoC (System on Chip)產(chǎn)品研發(fā)一般采用正向設(shè)計(jì)方法,產(chǎn)品的開(kāi)發(fā)流程包括:項(xiàng)目策劃、系統(tǒng)說(shuō)明以及行為描述、RTL 描述、前端仿真、后端設(shè)計(jì)、流片階段、出樣等[1].項(xiàng)目策劃階段會(huì)對(duì)市場(chǎng)需求進(jìn)行調(diào)研,形成產(chǎn)品規(guī)格書(shū).在系統(tǒng)說(shuō)明及行為描述階段,確定設(shè)計(jì)對(duì)象和目標(biāo),明確芯片功能、內(nèi)外部性能要求等,從而定制RTL 代碼.本文以一款工控CPU 芯片研制為例,芯片內(nèi)部需要集成CPU 核以及大量的外設(shè)(如SPI、I2C、UART、CAN、SPI、PCIE、USB、DMA 等),在RTL 描述階段將整體任務(wù)劃分為各個(gè)子模塊實(shí)現(xiàn),根據(jù)任務(wù)書(shū)的需求分析,通用性IP 配置達(dá)不到目標(biāo)需求.因此,這部分模塊只能通過(guò)自研的方式實(shí)現(xiàn).而自研代碼相比較于成熟IP 而言可靠性不高,風(fēng)險(xiǎn)大,必須依靠前仿驗(yàn)證保證RTL 代碼功能的完善完備性,前仿任務(wù)艱巨繁重.
傳統(tǒng)的驗(yàn)證方法[2],需要驗(yàn)證人員具備豐富的經(jīng)驗(yàn),人的因素很大,進(jìn)度不可控,難以滿足復(fù)雜的SoC驗(yàn)證需求.目前,市場(chǎng)上流行的驗(yàn)證方式是UVM (Universal Verification Methodology)驗(yàn)證方法學(xué).
UVM 驗(yàn)證方法學(xué)[2],由Accellera 于2011年2月推出,以SystemVerilog類庫(kù)為主體的驗(yàn)證平臺(tái)開(kāi)發(fā)框架,繼承了VMM和OVM的優(yōu)點(diǎn),構(gòu)建的驗(yàn)證環(huán)境具備可重用組件構(gòu)建標(biāo)準(zhǔn)化和層次化特性,并且得到了Synopsys、Mentor和Cadence 公司的支持,EDA 環(huán)境構(gòu)建完善.它目前已經(jīng)得到市場(chǎng)的驗(yàn)證,現(xiàn)在市面上很多IC 設(shè)計(jì)公司都已經(jīng)在使用[1].UVM 方法學(xué)的特點(diǎn)是能夠產(chǎn)生帶約束的隨機(jī)測(cè)試激勵(lì)、通過(guò)refm 設(shè)定可以判定輸出結(jié)果是否符合預(yù)期,能夠進(jìn)行大量的隨機(jī)驗(yàn)證,平臺(tái)本身具備可靠性,加入覆蓋語(yǔ)句、斷言語(yǔ)句,獲取到代碼覆蓋率、功能覆蓋率、斷言覆蓋率的百分比,通過(guò)分析能夠量化的科學(xué)的判定驗(yàn)證的程度,驗(yàn)證進(jìn)度可控.
AMBA (Advanced Microcontroller Bus Architecture)由ARM 公司研發(fā)推出,定義了一種嵌入式高性能微控制器的片上通信標(biāo)準(zhǔn)[3].目前,已被廣泛地應(yīng)用于大型復(fù)雜SoC 系統(tǒng)中[2].
本文以工控處理器SoC 芯片驗(yàn)證為背景,目標(biāo)芯片內(nèi)部采用AMBA 總線作為片上通信的總線架構(gòu),搭建基于UVM 驗(yàn)證方法學(xué)的AMBA 總線接口的驗(yàn)證平臺(tái),平臺(tái)具備可靠性、可擴(kuò)展性、通用性、高效性,能夠減少驗(yàn)證準(zhǔn)備工作的重復(fù)性,節(jié)約驗(yàn)證時(shí)間,可靠的高效完成整個(gè)芯片的驗(yàn)證工作,保障RTL 代碼功能的正確性和完備性,提高芯片成功率.
在AMBA 3.0 版本中,介紹了4 種接口類型,AMBA APB (Advanced Peripheral Bus)總線[3]、AMBA AHB(Advanced High-performance Bus)總線[4]、AMBA AXI(Advanced eXtensible Interface)總線[5]和AMBA ATB(Advanced Trace Bus)總線[6].
目標(biāo)芯片系統(tǒng)結(jié)構(gòu)圖,如圖1所示,片上總線采用AMBA 總線、內(nèi)部集成大量低速外設(shè)包括多路UART控制器、I2C 控制器、Timer 控制器、Watchdog 控制器、PWM 控制器、GPIO 控制器等;高速設(shè)備,L2 Cache 控制器、DMA 控制器、PCIE 控制器、USB 控制器、EMMC 控制器、SMC 控制器等;基于系統(tǒng)性能設(shè)計(jì)考慮,目標(biāo)芯片系統(tǒng)架構(gòu)設(shè)計(jì)采用AMBA 協(xié)議中的3 種類型,AMBA[7]AXI、AMBA AHB[8]、AMBA APB 總線協(xié)議,選擇高速總線AMBA AXI 總線作為處理器與外設(shè)相連的一級(jí)總線,選擇AMBA AHB[9]總線作為片上本地總線,選擇AMBA APB 總線,連接低速設(shè)備.如圖1所示,AMBA-AXI 總線上掛接CPU 核以及高速緩存控制器AXI-L2Cache 控制器、AXI-SRAM控制器、AXI-PCIE 控制器等,這類子模塊的驗(yàn)證工作需要平臺(tái)包含AMBA AXI 總線驅(qū)動(dòng);通過(guò)AXI2AHB橋控制器,完成AMBA AXI 總線與AMBA AHB 總線橋接工作,AMBA AHB 作為本地高性能總線,掛接AHB-DMA 控制器、AHB-SPI 控制器等高速外設(shè),這類子模塊的驗(yàn)證工作需要平臺(tái)包含AMBA AHB 總線驅(qū)動(dòng);通過(guò)AHB2APB橋控制器,完成AMBA AHB 總線與AMBA APB 總線橋接工作,AMBA APB 總線作為低速外設(shè)總線,掛接低速外設(shè)APB-UART、APBWDT 等模塊,這類子模塊的驗(yàn)證工作需要平臺(tái)包含AMBA APB 總線驅(qū)動(dòng).
圖1 目標(biāo)芯片系統(tǒng)結(jié)構(gòu)圖
本驗(yàn)證平臺(tái)采用Agent 以及TLM 通信機(jī)制設(shè)計(jì),實(shí)現(xiàn)平臺(tái)可擴(kuò)展性,支持外設(shè)接口類型為AMBA APB、AMBA AHB、AMBA AXI 單一接口或者組合接口多樣性的驗(yàn)證工作,具備通用性,可操作類型:
1)AMBA APB 接口:支持外設(shè)地址位寬配置、支持32 位數(shù)據(jù)讀寫(xiě)操作,符合AMBA APB 3.0 協(xié)議規(guī)范.
2)AMBA AHB 接口:支持外設(shè)地址位寬配置,支持8 位、16 位、32 位、64 位 SINGLE 讀寫(xiě)操作,支持BURST INCR 類型讀寫(xiě)操作(len 覆蓋1~16),符合AMBA AHB 協(xié)議規(guī)范.
3)AMBA AXI 接口:支持外設(shè)地址位寬可配置,支持8 位、16 位、32 位、64 位SINGLE 讀寫(xiě)操作,支持BURST INCR、BURST WRAP、BURST FIXED 類型讀寫(xiě)操作(len 覆蓋1~16),符合AMBA AXI 協(xié)議規(guī)范.
因此,驗(yàn)證平臺(tái)能夠滿足系統(tǒng)內(nèi)集成的所有子模塊的驗(yàn)證工作,所包含的總線驅(qū)動(dòng),覆蓋目標(biāo)芯片驗(yàn)證所需的全部AMBA 接口驅(qū)動(dòng)類型,具備通用性,能夠通過(guò)平臺(tái)結(jié)構(gòu)擴(kuò)展性滿足子模塊驗(yàn)證需要的接口類型以及數(shù)目的多樣性,例如AHB-DMA 控制器,通過(guò)AMBA AXI 接口進(jìn)行數(shù)據(jù)傳輸、AMBA AHB 接口進(jìn)行控制器寄存器配置,需要在同一環(huán)境集成AXI 總線驅(qū)動(dòng)以及AHB 總線驅(qū)動(dòng)才能完成驗(yàn)證工作,驗(yàn)證平臺(tái)具備的可擴(kuò)展性能夠滿足驗(yàn)證需求.
APB是高級(jí)外圍總線,定義了APB 總線協(xié)議,本平臺(tái)設(shè)計(jì)的APB 總線接口,支持待測(cè)模塊地址位寬可配置,數(shù)據(jù)接口位寬可配置,驅(qū)動(dòng)設(shè)計(jì)符合AMBA APB 3.0 協(xié)議規(guī)范.
根據(jù)AMBA APB 協(xié)議,定義sequence itemmonitor transfer,如表1和表2所示,根據(jù)`define APB_ADDR_WIDTH 配置支持地址位寬16 位或者32 位接口類型,根據(jù)`define APB_DATA_WIDTH 配置支持?jǐn)?shù)據(jù)位寬16 位或者32 位接口類型;APB 接口驅(qū)動(dòng)設(shè)計(jì)流程如圖2所示,在VIF.clk 上升沿將激勵(lì)值賦給對(duì)應(yīng)接口,在時(shí)鐘的下一個(gè)上升沿,將VIF.penable 拉高,之后,在每個(gè)時(shí)鐘的上升沿判斷VIF.pready 信號(hào)是否拉高,本節(jié)拍等待VIF.pready=1’b1 成功將VIF.prdata 值賦值給item.pdata,下節(jié)拍上升沿,將控制信號(hào)以及接口地址信號(hào)清零,APB 寫(xiě)驅(qū)動(dòng)效果圖,如圖3所示.APB 接口監(jiān)控設(shè)計(jì),在VIF.clk 下降沿,判斷讀數(shù)據(jù)是否有效(psel==1’b1 &penable==1’b1 &pready==1’b1),滿足條件當(dāng)拍將VIF.prdata 賦值給mtr.prdata,流程如圖2所示.APB 讀驅(qū)動(dòng)效果圖,如圖4所示.
圖2 APB Driver 及Monitor 設(shè)計(jì)流程圖
圖3 APB 寫(xiě)效果圖
圖4 APB 讀效果圖
表1 APB sequence item
表2 APB monitor transfer
AHB是高級(jí)高性能總線,定義了AHB 總線協(xié)議,本平臺(tái)設(shè)計(jì)的AHB總線接口,支持待測(cè)模塊地址位寬8 位、16 位或者32 位接口類型,支持?jǐn)?shù)據(jù)8 位、16 位、32 位、64 位SINGLE 以及BURST INCR 訪問(wèn),符合AMBA AHB協(xié)議規(guī)范.
根據(jù)AMBA AHB 協(xié)議規(guī)范,定義sequence item,如表3所示.根據(jù)define AHB_ADDR_WIDTH 配置地址位寬16,32,64 位接口類型;AHB 接口驅(qū)動(dòng)設(shè)計(jì),根據(jù)協(xié)議規(guī)范,在時(shí)鐘上升沿等待hready 拉高,通過(guò)trans_len 判斷是否為SINGLE 操作,設(shè)置VIF.Hburst 參數(shù)值(AHB_BURST_SINGLEAHB_BURST_INCR),并將sequence item 賦值給對(duì)應(yīng)的接口信號(hào);通過(guò)item.hwrite 判斷當(dāng)前操作類型,若值為WR,如圖5所示,寫(xiě)操作,在下一節(jié)拍上升沿且hready為高電平,當(dāng)前操作為SINGLE,VIF.htrans 賦值A(chǔ)HB_TRANS_IDLE,若當(dāng)前操作為BURST 操作,VIF.htrans 賦值A(chǔ)HB_TRANS_SEQ;根據(jù)數(shù)據(jù)單元大小8 bit16 bit32 bit64 bit 操作,對(duì)地址在item.trans_len個(gè)clk 節(jié)拍上升沿,分別進(jìn)行VIF.haddr 加1 或者item.hsize*2 操作,同時(shí),根據(jù)hsize 類型,進(jìn)行hwdata 與VIF.hwdata 賦值操作,例如,若AHB 發(fā)起字節(jié)操作,hwdata 低8 位值賦給VIF.hwdata[31:0],且hwdata 右移8 位,等待下個(gè)節(jié)拍操作,直到trans_len 設(shè)定的數(shù)據(jù)傳輸完成,在最后一個(gè)節(jié)拍VIF.htrans=AHB_TRANS_IDLE,寫(xiě)操作完成.AHB 寫(xiě)驅(qū)動(dòng)效果圖,如圖6所示.
圖5 AHB 驅(qū)動(dòng)設(shè)計(jì)流程圖
圖6 AHB 寫(xiě)效果圖
表3 AHB sequence item
若值為RD,如圖5所示,讀操作,通過(guò)trans_len 判斷當(dāng)前操作,若是SINGLE 操作,在時(shí)鐘上升沿,將VIF.hrdata 值賦值給item.hrdata,VIF.htrans 賦值A(chǔ)HB_TRANS_IDLE,若BURST 操作,在時(shí)鐘上升沿,VIF.htrans 賦值A(chǔ)HB_TRANS_SEQ,地址按照數(shù)據(jù)單元值進(jìn)行疊加VIF.haddr=item.haddr + trans_len*item.hsize*2,根據(jù)trans_len的值,進(jìn)行循環(huán)操作,在最后節(jié)拍,VIF.trans=AHB_TRANS_IDLE.AHB 讀驅(qū)動(dòng)效果圖,如圖7所示.
圖7 AHB 讀效果圖
AXI是高級(jí)可擴(kuò)展接口,定義了AXI 總線協(xié)議,具有5個(gè)獨(dú)立的傳輸通路(讀地址通道、讀數(shù)據(jù)通道、寫(xiě)地址通道、寫(xiě)數(shù)據(jù)通道、寫(xiě)應(yīng)答通道),支持亂序傳輸,以點(diǎn)對(duì)點(diǎn)的方式進(jìn)行握手交互,傳輸具有高效性,一般應(yīng)用于處理器與高速設(shè)備之間的連接.本平臺(tái)設(shè)計(jì)的AXI 接口驅(qū)動(dòng),支持待測(cè)模塊地址為位寬32 位或者64 位接口了類型,支持?jǐn)?shù)據(jù)8 位、16 位、32 位、64 位single 操作,支持BURST 類型FIXED、INCR、WRAP 三種類型、支持Burst len 覆蓋0~16,支持讀寫(xiě)亂序發(fā)送,符合AMBA AXI 協(xié)議規(guī)范.
根據(jù)AMBA AXI 協(xié)議規(guī)范,定義sequence item,如表4所示.根據(jù)define AXI_ADDR_WIDTH 配置地址位寬32,64 位接口類型;AXI 接口驅(qū)動(dòng)設(shè)計(jì),按照操作類型分成 AXI_WR 及AXI_RD 操作.
表4 AXI sequence item
AXI_WR 寫(xiě)操作,如圖8所示,首先,等待VIF.awready 拉高,完成寫(xiě)地址通道握手操作;在下一拍時(shí)鐘上升拉高VIF.wvalid 及VIF.bready,通過(guò)trans_len !=0,判斷當(dāng)前操作是否SINGLE 操作,若為SINGLE,在下一節(jié)拍VIF.wvalid 拉低;若為BURST 操作,VIF.wvalid 值不變,根據(jù)burst 類型(AXI_BURST_FIXED、AXI_BURST_INCR、AXI_BURST_WRAP),選擇進(jìn)入各自邏輯,根據(jù)trans_len 設(shè)置循環(huán)操作,通過(guò)tran_len==item.trans_len–1,判斷是否為最后一次傳輸,滿足條件,當(dāng)前節(jié)拍拉高VIF.wlast,在下節(jié)拍對(duì)控制信號(hào)進(jìn)行清零,等待slave 應(yīng)答VIF.bvalid 拉高,滿足條件,當(dāng)前節(jié)拍VIF.bready=1’b0,完成寫(xiě)操作,AXI 寫(xiě)驅(qū)動(dòng)效果圖,如圖9所示.其中,AXI 涉及的3 種驅(qū)動(dòng)邏輯.
圖8 AXI_WR Driver 流程圖
圖9 AXI_WR 效果圖
1)AXI_BURST_FIXED 類型:操作訪問(wèn)地址不變,驅(qū)動(dòng)設(shè)計(jì)關(guān)鍵在數(shù)據(jù)選通信號(hào)設(shè)計(jì),根據(jù)item.trans_size(8 bit16 bit32 bit64 bit),若為8 bit,VIF.wstrb=(8’h1< 圖10 AXI_BURST_FIXED 流程圖 2)AXI_BURST_INCR 類型:操作地址以數(shù)據(jù)單元大小進(jìn)行累加,在fixed 類型基礎(chǔ)上增加地址設(shè)計(jì)邏輯,若為8 bit:item.axi_addr=item.axi_addr + 32’h1;若為16 bit,item.axi_addr=item.axi_addr + 32’h2;若為32 bit,item.axi_addr=item.axi_addr + 32’h4;若為64 bit,item.axi_addr=item.axi_addr + 32’h8,如圖11所示. 圖11 AXI_BURST_INCR 流程圖 3)AXI_BURST_WRAP 類型,操作地址具有回卷特點(diǎn),以item.size*item.len為wrap boundary,地址循環(huán)操作;以item.trans_size=8 bit為例,首先確認(rèn)回卷地址訪問(wèn)以及起始地址wrap_axi_addr[log2(item.trans_len)–1:0]=item.axi_addr[log2(item.trans_len)–1:0],設(shè)計(jì)數(shù)據(jù)選通信號(hào)VIF.wstrb=(8’h1< 圖12 AXI_BURST_WRAP 流程圖 AXI 讀驅(qū)動(dòng)效果圖,如圖13所示.AXI_RD 讀操作,配置讀地址通道,VIF.arvalid=1,配置傳輸?shù)刂?等待valid 與ready handshake,在時(shí)鐘上升沿等待VIF.arready=1,若成立,拉低VIF.arvalid,讀地址通道配置完成,開(kāi)始讀數(shù)據(jù)通道配置操作,拉高VIF.rready,給入傳輸id 配置,通過(guò)VIF.rdata 讀回?cái)?shù)據(jù),如圖14所示. 圖13 AXI_RD 效果圖 圖14 AXI_RD DRIVER 流程圖 本驗(yàn)證平臺(tái)采用UVM 驗(yàn)證方法[10]學(xué)集成了上述前3 種接口類型.經(jīng)典的驗(yàn)證平臺(tái)結(jié)構(gòu)包含,如圖15所示,需要實(shí)現(xiàn)激勵(lì)功能的driver 組件,預(yù)判DUT 輸出的reference model 組件,DUT 輸出信息收集的monitor組件,以及給出驗(yàn)證結(jié)果的scoreboard 組件. 圖15 經(jīng)典驗(yàn)證平臺(tái)結(jié)構(gòu) 為了滿足目標(biāo)芯片的驗(yàn)證工作,減少驗(yàn)證的前期準(zhǔn)備工作,通常待測(cè)模塊需要的接口數(shù)量是不定,例如測(cè)試AXI[11]轉(zhuǎn)AHB 接口的橋模塊,需要驅(qū)動(dòng)多路AXI總線接口以及觀測(cè)多路AHB 總線接口,基于可擴(kuò)展性考慮,驗(yàn)證平臺(tái)定義一個(gè)通用的Agent 模板. Agent[12]是容器化概念,本平臺(tái)設(shè)計(jì)的通用Agent 模板內(nèi)部集成了monitor、driver、sequencer、以及driver 與reference model 通信隊(duì)列傳輸通道、DUT 與scoreboard 通信隊(duì)列傳輸通道、reference model 與scoreboard 通信隊(duì)列傳輸通道,Agent 定義了各個(gè)組件應(yīng)該存放的位置以及之間如何進(jìn)行通信[13],如圖16所示.對(duì)于不同總線驅(qū)動(dòng)設(shè)計(jì),整體Agent[14]框架不變,新創(chuàng)建文件夾,改變關(guān)鍵字以及driver_item_dut內(nèi)容既可.對(duì)于相同總線接口的擴(kuò)展,例如原AMBA_UVM[15]平臺(tái)內(nèi)部,只定義了一路AXI_MASTER,驗(yàn)證PCIE 需要兩路AXI_MASTER,此時(shí)只需要對(duì)uvm/axi_uvc 進(jìn)行復(fù)制,uvm/axi1_uvc,更改axi1_uvc 關(guān)鍵字即可,這樣能便于靈活擴(kuò)展,實(shí)現(xiàn)驗(yàn)證環(huán)境集成兩路AXI_MASTER 接口驅(qū)動(dòng)可以同時(shí)使用,滿足驗(yàn)證需求. 圖16 平臺(tái)整體結(jié)構(gòu)圖 通信隊(duì)列傳輸通道利用TLM 事務(wù)級(jí)端口設(shè)計(jì),將組件之間的通信細(xì)節(jié)(信息交換細(xì)節(jié))與通信架構(gòu)的細(xì)節(jié)分離開(kāi)來(lái),事務(wù)請(qǐng)求在調(diào)用通信隊(duì)列時(shí)發(fā)生.本平臺(tái)利用通用的uvm_tlm_analysis_fifo 組件,明確了數(shù)據(jù)傳輸方向,數(shù)據(jù)通過(guò)get_ap 獲取,通過(guò)put_ap傳送出去,實(shí)現(xiàn)各個(gè)組件之間的通信.在頂層tb 例化uvm_tlm_analysis_fifo 事務(wù),與通用agent 模板內(nèi)預(yù)先設(shè)計(jì)通路配合使用,實(shí)現(xiàn)各個(gè)模塊之間的通信,如圖17所示. 圖17 平臺(tái)通信隊(duì)列 uvm_tlm_analysis_fifo(xx_monitor_sequencer_item)dut2scb_mtr_fifo; Uvm_tlm_analysis_fifo(xx_monitor_sequencer_item)rm2scb_mtr_fifo; Uvm_tlm_analysis_fifo(xx_sequence_item) drv2rm_item_fifo; 平臺(tái)可擴(kuò)展性實(shí)現(xiàn)還需要定制激勵(lì)發(fā)送形式,這個(gè)過(guò)程由sequencer 實(shí)現(xiàn).可以將sequencer 看作是個(gè)瞄準(zhǔn)器,sequence item 就是要發(fā)射的物件.為了便于擴(kuò)展,本驗(yàn)證平臺(tái)建立一個(gè)通用的dut_virtual_ sequencer,內(nèi)部對(duì)各個(gè)接口sequencer 進(jìn)行例化.可以實(shí)現(xiàn)通過(guò)一個(gè)通道發(fā)送不同的sequence item 目的,如圖16所示.當(dāng)平臺(tái)接口數(shù)目需要擴(kuò)展時(shí),可以通過(guò)在dut_virtual_seuqncer 進(jìn)行例化. class dut_virtual_sequencer extends uvm_sequencer; `uvm_component_utils(dut_virtual_sequencer) dut_apb_sequencer apb_seqr; dut_ahb_sequencer ahb_seqr; dut_axi_sequencer axi_seqr; … endclass class dut_tb extends uvm_env; `uvm_component_utils(dut_tb) dut_virtual_sequencer vsqr; … function void connect_phase(uvm_phase phase); $display("connect_phase
"); vsqr.apb_seqr=apb.common_agent.sequencer; vsqr.ahb_seqr=ahb.common_agent.sequencer; vsqr.axi_seqr=axi.common_agent.sequencer; … Endclass 本平臺(tái)是基于UVM 驗(yàn)證方法學(xué)[16–19]結(jié)合Agnet以及TLM 通信機(jī)制進(jìn)行設(shè)計(jì)的驗(yàn)證平臺(tái),平臺(tái)的架構(gòu)本身具備穩(wěn)定性,能夠確保驗(yàn)證工作的展開(kāi);而本平臺(tái)在driver 以及monitor 設(shè)計(jì)中預(yù)留了probe 用于覆蓋率數(shù)據(jù)收集,能夠在驗(yàn)證工作完成之后,通過(guò)EDA工具對(duì)數(shù)據(jù)進(jìn)行分析,形成代碼、功能、斷言覆蓋率,用于總結(jié)子模塊的驗(yàn)證工作是否完備,若未達(dá)到驗(yàn)證需求,根據(jù)覆蓋率能夠快速準(zhǔn)確地找到未覆蓋的點(diǎn),創(chuàng)造場(chǎng)景激勵(lì),實(shí)現(xiàn)全面覆蓋,最終保障驗(yàn)證的完備性. 目標(biāo)芯片系統(tǒng)內(nèi)部按照需求集成了1 MB的片上存儲(chǔ)設(shè)備,作為boot ram 使用.以自研模塊AXI2SRAM控制器為例進(jìn)行驗(yàn)證平臺(tái)使用說(shuō)明. 對(duì)待測(cè)子模塊接口進(jìn)行分析,有兩種接口類型,一路AXI 接口[20]用于與系統(tǒng)內(nèi)部CPU 或者其它master設(shè)備進(jìn)行數(shù)據(jù)傳輸,一路slave sram 接口用于掛接存儲(chǔ)設(shè)備.因此,根據(jù)待測(cè)子模塊的功能特性將掛接local_mem的axi2sram 控制器整體作為被測(cè)試目標(biāo),驗(yàn)證平臺(tái)搭建如圖18所示. 本平臺(tái)具備驗(yàn)證所需的AXI 接口驅(qū)動(dòng),在平臺(tái)tb中例化連接axi_if 接口驅(qū)動(dòng)和axi2sram 控制器,控制器外接local_mem,如圖18所示,完成驗(yàn)證環(huán)境構(gòu)造.根據(jù)dut 特點(diǎn),編寫(xiě)reference model,驗(yàn)證覆蓋,axi 8 bit、16 bit、32 bit、64 bit single 操作,axi burst fixed、incr、wrap 操作,burst_len 覆蓋1~16;基于UVM 平臺(tái)特點(diǎn)[21,22],產(chǎn)生大量的帶約束的隨機(jī)操作,例如,以axi_test_64bit_wrap 測(cè)試場(chǎng)景為例,如圖19所示為激勵(lì)構(gòu)造思路,激勵(lì)axi_bit64_wrap_randomize 能夠?qū)崿F(xiàn)數(shù)據(jù)隨機(jī)、傳輸長(zhǎng)度隨機(jī)、地址隨機(jī),交叉組合;平臺(tái)定義的通用dut_virtual_sequencer 機(jī)制利用p_sequencer.axi_seqr 能夠準(zhǔn)確的將測(cè)試激勵(lì)賦值給指定axi_if 接口,最終完成隨機(jī)測(cè)試. 圖18 axi2sram 驗(yàn)證平臺(tái)結(jié)構(gòu) 圖19 axi_test_64bit_wrap 實(shí)驗(yàn)結(jié)果,如圖20所示,本驗(yàn)證平臺(tái)定義了一個(gè)通用的記分板,用于收集DUT 接口以及reference model分別發(fā)送回Scoreboard的數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行分析,最終打印出比較結(jié)果.基于待測(cè)模塊結(jié)構(gòu)特點(diǎn),平臺(tái)僅應(yīng)用AMBA AXI[23]驅(qū)動(dòng),因此,記分板對(duì)比結(jié)果僅axi 接口具有有效數(shù)據(jù),dut_mtr為待測(cè)模傳輸給scb的反饋結(jié)果,rm_mtr為參考模型[24]傳輸給scb的期望結(jié)果,mch_mtr為成功對(duì)比的數(shù)目,nmch_mtr為不符合預(yù)期結(jié)果的數(shù)目;通過(guò)結(jié)果可分析,產(chǎn)生隨機(jī)次數(shù)為150028 次,其中待測(cè)目標(biāo)發(fā)送給記分板的數(shù)據(jù)數(shù)目是150028 次,參考模型發(fā)送給記分板的數(shù)據(jù)數(shù)目是150 028 次,其中,按照數(shù)值產(chǎn)生的先后數(shù)據(jù)進(jìn)行對(duì)比,對(duì)比失敗的數(shù)據(jù)數(shù)目為0,因此,認(rèn)為本次隨機(jī)場(chǎng)景測(cè)試結(jié)果有效.運(yùn)行波形如圖21. 圖20 axi_test_64bit_wrap 實(shí)驗(yàn)結(jié)果 圖21 axi_test_64bit_wrap 運(yùn)行波形 根據(jù)驗(yàn)證大綱,對(duì)所列驗(yàn)證點(diǎn)進(jìn)行遞歸運(yùn)行,在運(yùn)行腳本中加入define COV_WORK,開(kāi)啟驗(yàn)證平臺(tái)的probe 功能,運(yùn)行腳本cov.sh 收集覆蓋率數(shù)據(jù);運(yùn)行merge.sh 最終通過(guò)Cadence 工具得到覆蓋率報(bào)告,如圖22所示,代碼覆蓋率100%,如圖23所示,功能覆蓋率100%;能夠得到結(jié)論,AXI2SRAM 控制器通過(guò)驗(yàn)證過(guò)后硬件代碼具備功能完備且可靠,達(dá)到驗(yàn)證目標(biāo),完成驗(yàn)證工作. 圖22 代碼覆蓋率 圖23 功能覆蓋率 //cov.sh 腳本 select_coverage -betf -module dut_tb_top… set_assign_scoring set_branch_scoring set_statement_scoring set_expr_scoring -all set_fsm_scoring -hold_transition set_fsm_arc_scoring set_glitch_strobe 1 ns set_toggle_strobe 1 ns set_covergroup -per_instance_default_one select_functional //merge.sh 腳本 load_test cov_work/scope/* test_order -b -e>./coverage_test_order.log union merge_code report_summary -instance -besaftd dut_tb_top…>./cov_summary.log 目前,本平臺(tái)能夠支持AMBA 總線接口[25]的DUT測(cè)試工作,在未來(lái),隨著應(yīng)用以及芯片驗(yàn)證的需要,基于平臺(tái)結(jié)構(gòu)的可擴(kuò)展性,能夠加入其它接口協(xié)議,豐富接口類型,最終實(shí)現(xiàn)接口驅(qū)動(dòng)豐富的面向全芯片模塊驗(yàn)證的UVM 平臺(tái).1.4 驗(yàn)證平臺(tái)實(shí)現(xiàn)
2 AXI-SRAM 控制器驗(yàn)證
3 結(jié)論與展望