4. 边界扫描指令集

边界扫描测试(BST)的核心在于通过 测试访问端口(TAP) 向芯片内部的指令寄存器(IR)写入特定指令码,从而控制边界扫描寄存器(BSR)的行为。IEEE 1149.1 标准定义了一套强制性和可选的公共指令集,它们是实现芯片级与板级测试互操作性的基础。

本章将详细解析 BYPASS、SAMPLE/PRELOAD、EXTEST、INTEST、IDCODE、USERCODE 等关键指令的编码、功能、应用场景及在 ATE 测试程序中的部署要点。

边界扫描标准指令集架构总览 IEEE 1149.1 标准指令集架构 强制指令 BYPASS (0x1F) SAMPLE/PRELOAD (0x02) EXTEST (0x00) INTEST (0x07) RUNBIST (0x06) CLAMP (0x0A) HIGHZ (0x0B) 可选指令 IDCODE (0x01) USERCODE (0x03) ECIDCODE (0x04) CONFIG_IO (0x05) PRIVATE (0x08-0x0F) 用户自定义 P1149.6 (AC-EXTEST) P1149.7 (2-pin) 安全访问指令 调试/追踪指令 注:指令码为 4 位或 8 位,具体长度由芯片设计决定;0x00 通常为 EXTEST,0x1F 为 BYPASS

4.1 指令集分类与编码规则

IEEE 1149.1 标准将指令分为 强制指令 和 可选指令 两大类。所有符合标准的器件必须支持强制指令,而可选指令则根据芯片功能需求实现。指令码通过 TAP 状态机中的 Shift-IR 状态逐位写入指令寄存器。

指令名称 指令码(典型) 类型 选择的数据寄存器 核心用途
BYPASS 0x1F 强制 Bypass Register (1-bit) 旁路当前器件,缩短扫描链
SAMPLE/PRELOAD 0x02 强制 Boundary Scan Register 快照引脚状态 / 预加载测试数据
EXTEST 0x00 强制 Boundary Scan Register 板级互连测试(核心指令)
INTEST 0x07 强制 Boundary Scan Register 芯片内部逻辑静态测试
RUNBIST 0x06 强制 BIST Register 触发内建自测试
IDCODE 0x01 可选 IDCODE Register (32-bit) 读取器件身份标识
USERCODE 0x03 可选 USERCODE Register (32-bit) 读取用户可编程标识
CLAMP 0x0A 强制 Bypass Register 保持输出状态,旁路扫描
HIGHZ 0x0B 强制 Bypass Register 将所有输出置为高阻态
ATE 部署提示: 在编写测试程序时,务必从 BSDL 文件中提取准确的指令码长度和编码。部分厂商会使用非标准编码(如 0x00 用于 BYPASS),直接使用标准假设会导致测试失败。

4.2 BYPASS 指令:扫描链的“快车道”

BYPASS 是使用频率最高的指令。当某个器件不需要参与当前测试时,写入 BYPASS 指令使其数据寄存器路径缩短为 1 位旁路寄存器,从而大幅减少整个扫描链的长度,提升测试效率。

  • 指令码: 通常为全 1(如 4 位指令时为 0x1F,8 位时为 0xFF)。
  • 数据路径: TDI → Bypass Register (1-bit) → TDO。
  • 应用场景:
    • 多器件 JTAG 链中,只测试目标器件时旁路其他器件。
    • ATE 测试中快速遍历链上所有器件以验证链完整性。
    • 在 IDCODE 扫描后切换至 BYPASS 以减少后续操作时间。
BYPASS 指令数据路径示意图 BYPASS 指令:1-bit 旁路路径 TDI Bypass Reg (1-bit) MUX TDO 指令译码 BYPASS 激活时,TDI→TDO 路径仅经过 1 个触发器,延迟最小
ATE 性能优化: 在测试多站点(Multi-Site)时,对非目标站点写入 BYPASS 指令,可将单次扫描向量长度从数千位缩短至 1 位,显著提升测试吞吐量。

4.3 SAMPLE/PRELOAD 指令:双重身份

