第三章 数字DFT核心架构:扫描链(Scan Chain)原理、扫描触发器类型、扫描使能控制、压缩技术(Compression)入门

好,咱们进入正题。这一章讲的是数字DFT里最核心、最基础的东西——扫描链。说白了,它就是给芯片里的寄存器装上“开关”,让测试时能像串珠子一样把它们串起来,想读就读,想写就写。

我刚开始接触DFT时,觉得扫描链就是个“高级移位寄存器”。后来踩了不少坑才明白,它背后的门道远比想象中多。今天咱们就把扫描链的里里外外掰扯清楚。

3.1 扫描链原理:为什么需要它?

先问个问题:芯片正常工作的时候,寄存器里的数据是实时变化的,你没法停下来一个个检查。那流片回来发现功能不对,怎么定位问题?

扫描链就是干这个的。它让芯片进入“测试模式”,把所有的寄存器首尾相连,形成一条或几条长链。测试时,你把测试向量从链头灌进去,跑几个时钟周期,再从链尾把结果读出来,一比对就知道有没有制造缺陷。

我个人习惯把扫描链比作“数字电路的听诊器”。平时芯片在跑,你没法动它;但一旦挂上扫描链,你就能“听”到每个寄存器的状态。

核心思想: 扫描链将时序电路转化为组合逻辑测试问题。测试时,寄存器变成可控制的输入和可观察的输出。

3.2 扫描触发器类型:你该选哪种?

扫描触发器,就是普通触发器加了个“二选一”开关。正常模式走数据路径,测试模式走扫描路径。常见的类型有这几种:

类型 结构特点 面积开销 适用场景
muxed-D型 数据输入前加MUX 约10-15% 最常用,通用性强
LSSD型 双锁存器结构 约30-40% 高性能、高可靠性设计
时钟控制型 通过时钟门控实现 约5-10% 低功耗设计

muxed-D型 是业界主流。它就是在D触发器的输入前加一个2选1MUX,用扫描使能信号(SE)控制选通数据还是扫描输入。简单、直接、好理解。

LSSD型 我用的不多,但在一些军工或航天芯片里见过。它用两个锁存器代替一个触发器,测试时用独立的时钟,抗干扰能力强。代价嘛,面积翻倍。

时钟控制型 适合低功耗场景。它不额外加MUX,而是通过门控时钟来切换。嗯,这里要注意:这种设计对时钟树要求高,搞不好容易出时序问题。

我的建议: 除非有特殊要求,否则老老实实用muxed-D型。它最成熟,EDA工具支持最好,你遇到的坑别人基本都踩过了。

3.3 扫描使能控制:别小看这根线

扫描使能(Scan Enable,简称SE)是扫描链的“总开关”。它高电平时,芯片进入扫描移位模式;低电平时,回到正常功能模式。

听起来简单?我曾经在一个项目里吃过亏。SE信号在芯片里要连到成千上万个触发器,它的扇出非常大。如果驱动能力不够,SE跳变时沿会变缓,导致扫描链移位出错。

避坑指南:

  • SE要单独做时钟树综合,不能跟普通信号混在一起
  • SE的时序要求很严格:在扫描时钟沿之前必须稳定
  • 考虑SE的测试:它本身也要能被测试到,否则SE stuck-at故障会搞死你

你想想看,SE这根线要是出了问题,整条扫描链就废了。所以很多设计里会给SE加专门的buffer tree,甚至用两层buffer来驱动。

3.4 压缩技术入门:为什么需要它?

芯片规模越来越大,扫描链也越来越长。一条链上几千个触发器很常见。测试时,你要把测试向量串行灌进去,再串行读出来——时间成本太高了。

压缩技术就是来解决这个问题的。它用少量的外部引脚,控制大量的内部扫描链。说白了,就是“多路并行,串行传输”。

我记得第一次接触压缩技术时,觉得它像魔术。一个芯片有100条扫描链,每条链1000个触发器,总共10万个触发器。如果不压缩,你需要10万拍才能灌完一个向量。用了压缩后,可能只需要1000拍——快了100倍。

压缩的核心: 在芯片内部增加解压缩器和压缩器。测试时,外部输入少量数据,解压缩器把它“展开”成多条扫描链的数据;读出时,压缩器把多条链的结果“收拢”成少量输出。

常见的压缩方案有:

  • XOR压缩:简单,但容错性差
  • MISR压缩:用多输入特征寄存器,能检测多位错误
  • 自适应压缩:根据测试模式动态调整,效果好但复杂

我建议初学者先从XOR压缩入手。它原理简单,工具支持好。等你把基础打牢了,再去看更高级的方案。

注意: 压缩技术不是万能的。它有个“压缩率天花板”——受限于测试向量的care bit密度。care bit越多,压缩效果越差。我曾经遇到一个项目,care bit密度高达30%,压缩率只有2倍,还不如不压。

3.5 实战经验:扫描链设计流程

说了这么多理论,咱们看看实际怎么做。我一般按这个流程走:

  1. RTL阶段:在代码里例化扫描触发器,或者用综合工具自动插入
  2. 综合阶段:告诉工具哪些是扫描链,SE信号是什么,时钟是什么
  3. ATPG阶段:生成测试向量,检查覆盖率
  4. 仿真验证:跑一遍扫描链的仿真,确保功能正确
  5. 时序分析:检查SE路径的时序,确保能跑到目标频率

这里有个小技巧:在RTL阶段,我习惯把扫描链的配置写成一个单独的脚本,而不是嵌在代码里。这样后期修改方便,也不容易污染功能代码。

嗯,最后说一句:扫描链设计看似简单,但细节决定成败。SE的时序、扫描链的平衡、压缩率的取舍——每一个点都可能成为你的“坑”。多仿真、多检查、多跟后端沟通,这是我能给的最实在的建议。