ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Scan DFT与ATPG全流程实战:从网表到测试向量

Scan DFT与ATPG全流程实战:从网表到测试向量 1. 从网表到测试向量Scan DFT与ATPG全流程拆解数字芯片设计做到后端最怕听到的一句话就是“芯片回来了测试覆盖率不够这批片子可能要报废”。我做了十多年DFTDesign for Testability可测性设计从早期的TetraMAX到现在的Cadence Modus踩过的坑比流过的片还多。今天不聊虚的就围绕一个核心问题展开你手里那份综合后的网表到底是怎么一步步变成ATE机台上能跑的测试向量的这篇文章面向的是刚接触DFT的IC设计工程师、后端实现工程师以及需要理解测试流程的验证人员。我会把Scan DFT的ATPG全流程拆开揉碎从网表准备、Scan链插入、ATPG Pattern生成一直到Cadence Modus的实战操作全部用从业者的视角讲清楚。你不需要有深厚的DFT背景只要懂基本的数字电路和Verilog就能跟着走一遍。先给结论ATPG不是一键生成的黑盒它的质量取决于网表质量、Scan架构设计、约束文件准确性三个核心要素。任何一个环节出问题你拿到的要么是覆盖率上不去的Pattern要么是仿真能过但硅片上失效的“假向量”。下面我按实际项目流程一步步拆解。2. 网表准备与Scan插入ATPG的地基2.1 综合后网表到底要检查什么很多人拿到综合工具吐出来的网表就直接往ATPG工具里灌这是大忌。我见过太多案例ATPG跑了几个小时覆盖率卡在60%不动最后发现是网表里有一堆assign语句或者tran门没被正确处理。综合后的网表在交给DFT工具之前必须做几项关键检查。第一确认没有Latch和异步逻辑残留。Latch在Scan模式下会引入时序冒险ATPG工具很难控制它的透明性。如果综合脚本里没有加set_dont_use把Latch禁掉你需要在网表里手动排查。第二检查三态门和双向端口。三态总线在Scan模式下必须被强制使能到确定方向否则ATPG会产生X态传播导致大量Pattern失效。第三确认时钟和复位信号的可控性。Scan模式下的时钟必须来自ATE可以直接驱动的引脚不能是内部PLL分频出来的。注意综合时建议加上-no_scan选项先出一版网表做功能验证等DFT插入完成后再用带Scan的网表做最终签核。这样能避免Scan链插入后功能仿真对不上的尴尬。关于网表格式很多项目会用OrCAD导出网表做板级验证但芯片内部的DFT网表通常是Verilog或DDC格式。OrCAD导出的网表偏板级连接关系和芯片内部ATPG用的门级网表不是一回事别搞混了。芯片DFT用的网表必须是综合工具输出的、包含标准单元映射的门级网表。2.2 Scan链插入的架构选择Scan链插入不是简单地把所有触发器串起来。你需要根据设计规模、时钟域数量、功耗预算来选择合适的Scan架构。常见的方案有三种单链全扫描所有触发器串成一条长链。优点是控制简单缺点是测试时间极长一个百万门级设计可能要有几十万周期的扫描移位。多链并行扫描把触发器分成N条链ATE的N个通道同时移位。这是最常用的方案链数通常选8到64条取决于ATE的通道资源和引脚预算。分段扫描与压缩扫描在链中间加锁存器做分段或者用XOR压缩网络减少测试数据量。Cadence Modus支持片上压缩On-Chip Compression能把测试数据量压缩10到50倍。选择链数的经验公式是链数 ≈ 总触发器数 / 目标移位周期数。假设你有50万个触发器希望移位阶段不超过5000个周期那链数至少是100条。但实际还要考虑ATE通道数、功耗和布线拥塞。我一般建议先按32条链做一版看覆盖率和测试时间是否达标再决定要不要加压缩。Scan链插入用Cadence Modus的命令流程大致如下# 读取综合后网表 read_netlist -format verilog ./syn/netlist.v # 读取标准单元库 read_library -liberty ./lib/tsmc28_ss.lib # 设置Scan配置 set_scan_configuration -chain_count 32 -clock_mixing mix_clocks # 指定Scan使能、Scan输入输出端口 set_scan_signal -scan_enable scan_en -scan_in scan_in -scan_out scan_out # 执行Scan插入 insert_scan # 输出带Scan的网表 write_netlist -format verilog ./dft/netlist_scan.v这段脚本里-clock_mixing mix_clocks表示允许不同时钟域的触发器混在同一条链里。如果你的设计有多个异步时钟域建议用-clock_mixing no_mix让每个时钟域独立成链避免跨时钟域的Hold问题。2.3 网表质量对ATPG覆盖率的直接影响我做过一个对比实验同一版设计一版网表里保留了综合工具插入的时钟门控单元另一版把时钟门控旁路掉。结果前者的ATPG覆盖率只有87%后者达到了96%。原因在于时钟门控单元在Scan模式下如果控制信号不可控会导致大量触发器无法被正确加载和捕获。所以网表准备阶段一定要做DFT规则检查DRC。Cadence Modus的check_dft_rules命令能报出所有违反可测性规则的地方包括DRC违规类型典型原因修复方法不可控时钟时钟来自内部PLL或分频器在Scan模式下用MUX切换到外部时钟不可控复位复位来自内部逻辑增加Scan模式下的复位旁路X态传播三态总线、未初始化存储器增加总线保持器或强制使能组合反馈环组合逻辑输出直接反馈到输入插入测试点打断反馈触发器时钟不同步同一链上触发器时钟相位不同调整链分配或增加Lockup Latch实操心得DRC检查一定要在ATPG之前跑不要等Pattern生成失败再回头查。我习惯在Scan插入后立刻跑一次DRC把违规数量降到个位数再进入ATPG阶段。每修复一个DRC违规覆盖率通常能提升0.5%到2%。3. ATPG核心流程与Cadence Modus实战3.1 ATPG到底在做什么从故障模型说起ATPGAutomatic Test Pattern Generation的本质是给定一个电路网表和一组故障模型自动生成一组输入激励使得每个故障都能在输出端被观测到。最常用的故障模型是Stuck-at故障即假设某条信号线被永久固定为0或1。为什么用Stuck-at模型因为它简单、覆盖率高、计算效率好。虽然实际硅片上的缺陷可能是桥接、开路、延迟故障但Stuck-at模型能覆盖其中大部分。对于先进工艺节点还需要补充Transition Delay故障和Cell-Aware故障模型。ATPG生成Pattern的过程分两步激活故障和传播故障。激活是指给故障点施加相反的值比如Stuck-at-0故障就给它施加1传播是指把故障点的错误值通过敏感路径传到某个可观测的输出端。如果这两步都成功就生成了一个有效的测试向量。Cadence Modus的ATPG引擎支持多种算法包括D算法、PODEM和FAN算法。对于大规模设计Modus会自动选择最优算法组合。你不需要手动指定算法但需要理解ATPG的搜索空间是指数级的所以约束越精确生成越快覆盖率越高。3.2 Modus ATPG实战从约束到Pattern下面是一个完整的Modus ATPG流程示例。假设你已经完成了Scan插入手里有netlist_scan.v和对应的标准单元库。第一步建立ATPG环境# 启动Modus modus -batch -file atpg_flow.tcl # atpg_flow.tcl内容 read_netlist -format verilog ./dft/netlist_scan.v read_library -liberty ./lib/tsmc28_ss.lib read_scan_configuration ./dft/scan_config.json第二步设置ATPG约束约束文件是ATPG的灵魂。你需要告诉工具哪些信号在测试模式下是可控的、哪些是不可控的、时钟频率是多少。# 设置测试模式 set_atpg_mode -scan # 指定时钟周期 set_atpg_clock -period 100 -waveform {0 50} clk # 指定Scan使能信号在移位和捕获阶段的值 set_atpg_signal scan_en -shift 1 -capture 0 # 指定复位信号在测试模式下无效 set_atpg_signal rst_n -shift 1 -capture 1 # 设置不可控信号 set_atpg_signal -constant 0 test_mode # 设置输出掩码忽略某些无关输出 set_atpg_mask -output [get_ports {debug_out[*]}]这里-shift 1 -capture 0的意思是Scan使能信号在移位阶段为1扫描链处于移位模式在捕获阶段为0扫描链处于功能模式。这个设置必须和Scan插入时的定义完全一致否则Pattern会全部失效。第三步运行ATPG# 设置故障模型 set_fault_model -stuck_at # 设置覆盖率目标 set_atpg_effort -high # 运行ATPG run_atpg -output ./patterns/stuck_at.pat # 生成覆盖率报告 report_atpg_coverage -detail ./reports/coverage.rpt-higheffort会让工具花更多时间做搜索通常能提升1%到3%的覆盖率。如果时间紧张可以用-medium先跑一版看趋势。第四步分析覆盖率报告覆盖率报告会列出所有未检测故障Undetected Faults和不可测故障Untestable Faults。未检测故障是可以通过优化约束或增加测试点来覆盖的不可测故障是电路结构决定的比如冗余逻辑或不可观测的内部节点。故障类别含义处理方式Detected已检测无需处理Undetected未检测优化约束、增加测试点Untestable不可测确认冗余逻辑可接受ATPG Untestable工具判定不可测检查约束是否过紧Not Detected搜索超时增加effort或手动指定实操心得覆盖率卡在95%左右时不要盲目加effort。先看未检测故障的分布如果集中在某几个模块很可能是那些模块的时钟或复位约束有问题。我遇到过一个大设计覆盖率卡在93%最后发现是一个SPI模块的时钟在Scan模式下被门控了修复后直接跳到97%。3.3 测试向量格式与ATE对接ATPG生成的Pattern需要转换成ATE能识别的格式。常见的格式有STIL、WGL、VCD和EVCD。Cadence Modus支持直接输出STIL格式这是大多数ATE平台的标准输入。# 输出STIL格式 write_pattern -format stil -output ./patterns/stuck_at.stil # 输出Verilog testbench用于仿真验证 write_pattern -format verilog -output ./patterns/stuck_at_tb.vSTIL文件里包含了时序信息、信号定义和每个周期的激励数据。ATE工程师会根据STIL文件生成机台程序。这里有一个关键点Pattern的时序必须和ATE的实际时序对齐。如果ATPG用的时钟周期是100nsATE机台也要配置成100ns否则会出现建立/保持时间违规。我通常会在Pattern生成后做一次门级仿真验证用生成的Verilog testbench跑一遍确认Pattern在仿真中能检测到注入的故障。这一步能抓出90%以上的Pattern质量问题。4. 常见问题与排查技巧实录4.1 覆盖率上不去的五大原因原因一时钟约束错误。这是最常见的。Scan模式下时钟必须来自ATE可控的引脚如果时钟在捕获阶段被门控或分频大量触发器无法捕获故障值。排查方法是检查覆盖率报告里未检测故障是否集中在某个时钟域。原因二复位信号未正确设置。复位在Shift阶段应该无效保持功能值在Capture阶段也应该无效。如果复位在Capture阶段被激活所有触发器会被强制复位故障无法传播。原因三X态传播。未初始化的存储器、三态总线、模拟模块的输出都会产生X态。X态会污染扫描链导致整条链上的Pattern失效。解决方法是在Scan模式下用MUX隔离这些模块或者用set_atpg_mask屏蔽相关输出。原因四组合反馈环。组合逻辑的输出直接反馈到输入形成振荡。ATPG工具无法确定稳定值会放弃这些节点的故障。需要在反馈环上插入测试点或者用set_disable断开反馈。原因五约束过紧。有些工程师为了减少Pattern数量设置了过多的set_atpg_signal -constant导致工具没有足够的自由度去激活和传播故障。约束要精确但不要过度。4.2 Pattern仿真失败的排查思路Pattern生成后仿真失败通常有三种表现仿真挂死、输出不匹配、X态传播。排查顺序如下检查仿真挂死看是否有时钟在仿真中一直翻转但没有复位。Scan模式下的时钟应该只在Shift和Capture阶段有脉冲其他时间保持静止。检查输出不匹配对比ATPG工具的预期输出和仿真实际输出找到第一个不匹配的周期回溯该周期的激励和电路状态。检查X态传播在仿真波形里搜索X态找到X态的源头。通常是某个存储器或模拟模块没有被正确隔离。避坑技巧我习惯在ATPG之前先跑一次零故障仿真即不注入任何故障只验证Scan链的移位和捕获功能是否正常。这一步能提前发现Scan链的Hold违规、时钟域交叉等问题比Pattern生成后再排查效率高得多。4.3 测试功耗与Pattern排序Scan测试的一个副作用是功耗。在Shift阶段所有触发器同时翻转动态功耗可能达到功能模式的2到3倍。如果功耗超过封装和供电能力会导致测试失效甚至芯片损坏。解决方法有两个降低Shift频率和Pattern排序。降低Shift频率最简单但会增加测试时间。Pattern排序是把翻转率高的Pattern和翻转率低的Pattern交替排列平滑功耗曲线。Cadence Modus支持-low_power选项会自动做Pattern排序和填充。# 低功耗ATPG set_atpg_effort -low_power run_atpg -output ./patterns/stuck_at_lp.pat低功耗模式通常会牺牲1%到2%的覆盖率但能把峰值功耗降低30%以上。对于大规模设计这个 trade-off 是值得的。5. 从RTL到硅片的DFT签核清单5.1 签核前必须确认的十件事DFT流程走到最后签核阶段是最容易出问题的。我整理了一份签核清单每次流片前逐项确认Scan链数量与ATE通道数匹配没有悬空链所有Scan链的Shift和Capture时序都满足建立/保持时间DRC违规数量为零或所有剩余违规都有合理解释Stuck-at覆盖率达标通常要求98%以上Transition Delay覆盖率达标通常要求90%以上Pattern数量在ATE存储容量范围内测试功耗在供电能力范围内Pattern仿真全部通过无X态传播STIL文件与ATE机台配置一致有完整的DFT文档包括Scan架构图、引脚定义、测试流程这份清单看起来简单但每一条背后都可能藏着几天甚至几周的调试工作。我见过一个项目因为Scan链的Lockup Latch漏了一个导致整条链的Pattern全部失效最后不得不改版流片。5.2 先进工艺节点的额外考虑在28nm以下节点Cell-Aware故障模型变得越来越重要。传统Stuck-at模型假设故障发生在信号线上但先进工艺的缺陷更多发生在标准单元内部比如晶体管级的桥接或开路。Cell-Aware ATPG会针对每个标准单元的内部结构生成测试向量覆盖率能提升2%到5%。Cadence Modus支持Cell-Aware流程需要额外的Cell-Aware库和故障模型文件。流程和Stuck-at类似但运行时间会增加3到5倍。对于汽车电子、医疗电子等高可靠性应用Cell-Aware是必须的。另一个考虑是测试压缩。先进工艺的芯片规模越来越大Pattern数量可能达到几十万条ATE存储容量和测试时间都吃不消。片上压缩网络能把Pattern数量压缩10到50倍但会增加芯片面积和设计复杂度。Cadence Modus的压缩方案支持XOR压缩和EDTEmbedded Deterministic Test压缩率取决于扫描链数量和压缩网络结构。我在实际项目中的体会是DFT不是后端的事而是贯穿整个设计流程的系统工程。RTL阶段就要考虑可测性综合阶段要保留DFT友好结构后端阶段要保证时序和功耗。ATPG只是最后一步的“收割”前面的地基没打好后面怎么调都事倍功半。最后分享一个小技巧每次ATPG跑完后把覆盖率报告和Pattern数量存档和上一版做对比。如果覆盖率突然下降或Pattern数量暴增通常是网表或约束出了问题。这个习惯帮我抓出了好几次综合脚本的意外改动。
返回列表