数字测试基础:电平、时序、格式与 Pattern
数字测试听上去就是给芯片灌 0 和 1,对吧?可到了物理世界,这个 0 和 1 是靠电压高低、时间窗口、波形形状来定义的。我刚开始做 test 时总觉得“数字嘛,非黑即白”,结果被一个电平配置坑了大半个月。从那时起我就明白——数字测试的基础,就是搞懂电平、时序、波形格式,以及它们怎么拼成一个完整的 Pattern。
电平的世界——VIH、VIL、VOH、VOL
先聊电平。你给 DUT 发一个“1”,驱动电压必须大于 VIH(输入高电平阈值);发一个“0”,必须小于 VIL。反过来 DUT 输出“1”时,至少要达到 VOH;输出“0”时,最多只能到 VOL。这四个参数撑起了整个数字接口的逻辑判定。
| 参数 | 含义 | 典型约束 |
|---|---|---|
| VIH | 输入高电平最小值 | 比如 2.0 V(3.3V 逻辑) |
| VIL | 输入低电平最大值 | 比如 0.8 V |
| VOH | 输出高电平最小值 | 比如 2.4 V |
| VOL | 输出低电平最大值 | 比如 0.4 V |
这里有个坑。我曾经遇到过一块芯片在常温下所有测试都 OK,到了高温就不 pass。查了半天发现是 VIH 设得太接近 spec 下限,高温下驱动器的输出能力下降,DUT 刚好判定不到“1”。后来我把 VIH 调高了 0.5 V 再跑,问题就消失了。所以我的习惯是:只要 spec 允许,驱动电平尽量留够余量,别卡在边界上。
时序——建立时间、保持时间、测试周期
电平对了,时序不对照样白搭。每一个时钟周期里,DUT 需要一段稳定的时间读取输入(建立时间),还要一段稳定的时间保持输入不变(保持时间)。测试周期(T)决定了你能跑多快的频率。
- 建立时间 (tsu):数据在时钟沿之前必须稳定的最短时间。
- 保持时间 (th):数据在时钟沿之后必须稳定的最长时间。
- 测试周期 (T):相邻两个时钟沿之间的时间间隔。
你想想看,如果 DUT 的建立时间要求是 2 ns,而 ATE 在时钟沿前只给了 1.5 ns 的稳定窗口,那采样到的数据可能是上一拍的残影。我调试一个 DDR 接口时遇到过类似的麻烦——保持时间窗口只有 50 ps,ATE 的通道间 skew 都比这大。那会儿我花了两天把每条通道的延迟校准到皮秒级,才终于让测试稳定下来。
波形格式——NRZ、RZ、RO、SBC
电平定了,时序定了,下一步就是决定每个 bit 长什么样。ATE 里常见的波形格式有这么几种:
| 格式 | 全称 | 波形特征 | 典型用途 |
|---|---|---|---|
| NRZ | Non-Return to Zero | 整个周期保持高或低,不归零 | 标准数字功能测试 |
| RZ | Return to Zero | 前半周期输出有效电平,后半周期归零 | 时序敏感的信号,如时钟 |
| RO | Return to One | 前半周期输出有效电平,后半周期归到“1” | 某些外设接口,如 SPI |
| SBC | Surrounded by Complement | 有效脉冲前后各有一个反相位的 guard bit | NAND Flash 等信号质量要求高的场景 |
我个人习惯把 NRZ 作为默认选项,因为它最简单、占用的 Tester Memory 最少。但做 NAND Flash 测试时我就换 SBC 了——SBC 的 guard bit 能把信号边沿的过冲和振铃隔离掉,避免误触发。我曾经因为格式选错,一块 Flash 的读操作始终报错,换成 SBC 之后一次过。格式这东西,说白了就是给信号穿件“衣服”,合身最重要。
Pattern 的组成与类型
电平、时序、波形格式都配齐了,把它们打包成一个一个的向量(Vector),就组成了 chip 认识的“语言”——Pattern。在一个 vector 里,你要指定:
- 每个管脚在这一拍是什么逻辑值(0/1/Z/X);
- 这个值的电平在哪里(引用 Level Set);
- 这个值什么时候出现(引用 Timing Set);
- 这个值用什么波形格式发出(比如 NRZ/RZ)。
所以一个完整的 Pattern 其实是下面四者的组合:
Vector = Pattern_Data + Level_Set + Timing_Set + Waveform_Format
我在教学时经常遇到新人问:“哪种 Pattern 最好?”我一般会反问:“你的 DUT 最怕什么?”
- Scan Pattern:专门给 DFT 用的,控制 scan chain 的 shift 和 capture。稳定、好调试。
- Function Pattern:模拟真实工作流程,跑一遍完整的读/写/配置。覆盖率最广,但调试难度也最大。
- BIST Pattern:DUT 自己产生并检查结果,ATE 只负责触发和读结果。测试时间最短,但需要 DUT 支持。
- Algorithmic Pattern:用数学算法实时生成向量,适合内存测试(March 算法等)。能省大量 Pattern 存储空间。
我通常的做法是:先用 Scan Pattern 快速筛掉结构缺陷,再用 Function Pattern 打一遍真实场景,最后根据问题加 BIST 或 Algorithmic 做精定位。你想想看,要是一上来就跑复杂的 Function Pattern,出问题了你都不知道是逻辑错还是 timing 错——这种教训我吃过两次后就老实了。
这张图把四块东西串起来了——电平、时序、波形格式是零件,Pattern 是成品。你搞懂它们各自干什么,再搞懂它们怎么拼,数字测试就算入了门。后面我们会拿具体的 Pattern 文件,一行一行拆开看,到时候你就知道这四样东西在 ATE 里是怎么落地实现的。