1. 从“黑箱”到“白箱”:为什么我们需要DFT?
做硬件设计,尤其是芯片设计的朋友,肯定都听过DFT(Design for Testability,可测试性设计)这个词。但很多时候,它就像一个“黑箱”——项目流程里必须过的一道关卡,一堆脚本、一堆工具、一堆看不懂的波形和报告。后端工程师觉得它占用了宝贵的面积和时序裕量,前端工程师觉得它打乱了自己优雅的代码结构,测试工程师则对着成千上万的测试向量发愁。大家似乎都在为它“打工”,却很少有人真正停下来想:我们到底为什么需要DFT?它解决了什么根本性问题?
我干了十几年数字芯片设计,从最初的不以为然,到后来的敬畏有加,踩过的坑不计其数。最惨痛的一次教训是,一颗流片回来的芯片,功能仿真一切完美,但就是有5%的芯片在ATE(自动测试设备)上死活过不了。排查了整整两个月,最后发现是一个深藏在逻辑深处的触发器(Flip-Flop)在特定工艺角下无法被正常复位,而我们的测试向量根本没有覆盖到这个点。那次项目延期和额外的测试成本,让我彻底明白了DFT不是“可选项”,而是“生存项”。
简单来说,DFT的核心目的,就是让生产出来的芯片“可观察”和“可控制”。你可以把它想象成给一栋复杂的大楼(芯片)布设了完善的消防探头(观察点)和消防阀门(控制点)。大楼正常运行时,你不需要它们;但一旦起火(制造缺陷),你需要迅速定位火源(故障点)并切断相关区域(隔离故障)。没有DFT的芯片,就像一栋没有探头和阀门的大楼,一旦内部某个房间出了问题,你从外面根本无从知晓,更别提修复了。
所以,DFT要解决的根本矛盾是:芯片内部电路的高度集成和复杂化,与外部测试引脚极其有限之间的矛盾。我们不可能把芯片内部每一个节点的信号都引到管脚上来观察。DFT就是通过在设计阶段就植入一些额外的电路结构,用最小的代价(面积、功耗、性能),换来对芯片内部状态最大程度的掌控力。接下来,我们就一层层剥开DFT这个“白箱”,看看它到底包含了哪些关键技术和设计哲学。
2. DFT的核心三板斧:扫描链、内建自测试与边界扫描
谈到DFT技术,虽然流派众多,但有三项是基石中的基石,堪称“三板斧”。几乎所有的复杂数字芯片都离不开它们。
2.1 扫描链:把状态“串”起来看
这是DFT最经典、应用最广泛的技术,没有之一。它的核心思想非常巧妙:把芯片中所有(或大部分)的时序元件(主要是D触发器)改造成一种具有两种工作模式的特殊单元——正常功能模式和扫描测试模式。
在正常模式下,它们就是普通的触发器,参与电路的功能运行。在测试模式下,这些触发器会被首尾相连,变成一条长长的移位寄存器链,也就是扫描链。这样一来,我们就可以通过少数几个专用的测试引脚(扫描输入SI、扫描输出SO、扫描使能SE),像串糖葫芦一样,把特定的测试向量(Test Pattern)一位一位地“扫入”芯片内部,覆盖所有触发器的状态。然后让电路运行一个功能周期(在测试模式下,组合逻辑的输入由扫描链提供),再将新的状态一位一位地“扫出”来观察。
实操要点与避坑经验:
- 链的划分与平衡:一个大芯片通常不止一条扫描链。如何划分?原则是平衡链长。如果一条链特别长,测试时间就会很长(测试时间与最长链的长度成正比)。通常我们会根据物理布局和时钟域来划分,尽量让各条链长度相近。我常用的做法是在综合阶段就定义好扫描链的拓扑结构,而不是交给后端工具自动处理,后者容易产生难以平衡的长链。
- 时钟与时钟使能:扫描链的时钟必须干净、可控。对于带有时钟门控的触发器要特别小心,需要插入测试控制逻辑,保证在测试模式下时钟门控被旁路,时钟能直接驱动触发器。这里最容易出问题的是那些由组合逻辑生成的内部时钟,必须处理。
- 扫描压缩:随着链长增加,测试数据量(向量大小)和测试时间会爆炸式增长。扫描压缩技术应运而生,它通过在扫描链的输入输出端加入解压缩器和压缩器,用更少的测试引脚驱动更多的内部扫描链,从而大幅减少测试数据量。但要注意,压缩会引入一定的故障覆盖率损失,需要在压缩率和覆盖率之间做权衡。
注意:插入扫描链会影响时序。工具在替换普通触发器为扫描触发器时,会引入额外的选择器(MUX),这会增加触发器的D端到Q端的延迟(通常称为扫描MUX延迟)。在时序紧张的设计中,这部分延迟必须被考虑进去,否则可能导致建立时间违例。
2.2 内建自测试:让芯片自己“体检”
扫描链主要针对的是芯片中的随机逻辑(组合逻辑+时序逻辑)。但对于芯片中另一大类模块——存储器(SRAM, ROM, Register File等)和某些规则结构(如PLL, SerDes),扫描链就力有不逮了。这时就需要BIST。
MBIST针对存储器。它是在芯片内部集成一个小型测试引擎,这个引擎能自动生成测试序列(比如March算法,能检测存储单元的各种故障:粘滞故障、跳变故障、耦合故障等),施加给待测存储器,并比较读出结果。MBIST引擎通常由测试控制器、地址生成器、数据生成器和响应分析器组成。
实操要点与避坑经验:
- 算法选择:不是算法越复杂越好。复杂的March算法覆盖率高,但测试时间长、面积开销大。需要根据存储器的用途、容量和可靠性要求来选择。例如,对缓存(Cache)可能用较简单的算法,对存放关键数据的存储器则需用更全面的算法。
- 修复机制:对于大容量存储器,良率是关键。MBIST常常与冗余修复技术结合。当BIST检测到故障单元时,会记录其地址,并通过熔丝或电子熔丝技术,用备用的冗余行/列来替换故障行/列。这部分的设计和流程非常复杂,需要与Foundry的工艺特性紧密结合。
- 时序收敛:MBIST逻辑通常运行在比存储器本身更低的频率下,但它的插入不能影响存储器在功能模式下的关键时序路径,特别是地址和数据线的路径。
2.3 边界扫描:芯片的“外部诊断仪”
如果说扫描链和BIST是针对芯片内部的,那么边界扫描则是针对芯片与外部世界的接口,以及多芯片组成的板级系统。它的标准是IEEE 1149.1,也就是常说的JTAG。
它在每个I/O引脚处插入一个边界扫描单元,这些单元在测试模式下可以串成一条链。通过标准的JTAG接口(TDI, TDO, TMS, TCK),我们可以:
- 控制芯片每个引脚的输出值。
- 捕获芯片每个引脚的输入值。
- 测试板级互连的短路、开路故障。
实操要点与避坑经验:
- 不只是测试:JTAG接口如今已远超测试范畴,成为芯片调试、编程、内窥监控的必备通道。在设计时,一定要为JTAG TAP控制器预留好接口和必要的内部访问总线(如通过JTAG访问内部寄存器)。
- 安全性:正因为JTAG功能强大,它也成为安全攻击的潜在入口。对于安全敏感的芯片,需要考虑JTAG的禁用或锁定机制。
- 板级DFT:在系统板上,可以将所有芯片的JTAG链串接起来,实现对整个板级互连的测试。这时要注意链上不同芯片的IDCODE冲突问题,以及链过长导致的测试时钟(TCK)频率下降问题。
3. DFT的实现流程:一个与设计并行的生命线
很多人误以为DFT是设计完成后的一个“附加步骤”,这是大错特错的。DFT必须与前端设计、逻辑综合、物理实现等流程深度融合,并行开展。一个典型的、基于扫描链和MBIST的DFT实现流程如下:
3.1 前期规划与设计约束
在RTL编码阶段,DFT工程师就需要介入。
- 制定DFT架构文档:明确哪些模块需要插入扫描链,哪些存储器需要MBIST,时钟方案如何,测试模式如何切换,电源域如何隔离等。
- 定义测试协议:确定扫描链的数量、长度目标、压缩比、时钟方案(是否用ATE的时钟,还是用内部PLL)。对于混合信号芯片,还要规划模拟测试总线。
- 施加设计约束:通过SDC(Synopsys Design Constraints)文件,为综合工具指明哪些是测试时钟、测试信号,以及它们在测试模式下的时序要求(如时钟频率、信号转换时间)。一个常见的错误是只做了功能模式的约束,忘了测试模式,导致插入扫描链后时序无法收敛。
3.2 RTL级插入与验证
在RTL综合阶段,使用DFT工具(如Synopsys的DFT Compiler, Mentor的Tessent)进行扫描链的插入。
- 扫描替换:工具将普通的触发器替换为扫描触发器。
- 扫描链连接:根据架构文档,将扫描触发器连接成指定的链。
- 测试逻辑插入:插入时钟控制逻辑、复位控制逻辑、测试模式控制逻辑等。
- 生成测试协议模型:输出一个包含所有测试配置信息的模型文件,供后续的ATPG工具使用。
这个阶段必须进行充分的验证:
- 功能等价性检查:确保插入DFT逻辑后的网表与原始网表在功能上完全等价(Formal Equivalence Checking)。
- 测试协议验证:通过仿真,验证测试模式的切换、扫描链的移位操作、BIST的启动等是否正常。我习惯写一个简单的测试平台,模拟ATE的行为,对DFT逻辑进行基础验证。
3.3 ATPG:生成“检测试剂”
ATPG是自动测试向量生成。你可以把它想象成根据电路结构和故障模型(最常用的是固定型故障模型,即某个节点 stuck-at-0 或 stuck-at-1),自动生成一套最有效的“检测试剂”(测试向量)。
核心步骤:
- 故障列表生成:工具根据网表,列出所有需要检测的潜在故障点。
- 向量生成:针对每个故障,计算需要施加到原始输入和扫描链的输入值(称为“激励”),以及期望从原始输出和扫描链输出观察到的值(称为“响应”)。
- 故障模拟:用生成的向量去模拟电路,看哪些故障能被检测出来,并剔除能被同一向量检测的冗余故障。
- 向量压缩与格式化:将生成的向量压缩成紧凑的格式,并转换成ATE设备能够识别的波形格式(如STIL, WGL)。
关键指标:故障覆盖率。这是衡量测试向量有效性的黄金标准。通常要求达到95%甚至98%以上。覆盖率达不到怎么办?
- 分析未覆盖故障:工具会报告未覆盖的故障点。常见原因有:冗余逻辑(故障无法传播到观测点)、不可控的节点(如某些异步逻辑)、ATPG工具本身的算法限制。
- 添加测试点:对于难以控制和观测的节点,可以在设计上增加额外的逻辑(如与门、或门、触发器),专门用于测试,这就是“测试点插入”。这会增加面积,但能有效提升覆盖率。
3.4 物理实现与签核
DFT后的网表需要走完物理实现流程(布局布线)。这里有几个关键点:
- 扫描链重排序:为了减少布线拥塞和线长,后端工具通常会对扫描链进行物理重排序,即按照触发器的物理位置重新连接扫描链,而不是按照综合时的逻辑顺序。这能显著优化绕线。
- 测试时序签核:必须对测试模式进行独立的时序分析(STA)。测试时钟频率通常低于功能时钟,但测试模式下的路径可能与功能模式不同。要特别检查扫描链的移位路径(shift path)和捕获路径(capture path)是否满足时序。
- 功耗分析:扫描移位时,大量触发器同时翻转,会产生远高于功能模式的瞬时功耗(IR Drop),可能导致测试失败。需要在ATPG阶段采用低功耗测试技术,如移位时关闭部分链,或使用Launch-on-Capture的测试方式。
3.5 测试程序开发与硅后验证
生成最终的测试向量后,需要将其转换成ATE测试程序。同时,第一批硅片回来后,DFT测试是验证芯片是否制造成功的首要关卡。
- 调试测试程序:在ATE上调试测试程序,确保向量正确加载,响应正确比对。这个过程常常会发现设计或流程中未预料到的问题,比如电平不匹配、时序偏差等。
- 良率分析与诊断:对于测试失败的芯片,可以利用诊断工具,结合失效日志,定位到具体的物理故障点(如某个门电路、某段互连),反馈给制造厂进行工艺改进。
4. 高级议题与未来挑战
基础的DFT三件套足以应对大多数情况,但随着工艺演进和设计复杂化,新的挑战不断涌现。
4.1 低功耗设计下的DFT
现代芯片普遍采用时钟门控、电源门控等低功耗技术,这给DFT带来了巨大麻烦。
- 时钟门控:在测试模式下,必须保证扫描链的时钟是自由的。需要插入测试控制逻辑,旁路功能模式下的时钟门控。对于复杂的时钟门控网络,这可能会变得非常复杂。
- 电源门控:当某个电源域被关断时,其内部的扫描链状态会丢失,也无法测试。解决方案包括:在测试期间保持该域上电;或者采用特殊的隔离和保持策略。这需要与电源管理单元进行精细的协同设计。
- 测试功耗管理:如前所述,ATPG需要采用各种技术来降低测试期间的峰值功耗和平均功耗,防止电压跌落和过热。
4.2 高速接口与模拟混合信号测试
对于SerDes, PLL, ADC/DAC等高速或模拟模块,传统的数字DFT方法不再适用。
- 基于逻辑的BIST:为模拟模块设计数字化的BIST电路,例如,为ADC生成斜坡信号,并通过数字逻辑分析其输出码的单调性、失码等。
- 测试总线:使用模拟测试总线(如IEEE 1149.4)将关键模拟节点的信号引到有限的测试引脚上。
- 基于功能的测试:更多依赖于在特定测试模式下,通过数字逻辑配置模拟模块,并测量其关键参数(如PLL的锁定时间、抖动)。
4.3 系统级测试与硅后生命周期管理
芯片不再是孤岛,而是SoC(片上系统)的一部分。DFT需要向上延伸到系统级。
- Hierarchical DFT:对于包含多个IP核的SoC,采用层次化的DFT方法。每个IP核有自己的扫描链和BIST,在顶层进行集成和控制。这有利于IP复用和并行开发。
- 内建自修复:结合BIST和eFuse/ROM,在芯片上电时自动进行自检和修复,提升出厂良率和可靠性。
- 硅内监控与调试:DFT基础设施(如扫描链、JTAG)在芯片出厂后,可以成为现场调试、性能监控、甚至预测性维护的宝贵资产。
5. 常见问题与实战排坑指南
干了这么多年,有些坑是反复出现的。这里列几个典型的,希望能帮你绕过去。
问题一:故障覆盖率卡在92%上不去,怎么办?
- 排查步骤:
- 看报告:首先仔细阅读ATPG工具生成的未覆盖故障报告。工具通常会分类,比如“不可控”、“不可观测”、“ATPG放弃”等。
- 聚焦“不可控/不可观测”:这类故障通常指向设计本身的问题。用调试工具追踪这些节点的来源。常见原因:异步设计、三态总线、模拟黑盒、未初始化的存储器、由未扫描的触发器驱动的逻辑。
- 检查设计约束:确认SDC中的测试约束是否正确、完整。比如,是否将所有的测试时钟、测试模式信号都正确定义了?是否错误地将某些节点设为了常数?
- 考虑测试点插入:如果未覆盖逻辑是关键路径或重要功能,与设计工程师沟通,评估添加少量测试点的可行性。
- 调整ATPG策略:尝试不同的故障模型(如转换故障、路径延迟故障),或者调整工具的算法努力程度(effort level),有时会有奇效。
问题二:ATE测试时,扫描链移位失败,但仿真通过。
- 排查思路:这几乎是硅后调试最经典的问题。原因一定是测试环境与仿真环境的差异。
- 时钟与时序:首先怀疑时钟。ATE驱动扫描时钟的精度、边沿陡峭度、与扫描使能信号的时序关系,是否与仿真模型一致?用示波器测量ATE引脚的实际波形。检查测试协议中时钟定义(周期、脉冲宽度)是否正确。
- 复位状态:芯片上电后,扫描链是否处于一个确定的、已知的状态?测试程序中的复位序列是否充分?有些触发器的复位是异步的,需要足够的复位脉冲宽度。
- 电平与驱动:ATE驱动器的电压电平(Voh, Vol)是否与芯片的输入电平要求匹配?特别是如果芯片使用了多种电压域。ATE的驱动能力是否足够?
- 向量格式:确认ATE加载的向量格式(STIL, WGL)是否正确,有无位序反转、周期对齐错误。
- 物理缺陷:如果以上都排除了,可能是硅片的制造缺陷,如扫描链上的某个触发器损坏,或链间短路/开路。这时需要借助诊断工具进行精确定位。
问题三:插入扫描链后,功能时序出现违例。
- 解决方案:
- 区分模式:首先用STA工具分别分析功能模式和测试模式。确认违例是只在测试模式出现,还是两种模式都有。
- 扫描MUX延迟:如果是测试模式特有违例,重点检查扫描触发器的MUX延迟是否被正确建模并在时序分析中考虑。确保.lib库文件中扫描触发器的时序弧信息准确。
- 时钟路径:测试模式下,时钟路径可能被切换(例如从PLL切换到ATE时钟源)。检查测试时钟树是否合理,时钟延迟和偏斜是否可控。
- 综合与布局约束:在逻辑综合和物理布局时,就对测试模式施加时序约束。可以适当放宽测试模式的时钟频率要求(通常测试频率低于功能频率),但必须保证没有保持时间违例。
- 增量优化:如果违例路径很少,可以在物理设计阶段进行增量优化,例如对这些路径进行局部尺寸调整或缓冲器插入。
问题四:MBIST运行时,芯片电流异常大,甚至导致压降。
- 原因与对策:MBIST,尤其是并行测试多个存储器时,会产生巨大的开关活动性。
- 分时测试:修改MBIST控制器,不要同时启动所有存储器的BIST,而是让它们分时、分批进行。这虽然增加了总测试时间,但大幅降低了峰值功耗。
- 降低测试频率:MBIST不需要运行在最高功能频率下。在满足测试质量的前提下,尽可能降低BIST时钟频率。
- 电源网格加固:在存储器阵列和MBIST逻辑周围,布置更密集的电源和地线,提供低阻抗的供电路径。
- 片上监控:在电源网络上放置电压跌落检测电路,当检测到异常压降时,可以暂停或减缓BIST操作。
DFT的世界远不止这些,还有针对延迟故障的测试、针对小延迟缺陷的测试、针对桥接故障的测试等等。它是一门在可靠性、成本、性能之间不断寻求平衡的艺术和科学。我的体会是,一个好的DFT工程师,必须同时是半个设计工程师、半个验证工程师、半个物理工程师和半个测试工程师。他需要在项目最早期的阶段就发出自己的声音,把可测试性的DNA刻入芯片设计的每一个阶段。最终的目标,是让测试变得透明、高效、可靠,让制造出来的每一颗芯片都经得起考验。这不仅仅是技术,更是一种对产品质量负责的承诺。