APP下载

基于UVM 和C 语言验证JTAG 调试协议的研究与实现

2023-11-10陶青平沈婧

电子技术应用 2023年10期
关键词:状态机寄存器调试

陶青平,沈婧

(中国电子科技集团公司第五十八研究所,江苏 无锡 214035)

0 引言

随着集成电路工艺的快速发展,芯片的研究设计周期亦在不断缩短[1]。四线制的JTAG 接口调试依然是大多数芯片设计采用的调试手段。JTAG 协议功能的好坏很大程度上决定了流片回来后的芯片是否具有可调试状态。不同芯片的JTAG 协议不尽相同,基于TestBench或者原型验证的方式,在验证JTAG 协议上存在着验证效率低下、可移植性差或者无法完全复制芯片的JTAG功能,这对JTAG 协议验证调试提出了巨大的挑战。众所周知,通用验证方法学UVM 在IC 验证领域得到了全面广泛的运用[2-3],其所具有的封装、继承、面向对象等这些优点,并且包含大量功能全面的组件和基类,同时又拥有factory、config、TLM 等机制[4-8],使得其具有良好的移植特性。而C 语言作为一种悠久且优秀的语言,编写测试用例较为便利。

综合二者的优势,对比传统的验证方式,方案中验证JTAG 协议方式犹如上位机IDE 通过JTAG 仿真器调试芯片一样便利。C 语言编程可封装大量函数供验证人员调用,利于仅熟悉C 语言编程的开发和验证人员一同参与到验证JTAG 调试协议中。更有甚者IDE 设计开发亦可同步进行开发。通过该种方法来验证JTAG 功能,明显优于依赖FPGA 原型验证或者设计验证人员写TestBench 来验证其功能的方法。

1 JTAG 协议

JTAG 协议[9-10]是指JTAG 接口与芯片进行通信以达到验证芯片功能是否正常的一种调试手段。JTAG 接口主要拥有4 根信号线:模式选择TMS 线、时钟TCK 线、数据输入TDI 线、数据输出TDO 线。另外测试复位输入引脚TRSTn,一般低有效,可供选择,在其有效时,JTAG控制状态机处于复位状态TEST-LOGIC-RESET。信号TMS、TDI 均是在TCK 上升沿时被采样,TDO 在TCK 下降沿时被采样。TMS 信号的变化决定状态控制器的跳转,其中无论当前处于何种状态,若连续5 个TCK 时钟周期内保持TMS 为高电平,JTAG 控制状态机必将跳转到TEST-LOGIC-RESET。在SHIFT-DR或者SHIFT-IR状态下,数据寄存器或者指令寄存器被置于TDI 和TDO之间,在时钟的上升沿进行TDI 输入,在时钟的下降沿进行TDO 输出,当状态机处于UPDATE-DR 或者UPDATE-IR 时将更新数据寄存器或者指令寄存器。在UVM 验证框架中,JTAG_DRV 类中接收JTAG_transaction 实现控制器TAP 状态的切换及数据和指令的发送。TAP 控制器16 状态的转换流程图如图1 所示[11]。

图1 JTAG 协议状态转换图

2 UVM 验证平台框架

C 语言使用System Verilog 提供的DPI-C[12-13]技术与UVM 测试平台进行通信。C 语言侧产生JTAG 协议测试的基本向量,通过SVC_IF 接口调用JTAG_SEQ 实现的包含调试信息的JTAG_transaction 方法,经JTAG_SQR传输交给JTAG_DRV,JTAG_DRV 获得该信息后驱动JTAG 接口产生JTAG 时序;并且通过该接口调用JTAG_SCB 中实现的方法,将JTAG_MON 监测到的TDO数据一份给JTAG_SCB用,另一份给C 语言调用使用。C 语言侧根据芯片的JTAG 调试协议分析TDO 返回的数据,断言UVM 侧的操作结果是否正确,以此达到验证芯片JTAG 调试协议的目的。针对不同的芯片,只需更换C 语言侧的产生JTAG 测试向量的程序,UVM 侧的平台验证框架无需改变,从而达到一个平台可验证多种芯片的目的。其总体测试验证平台框架图如图2 所示。

图2 平台测试框架图

3 组件部分设计

根据图2 中的平台测试框架图,下文详细介绍测试平台UVM 侧的几个重要类的实现方法。

