3. 可测试性设计(DFT)核心概念:可控性与可观测性

各位好,欢迎来到第三章。这一章我们聊聊 DFT 最核心的两个概念——可控性和可观测性。说白了,这两个词就是测试的灵魂。你设计的芯片好不好测,全看它们。

我记得刚入行那会儿,总觉得 DFT 是后端的事,跟我做嵌入式软件没关系。直到有一次,板子焊回来,某个 GPIO 死活拉不高,我拿着示波器戳了半天,愣是分不清是芯片内部坏了还是 PCB 走线短路。那时候我才意识到——测不到,就等于不知道。

3.1 可控性(Controllability)与可观测性(Observability)

先给个直观的定义:

  • 可控性:你能不能从芯片外部,把一个内部节点强行设成你想要的值(比如 0 或 1)。
  • 可观测性:你能不能从芯片外部,看到内部某个节点的实际状态。

你想想看,一个芯片有几千万个晶体管,但你能摸到的引脚就那么几十个。内部那些节点,就像藏在黑箱里的灯泡——你既摸不到开关,也看不到亮灭。DFT 要做的,就是给这些灯泡装上「远程开关」和「窥视孔」。

核心公式(直觉版):

测试质量 ≈ 可控性 × 可观测性

任何一个为 0,测试就等于白做。

3.1.1 可控性:把内部节点「拉出来」

可控性差,最典型的场景是什么?

一个深嵌套的计数器,它的复位信号藏在五级组合逻辑后面。你想让它归零,得先满足前面一堆条件。这种节点,可控性就很低。

我习惯用一个简单的指标来评估——控制难度:

等级 描述 例子
高 直接由引脚控制 芯片复位引脚
中 经过 1~2 级逻辑 寄存器使能信号
低 经过 3 级以上逻辑 状态机内部条件
极低 需要特定序列才能控制 FIFO 空/满标志

我曾经在一个项目中,遇到一个「死锁」问题。某个状态机进入了一个非法状态,但它的复位条件依赖于另一个模块的握手信号。那个握手信号又因为状态机异常而永远发不出来——死循环了。这就是可控性不足的典型后果。

3.1.2 可观测性:让内部状态「看得见」

可观测性比可控性更容易被忽视。很多人觉得「我只要把数据读出来就行了」,但问题在于——你怎么知道读出来的数据是对的?

举个例子:一个 SPI 从设备,你发命令读寄存器,返回 0x5A。这能说明内部逻辑正常吗?不一定。也许内部加法器坏了,但恰好 0x5A 是某个默认值。你只有把中间结果也拉出来看,才能定位问题。

我的经验法则:

每个模块至少留一个「观察点」,能把关键内部信号 mux 到测试引脚上。别省这点资源,省下来的代价可能是多花三天查 bug。

3.2 扫描链(Scan Chain)原理

好了,概念讲完,我们来看 DFT 最经典的实现——扫描链。

扫描链的核心思想,说白了就是:把所有的寄存器串成一串,像一串珍珠项链。测试时,你可以像往项链上串珠子一样,把测试数据一个一个推进去,然后拉出来看结果。

3.2.1 扫描链的工作模式

每个寄存器在扫描链中会多一个「扫描输入」和「扫描使能」端口。正常工作时,它就是个普通寄存器;测试时,它变成移位寄存器的一环。

两种模式:

  • 正常模式(Normal Mode):SE=0,寄存器照常工作,数据从 D 端进来。
  • 扫描模式(Shift Mode):SE=1,寄存器串联成链,数据从 SI 端进来,从 SO 端出去。

测试流程分三步:

  1. 移位加载(Shift In):把测试向量从 SI 口串行灌入,填满所有寄存器。
  2. 捕获(Capture):切回正常模式一个时钟周期,让组合逻辑计算结果打入寄存器。
  3. 移位卸载(Shift Out):再切回扫描模式,把结果从 SO 口串行移出来,跟预期值比对。

注意:扫描链的时钟必须可控。测试时不能有自由运行的时钟,否则移位和捕获的时序会乱掉。我见过有人忘了加时钟门控,结果扫描链跑出来的数据全是乱的。

