3. 测试程序开发基础
好,咱们进入第三章。这一章是真正动手写测试程序的基础。说实话,很多新人一上来就盯着复杂的测试项看,结果连最基本的ATL语法都写不顺。我个人习惯是,先把地基打牢,后面才能盖高楼。
3.1 ATL(测试语言)入门
ATL,全称是ATE Test Language。说白了,它就是用来告诉测试机台「你要干什么」的一套指令集。不同的ATE平台(比如Teradyne、Advantest、Chroma)都有自己的ATL变种,但核心思想是一样的:定义管脚、设置电平、施加时序、测量结果。
我刚开始接触ATL时,觉得它跟C语言挺像的。但用久了你会发现,它更接近一种描述性语言——你不是在写算法,而是在描述测试行为。
3.1.1 一个最简单的ATL程序长什么样?
来看个例子。假设我们要测一个简单的逻辑门,比如AND门。ATL程序大概是这样:
// 定义管脚
PIN A, B, Y;
// 设置电平
LEVELS:
VDD = 3.3V;
VIH = 2.5V;
VIL = 0.4V;
VOH = 2.0V;
VOL = 0.8V;
// 定义时序
TIMING:
PERIOD = 100ns;
WAVEFORM A: FORCE VIH @ 0ns, FORCE VIL @ 50ns;
WAVEFORM B: FORCE VIH @ 0ns, FORCE VIL @ 50ns;
WAVEFORM Y: COMPARE VOH @ 80ns, COMPARE VOL @ 80ns;
// 测试向量
PATTERN:
@VECTOR A B Y;
0: 1 1 1; // A=1, B=1, 期望Y=1
1: 1 0 0; // A=1, B=0, 期望Y=0
2: 0 1 0; // A=0, B=1, 期望Y=0
3: 0 0 0; // A=0, B=0, 期望Y=0
嗯,这里要注意:ATL的语法是严格区分大小写的。我见过有人把PIN写成pin,结果编译报错,查了半天才发现是大小写问题。这种坑,踩过一次就记住了。
3.1.2 ATL的核心三要素
我个人把ATL总结为三个核心要素:
- 管脚定义(Pin Definition):告诉机台你有哪些信号线。数字管脚、电源管脚、时钟管脚,都得列清楚。
- 电平与时序(Levels & Timing):定义信号的电压高低、什么时候驱动、什么时候采样。这部分是测试精度的关键。
- 测试向量(Test Vector):具体的输入输出数据。说白了,就是真值表。
核心观点:ATL的本质,就是把芯片的「功能行为」翻译成机台能执行的「测试指令」。你写得越清晰,机台跑得越准。
3.2 测试向量(Test Vector)的概念
测试向量,英文叫Test Vector。很多人把它理解成「测试数据」,其实不全面。测试向量是一组有序的输入输出组合,它定义了芯片在特定输入下应该产生什么输出。
我曾经在项目中遇到过一个问题:一个芯片的功能仿真全过了,但ATE上一跑就Fail。后来发现,是测试向量里少了一个关键的时序约束——输入信号变化太快,芯片跟不上。你看,向量不只是数据,它还隐含了时序信息。
3.2.1 测试向量的结构
一个典型的测试向量包含两部分:
- 输入向量(Input Vector):施加到芯片管脚上的逻辑值(0或1)
- 输出向量(Output Vector):期望从芯片管脚上读到的逻辑值(0或1)
举个例子,一个2位加法器的测试向量:
| 向量序号 | A[1:0] | B[1:0] | SUM[2:0](期望) |
|---|---|---|---|
| 0 | 00 | 00 | 000 |
| 1 | 01 | 01 | 010 |
| 2 | 10 | 10 | 100 |
| 3 | 11 | 11 | 110 |
你想想看,如果芯片有100个输入管脚,那每个向量就是100位的数据。手动写?不现实。所以我们需要Pattern文件来批量管理这些向量。
3.3 Pattern文件的生成
Pattern文件,就是测试向量的集合文件。它把成千上万个测试向量组织成一个文件,供ATE机台逐条执行。
3.3.1 Pattern文件的格式
不同ATE平台的Pattern格式略有不同,但大体结构相似。以Teradyne的格式为例:
// Pattern文件示例:add_test.pat
PATTERN "add_test";
// 管脚映射
PINMAP:
A0, A1, B0, B1, SUM0, SUM1, SUM2;
// 向量数据
VECTORS:
// A1 A0 B1 B0 SUM2 SUM1 SUM0
0: 0 0 0 0 0 0 0;
1: 0 1 0 1 0 1 0;
2: 1 0 1 0 1 0 0;
3: 1 1 1 1 1 1 0;
END;
嗯,这里要注意:Pattern文件里的每一行,对应一个测试周期。机台会按照顺序,一行一行地执行。如果某一行Fail了,机台就会停下来报错。
3.3.2 如何生成Pattern文件?
实际项目中,Pattern文件很少手写。我们通常用以下方式生成:
- 从仿真波形导出:用EDA工具(如VCS、Modelsim)跑仿真,然后导出测试向量。这是最常用的方法。
- 用脚本自动生成:写Python或Perl脚本,根据算法生成向量。适合大规模测试。
- 手动编写:只适用于小规模芯片或调试阶段。
个人技巧:我习惯在仿真阶段就生成一份「Golden Pattern」,然后跟ATE上实际跑的结果做比对。这样能快速定位是芯片问题还是测试程序问题。
3.3.3 Pattern文件的优化技巧
Pattern文件不是越大越好。我见过有人把几百万行的向量直接丢给机台,结果测试时间长得离谱。优化方向有两个:
- 压缩冗余向量:如果连续几行的输入输出都一样,可以用循环指令代替。
- 合理排序:把容易Fail的向量放在前面,这样能快速筛选出坏片。
避坑指南:我曾经在项目中犯过一个低级错误——Pattern文件里的管脚顺序跟硬件连线不一致。结果测试结果全乱套了。所以,生成Pattern后,一定要先做一次「回环测试」:用已知好的芯片验证Pattern的正确性。
3.4 本章小结
这一章我们聊了三个核心概念:
- ATL入门:它是测试程序的骨架,定义管脚、电平、时序。
- 测试向量:它是测试的灵魂,告诉机台「测什么」。
- Pattern文件:它是向量的载体,让机台能批量执行。
下一章,我们会深入ATE硬件架构,看看机台内部是怎么工作的。到时候你会发现,理解了硬件,写测试程序会顺手很多。
好,今天就到这里。记住:测试程序开发,七分在准备,三分在编码。Pattern文件写好了,后面的事就水到渠成。