赞
踩
最近简单学了JTAG,在这里做一个整理。
本文主要是理论部分,关于实践涉及的很浅。
JTAG协议是一个名叫JOINT TEST ACTION GROUP的组织提出的,也因此而得名。后来该组织与IEEE一起制定了当前被广泛使用的IEEE 1149.1 JTAG标准。下文提到的JTAG协议一般指IEEE1149.1。
JTAG是一种调试协议,很多人把常用的烧录器JLINK与JTAG协议划等号是不对的。JLINK是通过利用JTAG协议提供的数据传输能力,与目标设备进行通信以完成程序的烧录过程。JTAG协议本身的核心功能是调试。
芯片的每个主要输入信号和主要输出信号(也可以简单理解为引脚)都配备了一个名为边界扫描单元的多功能存储器。请参见图1箭头指向,上排引脚代表输入引脚,下排引脚代表输出引脚。
上图中,外围的深色的10个小矩形就是芯片引脚,内部的蓝色椭圆代表芯片的内部电路,黄色的串成串的小方框就是边界扫描单元。
边界扫描单元的集合被配置为一个个并行输入并行输出(parallel-in, parallel-out)的移位寄存器。并行加载操作(称为"捕获capture"操作)会将设备输入引脚上的信号值加载到输入单元中,并将从核心逻辑传递到设备输出引脚上的信号值加载到输出单元中。并行卸载操作(称为"更新update"操作)会将已经存在于输出扫描单元中的信号值通过设备输出引脚传出,已经存在于输入扫描单元中的信号值将被传递到核心逻辑中。
数据还可以以串行模式在移位寄存器之间进行移位,从一个称为"测试数据输入"(TDI)的专用设备输入引脚开始,到一个称为"测试数据输出"(TDO)的专用设备输出引脚结束。测试时钟TCK通过另一个专用设备输入引脚提供,操作模式由一个专用的"测试模式选择"(TMS)串行控制信号控制。
图2显示了一个基本的通用边界扫描单元,即图1中的一个小黄框。它具有四种操作模式:正常模式、更新模式、捕获模式和串行移位模式。存储器元件被展示为一个简单的D触发器,具有前端和后端数据的多路复用。(注意图2中显示的电路只是满足标准定义要求的一种示例。IEEE 1149.1标准并不强制规定电路的设计,仅规定其功能规范。)
在正常模式下,Data_In直接传递到Data_Out,这代表着非JTAG调试状态下,芯片正常工作时的信号传递。在更新模式(update)下,输出寄存器的内容通过Data_Out传递出来,这代表调试状态下,边界扫描单元中的值被插入了芯片的信号传递流程中,这个值可以是之前通过TDI串行输入到边界扫描单元中的。在捕获模式(capture)下,Data_In信号被路由到移位寄存器并且在下一个时钟周期捕获。这代表调试状态下,边界扫描单元可以捕获芯片原本数据流中的值。在移位模式下,一个寄存器的Scan_Out通过硬连线路径传递给下一个寄存器的Scan_In,即从图1中一个小黄框传递给下一个小黄框。需要注意的是,捕获和移位操作不会干扰从并行输入端到并行输出端的数据传递。这允许在运行过程中“即时”捕获操作值,并且可以在不干扰功能模式的情况下进行检查。
以上是JTAG协议的核心功能基本实现原理,下面将对整个JTAG协议(IEEE 1149.1)的基本架构进行介绍。
图3是IEEE1149.1协议的架构。
图3架构包括了以下元素:
4个专用测试引脚:测试数据输入(TDI)、测试模式选择(TMS)、测试时钟(TCK)、测试数据输出(TDO)和一个可选的测试引脚测试复位(TRST*)。这些引脚被统称为测试访问端口(TAP)。这也对应着JTAG通信时需要的4根线。
设备主输入和主输出引脚上的边界扫描单元,通过内部连接形成一个串行边界扫描寄存器(Boundary Scan)。
一个带有输入TCK、TMS和TRST(可选)的有限状态机TAP控制器。
一个n位(n≥2)指令寄存器(IR),保存当前指令。
一个1位旁路寄存器(Bypass)。
一个可选的32位识别寄存器(Ident),能够加载一个永久设备识别码。
在任何时候,只能将一个寄存器从TDI连接到TDO(例如IR、Bypass、边界扫描、Ident,甚至一些适合核心逻辑的寄存器)。所选的寄存器由IR的解码输出标识。某些指令是强制性的,例如Extest(选择边界扫描寄存器),而其他指令是可选的,例如Idcode指令(选择Ident寄存器)。
接下来将对每一点进行详细介绍。
指令寄存器(IR)包括一个可连接到TDI和TDO的移位部分(Scan Register),以及一个保持部分(Hold Register),用于保存当前指令,图4是指令寄存器的内部结构。
总之,在IR的两个部分之间可能存在解码逻辑,具体取决于寄存器的宽度和不同指令的数量。IR的控制信号来自TAP控制器,用于在移位部分进行移入、移出操作,或者将内容传递到保持部分进行更新操作。至少需要两位长度的IR以编码强制指令,并且可以加载特定的预定义值。这些部分相互配合,控制和更新当前指令,并通过Test Data Out(TDO)引脚提供稳定的输出。这样,其他系统组件可以对指令进行解码和解释。
本节介绍指令寄存器可以接受的相关指令,每个指令有自己对应的数据寄存器。比如旁路寄存器,识别寄存器等等。寄存器中,除了指令寄存器外,其余都属于数据寄存器,在后文会进行详细介绍。
IEEE1149.1-2001版本的标准描述了四个强制性指令:Bypass、Sample、Preload和Extest。
IEEE1149.1标准定义了一些可选指令(不需要实现,但在使用时具有规定的操作)。可选指令的示例包括:
1993年修订版1149.1a引入了两个新指令:Clamp和Highz。Clamp是一种指令,它在设备的输出上驱动预设的扫描单元值(最初使用Preload指令进行设置),然后在TDI和TDO之间选择Bypass寄存器。Clamp用于在某些设备的输出上建立安全的“保护”值,以避免总线争用问题。
Highz与Clamp类似,但是设备设计成所有输出都可以处于高阻态(三态输出)或输入接收模式(用于双向扫描单元)。Highz在输出引脚上建立这些值,但保持Bypass寄存器作为选定的寄存器。请注意,执行High指令时,用于此操作的使能控制信号直接来自IR。不使用Preload。
除了Bypass指令外,所有其他指令的代码均未定义。考虑到需要四个强制性指令,IR的最小长度为两位,最大长度未定义。任何指令都可以有多个代码,所有未使用的代码都被解释为Bypass指令。请注意,设计者可以使用特定代码来实现“私有”指令——即功能不公开的指令。在这种情况下,设计者必须声明这些代码是私有的,以便用户可以避免加载这些代码。
在继续描述该体系结构的其他部分之前,将首先研究如何加载IR和解码它的内容。首先思考如下图5所示的电路。
我们现在回到TAP及其控制器(图7)。TAP是一个测试接入端口,用于与嵌入式系统内部的测试逻辑电路进行通信,它接受来自JLINK(或其他JTAG控制器)的TDI、TDO、TCK和TMS四根线的信号(这四根线我后面会详细介绍)。TAP端口受TAP Controller控制,它们构成了一个状态机模型,受输入信号的控制,在16种状态之间进行切换。
可选终端为:
TMS和TCK(以及可选的TRST*)连接到一个有限状态机控制器,该控制器产生各种控制信号。这些信号包括专用于IR的信号(ClockIR、ShiftIR、UpdateIR)和通用于所有数据寄存器的信号(ClockDR、ShiftDR、UpdateDR)。实际响应的数据寄存器是由IR的并行输出生成的条件控制信号启用的寄存器,根据特定的指令来确定。
此外,还有通用的选择(Select)、复位(Reset)和使能(Enable)信号。
图8显示了TAP控制器的状态表。状态转换弧上的值是TMS的值。状态转换发生在TCK的上升沿上,输出值在TCK的下降沿上改变。假设 TAP Controller 的当前状态为 Select-DR-Scan,在 TCK 的驱动下,如果 TMS = 0,TAP Controller 进入 Capture-DR 状态;如果 TMS = 1,TAP Controller进入 Select-IR-Scan 状态。
- 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 的上升沿触发),将使 TAPController 进入 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 的上升沿触发),TAPController 进入 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 状态下输入的新指令将被用来更新指令寄存器。
图9展示了一个典型的旁路寄存器设计。它是一个1位寄存器,由旁路指令选中,并提供基本的移位功能。没有并行输出(这意味着Update-DR控制对寄存器没有影响),但在Capture-DR控制下有效果-寄存器捕获了一个固定值0。在Test-Logic/Resetsatiate状态,TDI和TDO之间默认选择的就是旁路寄存(在设备没有设计ID寄存器的前提下)。
可选的识别(Ident)寄存器是一个32位寄存器,具有捕获和移位模式操作(图10)。捕获的32位用以下字段标识设备:
考虑以下的现场服务场景。一台客户的计算机系统出现故障。怀疑特定板卡上的硬件故障是导致故障的原因。这个板卡有很多变种,服务工程师需要确定板卡类型和组件版本。工程师所知道的是板卡上有边界扫描(boundary-scan)组件,并且了解到主要的(边沿连接器)TDI、TDO、TMS、TCK端口以及电源和地线的位置。下面的步骤可以确定板卡上的边界扫描组件是否具有识别寄存器。
现在我们更详细地看一下边界扫描单元。边界扫描单元被放置在设备的信号输入端口、输出端口以及双向(输入/输出)端口和三态(0、1、Z)端口的控制线上。
这些单元通过连接在一起形成边界扫描寄存器。连接的顺序由引脚的物理相邻性和/或其他布局限制确定。边界扫描寄存器可由Extest、Sample、Preload和Intest指令选中。
边界扫描单元有许多不同的设计。图13显示了一种简单的设计,只能进行捕获和移位操作。这样的单元可以用于对Data_In信号特别敏感的设备输入,例如系统时钟。(注意:4个强制性指令中没有一个要求对输入扫描单元进行更新操作。)
在提供边界扫描单元时,主要是在除了电源和地线之外的所有设备输入和输出信号引脚上放置边界扫描单元。需要注意的是,在引脚与边界扫描单元之间除了驱动放大器或其他形式的模拟电路之外,不能有任何电路。
对于引脚的输入信号传递,应该在核心逻辑的每个主要输入上都放置边界扫描单元。这样,每个输入都可以独立设置值,为Intest提供最大的灵活性。
同样地,在引脚的输出信号传递中,如果每个输出引脚都具有边界扫描单元,那么Extest就可以设置不同且独立的值。
如果存在三态输出引脚,则必须在输出驱动放大器的状态控制信号处放置边界扫描单元。图15展示了一个简单的三态输出引脚示例。
IEEE1149.1架构允许定义和使用“私有”指令来访问任何适当的内部移位寄存器。一个例子是通过TDI-TDO路径使用指令InScan来访问内部扫描路径寄存器。
这种私有指令的定义和使用可以为设计师提供更大的灵活性,以访问和操作核心逻辑中的特定寄存器。通过适当的指令设置和数据传输,可以利用TAP控制器的边界扫描功能来实现对这些内部寄存器的访问。
私有指令的具体定义和用法会根据特定设计的要求而有所不同。通过在TAP控制器中添加适当的状态和控制信号,可以实现对这些内部寄存器的选择性访问和配置。
另一个重要的可选指令是RunBist。由于设备内部自测试结构的日益重要,RunBist的行为在标准中有所定义。自测试例程必须是自初始化的(即不允许外部种子值),而RunBist的执行主要针对位于TDI和TDO之间的自测试结果寄存器。一旦启动自测试例程,TAP控制器将保持在运行-测试/空闲状态,直到测试完成。自测试时钟可以是TCK,或者更通常是一个更快速的时钟。
在自测试周期结束时,目标寄存器保存了通过/失败的结果。重要的是,这个值不会被后续的TCK脉冲改变。通过这种方式,可以在同一板上对不同设备上的不同长度的并行自测试进行。当最终(即运行时间最长的)自测试完成时,所有结果可以沿着由链接的各个结果寄存器组成的寄存器路径输出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。