
先说一个我自己的经历。有一年我们做了一颗中等规模的SoCRTL都快冻结了DFT工程师才开始介入。流片回来后上测试机台一跑测试pattern全部卡在第一条scan chain上查了三个星期最后发现是复位信号在scan shift阶段没有被钳位所有触发器scan-in的数据全被复位逻辑抹掉了。那一次我彻底明白DFT架构设计不是“综合之后顺手跑一下”的收尾动作而是贯穿芯片前端到后端的必修课。这篇文章就是写给刚接触DFT、或者已经在跑工具但经常一脸懵的新人。围绕Synopsys和Mentor这两大主流EDA工具链我会把DFT架构设计的完整思路、扫描链插入、压缩逻辑、ATPG生成、仿真验证以及我踩过的各种坑都摊开讲。适合芯片设计工程师、DFT工程师、刚入行的验证同学也适合后端物理设计想了解DFT流程的人。看完之后你至少能独立搭起一条从RTL到测试向量的DFT流程并且知道出了问题该往哪个方向排查。1. DFT架构设计的整体思路为什么先规划再动手1.1 DFT到底在解决什么问题很多人对DFT的理解停留在“用工具把电路里的寄存器串成链”但实际上DFT要解决的是芯片量产之后如何高效验证“这颗芯片是不是好的”。芯片制造过程中会出现各种物理缺陷比如金属线断路、栅氧化层击穿、相邻线桥接这些缺陷不能用功能仿真发现只能靠流片后的ATE测试。而ATE测试之所以依赖DFT是因为我们没有能力通过外部引脚直接控制芯片内部每一个触发器、每一段组合逻辑的状态。DFT的本质是在原始功能逻辑上增加“可控性”和“可观察性”。可控性指我们能通过测试模式把任意一个内部节点置成指定状态可观察性指我们能通过测试模式把内部节点的响应传出来。扫描链是实现这两点最经典的手段把触发器在测试模式下串成移位寄存器测试数据从scan_in灌入跑一拍功能捕获再从scan_out移出来比对。如果一个芯片完全不做DFT量产测试就只能依赖边界引脚和功能测试向量故障覆盖率可能低到无法接受。更现实的问题是测试时间会爆炸一颗百万门芯片的功能测试向量可能长达上百万周期在ATE机台上跑一次的成本远比芯片本身贵得多。所以DFT架构设计的核心目标从来不只是“能测”而是“测得住、测得快、测得起”。1.2 Synopsys Mentor工具组合怎么选先理清工具边界。DFT流程里两个厂商的工具都绕不开但实际项目中大家很少只用一家的产品而是根据阶段、习惯和授权情况混用。流程环节Synopsys工具MentorTessent/Siemens EDA工具扫描链插入/DFT综合DFT Compiler、DFTMAXTessent Scan测试压缩DFTMAX / EDTTessent Test CompressionATPGTetraMAXTessent FastScan存储器BISTSTAR Memory SystemTessent MemoryBIST逻辑BISTTestMAX / LBISTTessent LogicBIST诊断分析TetraMAX Diagnosis、Yield ExplorerTessent Diagnosis从我接触的项目来看最常见的一种组合是综合和扫描链插入用Synopsys DFT Compiler因为前端的综合脚本已经跑在Design Compiler里DFT流程和综合流程天然接得上ATPG则两个都能用TetraMAX的命令行风格更贴近DCFastScan的pattern更灵活很多公司老工程师用FastScan用得顺手就一直保留。Mentor工具的强势领域在Tessent Scan和Tessent MemoryBIST。Tessent Scan在大型SOC上对复杂时钟域、多电源域、门控时钟的处理非常成熟Tessent MemoryBIST对嵌入式存储器的测试算法和诊断支持也很完善。如果你的项目里有很多SRAM、ROM我建议认真比较一下两家的MBIST方案不要盲目选一家。1.3 一个标准DFT架构由哪些部分组成成熟芯片的DFT架构不会是单一扫描链而是多个层次的组合。我通常按下面几个模块来拆解扫描链Scan Chain逻辑测试的基础把所有可扫描触发器串接成移位寄存器。规模较大的设计会按功能模块和时钟域分成多条链再配合压缩逻辑减少引脚和测试数据量。测试压缩逻辑Compression / EDT在scan_in/scan_out端口和内部扫描链之间加解压/压缩电路几根外部引脚就能驱动几百条内部扫描链大幅减少测试时间。JTAG / TAP控制器整个芯片测试模式的入口。通过IEEE 1149.1标准接口切换功能模式、扫描测试模式、BIST模式也是诊断入口。Memory BIST嵌入式存储器的可测性设计。因为SRAM密度高、缺陷类型多必须靠专用的BIST控制器和March算法跑测试。Logic BIST用内建伪随机向量发生器对逻辑自测常用于功能安全场景或无法用ATE覆盖的高频模块。边界扫描Boundary Scan检测封装、板级焊接问题常用在芯片级互连测试。架构设计阶段要做的就是把这些模块想清楚每条扫描链怎么划分、压缩比定多少、BIST控制器放在哪个时钟域、JTAG怎么接入、test_mode/scan_enable怎么约束。这些不是流片前临时能补的提前规划能省掉后面一大堆返工。1.4 架构设计先想清楚的三件事第一件事是测试策略。量产目标是什么缺陷覆盖率要求多少有没有功能安全等级要求是否做车规验证。这些直接决定你用的是单纯scanATPG还是需要额外加LBIST、是否需要诊断支持。第二件事是压缩比和引脚分配。芯片封装引脚里能分给测试的引脚很少scan_in/scan_out通常只有几根到几十根但内部扫描链可能有几百条压缩比怎么折中要提前算。第三件事是时钟和复位规划。扫描测试对时钟树、复位树有特殊要求测试模式下所有触发器必须由可控时钟驱动异步复位在shift阶段必须被钳位。很多设计到了DFT阶段发现时钟门控方案不满足扫描规则不得不回改RTL这就是架构期没规划好的代价。2. 搭建DFT环境与工具安装细节2.1 环境准备最容易出错的几个点DFT工具跑不跑得起来很多时候不是脚本问题是环境问题。先说Linux版本Synopsys和Mentor的EDA工具版本对操作系统都有明确支持列表我遇到过不少同事拿着新版工具去跑老版CentOSGUI直接起不来或者库文件缺失。安装之前先把几件事确认好操作系统位数和版本是否符合工具支持矩阵磁盘空间要留足工具本体加工艺库往往几十G上百G临时目录权限很多工具运行时要写大量临时文件/tmp权限不对会让你找半天原因shell环境变量SYNOPSYS、MENTOR_HOME、PATH、LM_LICENSE_FILE都要正确导出。我见过最典型的问题就是csh和bash环境混用。很多EDA工具默认启动脚本是csh语法如果你在bash里source变量名带空格或方括号就会解释错。建议工具环境脚本统一用tcsh维护跑批处理脚本时再单独指定shell。2.2 Synopsys工具安装时Tcl/Tk版本冲突实录热词里提到的“linux中安装synopsys出现的问题 tcl、tk”我特别有感触这个坑几乎每个装过Synopsys工具的人都遇到过。Synopsys工具的图形界面和部分仿真脚本依赖Tcl/Tk库而且它对版本很挑剔。系统自带的Tcl/Tk版本如果太新工具会报cant find package Tcl如果太旧又会报expected version but got之类的错误。我当时安装VCS和TetraMAX时遇到的现象是命令行工具能跑但只要一开-gui就闪退控制台提示找不到libtcl8.4.so。原因是系统默认装的是Tcl 8.6而工具需要8.4/8.5。解决办法是把工具要求的Tcl/Tk版本编译安装到独立目录然后在启动脚本里用LD_LIBRARY_PATH强制指向这个目录再启动工具。注意不要轻易修改系统全局的Tcl/Tk版本很多系统工具依赖它。正确做法是让EDA工具使用独立的Tcl/Tk路径通过环境变量隔离。另外现在的工具版本也慢慢迁到Tcl 8.6但不同版本要求不一致安装前一定要看每个工具的Release Notes。同一天装VCS和TetraMAX一个要8.5一个要8.6的情况也很常见这时候就得写两套启动脚本分别设置环境变量别图省事用一套全局配置。2.3 Mentor Tessent工程目录怎么组织Tessent和Synopsys工具在工程组织上有个明显区别Tessent更倾向于按Result目录和Report目录输出文件动不动就生成一长串带时间戳的子目录。新人不理解这个机制经常找不到自己想要的输出文件。我给团队的目录规范是老四样project_root/ ├── scripts/ # 所有.do脚本、tcl脚本 ├── rtl/ # 源码或综合后的netlist ├── lib/ # 工艺库、memory库 ├── work/ # 各工具工作目录按run_time分 └── out/ # 报告、pattern、log归档Tessent跑批处理时我会在脚本开头固定设置set_context和write_output_files把所有结果统一输出到指定目录避免默认的散落结构。对于新手这一步能省掉很多“我明明跑完了结果文件去哪儿了”的困惑。2.4 DRC检查是DFT的第一道拦路虎很多新人第一次用DFT工具做插入前检查看到几百条DRC error直接懵了。但其实DRC error大部分是共性问题的重复报错看懂命名规律就不可怕。DFT工具里最常看到的几类违例ScanClk相关时钟在测试模式下不可控比如时钟来自内部分频器或自动门控逻辑没有在test_mode下旁路ScanEnable相关scan_enable信号时序不满足或者扫描模式不能保证所有触发器时钟同步Async相关异步复位/置位信号在测试模式下没有被钳位会导致扫描捕获时出现未知状态ClockMux相关多个时钟源复用同一时钟端口但没有测试专用旁路。处理这类问题我的经验是先按模块归类而不是一条一条看。比如所有DRC错误都集中在某个子系统的时钟域那就优先检查这个子系统的时钟门控方案往往一处RTL改动就消掉几十条同类错误。3. 扫描链设计与压缩逻辑实战3.1 扫描链插入流程从RTL到可测试网表扫描链插入本身在工具层面是相对“傻瓜”的操作但前提是设计约束清楚。以Synopsys DFT Compiler为例典型流程分三步读入设计、定义DFT信号、执行插入。read_verilog rtl/top.v link # 指定扫描时钟 set_dft_signal -view spec -type ScanClock -port clk -timing [list 45 55] # 指定测试模式信号 set_dft_signal -view spec -type TestMode -port test_mode -active_state 1 # 指定扫描使能 set_dft_signal -view spec -type ScanEnable -port scan_enable -active_state 1 # 指定复位信号在测试模式下被钳位 set_dft_signal -view spec -type Reset -port rst_n -active_state 0 set_dft_configuration -scan_compression enable insert_dft dft_drc -test_mode internal_scan核心逻辑在于工具需要知道哪些信号在测试模式下扮演什么角色。你告诉它clk是扫描时钟、scan_enable是扫描使能、test_mode是切换信号它才能正确地把触发器替换成带扫描功能的FF再按你的约束把它们串成链。这里插一句Tessent Scan的流程在理念上是一样的但命令风格略有不同read_cell_library lib/xxx_lvt_tt1p2v25c.lib add_netlist netlist/top.v add_netlist -reset ... add_clock clk -period 10 set_dft_signal -type ScanEn ... create_pattern -rule class ... run_test很多从Synopsys转到Mentor的人总觉得不适应其实只要理解每个工具都做同一件事定义时钟、定义测试控制信号、设置扫描配置、跑DRC、插入链、再跑DRC。命令差异只是包装不同。3.2 压缩比和测试时间参数到底怎么算压缩逻辑的选型离不开一个计算问题定多少条内部扫描链、外部引脚多少根、压缩比多少合适。拿一个2万扫描触发器的模块举例。如果不用压缩设20条内部扫描链每条链长度就是1000个触发器。一次scan shift需要1000个周期capture再加1个周期。假设需要2000条stuck-at pattern总测试周期是2000×(1000×21)≈400万周期。如果ATE测试频率是50MHz大概0.08秒看着不多但一颗芯片上还有transition测试、存储器测试、边界扫描全部加起来可能就非常可观。引入EDT或Tessent Compression后外部只有4个scan_in和4个scan_out端口内部却有200条链外部每个shift周期能同时把200个数据分别移入200条链。链长度如果是1000shift周期数量还是1000但外部输入端口只需要4根测试数据量就压缩到原来的1/50。压缩比上去了测试时间降下来但代价是面积、布线资源和pattern诊断复杂度的增加。我的建议是中等规模设计压缩比控制在50到100倍之间。压缩比过高时解压逻辑本身的覆盖率损失和X态屏蔽成本会显著上升最后算总账反而划不来。3.3 时钟和复位处理细节扫描链插入时最常出问题的不是链本身而是时钟和复位。测试模式下时钟必须是纯粹的、可控的。功能模式下的门控时钟ICGIntegrated Clock Gating在scan shift时如果有的FF时钟被门控关掉数据就移不动。通常做法是在设计中加入test_mode信号让所有ICG在测试模式下强制透明或者用MUX把内部时钟旁路到测试时钟。复位也一样。shift阶段scan_enable拉高时如果异步复位同时有效所有触发器会被不断复位scan数据全被抹掉这就是我在开头说的那个惨痛案例。正确做法是让复位信号在测试模式下被钳位或者利用工具选项把复位引脚和scan_enable信号做关联保证二者不会同时有效。还有一个容易被忽略的点是跨时钟域。如果一个扫描触发器由快时钟驱动另一个由慢时钟驱动两条链串在一起后shift时序很难收敛。DFT架构设计时就要按时钟域分组生成扫描链尽量不要让不同时钟域的FF混在同一条链里除非工具能自动处理跨时钟域捕获且你能接受覆盖率损失。3.4 压缩逻辑的X态问题压缩逻辑听起来很美但有一类问题特别坑新手就是X态传播。ATPG生成的测试向量里某些响应值可能是未知的X比如SRAM初始值、未初始化的锁存器、模拟模块输出这些X如果传播到压缩逻辑会把一批扫描链的结果全部污染导致本来正确的FF响应也被判定失败。处理X态的方法主要有两种X-Bounding和X-Masking。X-Bounding是在产生X的信号源头加隔离逻辑把X在进入扫描链之前钳到固定值X-Masking是在压缩逻辑内部用掩码寄存器把特定通道的X屏蔽掉。前者适合源头明确的情况后者适合X来源分散的情况。我在项目中亲眼见过新手忘了处理X态结果ATPG报告覆盖率92%但流片回来后测试良率一塌糊涂因为真正的X逻辑没有被限制压得越多错得越多。所以压缩比越高越要在ATPG之前做好X态的完整分析和处理。4. ATPG、仿真与覆盖率分析4.1 TetraMAX和FastScan怎么选ATPG工具的选择很多时候是个人偏好和公司传统但两者逻辑上是同构的读入网表、读入库、读入测试约束、build故障模型、生成pattern、输出pattern。TetraMAX的命令行风格和DC一致项目里已经有Synopsys流程时上手成本最低。FastScan的pattern格式支持和诊断能力在复杂设计里更灵活特别是在配合Tessent Diagnosis做良率分析时Tessent生态内的衔接更顺畅。选择上可以按这个逻辑考虑整个DFT流程都是Mentor工具链做的就继续用FastScan流程是Synopsys为主就用TetraMAX。不要在这个环节混用太厉害pattern格式转换虽然是小事但每次转换都多一道出错的可能。4.2 ATPG覆盖率的提升手段覆盖率是DFT质量最直接的指标。常见的stuck-at故障覆盖率目标是95%到99%transition delay fault覆盖率要求通常是90%到95%。达不到目标时不要一味堆pattern数量先分析哪些故障测不到。常见的覆盖率损失来源和处理手段未映射的逻辑某些库单元的时序弧和功能不完整在ATPG工具里建不了模型建议用report_underspecified类命令查漏补缺Memory内部逻辑SRAM的单元内部故障通常不靠扫描链测而是靠MBIST所以ATPG报告里可以把存储器排除掉冗余逻辑一些多路径冗余逻辑在功能上不可能被观测这类测试覆盖率损失可以接受X态约束过强如果为了压X给很多逻辑加了约束相应的故障会变成不可测需要权衡。如果覆盖率确实差得比较多先检查扫描链本身有没有问题再检查DRC是否完整。很多时候覆盖率低不是ATPG工具不行而是设计里的DFT约束不完整比如某个模块的时钟在测试模式下仍然被门控。4.3 门级仿真验证测试patternATPG生成的pattern在送到ATE之前必须先用门级仿真验证一遍。否则等你流片回来才发现pattern本身有问题根本没有改的机会。门级仿真通常的做法是读入DFT之后的网表把ATPG输出的测试pattern按STIL或WGL格式导入仿真平台用testbench把scan_in、scan_enable、时钟按pattern要求驱动再比对scan_out。仿真时要用SDF反标时序这一步能抓住很多静态时序检查发现不了的问题。这里要提醒一个常见坑SDF反标后出现大量setup违例不要急着提“工具bug”。先确认仿真库的时序和STA工具用的库是不是同一套PVT条件。有一次我们发现仿真库里建立时间比STA库大了一倍查半天发现是仿真库选成了慢速型号而STA用的是典型条件。另外一个很实际的坑是日志噪音。如果验证环境里挂了总线的AXI VIP门级仿真时transaction打印会刷屏直接把scan链的波形和log冲没了。Synopsys AXI VIP的transaction打印可以在编译或运行阶段用plusarg控制关闭新版VCS环境里还能直接通过tcl命令设置打印级别。DFT仿真本来就信号量巨大建议一开始就关掉所有功能总线打印专注在scan接口上。4.4 pattern格式和ATE交付final pattern格式通常在STIL、WGL、Verilog Testbench之间选。现在主流是STILIEEE标准综合工具和ATE机台都支持。输出pattern之前要确认几个细节内部测试时钟频率、scan_enable的时序关系、测试模式是否需要先在JTAG上加载指令。这些信息最终会写进交付ATE的文档里不写清楚测试工程师拿到手也用不起来。经验交付pattern时除了pattern文件本身一定附带一个完整的DFT测试spec文档写明每个测试模式的名义时钟频率、电源域状态、所需测试引脚和预期响应值。这个文档能省掉你后续和测试工程师来回拉扯的大量时间。5. 新手必看避坑指南5.1 坑一异步复位在shift阶段没有钳位这个坑我在开头已经提过血的教训。方案很简单在RTL里插入测试专用复位钳位逻辑或者利用工具把复位信号在scan_enable有效时强制无效。但要注意不是所有复位都要钳位有些真正需要复位异常状态的触发器如果钳掉了测试时可能反而无法初始化。所以处理复位逻辑要逐个模块看不要一刀切。5.2 坑二压缩逻辑下X态爆炸前面讲X态传播已经说过原理。这里补充一个排查经验如果ATPG覆盖率正常但门级仿真大量mismatch发生在固定某几条链上几乎可以肯定是有X态淹没了压缩逻辑。用工具打开X态分析报告定位X源在源头加隔离单元或掩码比在pattern层面屏蔽靠谱得多。5.3 坑三门级仿真时序违例满天飞SDF反标后出现违例先分三类处理库条件不一致、STA约束不完整、真实时序问题。库条件问题按前面说的检查PVT条件STA约束不完整通常是测试模式下时钟树和复位树没有加set_case_analysis真实时序问题则要回头改设计或调整扫描链长度而不是靠仿真工具硬扛。5.4 坑四MBIST配置出来但跑不通Memory BIST的坑比逻辑scan更隐蔽。最常见的配置问题有三个BIST时钟频率和RAM端口的时序不匹配导致March算法捕获窗口不对多个Memory共用BIST控制器时地址空间冲突RAM内部列修复column repair逻辑没初始好导致第一次run就误报fail。排查手段没有捷径先把一个Memory做单点验证跑通了再放开到所有Memory。不要一上来就全芯片跑MBIST发现问题时你根本分不清是哪个模块的错。5.5 坑五安装、版本、License兼容问题工具安装的坑前面已经讲了Tcl/Tk。还有一个常见问题是版本兼容矩阵。DFT Compiler、TetraMAX、FastScan、Tessent这些工具每年都在迭代不同版本生成的netlist和pattern格式会有细微差异。项目过程中如果需要升级工具一定跑一次完整回归再继续不要想当然地认为小版本升级不影响结果。软件授权管理也要注意工具运行时报“license feature not available”不一定是你没买这个feature很可能是环境变量指向了错误的license server。排查时先lmstat看feature是否checkout成功再查日志里的时间戳有时候就是系统时钟不准导致license校验失败。5.6 坑六共享总线DFT和JTAG访问设计遗漏热词里提到“shared bus dft”我理解是在SOC里多个IP测试访问机制共享总线或端口的情况。比如多个子系统各自有TAP控制器或者扫描端口在芯片级被复用成功能引脚设计时必须通过顶层的测试访问机制做好仲裁和切换。我见过的一个实际问题是两个TAP控制器挂在同一条JTAG链上其中靠后的TAP没有在仿真里初始化导致整个链的IDCODE指令永远读不到。排查时发现我们的testbench只给第一个TAP灌了复位第二个TAP一直处于未知状态。这类问题的共性就是共享测试资源时顶层连接关系没有梳理清楚。处理办法是在架构设计阶段就画清楚测试访问逻辑的连接关系图列出每个测试模式需要哪些信号有效并在RTL评审时专门过一遍。测试模式不是功能模式很多人容易忽略但它一旦出错整片芯片的测试能力都会归零。最后的个人体会我做了这些年DFT最深的感触是DFT不是一个可以最后补的“选修课”它本质上是芯片架构的一部分。很多时候RTL开发人员觉得DFT是DFT工程师的事DFT工程师抱怨RTL没有预留测试端口这个循环打不破的话项目后端永远在救火。对于刚入门的朋友我的建议是先跑通一条最简单的流程一个小模块一个测试时钟一条扫描链不引入压缩不做MBIST完整跑一遍insert DFT、ATPG、门级仿真。把这条链路吃透了再逐步加入压缩、多时钟域、MBIST这些高级内容。工具的使用只是时间问题真正拉开人和人差距的是对测试成本、覆盖率、设计约束这些底层概念的理解程度。最后再送你们一个实操小技巧无论用Synopsys还是Mentor工具跑DFT脚本之前先看一眼输出的DRC报告尾部很多工具会把违规按severity分级但新手容易盯着第一条error死磕。先抓fatal级别的问题那些往往才是导致后续流程卡死的真凶warning级的问题可以留到后期统一处理。