JTAG协议与硬件实现


1 简介

        JTAG(Joint Test Action Group)是一种标准协议IEEE 1149.1,功能如下:

        JTAG定义了可内置到集成电路中的电路模块,能够协助测试、维护组装好的PCB以及芯片内部电路测试,该模块包含:

        架构电路示意图如下:

img1

        JTAG接口的四根pin控制内部所有JTAG模块的逻辑。其中TCK作为TAP Controller和所有寄存器的时钟信号;TMS送给TAP Controller来指示状态,以产生IR或DR的update、shift、capture等信号,送给对应的寄存器;TDI是输入数据,根据IR中的指令来确定最终走的是哪条路径(BYPASS、IDCODE、USER、SCAN等);TDO是数据输出,MUX之后送到芯片外部。


2 TAP

        JTAG的TAP结构一般包含4或5根线:

引脚 定义 可选 描述
TCK Test Clock mandatory 时钟,上升沿捕获输入,下降沿更新输出
TMS Test Mode Select mandatory 状态选择,调试工具在TCK下降沿输出,被测目标在TCK上升沿捕获
TDI Test Data Input mandatory 串行数据输入,调试工具在TCK下降沿输出,被测目标在TCK上升沿捕获
TDO Test Data Output mandatory 串行数据输出,被测目标在TCK下降沿输出,调试工具在TCK上升沿捕获
TRST Test Reset optional 复位,非必须,因为TAP控制器也能根据TMS来复位

3 TAP Controller

        TAP Controller主要由一个16个状态的状态机构成,它仅被TCK和TMS控制。16个状态如下:

img2

        需要关注的状态有这么几个:

        根据状态转换图,很容易搭建出状态机的RTL,并且要把以上关键状态建立指示信号输出给外部电路:



4 Instruction Register

        指令寄存器主要是由两层多bit的触发器组成的,结构如下图:

img3

        指令寄存器有两种加载指令方式。在Capture_IR状态下,会把默认的IDCODE指令并行加载到第一层触发器中;而在Shift_IR状态下,会把TDI进来的串行指令挪到第一层触发器中。

        第一层触发器的输出的第0bit将作为该路的TDO信号送给MUX,这样就可以在Shift_IR状态下把指令送出去。

        当指令加载好(指令完全挪到第一层触发器,或是并行一次性加载到第一层触发器)之后,第二层触发器就可以在Update_IR状态下加载第一层触发器中的指令,并送出给Decoder进行指令解码了。

        指令寄存器的宽度最短为2bit,常用指令如下(以8bit宽度为例):

        RTL如下:



5 Data Register

5.1 Bypass Register

        Bypass寄存器由一个MUX和一个触发器组成,结构如下图:

img4

        它是为了在进行某些测试操作时,不需要访问其它的DR,减少测试访问时间,也就是让数据能尽快从TDI达到感兴趣的测试段。比如有三个芯片的JTAG串联,如果只想测试中间的芯片,就可以把首尾两个芯片的JTAG模块设置为访问Bypass寄存器,这样TDI通过这两个芯片的JTAG时,只会消耗一个Cycle。

        它只有在Shift_DR模式下才会把TDI数据挪进去。

        RTL如下:


5.2 Device ID Register

        Device ID寄存器仅用于设备标识,为了确保当前访问的是期望的JTAG端口,就要给所在芯片分配一个唯一的设备ID码用来识别。         该寄存器通常是32bit,格式如下:

Version Part Number Manufacturer Identity LSB
31-28bit 27-12bit 11-1bit 0bit

        它由一个MUX和一个多bit的移位寄存器组成:

img5

        在ShiftDR模式下会将TDI输入的数据挪入寄存器,否则为默认的Device ID。RTL如下:


5.3 User Register

        IEEE1149.1架构允许定义和使用私有指令来访问任何适当的内部User寄存器。这种私有指令的定义和使用可以为设计师提供更大的灵活性,以访问和操作核心逻辑中的特定寄存器。

        芯片内部可以有多个User寄存器,每个寄存器有唯一的指令码。当User寄存器对应的指令码加载到IR中时,该User寄存器就可以进行读写操作,从而控制或观察芯片内部逻辑。

        User寄存器的结构和指令寄存器基本相同:

img6

        RTL如下:


5.4 Boundary Scan Register

        边界扫描的测试目标是IO-PAD,芯片设计时会在内部逻辑和每个引脚间放置移位寄存器,来控制和观察每个输入输出引脚的状态,这些移位寄存器就是边界扫描寄存器(BSR)。

        BSR有两个触发器和两个MUX组成:

img7

        BSR可以相互连接起来,在芯片周围形成一个边界扫描链(Boundary-Scan Chain):

img8

        BSR支持四种操作模式,如下表:

Operation Mode ShiftDR Comment
Normal 0 X Funtion Mode,BSR相当于是透明的
Scan X 1 把前一级BSR的Scan Out数据shift到第一层触发器里
Update 1 X 把第一层触发器的数据更新到第二层触发器
Capture X 0 把Pin或逻辑出来的数据抓取到第一层触发器里

        Normal模式下,BSR相当于一根线,不影响芯片正常运行:

img9

        数据流如下:

img10

        其他三种Debug模式下,BSR将核心逻辑与外界隔离,通过BSR可实现对芯片管脚的控制与观测。

        Scan模式下,会将TDI输入的串行数据按顺序加载到每个BSR的第一层触发器里,同时每个BSR第一层触发器原有的数据将被按顺序从TDO挪出去。

img11

        数据流如下:

img12

        Update模式下,是将BSR第一层触发器的数据更新到第二层触发器并输出给Logic或Pin。对于Input,是将BSR的数据送给Logic;对于Output,是将BSR的数据输出到Output Pin:

img13

        数据流如下:

img14

        Capture模式下,是将Pin或Logic的数据捕获到第一层触发器上。对于Input,是把Input Pin的数据捕获;对于Output,是把Logic的输出数据捕获:

img15

        数据流如下:

img16

        这四种模式即可完成正常的function、把TDI数据shift到所有BSR,或把所有BSR数据shift到TDO、捕获Input Pin或Logic输出、把BSR中的数据送到Logic或Output Pin这些功能。

        BSR的RTL如下:



6 Decoder

        Decoder模块是对IR输出的指令解码,然后确定最终使用哪一路DR(Bypass、Device ID、BSR、User Register),是组合电路。另外再加一个MUX把IR和DR送给TDO。结构如第一章的架构图所示,RTL集成在JTAG顶层。


7 JTAG顶层设计

        JTAG的每个子模块都设计好之后,最终按照第一章中JTAG架构集成。其中BSR和User Register分别集成在PAD和对应的功能模块内部,因此不出现在JTAG顶层中。



8 JTAG时序

        在IEEE 1149.1协议文档中可以看到,JTAG时序分为指令寄存器扫描时序和数据寄存器扫描时序,其实都一样。

8.1 指令寄存器扫描时序

        直接上图:

img17

        可以看出:

8.2 数据寄存器扫描时序

        和指令寄存器几乎完全一样。

img18


Back to Archive
WeChat QR Code

Scan to connect