摘 要: 針對(duì)一款網(wǎng)絡(luò)協(xié)議處理芯片,為了保證其設(shè)計(jì)的正確性,提升驗(yàn)證效率,基于OVM架構(gòu),通過SystemVerilog語言搭建了具有受約束的隨機(jī)激勵(lì)生成、錯(cuò)誤注入、覆蓋率收集、正確性自檢查等功能的驗(yàn)證平臺(tái)。通過該驗(yàn)證平臺(tái)對(duì)芯片進(jìn)行了全方位的高效驗(yàn)證,實(shí)現(xiàn)了一次流片成功?;贠VM的驗(yàn)證平臺(tái)具有良好的可重用性和可擴(kuò)展性,相對(duì)于傳統(tǒng)的編寫定向測(cè)試激勵(lì)的方法,在驗(yàn)證的高效性、完備性上具有顯著的優(yōu)勢(shì)。
關(guān)鍵詞: OVM; SystemVerilog語言; 網(wǎng)絡(luò)協(xié)議處理芯片; 隨機(jī)激勵(lì); 驗(yàn)證平臺(tái)
中圖分類號(hào): TN47?34; TN492 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2014)01?0137?04
0 引 言
隨著集成電路設(shè)計(jì)技術(shù)發(fā)展和設(shè)計(jì)規(guī)模的不斷膨脹,對(duì)設(shè)計(jì)正確性的驗(yàn)證所耗費(fèi)的時(shí)間越來越長(zhǎng)。驗(yàn)證工作大約占據(jù)整個(gè)項(xiàng)目周期70%左右的時(shí)間[1]。驗(yàn)證工作全面與否和效率的高低直接關(guān)系到集成電路產(chǎn)品設(shè)計(jì)的成敗和上市的時(shí)間。
傳統(tǒng)的通過Verilog語言撰寫定向測(cè)試激勵(lì)的方式只能適應(yīng)規(guī)模較小的設(shè)計(jì),對(duì)于超大規(guī)模的集成電路的正確性驗(yàn)證則難以勝任。SystemVerilog語言是近幾年發(fā)展起來的、并在大規(guī)模集成電路的驗(yàn)證工作上迅速得到廣泛應(yīng)用的、一門集設(shè)計(jì)與驗(yàn)證為一體的硬件驗(yàn)證語言,它引入面向?qū)ο缶幊痰乃枷?,并且支持覆蓋率收集、受約束的隨機(jī)化等對(duì)驗(yàn)證來講非常重要的特性?;赟ystemVerilog語言,可以構(gòu)建由覆蓋率驅(qū)動(dòng)的并且受約束的隨機(jī)激勵(lì)驗(yàn)證平臺(tái)[2?3]。
隨機(jī)激勵(lì)對(duì)于測(cè)試復(fù)雜設(shè)計(jì)十分關(guān)鍵。定向測(cè)試可以找出設(shè)計(jì)中預(yù)期的漏洞,而隨機(jī)測(cè)試則能夠找出預(yù)料不到的漏洞。搭建隨機(jī)激勵(lì)驗(yàn)證平臺(tái)花費(fèi)的時(shí)間很長(zhǎng),但其回報(bào)卻很高。每個(gè)隨機(jī)測(cè)試都可以共享這個(gè)通用的驗(yàn)證平臺(tái),而不像每個(gè)定向測(cè)試都要從零開始編寫。受約束的隨機(jī)激勵(lì)驗(yàn)證平臺(tái)找起漏洞來會(huì)比定向測(cè)試快很多。
OVM是Cadence和Mentor兩家公司聯(lián)合推出的仿真驗(yàn)證方法學(xué),它是業(yè)界第一個(gè)開源的仿真驗(yàn)證資源庫,它為驗(yàn)證工程師提供了開源的基類設(shè)計(jì)代碼,可以用于構(gòu)建可復(fù)用的驗(yàn)證環(huán)境,并且支持事務(wù)級(jí)傳輸模型的接口通信[4]。
本文基于OVM架構(gòu),通過SystemVerilog語言,給出了一款網(wǎng)絡(luò)協(xié)議處理芯片驗(yàn)證平臺(tái)的設(shè)計(jì)。
1 OVM簡(jiǎn)介
OVM驗(yàn)證平臺(tái)由可重用的稱之為OVM驗(yàn)證組件(OVCs)的驗(yàn)證環(huán)境構(gòu)成。OVC可以是針對(duì)接口協(xié)議、子模塊或者完整的系統(tǒng)而構(gòu)建的驗(yàn)證環(huán)境。每個(gè)OVC遵循相同的結(jié)構(gòu),可以對(duì)具體的協(xié)議或設(shè)計(jì)執(zhí)行仿真、檢查和覆蓋率收集。OVC被用于驗(yàn)證待測(cè)設(shè)計(jì)(DUT)的正確性。OVC可以加速DUT驗(yàn)證平臺(tái)的創(chuàng)建[5]。
典型的OVC環(huán)境如圖1所示。
圖1 OVC環(huán)境示意圖
一個(gè)完整的OVC環(huán)境由Data Item、Driver、Sequencer、Monitor、Agent、Environment組成,詳細(xì)描述見參考文獻(xiàn)[5]。
2 驗(yàn)證平臺(tái)的設(shè)計(jì)實(shí)現(xiàn)
2.1 驗(yàn)證對(duì)象的描述
圖2所示為網(wǎng)絡(luò)協(xié)議處理芯片的簡(jiǎn)易結(jié)構(gòu)。芯片對(duì)外提供四組接口:兩組網(wǎng)絡(luò)接口、一組配置管理接口、一組SRAM接口。兩組網(wǎng)絡(luò)接口相互通信,從一個(gè)網(wǎng)口輸入的網(wǎng)絡(luò)數(shù)據(jù)包經(jīng)協(xié)議處理單元處理后從另一個(gè)網(wǎng)口輸出;配置管理口與外部CPU通信,實(shí)現(xiàn)芯片的初始化配置、狀態(tài)監(jiān)控; SRAM接口與外部存儲(chǔ)器連接,提供網(wǎng)絡(luò)數(shù)據(jù)處理過程中所需的中間數(shù)據(jù)緩存的通道。
圖2 網(wǎng)絡(luò)協(xié)議處理芯片結(jié)構(gòu)
2.2 驗(yàn)證平臺(tái)的結(jié)構(gòu)
針對(duì)該網(wǎng)絡(luò)協(xié)議處理芯片構(gòu)建的驗(yàn)證平臺(tái)結(jié)構(gòu)如圖3所示。芯片的SRAM接口與標(biāo)準(zhǔn)的SRAM模型對(duì)接,實(shí)現(xiàn)讀寫時(shí)序的控制和數(shù)據(jù)的交互;其他的三組接口分別構(gòu)建獨(dú)立的可重用的OVM驗(yàn)證組件(OVC);Virtual Sequencer容納各個(gè)OVC的sequencer,控制各個(gè)OVC隨機(jī)序列的生成和管理;Scoreboard收集各OVC提供的監(jiān)測(cè)數(shù)據(jù),通過與參考模型(RM)的輸出結(jié)果進(jìn)行比較,確認(rèn)芯片輸出的正確性;根據(jù)芯片的測(cè)試驗(yàn)證需求,組合相關(guān)的測(cè)試序列,生成多組test,供芯片測(cè)試驗(yàn)證。
2.3 驗(yàn)證平臺(tái)的設(shè)計(jì)
2.3.1 OVC設(shè)計(jì)
芯片驗(yàn)證平臺(tái)包含GMAC OVC1、GMAC OVC2和CFG OVC三個(gè)獨(dú)立的驗(yàn)證組件。本文以GMAC OVC1為例,詳述OVC的構(gòu)建方法。
(1) Data Item
GMAC OVC1為網(wǎng)絡(luò)接口的驗(yàn)證組件,驅(qū)動(dòng)網(wǎng)絡(luò)接口的數(shù)據(jù)為以太網(wǎng)數(shù)據(jù)包。以太網(wǎng)數(shù)據(jù)包可以采用分層的方法逐級(jí)構(gòu)建。首先構(gòu)建鏈路層的MAC數(shù)據(jù)包,對(duì)MAC頭各字段進(jìn)行隨機(jī)化定義和約束;然后構(gòu)建網(wǎng)絡(luò)層的IP數(shù)據(jù)包,對(duì)IP頭的各字段進(jìn)行隨機(jī)化定義和約束,IP數(shù)據(jù)包繼承于鏈路層的MAC數(shù)據(jù)包;最后構(gòu)建傳輸層的ICMP、UDP、TCP等協(xié)議包,這些數(shù)據(jù)包繼承于網(wǎng)絡(luò)層的IP包。通過這種面向?qū)ο蟮姆謱訕?gòu)建方法,使該Data Item具有良好的擴(kuò)展性,在不同的應(yīng)用中,根據(jù)實(shí)際需求可方便地對(duì)網(wǎng)絡(luò)層和傳輸層的數(shù)據(jù)包進(jìn)行擴(kuò)展。
圖3 驗(yàn)證平臺(tái)結(jié)構(gòu)
在逐層構(gòu)建數(shù)據(jù)包時(shí),除產(chǎn)生正確的數(shù)據(jù)包外,為了檢驗(yàn)芯片的容錯(cuò)能力,還需注入一定比例的錯(cuò)誤數(shù)據(jù)包,如同步頭錯(cuò)誤、CRC校驗(yàn)和錯(cuò)誤、IP頭校驗(yàn)和錯(cuò)誤等。
(2) Sequencer
Sequencer中寄存著不同種類的sequence,這些sequence產(chǎn)生不同類型的數(shù)據(jù)包,在task body()中生成。示例代碼如下:
virtual task body();
case(ip_sel) //包類型選擇
TCP: begin
[′ovm_do_with](tcp_packet0,{tcp_packet0.packet_type==IP_PACKET; tcp_packet0.ip_type==TCP; }) end //生成TCP包
UDP: begin
[′ovm_do_with](udp_packet0,{udp_packet0.packet_type==IP_PACKET; udp_packet0.ip_type==UDP; }) end //生成UDP包
ICMP: begin
[′ovm_do_with](icmp_packet0,{icmp_packet0.packet_type==IP_PACKET; icmp_packet0.ip_type==ICMP; }) end
//生成ICMP包
endcase
endtask: body
(3) Driver
Driver從Sequencer中獲取Data Item,然后將其轉(zhuǎn)換成DUT網(wǎng)絡(luò)接口支持的邏輯方式和時(shí)序方式驅(qū)動(dòng)到接口。
Driver與Sequencer之間的通信通過OVM提供的TLM端口實(shí)現(xiàn)。
seq_item_port.get_next_item(req);
//TLM端口,從sequencer中取出新的數(shù)據(jù)序列
drive_frame(req); //自定義任務(wù),驅(qū)動(dòng)數(shù)據(jù)序列到DUT端口
seq_item_port.item_done();
//TLM端口,通知sequencer取出的數(shù)據(jù)序列處理完
(4) Monitor
Monitor監(jiān)測(cè)GMAC1的接口,收集輸入、輸出數(shù)據(jù)序列,并進(jìn)行功能覆蓋率統(tǒng)計(jì)。
功能覆蓋率通過covergroup中的coverpoint和cross來實(shí)現(xiàn),示例如下:
covergroup cover_ip_packet;
ip_total_len: coverpoint ip_collected.ip_total_len
//創(chuàng)建覆蓋點(diǎn)ip_total_len
{ bins small_packet[]={[21:46]};
bins normal_packet[]={[47:1500]}; }
ip_protocal: coverpoint ip_collected.ip_protocal
//創(chuàng)建覆蓋點(diǎn)ip_protocal
{ bins icmp = {1};
bins tcp = {6};
bins udp = {17}; }
cross ip_total_len,ip_protocal;