Modus ATPG 实战:从 netlist 到 pattern 的完整流程
一、Modus 是什么
Modus(全称 Modus Test) 是 Cadence 的 ATPG(Automatic Test Pattern Generation,自动测试向量生成)工具。它的工作就是:读入插好 scan chain 的网表,自动生成测试向量(test pattern),用来检测芯片制造过程中产生的缺陷。
打个比方: 你把一张试卷(scan netlist)交给一个老师(Modus),老师出了一套考题(test patterns),学生(ATE,自动测试设备)拿这套考题去考每一颗芯片——能答对的芯片就是好的,答错的就是坏的。
二、Modus 流程全景

从~={red}genus自动生成的脚本=~中提取出的 7 步核心流程:
① build_model 读网表 + 工艺库 → 逻辑模型
② build_testmode 读 scan chain 信息 → 测试模型
③ verify_test_structures 验证 scan chain 连接是否正确
④ build_faultmodel 建立故障模型(stuck-at / transition)
⑤ create_logic_tests ATPG 自动生成测试向量
⑥ write_vectors 输出 pattern(Verilog / WGL / STIL)
⑦ report_fault_statistics 报告测试覆盖率
每个步骤之间都有 check_log 做断点验证——这与你的工程方法论中的断点验证法完全一致:每做完一步就检查日志,有问题立刻停,不带着问题往下一步走。
三、第一步:build_model(建立逻辑模型)
build_model \
-cell digital_core \ # 顶层模块名
-techlib /path/to/library.v \ # 工艺库 Verilog
-designsource ./netlist.v \ # 插完 scan 的网表
-allowmissingmodules no
check_log log_build_model
各参数含义(人话版):
| 参数 | 作用 | 为什么重要 |
|---|---|---|
-cell |
指定顶层模块名 | Modus 知道从哪开始分析 |
-techlib |
工艺库,包含所有 stdcell 的功能描述 | 必须与综合用同一个库,否则 Modus 不认识 cell |
-designsource |
插完 scan 后的网表(Genus 输出的 *_dft.v) |
就是这个网表里已经有 scan chain 了 |
-allowmissingmodules no |
不允许缺失模块 | 强烈建议用 no,missing module 会导致 ATPG 误判 |
check_log 检查什么:
# 脚本:
source $::env(Install_Dir)/bin/64bit/test_checks.tcl
# check_log 自动扫描日志文件,如果有 ERROR 或 WARNING_SEVERE 就停止脚本
常见问题:
| 问题 | 现象 | 修复 |
|---|---|---|
| techlib 路径不对 | Modus 报不认识某些 cell | 检查 library .v 文件路径 |
| missing module | Modus 把缺失模块当黑盒处理 | 加 -allowmissingmodules no 让它报错 |
网表里有 dont_use cell |
Modus 报 unsupported cell type |
检查综合脚本中 set_dont_use 的设置 |
四、第二步:build_testmode(建立测试模型)
build_testmode \
-testmode FULLSCAN \ # 测试模式名
-assignfile ./digital_core.FULLSCAN.pinassign \ # pin 分配文件
-modedef FULLSCAN
check_log log_build_testmode_FULLSCAN
pinassign 文件的内容(Genus 自动生成):
# digital_core.FULLSCAN.pinassign
define_test_clock -function dft_clock -name scan_clk {scan_clk}
define_test_signal -function test_mode {mscan} -active high
define_test_signal -function async_set_reset {scan_rst} -active low
define_shift_enable -name scan_en -active high {scan_en}
define_scan_chain -name scan_chain -sdi {scan_in} -sdo {scan_o} -shift_enable scan_en
这个文件定义了扫描测试中各个信号的角色。Modus 根据它来理解:
scan_clk → 测试时钟(什么时候打脉冲)
mscan → 测试模式使能(1=测试模式)
scan_en → shift 使能(1=移位,0=capture)
scan_rst → 测试复位
scan_in → 数据输入
scan_o → 数据输出
多测试模式(扩展内容)
脚本只有 FULLSCAN 一种模式。实际项目中可以有多种测试模式:
# 多个测试模式
build_testmode -testmode FULLSCAN_STUCK -assignfile ... -modedef STUCK
build_testmode -testmode FULLSCAN_TRANSITION -assignfile ... -modedef TRANSITION
build_testmode -testmode MBIST -assignfile ... -modedef MBIST
不同模式共享同一个 logic model,但有不同的 test mode、不同的 pattern 生成策略。
五、第三步:verify_test_structures(验证 scan chain)
verify_test_structures \
-messagecount TSV-016=10,TSV-024=10,TSV-315=10,TSV-027=10 \
-testmode FULLSCAN
它检查什么:
| 检查项 | 含义 |
|---|---|
| 每个 scan chain 的输入是否能从 scan_in pin 到达 | 路径通不通 |
| 每个 scan chain 的输出是否能到达 scan_o pin | 路径通不通 |
| 所有 scan flop 的 clock 是否都由 scan_clk 驱动 | 时钟是否正确 |
| scan_en 是否能控制所有 scan flop 的 shift/capture | 控制信号对不对 |
| 异步 reset 在测试模式下是否被正确禁用 | scan mode 下 reset 不该起作用 |
-messagecount 参数的作用:
有些告警是已知安全的(比如 TSV-016 表示某个 flop 没有 clock——如果它在异步域里是正常的)。-messagecount 允许这些告警出现 N 次以内不报错。超出 N 次才触发 ERROR。
# 如果没有 -messagecount,1 个 TSV-016 就 ERROR
# 用 -messagecount 后,10 个以内 PASS,第 11 个才 ERROR
六、第四步:build_faultmodel(建立故障模型)
build_faultmodel -includedynamic no
这是什么?
在开始生成 pattern 之前,Modus 需要知道"要测哪些故障"。
-
stuck-at fault(固定故障): 某个节点 stuck at 0 或 stuck at 1,检测它能不能翻转
-
transition fault(时延故障): 某个节点从 0→1 或 1→0 的时间太长
-includedynamic no 表示只建立静态故障模型(stuck-at),不包括动态故障(transition、IDDQ 等)。
脚本只跑了 stuck-at。如果要跑 transition,需要:
# 跑 stuck-at
build_faultmodel -includedynamic no
create_logic_tests -experiment stuck_at -testmode FULLSCAN
# 跑 transition(需要先 build_faultmodel 包含动态故障)
build_faultmodel -includedynamic yes
set_atpg -capture_cycles 2 # 需要 2 个 capture 周期
create_logic_tests -experiment transition -testmode FULLSCAN
stuck-at vs transition 的故障数量对比
设计中(~200K gates):
故障类型 故障数(约) pattern 数
────────────────────────────────────────────
stuck-at 400,000 50~100 ← 你现在的脚本
transition 400,000 × 2 200~500 ← 需要 OCC
transition 的故障数是 stuck-at 的两倍(因为每个节点有 slow-to-rise 和 slow-to-fall 两种故障)。
七、第五步:create_logic_tests(ATPG 运行)
create_logic_tests \
-experiment digital_core_atpg \
-testmode FULLSCAN
这是最核心的一步——Modus 自动生成测试向量。 它会做:
读入 scan chain 信息
↓
为每个 stuck-at 故障尝试找到一个 vector(输入组合 + 预期输出)
↓
逐步压缩 vector 数量(pattern compaction)
↓
报告测试覆盖率
运行时间: 对于 ~200K gates 的设计,通常 5-30 分钟。如果跑 transition 会更久(2-3 倍)。
覆盖率目标:
| 指标 | 含义 | 目标值 |
|---|---|---|
| FC(Fault Coverage) | 检测到的故障 / 总故障 | >95% |
| DTC(Detected Test Coverage) | 检测到的故障 / (总故障 − 不可测故障) | >99% |
| AUPD(Average Untestable Pattern Distribution) | 不可测故障的分析 | 越小越好 |
控制 pattern 数量
# 限制 pattern 数量上限
set_atpg -pattern_count_limit 200
# 设置 compaction 力度(越高 pattern 越少但运行时间越长)
set_atpg -compaction high
# 设置 fault 分级:只保留可测 fault
set_atpg -abort_limit 100 # 每个 fault 尝试 100 次后放弃
八、第六步:write_vectors(输出 pattern)
write_vectors -inexperiment digital_core_atpg \
-testmode FULLSCAN \
-language verilog -scanformat parallel
write_vectors -inexperiment digital_core_atpg \
-testmode FULLSCAN -language wgl
write_vectors -inexperiment digital_core_atpg \
-testmode FULLSCAN -language stil
三种输出格式的区别:
| 格式 | 用途 | 特点 |
|---|---|---|
| Verilog(parallel) | VCS 仿真验证 | 你的后仿用这个。可直接在 VCS 中跑 testbench |
| WGL(Waveform Generation Language) | ATE(自动测试设备) | 工业标准,大部分 ATE 支持 |
| STIL(Standard Test Interface Language) | ATE / 调试 | IEEE 标准,很多工具支持 |
parallel vs serial:
# parallel(常用):所有 chain 同时输出到独立 IO
-scanformat parallel
# serial(调试):所有 chain 串行输出到一个 IO
-scanformat serial
九、第七步:report_fault_statistics(覆盖率分析)
report_fault_statistics \
-workdir atpg_scripts \
-testmode FULLSCAN \
-hierstart top \
-hierend 3 \
-sorthier yes \
-hiernameform short
输出示例:
Test Mode: FULLSCAN
────────────────────────────────────────────────
Total faults : 402,183
Detected (DT) : 398,561 (99.1%)
Undetected (UD) : 231 (0.06%)
Untestable (UT) : 3,391 (0.84%)
────────────────────────────────────────────────
Fault Coverage (FC) : 99.1%
Test Coverage (TC) : 99.9%
────────────────────────────────────────────────
FC vs TC 的区别:
FC = DT / Total = 398561 / 402183 = 99.1%
TC = DT / (Total - UT) = 398561 / (402183 - 3391) = 99.9%
UT(不可测故障)的原因:
- 冗余逻辑(多路冗余路径中的故障被掩盖)
- 异步逻辑(没有时钟的路径)
- 约束条件导致的不可测路径
hierstart/hierend 的作用: 按层次结构报告每个子模块的覆盖率,让你能定位"哪个模块覆盖率低"。
十、从你的脚本可以扩展的内容
10.1 Transition delay ATPG(时延故障测试)
脚本只做了 stuck-at。transition 是下一步:
# 1. 建立动态故障模型
build_faultmodel -includedynamic yes
# 2. 设置 at-speed capture(需要 OCC 支持)
set_atpg -capture_cycles 2
# 3. 生成 transition patterns
create_logic_tests -experiment transition \
-testmode FULLSCAN \
-faulttype transition
# 4. 输出
write_vectors -inexperiment transition \
-testmode FULLSCAN -language verilog
10.2 故障诊断(Diagnosis)
当一颗芯片在 ATE 上测试失败,Modus 可以分析失败 log 定位故障位置:
# 读入 ATE 失败 log
read_fails -format testerlog tester_fail.log
# 运行诊断
run_diagnosis -outputdir diagnosis_results
10.3 Pattern 压缩
# 静态压缩(减少 pattern 数量不降低覆盖率)
compress_patterns -experiment digital_core_atpg
# 动态压缩(在生成时自动压缩)
set_atpg -compaction_effort high
10.4 IDDQ 测试
# IDDQ 测试:测静态电流(向量化后的 quiescent current)
set_atpg -iddq yes
create_logic_tests -experiment iddq \
-testmode FULLSCAN \
-faulttype stuck
十一、知识编织:与前面内容的关联
与 scan chain(05-18/19)的关联
Genus DFT 插入 scan chain → 输出 *_dft.v + *.pinassign
↓
Modus ATPG 读入 *_dft.v + *.pinassign → 生成 test patterns
↓
VCS 后仿验证 patterns → ATE 测试芯片
关键依赖: Modus 的 pinassign 文件由 Genus DFT 在 write_dft_atpg 时生成。如果 Genus 阶段的 scan chain 有问题(例如 ASYNC-02 导致 scannable=0%),Modus 阶段无法弥补。
与 OCC(前几篇的讨论)的关联
transition ATPG 需要 OCC(On-Chip Clocking)
↓
OCC 需要 func_clk 在 capture 阶段提供 at-speed 脉冲
↓
没有 OCC → Modus 只能做 stuck-at,不能做 transition
十二、总结
| 步骤 | 命令 | 做什么 | 检查什么 |
|---|---|---|---|
| 1 | build_model | 读网表 + 库 → 逻辑模型 | missing module |
| 2 | build_testmode | 读 scan info → 测试模型 | pin 分配 |
| 3 | verify_test_structures | 验证 scan 连接 | chain 通不通 |
| 4 | build_faultmodel | 建立故障列表 | stuck-at / transition |
| 5 | create_logic_tests | 生成 pattern | FC > 95% |
| 6 | write_vectors | 输出 pattern | 格式正确 |
| 7 | report_fault_statistics | 覆盖率报告 | 定位低覆盖率模块 |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)