新手DFT入门:用5个实际例子看懂WGL文件里的Signal、Scanchain和Pattern Block
新手DFT入门:用5个实际例子看懂WGL文件里的Signal、Scanchain和Pattern Block
第一次打开WGL文件时,那些密密麻麻的Signal定义和Scanchain配置是否让你一头雾水?作为芯片测试领域的"乐谱",WGL文件用特定语法描述了测试仪该如何与芯片"对话"。本文将用五个真实案例,带你拆解这份"乐谱"的核心章节。
1. Signal定义:芯片测试的"演员表"
想象你正在编排一场舞台剧,首先需要确定有哪些演员参与演出。在WGL文件中,Signal块就是这个"演员表",它定义了测试过程中需要用到的所有芯片引脚及其初始状态。来看一个典型的Signal定义片段:
Signal { clk : inout; scan_en : input initial=0; data[7:0] : inout initial=1; reset_n : input initial=1; }这段代码透露了几个关键信息:
- 端口方向:
input表示测试仪驱动信号,output表示监测芯片输出,inout则是双向信号 - 初始状态:
initial指定上电时的默认电平(未指定时默认为0) - 总线表示法:如
data[7:0]表示8位数据总线
实际项目中,Signal定义可能包含数百个信号。建议用表格整理关键信号:
| 信号名称 | 类型 | 初始值 | 说明 |
|---|---|---|---|
| clk | inout | - | 系统时钟 |
| scan_en | input | 0 | 扫描使能,低电平有效 |
| data[7] | inout | 1 | 数据总线最高位 |
注意:初始状态的设置会影响测试序列的生成,特别是对复位信号这类关键控制线需要格外小心。
2. Scanchain配置:芯片内部的"流水线"
现代芯片通常包含数十万甚至上百万个触发器,要逐个测试它们就像检查流水线上的每个产品。Scanchain将这些触发器串联成"流水线",使测试仪能通过少量引脚访问所有内部状态。下面是一个简化的Scanchain定义:
Scanchain grp1chain1 { SI -> cell1 -> cell2 -> ... -> cellN -> SO; Scanstate { Input = 'b0101...'; // 待载入的测试数据 Output = 'bxxxx...'; // 预期输出的掩码 } }理解这段代码需要掌握三个概念:
- 物理连接:
SI -> cell -> SO描述了扫描链的硬件连接顺序 - 逻辑分组:
grp1chain1这样的命名通常反映芯片的层次结构 - 状态定义:
Scanstate块指定了测试时的输入输出预期
当扫描链很长时,可以用Python脚本快速计算关键参数:
chain_length = len(scan_chain_cells) shift_cycles = chain_length # 装载完整数据需要的时钟周期数 print(f"扫描链长度:{chain_length},需要{shift_cycles}个移位周期")3. Timeplate:测试仪的动作时序图
如果把测试比作舞蹈,那么Timeplate就是规定每个动作节奏的编舞表。它定义了信号变化的精确时间点:
Timeplate gen_tp1 { Period = 40ns; Events { 0ns : D; // 驱动固定值 20ns : S; // 采样信号值 40ns : D; // 回到驱动状态 } }这个Timeplate解读为:
- 测试周期为40纳秒
- 在0ns时刻,测试仪驱动(D)信号到指定电平
- 20ns时,测试仪采样(S)芯片输出
- 40ns时周期结束,开始下一个循环
常见的时间参数组合:
| 应用场景 | 周期 | 驱动时刻 | 采样时刻 |
|---|---|---|---|
| 低速功能测试 | 100ns | 0ns | 50ns |
| 高速扫描测试 | 20ns | 0ns | 10ns |
| 异步接口测试 | 不定 | 上升沿 | 下降沿 |
4. Pattern Block:测试用例的"剧本"
Pattern Block是WGL文件中最具实操性的部分,它像剧本一样详细描述了每个测试步骤。典型的模式包括:
Pattern example { // 初始化阶段 Vector (0) { scan_en=1; clk=0; } // 进入扫描模式 Vector (+, gen_tp1) { ... } // 应用timeplate // 装载测试数据 Repeat (chain_length) { Vector (+, gen_tp1) { ... } // 每个周期移入1位 } // 捕获响应 Vector (0) { scan_en=0; } // 退出扫描模式 Vector (+, gen_tp1) { ... } // 功能时钟脉冲 }关键操作符解析:
Vector (0):绝对向量编号Vector (+, tp):相对上一个向量自增编号,应用指定timeplateRepeat (N):循环执行N次
实际项目中,Pattern可能包含数千个向量。调试时可以关注这些关键点:
- 扫描使能(scan_en)的切换时机
- 时钟信号的边沿与扫描移位的同步关系
- 输入输出向量的对应关系
5. WGL与STIL的差异:测试语言的"方言"比较
虽然WGL和STIL都是描述测试模式的语言,但它们在扫描链处理上有本质区别:
WGL工作流程:
- 定义目标Scanstate
- 工具自动计算需要的移位序列
- 通过多个循环达到目标状态
STIL工作流程:
- 直接指定每个扫描单元的输入值
- 单次移位即可载入完整状态
- 更接近ATE机器的原生操作
选择建议:
- 芯片设计阶段常用WGL,因其更抽象且与设计工具集成更好
- 量产测试时倾向STIL,因其执行效率更高且直接对应ATE操作
理解这些差异有助于在不同阶段选择合适的工具链。比如在原型验证时,可以先用WGL快速生成测试模式,量产前再转换为STIL优化测试时间。
