3、扫描链设计基础
各位同学,今天我们来聊聊扫描链。这是DFT里最基础、也最核心的一块内容。说白了,扫描链就是给芯片里的寄存器装上一扇「后门」,让测试人员能直接控制它们的状态。
我刚开始做DFT那会儿,总觉得扫描链就是简单地把寄存器串起来。后来踩了不少坑才明白,这里面的门道可不少。咱们一个一个来看。
3.1 扫描触发器原理
普通触发器只有两个功能:正常工作时,数据从D端进来,时钟沿到来时存进去。但扫描触发器不一样,它多了一个「测试模式」。
你想想看,芯片里成千上万个寄存器,测试时怎么知道它们存的值对不对?总不能一个个去量吧。扫描触发器就是来解决这个问题的。
它的核心结构其实很简单:在普通触发器前面加一个多路选择器(MUX)。这个MUX有两个输入:一个是正常工作时的数据D,另一个是测试用的扫描输入SI。选哪个,由扫描使能信号Scan Enable决定。
扫描触发器的两种工作模式:
- 正常模式(Scan Enable = 0):数据从D端进入,芯片正常工作
- 扫描模式(Scan Enable = 1):数据从SI端进入,形成扫描链
我在项目中遇到过一种情况:有些工程师为了省面积,把扫描触发器的MUX省掉了,直接用普通触发器加外部逻辑。结果测试覆盖率死活上不去。嗯,这里要提醒大家:扫描触发器必须是标准单元库里的专用单元,别自己拼凑。
下面我画了一张图,帮你理解扫描链的整体结构:
3.2 扫描链的插入流程
扫描链插入,说白了就是把普通寄存器替换成扫描触发器,然后串成一条链。这个流程在EDA工具里基本是自动完成的,但理解背后的逻辑很重要。
我习惯把流程分成三步:
- 准备阶段:综合后的网表,里面全是普通寄存器。工具会先识别出所有需要替换的寄存器。
- 替换阶段:把每个普通寄存器换成对应的扫描触发器。这一步工具会自动匹配,但你要确保库里有对应的扫描单元。
- 连接阶段:把扫描触发器的SO端连到下一个的SI端,形成链。同时把Scan Enable和时钟连好。
我的经验:插入扫描链之前,一定要先检查时钟域。不同时钟域的寄存器不能串在一条链上,否则测试时时序会乱套。我曾经在一个项目里吃过这个亏,后来花了三天才把链重新拆开。
下面是一个简单的扫描链插入脚本示例,用的是Synopsys的DFT Compiler:
# 设置扫描模式
set_scan_configuration -chain_count 4
set_scan_configuration -clock_mixing no_mix
# 创建扫描链
create_test_protocol -infer_clock -infer_reset
# 插入扫描链
insert_dft
# 检查结果
report_scan_path -view existing
report_scan_chain -view existing
这段代码看着简单,但实际跑起来可能会遇到各种问题。比如时钟没定义好、复位信号没处理好,工具就会报错。我建议你每次跑完都检查一下report,看看链的长度是不是均匀的。
3.3 扫描使能(Scan Enable)控制
Scan Enable,简称SE,是扫描链的「开关」。它控制着触发器是在正常模式还是扫描模式。
这里有个关键点:SE信号必须全局同步。什么意思呢?就是所有触发器的SE必须在同一个时钟沿变化。如果有的触发器SE先变了,有的后变了,那数据就会乱掉。
注意:SE信号在测试模式下切换时,必须保证所有触发器同时切换。我曾经见过一个项目,因为SE的扇出太大,导致不同触发器接收到的SE信号有延迟差,结果扫描链移位时数据全错了。后来加了缓冲树才解决。
SE的控制方式一般有两种:
| 控制方式 | 说明 | 适用场景 |
|---|---|---|
| 专用引脚控制 | 芯片外部直接给一个SE引脚 | 小规模芯片,引脚够用 |
| 内部寄存器控制 | 通过JTAG或其他方式设置内部寄存器 | 大规模芯片,引脚紧张 |
我个人更推荐用专用引脚控制,简单可靠。但如果你做的是那种几百个引脚的SoC,引脚确实不够用,那就只能用内部寄存器了。
3.4 扫描时钟域划分
时钟域划分,是扫描链设计里最容易出问题的地方。你想想看,一个芯片里可能有十几个时钟域,每个时钟域的频率、相位都不一样。如果把不同时钟域的寄存器串在一起,测试时怎么保证数据能正确传递?
我的做法是:每个时钟域单独建一条扫描链。比如你有三个时钟域,那就建三条链。每条链的时钟频率可以不一样,测试时分别控制。
但这里有个例外:如果两个时钟域是同步的(同源同频),那可以串在一起。不过要小心,即使同频,相位差也可能导致问题。
时钟域划分的基本原则:
- 不同频率的时钟域:必须分开
- 同频率但不同源的时钟域:建议分开
- 同源同频的时钟域:可以合并,但要检查相位
- 异步时钟域:绝对不要混在一起
我记得有一次,一个同事把两个异步时钟域的寄存器串在了一条链上。测试时,数据从快时钟域传到慢时钟域,结果采样错误,测试覆盖率直接掉了20%。后来花了整整一周才定位到问题。
所以,时钟域划分这件事,宁可多分几条链,也别图省事混在一起。链多了,测试时间会长一点,但总比流片回来发现测试不了强。
好了,扫描链的基础知识就讲到这里。这些内容看着简单,但实际项目里处处都是坑。下一节我们会讲扫描链的优化技巧,到时候再跟大家分享更多实战经验。
公众号:蓝海资料掘金营,微信deep3321