SAMPLE/PRELOAD 是一条具有双重功能的指令,在 IEEE 1149.1 标准中共享同一个指令码。其行为取决于 TAP 状态机所处的状态:

  • SAMPLE 模式: 在 Capture-DR 状态,边界扫描寄存器捕获当前器件引脚上的实时逻辑状态,而不影响芯片正常运行。用于系统运行时的信号监测。
  • PRELOAD 模式: 在 Update-DR 状态,将扫描入边界扫描寄存器的数据预加载到输出锁存器,为后续 EXTEST 或 INTEST 指令准备初始输出状态。
功能 触发状态 数据流向 对芯片功能的影响
SAMPLE Capture-DR 引脚 → BSR 捕获寄存器 无影响(非侵入式)
PRELOAD Update-DR BSR 更新寄存器 → 输出引脚 更新输出状态,但芯片逻辑继续运行
常见误区: 许多工程师认为 SAMPLE 和 PRELOAD 是两条独立指令。实际上,它们共享同一指令码,通过 TAP 状态机的不同阶段实现不同功能。在 BSDL 文件中,该指令通常描述为 SAMPLE/PRELOAD。

4.4 EXTEST 指令:板级互连测试的核心

EXTEST 是边界扫描测试中最重要的指令,专门用于测试 芯片间互连(如 PCB 走线、焊点、连接器)。当 EXTEST 被选中时,边界扫描寄存器将芯片内部逻辑与外部引脚隔离,测试工程师可以通过扫描链直接控制输出引脚状态,并捕获输入引脚状态。

EXTEST 测试流程:

  1. PRELOAD 阶段: 通过 SAMPLE/PRELOAD 指令将测试向量(如 1010)预加载到驱动器的输出锁存器。
  2. EXTEST 激活: 写入 EXTEST 指令,输出锁存器的值被驱动到外部引脚。
  3. 捕获响应: 接收器引脚上的值在 Capture-DR 状态被捕获到边界扫描寄存器。
  4. 扫描输出: 通过 Shift-DR 状态将捕获的响应移出 TDO,与期望值比较。
EXTEST 板级互连测试原理 EXTEST 指令:板级互连测试原理 芯片 A (驱动器) 内部逻辑 BSR 输出 Pin PCB 走线 芯片 B (接收器) Pin BSR 输入 内部逻辑 测试向量:TDI → 芯片A BSR → 输出引脚 → PCB走线 → 芯片B输入引脚 → BSR → TDO
ATE 测试向量生成: 使用 EXTEST 时,测试向量必须考虑互连网络的拓扑结构。对于开路/短路测试,通常采用“走步 1”或“走步 0”算法,确保每条互连线都能被独立激励和观测。

4.5 INTEST 指令:芯片内部逻辑的静态测试

INTEST 指令允许测试工程师通过边界扫描寄存器向芯片的 内部逻辑 施加测试向量,并捕获其响应。与 EXTEST 不同,INTEST 将芯片与外部环境隔离,专注于芯片内部的组合逻辑和时序逻辑测试。

  • 数据路径: TDI → 输入 BSR 单元 → 内部逻辑 → 输出 BSR 单元 → TDO。
  • 应用场景:
    • 芯片级功能测试,无需外部测试设备直接接触引脚。
    • ATE 测试中,用于验证芯片内部逻辑门的静态故障(Stuck-at Fault)。
    • 与 RUNBIST 配合,进行更深入的内建自测试。
  • 限制: INTEST 通常不支持全速测试(At-speed Test),仅适用于静态或低速测试。
ATE 部署注意: 部分芯片的 INTEST 实现可能不支持所有内部逻辑路径。在编写测试程序前,必须查阅 BSDL 文件中的 INTEST_SUPPORT 属性,确认支持的测试模式。

4.6 IDCODE 与 USERCODE 指令:芯片身份识别

IDCODE 和 USERCODE 是两条可选但广泛使用的指令,用于读取芯片的 身份标识 和 用户配置信息。

4.6.1 IDCODE 指令

IDCODE 指令选择 32 位的 器件标识寄存器,其内容遵循 IEEE 1149.1 标准格式:

位域 位数 描述
版本号 4 位 (bit 31:28) 芯片版本或步进标识
器件编号 16 位 (bit 27:12) 厂商定义的器件型号
制造商编号 11 位 (bit 11:1) JEDEC 分配的厂商代码
固定位 1 位 (bit 0) 固定为 1(符合标准)