3.2.2 扫描链的代价

没有免费的午餐。扫描链会带来一些开销:

项目 代价 说明
面积 约 5%~15% 每个寄存器多一个 MUX
时序 增加延迟 MUX 插入路径,可能影响关键路径
功耗 测试时更高 移位时大量寄存器同时翻转
引脚 至少 3 个专用引脚 SI、SO、SE,有时还需要 Scan Clock

我个人习惯在项目早期就评估这些代价。别等到后端布局布线了才发现时序收敛不了,那时候改 DFT 方案就晚了。

3.3 边界扫描(JTAG)基础

扫描链解决的是芯片内部的问题。那芯片与芯片之间呢?PCB 上那么多焊点,你怎么知道它们都连对了?

这就是 JTAG(Joint Test Action Group)的用武之地。它也叫 IEEE 1149.1 标准,是边界扫描的工业标准。

3.3.1 JTAG 的核心思想

JTAG 在每个芯片的 I/O 引脚旁边,都放了一个「边界扫描单元」(BSC)。这些 BSC 串联成一条边界扫描链,绕芯片一圈。

通过这条链,你可以:

  • 强制输出:让某个引脚输出高或低,不管内部逻辑怎么想。
  • 读取输入:捕获某个引脚上的实际电平,看看外部驱动了什么。

说白了,JTAG 就是给芯片的「边境线」装了一圈检查站。你可以从外面发命令,让检查站报告每个口岸的通行情况。

3.3.2 JTAG 的硬件接口

JTAG 只需要 4 根线(第 5 根可选):

信号 全称 方向 作用
TCK Test Clock 输入 测试时钟,独立于系统时钟
TMS Test Mode Select 输入 控制 TAP 状态机跳转
TDI Test Data In 输入 串行数据输入
TDO Test Data Out 输出 串行数据输出
TRST(可选) Test Reset 输入 异步复位 TAP 控制器

你想想看,只用 4 根线就能控制整个芯片的 I/O 状态,是不是很划算?

3.3.3 TAP 状态机

JTAG 的核心是一个 16 状态的有限状态机,叫 TAP(Test Access Port)控制器。它通过 TMS 信号在 TCK 的上升沿跳转。

常用的状态路径就两条:

  • 指令扫描:通过 TDI 加载指令到指令寄存器,告诉芯片你要做什么操作。
  • 数据扫描:通过 TDI 加载数据到数据寄存器(比如边界扫描链),或者把结果从 TDO 移出来。

我刚开始学 JTAG 时,老记不住那 16 个状态。后来发现,你只需要记住两个关键状态——Shift-IR 和 Shift-DR。其他状态都是在这两个之间过渡用的。

实用技巧:调试 JTAG 时,先确认 TCK 和 TMS 的时序。用示波器量一下 TMS 在 TCK 上升沿是否稳定。我曾经花了一整天查 JTAG 连不上,最后发现是 TMS 信号毛刺太多,导致状态机跳错了。

3.4 本章知识体系

下面这张图把本章的核心概念串起来了。你可以看到,可控性和可观测性是 DFT 的根基,扫描链和 JTAG 是它们的两种具体实现——一个对内,一个对外。

DFT 核心概念体系 DFT 核心概念体系 可测试性设计 (DFT) 可控性 (Controllability) 可观测性 (Observability) 扫描链 (Scan Chain) 边界扫描 (JTAG) 移位/捕获 SE/SI/SO TAP 状态机 BSC 单元 对内:扫描链控制内部寄存器 对外:JTAG 控制芯片 I/O 引脚

3.5 小结

这一章我们聊了三个东西:

  • 可控性与可观测性——DFT 的底层逻辑,所有测试方法都围绕它们展开。
  • 扫描链——把寄存器串成链,实现内部节点的可控和可观测。
  • JTAG 边界扫描——用 4 根线控制芯片的 I/O 引脚,解决板级互联测试问题。

嗯,内容不少。但这些都是 DFT 的基石,后面讲 ATPG、BIST、测试覆盖率,全都离不开它们。建议你找个实际芯片的数据手册,看看它的 JTAG 接口是怎么实现的,对照着理解会更深。