4. ATPG(自动测试向量生成)基础
好,咱们进入ATPG的世界。说实话,很多工程师觉得ATPG就是个黑盒子——把网表丢进去,跑个脚本,向量就出来了。但如果你真这么想,碰到复杂故障或者覆盖率上不去的时候,你会完全不知道从何下手。
我个人习惯是,先搞清楚ATPG到底在干什么。说白了,ATPG就是帮我们找一组输入激励,让芯片内部的某个故障能被观察到。这听起来简单,但背后涉及到的算法,嗯,挺有意思的。
4.1 ATPG到底在解决什么问题?
先想一个问题:芯片里有一个节点 stuck-at 0 了,你怎么知道它坏了?你得让这个节点正常应该是1,然后你才能看到它输出0,对吧?
所以ATPG要干两件事:
- 故障激活:让故障点的值与正常值相反。比如 stuck-at 0,你就得让这个节点变成1。
- 故障传播:把故障点的错误值一路传到输出引脚,让我们能测到。
我在项目中遇到过一种情况:一个故障明明激活了,但覆盖率就是上不去。后来发现,是因为故障传播路径被其他信号堵死了。这就是ATPG算法要解决的核心问题——怎么找到一条通畅的路。
4.2 D算法:老祖宗的智慧
D算法是ATPG里最经典的算法,1966年就提出来了。你别看它老,它的思想至今还在用。
D算法的核心概念是D立方。D表示正常值为1、故障值为0;D̅(D-bar)表示正常值为0、故障值为1。说白了,D就是“故障信号”的代号。
算法流程大致是:
- 选一个故障,比如某个节点 stuck-at 0。
- 给这个节点赋D值(正常1,故障0)。
- 从故障点开始,沿着路径往前推,把D值传到输出。
- 同时往后推,给输入引脚赋值,让D值能成立。
- 如果遇到矛盾,就回溯,换条路。
听起来挺直白的,对吧?但实际跑起来,D算法有个大问题——它要同时做前向传播和后向回溯,路径一多,计算量爆炸。我记得有一次跑一个十万门的设计,D算法跑了整整两天还没出结果。嗯,那时候我就知道,得换算法了。
D算法的关键点:
- 使用D立方表示故障信号
- 前向传播 + 后向回溯同时进行
- 遇到矛盾就回溯,换路径
- 适合小规模电路,大规模电路效率低
4.3 PODEM算法:更聪明的选择
PODEM(Path-Oriented Decision Making)算法是D算法的改进版,1981年提出。它最大的改进是:只往后推,不往前推。
什么意思呢?PODEM只给输入引脚赋值,然后看这些赋值能不能让故障传播到输出。如果不能,就换一组输入赋值。这样避免了D算法那种“前推后推一起搞”的混乱局面。
我举个例子你就明白了:
假设有一个故障,需要让A=1、B=0才能激活。D算法会同时去推A和B的值,还要看它们能不能传到输出。PODEM呢?它先猜一组输入值,比如A=1、B=0,然后直接看输出是不是D。如果是,搞定;如果不是,换一组。
你想想看,这就像找钥匙——D算法是把所有抽屉都打开,每个抽屉里再翻一遍;PODEM是只看抽屉外面贴的标签,猜哪个抽屉里有钥匙。
我个人经验:PODEM在处理大型设计时,速度比D算法快一个数量级。我曾经用PODEM跑一个百万门的设计,半天就出结果了。但要注意,PODEM对某些特殊故障(比如冗余故障)可能会陷入死循环,这时候需要设置迭代次数上限。
4.4 其他ATPG算法简介
除了D算法和PODEM,还有几个算法你可能会遇到:
| 算法 | 特点 | 适用场景 |
|---|---|---|
| FAN | 改进了PODEM的回溯策略,减少无效搜索 | 中等规模设计 |
| SOCRATES | 使用静态和动态学习,提前剪枝 | 大规模设计,覆盖率要求高 |
| 遗传算法 | 模拟进化过程,随机搜索 | 特殊故障,传统算法搞不定的 |
说实话,现在主流的EDA工具(比如TetraMAX、FastScan)底层用的基本都是PODEM或FAN的变种。你不需要自己实现这些算法,但理解它们的原理,能帮你更好地调试ATPG脚本。
4.5 测试向量生成流程:从网表到向量
好了,算法讲完了,咱们看看实际流程。我一般把ATPG流程分成五步:
- 读入设计:把综合后的门级网表读进来。注意,这里要用的是DFT插入后的网表,不是原始RTL。
- 建立故障模型:工具会自动生成故障列表。常见的故障模型有stuck-at、transition delay、path delay等。
- 故障压缩:把等价的故障合并掉。比如两个节点如果逻辑上完全一样,它们的故障也是等价的,只测一个就行。
- 向量生成:ATPG工具用PODEM或FAN算法,逐个故障生成测试向量。
- 向量压缩:把多个故障的测试向量合并,减少测试时间。
避坑指南:我曾经犯过一个错误——直接拿RTL仿真用的testbench去跑ATPG。结果跑出来的向量全是X态,覆盖率0%。后来才意识到,ATPG需要的是门级网表,而且必须指定时钟和复位信号。嗯,从那以后,我每次跑ATPG前都会先检查一下网表里有没有X态传播的问题。
4.6 一个简单的ATPG脚本示例
这里我用TetraMAX的语法举个例子,其他工具大同小异:
# 读入门级网表
read_netlist my_design.v
# 建立故障模型
add_faults -all
# 设置ATPG模式
set_atpg -algorithm podem
# 生成测试向量
run_atpg -auto
# 输出向量文件
write_patterns my_patterns.stil -format stil
你看,代码就这么几行。但实际项目中,你还需要设置时钟周期、定义测试模式、处理异步复位等等。这些细节,咱们后面章节会展开讲。
4.7 本章小结
ATPG的核心,说白了就是“激活故障,传播故障”。D算法是老祖宗,PODEM是更聪明的选择。实际项目中,你不需要自己写算法,但理解它们能帮你更好地调试。
我个人建议,刚开始接触ATPG时,先拿一个小设计(比如一个加法器)手动跑一遍流程。看看工具是怎么生成向量的,覆盖率是怎么算的。等你理解了整个过程,再上大设计,会顺手很多。
记住三点:
- 故障激活 + 故障传播 = ATPG的核心
- PODEM比D算法更适合大规模设计
- ATPG流程:读网表 → 建故障 → 压缩 → 生成向量 → 压缩向量