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 实际应用建议

最后给大家几个实用建议:

  1. 不要盲目追求高覆盖率。测试时间每增加一倍,测试成本就翻倍。要根据产品需求选择。
  2. 注意地址顺序的影响。递增和递减能覆盖不同的地址译码故障。我建议两种顺序都用。
  3. 考虑组合使用。比如先用March C-快速筛选,再用March LR做深度检测。

避坑指南: 我曾经在一个项目中,直接用March C-去测试一个异步SRAM。结果发现测试结果时好时坏。后来才意识到——异步存储器的时序和同步存储器不一样,需要调整测试时钟的相位。所以,算法选对了,时序也要调对

好了,March算法就讲到这里。下一章咱们聊聊如何把这些算法实现成硬件电路。有什么问题随时问我。