4.6.2 USERCODE 指令

USERCODE 指令选择 32 位的 用户可编程寄存器,通常用于存储:

  • FPGA 的比特流版本号。
  • 芯片的配置校验和。
  • 生产批次或测试日期编码。
ATE 测试流程建议: 在每次测试开始时,先执行 IDCODE 扫描以验证链上器件的正确性。如果 IDCODE 与预期不符,应立即停止测试并报告“器件不匹配”错误,避免后续测试产生误判。

4.7 其他标准指令:CLAMP、HIGHZ、RUNBIST

除了上述核心指令外,IEEE 1149.1 还定义了以下强制指令,在特定场景下非常有用:

指令 功能描述 ATE 应用场景
CLAMP 将输出引脚固定在 PRELOAD 阶段设定的值,同时将数据路径切换至 1-bit 旁路寄存器 在测试其他器件时,保持当前器件的输出状态不变,避免总线冲突
HIGHZ 将所有输出引脚置为高阻态(三态),数据路径切换至旁路寄存器 在共享总线上释放驱动,允许其他器件控制总线;或用于功耗测试
RUNBIST 触发芯片内建自测试逻辑,测试结果通过 BIST 寄存器输出 快速验证芯片内部存储器(如 SRAM、Flash)或逻辑阵列的完整性
边界扫描指令切换状态图 TAP 状态机中的指令切换流程 Test-Logic-Reset Run-Test/Idle Select-IR-Scan Shift-IR 指令译码 → 更新指令寄存器 → 执行 指令在 Shift-IR 状态逐位写入,在 Update-IR 状态生效;执行期间 TAP 可返回 Run-Test/Idle

4.8 ATE 测试程序中的指令部署策略

在 ATE 测试程序中,指令的选择和切换顺序直接影响测试效率和覆盖率。以下是一个典型的指令部署流程:

  1. 上电初始化: 通过 TMS 信号驱动 TAP 进入 Test-Logic-Reset 状态,确保所有寄存器处于已知状态。
  2. IDCODE 扫描: 写入 IDCODE 指令,扫描 32 位 ID 码,验证链上器件型号和数量。
  3. SAMPLE/PRELOAD 预加载: 写入 SAMPLE/PRELOAD 指令,通过 Shift-DR 将初始测试数据预加载到边界扫描寄存器。
  4. EXTEST 互连测试: 写入 EXTEST 指令,执行板级互连测试向量。
  5. INTEST 内部测试(可选): 写入 INTEST 指令,执行芯片内部逻辑测试。
  6. BYPASS 旁路: 测试完成后,写入 BYPASS 指令,将器件置于旁路模式,准备下一轮测试或链重组。
ATE 代码示例: 以下是一个简化的 ATE 测试程序片段,展示如何通过 TAP 写入 EXTEST 指令并执行一次扫描:
// 伪代码:ATE 测试程序 - EXTEST 指令写入与扫描
// 假设指令寄存器长度为 4 位,EXTEST 指令码为 0x00
// 步骤 1: 进入 Shift-IR 状态
TMS = 0; TCK = 1;  // Run-Test/Idle
TMS = 1; TCK = 1;  // Select-DR-Scan
TMS = 1; TCK = 1;  // Select-IR-Scan
TMS = 0; TCK = 1;  // Capture-IR
TMS = 0; TCK = 1;  // Shift-IR
// 步骤 2: 逐位移入 EXTEST 指令码 (0x00 = 0000)
for (i = 0; i < 4; i++) {
    TDI = 0;        // 移入 0
    TMS = (i == 3) ? 1 : 0;  // 最后一位后退出 Shift-IR
    TCK = 1;
    TCK = 0;
}
// 步骤 3: 进入 Update-IR 状态使指令生效
TMS = 1; TCK = 1;  // Exit1-IR
TMS = 1; TCK = 1;  // Update-IR
// 步骤 4: 进入 Shift-DR 状态扫描测试向量
TMS = 0; TCK = 1;  // Run-Test/Idle
TMS = 1; TCK = 1;  // Select-DR-Scan
TMS = 0; TCK = 1;  // Capture-DR
TMS = 0; TCK = 1;  // Shift-DR
// 移入测试向量并移出响应
for (