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 端出去。
测试流程分三步:
- 移位加载(Shift In):把测试向量从 SI 口串行灌入,填满所有寄存器。
- 捕获(Capture):切回正常模式一个时钟周期,让组合逻辑计算结果打入寄存器。
- 移位卸载(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 是它们的两种具体实现——一个对内,一个对外。
3.5 小结
这一章我们聊了三个东西:
- 可控性与可观测性——DFT 的底层逻辑,所有测试方法都围绕它们展开。
- 扫描链——把寄存器串成链,实现内部节点的可控和可观测。
- JTAG 边界扫描——用 4 根线控制芯片的 I/O 引脚,解决板级互联测试问题。
嗯,内容不少。但这些都是 DFT 的基石,后面讲 ATPG、BIST、测试覆盖率,全都离不开它们。建议你找个实际芯片的数据手册,看看它的 JTAG 接口是怎么实现的,对照着理解会更深。