ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MBIST测试中GO与DONE握手信号时序解析与故障排查指南

MBIST测试中GO与DONE握手信号时序解析与故障排查指南 1. MBIST到底在芯片测试里扮演什么角色第一次接触MBIST的人多半会被一堆缩写砸晕BIST、BISR、GO、DONE、FAIL、RUN……但如果你把内存想象成一栋大楼MBIST就是那支在交付前逐层逐户检查水电的验收队。它的全称是Memory Built-In Self-Test内建自测试核心思路是把测试逻辑直接做进芯片内部让内存自己体检而不是依赖外部昂贵的ATE设备逐条向量去灌。为什么非要搞这么一套自测试机制因为现代SoC里嵌入式SRAM、ROM、寄存器堆的数量动辄几十上百个实例靠外部测试机台逐个访问测试时间会爆炸引脚也不够用。MBIST控制器通常挂在系统总线上或者由专门的测试接口驱动它自己生成地址、数据、控制信号把一套算法比如March C-、Checkerboard、Walking 1/0跑完最后只吐出一个通过/失败的结论。这个结论的对外表达最典型的就是GO和DONE这两个握手信号。从工程视角看MBIST解决的是三个层面的问题。第一是可测性内存阵列内部节点在封装后根本探不到必须靠内建逻辑把故障逼到可观测的输出上。第二是测试成本片上自测可以并行跑多个内存实例测试时间从分钟级压到毫秒级。第三是诊断粒度好的MBIST不仅能告诉你坏了还能告诉你是哪个地址、哪个数据位、哪一类故障固定型、跳变型、耦合型。GO和DONE这对信号本质上是MBIST控制器与外部世界测试机、调试器、系统固件之间的发令枪和终点线。外部拉高GO等于说开始跑控制器跑完所有算法后拉高DONE等于说跑完了结果在状态寄存器里。听起来简单但实际调试中90%的内存故障误判都出在对这两个信号时序和语义的理解偏差上。我见过太多人一看到DONE拉高就断言内存坏了结果查了半天发现是GO根本没被正确同步测试压根没启动。这篇文章面向的是做芯片验证、固件调试、量产测试的工程师也适合刚接触DFT可测性设计想搞懂握手逻辑的初学者。我会把GO/DONE的时序语义、状态机行为、常见误判场景、以及如何用它们快速定位故障一层层拆开讲。不堆术语讲人话重点放在你拿到一块板子或一个仿真环境怎么用这两个信号把问题揪出来。2. GO与DONE的时序语义别把握手信号当普通GPIO2.1 GO不是电平使能而是启动脉冲很多人下意识把GO当成一个使能信号认为只要保持高电平MBIST就会一直跑。这个理解在部分实现里能凑合工作但在严格的控制器里会出大问题。GO的典型语义是边沿触发的启动命令控制器在采样到GO的有效边沿通常是上升沿同步到测试时钟后才把内部状态机从IDLE推到RUN。如果你把GO一直拉高控制器跑完一轮后可能因为GO仍然有效而重新启动陷入反复测试的死循环DONE信号就会周期性抖动看起来像内存时好时坏。正确的做法是GO给一个至少覆盖一个测试时钟周期的脉冲然后拉低等待DONE。这个脉冲宽度不能太窄否则跨时钟域同步时会丢沿。我一般建议GO的有效宽度至少是测试时钟周期的2到3倍如果GO来自另一个时钟域还要加上两级同步器的延迟余量。提示GO的有效极性在不同IP里可能是高有效也可能是低有效拿到手册第一件事就是确认极性别凭经验想当然。2.2 DONE拉高不等于测试通过这是最致命的误解。DONE的语义是测试流程结束不是测试通过。测试结果在另一个地方——通常是状态寄存器里的PASS/FAIL位或者专门的FAIL标志、错误地址寄存器。DONE只是告诉你可以来读结果了。我遇到过的一个真实案例某项目固件里判断内存好坏只看DONEDONE一高就认为OK结果一批板子在高温下偶发数据错误。后来查出来是MBIST确实检测到了故障FAIL位被置起但固件没读DONE照样拉高于是故障被静默吞掉。这个坑的代价是整批返工。所以正确的读取顺序是等DONE有效 → 读状态寄存器 → 检查PASS/FAIL → 如果FAIL再读错误地址和错误数据寄存器定位具体位置。DONE只是门铃不是成绩单。2.3 握手时序的完整链路把一次完整的MBIST交互拆开大概是这样的控制器处于IDLEDONE为低或无效态。外部确认时钟稳定、复位释放、内存供电正常。外部给出GO脉冲。控制器同步GO状态机进入RUN开始按算法遍历地址。测试期间DONE保持无效外部应轮询或等待中断。所有算法跑完控制器更新状态寄存器然后拉高DONE。外部检测到DONE读取结果寄存器。外部拉低GO如果还没拉低或给出下一次启动命令控制器回到IDLE。这个链路里第5步到第6步的等待时间取决于内存大小和算法复杂度。一个64KB的SRAM跑March C-在100MHz测试时钟下大概是几毫秒量级如果是几MB的实例可能到几十毫秒。等待期间不要频繁去读状态寄存器有些控制器在读寄存器时会插入等待周期反而拖慢测试。2.4 跨时钟域带来的采样陷阱GO往往来自系统时钟域而MBIST控制器跑在测试时钟域两者频率和相位都可能不同。如果同步器设计不当GO脉冲可能在跨域时被展宽或丢失。表现就是你明明给了GODONE却永远不来或者偶尔来一次。排查这类问题的土办法是在仿真里把两个时钟的频率比设成非整数倍比如3:7跑长时间回归看GO被采到的概率。如果发现丢沿检查同步器是不是只有一级寄存器或者GO脉冲宽度是否小于目标时钟周期。经验值是GO宽度至少覆盖目标时钟域的2个周期再加同步器级数。3. 用GO/DONE定位故障的完整排查链路3.1 第一步确认测试真的启动了DONE不来先别怀疑内存。按这个顺序查GO有没有真的到达控制器引脚用示波器或仿真波形看控制器端口的GO而不是驱动端的GO。GO的极性对不对低有效被当成高有效等于没启动。复位释放了吗很多控制器在复位有效期间会屏蔽GO。测试时钟在跑吗没有时钟状态机永远停在IDLE。我习惯在控制器端口上挂一个计数器统计GO有效沿的次数。如果次数是0问题在启动链路如果是1但DONE不来问题在测试执行如果次数大于1说明GO没被正确拉低控制器在反复重启。3.2 第二步DONE来了但结果异常DONE正常拉高但读出来的PASS/FAIL不对或者错误地址明显不合理。这时候要区分是真故障还是测试配置错误。真故障的特征错误地址集中在某个区域或者某个数据位固定出错重复测试结果一致。测试配置错误的特征错误地址随机跳变或者每次跑结果都不一样或者错误地址超出内存实际范围。常见的配置错误包括算法选错比如对某些内存类型用了不适用的March变体、地址范围寄存器没配对、数据背景模式设置错误。这些都会让MBIST误报。我一般会先用一个已知良好的内存实例跑一遍确认配置无误再去测可疑实例。3.3 第三步区分固定型故障和耦合型故障拿到错误地址后可以进一步判断故障类型。固定型故障stuck-at表现为某个位恒为0或恒为1无论写什么读回来都一样。耦合型故障coupling表现为写某个地址会影响相邻地址的值。判断方法让MBIST跑两种不同的算法。March C-对固定型故障敏感March SS对耦合型故障覆盖更好。如果两种算法都报同一地址大概率是固定型如果只有某种算法报可能是耦合型或跳变型。这个信息对后续做BISR内建自修复很重要因为修复策略不同。3.4 第四步把错误地址映射回物理位置MBIST报的是逻辑地址但物理上内存可能是多bank、多列交错的。错误地址需要经过地址映射才能定位到具体的物理单元。这一步经常被忽略导致明明报了这个地址去查却没问题。映射关系通常在内存编译器的数据手册里或者由后端提供的address scrambling表。我建议在项目早期就把这个映射表整理成脚本输入逻辑地址直接输出物理bank/row/column排查效率能提升好几倍。4. 那些年我们踩过的GO/DONE误判坑4.1 坑一把DONE当复位信号用有人图省事把DONE直接接到某个逻辑的复位端想实现测试完自动复位。结果DONE拉高的瞬间控制器自己也被复位了状态寄存器还没来得及读就被清掉。正确做法是DONE只作为中断或轮询标志读取结果后再由软件显式清除或进入下一状态。4.2 坑二GO脉冲太窄被同步器吃掉前面提过但值得再强调。仿真里时钟理想窄脉冲也能过上了板子有时钟抖动和相位差窄脉冲直接丢。我现在的默认配置是GO宽度取目标时钟周期的4倍宁可多等几个周期也不要赌同步器。4.3 坑三忽略DONE的建立时间DONE拉高后状态寄存器里的结果可能还没稳定。有些控制器会在DONE有效后延迟几个周期才更新结果寄存器。如果外部一看到DONE就立刻读可能读到旧值。稳妥的做法是DONE有效后再等2到3个周期或者查手册确认结果寄存器的更新时序。4.4 坑四多实例共享GO/DONE导致串扰一个控制器管多个内存实例时GO和DONE可能是共享的靠实例选择信号区分。如果选择信号和GO的时序没对齐可能启动了错误的实例或者DONE来自另一个实例。排查时要把实例选择信号和GO/DONE一起抓波形确认三者对齐。4.5 坑五低功耗模式下GO被门控芯片进入低功耗状态时测试时钟可能被门控GO即使给了也进不去。如果项目有低功耗需求要确认MBIST启动前时钟已经恢复或者控制器有专门的唤醒序列。5. 从信号到结论一套可复用的调试方法论5.1 建立信号基线在测可疑内存之前先在一个已知良好的实例上抓一套完整的GO/DONE波形记录GO宽度、GO到DONE的延迟、DONE宽度、结果寄存器读取窗口。这套基线就是后续对比的参照。任何偏离基线的行为都是排查线索。5.2 分层排查表现象优先排查次优先排查DONE永不来GO是否到达、极性、时钟、复位同步器、低功耗门控DONE来了但FAIL随机测试配置、算法选择、地址范围电源噪声、时钟抖动DONE来了但FAIL固定真故障、地址映射修复策略DONE周期性抖动GO未拉低、控制器重启状态机设计结果寄存器读到旧值DONE到读取的延迟寄存器更新时序这张表是我自己调试时总结的基本覆盖了八成以上的场景。遇到新问题先往表里套套不上再深挖。5.3 仿真与实测的差异管理仿真里GO/DONE干干净净实测里全是毛刺和抖动。差异主要来自三处时钟质量、电源完整性、跨域同步。我的做法是在仿真里主动注入时钟抖动和相位偏移把最坏情况跑出来。如果仿真在最坏情况下能过实测基本稳。5.4 把调试经验固化成脚本每次排查完把用到的波形抓取命令、寄存器读取序列、地址映射转换整理成脚本。下次遇到类似问题跑脚本就能复现排查路径。这比写文档有用得多因为脚本是可执行的文档会过时。6. 写在最后的一点个人体会MBIST的GO/DONE看起来只是两个信号但它们背后是一整套测试握手协议。我刚开始做DFT的时候也觉得这两个信号没什么好讲的直到被一个GO给了DONE不来的问题卡了整整两天最后发现是同步器少了一级。从那以后我对任何握手信号都保持敬畏——先确认语义再确认时序最后才怀疑被测对象。如果你现在正卡在某个内存故障定位上我的建议是先把GO和DONE的波形抓出来对照本文的排查链路走一遍。大部分时候问题不在内存本身而在你和内存之间的那套握手逻辑。把握手搞对了内存是好是坏DONE之后的状态寄存器会明明白白告诉你。
返回列表