
做DFT或者后端集成的工程师十有八九都遇到过这样的情况仿真环境里跑着跑着tester那边突然报一堆pattern fail或者良率分析时发现某类测试向量覆盖率低得离谱。翻开ATPG的log一看满屏的Basic Scan、Clock PO、RAM Sequential一时半会儿还真说不清这些Pattern类型到底各自负责什么什么时候该用哪种用错了又会导致什么后果。这篇文章就把ATPG Pattern类型这件事彻底讲透。重点不是罗列概念而是结合我实际跑过的项目拆解Basic Scan、Clock PO、RAM Sequential这三种主流Pattern类型的设计意图、配置方法、使用场景和常见坑。如果你是刚接触DFT的芯片工程师或者正在为某个测试pattern的覆盖率发愁这篇文章应该能帮你省下不少瞎折腾的时间。1. 内容整体设计与思路拆解1.1 ATPG Pattern到底在做什么在深入讨论Pattern类型之前有必要先把ATPG的本质说清楚。ATPG全称Automatic Test Pattern Generation中文叫自动测试向量生成。它的核心任务简单粗暴针对芯片制造过程中可能出现的物理缺陷比如金属线断裂、晶体管短路、栅氧化层击穿等生成一组输入激励让缺陷能通过芯片输出端的逻辑值变化被“暴露”出来。打个不恰当的比方ATPG就是给芯片做“体检”。体检项目分为很多种量血压、测心率、拍片子每种检查各有侧重。ATPG Pattern类型也一样Basic Scan负责检查大部分标准逻辑单元Clock PO专门盯着时钟网络上的逻辑RAM Sequential则用于处理那些无法用常规扫描链覆盖的存储器相关逻辑。只有把这些不同类型的Pattern组合起来芯片的“体检报告”才算完整。在实际工程中一个完整的ATPG流程通常包含这样几个环节先做scan chain的插入和验证确保每一级扫描触发器都能正常移位然后做test mode下的时序收敛STA最后才是在Tessent或者Modus这类工具里做pattern generation。Pattern类型的选择和配置就发生在最后一个环节。1.2 三种Pattern类型的本质区别很多初学者最容易犯的错误是把这三种Pattern当成三种可以随意替换的“口味”。实际上它们之间的差异是整个测试架构层面的理解了这个差异后续所有配置才会变得顺理成章。Basic Scan是最基础、也最通用的Pattern类型。它的工作原理是把芯片切换到测试模式通过扫描链将测试激励逐位移入扫描触发器然后产生一个或几个capture时钟脉冲让组合逻辑的响应被捕获到触发器里最后再逐位移出与预期值比对。这种模式覆盖的是标准单元库里的组合逻辑和时序单元内部的故障覆盖面最广一般在整体测试向量中占比超过70%。Clock PO则是专门应对时钟网络上的故障。逻辑综合之后时钟树上的buffer和inverter成千上万它们不在扫描链上普通Basic Scan模式几乎测不到。但这些buffer一旦失效整条时钟路径就废了芯片直接无法工作。Clock PO模式的做法是将时钟网络上的某些节点配置为伪主输出Pseudo Primary Output通过观察这些节点的逻辑值来判断时钟树上的故障是否存在。RAM Sequential模式解决的是另一类问题。现在SoC里动不动就集成几十上百个SRAM这些memory单元内部的标准逻辑比如地址译码器、灵敏放大器、写驱动没法直接放进扫描链。RAM Sequential的思路是利用memory周围的逻辑比如BIST控制器、wrapper register生成写读序列使memory内部节点的故障能够被间接观察到。这三种Pattern类型的选用本质上取决于芯片的具体设计结构——扫描链覆盖率、时钟树复杂度、memory数量与类型。一个合理的测试方案往往需要三者协同工作而不是只盯着某一种。2. 核心细节解析与实操要点2.1 Basic Scan的配置与必要性Basic Scan看似简单但实际配置时有不少细节决定最终覆盖率的高低。首先是扫描链的平衡问题。在Tessent中通常用add_scan_group之类的命令将扫描触发器分配到不同的链上。链长不能相差太多否则短链对应的pattern加载时间被拉长tester效率下降链长也不宜过长否则每条链上串接的触发器过多移位过程中的功耗和串扰风险增加。其次是capture时钟的配置。Basic Scan核心的时序是Shift和Capture两个阶段。Shift阶段需要多个时钟脉冲把数据从scan_in逐步推入扫描链Capture阶段只需要一个或少数几个脉冲让组合逻辑的响应被捕获。这里的时钟配置必须与STA时的约束一致否则post-layout仿真很容易出现时序违例。在故障模型的选择上Basic Scan通常采用stuck-at fault模型和transition fault模型两种。stuck-at是静态故障检查节点是否永久固定在0或1transition是动态故障检查节点能否在规定时间内完成0到1或1到0的跳变。TSMC 28nm以上的工艺节点transition fault的覆盖率指标往往是signoff的硬性标准缺了它良率会很惨。2.2 Clock PO模式的适用场景与配置流程Clock PO模式的配置本质上是在做“可观测性”的补充。时钟树上的节点通常只有一条逻辑路径连接到扫描触发器一旦中间某个buffer故障故障信号无法传递到可观测点覆盖率自然就低。最典型的应用场景是时钟门控单元。现在的SoC设计为了降低功耗大量使用ICGIntegrated Clock Gating单元。这些单元的控制端与时钟使能信号相连如果控制逻辑存在故障最直接的后果是时钟无法关断或者无法开启可能导致功能异常或者功耗超标。ICG单元内部的故障通过Basic Scan很难测到因为时钟信号本身在功能模式下并不是一个可以被扫描链捕获的信号。配置Clock PO时需要在ATPG工具中指定add_clock_po或者类似的命令将相关的时钟端口或者时钟网络内节点设置为伪主输出。这样工具在生成pattern时会额外考虑这些节点的可观测性把对应的故障响应捕获到扫描链上。实际项目中我在一个28nm的MCU芯片上做过对比测试。未加Clock PO之前整个芯片的stuck-at覆盖率是97.8%加上Clock PO之后覆盖率提升到98.6%。看似只涨了不到1个百分点但在量产测试中这0.8个百分点可能意味着不少原本会被误杀的良品芯片被挽救回来。2.3 RAM Sequential的原理与配置方法RAM Sequential这个名字容易让人误解以为它只处理memory故障。实际上它真正处理的是memory周围逻辑的可测试性问题。现代SoC的memory通常都有自己的BISTBuilt-In Self-Test逻辑。BIST跑起来之后可以覆盖memory阵列内部的大部分故障比如位单元短路、数据线开路、地址译码器部分失效等。但BIST覆盖不了的地方恰恰是memory接口处的握手逻辑、写使能产生逻辑、读数据选通逻辑——这些逻辑往往挂在系统总线上与扫描链的连接并不直接。RAM Sequential Pattern的生成流程大致是这样第一步在ATPG工具中定义memory的模型。Tessent通过memory model描述SRAM的端口行为包括地址位宽、数据位宽、读写时序等。第二步设置测试模式。工具会利用memory外围的控制逻辑自动产生多个写读周期。这个过程通常是在capture阶段动态完成的所以pattern长度比Basic Scan长得多。第三步配置RAM Sequential的扫描方式。常见的选择有write_after_read、read_after_write等具体选择取决于memory的类型和功能需求。值得注意的是RAM Sequential Pattern虽然能提升覆盖率但代价是测试时间的成倍增加。一条RAM Sequential Pattern可能包含几百甚至上千个capture周期而一条Basic Scan Pattern通常只有几个capture周期。所以在实际量产测试程序中RAM Sequential Pattern不会做大量运行而是选择性覆盖那些BIST覆盖不到的边界逻辑。2.4 工具选型解析Tessent与Modus的对比目前主流的ATPG工具主要是Siemens EDA的Tessent和Synopsys的Modus以及更早的TetraMAX。两个工具都支持上述三种Pattern类型但在细节上各有侧重。Tessent在memory测试和diagnosis方面积累较深Tessent MemoryBIST与Tessent Shell的配合非常成熟RAM Sequential Pattern的生成效率和覆盖率优化比较突出。这主要是因为Tessent的memory model库更新及时对先进工艺节点的SRAM特性支持更好。Modus的优势在于综合优化能力。它在pattern count控制上做得比较出色同样的覆盖率目标Modus生成的pattern数量往往比Tessent少10%~20%。对于测试时间敏感的消费类芯片这是一个不小的优势。但在Clock PO的设置上两个工具的语法差异较大。Tessent的典型配置是add_clock_po -clock ICG_CLK_UBUS set_system_mode analysisModusTetraMAX时代的命令则更偏重dc_shell风格的约束set_dft_signal -view existing_dft -type ScanClock -port clk -active_state 1 set_clock_po [get_pins u_icg_clock_gate/CLK]从我个人的使用经验来看Tessent对Clock PO的自动提取能力更强一些。它根据时钟树的结构能自动推荐值得设为PO的节点省去大量手工分析工作。Modus则需要设计者更主动地去识别关键节点。3. 实操过程与核心环节实现3.1 基于Tessent的Pattern配置全流程以Tessent 2022版本为例分享一个相对完整的Pattern配置流程覆盖Basic Scan、Clock PO和RAM Sequential三种类型。假设我们的设计是一个带有32KB SRAM、若干ICG时钟门控单元的SoC采用SMIC 28nm工艺。RTL综合后网表已经具备扫描链现在需要在Tessent中完成pattern生成。第一步加载网表和库文件read_cell_library /libs/smic28_std_cell.db read_verilog /netlist/top_scan.v read_verilog /netlist/top_sram_model.v current_design top link_design这里要注意memory模型文件必须在链接之前加载否则Tessent无法识别SRAM内部结构后续RAM Sequential的配置会直接报错。第二步加载扫描链配置set_dft_signal -view existing_dft -type ScanClock -port clk -active_state 1 set_dft_signal -view existing_dft -type ScanEnable -port scan_en -active_state 1 set_dft_signal -view existing_dft -type ScanDataIn -port scan_in -active_state 1 set_dft_signal -view existing_dft -type ScanDataOut -port scan_out -active_state 1 set_scan_group -chain_count 16如果扫描链在综合阶段已经插入完毕这里只需要声明端口角色即可。工具会自动把这些端口与netlist中的scan chain对应起来。这里有个小技巧——如果链数设置与后端实际物理布局不一致TSMC的DFT flow会报warning建议在跑ATPG前用check_dft命令核查一遍。第三步配置Clock PO。这一步是提升覆盖率的关键尤其是在有大量ICG单元的设计中set_dft_signal -view spec -type ScanClock -port clk -active_state 1 add_clock_po -clock clk -related_pin u_clock_network/clk_gate_inst/CLK add_clock_po -clock clk -related_pin u_clock_network/clk_gate_mem/CLK add_clock_po -clock clk -related_pin u_clock_network/clk_div_2_out这里列出的每个related_pin都是一个需要观测的时钟网络节点。在Tessent中add_clock_po支持通配符但如果网表节点命名规律不强建议用report_clock_network先确认实际节点名再配置毕竟clock tree上的buffer数量可能数以千计。第四步配置RAM Sequential。这里需要让Tessent识别被测设计中包含的SRAM并将它们与memory model对应起来set_memory_model -name sram_32k -type ram \ -addr_width 13 -data_width 8 -read_write_mode rw add_memory -instance u_sram_inst_0 -model sram_32k add_memory -instance u_sram_inst_1 -model sram_32k对于带ECC的SRAM还需要额外定义校验位相关的端口。没有正确配置ECC通道的话RAM Sequential pattern照样能生成但覆盖率会明显偏低因为ECC校验逻辑上的故障没有被激活。第五步配置测试模式并生成patternset_system_mode analysis add_faults -class stuck add_faults -class transition set_pattern_type basic_scan run_atpg要让Clock PO和RAM Sequential生效还需要分别指定pattern类型并追加生成set_pattern_type clock_po run_atpg set_pattern_type ram_sequential run_atpgTessent对这三类pattern默认会分开管理最终在top_wrappers目录下生成多个.wgl或.stil文件。量产测试程序通常需要把这三类pattern按一定顺序合并到同一个测试程序里这个顺序一般是Basic Scan跑得快、发现率最高→ Clock PO覆盖时钟树→ RAM Sequential覆盖memory边界逻辑。3.2 覆盖率数据与testsets组合的平衡Pattern类型配置齐全后最直接的产出就是覆盖率报告。一份典型的report大概长这样Pattern类型故障数覆盖故障数覆盖率Pattern数Basic Scanstuck-at1,234,5671,214,59098.4%458Basic Scantransition1,456,7891,400,21896.1%612Clock PO56,78955,02196.9%89RAM Sequential23,45621,99893.8%37从这个表中能看出一个规律Basic Scan的故障基数最大覆盖率也最高Clock PO和RAM Sequential的故障数相对较少但覆盖率通常做不到Basic Scan那么高。原因很简单——这两类逻辑的可控制性和可观测性本来就较弱能够生成的有效测试向量有限。在实际项目里我通常建议把覆盖率目标拆解成三个阈值stuck-at整体覆盖率98%、transition整体覆盖率95%、RAM相关逻辑含BIST和接口覆盖率90%。如果低于这个水平量产测试的DPPMDefective Parts Per Million压力会非常大。3.3 三种Pattern类型的对比分析为了照顾刚入门的工程师这里做一个更直观的对比维度Basic ScanClock PORAM Sequential核心目标组合逻辑与触发器故障时钟网络与门控单元故障Memory周边逻辑与接口故障故障模型stuck-at, transition, path delay等stuck-at为主stuck-at, transitionPattern长度短数十个周期中等长数百个周期覆盖率贡献最大通常95%较小但不可替代针对性强配置复杂度低中高典型应用所有数字芯片低频时钟门控设计、多时钟域设计SoC中SRAM数量庞大时有一个认识误区需要特别澄清并不是所有设计都强制要求三种Pattern全部使用。比如一个纯组合逻辑模块或者极少数触发器的设计可能根本不需要RAM Sequential而没有ICG单元的设计Clock PO的作用也会大打折扣。最合理的策略是结合design review的结果来做判断而不是机械地套模板。3.4 不同设计场景下的Pattern选型建议根据设计类型的不同Pattern选型策略也有所差异对于MCU和AP类SoCSRAM数量多且分布广泛RAM Sequential是不可或缺的。这类芯片通常还会有多个时钟域和大量ICG单元Clock PO也应该加入。整体覆盖率目标建议定高一些毕竟消费类电子对成本和良率都非常敏感。对于SerDes、PCIE等高速接口类芯片模拟电路占主导数字逻辑相对集中。此时Basic Scan作为主力Clock PO用于覆盖接口PCS层的时钟逻辑RAM Sequential只在有配置寄存器堆时考虑。对于物联网SoC这类对功耗极其敏感的设计ICG单元肯定会大量使用Clock PO的价值就非常突出。这种芯片的测试时间预算通常紧张RAM Sequential pattern不宜过多精挑细选覆盖关键边界即可。4. 常见问题与排查技巧实录4.1 Clock PO配置后覆盖率不升反降这个问题我在多个项目里见过原因往往不是Clock PO本身的问题而是配置方式导致了fault list的重复或冲突。Tessent在生成Clock PO pattern时会对相关的时钟节点重新做一次故障注入。如果这个节点同时也存在于Basic Scan的fault list中工具会自动进行fault merging。但有些版本的工具对add_clock_po指定的节点不自动去重导致同一个故障被计算了两次报表上覆盖率虚高但真正落地的pattern并没有增加有效覆盖。排查方法是比对pattern文件中的故障ID。如果发现两个pattern中包含相同故障ID就需要在合并test set时用工具自带的compress_patterns功能做去重。此外某些ICG单元的CLK端在标准单元库中标记为don_t_touch或者dont_verify这时候手动添加related_pin会导致工具直接忽略该故障反而拉低了覆盖率。建议做法只添加那些在report_clock_network中显示为testable的节点手动指定前先跑一次自动提取看工具推荐了哪些节点再决定是否需要额外补充。4.2 RAM Sequential Pattern仿真通过但上机测试Fail这是最让人头疼的情况。仿真时pattern功能完全正常tester上一跑就fail而且fail的位置往往固定在某几个cycle。这类问题八成出在memory模型的时序精度上。Tessent等工具使用的memory model在生成pattern时做了一定的时序简化——比如默认SRAM的地址建立时间为0数据保持时间为0。但实际SRAM的时序约束并非如此tester上的信号到达时间如果略晚于model预期就会发生地址/数据变化时的竞争导致memory写入错误的数据。解决这个问题的方法是从memory compiler或者foundry拿到SRAM的.lib或.db文件在Tessent中执行read_lib命令将实际时序信息加载到memory model中然后重新生成pattern再用tmax或者vcs做一次包含时序信息的后仿真。这个仿真必须挂上tester的波形约束不能图省事只做functional simulation。另一个常见原因是test clock与memory clock的相位关系没处理好。如果memory的时钟与扫描时钟在测试模式下使用同一个时钟源但相位没有对齐就会出现读写时序偏差。建议在testbench中把memory clock和scan clock做同相位处理甚至在pattern生成前用set_memory_clock_phase显式指定相位偏移。4.3 Basic Scan pattern数量爆炸Basic Scan的pattern数量如果突然暴增通常不是工具出了问题而是设计中有太多不可控的逻辑没有做约束。最常见的原因在于异步复位信号的处理。比如有一组触发器使用异步复位复位信号在测试模式下没有固定为有效或无效状态工具为了覆盖这些触发器的复位路径不得不生成大量pattern来尝试不同的复位时序。处理方法是在test mode下将异步复位信号约束为固定值。在Tessent中通过以下命令实现set_dft_signal -view spec -type Reset -port rst_n -active_state 0 set_dft_signal -view spec -type Constant -port test_mode -active_state 1如果这些信号无法在顶层直接固定就需要在后端综合时处理好必要时在RTL中增加测试模式专用的mux逻辑。另一个导致pattern爆炸的原因是跨时钟域CDC路径未做约束。CDC路径上通常有同步器但同步器的输出在功能模式下确实可以正常工作测试模式下工具会认为每个cycle都可能发生亚稳态从而尝试覆盖所有可能。解决办法是定义set_false_path或者直接用set_clock_group -allow_async将跨时钟域的同步器路径排除在ATPG之外。4.4 不同工具生成的Pattern无法合并有些团队同时使用Tessent和Modus进行pattern生成最后在测试程序合并阶段发现两个工具生成的pattern文件格式不一致或者向量长度对不上。这个问题在工程实践中并不罕见。解决办法是统一输出格式建议无论用哪个工具生成pattern最终都转换为STIL文件格式。STILStandard Test Interface Language是业界通用的测试向量交换格式tester端无论是Advantest、Teradyne还是Chroma都能直接解析。转换时需要注意V94/V2000等不同版本STIL的兼容性。有些老款tester不支持STIL V2000的部分语法需要提前向测试厂确认。另外转换过程中不要做向量压缩否则会造成tester上pattern执行顺序错乱。4.5 覆盖率目标与测试时间冲突的取舍这是一个老生常谈但确实无解的矛盾。想要更高的覆盖率就必须跑更多的pattern测试时间线性增长成本随之上扬。而消费类芯片的量产测试每一秒的测试时间都直接对应着单片成本。我的建议是先找到覆盖率与测试时间的拐点。Tessent的report_coverage有一个类似于pattern coverage curve的功能可以看到随着pattern数量增加覆盖率增长的边际效用递减的曲线。通常pattern数量增长30%左右之后覆盖率可能只增加不到0.5个百分点这时候就可以用set_atpg -abort_limit或者set_pattern_type -compress on来做pattern压缩了。一个参考标准是stuck-at coverage保持在97%~98%之间transition coverage保持在94%~96%之间在这个区间内测试时间通常可控。继续追求更高的覆盖率代价往往过于昂贵。这里也顺带推荐一个Tessent从2021版本开始支持的增强功能incremental ATPG。它的思路是如果上一次跑ATPG时保留了所有中间结果那么本次只需要在新增的fault set上重新生成pattern即可。这样既保证了覆盖率又大幅缩短了迭代时间。5. 深入理解Pattern类型的底层逻辑5.1 从覆盖率公式看Pattern类型的边界聊了这么多具体的配置和命令还是回到最底层的覆盖率公式上来这样才能真正理解不同类型的Pattern为什么存在以及它们的极限在哪里。故障覆盖率定义为被检测到的故障数量除以所有可检测故障的数量。在ATPG工具生成pattern之前工具会先做一次fault collapsing把等价故障合并得到一套独立的故障列表。Basic Scan能覆盖的故障集合是所有存在于组合逻辑锥和扫描触发器输入输出端的故障。这个集合的大小由设计的逻辑深度和扫描单元比例决定。Clock PO能覆盖的故障集合是那些位于时钟网络分支即被设置为PO的节点上游的故障。这些故障原本没有通路到达扫描链但通过将时钟节点设为伪主输出故障信号可以从时钟路径上“抄小道”被捕获。RAM Sequential能覆盖的故障集合是memory控制逻辑内部以及memory接口上的故障。这些故障无法通过扫描链直接控制或观测只能借助memory本身的数据通路来间接传输——也就是靠”写进去再读出来“的方式把故障效应传播到可观测点。三个集合之间存在一定的交集比如一个故障既在扫描链通路上又位于memory接口逻辑上那它既可以被Basic Scan覆盖也可能被RAM Sequential覆盖。工具在合并时会去重这也是为什么实际生成的pattern数量总是小于单纯三种类型累加的数量。5.2 测试模式下的设计约束如何影响Pattern有效性ATPG工具生成pattern的前提是设计在测试模式下处于一个可预测、可控制的状态。这就意味着在进入测试模式时时钟、复位、异步信号等都必须被固定到合法电平上。很多初接触DFT的工程师会忽略一个事实测试模式不是一个简单的“高电平开关”它涉及一个完整的时序同步过程。比如在Basic Scan的shift阶段所有扫描触发器都处于移位状态此时输出引脚上出现的应该是扫描链上的中间数据而不是功能模式的输出。如果输出端口没有加合适的约束这些中间数据就会被当成功能输出进行比对导致大量误报。对于Clock PO测试模式下的时钟信号本身就被当作观测对象。如果test mode下时钟的翻转行为与预期不一致比如ICG单元的使能端被错误地固定为关闭状态那么生成的Clock PO pattern在仿真时会符合预期但实际tester上执行时由于时钟根本没有到达目标节点pattern直接失效。RAM Sequential对约束的敏感度更高。因为memory的读写行为需要精确的时序窗口测试模式下如果地址信号或者数据信号在capture前没有稳定下来memory根本不会写入预期的数据后续的read步骤自然就失效了。所以一份严谨的DFT约束文件通常是.sdc文件或者constraints.tcl是整个ATPG流程的基石。推荐在跑ATPG之前用report_constraints检查一遍dft_signals的完整性确保每个端口都有明确的信号类型定义。5.3 进阶方向从Pattern生成到诊断定位Pattern的价值不仅在于测试还在于诊断——当芯片在tester上fail时通过分析fail的pattern与fault dictionary可以反推缺陷在版图上的具体位置。这也是ATPG Pattern类型需要细分的原因之一不同类型的Pattern对应不同的物理缺陷分布。Basic Scan pattern fail通常意味着逻辑单元或者互连金属层存在缺陷可以直接映射到标准单元的pin或互连线上。Clock PO pattern fail往往与时钟树上的绕线资源、时钟buffer的驱动强度相关缺陷多半出在时钟网络的物理区域。RAM Sequential pattern fail经常指向memory单元本身的缺陷或者memory接口逻辑的物理损坏这类故障通过常规的逻辑诊断很难定位需要配合Memory BIST的repair分析。如果你是DFT工程师建议在signoff前留一部分冗余pattern专门用于量产后的诊断分析。不要为了覆盖率把pattern压缩得太狠否则一旦出现异常高fail率诊断信息不足问题定位会变得非常困难。结语与个人经验最后分享一点我自己的感受。ATPG Pattern类型的设计本质上是对“可测试性”的精细化管理。每种Pattern类型都像是一把专门对付某一类故障的钥匙只靠一把钥匙开不了所有的锁。真正成熟的DFT策略是在设计初期就做好规划明确哪些逻辑容易被扫描链覆盖、哪些逻辑需要额外的测试手段然后在ATPG阶段有的放矢地选择Pattern类型而不是盲目地把所有pattern都塞进去。以我接触过的项目为例凡是Pattern类型配置合理的芯片量产测试的良率普遍比那些只依赖Basic Scan的芯片高出1~3个百分点。这1~3个百分点在百万级出货量的消费类芯片上可能就是几百万的真金白银。所以深入了解这些Pattern类型的原理与用法不只是工程师的技术追求更是实实在在的成本控制手段。