从机械接触条件到电气隔离设计,再到 ICT 在线测试与 JTAG 边界扫描,给出覆盖生产全流程的 DFT 工程规范
电路可测试性设计(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 检查表,供**嵌入式**开发与**物联网**终端硬件设计直接参考。
测试成本随着测试级数增加呈 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)将节点状态带到任意状态,但最好先通过禁止端将节点带到高欧姆状态,再"平缓地"加上相应电平。
关键设计规则:
如果元件在接通工作电压时可实行复位,对测试器引发复位非常有帮助。在这种情况下,元件在测试前可简单置于规定的已知状态,大幅简化测试向量的编写。
在线测试(In-Circuit Test,ICT)通过探针床接触 PCB 上每个节点的测试点,逐个元件验证焊接与器件功能。ICT 的优势在于能精确定位到元件级故障(短路、断路、错件、反向),但局限是随着元件间距缩小和 BGA 封装普及,可接触的节点越来越少。
当可接触测试点不足时,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 通过后系统才进入正常工作模式。
由高集成度元件组成的精细网格 PCB,能给测试工程师提供的可接触测试点非常有限。边界扫描和 BIST 是解决这一问题的两条路径。
边界扫描基于 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)如 Altera、Xilinx、Lattice 的 FPGA/CPLD 有特殊要求。Altera 和 Xilinx 使用 SVF(Serial Vector Format)格式,已成为工业标准,许多测试系统可将 SVF 格式数据用于测试信号发生器。Lattice 则要求 JEDEC 格式数据,通过并行输入输出端编程。编程后数据还用于检查元件功能。
| 检查项 | 要求 | 设计阶段 |
|---|---|---|
| 测试点直径 | ≥ 0.88mm | PCB 布局 |
| 测试点间距 | ≥ 2.5mm | PCB 布局 |
| 节点覆盖率 | 100% 节点有测试点 | PCB 布局 |
| 套牢孔 | 对角线配置,精度 ±0.05mm | PCB 布局 |
| 禁止输入端 | 通过 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小时内响应