第三章:扫描链设计基础
大家好,我是你们的DFT讲师。今天我们来聊聊扫描链设计——这个DFT里最基础、也最核心的环节。
说实话,我刚入行那会儿,觉得扫描链就是个「把寄存器串起来」的活儿。后来踩过几次坑才明白,这里面的门道可不少。你想想看,一条扫描链要是设计不好,整个芯片的测试覆盖率可能直接崩掉。
3.1 扫描链原理:为什么需要它?
先问个问题:芯片制造出来,你怎么知道它有没有物理缺陷?
正常功能模式下,你没法直接控制内部寄存器的状态,也没法观测它们的输出。这就是可测试性设计的痛点。扫描链的解决思路其实很朴素——
把所有的触发器(Flip-Flop)串成一条「链」。测试时,通过这条链把测试向量「灌」进去,再通过它把响应「吐」出来。
我习惯把扫描链比作「芯片的体检通道」。正常工作时,这条通道是关闭的;测试时,它打开,让我们能直接访问每个寄存器的「内心世界」。
核心思想: 扫描链将时序电路转化为组合电路来测试。通过控制扫描使能(Scan Enable)信号,在测试模式下,所有触发器变成一串移位寄存器。
3.2 扫描触发器:核心元件
扫描触发器(Scan Flip-Flop)是扫描链的基本单元。它比普通触发器多了一个「扫描输入」端口和一个「扫描使能」信号。
我见过很多新手问:「为什么不用普通触发器直接串?」嗯,这里要注意——普通触发器没有扫描模式下的数据选择功能,你没法区分「功能数据」和「扫描数据」。
3.2.1 扫描触发器的结构
一个典型的扫描触发器包含:
- 数据输入(D):功能模式下的正常数据
- 扫描输入(SI):扫描模式下的测试数据
- 扫描使能(SE):控制模式切换
- 时钟(CK):统一时钟驱动
- 输出(Q):输出到下一级
说白了,就是在D输入端加了一个2选1的多路选择器。SE=0时,走功能路径;SE=1时,走扫描路径。
我的经验: 在项目里,我建议优先使用带「低功耗保持」功能的扫描触发器。这种触发器在扫描模式切换时,能避免不必要的毛刺,减少动态功耗。我在一个28nm的项目里用过,效果很明显。
3.2.2 常见的扫描触发器类型
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 标准扫描触发器 | 结构简单,面积小 | 大多数数字设计 |
| 低功耗扫描触发器 | 带时钟门控,减少翻转 | 低功耗芯片 |
| 双沿扫描触发器 | 在时钟上升沿和下降沿都工作 | 高速设计 |
| 保持扫描触发器 | 扫描模式下输出保持 | 避免组合逻辑毛刺 |
3.3 扫描链的插入与实现
这部分是实操重点。我见过不少团队,RTL设计完了才想起来做扫描链插入,结果发现时序收敛不了,或者面积爆炸。我的建议是——在综合阶段就规划好扫描链。
3.3.1 插入流程
扫描链插入一般分三步走:
- RTL分析:识别所有触发器,检查时钟域、复位信号
- 扫描替换:将普通触发器替换为扫描触发器
- 链连接:按照指定顺序将扫描触发器串起来
你可能会问:「顺序怎么定?」我个人习惯按物理布局来排。先做floorplan,再根据模块位置决定扫描链的走向。这样能减少绕线拥堵,避免后期ECO(工程变更)的麻烦。
避坑指南: 我曾经在一个项目中,为了省事,把所有触发器按RTL代码顺序串成一条链。结果后端布局时发现,这条链横跨了整个芯片,绕线长度超过5mm,时序直接崩了。后来我学乖了——扫描链长度控制在2000个触发器以内,且尽量在同一个时钟域内。
3.3.2 扫描链的约束
插入扫描链时,你需要告诉工具一些关键信息。下面是我常用的SDC约束示例:
# 定义扫描时钟
create_clock -name scan_clk -period 10 [get_ports scan_clk]
# 定义扫描使能
set_scan_enable scan_enable
# 定义扫描输入输出
set_scan_input [get_ports scan_in]
set_scan_output [get_ports scan_out]
# 设置扫描链长度
set_scan_chain_length 1000
# 避免跨时钟域
set_scan_chain -clock scan_clk -exclude_cross_clock_domain true
嗯,这里要注意——扫描时钟和功能时钟最好分开定义。我在一个项目中吃过亏,把扫描时钟和功能时钟混在一起,结果仿真时出现了时钟竞争,浪费了两天时间排查。
3.3.3 扫描链的验证
插入完成后,别急着往下走。先做三件事:
- DRC检查:确认没有悬空的扫描输入,没有跨时钟域的链
- 功能仿真:在扫描模式下,灌入一串简单的测试向量(比如全0、全1),看输出对不对
- 时序分析:检查扫描路径的建立时间和保持时间
小技巧: 我习惯在仿真时,先灌入一个「走马灯」模式的测试向量——就是让扫描链里的数据像流水灯一样移动。这样能快速发现链上的断路或短路问题。有一次,我就是靠这个技巧,发现了一个时钟树上的bug,避免了流片失败。
3.4 扫描链设计的常见问题
最后,分享几个我踩过的坑:
- 时钟域问题:不同时钟域的触发器不要串在一起,否则时序分析会非常痛苦
- 复位信号:扫描模式下,复位信号最好保持无效,否则扫描数据会被清掉
- 功耗问题:扫描链越长,测试时的动态功耗越大。我建议在测试模式下降频运行
- 面积开销:每个扫描触发器比普通触发器大约多10%-15%的面积。别小看这个数字,一个百万门的设计,扫描链可能吃掉几万门的面积
好了,这一章的内容就到这里。扫描链设计看似简单,但细节决定成败。下一章我们会聊到ATPG(自动测试向量生成),到时候你会更深刻地理解,为什么扫描链的「质量」直接决定了测试向量的「效率」。
记住一句话:好的扫描链设计,是DFT成功的一半。