扫描链设计实战:扫描链插入流程、时钟与复位信号处理、扫描链长度优化
说实话,扫描链设计是DFT里最基础也最核心的活儿。你想想看,一颗芯片几百万个触发器,要是没有扫描链,测试覆盖率根本没法看。我这些年经手过的项目,从28nm到5nm,扫描链这块踩过的坑真不少。今天咱们就聊聊实战中的那些事儿。
扫描链插入流程:别急着跑脚本
很多新手拿到RTL,第一件事就是跑DFT Compiler。我建议你先别急。先看看设计里有多少触发器,时钟域怎么划分的。我有个习惯,先手动画个草图,把扫描链的走向理清楚。
标准的插入流程大概是这样的:
- 读入设计:把综合后的网表读进来
- 设置扫描模式:告诉工具我们要做扫描链了
- 定义扫描时钟:每个时钟域都要单独定义
- 连接扫描端口:scan_in, scan_out, scan_enable
- 插入扫描链:工具自动把触发器串起来
- 验证:跑DRC检查,看看有没有问题
嗯,这里要注意一点。工具自动插入的扫描链,不一定是最优的。我遇到过好几次,工具把跨时钟域的触发器串在一起,结果时序跑不过。所以,我一般会手动指定扫描链的分组。
核心要点:扫描链插入不是一键完成的。你得先理解设计,再动手。工具只是辅助,决策还得靠人。
时钟与复位信号处理:最容易出问题的地方
时钟和复位,这两个信号在扫描模式下跟功能模式下完全不同。说白了,扫描链测试时,我们希望所有触发器都能被控制住。
时钟处理:
- 扫描时钟一般用独立的测试时钟,跟功能时钟分开
- 如果只能用功能时钟,那就要保证在扫描模式下时钟是连续的
- 我建议在扫描模式下,把时钟的gate全部打开,别让时钟被关掉
我记得有个项目,客户非要省一个测试时钟引脚。结果呢?功能时钟在扫描模式下被PLL锁相环的锁定信号给gate住了,扫描链死活跑不起来。后来加了个bypass逻辑才搞定。
复位信号处理:
- 扫描模式下,复位信号最好保持无效状态
- 如果复位信号有glitch,可能会把扫描链里的数据冲掉
- 我一般会在复位路径上加一个扫描模式的mux,让复位在扫描时失效
警告:千万不要把复位信号直接接到触发器的异步复位端,然后在扫描模式下不管它。我曾经因为这个原因,导致扫描链测试时数据总是对不上,查了整整两天才发现是复位信号在作怪。
扫描链长度优化:平衡的艺术
扫描链长度,说白了就是一条链上串了多少个触发器。链太长,测试时间就长;链太短,测试引脚又不够用。怎么平衡?
我一般遵循这几个原则:
| 因素 | 建议 | 原因 |
|---|---|---|
| 链长度 | 500-2000个触发器 | 太短浪费引脚,太长测试时间爆炸 |
| 时钟域 | 同一时钟域尽量放一条链 | 跨时钟域容易出时序问题 |
| 物理位置 | 相近的触发器放一条链 | 布线短,时序好 |
| 功耗 | 高功耗模块单独处理 | 避免测试时局部过热 |
你想想看,如果一条链上有3000个触发器,测试向量就得串3000个时钟周期才能把数据灌进去。要是芯片有100条这样的链,测试时间就太长了。所以,我一般会控制每条链的长度在1000左右。
小技巧:在插入扫描链之前,先用脚本统计一下每个时钟域有多少触发器。然后根据测试引脚的数量,算一下每条链应该放多少。这样心里有数,不会盲目相信工具的默认设置。
实战中的避坑指南
我曾经在一个项目中,扫描链插入后仿真一直报错。查了半天,发现是扫描使能信号(scan_enable)的时序有问题。扫描使能信号在功能模式下是低电平,扫描模式下是高电平。但切换的时候,如果时序没处理好,可能会导致触发器误动作。
我的建议是:
- 扫描使能信号一定要做同步处理
- 最好用两级触发器同步一下
- 扫描使能信号的扇出很大,要注意驱动能力
还有一个坑,就是扫描链的测试时钟。有些设计里,测试时钟是从功能时钟分频得来的。分频比不对,扫描链就跑不起来。我一般会单独给一个测试时钟引脚,省心。
知识体系核心逻辑
下面这张图,是我自己总结的扫描链设计核心逻辑。你看一眼,基本就明白整个流程了。
这张图把扫描链设计的六个步骤串起来了。从设计分析开始,到优化迭代结束。中间任何一个环节出问题,都得回到前面重新调整。说白了,这就是个不断迭代的过程。
好了,扫描链设计实战这块,核心内容就这些。记住,多动手,多思考,别光靠工具。工具能帮你干活,但决策还得靠你。