第4章 DFT设计基础:Scan Chain原理、BIST与JTAG标准

各位工程师,咱们今天聊聊DFT。说实话,我刚入行那会儿,觉得DFT就是个“事后补救”的手段——设计都做完了,再加点测试逻辑进去。后来吃过几次亏才明白,DFT做不好,芯片量产就是一场噩梦。

DFT的核心目标就一个:让芯片变得可测。你想想看,一颗芯片几千万个晶体管,封装完就一个小黑盒子,你怎么知道里面有没有坏?靠的就是DFT插进去的这些“测试机关”。

4.1 Scan Chain原理——把时序电路变成组合电路来测

先说说最基础的Scan Chain。为什么需要它?因为时序电路太难测了。组合逻辑你给一组输入,输出就定了,好判断。但时序电路有状态,你得先让电路跑到某个状态,再给输入,再等几个时钟,才能看到结果。测试成本太高。

Scan Chain的思路很巧妙:把所有的触发器(Flip-Flop)串成一条链。正常工作时,每个FF各干各的。测试模式下,它们变成一条移位寄存器链。

具体怎么做?每个FF旁边加一个MUX,选择正常数据输入还是扫描输入。测试时,你把测试向量从扫描输入(Scan In)一脚一脚推进去,等所有FF都装好了数据,再切回正常模式跑一个时钟,把结果抓到FF里。最后再切回扫描模式,把结果从扫描输出(Scan Out)一脚一脚吐出来。

核心要点:

  • 每个FF变成可控制的节点
  • 测试向量可以“注入”到任意状态
  • 内部状态可以“读出”来检查

我在项目中遇到过一条Scan Chain串了8000多个FF。当时ATE测试机频率只有20MHz,推进一个向量就要0.4毫秒。你算算,测100万个向量要多久?400秒!所以后来我学乖了,Scan Chain不是越长越好,要平衡测试时间和芯片面积。

个人经验:Scan Chain的分段设计很重要。我一般建议每段不超过2000个FF。太长的话,测试时间指数级增长,而且链上任何一个FF坏了,整条链都废了。

4.2 BIST(内建自测试)——让芯片自己测自己

Scan Chain需要外部ATE机台来推向量、收结果。那BIST呢?说白了,就是在芯片内部搭一个“小测试机”

BIST最典型的应用是Memory BIST。SRAM、DRAM这些存储器,面积大、密度高,最容易出制造缺陷。而且存储器结构规整,很适合用算法来测。

Memory BIST的架构很简单:

  • 一个控制器(BIST Controller)
  • 一个地址生成器
  • 一个数据生成器
  • 一个比较器

测试时,控制器让地址生成器遍历所有地址,数据生成器按特定算法(比如March C-)写入数据,然后读回来比较。如果发现不一致,就报错。

// March C- 算法伪代码
// 这是业界最常用的Memory BIST算法
Step 1: 按地址递增,写0 (w0)
Step 2: 按地址递增,读0 (r0),写1 (w1)
Step 3: 按地址递增,读1 (r1),写0 (w0)
Step 4: 按地址递减,读0 (r0),写1 (w1)
Step 5: 按地址递减,读1 (r1),写0 (w0)
Step 6: 按地址递减,读0 (r0)

嗯,这里要注意:BIST不是万能的。它只能测存储器内部的固定故障和转换故障。对于存储器和周边逻辑的接口问题,BIST就无能为力了。我遇到过一颗芯片,Memory BIST全过,但系统跑起来就死机。最后查出来是地址线在顶层连错了——BIST根本测不到那个层次。

避坑指南:我曾经在一个项目里,为了省面积,把BIST控制器和功能逻辑共用了一部分时钟树。结果测试模式下时钟抖动太大,BIST老是误报。后来花了三周才定位到问题。所以,BIST的时钟域一定要独立,至少要做时钟隔离。

4.3 JTAG/IEEE 1149.1标准——芯片的“调试后门”

