嵌入式电路可测试性设计(DFT):从测试点布局到 JTAG 边界扫描

从机械接触条件到电气隔离设计,再到 ICT 在线测试与 JTAG 边界扫描,给出覆盖生产全流程的 DFT 工程规范

2026-08-26
DFT可测试性JTAG边界扫描BIST在线测试PCB设计

电路可测试性设计(DFT,Design for Testability)的核心原则是:测试点直径不小于 0.88mm、间距不小于 2.5mm、每个节点至少一个测试点实现 100% 通道覆盖。在嵌入式电路中,随着 BGA 封装高集成度 IC 和 0.5mm 绝缘间距的普及,可接触的电路节点越来越少,传统在线测试(ICT)方法受限。引入 JTAG 边界扫描(IEEE 1149.1)后,一个需要 40 万测试矢量的电路可缩减到数百个矢量即可达到同等故障发现率。本文基于《改进电路设计规程提高可测试性》等资料,梳理 DFT 的机械规则、电气前提、ICT 与 BIST 内建自测试、边界扫描设计方法,并给出**STM32** 嵌入式 BIST 代码与 DFT 检查表,供**嵌入式**开发与**物联网**终端硬件设计直接参考。

为什么可测试性是 DFT 的第一优先级

测试成本随着测试级数增加呈 10 倍递增:从在线测试到功能测试再到系统测试,每跳过一级,故障定位与修复费用增加约 10 倍。如果产品缺陷在生产测试中未发现,推移到功能或系统测试时,某些制造缺陷可能根本无法检出——例如需要预编程的快闪存储器或 ISP 器件,在未编程状态下功能测试可能误判为合格。

DFT 的核心目标是回答四个问题:检测产品是否符合技术规范的方法能简化到什么程度?编制测试程序能快到什么程度?发现故障能全面到什么程度?接入测试点能简单到什么程度?回答这些需要从机械和电气两个维度同时着手。

第一步:机械接触条件——测试点设计规则

即使电气设计完美,如果测试点不够、太小或位置误差大,探针床适配器仍无法接触每个节点。以下规则基于《改进电路设计规程提高可测试性》原文,适用于探针床测试的 PCB 设计:

项目规则要求精度/公差
套牢孔(定位孔)呈对角线配置,离开元件边缘≥3mm,不可穿通接触定位精度 ±0.05mm,直径精度 +0.076/-0mm
测试点直径至少 0.88mm(35mil)大小精度 ±0.076mm(±3mil)
测试点间距尽可能 2.5mm间隔精度 ±0.076mm(±3mil)
测试点位置所有测试点尽可能在 PCB 背面,均匀分布
节点覆盖率每个节点至少一个测试点(100%通道)
测试点表面镀锡,端面可直接焊接
供电电源多个测试点分布在不同位置
不用的门电路必须有测试点

不用的门电路往往在后期设计改进时会被利用,如果从一开始就没有测试点,后续无法验证其焊接可靠性。元件标志也需规范:标志文字同一方向,型号、版本、系列号及条形码明确标识,元件名称清晰可见且尽可能直接标在元件旁。

第二步:电气前提——禁止输入端与隔离设计

电气前提条件对良好的可测试性同样关键。一个门电路无法测试的原因可能有两个:无法通过测试点接触启动输入端,或启动输入端封装在壳内无法外部接触。两者在本质上同样糟糕。设计电路时应确保需要在线测试的元件具备电气隔离机制。

禁止输入端设计

凡是要用在线测试法检测的元件,都应有某种机制使各元件能在电气上绝缘。这种机制通过禁止输入端实现,将元件输出端控制在静态高欧姆状态。虽然测试系统能通过逆驱动(Backdriving)将节点状态带到任意状态,但最好先通过禁止端将节点带到高欧姆状态,再"平缓地"加上相应电平。

关键设计规则:

复位机制

如果元件在接通工作电压时可实行复位,对测试器引发复位非常有帮助。在这种情况下,元件在测试前可简单置于规定的已知状态,大幅简化测试向量的编写。

