3、扫描链设计基础:扫描链的工作原理、扫描触发器类型(muxed-D、LSSD)、扫描链的插入流程、扫描使能控制

各位同学,今天我们聊聊扫描链。这是可测性设计里最基础、也最核心的一块。说白了,扫描链就是给芯片里的每个触发器装上一扇「后门」。测试模式下,我们可以通过这扇后门,把测试数据灌进去,再把结果读出来。

我刚开始接触DFT时,觉得这玩意儿挺神奇的。明明芯片正常工作的时候,触发器之间是组合逻辑连着的,怎么一进测试模式,它们就乖乖串成一串了呢?嗯,今天我们就把它彻底讲透。

3.1 扫描链的工作原理

先看一张简单的图(脑补一下):

正常模式:
组合逻辑 → FF1 → 组合逻辑 → FF2 → 组合逻辑 → FF3

测试模式(扫描链):
Scan_in → FF1 → FF2 → FF3 → Scan_out

工作原理其实就三步:

  1. 移位(Shift):测试模式下,所有触发器串成一条链。时钟每来一个周期,数据从Scan_in移入,经过FF1、FF2、FF3,最后从Scan_out移出。
  2. 捕获(Capture):移入完成后,切回正常模式,给一个或几个时钟脉冲。这时候组合逻辑的输出被捕获到触发器里。
  3. 移出(Unload):再切回测试模式,把捕获到的结果从Scan_out移出来,和预期值比对。

为什么能这么干?因为每个触发器在测试模式下,输入被切换到了扫描路径上。你想想看,原本每个触发器的输入来自前级组合逻辑,现在变成了来自前一个触发器的输出。这就是「扫描」二字的由来。

核心要点:扫描链的本质,是把时序电路在测试模式下「降维」成移位寄存器。这样我们就可以用ATE(自动测试设备)直接控制每个触发器的状态,也能直接读出每个触发器的状态。

3.2 扫描触发器类型

扫描触发器不是普通触发器。它需要多一个「测试数据输入」端口和一个「测试使能」控制。实际工程中,主流的有两种:muxed-D和LSSD。

3.2.1 Muxed-D扫描触发器

这是最常用的类型。结构很简单:在D触发器的输入前加一个2选1多路器。

          ┌─────┐
D (功能) ─┤     │
          │ MUX ├──→ D触发器 ─→ Q
SI (扫描)─┤     │
          └─────┘
              ↑
            SE (扫描使能)

SE=0时,选择D端,正常工作。SE=1时,选择SI端,进入扫描移位模式。

我个人习惯在项目里优先用muxed-D。为什么?因为它面积小,功耗低,而且大多数标准单元库都直接提供。我在一个28nm的项目里,整个芯片用了超过20万个muxed-D触发器,综合下来面积开销大概在5%左右,完全可以接受。

小提示:选muxed-D时,注意多路器的传播延迟。如果SE信号到达时间不一致,可能导致扫描移位时数据错位。我建议在SE树上做时钟树综合级别的平衡。

3.2.2 LSSD(电平敏感扫描设计)

LSSD是IBM搞出来的老牌技术。它不用多路器,而是用两个锁存器组成一个主从结构。

L1锁存器          L2锁存器
D ─→ [L1] ─→ [L2] ─→ Q
       ↑          ↑
     C1时钟     C2时钟
     SI ─→ [L1] (扫描输入)

LSSD有两个独立的时钟:C1控制L1,C2控制L2。正常工作时,C1和C2交替脉冲,数据从D传到Q。扫描模式下,通过C1和C2的非重叠脉冲,数据从SI串行移入。

说实话,LSSD现在用得少了。为什么?因为它面积大,功耗高,而且需要两个时钟。但它在抗毛刺方面确实有优势。我记得有一次做车规级芯片,客户指定要用LSSD,说是可靠性要求高。那是我第一次在项目里用LSSD,布线的时候真是头疼,两个时钟树要分别做平衡。

特性 Muxed-D LSSD
面积开销 小(约5-10%) 大(约15-25%)
功耗
时钟需求 单时钟 双时钟(C1/C2)
抗毛刺能力 一般
主流应用 消费电子、AI芯片 军工、车规、高可靠

3.3 扫描链的插入流程

扫描链插入不是手动干的,都是用EDA工具自动完成。但流程你得心里有数。我一般分四步走:

  1. 准备网表和库:综合后的门级网表,加上标准单元库(里面要有扫描触发器的定义)。
  2. 定义扫描链:告诉工具哪些触发器要串成链,链的起点(Scan_in)和终点(Scan_out)在哪。
  3. 执行插入:工具会把普通触发器替换成扫描触发器,然后把它们串起来。这一步会生成新的网表。
  4. 验证:跑DRC(设计规则检查)和仿真,确保扫描链功能正确。

这里有个坑。我曾经在一个项目里,工具自动把时钟域混在一起的触发器串到了同一条链上。结果仿真时发现,跨时钟域的扫描数据老是出错。后来我学乖了,插入前先按时钟域分组,每个时钟域单独做一条链。

警告:扫描链插入后,一定要做形式验证(Formal Verification)。确保插入前后,功能逻辑完全等价。我见过有人跳过这步,结果流片回来测试时发现功能不对,最后定位到是扫描插入时把一条关键路径改坏了。

3.4 扫描使能控制

扫描使能(Scan Enable,简称SE)是整个扫描链的「总开关」。SE=1时,芯片进入测试模式;SE=0时,恢复正常工作。

SE的控制有几个关键点:

  • 全局性:SE信号通常是一个全局信号,从芯片的测试引脚进来,经过缓冲树分布到每个扫描触发器。
  • 时序要求:SE切换必须在时钟沿之间完成。如果SE在时钟沿附近变化,可能导致触发器误操作。我一般要求SE的setup/hold时间和数据信号一样严格。
  • 毛刺防护:SE线上绝对不能有毛刺。一旦毛刺导致SE误翻转,扫描链上的数据就全乱了。我习惯在SE入口加一个同步器,再用一个毛刺滤波器。

实际项目中,SE控制还有一个常见问题:功耗。扫描移位时,所有触发器同时翻转,瞬间电流可能比正常工作还大。我记得有个项目,扫描测试时电源压降太大,导致测试失败。后来我们加了SE的分组控制,一次只激活一部分链,才把问题解决。

避坑指南:我曾经在一个65nm的项目里,SE信号用了普通的缓冲树,结果测试时发现扫描链移位速度上不去。后来换成时钟树综合工具来布SE树,问题就解决了。SE树和时钟树一样,需要做平衡。

好了,扫描链的基础就这些。下一章我们讲扫描链的优化和压缩技术,到时候会涉及更多实战经验。记住,扫描链是DFT的基石,这块搞不明白,后面ATPG、诊断什么的都白搭。