李姝萱,卜 剛
(南京航空航天大學(xué) 電子信息工程學(xué)院,江蘇 南京 211106)
隨著集成電路的快速發(fā)展,芯片研究周期不斷縮短,傳統(tǒng)的基于testbench 的驗(yàn)證方式由于效率低、難達(dá)到預(yù)期覆蓋率以及可移植性差等缺點(diǎn),不適合日漸復(fù)雜的SOC 芯片開(kāi)發(fā)。目前,通用驗(yàn)證方法學(xué)(Universal Verification Methodology,UVM)已成為IC 驗(yàn)證領(lǐng)域最為廣泛使用的驗(yàn)證方式。UVM 兼具封裝、繼承、面向?qū)ο蟮忍攸c(diǎn),擁有大量功能全面的組件和基類,同時(shí)開(kāi)發(fā)了factory、config 等機(jī)制,可根據(jù)工程特性靈活地搭建驗(yàn)證結(jié)構(gòu)。
RFID 是非接觸式的無(wú)線通信技術(shù),它通過(guò)對(duì)射頻信號(hào)進(jìn)行調(diào)制、解調(diào)來(lái)實(shí)現(xiàn)信息的傳輸,是當(dāng)今最有發(fā)展前景的技術(shù)之一。目前,RFID 技術(shù)已經(jīng)廣泛應(yīng)用在眾多行業(yè)和領(lǐng)域,如物流運(yùn)輸、資源管理、軍事國(guó)防、智能交通、門(mén)禁考勤、醫(yī)療電子等領(lǐng)域[1-2]。本文針對(duì)無(wú)線射頻識(shí)別(Radio Identification,RFID)數(shù)字基帶處理單元中閱讀器發(fā)送鏈路編碼模塊進(jìn)行設(shè)計(jì),并進(jìn)行了仿真和板級(jí)驗(yàn)證,采用串口通信作為物理通道,實(shí)現(xiàn)了PC 端與FPGA 板之間實(shí)現(xiàn)互傳數(shù)據(jù)。為進(jìn)一步驗(yàn)證編碼功能,搭建了UVM 驗(yàn)證平臺(tái),采用DPI 接口調(diào)用C 語(yǔ)言編寫(xiě)的參考模型,實(shí)現(xiàn)了待測(cè)設(shè)計(jì)和C 模型在記分板中的輸出結(jié)果對(duì)比一致。
圖1 為RFID 閱讀器發(fā)送鏈路結(jié)構(gòu)圖。閱讀器產(chǎn)生命令信息,經(jīng)編碼、調(diào)制后發(fā)送至標(biāo)簽。標(biāo)簽對(duì)信息進(jìn)行解調(diào)、譯碼,從而識(shí)別閱讀器命令,做出相應(yīng)反饋。
圖1 RFID 閱讀器發(fā)送鏈路結(jié)構(gòu)
編碼在信息傳輸中起到防干擾的作用,使得信息能夠高效、安全地到達(dá)收方。ISO/IEC18000-6 協(xié)議規(guī)定,基帶處理單元中閱讀器至標(biāo)簽鏈路的數(shù)據(jù)編碼采用PIE編碼方式,即脈沖寬度編碼。編碼原理是通過(guò)對(duì)數(shù)據(jù)-0和數(shù)據(jù)-1 進(jìn)行不同碼元長(zhǎng)度的編碼來(lái)實(shí)現(xiàn),主要體現(xiàn)在脈沖下降沿前所持續(xù)的高電平時(shí)間不同。PIE 的編碼規(guī)則如圖2 所示[3]。
圖2 PIE 編碼規(guī)則
其中,Tari 表示的是閱讀器向標(biāo)簽發(fā)送信息的基準(zhǔn)時(shí)間間隔,具體取值需要根據(jù)實(shí)際要求作出一定調(diào)整,在實(shí)際情況下,需要參考地方無(wú)線電規(guī)則。Tari 的詳細(xì)取值如表1 所示。低電平部分長(zhǎng)度PW 的取值范圍在0到Tari 之間[3]。
表1 最佳閱讀器對(duì)標(biāo)簽Tari 值
本文中Tari 取值為12.5 μs,低電平部分長(zhǎng)度PW 取為基準(zhǔn)時(shí)間間隔的一半,x 取值為1,則數(shù)據(jù)-1 編碼后長(zhǎng)度為2Tari,數(shù)據(jù)-0 編碼后長(zhǎng)度為T(mén)ari,即數(shù)據(jù)-1 長(zhǎng)度是數(shù)據(jù)-0 的兩倍。因此,數(shù)據(jù)-0 在經(jīng)過(guò)兩個(gè)時(shí)鐘周期后的輸出“10”序列;數(shù)據(jù)-1 在經(jīng)過(guò)在四個(gè)時(shí)鐘周期后輸出“1110”序列0。
經(jīng)過(guò)Modelsim 仿真后,在工程中添加了一個(gè)偽隨機(jī)數(shù)發(fā)生器模塊,其功能是產(chǎn)生8 位偽隨機(jī)數(shù)作為PIE 編碼的輸入數(shù)據(jù)。工程經(jīng)Quartus Ⅱ綜合、編譯并下載到FPGA 開(kāi)發(fā)板中,觀察并分析實(shí)驗(yàn)結(jié)果。本文所用的板子型號(hào)是Altera 的DE2-115。
圖3 描述了使用SignalTap Ⅱ邏輯分析儀抓到的輸入和輸出波形。如輸入8 位十六進(jìn)制數(shù)據(jù)8Ch,對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)為1000_1100,按照PIE 編碼規(guī)則編碼后的數(shù)據(jù)應(yīng)為11_1010_1010_1110_1110_1010,高位補(bǔ)0 后得到對(duì)應(yīng)十六進(jìn)制數(shù)據(jù)為3AAEEAh。經(jīng)查驗(yàn),PIE 編碼設(shè)計(jì)能夠正常工作。
圖3 PIE 編碼SignalTap Ⅱ波形圖
在設(shè)計(jì)基礎(chǔ)上增加串口收發(fā)模塊,本設(shè)計(jì)中串口發(fā)送模塊實(shí)現(xiàn)了多字節(jié)發(fā)送。具體實(shí)現(xiàn)了PC 端發(fā)送一個(gè)1 字節(jié)數(shù)據(jù)給下載了由PIE 編碼模塊和串口收發(fā)模塊共同組成的工程的FPGA 開(kāi)發(fā)板,并通過(guò)串口通道收到經(jīng)過(guò)PIE 編碼后的4 字節(jié)數(shù)據(jù)。圖4 是串口助手發(fā)送和接收數(shù)據(jù)。
圖4 串口收發(fā)數(shù)據(jù)圖
UVM 是一個(gè)以SystemVerilog 類庫(kù)為主體搭建驗(yàn)證平臺(tái)的驗(yàn)證方法學(xué),驗(yàn)證人員利用其可重用組件構(gòu)建具有標(biāo)準(zhǔn)化層次結(jié)構(gòu)和接口的功能驗(yàn)證環(huán)境。UVM由A-ccellera 標(biāo)準(zhǔn)組織推出,并得到三大廠商(Cadence、Synopsys 和Mentor)的一致支持。2011 年以后陸續(xù)推出了1.0、1.1、1.1a、1.1b、1.1c 和1.1d 版本。2014 年推出了最新UVM 1.2 版本[4],UVM 作為如今驗(yàn)證領(lǐng)域最廣泛使用的驗(yàn)證方法學(xué),基本代表IC 驗(yàn)證的大致發(fā)展方向。
UVM 平臺(tái)主要由uvm_componet 和uvm_object 組成。uvm_componet 繼承于uvm_object 的同時(shí),擁有uvm_object沒(méi)有的一些特性。與傳統(tǒng)的Testbench 相比而言,UVM 驗(yàn)證平臺(tái)實(shí)現(xiàn)了受約束的隨機(jī)激勵(lì)的產(chǎn)生,自動(dòng)化的結(jié)果比對(duì)以及代碼和功能覆蓋率的收集[5]。本文采用如圖5所示的UVM 驗(yàn)證平臺(tái)結(jié)構(gòu)[6],下面將對(duì)各驗(yàn)證組件進(jìn)行詳細(xì)介紹。
圖5 UVM 驗(yàn)證平臺(tái)結(jié)構(gòu)
(1)interface:聲明DUT 接口。
(2)test:派生于uvm_test,是整個(gè)驗(yàn)證平臺(tái)的入口,例化了env,是case 的父類,在不同的case 中設(shè)置了sequencer的default_sequence。
(3)transaction:繼承于uvm_sequence_item,在驗(yàn)證平臺(tái)中,信息在各組件中不以比特的形式流動(dòng),用transaction來(lái)處理與表征數(shù)據(jù)[7]。定義兩個(gè)transaction 類型,分別為transaction_in、transaction_out。前者為輸入端數(shù)據(jù)包,后者為輸出端數(shù)據(jù)包。driver 首先需要把數(shù)據(jù)從transaction_in 中提出來(lái),然后把其轉(zhuǎn)換為DUT 的管腳能夠接收的數(shù)據(jù)。通常來(lái)說(shuō),一個(gè)driver 只能接收一種transaction,所以在my_driver 被定義成了一個(gè)參數(shù)化的類,這個(gè)參數(shù)就是 my_driver 所能接收的transaction 的類型。transaction_out 在monitor 內(nèi)部的轉(zhuǎn)化機(jī)制同理。
(4)sequence:繼承于uvm_sequence,產(chǎn)生數(shù)據(jù)包,并通過(guò)sequencer 傳遞給driver,driver 則將transaction 中定義的數(shù)據(jù)信息配置給DUT 管腳。驗(yàn)證過(guò)程中需要對(duì)DUT施加大量不同的激勵(lì),就要使sequence 產(chǎn)生不同的激勵(lì)。
(5)sequencer:繼承于uvm_sequencer,將sequence 發(fā)送給driver。
(6)driver:繼承于uvm_driver,向sequencer 請(qǐng)求transaction,經(jīng)過(guò)數(shù)據(jù)轉(zhuǎn)化后通過(guò)下傳給DUT[5]。driver 請(qǐng)求transaction 的部分代碼如下:
其中,seq_item_port 是用于連接driver 和sequence 的一個(gè)端口,driver 如果想要發(fā)送數(shù)據(jù)就要從這個(gè)端口中獲得;sequencer 如果有數(shù)據(jù)要交給 driver,也要通過(guò)這個(gè)端口送給driver。從這個(gè)端口申請(qǐng)數(shù)據(jù)要調(diào)用這個(gè)端口的get_next_item 方法。當(dāng)數(shù)據(jù)驅(qū)動(dòng)完畢時(shí),要通過(guò)調(diào)用item_done 來(lái)告知這個(gè)端口。
(7)monitor:繼承于uvm_monitor,創(chuàng)建monitor_before 和monitor_after 兩個(gè)類,分別用來(lái)獲取driver 發(fā)送給DUT的數(shù)據(jù)和DUT 的輸出結(jié)果[8]。
(8)agent:繼承于uvm_agent,在build_phase 函數(shù)中,通過(guò)is_active 值來(lái)例化內(nèi)部不同的組件。is_active 值以UVM_PASSIVE 方式運(yùn)轉(zhuǎn)的agent 例化sequencer、driver、monitor_before,其作用是驅(qū)動(dòng)總線,也可以監(jiān)測(cè)總線;以UVM_ACTIVE 方式運(yùn)行的agent 只例化monitor_after,監(jiān)測(cè)總線而不驅(qū)動(dòng)總線。
(9)reference_model:繼承于uvm_componet,使用uvm_blocking_get_port 端口從monitor_before 中獲取數(shù)據(jù),調(diào)用DPI-C,獲取經(jīng)C_model 運(yùn)算過(guò)的輸出結(jié)果,通過(guò)uvm_analysis_port 端口將數(shù)據(jù)發(fā)送給scoreboard 組件[9-10]。
其中,pie_data 和pie_length 分別為計(jì)算PIE 編碼結(jié)果和長(zhǎng)度的C 函數(shù),tr1.data 是monitor_before 發(fā)送給參考模型的數(shù)據(jù)。tr2 是reference_model 發(fā)送給scoreboard 的數(shù)據(jù)包。
(10)Scoreboard:繼承于uvm_scoreboard,main_phase 中使用fork 開(kāi)啟了兩個(gè)進(jìn)程,其中一個(gè)進(jìn)程用于從reference_model 中獲得數(shù)據(jù),另外一個(gè)進(jìn)程用于從monitor中獲得數(shù)據(jù)。一般情況下,同樣的兩組激勵(lì),經(jīng)過(guò)DUT的處理后會(huì)有一定的延遲,但是在reference_model 中不會(huì)出現(xiàn)延遲。因此reference_model 中的數(shù)據(jù)總是比DUT 先到達(dá)scoreboard,所以在scoreboard 中可進(jìn)行如下操作:將reference_model 發(fā)送來(lái)的數(shù)據(jù)先放入一個(gè)隊(duì)列中等待。當(dāng)接收到DUT 的輸出后,從隊(duì)列中依次彈出數(shù)據(jù),調(diào)用compare 函數(shù)和DUT 的輸出比較。
(11)env:繼承于uvm_env,例化了reference_model、scoreboard 和agent 組件,并在其connect_phase 中使用FIFO實(shí)現(xiàn)端口之間的相互連接。例如,要實(shí)現(xiàn)reference_model 和scoreboard 的通信,只要在env 中聲明一個(gè)FIFO,然后用FIFO 將reference_model 的analysis_port 和soreboard 的get_port 進(jìn)行互相連接即可。連接部分代碼如下[11]。
在驗(yàn)證平臺(tái)的頂層(pie_top_tb)例化整個(gè)PIE_ENCODE 模塊作為DUT,并利用SystemVerilog 的run_test 函數(shù)作為驗(yàn)證平臺(tái)的入口。在命令行輸入U(xiǎn)VM_TESTNAME=casex(x 為所定義的case 的序號(hào)),創(chuàng)建并運(yùn)行測(cè)試用例,達(dá)到驗(yàn)證目的[12-13]。通過(guò)利用SystemVerilog 的interface 機(jī)制[14]定義一組虛擬接口(Virual Interface,V-IF)來(lái)連接UVM 動(dòng)態(tài)驗(yàn)證環(huán)境以及基于RTL 模型的DUT。使用uvm_config_db 機(jī)制使得虛擬接口能夠連接兩者。
圖6 是驗(yàn)證平臺(tái)的打印信息面板。這里的tr1 是scoreboard 從reference_model 中獲取的數(shù)據(jù)包,tr_out 則是monitor_after 收集到的DUT 端口信息所構(gòu)成的數(shù)據(jù)包。由圖可見(jiàn)。參考模型和DUT 輸出結(jié)果在記分板中對(duì)比結(jié)果一致,達(dá)到了驗(yàn)證效果。
圖6 打印信息面板
圖7 為由覆蓋率驅(qū)動(dòng)的且受約束的隨機(jī)分層驗(yàn)證平臺(tái)運(yùn)行出的波形圖。由此可見(jiàn),每個(gè)時(shí)鐘周期內(nèi),PIE 編碼輸入對(duì)應(yīng)的輸出都是正確的。
圖7 DUT 仿真波形圖
圖8 顯示了DUT 的功能覆蓋率,驗(yàn)證平臺(tái)對(duì)實(shí)例化的接口輸入和輸出信號(hào)分別進(jìn)行了采集,功能覆蓋率達(dá)到了100%。對(duì)于傳統(tǒng)的基于testbench 的驗(yàn)證平臺(tái),缺少特定的方法對(duì)功能覆蓋率進(jìn)行統(tǒng)計(jì),很難收集并分析功能覆蓋率的具體情況。
圖8 功能覆蓋率
圖9 描述的是DUT 的代碼覆蓋率,其中,分支覆蓋率、條件覆蓋率、表達(dá)式覆蓋率和語(yǔ)句覆蓋率均達(dá)到了100%,總代碼覆蓋率也達(dá)到100%。
圖9 代碼覆蓋率
UVM 驗(yàn)證方法學(xué)作為如今IC 驗(yàn)證領(lǐng)域最廣泛使用的驗(yàn)證方式,其擁有大量庫(kù)及基類、面向?qū)ο蟮忍攸c(diǎn),有效提高了驗(yàn)證效率和產(chǎn)品可靠性。本文設(shè)計(jì)了RFID 閱讀器發(fā)送鏈路PIE 編碼模型,在建模、仿真的基礎(chǔ)上進(jìn)一步實(shí)現(xiàn)了FPGA 原型驗(yàn)證,進(jìn)而實(shí)現(xiàn)了FPGA 串口多字節(jié)發(fā)送的功能以及和PC 的通信。此外,基于UVM 驗(yàn)證方法學(xué)及SystemVerilog 語(yǔ)言特性,借助DPI 調(diào)用高抽象層次C 模型,搭建了具有高度復(fù)用性的功能全面的驗(yàn)證平臺(tái),在此基礎(chǔ)上編寫(xiě)覆蓋率驅(qū)動(dòng)的受約束隨機(jī)激勵(lì),實(shí)現(xiàn)了SystemVerilog 和C 語(yǔ)言協(xié)同仿真。最終使得代碼的分支覆蓋率、條件覆蓋率、表達(dá)式覆蓋率、語(yǔ)句覆蓋率均達(dá)到100%,總覆蓋率達(dá)到100%,功能覆蓋率也達(dá)到100%,達(dá)到了驗(yàn)證目的。