(1)JTAG_transaction,继承uvm_sequence_item。UVM 中所有信息传输均基于该类进行传输[14]。根据JTAG 协议,transaction 需覆盖所有有效的JTAG 基本操作。JTAG_transaction 定义中包含rand bit irdr,当前操作是IR还是DR 操作,0 为DR 操作,1 为IR操作;rand byte op,当前操作的状态机转换步骤,0 表示JTAG 操作从IDLE 状态经过数据/指令更新后回到IDLE 状态,即JTAG 一次完整有效的操作,1 表示JTAG 操作从IDLE 状态发送完数据/指令后进入PAUSE 状态,等待下一次传输,2 表示JTAG 从PAUSE 状态进入数据/指令发送完后又进入PAUSE 状态,等待下一次传输,3 表示JTAG 操作从PAUSE 状态进入数据/指令发送完后进行数据/指令更新后回到IDLE 状态,4 表示JTAG 从IDLE 状态根据IR/DR 进入相应的SHIFT-IR/SHIFT-DR 状态发送数据,5表示JTAG 在SHIFT-IR/SHIFT-DR 状态继续发送未发送完的数据,JTAG 状态依然在该状态,6 表示JTAG 在SHIFT-IR/SHIFT-DR 状态继续发送未发送完的数据,更新数据/指令后回到IDLE 状态,101 表示JTAG 在IDLE状态循环运行,起到延时的作用,因为有些JTAG 命令操作需要经过一段延时才起作用;rand logic [63:0] sdata,TDI 在SHIFT-DR 或者SHIFT-IR 状态下发送的数据;rand logic [63:0] rdata,接 收TDO 在SHIFT-DR或者SHIFT-IR 状态下发出的数 据;rand byte nbit,发 送TDI 的数据位数小于或等于64,若发送的数据位大于64位,可通过配置op,完成JTAG 一次完整操作。上述7 种方法除了未覆盖从捕获DR/IR 到退出1DR/1IR 再到更新DR/IR 这两条路径和测试逻辑复位到空闲到选择DR 再到选择IR 再到逻辑复位这条路径,已经覆盖了图1 种所有操作路径,且这3 条路径在实际的JTAG 协议中并没有太大的实际意义,组合7 种方法可完成大多数芯片的JTAG协议验证。

(2)JTAG_DRV,继承于uvm_driver。JTAG_sqr 传输的JTAG_transaction,经该类驱动DUT 的JTAG 接口时序。JTAG_DRV 在等待JTAG 复位完成后发送10 个TMS “1”和2 个“0”,确保JTAG 状态处于IDLE 状态,然后根据JTAG_transaction 的设计和JTAG 状态转换图1 完成JTAG 数据传输。其部分伪代码如下:

(3)JTAG_MON,继承于uvm_monitor。该类主要是监视JTAG 接口的TDO 数据输出,根据JTAG 协议,TDO在SHIFT-DR 或者SHIFT-IR 状态下有效,且TDI 输入的数据位数和TDO 的输出位数一致[15],JTAG_MON 监测TDO 数据时,当收集到与TDI 发送的数据位个数一致时打包TDO 数据,并将数据COPY 两份发送到JTAG_SCB,其中一份给JTAG_SCB 自身用,另一份给C 语言侧调用。

(4)SVC_IF,该接口主要实现两个功能。一个功能为发送数据,函数名为sv_send_tr(input st_data a);另一个功能为接收数据,函数名为sv_get_tr(output st_data a)。两个功能函数代码如下:

具体的实现方式调用其他类的实现方法。发送和接收的类型都为结构体类型,UVM 侧和C 语言的定义类似。

(5)JTAG_IF,该接口主要实现3 个功能:(1)根据JTAG接口的信号线定义JTAG 接口数据,包括TMS、TDI、TDO、TCK、TRSTN;(2)根据接口接收的数据实现图1 的JTAG 状态转换图,方便在JTAG_MON 接收数据时,可根据芯片的JTAG 状态机收集TDO 数据;(3)JTAG 状态机覆盖率统计。

(6)JTAG_CASE 继承于base_test。在该类中主要实现SVC_IF 的接口与JTAG_SEQ 和JAG_SCB 之间的关系,使该接口可调用这两个类实现的发送和接收数据的任务。其部分代码如下所示:

4 C 语言方法实现

C 语言侧主要实现的一个关键函数为c_wr_data。该函数调用SVC_IF 实现的发送和接收数据的方法。函数的伪代码如下所示:

另一个较重要函数为c_JTAG_delay(int dly),该函数是JTAG 状态机在IDLE 状态下发送op 的操作为101 的数据结构体。该函数主要作用是提供仿真延时消耗功能。

所有验证JTAG 调试协议可通过组合关键函数而达到实现发送芯片JTAG 协议数据的目的。组合关键函数完成一条JTAG 协议的操作原则是使JTAG 控制器状态从空闲状态到空闲状态。如需要发送一个长度为2 048 位的IR 指令,可先发送一长度为64 位、操作步骤为4 的结构体数据,再发送30 个长度为64 位、操作步骤为5 的结构体数据,最后发送一长度为64 位、操作步骤为6 的结构体数据,从而完成发送长度为2 048 位的IR 指令。由于UVM 在验证中对transaction 的接收是没有时间消耗[16]的,从仿真时间上看为连续发送一个2 048 位的IR指令,而且操作结束后JTAG 状态机依然在空闲状态。

5 仿真结果与分析

5.1 基本数据发送接收功能测试结果分析

图3 为JTAG 发送和接收的波形图,波形中反映的信息与对应的C 语言发送的数据结果一致。图中反映了芯片的BYPASS 功能,TDI 输入的数据位0x5533ccaa,TDO 输出的应为0xaa679954。由图3 可知,TDO 输出的数据符合测试预期。

图3 基本数据发送和接收功能测试

5.2 connect 测试结果分析

图4 为某一芯片connect 过程图,不同芯片连接过程不尽相同。在该方案中对某一芯片调用基本的发送和接收功能函数,按照该芯片的连接顺序发送和接收数据,根据返回来的芯片状态数据判断连接成功。测试中通过对PC 寄存器写一固定数据并读回来,若数据一致,则判断芯片连接成功。

图4 connect 测试结果

从图4 中结果看出,芯片已连接成功。图中PC 值长时间停留在0x3ff79,接着对PC 值进行赋值0x83db,PC读出来的值亦为0x83db,且未发生变化。

5.3 读写寄存器/RAM 结果分析

在JTAG 调试协议中,所有的JTAG 功能都可以分解为对寄存器的读写和对RAM 空间的读写。图5中,对某芯片的外设UART 寄存器SPIDAT 进行读写操作,根据C语言侧返回的数据以及芯片内部相应的寄存器的实际结果表明可正确读写SPIDAT 寄存器。读写UART 寄存器如图5 所示。

图5 对外设UART 寄存器读写操作

5.4 系统测试

对某芯片进行BYPASS 功能和连接操作,然后选取几个寄存器和RAM 进行读写操作,操作结果均达到了测试的效果,如图6 所示。从上述测试结果可以得出,运用该方法测试JTAG 调试协议是可行的。

图6 系统测试结果

5.5 功能覆盖率

测试用例覆盖所有的JTAG 状态机,包括JTAG 的TRST 从0 跳变到1 的复位功能;保证JTAG transaction 覆盖op、IR/DR 所有操作,读写RAM,读写寄存器的基本操作。所有芯片的JTAG 操作命令都可以通过组合JTAG transaction 而达到相应的操作机制。功能覆盖率如图7、图8 所示,结果表明覆盖率达到100%。

图7 JTAG 状态机和复位覆盖率

图8 JTAG 基本操作功能覆盖率

5.6 方法优越性比较

相对于前文引言中提到的一些验证JTAG 协议的方法,本文中设计的方案进行了如表1 的比较。结果表明方案优于FPGA 原型验证或者TestBench SystemVerilog方式的验证。

表1 验证方法结果比较

6 结论

本文结合UVM 通用验证方法学和C 语言,设计了一种用于验证调试多种芯片JTAG 协议的方案。仿真结果表明,针对不同芯片的JTAG 协议的验证,UVM 侧的基本框架不需改变,直接移植;C 语言侧的测试case,只需重新组合调用实现的基本函数即可,大大提高了验证JTAG 调试协议的便捷性。方案亦为验证芯片JTAG 协议提供了一种新思路。

猜你喜欢

状态机寄存器调试
Lite寄存器模型的设计与实现
基于有限状态机的交会对接飞行任务规划方法
基于航拍无人机的设计与调试
FOCAS功能在机床调试中的开发与应用
分簇结构向量寄存器分配策略研究*
无线通信中频线路窄带临界调试法及其应用
调压柜的调试与试运行探讨
高速数模转换器AD9779/AD9788的应用
FPGA设计中状态机安全性研究
基于反熔丝FPGA的有限状态机加固设计