第三步:在线测试(ICT)与 BIST 内建自测试

在线测试的原理与局限

在线测试(In-Circuit Test,ICT)通过探针床接触 PCB 上每个节点的测试点,逐个元件验证焊接与器件功能。ICT 的优势在于能精确定位到元件级故障(短路、断路、错件、反向),但局限是随着元件间距缩小和 BGA 封装普及,可接触的节点越来越少。

BIST 内建自测试

当可接触测试点不足时,BIST(Built-in Self Test)成为补充方案。BIST 将测试逻辑集成到芯片内部,通过特定指令触发元件自测试。在边界扫描中,可通过指令 "RunBIST" 触发元件的自动测试。BIST 的优势是不需要外部测试设备接触每个节点,缺点是增加了芯片设计复杂度。

以下是 STM32 上实现的简化 BIST 逻辑,用于开机自检 RAM 完整性和 Flash 校验:

/* STM32 BIST 内建自测试代码 */

/* RAM March-C 算法自检 */
typedef enum { BIST_PASS = 0, BIST_FAIL_RAM = 1, BIST_FAIL_FLASH = 2 } bist_result_t;

bist_result_t bist_ram_test(void) {
    volatile uint32_t *ram = (volatile uint32_t *)0x20000000;
    uint32_t len = 0x4000; /* 测试 16KB */
    uint32_t i;

    /* March-C: 写 0x55555555 */
    for (i = 0; i < len; i++) ram[i] = 0x55555555;
    for (i = 0; i < len; i++) if (ram[i] != 0x55555555) return BIST_FAIL_RAM;

    /* 写 0xAAAAAAAA */
    for (i = 0; i < len; i++) ram[i] = 0xAAAAAAAA;
    for (i = 0; i < len; i++) if (ram[i] != 0xAAAAAAAA) return BIST_FAIL_RAM;

    /* 恢复为 0 */
    for (i = 0; i < len; i++) ram[i] = 0;
    return BIST_PASS;
}

/* Flash 校验和自检 */
bist_result_t bist_flash_test(void) {
    volatile uint32_t *flash = (volatile uint32_t *)0x08000000;
    uint32_t len = 0x4000; /* 测试 16KB */
    uint32_t checksum = 0;
    uint32_t i;

    for (i = 0; i < len; i++) checksum ^= flash[i];
    /* 与预存校验和比较 */
    if (checksum != EXPECTED_FLASH_XOR) return BIST_FAIL_FLASH;
    return BIST_PASS;
}

/* 开机自检入口 */
void bist_run(void) {
    bist_result_t r1 = bist_ram_test();
    bist_result_t r2 = bist_flash_test();
    if (r1 != BIST_PASS || r2 != BIST_PASS) {
        /* 点亮故障 LED,进入安全模式 */
        HAL_GPIO_WritePin(LED_ERR_GPIO_Port, LED_ERR_Pin, GPIO_PIN_SET);
        while (1) { /* 安全停机 */ }
    }
}

该代码在 STM32 上电后、主循环前执行,RAM 采用 March-C 算法检测位级故障( stuck-at、耦合故障),Flash 采用 XOR 校验和检测代码区篡改。BIST 通过后系统才进入正常工作模式。

第四步:边界扫描 JTAG(IEEE 1149.1)

由高集成度元件组成的精细网格 PCB,能给测试工程师提供的可接触测试点非常有限。边界扫描和 BIST 是解决这一问题的两条路径。

JTAG 架构

边界扫描基于 IEEE 1149.1 标准,在芯片的每个 I/O 引脚上插入一个边界扫描单元(BSC),通过测试访问端口(TAP)串行移位数据,实现对引脚级短路和断路的检测。JTAG 需要四个测试引线脚:

信号含义方向用途
TDI测试数据输入输入串行移入测试矢量
TDO测试数据输出输出串行移出测试响应
TCK测试时钟输入同步移位操作
TMS测试模式选择输入控制 TAP 状态机

边界扫描的优势

