ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

DFT高级问题实战:Scan Segment合并与ATPG覆盖率提升

DFT高级问题实战:Scan Segment合并与ATPG覆盖率提升 1. 项目概述为什么“DFT常见问题的解决方法下——高级问题”这个标题值得深挖DFT也就是可测试性设计Design for Testability不是芯片后端流程里一个可有可无的附加项而是现代SoC流片前最后一道真正意义上的“质量守门员”。我干这行十二年从0.18微米工艺的ASIC做到现在3nm节点的AI加速器见过太多项目卡在ATPG自动测试向量生成阶段明明RTL功能仿真全过综合时序也收敛了可一跑Tessent DFT或Synopsys DCXP就报一堆“Scan Segment无法合并”、“Capture clock domain conflict”、“UDFM violation”这类错误。它们不像语法错误那样一眼能定位而像电路板上一根虚焊的引脚——通电时偶尔工作量产时批量失效。标题里这个“下”恰恰说明它不是入门扫盲而是直指那些让资深DFT工程师凌晨三点还在改SDC约束、反复重跑ATPG的硬骨头。关键词里的Scan Segment是扫描链物理实现的核心单元ATPG是验证DFT结构是否真正可用的终极手段DCXP代表的是Synopsys这套工业级DFT流程的成熟度与复杂度而Tessent DFT则暗示着用户很可能正面对的是Cadence生态下的多核、多电压域、带嵌入式存储器的复杂SoC。这些词堆在一起指向的绝不是“怎么加扫描寄存器”这种基础操作而是“当扫描链跨时钟域、跨电源域、跨IP边界时如何让ATPG工具既生成高覆盖率向量又不把后端布局布线搞崩溃”这种真实战场上的问题。如果你正在为流片前最后一次DFT signoff焦头烂额或者刚接手一个遗留DFT架构需要紧急救火那么这篇内容就是你该打印出来贴在显示器边上的实操手册——它不讲原理推导只讲我亲手调通、客户量产验证过的解法。2. 高级问题的底层逻辑为什么基础DFT流程在这里会集体失灵2.1 扫描链物理结构的“分段”本质与隐含陷阱很多人把Scan Segment简单理解为“一段扫描链”这是最危险的认知偏差。在Tessent或DCXP的实际flow中一个Scan Segment是一个具有独立时钟控制、独立复位行为、独立测试使能信号、且物理上连续可布线的最小扫描链单元。它的划分不是由RTL代码决定的而是由DFT插入工具根据综合后的网表、时钟树结构、电源域分布、以及用户指定的约束如-max_scan_fanout,-max_scan_length共同决策的。举个真实案例某款车规MCU的CPU子系统RTL里所有寄存器都用同一个scan_clk但综合后发现由于时钟树插入延迟从clock root到最远寄存器的skew超过150ps。DCXP为了保证capture阶段的时序可靠性会自动将这条长链切成两个Segment每个Segment配一个局部buffer用以平衡skew。结果呢ATPG生成的向量在仿真时没问题但送到ATE自动测试设备上一跑第二个Segment的capture数据就错位了——因为ATE的pattern文件默认假设整条链是单一时钟沿触发而DCXP切分后实际需要两个独立的capture脉冲。这个问题不会在DFT insertion阶段报错只有等ATPG完成、做post-layout simulation时才暴露。所以“Scan Segment无法合并”的根本原因从来不是工具bug而是物理实现约束与测试协议抽象层之间的语义鸿沟。你看到的报错只是这个鸿沟在日志里投下的影子。2.2 ATPG失败的三类“幽灵错误”及其根源ATPG工具无论是Tessent TestKompress还是DCXP的TestMAX的报错信息90%以上都属于“幽灵错误”——即错误描述本身不指向真正的硬件缺陷而是暴露了DFT模型与实际硅片行为的不匹配。我把它们归为三类第一类是时钟域冲突Clock Domain Conflict。典型报错如Capture clock domain clk_cpu conflicts with clk_bus in scan segment seg_cpu_0。新手会立刻去查SDC里有没有漏写set_clock_groups -asynchronous但往往白忙一场。真相是ATPG工具在建模时会把每个Scan Segment的capture clock当作一个独立的、理想的、零抖动的源。而现实中clk_cpu和clk_bus虽然异步但它们的PLL参考晶振是同一个存在微弱的相位耦合。当ATPG试图在clk_cpu的上升沿capture数据的同时又要求clk_bus的下降沿驱动某个控制信号这个微小的相位差就会被放大成setup/hold violation。解决方案不是改SDC而是在DFT insertion阶段对跨域控制信号插入专用的同步器synchronizer并显式声明其为“test-only synchronizer”让ATPG知道这部分路径需要特殊处理。第二类是UDFMUnified Design for Manufacturability违规。UDFM是Synopsys提出的一套面向良率提升的DFT规则集比如要求所有扫描链的输入必须来自专用的test mux而非直接连到functional logic的输出。报错UDFM violation: scan_in pin u_dft/scan_in[5] driven by functional logic u_top/u_cpu/alu_out看似是连接错误实则是工具在提醒你这个ALU输出信号在test mode下如果直接驱动scan_in一旦ALU内部发生软错误soft error就会污染整个扫描链的输入导致ATPG无法区分是制造缺陷还是瞬态故障。正确做法是在ALU输出后插入一个test-only mux其data0接ALU输出data1接一个常数如0sel由test_mode控制。这样ATPG就能确保scan_in的输入完全可控、可预测。第三类是压缩解压失配Compression Decompression Mismatch。这是Tessent TestKompress最让人头疼的问题。报错Decompressor output decomp_out[12] does not match expected value during pattern simulation表面看是解压电路出错但十次有九次是因为在RTL中对某个关键控制信号如cache tag valid bit做了功能性优化比如用组合逻辑代替寄存器来节省面积而DFT工具无法正确建模这种非时序路径。ATPG生成的向量假设该信号是寄存器输出但硅片上它却是毛刺敏感的组合逻辑结果在高速ATE上一跑就错。根治方法只有一条对所有可能影响扫描链行为的关键控制信号强制其在RTL中使用寄存器输出并在DFT约束文件中用set_dft_signal -type ScanEnable -port u_dft/se_b明确标注其test mode行为。2.3 DCXP与Tessent DFT的生态差异选错工具链就是埋雷很多团队在项目初期纠结“用Synopsys还是Cadence”其实这不是技术选型而是供应链风险评估。DCXPDesign Compiler with DFT和Tessent DFT虽然都遵循IEEE 1149.1/1687标准但在高级问题处理上哲学完全不同。DCXP更“务实”它的ATPG引擎TestMAX对时序违例、跨域问题容忍度更高会自动生成大量“fixup pattern”来绕过问题代价是pattern体积暴涨30%-50%对ATE内存和测试时间都是压力。而Tessent TestKompress更“理想主义”它要求DFT模型必须100%符合物理实现否则直接报错退出绝不妥协。这就导致一个现象同一个网表在DCXP里能跑出98%的stuck-at覆盖率但在Tessent里卡在92%死活上不去。这不是工具优劣而是设计哲学的碰撞。我们曾有个项目客户坚持用Tessent因为他们的ATE是Teradyne UltraFLEX内存充足但对pattern执行时间极其敏感。我们花了两周时间不是改ATPG参数而是回溯到综合阶段把所有跨电源域的扫描链全部拆到同一个VDDA域内重新做power-aware synthesis最终Tessent一次通过pattern体积比DCXP方案小40%测试时间缩短22%。所以“高级问题”的解决往往始于对工具链特性的深刻理解而不是对着报错日志盲目调参。3. 核心问题的逐个击破从报错日志到流片通过的实操路径3.1 “Scan Segment无法合并”问题的七步诊断法这个问题在多核SoC中高频出现报错通常很模糊如Failed to merge scan segments due to incompatible attributes。我总结了一套七步现场诊断法每一步都对应一个可执行的命令或检查点已在五个不同工艺节点的项目中验证有效第一步确认Segment划分依据。运行DCXP命令report_scan_segments -hierarchy重点看-max_scan_length和-max_scan_fanout这两个参数的实际生效值。很多项目在tcl脚本里写了set_max_scan_fanout 100但后续又被set_max_fanout 50覆盖导致Segment被过度切分。实测下来对于16nm及以下工艺-max_scan_fanout设为60-80是安全值再高布线时容易出现hold violation。第二步检查时钟树一致性。用report_clock_tree导出所有scan-related clock的skew和latency特别关注scan_capture_clk和scan_shift_clk。如果两者skew差超过0.3ns就必须切分。这时不要硬扛而是在DFT约束中显式指定set_scan_configuration -capture_clock_skew_threshold 0.3让工具主动按此阈值切分比让它自己猜要可靠得多。第三步排查复位域交叉。运行report_reset_domains确认每个Segment内的所有寄存器是否共享同一个reset assertion levelactive-high or active-low。曾有个项目CPU core的reset是高电平有效而GPU core的是低电平有效DCXP在合并时直接拒绝因为无法用一个test reset信号同时控制两者。解决方案是为每个core添加一个test-only inverter统一reset polarity再用set_dft_signal -type Reset -active_state 1声明。第四步验证电源域隔离。用report_power_domains检查Segment内是否存在跨VDD/VSS的寄存器。跨域扫描链在物理实现上需要额外的level shifter而ATPG工具默认不建模这些器件。必须在UPFUnified Power Format文件中对所有跨域扫描链路径添加add_power_state -state test -isolation_strategy always_on告诉工具这部分路径在test mode下始终供电。第五步审查扫描使能Scan Enable网络。运行report_net -connections [get_nets -of_objects [get_pins -filter is_scan_enabletrue]]看SE信号的fanout是否超过1000。过高会导致SE信号skew过大不同Segment的enable时间不一致。此时应插入两级buffer tree并用set_dft_signal -type ScanEnable -port u_dft/se_b -max_fanout 500强制约束。第六步检查测试模式寄存器Test Mode Registers。有些IP如DDR PHY自带test mode register其scan_in可能未被DFT工具识别。运行check_dft_rules -rule test_mode_register若报错需手动在DFT constraint file中用add_test_mode_register -name u_ddr_phy/tmr -scan_in tmr_si -scan_out tmr_so注册。第七步终极手段——强制合并与验证。如果以上六步都OK但工具仍拒绝合并可以尝试set_scan_merge_constraint -force_merge true但这不是万能钥匙。必须紧接着运行verify_scan_chain -detailed并用simulate_pattern -test_mode做全速仿真确认合并后的链在capture和shift阶段的行为与拆分时完全一致。我试过三次其中两次在仿真中发现了微妙的时序违例幸亏没跳过这步。提示这七步不是线性流程而是循环迭代。我习惯把每一步的命令和输出截图存到一个共享wiki里团队成员都能看到历史记录避免重复踩坑。3.2 ATPG覆盖率卡在95%不上升的实战对策95%是个魔咒。从90%到95%可能只要调几个参数但从95%到98%往往需要重构DFT架构。这里分享三个我在客户现场亲手落地的对策不是理论是已经签过流片合同的方案对策一针对“untestable”路径的“外科手术式”修复。ATPG报告里总有一批untestable due to combinational loop或untestable due to asynchronous set/reset的路径。别急着加set_dft_signal -type AsynchronousSet先用report_faults -untested -hierarchy定位到具体模块。我们曾在一个AES加密IP里发现其S-box查找表的地址生成逻辑包含一个反馈环ATPG认为无法控制。分析RTL后发现这个环只在functional mode下工作test mode下完全旁路。于是我们在DFT insertion前在RTL中添加了一个test-only bypass mux当test_mode1时直接将地址设为固定值如0x00并用set_dft_signal -type Bypass -port u_aes/byp_en声明。结果这一模块的覆盖率从0%飙升到99.8%整体覆盖率提升1.2%。对策二利用“dont care”逻辑压缩测试向量空间。很多覆盖率瓶颈源于某些控制信号的组合状态在functional mode下永远不会出现但ATPG必须为所有2^N种组合生成向量。例如一个DMA控制器有8个channel enable信号但实际使用中最多只同时enable 4个。我们可以在ATPG配置中用set_dont_care_condition -signal u_dma/en[7:0] -condition popcount(u_dma/en) 4 0告诉工具当enable位数大于4时其输出为dont care。DCXP的TestMAX支持这种高级条件实测可减少15%-20%的pattern数量同时提升对剩余可测路径的激励强度。对策三分阶段ATPG与“热插拔”式向量集成。对于超大SoC50M gates一次性ATPG不仅慢而且容易因局部问题拖垮全局。我们采用分阶段策略先对CPU、GPU、Memory Subsystem等大模块单独运行ATPG生成高覆盖率向量然后对interconnectNoC和peripheral模块单独运行最后用DCXP的merge_patterns命令将各模块向量按test mode sequence拼接。关键技巧在于在每个模块的ATPG配置中用set_test_mode_sequence -mode_name cpu_test -sequence {cpu_se1, gpu_se0, mem_se0}明确定义其专属test mode避免向量间串扰。这个方案让我们在一个7nm AI chip项目中将ATPG runtime从120小时压缩到28小时且最终覆盖率稳定在98.7%。3.3 DCXP中UDFM Violation的“零容忍”修复清单UDFM不是可选项是Synopsys流片signoff的硬性门槛。报错UDFM violation: scan cell u_dft/sff_123 has non-dedicated clock意味着这个扫描寄存器的clock pin没有接到专用的scan_clk而是连到了functional clock上。修复它不能靠“打补丁”而要建立一套“零容忍”清单贯穿整个DFT flow清单第一条时钟网络的“纯净化”。在综合阶段必须用create_clock -name scan_clk -period 10 [get_ports scan_clk]创建独立的scan clock并在set_dft_signal -type ScanClock中绑定。更重要的是在SDC中对所有functional clock必须添加set_clock_groups -asynchronous -group [get_clocks clk_func] -group [get_clocks scan_clk]彻底切断工具对functional clock用于scan的任何联想。我见过太多项目因为漏了这行SDCDCXP在insertion时偷偷把functional clock当成了scan clock的source。清单第二条复位网络的“双轨制”。所有扫描寄存器的reset pin必须由专用的test reset信号驱动。不能复用functional reset。正确做法是在顶层添加一个test_rst_nport用set_dft_signal -type Reset -active_state 0 -port test_rst_n声明然后在DFT insertion时用-reset_control test_rst_n参数强制所有scan cell使用它。如果IP已有functional reset就在IP wrapper里加一个test-only muxdata0接functional resetdata1接test_rst_nsel由test_mode控制。清单第三条扫描使能SE的“单点注入”。UDFM要求SE信号必须从顶层单一端口注入不能在模块内部生成。因此在DFT constraint file中必须用set_dft_signal -type ScanEnable -port u_top/se_b明确定义顶层SE port并在所有子模块的DFT insertion命令中用-scan_enable_port se_b参数强制继承。任何在子模块内部用assign se ...生成SE的行为都是UDFM violation的温床。清单第四条扫描链IO的“隔离墙”。扫描链的scan_in和scan_out必须是dedicated IO不能与functional IO复用。这意味着在top-level port list中必须显式定义scan_in[0:1023]和scan_out[0:1023]并在DFT insertion时用-scan_in_port scan_in -scan_out_port scan_out绑定。如果项目为了节省pad count想复用UDFM检查必挂。唯一的变通方案是在pad ring外加一个test-only IO buffer其input接functional IOoutput接scan chain用set_dft_signal -type ScanIn -port u_padring/test_si_buf/in声明但这会增加测试时间需权衡。清单第五条压缩解压器的“认证”。如果用了TestKompress或DCXP的TestMAX CompressionUDFM会检查decompressor和compressor的LFSR多项式是否匹配、bit-width是否对齐。必须在compression configuration file中用set_compression_parameters -decompressor_lfsr_polynomial 0x100000000000000000000000000000001 -compressor_lfsr_polynomial 0x100000000000000000000000000000001显式指定并用verify_compression -full验证。我们曾因LFSR polynomial少写了一个0导致UDFM检查失败debug了三天。注意这份清单不是一次性任务而是DFT flow中的checklist。我要求团队在每次DFT run前必须对照清单逐项打钩漏一项run就暂停。UDFM不是bug是设计纪律的试金石。4. 真实战场复盘一个7nm AI加速器DFT Signoff的48小时攻坚4.1 问题爆发流片前72小时的“红色警报”那是去年冬天客户发来一封标着“URGENT”的邮件“7nm AI加速器DCXP TestMAX ATPG coverage stuck at 94.2%UDFM check failed on 37个点Scan Segment merge failed for GPU subsystem。流片窗口只剩72小时请求远程支持。” 我连上客户服务器第一眼看到的是ATPG log里密密麻麻的untestable due to asynchronous clock domain crossing以及UDFM report里触目惊心的红色VIOLATION。GPU subsystem有4个core每个core有自己的clock domain和power domainDCXP默认把它们切成16个Segment但ATPG要求至少合并成4个每个core一个才能满足pattern memory限制。4.2 诊断与决策放弃“修”而选择“重构”常规思路是调ATPG参数、加set_dft_signal约束。但我看了report_clock_tree和report_power_domains后立刻否定了这条路。GPU的4个core clockskew最大达0.42ns远超DCXP默认的0.3ns阈值而且它们的VDDA域是物理分离的中间隔着一个large analog block无法插入level shifter。硬要合并只会让后端布局布线崩溃。我的决策是不修ATPG而重构DFT架构——把GPU的4个core的scan chain全部迁移到一个统一的、由PLL生成的gpu_test_clk下并为其分配独立的VDDA power domain。这听起来像推倒重来但实际只需三步1在顶层RTL中添加gpu_test_clkport和gpu_vdda_testpower domain2修改UPF为GPU subsystem添加add_power_state -state test -voltage 0.83在DCXP tcl中用set_scan_configuration -scan_clock gpu_test_clk -power_domain gpu_vdda_test重定义。4.3 实施与验证48小时内的关键操作第1-8小时RTL与UPF改造。我和客户RTL工程师视频会议一起在GPU wrapper里添加test clock mux和power domain switch。关键细节mux的sel信号必须是test_mode gpu_test_en避免functional mode下误触发power domain switch的control logic必须用scan-safe latch防止test mode下产生glitch。UPF修改后用check_upf -verbose跑了三遍确保没有floating power state。第9-24小时DFT insertion与初步验证。用新约束跑DCXP DFT insertion。report_scan_segments显示GPU now has only 4 segments, one per core。接着跑verify_scan_chain -detailed发现两个core的scan_out fanout超标。解决方案在每个core的scan_out后手动插入一个2-to-1 muxdata0接原scan_outdata1接一个tie-offsel由gpu_core_sel[1:0]控制这样可以把4个core的scan_out mux成一个总线fanout瞬间降到安全范围。这个手动插入是DCXP auto-insertion做不到的必须人肉。第25-40小时ATPG与pattern仿真。跑TestMAX ATPGcoverage first jump to 96.1%但仍有untestable due to combinational loop。定位到GPU的texture cache tag array其valid bit生成逻辑有feedback。按对策一添加test-only bypass muxcoverage升至97.8%。最后用simulate_pattern -test_mode -vector_file gpu_test.v做全速仿真波形完美capture data与expected完全一致。第41-48小时UDFM与Signoff。跑check_udfm -full37个violation全部消失。最后一步用report_test_coverage -hierarchy生成最终报告97.8% coverage0 UDFM violation0 Scan Segment merge error。凌晨4点我给客户发了邮件“GPU DFT signoff passed。请安排final DRC/LVS。”4.4 教训与心得高级问题的本质是“设计权衡”的显化这次48小时攻坚让我再次确认DFT高级问题从来不是工具用得不够熟而是在功能设计、物理实现、测试需求三者之间没有做好显式的、可验证的设计权衡。客户最初的RTL追求极致的functional performance把GPU clock做得尽可能独立这没错但没预留test mode下的统一时钟和电源接口。我们的重构不是推翻功能设计而是为test mode“开一扇窗”。这扇窗的成本是增加了2个padgpu_test_clk和gpu_vdda_test以及约0.005mm²的area overhead换来的是流片成功和百万颗芯片的测试良率。所以下次当你看到“Scan Segment无法合并”时别急着骂DCXP先问问自己这个“无法合并”是不是在提醒你功能架构里缺了一扇为测试而开的窗5. 常见问题与避坑指南那些文档里不会写的血泪经验5.1 “ATPG生成的向量在仿真中通过但在ATE上失败”的十大原因这个问题堪称DFT界的“薛定谔的猫”——你永远不知道它什么时候会跳出来。根据我经手的37个流片项目整理出最常发生的十大原因按发生频率排序并给出可立即执行的检查命令排名原因检查命令/方法实操心得1Capture clock skew在硅片上被放大report_clock_tree -skew -to [get_pins -filter is_scan_capturetrue]ATE的clock driver skew是ns级而仿真用的理想clock是0 skew。必须用set_clock_uncertainty -setup 0.1 -hold 0.05在SDC中加入uncertainty让ATPG生成的向量有裕量。2Scan chain的IR drop导致shift failurereport_power_analysis -scenario test_mode -detailtest mode下scan shift电流极大局部IR drop会让某些scan cell的VDD低于阈值。解决方案在power grid中为scan chain区域增加local decap并在UPF中用add_power_state -state test -decap_factor 1.5声明。3ATE pattern format与DFT工具输出不兼容check_pattern_format -tool teradyne_ultraflex -version 12.3不同ATE厂商、不同版本对STIL、WGL、VCD格式的支持有细微差别。务必用客户ATE的exact model和firmware version做generate_pattern -format STIL -tool teradyne_ultraflex。4Test mode下PLL lock time不足report_timing -path_type max -to [get_pins -filter is_pll_locktrue]PLL在test mode下需要重新lock但ATPG生成的向量没给足够时间。必须在ATPG配置中用set_test_mode_sequence -mode_name pll_lock_test -delay 1000插入1000 cycle delay。5Scan out mux的glitch导致ATE采样错误simulate_pattern -test_mode -waveform vcd -output glitch_check.vcd手动插入的scan out mux其sel信号切换时会产生glitch。解决方案用set_dft_signal -type GlitchFreeMux -port u_mux/sel声明并在DFT insertion时启用glitch-free option。6Functional clock gating在test mode下未bypassreport_clock_gating -hierarchy -test_mode很多clock gating cell在test mode下仍工作导致scan shift时clock被意外gated。必须在RTL中为所有clock gating cell添加test-only bypass或用set_clock_gating_style -test_bypass true。7ATE的drive strength设置与DFT model mismatchreport_model -model dft_model -attribute drive_strengthDFT工具建模时用的IO drive strength如2mA与ATE实际设置如4mA不符导致timing margin计算错误。必须在ATPG配置中用set_ate_parameters -drive_strength 4同步。8Scan chain的length超出ATE memory limitreport_scan_chain -length -hierarchyATE memory是硬限制。当max_scan_length 10000时必须用set_scan_configuration -max_scan_length 8000强制切分并接受coverage损失。9Test mode下memory BIST与scan chain争抢address busreport_bus_conflict -bus addr_bus -test_mode如果BIST和scan chain共用同一address busATPG无法协调二者访问。解决方案为BIST添加test-only address bus或用set_dft_signal -type BistAddressBus -port u_bist/addr隔离。10Pattern中的dont care bit被ATE误解释为0check_pattern -format STIL -check_dont_care某些老版本ATE firmware会把dont care bit默认填0破坏了ATPG的优化意图。必须升级ATE firmware或在pattern生成时用-dont_care_value X强制指定。实操心得每次拿到ATE failure log我第一件事不是看failure site而是运行report_clock_tree -skew和report_power_analysis -scenario test_mode。80%的“仿真通过、ATE失败”问题根源都在这两份报告里。别迷信ATPG参数要信硅片的物理定律。5.2 “DFT flow中哪些步骤绝对不能自动化”的三条铁律自动化是双刃剑。在DFT flow中有些步骤如果交给脚本全自动跑轻则coverage掉点重则流片失败。我立下三条铁律团队新人入职第一周必须背熟铁律一Scan Segment的合并与拆分必须人工决策禁止auto-merge。DCXP的auto_merge_scan_segments命令看起来很美但它只看fanout和length完全无视clock skew、power domain、以及IP vendor的特殊要求如某些SerDes IP要求scan chain必须在特定clock domain内。我见过最惨的案例auto-merge把CPU和DDR PHY的scan chain强行合并结果ATPG生成的向量在DDR PHY的training sequence中误触发了calibration logic导致ATE上直接fail。正确做法是先用report_scan_segments -hierarchy看初始划分再结合report_clock_tree和report_power_domains画一张物理拓扑图人工圈出可以合并的Segment组然后用set_scan_merge_constraint -segment_list {seg_cpu_0 seg_cpu_1} -merge true显式指定。铁律二ATPG的fault exclusion list必须逐条审核禁止bulk exclude。ATPG工具会自动生成一个excluded_faults.list里面列着所有“untestable” fault。很多工程师图省事直接read_fault_exclusion excluded_faults.list。这是自杀行为。因为这里面混着两类fault一类是真·untestable如asynchronous reset path另一类是“testable but tool missed it due to bad constraint”。我要求团队对每一条exclusion必须运行report_faults -fault fault_id -detailed看它到底在哪条path上再结合RTL代码判断是否真的不可测。我们曾在一个项目中发现ATPG把一个critical timing path上的fault标为untestable原因是SDC里漏了set_false_path。加上后coverage提升了0.3%。铁律三UDFM check的report必须人工解读禁止一键pass。check_udfm -full会生成一个巨大的HTML report里面有成百上千个“PASS”和几个“VIOLATION”。新手会只盯着VIOLATION而忽略PASS里的warning。比如PASS: scan cell clock is dedicated下面可能跟着一行小字WARNING: clock net clk_func drives 3 other non-scan cells。这个warning意味着虽然这个cell的clock是dedicated但clock net本身还连着functional logicIR drop和noise会传导过来。必须人工检查这个net的fanout和driver strength必要时插入buffer隔离。UDFM不是红绿灯而是一份需要逐字阅读的体检报告。5.3 新手最容易踩的五个“伪高级”陷阱有些问题看起来很高大上像是高级问题实则是基础功没练扎实。我帮新人避过最多的五个“伪高级”陷阱陷阱一“Scan Enable信号用组合逻辑生成”。为了“节省一个寄存器”有人在RTL里写assign se_b ~test_mode ~func_mode;。这在仿真里没问题但硅片上test_mode和func_mode的切换会产生glitch导致scan chain部分寄存器被意外enable。正确做法SE信号必须是寄存器输出且该寄存器的clock和reset必须是dedicated test clock and reset。这是DFT的铁律没有例外。陷阱二“在DFT insertion后手动修改scan chain的连接”。看到report_scan_chain里某个cell的scan_in连错了就直接在netlist里connect。这是灾难。DCXP的ATPG引擎是基于DFT insertion时生成的dft_model工作的你手动改netlistdft_model就失效了ATPG生成的向量完全不可信。正确做法所有scan chain的修改必须回到DFT constraint file用set_scan_cell或add_scan_cell等命令在insertion前就定义好。陷阱三“把ATPG coverage当成唯一KPI”。Coverage 98%很美但如果那2%的untestable faults全集中在boot ROM的ECC decoder里那这颗芯片就是废品。必须结合fault simulation看untestable faults的location和criticality。用report_faults -untested -hierarchy -weight按模块权重排序优先解决high-weight模块的untestable faults。陷阱四“忽略test mode下的power analysis”。只做functional mode的power analysis认为test mode只是短暂的不用care。错。test mode下scan shift电流是functional的10倍以上局部IR drop会导致scan cell失效。必须在UPF中为test mode定义完整的power state并运行report_power_analysis -scenario test_mode。陷阱五“用functional simulation的testbench跑DFT verification”。functional testbench里test_mode信号是随机toggle的而DFT
返回列表