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。流程大致分四步:
- 准备网表:先把RTL代码综合成门级网表,确保没有锁存器、三态门这些「捣乱分子」。
- 定义扫描链:告诉工具哪些触发器要串成链,链的起点和终点在哪。
- 自动替换:工具把普通触发器换成扫描触发器,然后按你指定的顺序串起来。
- 验证:跑仿真检查扫描链能不能正常工作。
我的经验之谈:扫描链的长度要均衡。比如你有10000个触发器,分成10条链,每条1000个。别搞成一条链9991个,另一条9个——测试时间会差好几个数量级。
下面这张图展示了扫描链的基本结构,我画了个简单的示意图:
插入扫描链时,工具会生成一个测试协议文件(比如STIL或SPF格式)。这个文件记录了扫描链的拓扑结构、时钟关系、时序约束等信息。我建议你仔细检查这个文件——有一次我发现工具把时钟搞反了,要不是提前发现,流片回来就得哭。
3.3 扫描链的测试与调试
扫描链插完了,怎么知道它好不好使?最直接的办法就是跑扫描链测试。流程是这样的:
- 第一步:加载测试向量。把一串二进制数据从Scan In灌进去,SE拉高,每个时钟周期移一位。
- 第二步:捕获响应。SE拉低,给一个捕获时钟,让组合逻辑的结果锁存到触发器里。
- 第三步:移出结果。SE再拉高,把捕获到的数据从Scan Out移出来,跟预期值比对。
⚠️ 常见问题:扫描链短路或断路。我曾经遇到过一个案例,某条链上有两个触发器的SI和SO接反了,结果数据根本传不过去。调试时看波形,发现中间某一位始终是X态——那就是断点。
调试扫描链,我一般用这三招:
- 看移位测试:灌一串0101...进去,看输出是不是同样的模式。如果不是,说明链上有问题。
- 检查时钟树:扫描链对时钟偏斜很敏感。如果时钟到达每个触发器的时间差太大,移位就会出错。
- 查SE信号:SE的切换时序必须严格。我见过有人SE和时钟之间没做时序约束,结果捕获阶段SE还没稳定,数据全乱了。
| 测试项目 | 测试内容 | 常见故障 |
|---|---|---|
| 移位测试 | 灌入已知模式,检查移位输出 | 扫描链断路、短路、触发器失效 |
| 捕获测试 | 正常模式捕获,扫描模式移出 | 组合逻辑故障、时序违例 |
| IDDQ测试 | 静态电流测量 | 桥接故障、漏电 |
避坑指南:我曾经在一个28nm的项目里,扫描链的测试覆盖率死活上不去。查了两天才发现,有个模块的复位信号没处理好——扫描模式下复位一直有效,触发器根本没法正常工作。后来我在复位路径上加了个测试模式下的屏蔽逻辑,问题就解决了。
嗯,扫描链设计这块,说白了就是「串起来、测起来、查出来」。串的时候注意长度均衡,测的时候注意时序正确,查的时候多看看波形。做到这三点,扫描链基本不会出大问题。
公众号:蓝海资料掘金营,微信deep3321