ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MBIST测试中GO/DONE信号握手协议与故障定位实战

MBIST测试中GO/DONE信号握手协议与故障定位实战 1. MBIST到底是什么为什么GO/DONE两个信号值得单独拎出来讲第一次接触MBIST的人往往会被一堆缩写砸晕BIST、BISR、TAP、JTAG、Controller、March算法……但真正到了芯片回片调试阶段你会发现工程师盯得最紧的其实就两个信号GO和DONE。一个负责发令一个负责交卷。把这两个信号吃透内存故障定位的效率能提升一大截。MBIST全称Memory Built-In Self-Test中文叫存储器内建自测试。它的核心思路很朴素在芯片内部集成一套专门测试SRAM、ROM、DRAM等存储阵列的硬件电路上电或按需触发后由这套电路自动完成写入、读取、比较、诊断最后把结果通过状态信号或寄存器暴露出来。相比把内存测试交给外部ATE设备MBIST的优势在于频率高、覆盖全、可重复、可片上诊断尤其是大容量存储阵列外部测试机根本跑不到那么高的频率。那GO和DONE为什么重要因为它们构成了MBIST控制器与外部世界之间最基础的握手协议。GO是启动信号告诉控制器可以开始跑了DONE是完成信号告诉外部我跑完了结果在状态寄存器里。很多工程师在调试时遇到测试卡住不动或者结果读出来全是0追根溯源十有八九是GO/DONE的时序、极性、握手方式没对齐。这篇文章适合三类人看一是刚接触DFT的验证工程师二是需要做芯片bring-up的固件/驱动工程师三是想理解MBIST诊断流程的测试工程师。我会从信号定义、握手协议、实操流程、故障定位、常见坑几个维度展开尽量把每个为什么讲清楚让你看完能直接对着波形和寄存器干活。提示本文讨论的GO/DONE是MBIST控制器对外暴露的通用状态信号不同IP厂商可能命名为start/run_done、bist_go/bist_done、mbist_start/mbist_done等逻辑本质一致阅读时按你项目里的实际命名对应即可。2. GO/DONE信号的底层逻辑与握手协议拆解2.1 GO信号不只是一个上升沿那么简单很多人以为GO就是一个简单的脉冲拉高一下控制器就开始跑。实际项目里GO的处理方式直接决定了测试的可靠性和可重复性。GO信号通常有三种常见形态电平敏感型GO保持高电平期间控制器持续运行拉低则中止。这种设计适合需要动态暂停的场景但容易因为毛刺误触发。边沿触发型检测到GO的上升沿后启动一次完整测试之后GO的状态不再影响运行。这是最常见的做法抗毛刺能力强。脉冲握手型GO发出一个脉冲控制器回一个ack双方确认后才开始。这种最稳妥但时序最复杂。为什么要在意这些区别因为边沿触发型如果GO信号上有毛刺可能触发多次测试导致DONE信号出现多次翻转外部状态机误判。我见过一个项目GO走线太长又没做同步处理结果每次上电测试都跑两遍功耗超标查了两周才发现是毛刺惹的祸。GO信号还有一个容易被忽略的点它和时钟域的关系。如果GO来自慢速的APB时钟域而MBIST控制器跑在高速核心时钟域中间必须做跨时钟域同步。常见做法是两级触发器打拍再加边沿检测。如果省掉这一步GO的建立/保持时间在高速域里可能不满足控制器采样到亚稳态表现就是有时候能跑有时候跑不起来这种间歇性故障最难查。2.2 DONE信号完成不等于成功DONE信号最容易被误解的地方就是把它当成测试通过的标志。DONE只表示测试流程结束不表示测试结果合格。合格与否要看状态寄存器里的pass/fail位或者看错误地址寄存器有没有内容。DONE的常见形态也有几种电平型测试完成后DONE拉高并保持直到下一次GO到来或软件清除。脉冲型测试完成后DONE输出一个脉冲宽度通常是一个或几个时钟周期。计数型DONE配合一个完成计数器表示跑完了多少个pattern或多少个地址。这里有个实操中非常关键的细节DONE的采样时机。如果DONE是脉冲型而外部状态机采样太慢可能直接漏掉。我一般建议在验证阶段就用逻辑分析仪或片上ILA抓DONE确认脉冲宽度至少覆盖外部采样时钟的2到3个周期。如果不够要么在RTL里加宽要么在外部用边沿检测加锁存。还有一个坑DONE在复位后的初始状态。有些IP默认DONE为高表示空闲即完成有些默认低。如果外部逻辑假设DONE初始为低结果IP实际为高上电后状态机直接跳到测试完成分支读了一堆无效数据。这种问题在集成阶段特别常见一定要对着IP手册确认复位值。2.3 GO/DONE握手时序一张表看清四种组合把GO的触发方式和DONE的反馈方式组合起来实际项目里常见四种握手模式。下面这张表是我根据多个项目经验整理的方便你快速对照自己项目属于哪种握手模式GO形态DONE形态适用场景风险点模式A边沿触发电平保持大多数SoC上电自检DONE未清除导致下次误判模式B边沿触发单脉冲低功耗快速测试脉冲漏采模式C电平敏感电平保持需动态暂停的调试GO毛刺误触发模式D脉冲握手脉冲应答高可靠汽车电子时序复杂握手超时理解这张表的意义在于当你发现测试行为异常时先确认自己项目用的是哪种模式再针对性排查。比如模式B下DONE读不到优先查采样时钟和脉冲宽度模式A下DONE一直是高优先查清除逻辑。2.4 为什么MBIST要用GO/DONE而不是直接读寄存器有人会问既然有状态寄存器为什么不直接轮询寄存器还要单独搞GO/DONE信号原因有三个。第一速度。MBIST测试可能跑几十毫秒甚至上百毫秒如果CPU一直轮询寄存器总线被占死其他任务没法跑。用DONE做中断或DMA触发CPU可以先去干别的。第二硬件联动。DONE可以直接接到电源管理单元、时钟控制器或复位控制器实现测试完成自动切时钟测试失败自动复位等硬件级联动不依赖软件。第三调试可见性。GO/DONE是物理信号可以直接挂示波器、逻辑分析仪或者片上ILA抓取。寄存器读值只能看到结果看不到时序关系。定位为什么没跑起来这类问题时信号波形比寄存器值有用得多。3. 从GO拉高到DONE返回一次完整MBIST测试的实操流程3.1 测试前的准备工作别急着拉GO很多人一上来就拉GO结果测试失败回头查半天发现是准备工作没做。MBIST测试前至少要做以下几件事确认时钟已稳定MBIST控制器需要时钟才能跑。如果时钟还没锁定就拉GO控制器可能进入未知状态。建议在时钟稳定标志置位后再发GO。确认复位已释放复位期间GO无效。有些IP要求复位释放后等待若干周期才能接受GO这个等待时间手册里一般会写。配置测试模式寄存器比如选择March算法类型、选择测试地址范围、选择是否开启诊断模式。这些配置必须在GO之前完成。清除上一次的DONE和状态寄存器如果DONE是电平保持型不清除的话新的GO发出后DONE还是高外部逻辑分不清是新结果还是旧结果。确认内存阵列已上电有些低功耗设计里内存阵列独立供电测试前要确保电源域已开启。我一般会把这些准备步骤写成一个checklist每次bring-up对着打勾。看起来繁琐但能省下大量debug时间。3.2 GO信号的发出时序和同步的实际处理假设你的项目用的是边沿触发型GO来自APB时钟域MBIST控制器在核心时钟域。下面是一段典型的同步和边沿检测逻辑用Verilog示意// 跨时钟域同步GO信号 reg go_sync1, go_sync2, go_sync3; always (posedge clk_core or negedge rst_n) begin if (!rst_n) begin go_sync1 1b0; go_sync2 1b0; go_sync3 1b0; end else begin go_sync1 go_apb; go_sync2 go_sync1; go_sync3 go_sync2; end end // 上升沿检测 wire go_pulse go_sync2 ~go_sync3;这段代码的关键点三级触发器。前两级做同步第三级做边沿检测。为什么是三级不是两级因为两级同步后信号已经稳定但要做边沿检测还需要一个延迟版本所以实际用了三级。如果只用两级边沿检测会缺少参考点。发出GO的软件侧操作通常是写一个寄存器位// 假设MBIST控制寄存器地址为0x4000_1000 // bit0为GO位写1触发 #define MBIST_CTRL_REG (*(volatile uint32_t *)0x40001000) #define MBIST_GO_BIT (1 0) void mbist_start(void) { MBIST_CTRL_REG | MBIST_GO_BIT; }注意这里用的是|而不是直接赋值避免误清除其他配置位。有些IP要求GO位自动清除写完就归零有些要求软件手动清除。这个必须看手册搞错了会导致重复触发或无法触发。3.3 等待DONE轮询、中断还是DMADONE的等待方式直接影响系统效率。三种方式各有适用场景轮询最简单适合bring-up阶段和裸机环境。缺点是占CPU。轮询时要注意加超时否则测试卡死时CPU也跟着卡死。中断DONE接到中断控制器测试完成后触发中断。适合有OS的环境。要注意中断清除和DONE清除的顺序先清哪个后清哪个手册一般有要求。DMA/硬件联动DONE直接触发DMA搬运结果或者触发电源管理切换。适合低功耗场景。轮询的典型代码#define MBIST_STATUS_REG (*(volatile uint32_t *)0x40001004) #define MBIST_DONE_BIT (1 0) #define MBIST_TIMEOUT (1000000) int mbist_wait_done(void) { uint32_t timeout MBIST_TIMEOUT; while (!(MBIST_STATUS_REG MBIST_DONE_BIT)) { if (--timeout 0) { return -1; // 超时 } } return 0; }超时值怎么定我的经验是按最坏情况测试时间的3到5倍来设。比如手册说最长测试时间10ms时钟100MHz那大概100万个周期超时设300万到500万比较稳妥。设太小会误报超时设太大卡死时等太久。3.4 读取结果DONE之后做什么DONE置位后别急着下结论。正确的读取顺序是读全局状态寄存器看pass/fail位。pass表示所有被测内存都通过fail表示至少有一个失败。如果fail读失败地址寄存器一般会记录第一个失败的地址、失败的数据位、失败的pattern类型。如果支持诊断模式读诊断RAM有些MBIST控制器会把所有失败地址存到一块小RAM里可以批量读出分析。清除DONE和状态寄存器为下一次测试做准备。这里有个实操心得先读失败地址再清状态。有些IP在清除状态的同时会把失败地址也清掉顺序反了就丢数据了。我踩过这个坑后来养成习惯读结果和清状态分成两个函数中间加日志。3.5 一次完整测试的时序全景把上面的步骤串起来一次完整的MBIST测试时序大致如下阶段操作关键信号注意事项准备时钟稳定、复位释放、配置寄存器clk, rst_n等待手册规定的准备周期清除清DONE、清状态done0确认清除生效再继续启动写GO位go上升沿确认跨时钟域同步运行等待DONEdone设超时防卡死读取读状态、读失败地址寄存器读先读地址后清状态收尾清DONE、清状态done0为下次测试准备这张表建议打印出来贴在工位上bring-up阶段对着走能避免大部分低级错误。4. 用GO/DONE快速定位内存故障实战排查思路4.1 GO发出后DONE一直不来五步排查法这是最常见的故障现象。GO拉高了等半天DONE不动。按下面五步走基本能定位到根因第一步确认GO真的到了控制器。用ILA或示波器抓控制器输入端的GO信号。如果软件写了寄存器但控制器端没看到问题在跨时钟域同步或寄存器映射。第二步确认时钟在跑。抓控制器的时钟输入。如果时钟停了控制器当然不动。常见原因是时钟门控没打开或者时钟配置寄存器没配对。第三步确认复位已释放。抓复位信号。如果复位一直有效控制器处于复位态不响应GO。第四步确认配置合法。有些IP在配置非法时会拒绝启动比如测试地址范围超出实际内存大小。读配置寄存器回读确认写入生效。第五步确认没有卡在某个pattern。如果控制器支持暂停可能卡在某个特定pattern上。读当前地址寄存器看卡在哪个地址再分析那个地址对应的内存单元。我遇到过一次五步走完发现是第二步——时钟门控没开。因为那个时钟域默认关闭软件忘了开。这种问题看寄存器看不出来必须抓时钟信号。4.2 DONE来了但结果全是fail区分真故障和假故障DONE正常返回但状态寄存器报fail。这时候要区分是内存真的坏了还是测试配置有问题。常见的假故障原因测试地址范围配错比如实际内存只有64KB配置成了128KB超出部分读出来全是随机值当然fail。时钟频率超出规格MBIST测试频率有上限超频跑会导致时序违例读出错数据。电源电压不足低电压下内存单元可能读写不稳定尤其是SRAM。初始化未完成有些内存需要先初始化才能测试跳过初始化直接测会fail。pattern类型不匹配不同故障类型需要不同March算法用错算法可能漏测或误测。区分方法先跑一个已知良好的小内存块。如果小内存块pass大内存块fail大概率是配置或电源问题如果小内存块也fail可能是控制器本身或时钟问题。4.3 DONE信号抖动或多次翻转时序问题定位DONE抖动通常有三个原因GO毛刺导致多次触发前面提过边沿触发型GO对毛刺敏感。抓GO波形看有没有窄脉冲。DONE跨时钟域未同步DONE从核心时钟域到APB时钟域如果没同步采样到亚稳态表现为抖动。DONE清除逻辑竞争软件清DONE和硬件置DONE同时发生产生竞争。排查方法抓GO和DONE的原始波形看抖动是否与GO相关。如果相关查GO毛刺如果不相关查DONE同步。4.4 常见问题速查表下面这张表是我根据多个项目经验整理的MBIST GO/DONE常见问题速查表建议收藏现象可能原因排查方法解决措施GO后DONE不来时钟未开抓时钟信号打开时钟门控GO后DONE不来复位未释放抓复位信号释放复位GO后DONE不来配置非法回读配置寄存器修正配置DONE来了但fail地址范围错核对内存大小修正范围DONE来了但fail电源不足测电源电压提高电压或降频DONE抖动GO毛刺抓GO波形加滤波或同步DONE抖动跨时钟域未同步查同步逻辑加两级触发器DONE读不到脉冲太窄抓DONE波形加宽脉冲或锁存DONE一直高未清除查清除逻辑加清除操作测试跑两遍GO重复触发抓GO边沿加边沿检测4.5 独家避坑技巧三个手册上不会写的经验技巧一GO之前先读一次状态寄存器。这一步的目的是确认上一次测试的状态已清除。如果读出来DONE还是高说明清除没生效这时候发GO会出问题。养成发GO前先读状态的习惯能避免很多间歇性故障。技巧二DONE的采样用边沿检测加锁存不要直接用电平。即使DONE是电平保持型也建议在外部做一次边沿检测并锁存这样软件读到的永远是曾经完成过的标志不会因为DONE被意外清除而丢失完成事件。技巧三超时时间按测试时间的两倍设但超时后不要立即复位。超时后先读当前地址寄存器和状态寄存器看看卡在哪里这些信息对定位问题非常宝贵。直接复位会丢失现场。5. MBIST测试的进阶话题与扩展方向5.1 多内存实例的GO/DONE管理实际SoC里往往有多个内存实例每个实例可能对应一个MBIST控制器或者多个实例共享一个控制器。GO/DONE的管理方式直接影响测试时间。常见方案有两种串行测试一个实例测完再测下一个。GO/DONE逐个握手。优点是简单缺点是测试时间长。并行测试所有实例同时启动等所有DONE都返回。优点是快缺点是需要更多逻辑来汇总DONE且功耗峰值高。我一般建议小内存串行大内存并行。小内存测试时间短串行省逻辑大内存测试时间长并行省时间。具体阈值看项目需求一般单个实例测试超过1ms就考虑并行。并行测试的DONE汇总逻辑// 假设有4个MBIST实例 wire [3:0] done_vec; wire all_done done_vec; // 所有实例都完成 wire any_done |done_vec; // 任一实例完成用all_done触发下一步用any_done做进度指示。5.2 GO/DONE在低功耗测试中的特殊处理低功耗设计里MBIST测试往往和电源域、时钟域紧密耦合。几个特殊处理测试期间保持电源稳定MBIST测试时内存阵列功耗较高如果电源管理单元误切电源测试中断。建议测试期间锁定电源域。测试完成后自动切时钟DONE可以触发时钟控制器把MBIST时钟切回正常时钟省电。分区域测试大内存分多个区域逐个上电测试降低峰值功耗。每个区域有自己的GO/DONE。这些处理需要在系统层面协调不是MBIST控制器单独能搞定的。建议在架构阶段就把GO/DONE的联动关系定义清楚。5.3 从GO/DONE看MBIST的可测试性设计GO/DONE的设计质量其实反映了整个MBIST的可测试性水平。好的设计应该做到GO/DONE可观测能挂ILA能引到padGO/DONE可控制软件能发GO能清DONEGO/DONE有状态不只是脉冲还有状态寄存器记录历史GO/DONE有保护超时、毛刺过滤、跨时钟域同步如果你在review别人的MBIST设计先看GO/DONE这四点做到没有基本能判断这个设计的成熟度。5.4 调试工具的选择ILA、逻辑分析仪还是示波器抓GO/DONE波形三种工具各有优劣ILA集成逻辑分析仪片上不占引脚能抓深层信号但需要FPGA原型或支持ILA的芯片。适合RTL验证和FPGA原型阶段。逻辑分析仪外部需要引引脚能抓多路信号适合芯片bring-up阶段。示波器看模拟特性比如毛刺、建立保持时间适合信号完整性分析。我的建议RTL阶段用ILAbring-up阶段用逻辑分析仪怀疑信号完整性时用示波器。三者配合基本能覆盖所有调试场景。6. 写在最后几个我踩过的坑和真实体会MBIST的GO/DONE看起来简单但真正在项目里跑通、跑稳需要关注的细节非常多。我印象最深的一次是一个项目上电自检偶尔失败概率大概百分之一。查了一周最后发现是GO信号的走线太长和一条高频时钟线平行走了一段耦合了毛刺。解决方案是在GO上加了一个小的RC滤波同时在RTL里加了毛刺过滤。这种问题看代码看不出来看寄存器也看不出来必须抓波形。还有一次DONE信号在低温下偶尔读不到。常温测试一切正常低温就出问题。最后定位是DONE的驱动能力不足低温下驱动变弱外部采样失败。解决方案是在DONE上加了一级缓冲。这个案例告诉我MBIST测试不仅要看逻辑还要看电气特性尤其是极端工况下。最后一个体会GO/DONE的调试80%的问题出在时序和同步上20%出在配置上。所以每次遇到问题先抓波形看时序再看配置寄存器。这个顺序能帮你快速缩小范围。如果你正在做MBIST相关的项目建议把GO/DONE的握手协议画成一张时序图贴在工位上。每次调试对着图走比翻手册快得多。这个内容后续还可以扩展到BISR内建自修复的GO/DONE联动以及MBIST和扫描测试的协同调度有机会再展开聊。
返回列表