扫描链原理:基本结构、工作模式与插入流程
各位同学,今天我们来聊聊扫描链。说实话,这是DFT里最基础也最核心的内容。我当年刚入行时,师傅就跟我说:“扫描链搞不明白,DFT就别想做好。”后来做了这么多年项目,我越发觉得这话一点不假。
一、扫描链的基本结构
扫描链说白了,就是把普通触发器换成带扫描功能的触发器,然后串成一串。嗯,就这么简单。
先看一个普通的D触发器,它只有数据输入D、时钟CK、输出Q。但在扫描链里,我们需要一个扫描触发器(Scan Flip-Flop)。它比普通触发器多了一个扫描输入SI和一个扫描使能SE。
扫描触发器的核心端口:
- D:功能模式下的数据输入
- SI:扫描模式下的数据输入
- SE:扫描使能,控制工作模式
- CK:时钟
- Q:输出
当SE=0时,触发器工作在功能模式,数据从D进来。当SE=1时,进入扫描模式,数据从SI进来。就这么一个简单的切换,就能让我们在测试时把数据“灌”进去,再把结果“读”出来。
我在项目中遇到过一种情况:设计团队为了省面积,用了不带扫描功能的触发器。结果到了DFT阶段,我们不得不手动替换,那叫一个痛苦。所以我的建议是——从一开始就规划好扫描触发器,别等后期再折腾。
二、扫描模式与功能模式
这两个模式的区别,其实就是一个开关的事。但背后的逻辑,值得好好说说。
| 特性 | 功能模式 | 扫描模式 |
|---|---|---|
| SE信号 | 0 | 1 |
| 数据来源 | 组合逻辑输出 | 扫描输入SI |
| 用途 | 正常芯片工作 | 测试与诊断 |
| 时钟要求 | 正常时钟 | 可慢速或快速 |
你想想看,功能模式下,芯片在跑真正的应用。而扫描模式下,我们是在“玩”芯片——把测试向量串行移进去,然后捕获响应,再移出来。说白了,就是给芯片做一次“体检”。
为什么会需要两种模式?因为功能模式下,你没法直接控制内部节点的状态。而扫描模式给了你一个“后门”,让你能直接读写每个触发器的值。这个设计思路,我个人觉得非常巧妙。
我的经验之谈:在扫描模式下,时钟频率可以比功能模式低很多。我一般用10-20MHz的慢时钟做扫描移位,这样信号稳定,不容易出问题。等捕获的时候再用正常频率。
三、扫描链的插入流程
好了,理论说完了,咱们来点实际的。扫描链怎么插?我一般分四步走:
- 准备网表:综合后的门级网表,确保没有黑盒子和未映射的单元
- 定义扫描规则:指定哪些触发器要进链,时钟怎么处理
- 执行插入:用工具自动连接SI/SO,形成扫描链
- 验证:跑DRC检查,确保扫描链能正常工作
下面这张图,是我自己画的扫描链插入前后的对比。你看左边是普通触发器,右边是串成链的样子:
在实际项目中,我一般用Synopsys的DFT Compiler或者Mentor的Tessent来做插入。命令大概长这样:
# 设置扫描模式
set_scan_configuration -chain_count 10 -clock_mixing no_mix
# 定义扫描链
create_test_protocol -infer_clock -infer_reset
# 插入扫描链
insert_dft
# 验证
write_test_protocol -output scan_protocol.spf
dft_drc -verbose
注意:我曾经犯过一个错误——忘了检查时钟域交叉。结果扫描链跨了不同时钟域,导致测试时数据完全乱掉。所以插入前,一定要确认好时钟域划分,不同时钟域的触发器最好放在不同的扫描链里。
四、避坑指南
做了这么多年DFT,我总结了几条扫描链相关的“血泪教训”:
- 扫描链长度要均衡:如果一条链有1000个触发器,另一条只有100个,测试时间会被长链拖死。我一般控制在每条链500-2000个触发器之间。
- 注意异步复位:异步复位信号在扫描模式下要处理好,否则复位一拉,扫描数据全丢了。我的做法是把复位信号在扫描模式下屏蔽掉。
- 时钟树要小心:扫描链的时钟路径和功能模式不一样,插入后一定要重新检查时钟树,别让扫描模式下的时钟歪了。
嗯,扫描链的原理就讲到这里。说白了,它就是给芯片装了个“调试接口”,让我们能在测试时看到内部状态。这个思路在后续的ATPG、故障诊断中都会用到,所以一定要理解透。
小技巧:刚开始学扫描链时,可以先用小设计练手。比如一个8位计数器,手动把它改成扫描链,然后跑仿真看看数据能不能正确移入移出。我当年就是这么学会的,效果很好。
可可精品资料库