JTAG,全称是Joint Test Action Group。这个标准最初是为了解决PCB板级测试问题——板子焊好了,你怎么知道每个芯片的引脚都连对了?

JTAG的核心是边界扫描(Boundary Scan)。它在每个I/O引脚旁边加一个边界扫描单元(BSC),这些BSC串成一条链。测试时,你可以通过这条链来控制每个引脚的电平,或者读取每个引脚的状态。

JTAG的硬件接口只有5根线:

信号 功能
TCK 测试时钟
TMS 测试模式选择
TDI 测试数据输入
TDO 测试数据输出
TRST(可选) 测试复位

JTAG的协议基于一个有限状态机——TAP控制器。它有16个状态,通过TMS信号在TCK的上升沿驱动状态跳转。你想想看,就一根TMS线,通过时序就能控制16个状态,设计得确实巧妙。

实际项目中,JTAG的用途远不止板级测试。我常用的场景包括:

  • 芯片调试:通过JTAG访问内部寄存器,观察状态
  • Flash编程:通过JTAG把固件烧进芯片
  • Scan Chain控制:很多芯片的Scan Chain就是通过JTAG来访问的
  • BIST触发:通过JTAG指令来启动BIST测试

实用技巧:JTAG的指令寄存器长度可以自定义。我一般建议至少支持以下指令:

  • BYPASS(必须支持)——旁路模式,用于链上不参与测试的芯片
  • SAMPLE/PRELOAD——采样当前引脚状态
  • EXTEST——外部测试,控制引脚输出
  • INTEST——内部测试,测试芯片内部逻辑
  • IDCODE——读取芯片ID

说到IDCODE,这个挺有意思。每个芯片厂商都有一个唯一的JEDEC ID。比如TI是0x08,Intel是0x89。加上厂商自定义的版本号和部件号,组合成一个32位的IDCODE。测试时,ATE机台先读IDCODE,确认芯片型号对了,再往下测。这招能避免把A芯片的测试程序跑在B芯片上——我见过有人犯过这种低级错误。

个人建议:设计JTAG时,一定要考虑多芯片级联的情况。板子上可能串了3-4颗芯片,每颗都有自己的JTAG链。如果某颗芯片的BYPASS指令没实现好,整条链都跑不通。我习惯在RTL阶段就做JTAG链的仿真验证,别等到流片回来再查。

4.4 三种DFT技术的协同

实际项目中,这三种技术不是孤立的。它们经常配合使用:

  • JTAG作为统一访问接口,控制Scan Chain和BIST
  • Scan Chain负责逻辑测试,覆盖标准单元
  • BIST负责存储器测试,覆盖SRAM/ROM

举个例子。一颗SoC芯片,上电后先通过JTAG读IDCODE确认身份。然后通过JTAG指令启动Memory BIST,跑一遍March C-算法,确认所有SRAM都没问题。接着通过JTAG把Scan Chain的测试向量灌进去,跑逻辑测试。最后通过JTAG读测试结果,判断芯片好坏。

你看,JTAG就像个“总开关”,把各种测试资源串起来了。这也是为什么IEEE 1149.1标准能活30年——它提供了一个统一的测试框架。

最后提醒一句:DFT不是设计完了再加的。我见过太多项目,RTL写完了才想起来加Scan Chain,结果发现关键节点没引出测试点,或者时钟域没处理好,改得死去活来。正确的做法是:在架构设计阶段就把DFT需求考虑进去。比如,哪些寄存器需要可测,哪些存储器需要BIST,JTAG的指令集怎么定义——这些都要提前想好。

好了,DFT基础就聊到这儿。下一章咱们讲ATPG(自动测试向量生成),那才是真正考验DFT设计质量的时候。你想想看,Scan Chain搭好了,但ATE机台能不能高效地生成测试向量?覆盖率能不能做到99%以上?这些都有门道。