JTAG and Boundary Scan(zz)
[转] IEEE Standard 1149.1——Test Access Port and Boundary-Scan Architecture
![此博文包含图片 JTAG and Boundary Scan(zz) - Lexlin - lexlin的博客](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
1. 简介
JTAG(Joint Test Action
Group,联合测试行动小组)是1985年制定的检测PCB和IC芯片的一个标准,后来逐步发展用于支持其他功能,如ATPG(automatic
test pattern generation)和BIST(built-in
self-test)等。 1990年被修改后成为IEEE的一个标准,即IEEE1149.1-1990,2001年jtag对此标准进行了更新。IEEE
1149.1标准就是由JTAG这个组织最初提出的,最终由IEEE批准并且标准化的。所以,这个IEEE
1149.1这个标准一般也俗称JTAG调试标准。此外,JTAG还推出了如1149.4(用于数模混合电路)、1149.7(减少了测试引脚)等电路。
JTAG最初是用来对芯片进行测试的,基本原理是在器件内部定义一个TAP(Test Access
Port
测试访问口)通过专用的JTAG测试工具对进行内部节点进行测试。JTAG测试允许多个器件通过JTAG接口串联在一起,形成一个JTAG链,能实现对各个器件分别测试。现在,JTAG接口还常用于实现ISP(In-System
Programmable 在线编程),对FLASH等器件进行编程。
2.
Boundary-Scan 边界扫描
边界扫描技术的基本
思想是在靠近芯片的输入输出管脚上增加一个移位寄存器单元。因为这些移位寄存器单元都分布在芯片的边界上(周围),所以被称为边界扫描寄存器
(Boundary-Scan
Register
Cell)。当芯片处于调试状态的时候,这些边界扫描寄存器可以将芯片和外围的输入输出隔离开来。通过这些边界扫描寄存器单元,可以实现对芯片输入输出信
号的观察和控制。对于芯片的输入管脚,可以通过与之相连的边界扫描寄存器单元把信号(数据)加载倒该管脚中去;对于芯片的输出管脚,也可以通过与之相连的
边界扫描寄存器“捕获”(CAPTURE)该管脚上的输出信号。在正常的运行状态下,这些边界扫描寄存器对芯片来说是透明的,所以正常的运行不会受到任何
影响。这样,边界扫描寄存器提供了一个便捷的方式用以观测和控制所需要调试的芯片。另外,芯片输入输出管脚上的边界扫描(移位)寄存器单元可以相互连接起
来,在芯片的周围形成一个边界扫描链(Boundary-Scan
Chain)。一般的芯片都会提供几条独立的边界扫描链,用来实现完整的测试功能。边界扫描链可以串行的输入和输出,通过相应的时钟信号和控制信号,就可
以方便的观察和控制处在调试状态下的芯片。
利用边界扫描链可以实现对芯片的输入输出进行观察和控制。下一个问题是:如何来管理和使用这些边界扫描链?对边界扫描链的控制主要是通过TAP
(Test Access
Port)Controller来完成的。在下一个小节,我们一起来看看TAP是如何工作的。
3. TAP(TEST ACCESS PORT)
在上一节,我们已经简单介绍了边界扫描链,而且也了解了一般的芯片都会提供几条边界扫描链,用来实现完整的测试功能。下面,我将逐步介绍如何实现扫描链的控制和访问。
在IEEE
1149.1标准里面,寄存器被分为两大类:数据寄存器(DR-Data Register)和指令寄存器(IR-Instruction
Register)。边界扫描链属于数据寄存器中很重要的一种。边界扫描链用来实现对芯片的输入输出的观察和控制。而指令寄存器用来实现对数据寄存器的控
制,例如:在芯片提供的所有边界扫描链中,选择一条指定的边界扫描链作为当前的目标扫描链,并作为访问对象。下面,让我们从TAP(Test
Access Port)开始。
TAP是一个通用的端口,通过TAP可以访问芯片提供的所有数据寄存器(DR)和指令寄存器(IR)。对整个TAP的控制是通过TAP
Controller来完成的。TAP总共包括5个信号接口TCK、TMS、TDI、TDO和TRST
:其中4个是输入信号接口和另外1个是输出信号接口,其中TRST是可选信号,其余均为必选信号。一般,我们见到的开发板上都有一个JTAG接口,该JTAG接口的主要信号接口就是这5个。下面,我先分别介绍这个5个接口信号及其作用。
Test
Clock Input (TCK)
TCK为TAP的操作提供了一个独立的、基本的时钟信号,TAP的所有操作都是通过这个时钟信号来驱动的。
Test Mode Selection Input
(TMS)
TMS信号用来控制TAP状态机的转换。通过TMS信号,可以控制TAP在不同的状态间相互转换。TMS信号在TCK的上升沿有效。
Test Data Input (TDI)
TDI是数据输入的接口。所有要输入到特定寄存器的数据都是通过TDI接口一位一位串行输入的(由TCK驱动)。
Test Data Output (TDO)
TDO是数据输出的接口。所有要从特定的寄存器中输出的数据都是通过TDO接口一位一位串行输出的(由TCK驱动)。
Test
Reset Input (TRST)
TRST可以用来对TAP
Controller进行异步复位(初始化)。此信号为可选信号。对TAP
Controller的复位还可以通过对TMS持续输入5个时钟的高电平进行实现。
通过TAP接口,对数据寄存器(DR)进行访问的一般过程是:
1)
通过指令寄存器(IR),选定一个需要访问的数据寄存器;
2)
把选定的数据寄存器连接到TDI和TDO之间;
3)
由TCK驱动,通过TDI,把需要的数据输入到选定的数据寄存器当中去;同时把选定的数据寄存器中的数据通过TDO读出来。
TAP的状态机
TAP的状态机如图1所示,总共有16个状态。在图中,每个六边形表示一个状态,六边形中标有该状态的名称和标识代码。图中的箭头表示了TAP
Controller内部所有可能的状态转换流程。状态的转换是由TMS控制的,所以在每个箭头上有标有tms = 0 或者 tms =
1。在TCK的驱动下,从当前状态到下一个状态的转换是由TMS信号决定。假设TAP
Controller的当前状态为Select-DR-Scan,在TCK的驱动下,如果TMS = 0,TAP
Controller进入Capture-DR状态;如果TMS = 1,TAP
Controller进入Select-IR-Scan状态。
此状态机中,除了Test-Logic
Reset和Test-Run/Idle状态外,其他的状态有些类似。7个对于数据寄存器(DR)的操作和7个对于指令寄存器(IR)的操作一一对应,相应的功能也类似,只是所选择的寄存器不同。
在详细描述整个状态机中的每一个状态之前,首先让我们来想一想:要通过边界扫描链来观察和控制芯片的输入和输出,需要做些什么?如果需要捕获芯片某个管脚
上的输出,首先需要把该管脚上的输出装载到边界扫描链的寄存器单元里去,然后通过TDO输出,这样我们就可以从TDO上得到相应管脚上的输出信号。如果要
在芯片的某个管脚上加载一个特定的信号,则首先需要通过TDI把期望的信号移位到与相应管脚相连的边界扫描链的寄存器单元里去,然后把该寄存器单元的值加
载到相应的芯片管脚。下面,让我们一起来看看每个状态具体表示什么意思?完成什么功能?
Test-Logic Reset
系统上电后,TAP
Controller自动进入该状态。在该状态下,测试部分的逻辑电路全部被禁用,以保证芯片核心逻辑电路的正常工作。通过TRST信号也可以对测试逻辑电路进行复位,使得TAP
Controller进入Test-Logic
Reset状态。前面我们说过TRST是可选的一个信号接口,这是因为在TMS上连续加5个TCK脉冲宽度的“1”信号也可以对测试逻辑电路进行复位,使得TAP
Controller进入Test-Logic
Reset状态。所以,在不提供TRST信号的情况下,也不会产生影响。在该状态下,如果TMS一直保持为“1”,TAP
Controller将保持在Test-Logic Reset状态下;如果TMS由“1”变为“0”(在TCK的上升沿触发),将使TAP
Controller进入Run-Test/Idle状态。
Run-Test/Idle(运行或闲置状态)
这个是TAP
Controller在不同操作间的一个中间状态。这个状态下的动作取决于当前指令寄存器中的指令。有些指令会在该状态下执行一定的操作,而有些指令在该状态下不需要执行任何操作。在该状态下,如果TMS一直保持为“0”,TAP
Controller将一直保持在Run-Test/Idle状态下;如果TMS由“0”变为“1”(在TCK的上升沿触发),将使TAP
Controller进入Select-DR-Scan状态。
Select-DR-Scan
这是一个临时的中间状态。如果TMS为“0”
(在TCK的上升沿触发),TAP
Controller进入Capture-DR状态,后续的系列动作都将以数据寄存器作为操作对象;如果TMS为“1”
(在TCK的上升沿触发),TAP Controller进入Select-IR-Scan状态。
Capture-DR
当TAP
Controller在这个状态中,在TCK的上升沿,芯片输出管脚上的信号将被“捕获”到与之对应的数据寄存器的各个单元中去。如果TMS为“0”
(在TCK的上升沿触发),TAP Controller进入Shift-DR状态;如果TMS为“1” (在TCK的上升沿触发),TAP
Controller进入Exit1-DR状态。
Shift-DR
在这个状态中,由TCK驱动,每一个时钟周期,被连接在TDI和TDO之间的数据寄存器将从TDI接收一位数据,同时通过TDO输出一位数据。如果TMS
为“0”
(在TCK的上升沿触发),TAP Controller保持在Shift-DR状态; 如果TMS为“1”
(在TCK的上升沿触发),TAP
Controller进入到Exit1-DR状态。假设当前的数据寄存器的长度为4。如果TMS保持为0,那在4个TCK时钟周期后,该数据寄存器中原来
的4位数据(一般是在Capture-DR状态中捕获的数据)将从TDO输出来;同时该数据寄存器中的每个寄存器单元中将分别获得从TDI输入的4位新数
据。
Update-DR
在Update-DR状态下,由TCK上升沿驱动,数据寄存器当中的数据将被加载到相应的芯片管脚上去,用以驱动芯片。在该状态下,如果TMS为“0”,TAP
Controller将回到Run-Test/Idle状态;如果TMS为“1”,TAP
Controller将进入Select-DR-Scan状态。
Select-IR-Scan
这是一个临时的中间状态。如果TMS为“0”
(在TCK的上升沿触发),TAP
Controller进入Capture-IR状态,后续的系列动作都将以指令寄存器作为操作对象;如果TMS为“1”
(在TCK的上升沿触发),TAP Controller进入Test-Logic Reset状态。
Capture-IR
当TAP
Controller在这个状态中,在TCK的上升沿,一个特定的逻辑序列将被装载到指令寄存器中去。如果TMS为“0”
(在TCK的上升沿触发),TAP Controller进入Shift-IR状态;如果TMS为“1” (在TCK的上升沿触发),TAP
Controller进入Exit1-IR状态。
Shift-IR
在这个状态中,由TCK驱动,每一个时钟周期,被连接在TDI和TDO之间的指令寄存器将从TDI接收一位数据,同时通过TDO输出一位数据。如果TMS
为“0”
(在TCK的上升沿触发),TAP Controller保持在Shift-IR状态; 如果TMS为“1”
(在TCK的上升沿触发),TAP
Controller进入到Exit1-IR状态。假设指令寄存器的长度为4。如果TMS保持为0,那在4个TCK时钟周期后,指令寄存器中原来的
4bit长的特定逻辑序列(在Capture-IR状态中捕获的特定逻辑序列)将从TDO输出来,该特定的逻辑序列可以用来判断操作是否正确;同时指令寄
存器将获得从TDI输入的一个4bit长的新指令。
Update-IR
在这个状态中,在Shift-IR状态下输入的新指令将被用来更新指令寄存器。
说了那么多,下面,让我们先看看指令寄存器和数据寄存器访问的一般过程,以便建立一个直观的概念。
1. 系统上电,TAP Controller进入Test-Logic
Reset状态,然后依次进入:Run-Test/Idle ---> Select-DR-Scan
---> Select-IR-Scan ---> Capture-IR
---> Shift-IR ---> Exit1-IR
--->
Update-IR,最后回到Run-Test/Idle状态。在Capture-IR状态中,一个特定的逻辑序列被加载到指令寄存器当中;然后进入到
Shift-IR状态。在Shift-IR状态下,通过TCK的驱动,可以将一条特定的指令送到指令寄存器当中去。每条指令都将确定一条相关的数据寄存
器。然后从Shift-IR
---> Exit1-IR --->
Update-IR。在Update-IR状态,刚才输入到指令寄存器中的指令将用来更新指令寄存器。最后,进入到Run-Test/Idle状态,指令生效,完成对指令寄存器的访问。
2.
当前可以访问的数据寄存器由指令寄存器中的当前指令决定。要访问由刚才的指令选定的数据寄存器,需要以Run-Test/Idle为起点,依次进入Select-DR-Scan
---> Capture-DR ---> Shift-DR
---> Exit1-DR --->
Update-DR,最后回到Run-Test/Idle状态。在这个过程当中,被当前指令选定的数据寄存器会被连接在TDI和TDO之间。通过TDI和
TDO,就可以将新的数据加载到数据寄存器当中去,同时,也可以捕获数据寄存器中的数据。具体过程如下。在Capture-DR状态中,由TCK的驱动,
芯片管脚上的输出信号会被“捕获”到相应的边界扫描寄存器单元中去。这样,当前的数据寄存器当中就记录了芯片相应管脚上的输出信号。接下来从
Capture-DR进入到Shift-DR状态中去。在Shift-DR状态中,由TCK驱动,在每一个时钟周期内,一位新的数据可以通过TDI串行输
入到数据寄存器当中去,同时,数据寄存器可以通过TDO串行输出一位先前捕获的数据。在经过与数据寄存器长度相同的时钟周期后,就可以完成新信号的输入和
捕获数据的输出。接下来通过Exit1-DR状态进入到Update-DR状态。在Update-DR状态中,数据寄存器中的新数据被加载到与数据寄存器
的每个寄存器单元相连的芯片管脚上去。最后,回到Run-Test/Idle状态,完成对数据寄存器的访问。
上面描述的就是通过TAP对数据寄存器进行访问的一般流程。会不会还是觉得很抽象?让我们来看一个更直观的例子。现在假设,TAP
Controller现在处在Run-Test/Idle状态,指令寄存器当中已经成功的写入了一条新的指令,该指令选定的是一条长度为6的边界扫描链。下面让我们来看看实际如何来访问这条边界扫描链。图2所示的是测试芯片及其被当前指令选定的长度为6的边界扫描链。
由图2可以看出,当前选择的边界扫描链由6个边界扫描移位寄存器单元组成,并且被连接在TDI和TDO之间。TCK时钟信号与每个边界扫描移位寄存器单元
相连。每个时钟周期可以驱动边界扫描链的数据由TDI到TDO的方向移动一位,这样,新的数据可以通过TDI输入一位,边界扫描链的数据可以通过TDO输
出一位。经过6个时钟周期,就可以完全更新边界扫描链里的数据,而且可以将边界扫描链里捕获的6位数据通过TDO全部移出来。
图3表示了边界扫描链的访问过程。图3.1
表示了芯片和边界扫描链的初始化状态,在测试状态下,芯片的外部输入和输出被隔离开了,芯片的输入和输出可以通过相应的边界扫描链来观察和控制。在图
3.1中,扫描链里的每个移位寄存器单元的数据是不确定的,所以在图中用X表示,整个扫描链里的数据序列是XXXXXX。要从TDI输入到测试芯片上的数
据序列是:101010.
同时要从TDO得到芯片相应管脚上的状态。现在TAP
Controller从Run-Test/Idle状态经过Select-DR-Scan状态进入到Capture-DR状态,在Capture-DR状
态当中,在一个TCK时钟的驱动下,芯片管脚上的信号状态全部被捕获到相应的边界扫描移位寄存器单元当中去,如图3.2所示。从图3.2中我们可以看出,
在进入Capture-DR状态后,经过一个TCK时钟周期,现在扫描链中的数据序列变成了:111000.
在数据捕获完成以后,从Capture-DR状态进入到Shift-DR状态。在Shift-DR状态中,我们将通过6个TCK时钟周期来把新的数据序列
(101010)通过TDI输入到边界扫描链当中去;同时,将边界扫描链中捕获的数据序列(111000)通过TDO输出来。在进入到Shift-DR状
态后,每经过一个TCK时钟驱动,边界扫描链从TDO输出一位数据;同时,从TDI接收一位新的数据。图3.3所示的是在Shift-DR状态下,1个
TCK时钟周期后的扫描链的变化。图3.4所示的是在Shift-DR状态下,2个TCK时钟周期后的扫描链的变化。此时,扫描链已经从TDI串行得到了
两位新数据,从TDO也串行输出了两位数据。在TCK时钟的驱动下,这个过程一直继续下去。图3.5所示的是在经过6个TCK时钟周期以后扫描链的情况。
从图3.5中我们可以看到:边界扫描链当中已经包含了新的数据序列:101010.
在TDO端,经过6个TCK时钟驱动以后,也接收到了在Capture-DR状态下捕获到的数据序列:111000.
到目前为止,虽然扫描链当中包含了新的数据序列:101010,但测试芯片的管脚上的状态还是保持为:111000.
下一步,需要更新测试芯片相应管脚上的信号状态。要实现更新,TAP
Controller从Shift-DR状态,经过Exit1-DR状态,进入到Update-DR状态。在Update-DR状态中,经过一个周期的
TCK时钟驱动,边界扫描链中的新数据序列将被加载到测试芯片的相应管脚上去,如图3.6所示。从图3.6可以看出,测试芯片的状态已经被更新,相应管脚
上的状态序列已经从111000变为101010.
最后从Update-DR状态回到Run-Test/Idle状态,完成对选定的边界扫描链的访问。
在看完上面这个例子以后,对TAP
Controller的状态机应该大概了解了吧?对如何访问边界扫描链应该也有个直观的概念了吧?虽然上面的这个例子只是说明了如何访问边界扫描链,对其它的数据寄存器、指令寄存器的访问过程也是类似的。要实现对指令寄存器的访问,不同的是TAP
Controller必须经过不同的状态序列:Run-Test/Idle --->
Select-DR-Scan ---> Select-IR-Scan
---> Capture-IR ---> Shift-IR
---> Exit1-IR ---> Update-IR
---> Run-Test/Idle.
3.指令寄存器、公共指令以及数据寄存器
在IEEE
1149.1标准当中,规定了一些指令寄存器、公共指令和相关的一些数据寄存器。对于特定的芯片而言,芯片厂商都一般都会在IEEE
1149.1标准的基础上,扩充一些私有的指令和数据寄存器,以帮助在开发过程中进行进行方便的测试和调试。在这一部分,我将简单介绍IEEE
1149.1规定的一些常用的指令及其相关的寄存器。与ARM7TDMI相关的私有指令和寄存器将在后面的部分专门介绍。
指令寄存器
指令寄存器允许特定的指令被装载到指令寄存器当中,用来选择需要执行的测试,或者选择需要访问的测试数据寄存器。每个支持JTAG调试的芯片必须包含一个指令寄存器。
BYPASS指令和Bypass寄存器:
Bypass寄存器是一个一位的移位寄存器,通过BYPASS指令,可以将bypass寄存器连接到TDI和TDO之间。在不需要进行任何测试的时候,将
bypass寄存器连接在TDI和TDO之间,在TDI和TDO之间提供一条长度最短的串行路径。这样允许测试数据可以快速的通过当前的芯片送到开发板上
别的芯片上去。
IDCODE指令和Device Identification
寄存器:
Device
identification寄存器中可以包括生产厂商的信息,部件号码,和器件的版本信息等。使用IDCODE指令,就可以通过TAP来确定器件的这些相关信息。例如,ARM
MULTI-ICE可以自动识别当前调试的是什么片子,其实就是通过IDCODE指令访问Device
Identification寄存器来获取的。
INTEST指令和Boundary-Scan 寄存器:
Boundary-Scan寄存器就是我们前面例子中说到的边界扫描链。通过边界扫描链,可以进行部件间的连通性测试。当然,更重要的是可以对测试器件的输入输出进行观测和控制,以达到测试器件的内部逻辑的目的。INTEST指令是在IEEE
1149.1标准里面定义的一条很重要的指令:结合边界扫描链,该指令允许对开发板上器件的系统逻辑进行内部测试。在ARM
JTAG调试当中,这是一条频繁使用的测试指令。
我们前面说过,寄存器分为两大类:指令寄存器和数据寄存器。在上面提到的Bypass寄存器、Device
Identification寄存器和Boundary-scan寄存器(边界扫描链),都属于数据寄存器。在调试当中,边界扫描寄存器(边界扫描链)最重要,使用的也最为频繁。
posted on 2016-10-09 13:27 Lexlin_Dong 阅读(1835) 评论(0) 编辑 收藏 举报