3. DC参数测试-漏电流测试
任务说明
本案例针对ATE(自动测试设备)测试程序开发中的DC参数测试场景,要求编写一段可独立运行的测试程序,测量芯片输入引脚的漏电流(IIH/IIL),并根据给定的规格限值判定测试结果是否通过。漏电流测试是芯片输入端口最基本的DC特性验证项,用于确认输入引脚在施加高/低电平电压时,流入或流出引脚的电流是否处于允许范围内,从而发现栅氧化层缺陷、ESD保护电路异常或工艺偏差等问题。
测试原理与判定逻辑
漏电流测试分为两类:输入高电平漏电流(IIH)——在输入引脚施加VIH(如2.0V)时,流入引脚的电流;输入低电平漏电流(IIL)——在输入引脚施加VIL(如0.8V)时,从引脚流出的电流。测试机通过PMU(参数测量单元)对引脚施加指定电压并测量实际电流值,将测量值与规格上下限比较,若在限内则判定PASS,否则判定FAIL。本案例实现一个最小完整的测试程序框架,包含引脚配置、电压施加、电流测量、规格比较与结果输出。
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// ---------- 测试机PMU抽象接口 ----------
typedef struct {
double voltage; // 施加电压 (V)
double current; // 测量电流 (A)
int status; // 0: 正常, 1: 过流保护
} PMU_Channel;
// 模拟PMU施加电压并测量电流(实际ATE中由硬件完成)
// 此处用线性模型模拟:I = (V - Vth) / R + I_leak
void pmu_force_voltage_measure_current(PMU_Channel *ch, double v_force) {
ch->voltage = v_force;
// 模拟输入引脚特性:阈值0.5V,等效电阻10kΩ,固有漏电流1μA
double vth = 0.5;
double r_in = 10000.0;
double i_leak_fixed = 1e-6;
if (v_force > vth) {
ch->current = (v_force - vth) / r_in + i_leak_fixed;
} else {
ch->current = i_leak_fixed;
}
ch->status = 0;
}
// ---------- 测试项数据结构 ----------
typedef struct {
const char *name; // 测试项名称
double v_force; // 施加电压 (V)
double i_low_limit; // 电流下限 (A)
double i_high_limit; // 电流上限 (A)
double measured; // 实测电流 (A)
bool pass; // 判定结果
} LeakageTestItem;
// ---------- 测试执行函数 ----------
void run_leakage_test(LeakageTestItem *item, PMU_Channel *pmu) {
pmu_force_voltage_measure_current(pmu, item->v_force);
item->measured = pmu->current;
// 规格判定:下限 ≤ 测量值 ≤ 上限
if (pmu->status == 0 &&
item->measured >= item->i_low_limit &&
item->measured <= item->i_high_limit) {
item->pass = true;
} else {
item->pass = false;
}
}
// ---------- 结果打印 ----------
void print_result(const LeakageTestItem *item) {
printf("%-8s V=%.2fV I=%.3eA [限值: %.3e ~ %.3e A] %s\n",
item->name, item->v_force, item->measured,
item->i_low_limit, item->i_high_limit,
item->pass ? "PASS" : "FAIL");
}
// ---------- 主程序 ----------
int main(void) {
// 定义测试项:IIH (V=2.0V, 上限10μA) 和 IIL (V=0.8V, 下限-10μA)
LeakageTestItem tests[] = {
{"IIH", 2.0, -10e-6, 10e-6, 0, false},
{"IIL", 0.8, -10e-6, 10e-6, 0, false}
};
int num_tests = sizeof(tests) / sizeof(tests[0]);
PMU_Channel pmu = {0, 0, 0};
printf("===== 输入引脚漏电流测试 =====\n");
for (int i = 0; i < num_tests; i++) {
run_leakage_test(&tests[i], &pmu);
print_result(&tests[i]);
}
// 汇总判定
bool all_pass = true;
for (int i = 0; i < num_tests; i++) {
if (!tests[i].pass) {
all_pass = false;
break;
}
}
printf("-----------------------------\n");
printf("整体结果: %s\n", all_pass ? "PASS" : "FAIL");
return all_pass ? 0 : 1;
}
代码说明
上述代码实现了完整的漏电流测试闭环:pmu_force_voltage_measure_current函数模拟PMU对引脚施加指定电压并返回测量电流(实际ATE中由测试机硬件完成,此处用线性模型模拟以便独立运行);run_leakage_test函数执行单次测试并依据规格上下限判定PASS/FAIL;主程序中定义了两个测试项——IIH(施加2.0V)和IIL(施加0.8V),规格限值均设为±10μA。程序运行后逐项打印测量值与判定结果,最后输出整体结论。
落地与验证
运行方式:将代码保存为leakage_test.c,在装有GCC的Linux环境中执行:
gcc -o leakage_test leakage_test.c
./leakage_test
验证方法:观察程序输出的各项测量电流值是否在限值范围内,以及最终整体结果是否为PASS。由于代码中模拟的输入引脚特性固定(阈值0.5V、等效电阻10kΩ、固有漏电流1μA),可预先推算:施加2.0V时电流约为(2.0-0.5)/10000 + 1e-6 = 1.51e-4A = 151μA,超出10μA上限,因此IIH项应判定FAIL;施加0.8V时电流约为(0.8-0.5)/10000 + 1e-6 = 3.1e-5A = 31μA,同样超出上限,IIL项也应判定FAIL。整体结果为FAIL,退出码为1。
判定标准:若程序输出的测量值与上述推算一致,且FAIL判定正确,则说明测试程序逻辑正确。在实际ATE环境中,将pmu_force_voltage_measure_current函数替换为测试机API调用(如V93000的tmu_force_voltage),并修改规格限值为芯片数据手册中的实际值,即可用于量产测试。
预期输出
根据代码中模拟的引脚特性,程序运行后的预期输出如下(此结果由代码逻辑直接推出,非实测数据):
===== 输入引脚漏电流测试 =====
IIH V=2.00V I=1.510e-04A [限值: -1.000e-05 ~ 1.000e-05 A] FAIL
IIL V=0.80V I=3.100e-05A [限值: -1.000e-05 ~ 1.000e-05 A] FAIL
-----------------------------
整体结果: FAIL
两个测试项均超出规格上限,整体判定FAIL,程序返回退出码1。在实际ATE测试中,若测量值落在规格范围内,则对应测试项显示PASS,整体结果由所有测试项共同决定。