一、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 覆盖率报告 定位低覆盖率模块
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