扫描链设计实战:扫描链插入流程、时钟与复位信号处理、扫描链长度优化

说实话,扫描链设计是DFT里最基础也最核心的活儿。你想想看,一颗芯片几百万个触发器,要是没有扫描链,测试覆盖率根本没法看。我这些年经手过的项目,从28nm到5nm,扫描链这块踩过的坑真不少。今天咱们就聊聊实战中的那些事儿。

扫描链插入流程:别急着跑脚本

很多新手拿到RTL,第一件事就是跑DFT Compiler。我建议你先别急。先看看设计里有多少触发器,时钟域怎么划分的。我有个习惯,先手动画个草图,把扫描链的走向理清楚。

标准的插入流程大概是这样的:

  1. 读入设计:把综合后的网表读进来
  2. 设置扫描模式:告诉工具我们要做扫描链了
  3. 定义扫描时钟:每个时钟域都要单独定义
  4. 连接扫描端口:scan_in, scan_out, scan_enable
  5. 插入扫描链:工具自动把触发器串起来
  6. 验证:跑DRC检查,看看有没有问题

嗯,这里要注意一点。工具自动插入的扫描链,不一定是最优的。我遇到过好几次,工具把跨时钟域的触发器串在一起,结果时序跑不过。所以,我一般会手动指定扫描链的分组。

核心要点:扫描链插入不是一键完成的。你得先理解设计,再动手。工具只是辅助,决策还得靠人。

时钟与复位信号处理:最容易出问题的地方

时钟和复位,这两个信号在扫描模式下跟功能模式下完全不同。说白了,扫描链测试时,我们希望所有触发器都能被控制住。

时钟处理:

  • 扫描时钟一般用独立的测试时钟,跟功能时钟分开
  • 如果只能用功能时钟,那就要保证在扫描模式下时钟是连续的
  • 我建议在扫描模式下,把时钟的gate全部打开,别让时钟被关掉

我记得有个项目,客户非要省一个测试时钟引脚。结果呢?功能时钟在扫描模式下被PLL锁相环的锁定信号给gate住了,扫描链死活跑不起来。后来加了个bypass逻辑才搞定。

复位信号处理:

  • 扫描模式下,复位信号最好保持无效状态
  • 如果复位信号有glitch,可能会把扫描链里的数据冲掉
  • 我一般会在复位路径上加一个扫描模式的mux,让复位在扫描时失效

警告:千万不要把复位信号直接接到触发器的异步复位端,然后在扫描模式下不管它。我曾经因为这个原因,导致扫描链测试时数据总是对不上,查了整整两天才发现是复位信号在作怪。

扫描链长度优化:平衡的艺术

扫描链长度,说白了就是一条链上串了多少个触发器。链太长,测试时间就长;链太短,测试引脚又不够用。怎么平衡?

我一般遵循这几个原则:

因素 建议 原因
链长度 500-2000个触发器 太短浪费引脚,太长测试时间爆炸
时钟域 同一时钟域尽量放一条链 跨时钟域容易出时序问题
物理位置 相近的触发器放一条链 布线短,时序好
功耗 高功耗模块单独处理 避免测试时局部过热

你想想看,如果一条链上有3000个触发器,测试向量就得串3000个时钟周期才能把数据灌进去。要是芯片有100条这样的链,测试时间就太长了。所以,我一般会控制每条链的长度在1000左右。

小技巧:在插入扫描链之前,先用脚本统计一下每个时钟域有多少触发器。然后根据测试引脚的数量,算一下每条链应该放多少。这样心里有数,不会盲目相信工具的默认设置。

实战中的避坑指南

我曾经在一个项目中,扫描链插入后仿真一直报错。查了半天,发现是扫描使能信号(scan_enable)的时序有问题。扫描使能信号在功能模式下是低电平,扫描模式下是高电平。但切换的时候,如果时序没处理好,可能会导致触发器误动作。

我的建议是:

  • 扫描使能信号一定要做同步处理
  • 最好用两级触发器同步一下
  • 扫描使能信号的扇出很大,要注意驱动能力

还有一个坑,就是扫描链的测试时钟。有些设计里,测试时钟是从功能时钟分频得来的。分频比不对,扫描链就跑不起来。我一般会单独给一个测试时钟引脚,省心。

知识体系核心逻辑

下面这张图,是我自己总结的扫描链设计核心逻辑。你看一眼,基本就明白整个流程了。

扫描链设计核心逻辑 1. 设计分析 时钟域/触发器统计 2. 链规划 长度/分组/引脚分配 3. 信号处理 时钟/复位/使能 4. 工具插入 DFT Compiler/ATPG 5. 验证检查 DRC/仿真/时序 6. 优化迭代 长度/时序/功耗 发现问题,返回优化 关键决策点 链长度平衡 | 时钟域隔离 | 物理位置优化 | 测试时间与引脚数权衡

这张图把扫描链设计的六个步骤串起来了。从设计分析开始,到优化迭代结束。中间任何一个环节出问题,都得回到前面重新调整。说白了,这就是个不断迭代的过程。

好了,扫描链设计实战这块,核心内容就这些。记住,多动手,多思考,别光靠工具。工具能帮你干活,但决策还得靠你。

可可精品资料库