1. 从一颗芯片的“叠罗汉”说起:Memory-on-Logic堆叠测试到底难在哪
第一次接触3D IC测试的人,多半会被“Memory-on-Logic”这个词组唬住。拆开看其实不复杂:一颗逻辑裸片(Logic Die)上面直接键合一颗或多颗存储裸片(Memory Die),中间靠微凸块和硅通孔(TSV)做垂直互连,形成一个立体结构。逻辑部分负责计算和控制,存储部分负责数据吞吐,两者物理上贴在一起,走线距离从毫米级压缩到微米级,带宽和功耗收益立竿见影。
但做测试的人看到这个结构,第一反应往往是皱眉。为什么?因为传统2D芯片的测试逻辑很清晰:晶圆测试(Wafer Sort)挑出坏die,封装完再跑一遍终测(Final Test),两道关卡各管各的。到了3D堆叠场景,这套流程直接失效——存储裸片和逻辑裸片在键合之前各自都是好的,键合之后却可能因为TSV断裂、微凸块虚焊、热应力翘曲等问题变成废品。更麻烦的是,一旦堆叠完成,内部节点绝大多数不再有物理探针可以触碰,你没法像2D时代那样拿探针去戳每一个关键信号。
这就是DFT(Design for Testability,可测性设计)在3D IC领域被推到台前的根本原因。DFT的核心思路是:既然外部探针够不着,那就把测试逻辑做进芯片内部,让芯片自己配合测试。具体到Memory-on-Logic堆叠,需要解决的核心问题包括:逻辑裸片的扫描链如何延伸到存储裸片的接口边界,TSV互连的连通性怎么验证,堆叠后的存储阵列如何做全速ATPG(Automatic Test Pattern Generation,自动测试向量生成),以及JTAG(Joint Test Action Group)边界扫描链路在三维结构下如何重新组织。
这篇文章面向的是有一定DFT基础的工程师——你可能做过2D SoC的扫描链插入和ATPG,但还没系统接触过3D堆叠场景;也可能正在负责一个Memory-on-Logic项目的测试方案设计,需要一份能直接参考的工程实践记录。我会从架构设计、核心细节、实操流程到问题排查,把这条链路完整走一遍,尽量把每个决策背后的“为什么”讲清楚。
2. 整体方案设计:为什么DFT架构要在键合前就定好
2.1 3D堆叠测试的三个阶段与DFT介入时机
Memory-on-Logic的测试流程通常分三个阶段,每个阶段对DFT的需求完全不同:
阶段一:裸片级测试(Pre-Bond Test)。逻辑裸片和存储裸片各自在晶圆状态下做测试。逻辑裸片跑标准扫描ATPG,存储裸片跑存储器BIST(Built-In Self-Test)。这个阶段DFT架构跟2D芯片差别不大,但有一个关键约束:逻辑裸片上所有将要连接到TSV的接口引脚,必须在这一阶段就被扫描链覆盖,否则键合后这些引脚就“失联”了。
阶段二:键合后测试(Post-Bond Test)。两颗裸片通过TSV和微凸块连接完毕,此时需要验证垂直互连的连通性和完整性。这个阶段是3D IC DFT的核心难点,因为TSV本身没有有源器件,你没法直接对它做扫描。常见做法是在TSV两端各放一个测试wrapper cell,逻辑侧通过扫描链控制,存储侧通过边界扫描或专用测试模式响应,形成一条穿越堆叠界面的“测试通路”。
阶段三:封装后终测(Final Test)。整个堆叠体封装完成后,跑全功能测试和系统级测试。这个阶段JTAG链路是主要入口,通过IEEE 1149.1标准接口访问内部所有测试资源。
注意:DFT架构必须在RTL设计阶段就确定,不能等到物理设计再补。原因很简单——TSV的测试wrapper cell需要占用逻辑裸片的面积和布线资源,存储裸片的测试接口需要提前定义协议,这些改动越晚做代价越大。我见过一个项目因为键合后才发现TSV测试覆盖不足,不得不重新流片逻辑裸片,损失了整整一个季度。
2.2 为什么选择“共享总线+分层TAP”的DFT架构
在3D堆叠场景下,JTAG TAP(Test Access Port)控制器的组织方式有两种主流方案:
方案A:单TAP集中控制。整个堆叠体只有一个TAP控制器,位于逻辑裸片,存储裸片的测试资源通过TSV延伸到逻辑侧统一管理。优点是控制逻辑简单,JTAG链路只有一条。缺点是TSV数量需求大,因为所有测试信号都要穿过堆叠界面。
方案B:分层TAP+共享总线。逻辑裸片和每个存储裸片各有一个精简TAP控制器,通过一条共享测试总线(Shared Test Bus)互联。逻辑侧TAP作为主控制器,存储侧TAP作为从控制器,指令和数据通过共享总线分发。优点是TSV占用少,因为共享总线可以用较少的信号线实现多裸片寻址;缺点是控制协议更复杂,需要处理多TAP的指令同步问题。
实际工程中,方案B更常见,尤其是存储裸片数量超过两颗时。原因在于TSV是3D IC最昂贵的资源之一——每个TSV占用面积、影响良率、增加寄生电容。用共享总线把测试信号复用起来,能把TSV需求从几十根降到几根,这笔账怎么算都划算。
共享总线的具体实现通常是一条双向数据线加一条时钟线和一条控制线,配合简单的时分复用协议。逻辑侧TAP把指令和测试数据打包成帧,通过共享总线广播到所有存储裸片;每个存储裸片根据帧头中的地址字段判断是否响应。这套机制跟JTAG标准里的星型扫描(Star Scan)思路类似,但针对3D堆叠做了精简。
2.3 存储裸片的测试wrapper设计要点
存储裸片的测试wrapper是整个DFT架构中最需要仔细设计的部分。它的核心职责有三个:第一,在裸片级测试时隔离存储阵列,让BIST能独立运行;第二,在键合后测试时暴露TSV接口,让逻辑侧能验证互连;第三,在终测时把存储阵列重新接入系统总线,做全速功能测试。
Wrapper的硬件结构通常包括:
- 边界扫描寄存器:每个TSV接口对应一个扫描触发器,串成一条扫描链。逻辑侧通过这条链读写TSV状态。
- 测试模式选择器:根据当前测试阶段,选择存储阵列的输入来源——来自BIST、来自TSV直通、还是来自系统总线。
- BIST控制器接口:在裸片级测试时,BIST控制器直接驱动存储阵列;在键合后测试时,BIST控制器被旁路,存储阵列的输入切换到TSV直通路径。
这里有一个容易踩的坑:wrapper的扫描链长度必须与逻辑侧扫描链匹配。如果逻辑侧扫描链是1000位,存储侧wrapper链是800位,ATPG工具在生成跨裸片测试向量时会因为链长不匹配而报错。解决办法是在wrapper链中插入填充位(Padding Bit),或者在逻辑侧做链长适配。我个人的经验是,在架构定义阶段就把两侧链长对齐,比后期打补丁省事得多。
3. 核心细节解析:ATPG、JTAG与TSV测试的工程实现
3.1 跨裸片ATPG的向量生成策略
ATPG在2D芯片上的工作方式很直接:工具读取网表,识别故障模型(Stuck-at、Transition Delay、Bridge等),生成激励向量,通过扫描链灌入芯片,再通过扫描链读出响应,比对期望值。到了3D堆叠场景,ATPG面临两个新问题:
问题一:跨裸片故障模型如何定义。TSV和微凸块的故障模式跟传统CMOS逻辑不同。TSV可能出现的故障包括:开路(Open)、短路(Short-to-Neighbor)、电阻性开路(Resistive Open)、以及热循环导致的间歇性故障。这些故障在ATPG中需要用自定义故障模型来描述,不能直接套用Stuck-at模型。
问题二:跨裸片向量如何生成。逻辑裸片的扫描链和存储裸片的wrapper链在物理上是分开的,但测试时需要串成一条通路。ATPG工具需要支持“分层网表”输入——把两颗裸片的网表合并成一个扁平化网表,TSV作为内部节点处理。这样工具才能生成穿越堆叠界面的测试向量。
实际操作中,我通常采用“分而治之”的策略:先对逻辑裸片单独跑ATPG,覆盖率做到95%以上;再对存储裸片单独跑BIST,覆盖率做到99%以上;最后针对TSV互连单独生成一组定向测试向量。这组定向向量不需要追求高覆盖率,只需要覆盖TSV的开路和短路故障即可。这样做的好处是ATPG运行时间可控,而且调试时容易定位问题——如果终测失败,可以快速判断是逻辑问题、存储问题还是互连问题。
3.2 JTAG链路在堆叠结构下的重新组织
JTAG在3D IC中的角色比2D时代更重要,因为它是封装后访问内部测试资源的唯一入口。但标准IEEE 1149.1定义的TAP状态机和指令集是针对单裸片设计的,直接套用到堆叠结构会遇到几个问题:
TAP控制器的级联。多个裸片的TAP控制器如果简单级联,TDI到TDO的路径会变得很长,测试时钟频率上不去。解决方案是采用“星型”拓扑——逻辑侧TAP作为主控制器,存储侧TAP的TDI和TDO不直接串联,而是通过共享总线由主控制器转发。这样JTAG链路的物理长度可控,时序收敛更容易。
指令集的扩展。标准JTAG指令(如BYPASS、IDCODE、SAMPLE/PRELOAD)在堆叠场景下需要扩展。比如,需要新增一条指令来选择目标裸片(类似地址广播),还需要一条指令来配置TSV测试模式。这些自定义指令通过JTAG的私有指令空间实现,不破坏标准兼容性。
时序收敛的挑战。JTAG时钟(TCK)在3D堆叠中需要穿越TSV,TSV的寄生电容会导致时钟偏斜。实测中,如果TCK频率超过10MHz,TSV上的信号完整性就会明显劣化。解决办法是在逻辑侧TAP中做时钟再生成——TCK在逻辑裸片内部重新缓冲后再通过TSV送到存储裸片,而不是直接穿透。
3.3 TSV测试的专用方法:环形振荡器与扫描链结合
TSV本身没有逻辑功能,测试它需要专门的结构。工程上常用的方法有两种:
方法一:环形振荡器(Ring Oscillator)法。在TSV两端各放一个反相器,加上使能控制,构成一个环形振荡器。TSV连通时,振荡器起振,输出频率与TSV的RC延迟相关;TSV开路时,振荡器不起振。通过测量振荡频率,不仅能判断连通性,还能评估TSV的电阻和电容参数。这种方法的优点是灵敏度高,能检测电阻性开路;缺点是需要额外的模拟测量电路,测试时间较长。
方法二:扫描链直通法。在TSV两端各放一个扫描触发器,逻辑侧的触发器通过扫描链写入数据,存储侧的触发器通过扫描链读出数据。如果读写一致,说明TSV连通;如果不一致,说明TSV故障。这种方法的优点是测试速度快,可以直接复用数字ATPG流程;缺点是无法检测电阻性开路——如果TSV电阻增大但未完全断开,逻辑值可能仍然正确。
实际项目中,我通常两种方法都用:先用扫描链直通法做快速筛查,覆盖率做到90%以上;再用环形振荡器法对关键TSV做精细测量。这样兼顾了测试效率和故障检测能力。
4. 实操流程:从RTL到终测的完整DFT实现路径
4.1 RTL阶段的DFT架构插入
这个阶段的核心任务是把测试逻辑做进RTL代码。具体步骤包括:
第一步:定义测试接口。在逻辑裸片的顶层模块中定义JTAG端口(TCK、TMS、TDI、TDO、TRST)、共享总线端口(Test_Bus_Data、Test_Bus_Clk、Test_Bus_Ctrl)、以及TSV接口的测试wrapper端口。这些端口在RTL中要显式声明,不能等到综合时再补。
第二步:插入扫描链。使用DFT Compiler或类似工具,对逻辑裸片的所有功能触发器做扫描替换,串成扫描链。扫描链的数量和长度需要根据测试时间预算和布线拥塞情况折中。我的经验是,扫描链数量控制在16到32条之间比较合适——太少会导致测试时间过长,太多会增加布线压力和TAP控制复杂度。
第三步:插入TSV wrapper。对每个TSV接口,在逻辑侧和存储侧各插入一个wrapper cell。逻辑侧wrapper cell串入逻辑扫描链,存储侧wrapper cell串入存储扫描链。两侧wrapper cell的控制信号由TAP控制器统一管理。
第四步:插入BIST控制器。存储裸片的BIST控制器在RTL中实例化,接口包括BIST使能、BIST启动、BIST结果输出。BIST控制器在裸片级测试时激活,在键合后测试时旁路。
实操心得:RTL阶段最容易忽略的是测试模式下的时钟和复位处理。3D堆叠场景下,逻辑裸片和存储裸片可能使用不同的时钟域,测试时需要做时钟切换。我建议在RTL中显式例化一个测试时钟多路选择器(Test Clock MUX),由TAP控制器控制切换,避免综合工具自动插入不可控的时钟门控。
4.2 综合与物理设计阶段的DFT约束
RTL插入完成后,进入综合和物理设计阶段。这个阶段DFT相关的约束主要包括:
扫描链重排序(Scan Chain Reordering)。综合后的网表中,扫描链的顺序可能不是最优的——工具默认按触发器名称排序,可能导致布线绕远。物理设计阶段需要根据布局信息对扫描链重新排序,把物理上相邻的触发器串在一起,减少布线长度。这一步对3D IC尤其重要,因为TSV附近的布线资源非常紧张。
TSV的DFT约束。TSV在物理设计中被当作宏单元处理,需要设置don't touch属性,防止工具在优化时移动或删除。同时,TSV的测试wrapper cell需要设置固定的布局位置,紧贴TSV放置,减少测试信号的走线延迟。
时序约束。测试模式下的时序约束比功能模式更严格,因为扫描链的移位操作会在所有触发器上同时翻转,导致动态压降(IR Drop)和功耗问题。需要在综合和物理设计阶段做测试模式下的功耗分析,必要时插入扫描链分段使能(Scan Chain Segment Enable),把同时翻转的触发器数量控制在安全范围内。
4.3 键合后测试的向量生成与调试
键合后测试的向量生成是整个流程中最复杂的环节。具体操作如下:
第一步:合并网表。把逻辑裸片和存储裸片的网表合并成一个扁平化网表,TSV作为内部节点。合并时需要注意端口映射——逻辑侧的TSV端口和存储侧的TSV端口要正确对接。
第二步:定义跨裸片故障模型。在ATPG工具中定义TSV的故障模型,包括开路、短路、电阻性开路。对于电阻性开路,需要设置一个电阻阈值(通常取1kΩ到10kΩ),超过阈值的TSV判定为故障。
第三步:生成定向测试向量。针对TSV互连生成定向向量。具体做法是:在逻辑侧扫描链中写入一组Walking-1或Walking-0模式,通过TSV传到存储侧,在存储侧扫描链中读出响应。如果响应与期望一致,说明TSV连通;否则定位到具体故障TSV。
第四步:调试与故障定位。如果测试失败,需要定位故障TSV。调试方法包括:用电子束探针(E-Beam Probe)直接测量TSV波形,或者用红外热成像定位异常发热点。实际操作中,电子束探针的分辨率有限,对于微凸块级别的故障,往往需要做切片分析(Cross-Section)才能最终确认。
4.4 终测阶段的JTAG链路验证
终测阶段的主要任务是通过JTAG接口验证整个堆叠体的功能。具体步骤包括:
第一步:IDCODE读取。通过JTAG读取每个裸片的IDCODE,确认堆叠体中所有裸片都能被正确识别。如果某个裸片的IDCODE读不出来,说明该裸片的TAP控制器或TSV链路有问题。
第二步:边界扫描测试。跑IEEE 1149.1标准的边界扫描测试,验证封装引脚与内部逻辑的连接。这一步主要检测封装级的开路和短路故障。
第三步:TSV连通性复测。通过JTAG指令切换到TSV测试模式,重新跑一遍TSV连通性测试。这一步的目的是确认封装过程没有引入新的TSV故障。
第四步:全功能测试。通过JTAG加载功能测试向量,跑全速功能测试。这一步的向量通常由系统级测试团队提供,DFT团队负责把向量转换成JTAG可加载的格式。
5. 常见问题与排查技巧实录
5.1 跨裸片ATPG覆盖率不达标怎么办
这是3D IC DFT中最常见的问题。覆盖率不达标的原因通常有三类:
原因一:TSV故障模型定义不完整。如果只定义了开路和短路,没有定义电阻性开路,覆盖率会偏低。解决办法是补充电阻性开路故障模型,并设置合理的电阻阈值。
原因二:跨裸片扫描链长度不匹配。如果逻辑侧扫描链和存储侧wrapper链长度不一致,ATPG工具无法生成有效的跨裸片向量。解决办法是在wrapper链中插入填充位,或者在逻辑侧做链长适配。
原因三:测试模式下的时钟约束不完整。如果ATPG工具在生成向量时没有正确约束跨裸片时钟,生成的向量可能无法在实际芯片上正确执行。解决办法是在ATPG脚本中显式定义跨裸片时钟的时序关系。
5.2 JTAG链路在终测时频繁掉线
JTAG链路掉线通常表现为:能读到IDCODE,但跑边界扫描时TDO输出不稳定,或者跑着跑着TAP状态机卡死。排查思路如下:
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| IDCODE可读,边界扫描失败 | TSV信号完整性劣化 | 用示波器测TSV上的TCK波形 | 降低TCK频率,或在逻辑侧做时钟再生成 |
| TDO输出不稳定 | 共享总线竞争 | 检查多TAP的指令同步逻辑 | 增加总线仲裁机制,确保同一时刻只有一个TAP驱动总线 |
| TAP状态机卡死 | TRST信号未正确复位 | 检查TRST的复位时序 | 在逻辑侧TAP中增加上电复位逻辑,确保TRST可靠复位 |
| 跑一段时间后掉线 | 热应力导致TSV间歇性开路 | 做温度循环测试,监测TSV电阻变化 | 优化键合工艺,或增加TSV冗余设计 |
5.3 测试模式下的功耗超标
3D IC的散热能力比2D芯片差,因为堆叠结构的热阻更大。测试模式下的功耗如果超标,可能导致芯片过热甚至损坏。实测中,扫描链移位操作是功耗大户——所有触发器同时翻转,动态功耗可能是功能模式的3到5倍。
解决办法包括:
- 扫描链分段使能:把扫描链分成多段,每次只使能一段,减少同时翻转的触发器数量。
- 降低测试时钟频率:在功耗超标时,把TCK频率从10MHz降到5MHz,功耗可以降低约40%。
- 优化测试向量顺序:把翻转率高的向量分散排列,避免连续高功耗向量导致局部过热。
实操心得:我建议在DFT架构定义阶段就做测试模式功耗预算,把功耗指标分解到每个裸片和每条扫描链。这样在向量生成阶段就有明确的约束,避免后期返工。
5.4 存储裸片BIST在键合后失效
存储裸片的BIST在裸片级测试时正常,键合后却失效,通常是因为BIST控制器的接口在键合后被TSV直通路径旁路,但旁路逻辑没有正确配置。排查步骤:
- 通过JTAG读取存储裸片的测试模式寄存器,确认当前处于键合后测试模式。
- 检查BIST旁路逻辑的配置位是否正确写入。
- 用扫描链直通法验证TSV连通性,排除TSV故障。
- 如果TSV正常但BIST仍失效,检查BIST控制器的时钟是否在键合后测试模式下被正确门控。
6. 写在最后:一些踩坑之后的个人体会
做3D IC DFT这些年,最大的体会是:架构定义阶段的决策质量,直接决定了后期调试的痛苦程度。我见过太多项目因为RTL阶段没把TSV wrapper设计好,导致键合后测试覆盖率上不去,最后不得不改版流片。也见过因为JTAG链路拓扑没选对,终测时TDO信号质量差到无法调试,只能降频到1MHz勉强跑通。
如果让我给正在做Memory-on-Logic项目的同行一个建议,那就是:在架构定义阶段多花两周时间做DFT方案评审,把TSV测试、跨裸片ATPG、JTAG链路这三个核心问题讨论透。评审时拉上设计、测试、封装三个团队一起,因为DFT方案会直接影响封装引脚定义和测试程序开发。这两周的时间投入,后期能省下至少两个月的调试时间。
另外一个小技巧:在裸片级测试阶段,尽量把TSV的测试wrapper也跑一遍。虽然此时TSV还没有连接,但wrapper本身的逻辑功能可以提前验证。这样键合后如果TSV测试失败,可以快速判断是wrapper问题还是TSV问题,缩小排查范围。这个做法在多个项目中帮我省了不少调试时间,推荐你也试试。