4. 边界扫描指令集:标准指令详解
边界扫描测试(BST)的核心在于通过 测试访问端口(TAP) 向芯片内部的指令寄存器(IR)写入特定指令码,从而控制边界扫描寄存器(BSR)的行为。IEEE 1149.1 标准定义了一套强制性和可选的公共指令集,它们是实现芯片级与板级测试互操作性的基础。
本章将详细解析 BYPASS、SAMPLE/PRELOAD、EXTEST、INTEST、IDCODE、USERCODE 等关键指令的编码、功能、应用场景及在 ATE 测试程序中的部署要点。
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 | 将所有输出置为高阻态 |
4.2 BYPASS 指令:扫描链的“快车道”
BYPASS 是使用频率最高的指令。当某个器件不需要参与当前测试时,写入 BYPASS 指令使其数据寄存器路径缩短为 1 位旁路寄存器,从而大幅减少整个扫描链的长度,提升测试效率。
- 指令码: 通常为全 1(如 4 位指令时为 0x1F,8 位时为 0xFF)。
- 数据路径: TDI → Bypass Register (1-bit) → TDO。
- 应用场景:
- 多器件 JTAG 链中,只测试目标器件时旁路其他器件。
- ATE 测试中快速遍历链上所有器件以验证链完整性。
- 在 IDCODE 扫描后切换至 BYPASS 以减少后续操作时间。
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。
4.4 EXTEST 指令:板级互连测试的核心
EXTEST 是边界扫描测试中最重要的指令,专门用于测试 芯片间互连(如 PCB 走线、焊点、连接器)。当 EXTEST 被选中时,边界扫描寄存器将芯片内部逻辑与外部引脚隔离,测试工程师可以通过扫描链直接控制输出引脚状态,并捕获输入引脚状态。
EXTEST 测试流程:
- PRELOAD 阶段: 通过 SAMPLE/PRELOAD 指令将测试向量(如 1010)预加载到驱动器的输出锁存器。
- EXTEST 激活: 写入 EXTEST 指令,输出锁存器的值被驱动到外部引脚。
- 捕获响应: 接收器引脚上的值在 Capture-DR 状态被捕获到边界扫描寄存器。
- 扫描输出: 通过 Shift-DR 状态将捕获的响应移出 TDO,与期望值比较。
4.5 INTEST 指令:芯片内部逻辑的静态测试
INTEST 指令允许测试工程师通过边界扫描寄存器向芯片的 内部逻辑 施加测试向量,并捕获其响应。与 EXTEST 不同,INTEST 将芯片与外部环境隔离,专注于芯片内部的组合逻辑和时序逻辑测试。
- 数据路径: TDI → 输入 BSR 单元 → 内部逻辑 → 输出 BSR 单元 → TDO。
- 应用场景:
- 芯片级功能测试,无需外部测试设备直接接触引脚。
- ATE 测试中,用于验证芯片内部逻辑门的静态故障(Stuck-at Fault)。
- 与 RUNBIST 配合,进行更深入的内建自测试。
- 限制: INTEST 通常不支持全速测试(At-speed Test),仅适用于静态或低速测试。
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 的比特流版本号。
- 芯片的配置校验和。
- 生产批次或测试日期编码。
4.7 其他标准指令:CLAMP、HIGHZ、RUNBIST
除了上述核心指令外,IEEE 1149.1 还定义了以下强制指令,在特定场景下非常有用:
| 指令 | 功能描述 | ATE 应用场景 |
|---|---|---|
| CLAMP | 将输出引脚固定在 PRELOAD 阶段设定的值,同时将数据路径切换至 1-bit 旁路寄存器 | 在测试其他器件时,保持当前器件的输出状态不变,避免总线冲突 |
| HIGHZ | 将所有输出引脚置为高阻态(三态),数据路径切换至旁路寄存器 | 在共享总线上释放驱动,允许其他器件控制总线;或用于功耗测试 |
| RUNBIST | 触发芯片内建自测试逻辑,测试结果通过 BIST 寄存器输出 | 快速验证芯片内部存储器(如 SRAM、Flash)或逻辑阵列的完整性 |
4.8 ATE 测试程序中的指令部署策略
在 ATE 测试程序中,指令的选择和切换顺序直接影响测试效率和覆盖率。以下是一个典型的指令部署流程:
- 上电初始化: 通过 TMS 信号驱动 TAP 进入 Test-Logic-Reset 状态,确保所有寄存器处于已知状态。
- IDCODE 扫描: 写入 IDCODE 指令,扫描 32 位 ID 码,验证链上器件型号和数量。
- SAMPLE/PRELOAD 预加载: 写入 SAMPLE/PRELOAD 指令,通过 Shift-DR 将初始测试数据预加载到边界扫描寄存器。
- EXTEST 互连测试: 写入 EXTEST 指令,执行板级互连测试向量。
- INTEST 内部测试(可选): 写入 INTEST 指令,执行芯片内部逻辑测试。
- BYPASS 旁路: 测试完成后,写入 BYPASS 指令,将器件置于旁路模式,准备下一轮测试或链重组。
// 伪代码: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 (