1. DFT库配置与Black Box处理
刚接触Tessent ATPG时,最让人头疼的就是DFT库的配置问题。这里说的DFT库和仿真用的simulation lib可不是一回事。仿真库主要关注功能模拟,而DFT库则专门用于测试相关操作,比如扫描链控制和故障建模。我刚开始做项目时就犯过错误,直接用仿真库跑ATPG,结果DRC检查报了一堆莫名其妙的问题。
库转换实战技巧:
- 使用Mentor的libcomp工具转换时,记得加
-dft参数 - 转换后一定要检查这几个关键属性是否存在:
scan_enable test_mode async_set/reset - 建议保留原始.lib文件作为备份,我遇到过转换后时序信息丢失的情况
Black Box的处理是另一个容易踩坑的地方。上周刚帮同事排查一个问题,他的模块明明设置了black box,但ATPG还是尝试去分析内部结构。后来发现是black box定义语句放错了位置,应该在read_verilog之后立即声明。正确的操作顺序应该是:
read_verilog scan_inserted.v add_black_boxes -module analog_core add_black_boxes -instances /PLL_inst -pin CLKOUT Z特别注意那个Z值,它表示将black box输出设为高阻态。在实际项目中,我们团队发现有些模拟模块输出设为X会导致覆盖率计算异常,改用Z后就正常了。
2. Test Procedure时序定义详解
第一次看到Test Procedure文件时,我完全被那些timeplate搞晕了。后来在ATE工程师的帮助下才明白,这其实就是定义测试机台如何打信号的"乐谱"。最近做的一个汽车芯片项目,就因为timeplate定义不当导致测试时间增加了30%,后来优化后才达标。
关键参数设置经验:
- 时钟周期不要设得太紧,建议比功能时序宽松10-15%
force_pi和measure_po的时间点要避开时钟边沿- 多时钟域设计一定要为每个时钟单独定义timeplate
这是我调优过的一个真实案例配置:
timeplate tp_main = force_pi 2; measure_po 22; Clk 10 5; # 上升沿在10ns,脉宽5ns period 30; # 30ns周期 end对于包含EDT压缩的设计,要特别注意shift和capture阶段的时序差异。有个项目我们忘了在capture阶段延长测量窗口,导致小delay缺陷漏检,后来通过调整measure_po的位置才解决。
3. Dofile中的扫描链配置技巧
扫描链配置是ATPG的基础,但也是最容易出错的部分。去年我们有个28nm项目,因为scan chain定义顺序反了,导致生成的pattern全部无效,白白浪费两周时间。
扫描链声明要点:
- 确保scan_in和scan_out的端口名与网表完全一致
- 多电压域设计要明确指定level shifter位置
- 使用
-clock_mixing参数处理跨时钟域链
这是我常用的一个安全模板:
proc tessent_scan_setup {} { add_scan_groups grp1 -test_procedure scan_proc.tproc add_scan_chains chain1 grp1 { /top/scan_in[0] } { /top/scan_out[0] } -clock_mixing sync add_clocks 0 /clk_core add_clocks 1 /clk_io }遇到复杂设计时,建议先用report_scan_chains命令验证链结构。我们团队开发了个自动化检查脚本,可以快速比对网表扫描链和Dofile定义的差异。
4. DRC检查规则深度解析
DRC检查阶段就像ATPG的"体检报告",但那些错误代码常常让人摸不着头脑。记得有次遇到C1-237错误,花了三天才发现是clock gating控制信号没正确定义。
高频DRC问题处理经验:
- C类错误:80%与时钟定义相关,检查
add_clocks参数 - S类错误:通常是扫描链断裂,用
debug_scan_chain定位 - E类错误:多数因为异步复位信号未约束
建议首次运行时打开详细日志:
check_design_rules -verbose 3 -report_all_violations对于RAM的A类规则,需要特别注意写使能和地址线的约束。我们有个项目因为漏加add_input_constraints,导致RAM故障覆盖率只有60%,补上约束后才提升到98%。
5. Fault模型与覆盖率优化
刚开始用ATPG时,我总以为覆盖率只和pattern数量有关。后来才发现fault模型的设置才是关键。最近一个7nm项目,通过调整fault采样策略,用20%的pattern就达到了95%的覆盖率。
覆盖率提升技巧:
- 小规模设计:用
add_faults -all全量分析 - 大规模芯片:先做10%采样(
set_fault_sampling 10) - 关键模块:手动添加fault site
add_faults /cpu/core/alu* -instance -stuck 1 add_nofaults /memory_ctrl -module对于时序敏感路径,建议开启transition fault模式:
set_atpg -fault_type transition set_atpg -capture_cycles 2我们团队总结出一个经验公式:当stuck-at覆盖率超过98%后,每提升0.1%需要的pattern数量会指数增长。这时候就要权衡测试时间和质量要求了。
6. Pattern生成与格式转换
生成pattern只是开始,真正的挑战在于如何让ATE机台正确识别。去年有个客户抱怨我们的STIL文件无法加载,最后发现是header信息格式不兼容。
多格式输出策略:
- 验证环境:用Verilog格式做门级仿真
- 测试机台:STIL是最通用的选择
- 长期存储:PATDB格式最节省空间
这是我推荐的保存命令组合:
write_patterns chip.stil -format stil -replace write_patterns chip.v -format verilog -replace write_flat_model chip.patdb -replace对于含EDT的设计,要特别注意压缩比设置。我们有个项目设了100x压缩,结果ATE无法处理那么高的数据速率,后来降到20x才稳定。建议首次生成时用-quick参数试跑,确认无误再完整生成。