3. 扫描链设计(Scan Chain)

扫描链,说白了就是给芯片装上一套「体检系统」。没有它,芯片内部就像个黑盒子——你只能看到输入输出,里面出了啥问题根本不知道。我刚开始做DFT那会儿,第一次看到扫描链的波形图,心里就一个想法:这玩意儿真能帮我们找到芯片的死穴?后来实践证明,它不仅能,而且几乎是唯一靠谱的方法。

3.1 扫描触发器原理

先说说扫描触发器的核心思想。普通触发器只有两个端口:数据输入D和时钟CK。扫描触发器呢,多了一个测试模式选择SE(Scan Enable)和一个扫描输入SI(Scan Input)。

为什么会这样设计?你想想看,芯片正常工作的时候,触发器之间通过组合逻辑相连。测试时我们想把这些触发器串成一条链,让数据能像火车一样一节节传过去。SE就是切换开关——正常模式选D,测试模式选SI。

扫描触发器的基本结构:

// 扫描触发器的Verilog描述
module scan_dff (
    input  clk,    // 时钟
    input  rst_n,  // 复位
    input  d,      // 正常数据输入
    input  si,     // 扫描输入
    input  se,     // 扫描使能
    output reg q   // 输出
);
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            q <= 1'b0;
        else if (se)
            q <= si;  // 测试模式:从扫描链输入
        else
            q <= d;   // 正常模式:从组合逻辑输入
    end
endmodule

这里有个细节我特别想强调:SE信号必须同步到时钟域。我在项目中遇到过有人直接把SE当异步信号用,结果扫描链跑起来时序乱成一锅粥。嗯,这个坑我替你们踩过了。

3.2 扫描链插入流程

扫描链插入不是手动一个个改触发器,而是靠EDA工具自动完成的。我个人习惯用Synopsys的DFT Compiler或者Mentor的Tessent。流程大致分四步:

  1. 准备网表:先把RTL代码综合成门级网表,确保没有锁存器、三态门这些「捣乱分子」。
  2. 定义扫描链:告诉工具哪些触发器要串成链,链的起点和终点在哪。
  3. 自动替换:工具把普通触发器换成扫描触发器,然后按你指定的顺序串起来。
  4. 验证:跑仿真检查扫描链能不能正常工作。

我的经验之谈:扫描链的长度要均衡。比如你有10000个触发器,分成10条链,每条1000个。别搞成一条链9991个,另一条9个——测试时间会差好几个数量级。

下面这张图展示了扫描链的基本结构,我画了个简单的示意图:

扫描链结构示意图 Scan In FF1 (扫描触发器) FF2 (扫描触发器) FF3 (扫描触发器) SO 时钟(共享) 扫描使能SE(共享) 扫描链:Scan In → FF1 → FF2 → FF3 → Scan Out

插入扫描链时,工具会生成一个测试协议文件(比如STIL或SPF格式)。这个文件记录了扫描链的拓扑结构、时钟关系、时序约束等信息。我建议你仔细检查这个文件——有一次我发现工具把时钟搞反了,要不是提前发现,流片回来就得哭。

3.3 扫描链的测试与调试

扫描链插完了,怎么知道它好不好使?最直接的办法就是跑扫描链测试。流程是这样的:

  • 第一步:加载测试向量。把一串二进制数据从Scan In灌进去,SE拉高,每个时钟周期移一位。
  • 第二步:捕获响应。SE拉低,给一个捕获时钟,让组合逻辑的结果锁存到触发器里。
  • 第三步:移出结果。SE再拉高,把捕获到的数据从Scan Out移出来,跟预期值比对。

⚠️ 常见问题:扫描链短路或断路。我曾经遇到过一个案例,某条链上有两个触发器的SI和SO接反了,结果数据根本传不过去。调试时看波形,发现中间某一位始终是X态——那就是断点。

调试扫描链,我一般用这三招:

  1. 看移位测试:灌一串0101...进去,看输出是不是同样的模式。如果不是,说明链上有问题。
  2. 检查时钟树:扫描链对时钟偏斜很敏感。如果时钟到达每个触发器的时间差太大,移位就会出错。
  3. 查SE信号:SE的切换时序必须严格。我见过有人SE和时钟之间没做时序约束,结果捕获阶段SE还没稳定,数据全乱了。
测试项目 测试内容 常见故障
移位测试 灌入已知模式,检查移位输出 扫描链断路、短路、触发器失效
捕获测试 正常模式捕获,扫描模式移出 组合逻辑故障、时序违例
IDDQ测试 静态电流测量 桥接故障、漏电

避坑指南:我曾经在一个28nm的项目里,扫描链的测试覆盖率死活上不去。查了两天才发现,有个模块的复位信号没处理好——扫描模式下复位一直有效,触发器根本没法正常工作。后来我在复位路径上加了个测试模式下的屏蔽逻辑,问题就解决了。

嗯,扫描链设计这块,说白了就是「串起来、测起来、查出来」。串的时候注意长度均衡,测的时候注意时序正确,查的时候多看看波形。做到这三点,扫描链基本不会出大问题。


公众号:蓝海资料掘金营,微信deep3321