陶青平,沈婧
(中國(guó)電子科技集團(tuán)公司第五十八研究所,江蘇 無(wú)錫 214035)
隨著集成電路工藝的快速發(fā)展,芯片的研究設(shè)計(jì)周期亦在不斷縮短[1]。四線制的JTAG 接口調(diào)試依然是大多數(shù)芯片設(shè)計(jì)采用的調(diào)試手段。JTAG 協(xié)議功能的好壞很大程度上決定了流片回來(lái)后的芯片是否具有可調(diào)試狀態(tài)。不同芯片的JTAG 協(xié)議不盡相同,基于TestBench或者原型驗(yàn)證的方式,在驗(yàn)證JTAG 協(xié)議上存在著驗(yàn)證效率低下、可移植性差或者無(wú)法完全復(fù)制芯片的JTAG功能,這對(duì)JTAG 協(xié)議驗(yàn)證調(diào)試提出了巨大的挑戰(zhàn)。眾所周知,通用驗(yàn)證方法學(xué)UVM 在IC 驗(yàn)證領(lǐng)域得到了全面廣泛的運(yùn)用[2-3],其所具有的封裝、繼承、面向?qū)ο蟮冗@些優(yōu)點(diǎn),并且包含大量功能全面的組件和基類,同時(shí)又擁有factory、config、TLM 等機(jī)制[4-8],使得其具有良好的移植特性。而C 語(yǔ)言作為一種悠久且優(yōu)秀的語(yǔ)言,編寫測(cè)試用例較為便利。
綜合二者的優(yōu)勢(shì),對(duì)比傳統(tǒng)的驗(yàn)證方式,方案中驗(yàn)證JTAG 協(xié)議方式猶如上位機(jī)IDE 通過(guò)JTAG 仿真器調(diào)試芯片一樣便利。C 語(yǔ)言編程可封裝大量函數(shù)供驗(yàn)證人員調(diào)用,利于僅熟悉C 語(yǔ)言編程的開(kāi)發(fā)和驗(yàn)證人員一同參與到驗(yàn)證JTAG 調(diào)試協(xié)議中。更有甚者IDE 設(shè)計(jì)開(kāi)發(fā)亦可同步進(jìn)行開(kāi)發(fā)。通過(guò)該種方法來(lái)驗(yàn)證JTAG 功能,明顯優(yōu)于依賴FPGA 原型驗(yàn)證或者設(shè)計(jì)驗(yàn)證人員寫TestBench 來(lái)驗(yàn)證其功能的方法。
JTAG 協(xié)議[9-10]是指JTAG 接口與芯片進(jìn)行通信以達(dá)到驗(yàn)證芯片功能是否正常的一種調(diào)試手段。JTAG 接口主要擁有4 根信號(hào)線:模式選擇TMS 線、時(shí)鐘TCK 線、數(shù)據(jù)輸入TDI 線、數(shù)據(jù)輸出TDO 線。另外測(cè)試復(fù)位輸入引腳TRSTn,一般低有效,可供選擇,在其有效時(shí),JTAG控制狀態(tài)機(jī)處于復(fù)位狀態(tài)TEST-LOGIC-RESET。信號(hào)TMS、TDI 均是在TCK 上升沿時(shí)被采樣,TDO 在TCK 下降沿時(shí)被采樣。TMS 信號(hào)的變化決定狀態(tài)控制器的跳轉(zhuǎn),其中無(wú)論當(dāng)前處于何種狀態(tài),若連續(xù)5 個(gè)TCK 時(shí)鐘周期內(nèi)保持TMS 為高電平,JTAG 控制狀態(tài)機(jī)必將跳轉(zhuǎn)到TEST-LOGIC-RESET。在SHIFT-DR或者SHIFT-IR狀態(tài)下,數(shù)據(jù)寄存器或者指令寄存器被置于TDI 和TDO之間,在時(shí)鐘的上升沿進(jìn)行TDI 輸入,在時(shí)鐘的下降沿進(jìn)行TDO 輸出,當(dāng)狀態(tài)機(jī)處于UPDATE-DR 或者UPDATE-IR 時(shí)將更新數(shù)據(jù)寄存器或者指令寄存器。在UVM 驗(yàn)證框架中,JTAG_DRV 類中接收J(rèn)TAG_transaction 實(shí)現(xiàn)控制器TAP 狀態(tài)的切換及數(shù)據(jù)和指令的發(fā)送。TAP 控制器16 狀態(tài)的轉(zhuǎn)換流程圖如圖1 所示[11]。
圖1 JTAG 協(xié)議狀態(tài)轉(zhuǎn)換圖
C 語(yǔ)言使用System Verilog 提供的DPI-C[12-13]技術(shù)與UVM 測(cè)試平臺(tái)進(jìn)行通信。C 語(yǔ)言側(cè)產(chǎn)生JTAG 協(xié)議測(cè)試的基本向量,通過(guò)SVC_IF 接口調(diào)用JTAG_SEQ 實(shí)現(xiàn)的包含調(diào)試信息的JTAG_transaction 方法,經(jīng)JTAG_SQR傳輸交給JTAG_DRV,JTAG_DRV 獲得該信息后驅(qū)動(dòng)JTAG 接口產(chǎn)生JTAG 時(shí)序;并且通過(guò)該接口調(diào)用JTAG_SCB 中實(shí)現(xiàn)的方法,將JTAG_MON 監(jiān)測(cè)到的TDO數(shù)據(jù)一份給JTAG_SCB用,另一份給C 語(yǔ)言調(diào)用使用。C 語(yǔ)言側(cè)根據(jù)芯片的JTAG 調(diào)試協(xié)議分析TDO 返回的數(shù)據(jù),斷言UVM 側(cè)的操作結(jié)果是否正確,以此達(dá)到驗(yàn)證芯片JTAG 調(diào)試協(xié)議的目的。針對(duì)不同的芯片,只需更換C 語(yǔ)言側(cè)的產(chǎn)生JTAG 測(cè)試向量的程序,UVM 側(cè)的平臺(tái)驗(yàn)證框架無(wú)需改變,從而達(dá)到一個(gè)平臺(tái)可驗(yàn)證多種芯片的目的。其總體測(cè)試驗(yàn)證平臺(tái)框架圖如圖2 所示。
圖2 平臺(tái)測(cè)試框架圖
根據(jù)圖2 中的平臺(tái)測(cè)試框架圖,下文詳細(xì)介紹測(cè)試平臺(tái)UVM 側(cè)的幾個(gè)重要類的實(shí)現(xiàn)方法。
(1)JTAG_transaction,繼承uvm_sequence_item。UVM 中所有信息傳輸均基于該類進(jìn)行傳輸[14]。根據(jù)JTAG 協(xié)議,transaction 需覆蓋所有有效的JTAG 基本操作。JTAG_transaction 定義中包含rand bit irdr,當(dāng)前操作是IR還是DR 操作,0 為DR 操作,1 為IR操作;rand byte op,當(dāng)前操作的狀態(tài)機(jī)轉(zhuǎn)換步驟,0 表示JTAG 操作從IDLE 狀態(tài)經(jīng)過(guò)數(shù)據(jù)/指令更新后回到IDLE 狀態(tài),即JTAG 一次完整有效的操作,1 表示JTAG 操作從IDLE 狀態(tài)發(fā)送完數(shù)據(jù)/指令后進(jìn)入PAUSE 狀態(tài),等待下一次傳輸,2 表示JTAG 從PAUSE 狀態(tài)進(jìn)入數(shù)據(jù)/指令發(fā)送完后又進(jìn)入PAUSE 狀態(tài),等待下一次傳輸,3 表示JTAG 操作從PAUSE 狀態(tài)進(jìn)入數(shù)據(jù)/指令發(fā)送完后進(jìn)行數(shù)據(jù)/指令更新后回到IDLE 狀態(tài),4 表示JTAG 從IDLE 狀態(tài)根據(jù)IR/DR 進(jìn)入相應(yīng)的SHIFT-IR/SHIFT-DR 狀態(tài)發(fā)送數(shù)據(jù),5表示JTAG 在SHIFT-IR/SHIFT-DR 狀態(tài)繼續(xù)發(fā)送未發(fā)送完的數(shù)據(jù),JTAG 狀態(tài)依然在該狀態(tài),6 表示JTAG 在SHIFT-IR/SHIFT-DR 狀態(tài)繼續(xù)發(fā)送未發(fā)送完的數(shù)據(jù),更新數(shù)據(jù)/指令后回到IDLE 狀態(tài),101 表示JTAG 在IDLE狀態(tài)循環(huán)運(yùn)行,起到延時(shí)的作用,因?yàn)橛行㎎TAG 命令操作需要經(jīng)過(guò)一段延時(shí)才起作用;rand logic [63:0] sdata,TDI 在SHIFT-DR 或者SHIFT-IR 狀態(tài)下發(fā)送的數(shù)據(jù);rand logic [63:0] rdata,接 收TDO 在SHIFT-DR或者SHIFT-IR 狀態(tài)下發(fā)出的數(shù) 據(jù);rand byte nbit,發(fā) 送TDI 的數(shù)據(jù)位數(shù)小于或等于64,若發(fā)送的數(shù)據(jù)位大于64位,可通過(guò)配置op,完成JTAG 一次完整操作。上述7 種方法除了未覆蓋從捕獲DR/IR 到退出1DR/1IR 再到更新DR/IR 這兩條路徑和測(cè)試邏輯復(fù)位到空閑到選擇DR 再到選擇IR 再到邏輯復(fù)位這條路徑,已經(jīng)覆蓋了圖1 種所有操作路徑,且這3 條路徑在實(shí)際的JTAG 協(xié)議中并沒(méi)有太大的實(shí)際意義,組合7 種方法可完成大多數(shù)芯片的JTAG協(xié)議驗(yàn)證。
(2)JTAG_DRV,繼承于uvm_driver。JTAG_sqr 傳輸?shù)腏TAG_transaction,經(jīng)該類驅(qū)動(dòng)DUT 的JTAG 接口時(shí)序。JTAG_DRV 在等待JTAG 復(fù)位完成后發(fā)送10 個(gè)TMS “1”和2 個(gè)“0”,確保JTAG 狀態(tài)處于IDLE 狀態(tài),然后根據(jù)JTAG_transaction 的設(shè)計(jì)和JTAG 狀態(tài)轉(zhuǎn)換圖1 完成JTAG 數(shù)據(jù)傳輸。其部分偽代碼如下:
(3)JTAG_MON,繼承于uvm_monitor。該類主要是監(jiān)視JTAG 接口的TDO 數(shù)據(jù)輸出,根據(jù)JTAG 協(xié)議,TDO在SHIFT-DR 或者SHIFT-IR 狀態(tài)下有效,且TDI 輸入的數(shù)據(jù)位數(shù)和TDO 的輸出位數(shù)一致[15],JTAG_MON 監(jiān)測(cè)TDO 數(shù)據(jù)時(shí),當(dāng)收集到與TDI 發(fā)送的數(shù)據(jù)位個(gè)數(shù)一致時(shí)打包TDO 數(shù)據(jù),并將數(shù)據(jù)COPY 兩份發(fā)送到JTAG_SCB,其中一份給JTAG_SCB 自身用,另一份給C 語(yǔ)言側(cè)調(diào)用。
(4)SVC_IF,該接口主要實(shí)現(xiàn)兩個(gè)功能。一個(gè)功能為發(fā)送數(shù)據(jù),函數(shù)名為sv_send_tr(input st_data a);另一個(gè)功能為接收數(shù)據(jù),函數(shù)名為sv_get_tr(output st_data a)。兩個(gè)功能函數(shù)代碼如下:
具體的實(shí)現(xiàn)方式調(diào)用其他類的實(shí)現(xiàn)方法。發(fā)送和接收的類型都為結(jié)構(gòu)體類型,UVM 側(cè)和C 語(yǔ)言的定義類似。
(5)JTAG_IF,該接口主要實(shí)現(xiàn)3 個(gè)功能:(1)根據(jù)JTAG接口的信號(hào)線定義JTAG 接口數(shù)據(jù),包括TMS、TDI、TDO、TCK、TRSTN;(2)根據(jù)接口接收的數(shù)據(jù)實(shí)現(xiàn)圖1 的JTAG 狀態(tài)轉(zhuǎn)換圖,方便在JTAG_MON 接收數(shù)據(jù)時(shí),可根據(jù)芯片的JTAG 狀態(tài)機(jī)收集TDO 數(shù)據(jù);(3)JTAG 狀態(tài)機(jī)覆蓋率統(tǒng)計(jì)。
(6)JTAG_CASE 繼承于base_test。在該類中主要實(shí)現(xiàn)SVC_IF 的接口與JTAG_SEQ 和JAG_SCB 之間的關(guān)系,使該接口可調(diào)用這兩個(gè)類實(shí)現(xiàn)的發(fā)送和接收數(shù)據(jù)的任務(wù)。其部分代碼如下所示:
C 語(yǔ)言側(cè)主要實(shí)現(xiàn)的一個(gè)關(guān)鍵函數(shù)為c_wr_data。該函數(shù)調(diào)用SVC_IF 實(shí)現(xiàn)的發(fā)送和接收數(shù)據(jù)的方法。函數(shù)的偽代碼如下所示:
另一個(gè)較重要函數(shù)為c_JTAG_delay(int dly),該函數(shù)是JTAG 狀態(tài)機(jī)在IDLE 狀態(tài)下發(fā)送op 的操作為101 的數(shù)據(jù)結(jié)構(gòu)體。該函數(shù)主要作用是提供仿真延時(shí)消耗功能。
所有驗(yàn)證JTAG 調(diào)試協(xié)議可通過(guò)組合關(guān)鍵函數(shù)而達(dá)到實(shí)現(xiàn)發(fā)送芯片JTAG 協(xié)議數(shù)據(jù)的目的。組合關(guān)鍵函數(shù)完成一條JTAG 協(xié)議的操作原則是使JTAG 控制器狀態(tài)從空閑狀態(tài)到空閑狀態(tài)。如需要發(fā)送一個(gè)長(zhǎng)度為2 048 位的IR 指令,可先發(fā)送一長(zhǎng)度為64 位、操作步驟為4 的結(jié)構(gòu)體數(shù)據(jù),再發(fā)送30 個(gè)長(zhǎng)度為64 位、操作步驟為5 的結(jié)構(gòu)體數(shù)據(jù),最后發(fā)送一長(zhǎng)度為64 位、操作步驟為6 的結(jié)構(gòu)體數(shù)據(jù),從而完成發(fā)送長(zhǎng)度為2 048 位的IR 指令。由于UVM 在驗(yàn)證中對(duì)transaction 的接收是沒(méi)有時(shí)間消耗[16]的,從仿真時(shí)間上看為連續(xù)發(fā)送一個(gè)2 048 位的IR指令,而且操作結(jié)束后JTAG 狀態(tài)機(jī)依然在空閑狀態(tài)。
圖3 為JTAG 發(fā)送和接收的波形圖,波形中反映的信息與對(duì)應(yīng)的C 語(yǔ)言發(fā)送的數(shù)據(jù)結(jié)果一致。圖中反映了芯片的BYPASS 功能,TDI 輸入的數(shù)據(jù)位0x5533ccaa,TDO 輸出的應(yīng)為0xaa679954。由圖3 可知,TDO 輸出的數(shù)據(jù)符合測(cè)試預(yù)期。
圖3 基本數(shù)據(jù)發(fā)送和接收功能測(cè)試
圖4 為某一芯片connect 過(guò)程圖,不同芯片連接過(guò)程不盡相同。在該方案中對(duì)某一芯片調(diào)用基本的發(fā)送和接收功能函數(shù),按照該芯片的連接順序發(fā)送和接收數(shù)據(jù),根據(jù)返回來(lái)的芯片狀態(tài)數(shù)據(jù)判斷連接成功。測(cè)試中通過(guò)對(duì)PC 寄存器寫一固定數(shù)據(jù)并讀回來(lái),若數(shù)據(jù)一致,則判斷芯片連接成功。
圖4 connect 測(cè)試結(jié)果
從圖4 中結(jié)果看出,芯片已連接成功。圖中PC 值長(zhǎng)時(shí)間停留在0x3ff79,接著對(duì)PC 值進(jìn)行賦值0x83db,PC讀出來(lái)的值亦為0x83db,且未發(fā)生變化。
在JTAG 調(diào)試協(xié)議中,所有的JTAG 功能都可以分解為對(duì)寄存器的讀寫和對(duì)RAM 空間的讀寫。圖5中,對(duì)某芯片的外設(shè)UART 寄存器SPIDAT 進(jìn)行讀寫操作,根據(jù)C語(yǔ)言側(cè)返回的數(shù)據(jù)以及芯片內(nèi)部相應(yīng)的寄存器的實(shí)際結(jié)果表明可正確讀寫SPIDAT 寄存器。讀寫UART 寄存器如圖5 所示。
圖5 對(duì)外設(shè)UART 寄存器讀寫操作
對(duì)某芯片進(jìn)行BYPASS 功能和連接操作,然后選取幾個(gè)寄存器和RAM 進(jìn)行讀寫操作,操作結(jié)果均達(dá)到了測(cè)試的效果,如圖6 所示。從上述測(cè)試結(jié)果可以得出,運(yùn)用該方法測(cè)試JTAG 調(diào)試協(xié)議是可行的。
圖6 系統(tǒng)測(cè)試結(jié)果
測(cè)試用例覆蓋所有的JTAG 狀態(tài)機(jī),包括JTAG 的TRST 從0 跳變到1 的復(fù)位功能;保證JTAG transaction 覆蓋op、IR/DR 所有操作,讀寫RAM,讀寫寄存器的基本操作。所有芯片的JTAG 操作命令都可以通過(guò)組合JTAG transaction 而達(dá)到相應(yīng)的操作機(jī)制。功能覆蓋率如圖7、圖8 所示,結(jié)果表明覆蓋率達(dá)到100%。
圖7 JTAG 狀態(tài)機(jī)和復(fù)位覆蓋率
圖8 JTAG 基本操作功能覆蓋率
相對(duì)于前文引言中提到的一些驗(yàn)證JTAG 協(xié)議的方法,本文中設(shè)計(jì)的方案進(jìn)行了如表1 的比較。結(jié)果表明方案優(yōu)于FPGA 原型驗(yàn)證或者TestBench SystemVerilog方式的驗(yàn)證。
表1 驗(yàn)證方法結(jié)果比較
本文結(jié)合UVM 通用驗(yàn)證方法學(xué)和C 語(yǔ)言,設(shè)計(jì)了一種用于驗(yàn)證調(diào)試多種芯片JTAG 協(xié)議的方案。仿真結(jié)果表明,針對(duì)不同芯片的JTAG 協(xié)議的驗(yàn)證,UVM 側(cè)的基本框架不需改變,直接移植;C 語(yǔ)言側(cè)的測(cè)試case,只需重新組合調(diào)用實(shí)現(xiàn)的基本函數(shù)即可,大大提高了驗(yàn)證JTAG 調(diào)試協(xié)議的便捷性。方案亦為驗(yàn)證芯片JTAG 協(xié)議提供了一種新思路。