1985年欧洲的制造机构为了对集成电路的测试进行研究,成立了欧洲联合测试行动组织(JETAG:Joint European Test Action Group),后来与北美公司合作在1986年该组织更名为了JTAG(Joint Test Action Group),并且指定了相应的测试标准.该标准于1990年被IEEE 批准为一种国际标准测试协议IEEE1149.1-1990,即测试访问端口和边界扫描结构标准.该标准规定了进行边界扫描所需要的硬件和软件.自从1990 年批准后,IEEE 分别于1993 年和1995 年对该标准作了补充,形成了现在使用的IEEE1149.1a-1993 和IEEE1149.1b-1994.
JTAG一般具有三大功能:
- 下载器,我们知道芯片跟外界通信的引脚上的信号无非是数据和控制信号,而所有的这些信号通过引脚后都会穿过包裹cpu的扫描链,那么完全也可以在某种模式下通过扫描链的TDI进行程序编码后灌入到相应的存储体中,从而可以实现程序的下载,也可以实现程序的调试等;
- DEBUG;
- 边界扫描,我们知道芯片都是通过引脚与外围设备进行交互的,所有的数据都会通过引脚进入芯片,而通过在芯片中插入扫描链就可以实现对引脚信号的监控的目的;
因此,JTAG在实际的工程中主要应用于:电路的边界扫描测试、ISP(In-System-Programmable,在线编程)、对FLASH编程等(传统生产流程中都是先对芯片进行预编程在装到板上),而其最初是用来进行边界测试的,在每个芯片的内部一般都会有一个TAP(Test Access Port,测试访问口)控制器(实际上实现了一个状态机,共16个状态,该状态机结构如下图所示),然后JTAG测试激励通过TMS信号控制TAP状态机跳转,在不同的状态下完成对应的操作和产生所需要的控制信号.
而JTAG测试工具一般通过以下主要接口与TAP控制器进行交互:
TCK(Test Clock)——测试时钟输入,该测试时钟是独立的,因此原功能时钟是无关的;
TDI(Test Data In)——测试数据输入,数据通过TDI输入JTAG口,其输入数据的方式一般为两种,一种是指令信号,送入指令寄存器,一种是测试数据,输入到相应的边界扫描寄存器中;
TDO(Test Data Out)——测试数据输出,数据通过TDO从JTAG口输出,输出的数据有两种,一种是从指令寄存器移位出来的指令,一种是从边界扫描寄存器移位出来的数据;
TMS(Test Mode Select)——测试模式选择,TMS用来设置JTAG口处于某种特定的测试模式,一般在TCK上升沿采样;
可选引脚TRST——测试复位,输入引脚,低电平有效.
一般的JTAG结构如下:
其中在TAP控制器的状态机中DR指数据寄存器和IR指指令寄存器主要实现了指令的执行、译码、锁存等操作,每个TAP控制器有一个IR,但是可以有多个DR寄存器.
IR寄存器由移位寄存器和锁存器组成,长度等于指令的长度.IR连接在TDI和TDO之间,指令从TDI串行输入,同时锁存在锁存器中.这里需要注意,因为JTAG有3个强制令(EXTEST、BYPASS、SAMPLE/PERIOD),所以该寄存器的宽度至少为2位.
DR寄存器与IR类似,IR寄存器中处理的不同指令一般对应不同的DR寄存器.
BR寄存器与IR寄存器一样连接在TDI和TDO之间,该寄存器宽度为1位,提供了TDI和TDO之间的最小串行通道;
IDR寄存器是一个32位的寄存器,其内容一般是关于该器件的版本号、型号、制造厂商等信息,当需要对该器件进行替换时可查询该寄存器;
边界扫描寄存器(BSR,Boundary-Scan Register)由器件引脚上的所有边界扫描单元(BSC,Boundary-Scan Cell)组成,这些串联起来的BSC在IC内部构成JTAG回路,所有的BSR边界扫描寄存器通过JTAG测试激活,平时这些引脚保持正常的IC功能,其路径如下图所示:
当芯片处于调试状态时,BSC可以将芯片和外部的输入输出管脚隔离开,相当于在芯片和外部管脚之间插入了一个监视装置,实现对芯片外部输入和输出管脚的观察和控制.对于芯片的输出引脚可以通过与之相连的BSC把信号加载到该引脚上,对于芯片的输入引脚,也可以通过与之相连的BSC捕获该引脚的输出信号.在正常的工作状态下, BSC对芯片来说是透明的,所以芯片的正常运行不会受到任何影响.另外,芯片管脚上的BSC可以连接起来形成边界扫描链,其输入输出是串行的,通过相应的控制信号即可方便的观察和控制处于调试状态下的芯片.
前文中提到所有的JTAG IR寄存器都必须涵盖三条强制指令,这些强制指令提供了JTAG的基本操作,其主要作用如下:
BYPASS指令:当IR中的值为全1时,表征的指令为BYPASS,选择芯片中的BR寄存器,从而决定该芯片是否被测试.在BYPASS模式下,此时TDI仅经过一级触发器即可输出至TDO,可以通过这种方式计算TDI经过多少个时钟周期到达串联芯片最后一级的TDO,从而可以计算出有多少个芯片位于JTAG扫描链上,示意图如下:
EXTEST指令:该指令主要用于边界扫描设计以外的逻辑电路,将向量串行移位至边界扫描寄存器,从而激励被测的连线或者逻辑电路,同时该寄存器会捕获响应数据,并将测试结果串行移位输出;
SAMPLE/PERIOD指令:这两个指令在IEEE 1149.1-2001中这两个指令分开了,分成了一个SAMPLE指令,一个PRELOAD指令.选择SAMPLE/PERIOD指令时,IC工作在正常的工作模式下,即该命令对芯片的操作不会影响芯片的正常工作.SAMPLE指令通过对数据的扫描操作完成对边界扫描寄存器的访问,并对输入和离开芯片的数据进行采样.PRELOAD指令与SAMPLE基本相同,只是此时装入边界扫描寄存器中的数据是编程者已知确定的;
除了上述三个强制指令外,JTAG还定义了一些其他指令,用户可根据需要查询相关手册,再次不进行赘述.