第三章 扫描链设计(Scan Chain)
各位同学,今天我们来聊聊扫描链。说实话,扫描链是DFT里最基础也最核心的技术之一。我刚开始接触DFT时,觉得扫描链不就是把寄存器串起来嘛,有什么难的?后来真正做项目才发现,这里面的门道可不少。
3.1 扫描链的基本原理
扫描链的原理,说白了就是给每个触发器装一个「开关」。
正常工作时,触发器各干各的,互不干扰。测试模式下,我们把所有触发器串成一条链,像珍珠项链一样。这样就能从芯片外部,把测试数据「灌」进去,再把内部状态「读」出来。
为什么要这么做?你想想看,芯片内部那么多节点,你总不能一个个去测吧?扫描链就是解决这个问题的。它把复杂的内部逻辑,变成了一个可控、可观测的「黑盒子」。
核心思想:扫描链将时序电路转化为组合电路,让测试变得简单。
正常模式 → 各触发器独立工作
测试模式 → 触发器串联成链,数据串行输入/输出
我在项目中遇到过这样一个案例:某款芯片有10万个触发器,如果不用扫描链,测试覆盖率连30%都达不到。用了扫描链后,覆盖率直接飙到95%以上。这就是扫描链的价值。
3.2 扫描触发器类型
扫描触发器,就是带「开关」的触发器。常见的类型有这几种:
| 类型 | 结构特点 | 面积开销 | 适用场景 |
|---|---|---|---|
| Muxed-D型 | 数据输入端加一个2选1MUX | 较小 | 最常用,通用性强 |
| LSSD型 | 双锁存器结构,主从分离 | 较大 | 高性能、高可靠性设计 |
| Clocked-Scan型 | 用独立时钟控制扫描 | 中等 | 低功耗设计 |
Muxed-D型扫描触发器,是我用得最多的。它就是在普通D触发器的输入端,加了一个多路选择器。一个输入是正常数据D,另一个是扫描输入SI。通过控制信号SE(Scan Enable)来切换。
嗯,这里要注意:SE信号在测试时是全局的,所有触发器共享。但SI和SO是链式的,前一个的SO连到后一个的SI。
我的建议:对于大多数设计,直接用Muxed-D型就够了。LSSD虽然时序更好,但面积开销大,除非有特殊要求,否则不推荐。
3.3 扫描链的插入与实现
扫描链插入,就是把普通触发器替换成扫描触发器,然后串起来。这个过程现在基本都是工具自动完成的。我用的是Synopsys的DFT Compiler,配合TetraMAX做验证。
具体步骤是这样的:
- 准备工作:确认RTL代码已经综合,网表没问题。
- 设置扫描模式:告诉工具哪些端口是扫描输入/输出。
- 替换触发器:工具自动把普通FF换成扫描FF。
- 连接扫描链:工具根据你的约束,把触发器串起来。
- 生成测试协议:输出STIL或WGL文件,给TetraMAX用。
下面是一个简单的Tcl脚本示例:
# 设置扫描链
set_scan_configuration -chain_count 8
set_scan_configuration -clock_mixing no_mix
# 定义扫描端口
create_port -direction in scan_clk
create_port -direction in scan_enable
create_port -direction in scan_in[0:7]
create_port -direction out scan_out[0:7]
# 插入扫描链
insert_dft
# 验证扫描链
report_scan_path -chain all
我曾经犯过一个低级错误:忘了设置时钟域约束,结果扫描链跨时钟域了。TetraMAX跑ATPG时,报了一堆时序错误。后来花了整整两天才排查出来。所以,时钟域的处理一定要小心。
避坑指南:
- 扫描链不要跨时钟域,除非你用了同步器。
- SE信号要单独走线,不要和功能信号混在一起。
- 扫描链长度要均衡,避免某条链太长导致测试时间过长。
3.4 扫描链的验证
扫描链插完后,别急着跑ATPG。先做两件事:
第一,检查扫描链的连续性。说白了就是看看链有没有断。方法很简单:灌一串已知数据进去,看能不能原样读出来。
第二,检查扫描链的时序。扫描链的时钟频率一般比功能时钟低,但也不能太慢。我一般设为主频的1/3到1/2。
在TetraMAX里,验证扫描链的脚本大概长这样:
# 加载设计
read_netlist my_design.v
run_build_model my_design
# 设置扫描链
add_scan_chain chain1 scan_in scan_out
add_scan_chain chain2 scan_in2 scan_out2
# 运行扫描链测试
run_scan_chain_test
# 查看结果
report_scan_chain -summary
如果测试通过,你会看到每条链的「Pass」标志。如果有问题,工具会告诉你哪条链、哪个节点出错了。
小技巧:验证扫描链时,我习惯先跑一条短链试试。没问题了再跑全部。这样排查问题快很多。
3.5 实际项目中的经验
最后,分享几个我在项目中踩过的坑:
- 扫描链长度:我建议每条链控制在500-1000个触发器之间。太长了测试时间受不了,太短了浪费IO口。
- 时钟处理:扫描链的时钟最好用独立的测试时钟。如果和功能时钟共用,一定要处理好时钟切换逻辑。
- 功耗问题:扫描测试时,所有触发器同时翻转,功耗比正常工作时大得多。我曾经有一款芯片,测试时直接过热保护了。后来加了功耗约束才解决。
好了,扫描链的内容就讲到这里。下一章我们聊聊ATPG,也就是自动测试向量生成。到时候你会看到,扫描链搭好了,ATPG就是水到渠成的事。