ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

IEEE 1450-2023 STIL向量:从ATPG生成到ATE上机调试全流程

IEEE 1450-2023 STIL向量:从ATPG生成到ATE上机调试全流程 简介IEEE 1450-2023《数字测试矢量数据标准测试接口语言STIL》官方标准文档面向数字电路测试工程师、ATPG与BIST开发人员、ATE设备厂商及电子工程专业师生。它定义了CAE工具与自动测试设备之间的通用接口语言解决测试矢量数据跨平台交换、模式格式与时序描述不统一的问题覆盖功能矢量、结构矢量、扫描矢量、循环矢量、时钟信号与波形等关键术语并支持定时事件与波形描述。资源包共1个PDF文件大小约2.86MB为IEEE官方发布版本含摘要、关键词、版权声明与ISBN编号便于检索与引用。已有114人学习下载。该标准是1999年版的修订版读者可据此掌握STIL的语法框架与数据交换机制理解ATPG、BIST及扫描测试矢量的标准化描述方式为测试程序开发、工具互操作与跨平台兼容提供权威依据适合作为数字测试领域的案头参考。1. 从一份跑不通的测试向量说起很多做数字 IC 测试的工程师都遇到过这种场景ATPG 工具吐出一份 STIL 文件仿真器里跑得好好的一上 ATE 就报格式错误或者时序对不上。问题往往不在向量本身而在 IEEE 1450-2023 这套标准里那些容易被忽略的细节——STIL 的时序块怎么描述、信号组怎么映射到测试机通道、扫描链的移位周期怎么和 capture 周期对齐。IEEE 1450 系列从 1999 年的 1450-1999 起步到 2023 年这版已经把 STIL 扩展到了支持更复杂的测试场景包括多域时钟、嵌入式压缩和 BIST 控制。这篇文章不打算复述标准文档而是从实际工程角度把 STIL 向量的生成、解析、验证和上机调试这条链路讲清楚。适合已经接触过 ATPG 或 DFT、但被 STIL 格式和 ATE 适配卡住的人。2. IEEE 1450-2023 里 STIL 向量的结构与时序模型2.1 STIL 文件的四个核心块Header、Signals、Timing、Pattern一份典型的 STIL 文件不是随便写的文本它的结构由标准严格定义。最常见的四个块是Header声明 STIL 版本、日期、来源工具。2023 版要求显式标注STIL 1.1或更高版本号否则部分解析器会按旧版处理。Signals定义信号名、方向、默认状态。这里容易踩的坑是信号名和 ATPG 网表里的端口名不一致导致后续映射错位。Timing用 WaveformTable 描述每个信号的周期、边沿、脉冲。2023 版新增了对多时钟域独立 WaveformTable 的更好支持。Pattern实际的向量数据按 Procedure 或 Macro 组织每个周期对应一组信号状态。下面是一个最小可解析的 STIL 片段展示了一个时钟和一个数据信号的时序定义Timing { WaveformTable basic { Period 100ns; Waveforms { clk { 0 { 0ns D; 50ns U; 100ns D; } } data { 0 { 0ns D; 20ns U; 80ns D; } } } } }这段代码里Period定义了一个测试周期为 100ns。clk在 0ns 驱动低电平50ns 翻转到高100ns 回到低形成一个占空比 50% 的时钟。data在 20ns 驱动高80ns 拉低用来在时钟上升沿附近建立数据。逻辑说明WaveformTable 是 STIL 时序的最小单位每个信号可以有不同的边沿时间。参数说明D表示驱动U表示驱动高实际解析时还要看信号方向定义。如果 ATE 的周期分辨率是 1ns那 100ns 没问题如果是 2.5ns就需要调整边沿时间到整数倍。2.2 用 Python 解析 STIL 并提取向量表手工读 STIL 不现实常见做法是用脚本先做一轮结构检查。下面这段 Python 用简单的状态机提取 Pattern 块里的向量行不依赖第三方 STIL 库适合快速排查格式问题import re def parse_stil_patterns(filepath): with open(filepath, r) as f: content f.read() # 提取 Pattern 块 pattern_match re.search(rPattern\s*\{([^}]*)\}, content, re.DOTALL) if not pattern_match: raise ValueError(未找到 Pattern 块) pattern_body pattern_match.group(1) # 按行提取向量忽略注释和空行 vectors [] for line in pattern_body.splitlines(): line line.strip() if not line or line.startswith(//): continue # 匹配类似 0001 1 0 1 ; 的向量行 vec_match re.match(r^([01XZ])\s([01XZ])\s*;, line) if vec_match: vectors.append(vec_match.groups()) return vectors # 调用示例 vecs parse_stil_patterns(test.stil) print(f提取到 {len(vecs)} 条向量)逻辑说明先用正则定位Pattern { ... }块再逐行匹配由 0/1/X/Z 组成的向量。参数说明[01XZ]覆盖了标准里的四种逻辑状态X表示未知Z表示高阻。实际工程中 Pattern 块可能嵌套多个 Procedure这个脚本只适合扁平结构。如果文件里用了Macro或Procedure嵌套需要改成递归解析。跑完这个脚本至少能确认向量条数和预期是否一致避免 ATE 加载时才发现少了几千条。2.3 时序块与 ATE 周期映射的常见错位STIL 的 Timing 块描述的是理想波形但 ATE 的周期边界是固定的。常见错位有三种错位类型现象排查方法边沿超出周期ATE 报 “edge outside period”检查 WaveformTable 里最大边沿时间是否小于 Period多时钟域冲突某个时钟在 capture 周期被误触发确认每个时钟有独立 WaveformTable且 Pattern 里正确引用信号组映射错向量整体偏移一位对比 Signals 块顺序和 ATE 通道映射表提示2023 版标准建议在 Header 里加SignalGroups块把相关信号打包减少映射错位。但很多老 ATPG 工具默认不生成需要手动补。3. 从 ATPG 到 STIL生成、转换与 BIST 向量的整合3.1 ATPG 工具输出 STIL 时的三个必调参数主流 ATPG 工具如 TetraMAX、Modus在写出 STIL 时都有几个关键选项直接影响后续 ATE 能否直接用周期格式选single_period还是multi_period。如果设计里有多个时钟频率必须选 multi_period否则所有时钟会被强制到同一周期。扫描链格式serial还是parallel。并行扫描链在 STIL 里会生成多个 scan 信号组ATE 通道数不够时容易失败。时序精度默认可能是 1ns但有些 ATE 支持 0.1ns。设成 0.1ns 会让文件变大但边沿对齐更准。以 TetraMAX 为例写出 STIL 的典型命令是write_stil test.stil -single_period -scan_serial -timing_precision 0.1逻辑说明-single_period强制单周期适合简单设计-scan_serial生成串行扫描链-timing_precision 0.1把时间单位精度设为 0.1ns。参数说明如果设计里有 50MHz 和 100MHz 两个时钟-single_period会导致 100MHz 时钟被拉伸capture 时可能采不到正确数据。这时候应该去掉这个选项改用 multi_period 模式。3.2 把 BIST 控制信号嵌入 STIL Pattern 的实操BIST 通常有自己的控制信号bist_en、bist_start、bist_done这些信号在 ATPG 向量里往往被当成普通输入输出。要把它们正确嵌入 STIL需要在 Pattern 里显式控制Pattern bist_sequence { // 初始化 BIST 0000 0 0 0 ; // bist_en0, bist_start0 0000 1 0 0 ; // bist_en1 0000 1 1 0 ; // bist_start1 // 等待 bist_done 0000 1 0 1 ; // bist_start0, 观察 bist_done1 // 读取签名 0000 0 0 1 ; // bist_en0 }逻辑说明前三个周期完成 BIST 使能和启动第四个周期撤销 start 并等待 done 信号拉高最后一个周期关闭 BIST。参数说明向量里的 0/1 对应信号组顺序必须和 Signals 块里定义的顺序一致。如果 bist_done 是异步信号还需要在 Timing 块里给它单独定义采样窗口否则 ATE 可能在错误的时间点采样。3.3 用 STIL 做仿真与 ATE 之间的交叉验证生成 STIL 后不要直接上 ATE。常见做法是先用仿真器读回 STIL和原始仿真波形对比。以 VCS 为例vcs -sverilog testbench.sv design.v -o simv ./simv stiltest.stil dumpvcd逻辑说明stiltest.stil让仿真器加载 STIL 向量并驱动设计dumpvcd导出波形。参数说明如果仿真器不支持直接读 STIL可以用脚本把 STIL 转成 VCD 或 EVCD再喂给仿真器。对比时重点看扫描链移位后的 capture 值是否和 ATPG 预期一致。不一致的地方通常是时序边沿对不齐回到 Timing 块调整。4. STIL 向量上机调试从解析失败到稳定运行4.1 ATE 加载 STIL 报错时的排查顺序上机第一步是加载 STIL报错信息往往很模糊。按这个顺序排查效率最高检查文件头版本号2023 版标准要求STIL 1.1如果写的是STIL 1.0部分 ATE 会拒绝加载。检查 Signals 块和通道映射用 ATE 的通道映射工具对比信号名大小写敏感。检查 Timing 块边沿把所有边沿时间打印出来看是否有超出 Period 的。检查 Pattern 块向量长度每条向量的位数必须等于信号数多一位少一位都会报错。下面这段 Python 可以快速检查向量长度一致性def check_vector_length(filepath, expected_signals): with open(filepath, r) as f: lines f.readlines() for i, line in enumerate(lines): line line.strip() if line.startswith() and line.endswith(;): vec line.strip(;).split() if len(vec) ! expected_signals: print(f第 {i1} 行向量长度 {len(vec)}预期 {expected_signals})逻辑说明逐行扫描以引号开头分号结尾的向量行按空格拆分后对比信号数。参数说明expected_signals是 Signals 块里定义的信号总数。如果向量里用了信号组缩写需要先展开再对比。4.2 时序边沿与 ATE 周期精度的对齐技巧ATE 的周期精度通常是固定的比如 1ns 或 0.5ns。STIL 里的边沿时间如果不是精度的整数倍ATE 会自动取整导致时序偏移。对齐技巧把所有边沿时间调整到精度整数倍。例如精度 1ns边沿时间用 0、10、20、50不要用 12.5。如果必须用非整数边沿在 Header 里声明TimingPrecision让 ATE 知道实际精度。对于多时钟域每个 WaveformTable 的 Period 必须是精度整数倍且相互之间最好有倍数关系。注意有些 ATE 在加载时会静默取整不报错但测试结果不稳定。建议在 Timing 块里显式写Precision 1ns;。4.3 用 STIL 做失效向量回灌与诊断测试失败后需要把失效向量回灌到仿真里做诊断。常见做法是从 ATE 导出失败周期号然后在 STIL 里定位对应向量# 假设 ATE 报告失败周期为 1520 grep -n ; test.stil | sed -n 1520p逻辑说明grep -n ;列出所有向量行及行号sed -n 1520p取第 1520 行。参数说明ATE 报告的周期号可能从 0 或 1 开始需要确认。拿到具体向量后在仿真里单独跑这条向量观察内部节点状态。如果仿真通过但 ATE 失败问题在 ATE 的时序或电平设置如果仿真也失败问题在向量本身或设计。5. 进阶用 STIL 做多域时钟与压缩向量的协同验证多域时钟和嵌入式压缩是 2023 版 STIL 重点增强的部分。实际项目中压缩向量会让 STIL 文件里的扫描链数量成倍增加多域时钟则要求每个域有独立的 WaveformTable。一个实用的验证流程是用 ATPG 生成压缩向量时选择-compress选项并指定压缩比。在 STIL 的 Header 里声明Compression块标注压缩模式和解压器类型。用脚本检查每个时钟域的 WaveformTable 是否独立且 Period 是否满足各自频率要求。在仿真里同时加载压缩向量和 BIST 向量观察解压后的扫描链数据是否和原始向量一致。下面是一个检查多域时钟 Period 的脚本片段import re def check_clock_domains(filepath): with open(filepath, r) as f: content f.read() # 提取所有 WaveformTable 的 Period periods re.findall(rWaveformTable\s(\w)\s*\{[^}]*Period\s([\d.])ns, content, re.DOTALL) for name, period in periods: print(f时钟域 {name}: Period {period}ns) # 检查是否有重复 Period 但不同域 period_values [p for _, p in periods] if len(period_values) ! len(set(period_values)): print(警告存在相同 Period 的多个时钟域确认是否应该合并) check_clock_domains(test.stil)逻辑说明用正则提取每个 WaveformTable 的名字和 Period打印后检查是否有重复。参数说明如果两个时钟域 Period 相同但相位不同仍然需要独立 WaveformTable这个脚本只能提示不能判断。实际项目中多域时钟的 STIL 文件往往超过 100MB建议先用脚本做结构检查再上 ATE。最后一个技巧在 ATE 上跑压缩向量时把解压器的控制信号也写进 STIL 的 Pattern 里而不是依赖 ATE 的默认配置。这样换一台测试机时只需要改通道映射不用重新生成向量。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进