JTAG协议与硬件实现
18 Apr 2024 4208字 15分 次 Digital IC Design打赏作者 CC BY 4.0 (除特别声明或转载文章外)
1 简介
JTAG(Joint Test Action Group)是一种标准协议IEEE 1149.1,功能如下:
- 调试访问(通过用户数据寄存器)
- 调试工具访问芯片内部(寄存器、控制位等),使其功能可用或可修改。
- 边界扫描(通过边界扫描寄存器)
- 用于在较大的子系统中实施分层扫描,控制输入并观察输出,以提高扫描测试覆盖率
JTAG定义了可内置到集成电路中的电路模块,能够协助测试、维护组装好的PCB以及芯片内部电路测试,该模块包含:
- Test Access Port(TAP)
- TAP Controller
- Register
- Instruction Register(IR)
- Data Register(DR)
- Bypass Register
- Boundary Scan Register
- Device ID Register(optional)
- User Data Register(optional)
- Instruction Decoder
架构电路示意图如下:
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来复位 |
- TCK应接下拉电阻,确保没有接调试工具时TCK保持低电平,因为TCK为低时TAP Controller保持原有状态;
- TMS应接上拉电阻,因为TAP Controller中的状态机在任意状态下TMS保持高电平5个Cycle,就会进入复位状态;
- TDI和TDO应接上拉电阻以提高驱动能力。
3 TAP Controller
TAP Controller主要由一个16个状态的状态机构成,它仅被TCK和TMS控制。16个状态如下:
需要关注的状态有这么几个:
- TEST_LOGIC_RESET是复位状态,任意状态下TMS保持高电平5个Cycle即可进入该状态,或使用TRST信号;
- SELECT_DR_SCAN表示后续的系列动作都将以数据寄存器作为操作对象;
- SELECT_IR_SCAN表示后续的系列动作都将以指令寄存器作为操作对象;
- Capture_DR、Capture_IR状态下,外部输入信号将被并行捕获到与之对应的数据或指令寄存器的各个单元中去;
- Shift_DR、Shift_IR状态下,数据或指令将串行地从一个寄存器移位到另一个寄存器;
- Update_DR、Update_IR状态下,数据或指令从寄存器并行输出到内部逻辑电路中,或者说在有两层触发器的寄存器(BSC、User、Instruction)中,第一层触发器的数据或指令在此状态下加载到第二层触发器中;
- 其他状态为中间态,没怎么用到过。
根据状态转换图,很容易搭建出状态机的RTL,并且要把以上关键状态建立指示信号输出给外部电路:
4 Instruction Register
指令寄存器主要是由两层多bit的触发器组成的,结构如下图:
指令寄存器有两种加载指令方式。在Capture_IR状态下,会把默认的IDCODE指令并行加载到第一层触发器中;而在Shift_IR状态下,会把TDI进来的串行指令挪到第一层触发器中。
第一层触发器的输出的第0bit将作为该路的TDO信号送给MUX,这样就可以在Shift_IR状态下把指令送出去。
当指令加载好(指令完全挪到第一层触发器,或是并行一次性加载到第一层触发器)之后,第二层触发器就可以在Update_IR状态下加载第一层触发器中的指令,并送出给Decoder进行指令解码了。
指令寄存器的宽度最短为2bit,常用指令如下(以8bit宽度为例):
- BYPASS:8’b1111_1111;
- IDCODE:8’b0000_0001;
RTL如下:
5 Data Register
5.1 Bypass Register
Bypass寄存器由一个MUX和一个触发器组成,结构如下图:
它是为了在进行某些测试操作时,不需要访问其它的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 |
- Version:第28至31位提供一个4位的自由格式字段,用于指定同一基本设备的最多16个不同版本;
- Part Number:第12至27位提供一个16位的自由格式部件号字段;
- Manufacturer Identity:第1至11位使用紧凑形式的JEDEC标识码标识设备制造商;
- LSB:第0位(最低有效位)始终为1。
它由一个MUX和一个多bit的移位寄存器组成:
在ShiftDR模式下会将TDI输入的数据挪入寄存器,否则为默认的Device ID。RTL如下:
5.3 User Register
IEEE1149.1架构允许定义和使用私有指令来访问任何适当的内部User寄存器。这种私有指令的定义和使用可以为设计师提供更大的灵活性,以访问和操作核心逻辑中的特定寄存器。
芯片内部可以有多个User寄存器,每个寄存器有唯一的指令码。当User寄存器对应的指令码加载到IR中时,该User寄存器就可以进行读写操作,从而控制或观察芯片内部逻辑。
User寄存器的结构和指令寄存器基本相同:
RTL如下:
5.4 Boundary Scan Register
边界扫描的测试目标是IO-PAD,芯片设计时会在内部逻辑和每个引脚间放置移位寄存器,来控制和观察每个输入输出引脚的状态,这些移位寄存器就是边界扫描寄存器(BSR)。
BSR有两个触发器和两个MUX组成:
BSR可以相互连接起来,在芯片周围形成一个边界扫描链(Boundary-Scan Chain):
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相当于一根线,不影响芯片正常运行:
数据流如下:
其他三种Debug模式下,BSR将核心逻辑与外界隔离,通过BSR可实现对芯片管脚的控制与观测。
Scan模式下,会将TDI输入的串行数据按顺序加载到每个BSR的第一层触发器里,同时每个BSR第一层触发器原有的数据将被按顺序从TDO挪出去。
数据流如下:
Update模式下,是将BSR第一层触发器的数据更新到第二层触发器并输出给Logic或Pin。对于Input,是将BSR的数据送给Logic;对于Output,是将BSR的数据输出到Output Pin:
数据流如下:
Capture模式下,是将Pin或Logic的数据捕获到第一层触发器上。对于Input,是把Input Pin的数据捕获;对于Output,是把Logic的输出数据捕获:
数据流如下:
这四种模式即可完成正常的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 指令寄存器扫描时序
直接上图:
可以看出:
- 仿真器在TCK下降沿改变TMS、TDI,被测设备在TCK上升沿捕获TMS、TDI以及更新内部状态;
- 被测设备在TCK下降沿改变TDO,仿真设备在TCK上升沿捕获TDO数据;
- 在ShiftIR阶段,最后一个TDI送进来的同时,TMS就要改变状态以使状态机进入下一个状态。
8.2 数据寄存器扫描时序
和指令寄存器几乎完全一样。