第二章:测试向量生成——ATPG基础、故障模型与向量格式
各位好,我是你们的DFT讲师。今天咱们聊聊测试向量生成。说实话,这是DFT里最“硬核”的部分之一。我当年刚入行时,总觉得ATPG是黑魔法,跑个脚本就完事了。直到有一次,芯片回来测试覆盖率死活上不去,我才老老实实把原理啃了一遍。
嗯,咱们今天就把这块掰开揉碎了讲。
2.1 ATPG:自动测试向量生成
ATPG,全称Automatic Test Pattern Generation。说白了,就是让EDA工具自动帮你算出一组输入信号,用来检测芯片内部有没有制造缺陷。
我个人习惯把ATPG比作“侦探破案”。你给芯片一个输入刺激,观察输出是不是你预期的。如果输出不对,那里面肯定有“坏人”——也就是缺陷。
核心思想:ATPG工具会遍历芯片的每一个节点,尝试生成能“激活”并“传播”故障的测试向量。
这里有两个关键动作:
- 故障激活:让故障点的逻辑值与正常值相反。比如一个Stuck-at 0的节点,你得先让它变成1,才能看出它是不是卡在0了。
- 故障传播:把故障点的异常值,一路传到芯片的输出引脚上,这样测试机才能抓到。
我在项目中遇到过最头疼的事,就是某些内部节点“太深”,路径太长,传播起来特别费劲。这时候就得靠ATPG工具的算法了——比如D算法、PODEM、FAN等。不过这些算法细节,咱们做应用层的工程师,了解原理就够了,不用死磕。
小提示:ATPG生成的向量数量,直接决定了测试时间。我建议你在项目初期就设定好覆盖率目标(比如95%以上),然后让工具在满足覆盖率的前提下,尽量压缩向量数。
2.2 故障模型:Stuck-at 与 Transition Delay
故障模型,就是我们对芯片缺陷的“抽象描述”。你想想看,芯片里可能出错的种类太多了,我们不可能为每一种都单独建模。所以业界提炼出了几种经典模型。
2.2.1 Stuck-at 故障模型
这是最基础、最常用的模型。它假设某个节点永久性地卡在逻辑0或逻辑1上。
- Stuck-at 0 (SA0):节点永远输出0,不管输入怎么变。
- Stuck-at 1 (SA1):节点永远输出1,不管输入怎么变。
举个例子,一个两输入与非门,如果输出端SA0了,那不管输入是00、01、10还是11,输出永远是0。正常情况只有输入11时输出才是0,其他情况都是1。所以测试这个故障,你需要输入11,然后看输出是不是0——如果是,那故障没被激活;如果不是0,说明故障存在。
注意:Stuck-at模型虽然简单,但它覆盖不了所有的缺陷。比如两个节点短路,或者信号跳变太慢,它就测不出来。所以别指望只靠它搞定一切。
2.2.2 Transition Delay 故障模型
这个模型是针对“速度”问题的。芯片制造出来后,有些路径的延迟会变大,导致信号跳变跟不上时钟频率。
Transition Delay故障分两种:
- Slow-to-Rise:节点从0变1时,速度太慢。
- Slow-to-Fall:节点从1变0时,速度太慢。
测试这种故障,需要两个连续的向量:第一个向量把节点设成初始值,第二个向量让它跳变,然后在下一个时钟沿捕获结果。如果捕获到的值不对,说明延迟超标了。
我记得有一次做高速芯片项目,Stuck-at覆盖率做到了98%,结果芯片回来还是有问题。后来一查,是某条关键路径的Transition Delay故障。从那以后,我再也不敢只做Stuck-at测试了。
| 故障模型 | 检测对象 | 测试向量数 | 适用场景 |
|---|---|---|---|
| Stuck-at | 永久性逻辑错误 | 较少 | 常规制造缺陷 |
| Transition Delay | 时序/速度缺陷 | 较多(需2个向量) | 高速芯片、关键路径 |
2.3 测试向量格式:STIL 与 WGL
ATPG工具生成向量后,得存成某种格式,才能交给测试机去跑。业界主流格式有两种:STIL和WGL。
2.3.1 STIL 格式
STIL,全称Standard Test Interface Language。它是IEEE 1450标准,目前最通用。
STIL文件结构清晰,包含:
- Header:定义测试对象、时钟、时序等信息。
- PatternBurst:一组测试向量的集合。
- Pattern:具体的向量序列,包括输入激励和期望输出。
下面是一个简化的STIL代码示例:
STIL 1.0;
Header {
Design "chip_top";
Timing {
WaveformTable wft_main {
Period '10ns';
Waveforms {
clk { 0 { '0ns' '0'; } 1 { '5ns' '1'; } }
data { 0 { '0ns' '0'; } 1 { '0ns' '1'; } }
}
}
}
}
PatternBurst burst_main {
PatternList { pat_001, pat_002, pat_003; }
}
Pattern pat_001 {
V { clk=0; data=1; }
C { clk=1; }
V { clk=0; data=0; }
Compare { data=1; }
}
我个人习惯用STIL,因为它可读性好,而且大部分EDA工具和测试机都支持。不过要注意,不同厂商的STIL实现可能有细微差别,移植时得小心。
2.3.2 WGL 格式
WGL,全称Waveform Generation Language。它比STIL更老,但有些测试机还在用。
WGL的语法更“扁平”,没有STIL那么结构化。它主要靠关键字来定义波形和向量。
举个例子:
WGL_VERSION 2.0;
TIMING_UNIT ns;
WAVEFORM clk {
PERIOD 10;
WAVEFORM_DATA 0 0, 5 1;
}
PATTERN pat_001 {
INPUTS clk data;
OUTPUTS q;
VECTORS {
0 1 L;
1 0 H;
}
}
你看,WGL把时序和向量混在一起写,读起来不如STIL清晰。但它的优点是文件小,解析快。
避坑指南:我曾经在项目里遇到测试机只支持WGL,但ATPG工具默认输出STIL的情况。解决办法是让工具做一次格式转换,或者写个脚本自己转。我建议你在项目启动前,先确认好测试机支持的格式,免得后期手忙脚乱。
2.4 本章知识体系总览
为了帮你理清思路,我画了一张图,把本章的核心逻辑串起来:
从这张图你可以看到,整个流程是串行的:先有网表和库,然后ATPG工具基于故障模型生成向量,最后输出成STIL或WGL格式交给测试机。每一步都有坑,但每一步也都有套路可循。
好了,这一章就到这里。记住,ATPG不是跑个脚本就完事,你得理解它背后的逻辑,才能在出问题时快速定位。下一章咱们聊聊扫描链设计,那是DFT的另一个核心。