别让复位信号毁了你的ATPG!记一次AU故障占比45%的排查与set_static_dft_signal修复
ATPG调试实战如何通过静态信号约束将AU故障降低90%最近在完成一个28nm项目的ATPG流程时遇到了一个令人头疼的问题——生成的pattern中AUATPG 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天的调试时间。