3. March算法详解:经典算法原理与对比
各位同学,咱们今天来聊聊March算法。说实话,这是Memory BIST里最核心的内容之一。我刚开始接触BIST时,看到March C-、March C+这些名字,还以为是什么军事代号呢(笑)。其实说白了,它们就是一组固定的读写序列,用来检测存储器的各种故障。
3.1 March算法基础概念
先说说March算法的基本结构。一个March算法由多个March元素组成,每个元素包含一组操作。比如写0、读0、写1、读1这些。每个操作都会遍历整个地址空间。
我习惯把March算法想象成「扫街」——你拿着一个检查清单,挨家挨户敲门检查。有的算法只检查一次,有的要来回检查好几遍。
核心概念:
- March元素:一组连续的操作,如 (r0, w1) 表示先读0再写1
- 地址顺序:递增(↑)、递减(↓)、任意(⇑)
- 操作类型:r0(读0)、r1(读1)、w0(写0)、w1(写1)
3.2 March C- 算法
March C- 是我个人最常用的算法之一。它只有6个March元素,但覆盖了大部分常见故障。
March C- 算法结构:
⇑ (w0)
↑ (r0, w1)
↑ (r1, w0)
↓ (r0, w1)
↓ (r1, w0)
⇑ (r0)
这个算法能检测什么?嗯,让我想想——
- SAF(固定故障):读写0/1都能覆盖
- TF(跳变故障):每个单元都经历了0→1和1→0的跳变
- AF(地址译码故障):地址顺序变化能暴露问题
- 部分NPSF(邻域敏化故障):相邻单元干扰
我在项目中遇到过一个问题:用March C-测试一个8T SRAM,结果误报率特别高。后来发现是测试时钟太快了,导致读操作不稳定。嗯,这里要注意——March算法的时序参数要根据实际存储器调整。
3.3 March C+ 算法
March C+ 是March C-的增强版。它多了一个March元素,专门用来检测耦合故障。
March C+ 算法结构:
⇑ (w0)
↑ (r0, w1, r1)
↑ (r1, w0, r0)
↓ (r0, w1, r1)
↓ (r1, w0, r0)
⇑ (r0)
你想想看,March C+ 和 March C- 的区别在哪?其实就是每个写操作后面跟了一个读操作。比如 (r0, w1, r1) 这个序列,写完1之后马上读1,能检测到写操作是否成功。
个人经验: 我建议在以下场景优先使用March C+:
- 存储器位宽较大(>64位)
- 工作频率较高
- 对故障覆盖率要求严格
代价就是测试时间增加了约20%。
3.4 March LR 算法
March LR 全称是March Like Running。这个算法有点意思——它专门针对「运行型」故障设计。
March LR 算法结构:
⇑ (w0)
↑ (r0, w1, r1, w0)
↑ (r0, w1, r1, w0)
↓ (r0, w1, r1, w0)
↓ (r0, w1, r1, w0)
⇑ (r0)
为什么叫「Running」?因为它在每个地址上连续做多次读写操作,模拟实际运行时的数据流。我记得有一次做DDR控制器测试,用March C-没发现问题,换成March LR就抓到了几个隐藏的时序故障。
注意: March LR的测试时间大约是March C-的2倍。如果你的芯片对测试时间敏感,要权衡一下。
3.5 March SR 算法
March SR 是专门为「应力测试」设计的。它通过反复读写来暴露存储器的疲劳问题。
March SR 算法结构:
⇑ (w0)
↑ (r0, w1)
↑ (r1, w0)
↓ (r0, w1)
↓ (r1, w0)
↑ (r0, w1, r1, w0)
↓ (r0, w1, r1, w0)
⇑ (r0)
这个算法多了一个「双操作」序列。说白了就是让存储器在短时间内承受更多读写压力。我曾经用March SR去测试一个嵌入式SRAM,结果发现某些单元在连续读写后会出现数据保持问题——这就是所谓的「数据保持故障」。
3.6 算法对比
好了,咱们把四个算法放在一起看看。我整理了一个表格,方便大家对比:
| 算法 | March元素数 | 操作次数 | 故障覆盖率 | 测试时间 |
|---|---|---|---|---|
| March C- | 6 | 10N | SAF, TF, AF, 部分CF | 基准 |
| March C+ | 6 | 14N | SAF, TF, AF, CF | +40% |
| March LR | 6 | 18N | SAF, TF, AF, CF, 运行故障 | +80% |
| March SR | 8 | 22N | SAF, TF, AF, CF, 应力故障 | +120% |
(注:N为地址数,操作次数按每个地址计算)
你可能会问:那是不是直接用March SR就好了?其实不是。我个人的经验是:
- 量产测试:用March C-就够了,速度快
- 特性分析:用March C+或March LR
- 可靠性验证:用March SR
3.7 实际应用建议
最后给大家几个实用建议:
- 不要盲目追求高覆盖率。测试时间每增加一倍,测试成本就翻倍。要根据产品需求选择。
- 注意地址顺序的影响。递增和递减能覆盖不同的地址译码故障。我建议两种顺序都用。
- 考虑组合使用。比如先用March C-快速筛选,再用March LR做深度检测。
避坑指南: 我曾经在一个项目中,直接用March C-去测试一个异步SRAM。结果发现测试结果时好时坏。后来才意识到——异步存储器的时序和同步存储器不一样,需要调整测试时钟的相位。所以,算法选对了,时序也要调对。
好了,March算法就讲到这里。下一章咱们聊聊如何把这些算法实现成硬件电路。有什么问题随时问我。