第三章 扫描链设计(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做验证。

具体步骤是这样的:

  1. 准备工作:确认RTL代码已经综合,网表没问题。
  2. 设置扫描模式:告诉工具哪些端口是扫描输入/输出。
  3. 替换触发器:工具自动把普通FF换成扫描FF。
  4. 连接扫描链:工具根据你的约束,把触发器串起来。
  5. 生成测试协议:输出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就是水到渠成的事。