4. JTAG信号与拓扑

JTAG(Joint Test Action Group)接口本质上是一条串行同步调试总线。它用少量引脚,通过状态机与移位寄存器,把多个芯片、多个调试目标串联在同一条链路上。理解 JTAG 的关键,不是记住引脚名字,而是理解每个信号在“时钟—状态—数据”三者中的角色,以及多器件如何共享这条链路。

一、五根核心信号线的定义与职责

标准 JTAG 接口通常包含 TCK、TMS、TDI、TDO、TRST 五根信号线,部分设计还会加入 SRST(系统复位)和 RTCK(返回时钟)。它们的分工非常明确:

  • TCK(Test Clock):测试时钟,由调试器驱动,所有 JTAG 操作都以 TCK 上升沿或下降沿为节拍。TCK 不是自由运行的时钟,只在调试器发起操作时翻转,因此对功耗和噪声更友好。
  • TMS(Test Mode Select):模式选择信号,在 TCK 上升沿被采样,决定 TAP 状态机下一步跳转到哪个状态。TMS 是“控制流”的核心,它不传输数据,只控制状态迁移。
  • TDI(Test Data In):测试数据输入,数据在 TCK 上升沿被移入目标器件的移位寄存器。TDI 是“数据流”的入口。
  • TDO(Test Data Out):测试数据输出,数据在 TCK 下降沿被移出,供调试器采样。TDO 是“数据流”的出口,通常为三态输出。
  • TRST(Test Reset):测试复位,低电平有效,用于异步复位 TAP 控制器。TRST 是可选信号,很多器件内部用上电复位替代,因此并非所有 JTAG 接口都引出。

记忆口诀:TCK 给节拍,TMS 管状态,TDI 进数据,TDO 出数据,TRST 做复位。五根线中,只有 TDO 是目标器件输出,其余均由调试器或上位机驱动。

二、TAP状态机:信号如何协同工作

JTAG 的所有操作都围绕 TAP(Test Access Port)状态机展开。TMS 在每个 TCK 上升沿决定状态迁移方向,TDI/TDO 则在 Shift-DR 或 Shift-IR 状态下完成数据移位。典型流程是:调试器先通过 TMS 把状态机推到 Shift-IR,移入指令;再推到 Shift-DR,移入或移出数据;最后回到 Run-Test/Idle 或 Update-DR 完成更新。

这里有一个容易忽略的细节:TDO 的更新沿与 TCK 的采样沿是错开的。目标器件在 TCK 下降沿改变 TDO,调试器在 TCK 上升沿采样 TDO,这样能保证建立/保持时间余量。如果时序约束不当,TDO 采样错误会直接表现为“识别不到 IDCODE”或“IR 扫描失败”。

JTAG 五信号与 TAP 状态机协同关系 调试器 / 上位机 驱动 TCK / TMS / TDI 采样 TDO TCK 时钟节拍 TMS 状态控制 TDI 数据输入 TDO 数据输出 目标器件 TAP 控制器 TMS → 状态机迁移 Shift-IR / Shift-DR 指令寄存器 IR 数据寄存器 DR TRST 异步复位 多器件菊花链 器件 1 TDI→TDO 器件 2 TDI→TDO 器件 3 TDI→TDO TCK / TMS 并联到所有器件 TDI→TDO 首尾串联 TDI TDO

三、菊花链拓扑:多器件如何共享一条JTAG链路

当一块板上有多个支持 JTAG 的器件(如 FPGA、CPLD、DSP、ARM 处理器)时,最常用的连接方式是菊花链(Daisy Chain)。其核心规则是:

  1. TCK 并联:所有器件的 TCK 接在一起,由调试器统一驱动,保证全链同步。
  2. TMS 并联:所有器件的 TMS 接在一起,状态机同步迁移。
  3. TDI→TDO 串联:调试器 TDI 接第一个器件 TDI,第一个器件 TDO 接第二个器件 TDI,依次类推,最后一个器件 TDO 接回调试器。
  4. TRST 可选并联:若使用 TRST,通常并联到所有器件;若不用,需确保各器件 TAP 能通过上电复位进入确定状态。

菊花链的本质是:所有器件的 IR 和 DR 在逻辑上被串成一条超长的移位寄存器。调试器发出的数据会依次穿过每个器件,因此链上器件数量越多,扫描一次所需时钟数越长。例如,3 个器件 IR 长度分别为 4、5、6 位,则总 IR 长度为 15 位,每次 IR 扫描需要 15 个 TCK。

连接方式 TCK/TMS TDI/TDO 适用场景 注意事项
菊花链 并联 串联 多器件同板、空间受限 链长增加,扫描时间变长
星形(多路复用) 并联或独立 独立 需要单独访问某器件 需多路开关,成本高
独立接口 独立 独立 调试器通道充足 占用引脚多,布线复杂
混合拓扑 分组并联 组内串联、组间独立 多板卡、多子系统 需明确分组与地址映射

四、实战案例:三器件菊花链的IDCODE扫描

假设板上有 FPGA、DSP、MCU 三个器件组成菊花链,调试器需要先读取整条链的 IDCODE 来确认链路是否正常。典型操作序列如下:

# 伪代码:菊花链 IDCODE 扫描流程
1. 复位 TAP:TMS 连续 5 个 TCK 高电平
2. 进入 Shift-IR:TMS 序列 0→1→1→0→0
3. 移入 IDCODE 指令(假设总 IR 长度 15 位)
   TDI 依次发送:FPGA_IR + DSP_IR + MCU_IR
4. 进入 Shift-DR:TMS 序列 1→0→0
5. 移出 96 位数据(3 个 32 位 IDCODE)
   TDO 依次返回:MCU_ID + DSP_ID + FPGA_ID
6. 校验各 IDCODE 是否符合器件手册

注意:TDO 返回顺序与 TDI 发送顺序相反,因为数据在链中“先进后出”。如果调试器读到的 IDCODE 全为 0 或全为 1,通常说明 TDI/TDO 断路、TDO 被拉死,或 TCK 没有正常翻转。

调试技巧:当菊花链识别失败时,可先只连接一个器件,确认单器件 JTAG 正常,再逐步加入其他器件。这样能快速定位是链路拓扑问题,还是某个器件的 TAP 未复位。

五、常见误区与复盘

  • 误区一:TRST 可以随便悬空。部分器件 TRST 内部有弱上拉,悬空可能进入不确定状态。若不用 TRST,应确认器件手册允许,或将其通过电阻拉到无效电平。
  • 误区二:TCK 可以当普通时钟自由布线。TCK 是高速边沿敏感信号,菊花链上分支过多会导致反射和串扰,建议采用点对点或短分支拓扑,并做好阻抗匹配。
  • 误区三:TDO 可以并联。TDO 是输出信号,多个 TDO 直接并联会造成驱动冲突。菊花链中必须首尾串联,不能并联。
  • 误区四:链上器件越多越好。链越长,扫描时间越长,调试体验越差。若某器件不需要调试,可考虑将其旁路(Bypass),只保留 1 位寄存器。

复盘时建议记录:链上器件顺序、各器件 IR/DR 长度、IDCODE 值、TCK 频率、TRST 处理方式。这些信息在后续排障和量产测试中非常关键。JTAG 拓扑设计不是“连上就行”,而是要在信号完整性、扫描效率和调试灵活性之间取得平衡。