3. 扫描链(Scan Chain)原理

各位同学,今天我们来聊聊扫描链。说实话,扫描链是 DFT 里最基础、也最核心的技术之一。我刚开始接触 DFT 时,觉得这东西不就是把几个触发器串起来嘛,有什么难的?后来真正做项目才发现,里面的门道还真不少。咱们今天就把扫描链的里里外外掰扯清楚。

3.1 扫描触发器结构

先说说扫描触发器。普通触发器只有数据输入 D 和时钟 CK,输出 Q。但扫描触发器多了一个测试模式下的输入——扫描输入 SI,以及一个控制信号 SE(Scan Enable)。

你想想看,为什么要加这些东西?

说白了,就是为了在测试模式下,能把所有触发器串成一条链。功能模式下,每个触发器各司其职,处理自己的数据。测试模式下,我们通过 SI 把测试向量灌进去,再通过 Q 把结果扫出来。

我见过很多新手会问:那扫描触发器是不是要重新设计?其实不用。我们通常是在标准单元库里选带扫描功能的触发器,或者用普通的 D 触发器加一个 MUX 来实现。我个人习惯用后者,因为灵活性更高。

扫描触发器的结构其实很简单:

// 扫描触发器结构示意
module scan_flip_flop (
    input  D,    // 功能数据输入
    input  SI,   // 扫描数据输入
    input  SE,   // 扫描使能
    input  CK,   // 时钟
    output Q     // 输出
);
    wire mux_out;
    assign mux_out = SE ? SI : D;  // 2选1 MUX
    
    dff dff_inst (
        .D(mux_out),
        .CK(CK),
        .Q(Q)
    );
endmodule

嗯,这里要注意:SE 信号控制的是 MUX 的选择端。当 SE=1 时,走扫描路径;SE=0 时,走功能路径。这个逻辑很简单,但实际项目中,SE 信号的时序约束往往是个坑。

3.2 扫描链插入流程

扫描链插入,说白了就是把设计里所有的扫描触发器按一定顺序串起来。这个流程我做过很多次,每次都有新体会。

典型的流程是这样的:

  1. RTL 设计完成——先有功能代码
  2. 综合时插入扫描链——工具自动完成
  3. 生成测试协议文件——告诉 ATE 怎么测
  4. ATPG 生成测试向量——自动测试向量生成
  5. 仿真验证——确保扫描链能正常工作

我记得第一次做扫描链插入时,用的是 Synopsys 的 DFT Compiler。当时觉得工具很智能,跑个命令就完事了。后来发现,工具只是帮你做了机械的工作,真正的难点在于怎么规划扫描链。

举个例子,一个芯片有 10 万个触发器,你打算分成几条链?每条链多长?

这里有个经验值:每条扫描链的长度建议控制在 1000~5000 个触发器之间。太短了,测试时间会很长(因为要串行扫入扫出);太长了,ATE 的通道数不够用。

我曾经在一个项目中,把扫描链分成了 32 条,每条约 3000 个触发器。结果测试时间刚好满足客户要求。后来另一个项目,我偷懒只分了 8 条链,每条 12000 个触发器,结果测试时间长了 4 倍,被项目经理骂了一顿。

所以,扫描链的划分,其实是在测试时间和测试资源之间做权衡。

3.3 扫描模式与功能模式切换

这个知识点,我建议你重点理解。因为很多芯片在测试时没问题,一上电就跑飞了,往往就是模式切换没处理好。

扫描模式和功能模式,本质上是同一个芯片的两种工作状态。区别在于:

特性 功能模式 扫描模式
SE 信号 0 1
数据路径 D → Q SI → Q
时钟 正常时钟 通常用慢时钟
功耗 正常 较高(触发器同时翻转)

切换过程其实就两步:

  1. 拉高 SE,进入扫描模式
  2. 通过 SI 灌入测试向量,然后拉低 SE,进入功能模式
  3. 在功能模式下运行一个时钟周期,捕获结果
  4. 再拉高 SE,把结果从 Q 扫出来

这里有个关键点:SE 信号必须在时钟沿之前稳定下来。否则会出现竞争冒险,导致数据错误。

避坑指南:我曾经在一个项目中,SE 信号没有做同步处理,结果在切换模式时出现了毛刺,导致整个扫描链测试失败。后来花了三天时间才定位到问题。所以,SE 信号一定要用同步器打两拍,或者用门控时钟处理。

另外,扫描模式下的时钟频率通常比功能模式低。为什么?因为扫描模式下,所有触发器都在同时翻转,功耗会急剧上升。我见过一个项目,在扫描模式下时钟频率设成了 100MHz,结果芯片直接过热保护了。后来降到 10MHz,一切正常。

小技巧:如果你不确定扫描模式下的时钟频率设多少合适,可以先从功能频率的 1/10 开始试。然后逐步提高,直到出现错误为止。这样既能保证测试效率,又不会烧芯片。

3.4 知识体系总览

为了让你更直观地理解扫描链的整体结构,我画了一张图:

扫描链知识体系总览 扫描触发器结构 • D 触发器 + 2选1 MUX • 输入:D, SI, SE, CK • 输出:Q • SE=1:扫描路径 • SE=0:功能路径 常见问题: - SE 时序约束 - 毛刺问题 - 同步处理 扫描链插入流程 ① RTL 设计完成 ② 综合时插入扫描链 ③ 生成测试协议文件 ④ ATPG 生成测试向量 ⑤ 仿真验证 关键决策: - 链的数量(8~64条) - 链的长度(1000~5000) - 测试时间 vs 资源 模式切换 功能模式: SE=0, D→Q 扫描模式: SE=1, SI→Q 切换步骤: ① 拉高 SE ② 灌入测试向量 ③ 拉低 SE,捕获结果 ④ 拉高 SE,扫出结果 核心思想:功能模式下各司其职,测试模式下串行工作

这张图把扫描链的三个核心知识点串在了一起。你仔细看看,其实它们之间是环环相扣的:理解了扫描触发器的结构,才能明白扫描链怎么插入;理解了插入流程,才能做好模式切换。

好了,关于扫描链的原理,今天就讲到这里。记住一句话:扫描链的本质,就是用面积换可测试性。多花一点硬件资源,换来的是芯片质量的保障。这笔账,怎么算都划算。

核心要点回顾:
  • 扫描触发器 = 普通触发器 + 2选1 MUX
  • 扫描链长度建议 1000~5000 个触发器
  • SE 信号必须做同步处理,避免毛刺
  • 扫描模式时钟频率通常为功能频率的 1/10

可可精品资料库