第二章 测试开发全流程
这一章咱们聊聊一个测试程序从无到有的完整过程。很多人觉得写测试程序就是对着规格书敲代码,其实远没那么简单。整条链路走下来,涉及的角色和环节非常多。
我个人习惯把整个流程拆成四个阶段:规格定义、测试计划、程序开发、量产释放。每个阶段都有坑,也有对应的打法。咱们一个个看。
2.1 规格定义:搞清楚测什么
规格定义是所有工作的起点。说白了,就是要回答三个问题:这个芯片干什么用的?它在什么条件下工作?它的好坏怎么判断?
我在项目中遇到过最头疼的情况,就是规格书没写清楚温度的上下限。结果程序写完了,量产时才发现某些温度点下测试项全挂。嗯,这锅得大家一起背。
核心要点:规格定义阶段必须明确的几件事
- 芯片类型:SerDes、DDR、PCIE、USB,每种接口的测试策略不同
- 工作条件:电压范围、温度范围、频率要求
- 测试项:DC参数、AC参数、功能测试、扫描测试
- 良率目标:一般消费类芯片要求95%以上,车规级要99.5%以上
- 测试时间:量产测试的每颗芯片时间上限,直接决定测试方案选型
我建议在规格定义阶段就让ATE工程师参与进来。很多时候Design team觉得很容易测的参数,到了ATE上根本实现不了。早沟通,少返工。
2.2 测试计划:设计怎么测
测试计划是连接规格和代码的桥梁。这个阶段要解决的是测试策略问题——哪些项在CP测,哪些在FT测?每个测试项用什么方法?要覆盖多少Die?
你想想看,一个复杂的高速接口芯片,可能有上百个测试项。如果把所有项都在CP测完,探针卡成本会高到离谱。所以必须做取舍。
| 测试阶段 | 测试内容 | 典型时间 | 覆盖率目标 |
|---|---|---|---|
| CP (Chip Probe) | DC参数、Scan、BIST、基本功能 | 100-300ms | 杀99%的坏Die |
| FT (Final Test) | 全部AC参数、ATE Pattern、系统级测试 | 500ms-2s | 100%规格覆盖 |
| SLT (系统级测试) | 真实系统环境下的功能验证 | 5-30s | 专项覆盖 |
测试计划里还有一个被很多人忽略的东西——guardband(保护带)。其实就是给测试规格留点余量。比如规格要求眼高200mV,你设210mV作为测试限。这样能避免因为测试机台噪声导致的误杀。
我曾经在测试计划阶段图省事,没给高速信号眼图测试设guardband。结果量产时良率比预期低了3%。查了三天才发现是ATE电源纹波导致的误判。从那以后,我的测试计划里guardband永远是第一页。
2.3 程序开发:把计划写成代码
测试程序开发,说白了就是把测试计划翻译成ATE能执行的语言。不同的ATE平台用的语言不一样——Teradyne用IG-XL,Advantest用TCT,Chroma用PVI。但底层逻辑是一样的。
写代码这事,我建议遵循一个原则:先能跑,再优化。很多人一开始就想把代码写得特别漂亮——抽象层、函数封装、回调机制全上了。结果程序跑起来一堆bug,根本不知道是算法问题还是ATE硬件问题。
我一直用的是这个开发顺序:
- 裸跑测试项:一个测试项一个函数,不优化,能跑就行
- 验证结果:拿Golden sample跑一遍,确认数据合理
- 加测试限:把规格值和guardband写进去
- 做排序优化:把耗时长的项放后面,如果前面Fail了直接跳过
- 加并行:如果是多site测试,考虑site之间的独立性和复用性
// 伪代码示例:典型的测试程序结构
void TestMain() {
// 初始化
InitATE();
LoadPattern("high_speed_eye.pat");
// 测试项排序:先DC后AC
if (!TestLeakage()) return; // 漏电流,几ms就杀一批
if (!TestIDDQ()) return; // 静态电流,快速过滤
if (!TestPLLLock()) return; // PLL锁定,必须项
if (!TestEyeDiagram()) bin[5]++; // 眼图,耗时最长放最后
// 结果判断
if (bin[5] > 0) SetBin(5);
else SetBin(1);
}
写测试程序时,我习惯在每段关键代码后面加一个debug输出。这样要是量产时出了问题,能快速定位是ATE硬件、Pattern还是算法的问题。调试信息虽然会拖慢一点点,但省下的排错时间远大于这点开销。
2.4 量产释放:从实验室到产线
量产释放是整个流程的最后一步,也是最容易出问题的一步。实验室环境和量产产线环境差太多了——温度、电源、机械振动都不一样。
我记得有一次,程序在实验室跑了三天,所有Golden sample都通过。结果一发到产线,良率掉了8%。排查了整整一周,最后发现是量产产线的电源滤波不够干净,导致高速信号的jitter偏大了。解决方法是在程序里加了一段电源噪声校准。
量产释放前,我建议先做一个小批量的试产——一般1000-2000颗。统计这批数据的分布情况,看看有没有异常:
- 良率曲线:如果良率集中在99%附近,没问题;如果良率只有80%,或者波动很大,要先查原因
- 参数分布:每个测试项的数值分布是否呈正态分布?如果出现双峰,说明可能有工艺问题
- site一致性:多site测试时,每个site的良率和参数分布应该一致。如果一个site明显差,先查那路通道的硬件
- 时间分布:测试时间是否稳定?如果某颗芯片耗时特别长,可能是die本身有问题,也可能是ATE卡住了
量产释放前的checklist
- ☐ 测试程序在3台以上不同ATE机台上跑过验证
- ☐ 至少5颗Golden sample跑过全项测试,数据存档
- ☐ 至少10颗Bad sample能稳定Fail掉
- ☐ 测试时间在规格要求以内
- ☐ 多site测试的site-to-site偏差小于5%
- ☐ 量产程序版本号明确,有Git tag存档
量产释放后,千万别觉得万事大吉了。前一周要每天看良率数据。要是发现良率有跳变,第一件事不是改程序,而是查ATE硬件——探针卡、Socket、Loadboard这些最容易先坏。我曾经就因为没查硬件,白白改了一周的程序,最后发现是Loadboard上的一个电容虚焊了。
最后说一句,测试开发流程不是线性的。你会发现,在量产释放阶段发现的问题,往往会让你回到规格定义阶段重新审视——是不是当初规格写得太松了?还是测试计划里漏了什么项?所以,迭代是常态,闭环思维才是关键。