ATPG调试实战:如何通过静态信号约束将AU故障降低90%
最近在完成一个28nm项目的ATPG流程时,遇到了一个令人头疼的问题——生成的pattern中AU(ATPG Untestable)故障占比高达45%,覆盖率卡在31%无法提升。经过两周的深度排查,最终发现是复位信号约束缺失导致的连锁反应。本文将分享这个典型案例的完整分析过程,以及如何通过set_static_dft_signal等关键命令彻底解决问题。
1. 故障现象与初步分析
当ATPG工具报出"the number of AU faults has increased by 38% since the start of ATPG"的警告时,我们立即注意到几个异常现象:
- AU比例随pattern增加而上升:从初始的15%逐渐攀升至45.13%
- 无效pattern占比高:生成的221条pattern中,有效率仅77.34%
- 故障分类异常:大部分AU故障显示为unclassified状态
使用report_faults -fault_type AU -class unclassified命令导出故障点时,发现主要集中在几个特定模块的寄存器上。通过以下检查排除了常见问题:
# 检查scan chain基础配置 report_scan_chains -summary # 验证时钟和复位网络 report_dft_signal -all # 检查时序约束 report_atpg_constraints所有基础配置看似正常,但set_gate_report pattern_index 0命令却返回了一个关键线索:"No internal scan test pattern exist"。这暗示着pattern生成过程存在根本性缺陷。
2. 深度追踪:复位信号的不确定性
通过set_gate_report -fault_status AU聚焦特定寄存器故障点时,我们发现了异常现象:
| 寄存器名称 | 复位端状态 | 数据端状态 | 时钟状态 |
|---|---|---|---|
| outstanding_xfer_reg_0_ | 随机跳变 | 正常扫描 | 稳定 |
| status_hold_reg_1_ | 不定态 | 正常扫描 | 稳定 |
| buffer_ctrl_reg_3_ | 随机跳变 | 正常扫描 | 稳定 |
关键发现:所有异常寄存器在capture阶段都表现出复位信号的不稳定状态
进一步分析发现,设计中有一个全局复位信号sync_set_reset_disable在测试模式下缺少明确约束。这个信号连接到多个模块的异步复位端,导致ATPG工具无法确定其应保持的逻辑值。
3. 根本原因:静态控制信号的缺失约束
在ATPG过程中,以下三类信号必须明确约束:
- 复位信号:同步/异步复位
- 测试模式信号:MBIST、LBIST等专用信号
- 时钟门控使能:影响时钟树传播
在我们的案例中,sync_set_reset_disable信号未被约束,导致ATPG工具出现两种错误行为:
- 在shift阶段随机赋值,破坏scan chain数据完整性
- 在capture阶段产生不定态,导致故障无法传播
通过以下命令验证了这一判断:
# 查看信号在pattern中的实际值 report_simulation_values -signal sync_set_reset_disable -pattern all # 分析信号驱动强度 report_driving_strength -pin [get_pins */sync_set_reset_disable]4. 解决方案:set_static_dft_signal的正确应用
针对静态控制信号,Tessent提供了一套完整的约束命令:
# 基本语法 set_static_dft_signal -name <signal_name> -active <state> \ [-clock <clock_name>] [-view <view_name>]具体到本案例,我们分三步实施修复:
约束主复位信号:
set_static_dft_signal -name sync_set_reset_disable -active 1 \ -clock test_clk -view existing验证约束效果:
# 重新生成pattern create_patterns -fault_coverage # 检查AU比例 report_faults -summary建立长期规范:
- 在DFT约束文件中预先声明所有静态信号
- 增加ATPG前的约束完整性检查脚本
- 对复杂复位网络采用层次化约束策略
实施后效果对比:
| 指标 | 修复前 | 修复后 | 提升幅度 |
|---|---|---|---|
| AU占比 | 45.13% | 4.2% | 90.7%↓ |
| 测试覆盖率 | 31.43% | 95.8% | 204.8%↑ |
| 有效pattern率 | 77.34% | 99.1% | 28.1%↑ |
5. 进阶技巧:复杂场景下的信号约束
对于更复杂的设计,我们总结出以下最佳实践:
多电压域处理:
set_static_dft_signal -name pd1_reset_n -active 0 \ -voltage_domain PD1 -view existing异步复位同步释放:
set_static_dft_signal -name async_reset -active 0 \ -synchronize -clock test_clk条件约束:
if {[get_dft_modes -active] == "mbist_mode"} { set_static_dft_signal -name mbist_en -active 1 }常见陷阱与规避方法:
过度约束:将本应动态控制的信号设为静态,导致覆盖率损失
- 解决方法:使用
report_untestable_faults分析约束合理性
- 解决方法:使用
约束冲突:多个约束条件产生矛盾
- 解决方法:采用
-view参数管理不同场景下的约束集
- 解决方法:采用
时序违例:约束值与实际电路行为不符
- 解决方法:配合
set_atpg_timing进行时序验证
- 解决方法:配合
6. 自动化检查流程建设
为避免类似问题重复发生,我们建立了三级检查机制:
预处理检查(DFT插入阶段):
proc check_static_signals {} { set required_signals [list "test_mode" "scan_enable" ...] foreach sig $required_signals { if {![dft_signal_exists $sig]} { echo "ERROR: Missing DFT signal $sig" } } }ATPG前检查:
verify_atpg_setup -static_signals后仿真验证:
# 使用VCS等工具进行门级仿真 def check_reset_states(): for pattern in all_patterns: if detect_x_state('sync_set_reset_disable'): report_error("Reset signal has X state")
这套机制将类似问题的发现时间从ATPG阶段提前到了DFT插入阶段,平均节省了2-3天的调试时间。