对于一个包含复杂 IC 的电路,如果要 100% 故障发现率,传统在线测试需要约 40 万个测试矢量。通过边界扫描,在同样的故障发现率下,测试矢量数目可减少到数百个。这对于没有测试模型或可接触节点受限的电路具有特别优势。

开发工程师需在电路中使用支持边界扫描的元件(IEEE 1149.1 标准),并确保 JTAG 测试引线脚可接触。测试工程师需为元件制定边界扫描模型(BSDL — Boundary Scan Description Language),了解元件支持的边界扫描功能和指令。边界扫描可诊断到引线级的短路和断路,还可通过 "RunBIST" 指令触发元件内建自测试。

元件链级联

边界扫描元件在 PCB 上形成链式结构,所有元件的 TDI→TDO 串联,共享 TCK 和 TMS。编程数据时需考虑整个元件链,不能只针对单个元件。在汇集编程数据时,应考虑到电路中全部元件链,不应将数据仅还原给目标元件。自动测试信号发生器会考虑整个元件链,将其他元件接入旁路模型中。

第五步:可编程器件的测试策略

快闪存储器测试

快闪存储器编程时间可能很长(大容量存储器可达 1 分钟)。编程期间不容许其他元件逆驱动,否则快闪存储器可能受损。必须将所有与地址总线和控制线相连的元件置于高欧姆状态,数据总线也必须能隔离,确保快闪存储器空载并可进行编程。

编程数据应准备成标准格式(Intel Hex 或 Motorola S 记录)。如果快闪芯片含 16Mbit 数据,就应完整使用 16Mbit,防止误解和地址冲突。例如用一个 4Mbit 存储器向元件提供 300Kbit 数据,可能导致地址冲突。

ISP 器件测试

系统内可编程器件(ISP)如 Altera、Xilinx、Lattice 的 FPGA/CPLD 有特殊要求。Altera 和 Xilinx 使用 SVF(Serial Vector Format)格式,已成为工业标准,许多测试系统可将 SVF 格式数据用于测试信号发生器。Lattice 则要求 JEDEC 格式数据,通过并行输入输出端编程。编程后数据还用于检查元件功能。

DFT 设计检查表

检查项要求设计阶段
测试点直径≥ 0.88mmPCB 布局
测试点间距≥ 2.5mmPCB 布局
节点覆盖率100% 节点有测试点PCB 布局
套牢孔对角线配置,精度 ±0.05mmPCB 布局
禁止输入端通过 100Ω 电阻连接原理图
复位引线每个元件独立复位脚原理图
时钟隔离从振荡器后面断开原理图
JTAG 引脚TDI/TDO/TCK/TMS 可接触原理图+PCB
BIST 集成关键芯片支持 RunBIST器件选型
编程数据格式Intel Hex / Motorola S / SVF生产文件
元件链模型BSDL 文件齐全测试准备
不用的引脚可接触,有测试点PCB 布局

结语

DFT 的工程价值在于:测试友好的电路设计虽在开发阶段增加约 5%~10% 的设计工作量,但每跳过一级测试,故障修复成本增加 10 倍,DFT 投入会在生产阶段迅速回本。机械层面的核心是测试点直径 ≥ 0.88mm、间距 ≥ 2.5mm、100% 节点覆盖;电气层面的核心是禁止输入端经 100Ω 电阻隔离、独立复位引线、时钟可断开;对于高集成度 PCB,JTAG 边界扫描可将测试矢量从 40 万缩减到数百个,配合 BIST 内建自测试进一步降低对外部测试设备的依赖。本文基于《改进电路设计规程提高可测试性》等资料整理优化,所附 STM32 BIST 代码可直接集成到**MCU**固件中,与站内硬件 DFMEA 可靠性设计MCU 看门狗防死机设计配合,构成从设计到测试再到运行维护的完整可靠性闭环。

需要定制开发?

沧州艾诺威电子 — 国家高新技术企业,20+项国家专利
嵌入式系统开发 · 物联网方案 · AI智能硬件 · 一站式交付

立即微信咨询

电话:13930711029 | 邮箱:tech@czinv.com | 24小时内响应