☰
Scan DFT与ATPG全流程实战:从网表到测试向量
2026/10/7 12:02:22 网站建设 项目流程

1. 从网表到测试向量:Scan DFT与ATPG全流程拆解

数字芯片设计做到后端,最怕听到的一句话就是“芯片回来了,测试覆盖率不够,这批片子可能要报废”。我做了十多年DFT(Design 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到底在做什么:从故障模型说起

ATPG(Automatic 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.v

STIL文件里包含了时序信息、信号定义和每个周期的激励数据。ATE工程师会根据STIL文件生成机台程序。这里有一个关键点:Pattern的时序必须和ATE的实际时序对齐。如果ATPG用的时钟周期是100ns,ATE机台也要配置成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态传播。排查顺序如下:

  1. 检查仿真挂死:看是否有时钟在仿真中一直翻转但没有复位。Scan模式下的时钟应该只在Shift和Capture阶段有脉冲,其他时间保持静止。
  2. 检查输出不匹配:对比ATPG工具的预期输出和仿真实际输出,找到第一个不匹配的周期,回溯该周期的激励和电路状态。
  3. 检查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压缩和EDT(Embedded Deterministic Test),压缩率取决于扫描链数量和压缩网络结构。

我在实际项目中的体会是:DFT不是后端的事,而是贯穿整个设计流程的系统工程。RTL阶段就要考虑可测性,综合阶段要保留DFT友好结构,后端阶段要保证时序和功耗。ATPG只是最后一步的“收割”,前面的地基没打好,后面怎么调都事倍功半。

最后分享一个小技巧:每次ATPG跑完后,把覆盖率报告和Pattern数量存档,和上一版做对比。如果覆盖率突然下降或Pattern数量暴增,通常是网表或约束出了问题。这个习惯帮我抓出了好几次综合脚本的意外改动。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询