分为三个层次:底层物理缺陷层,中间功能层,以及性能层;
- FaultModel:这是有一系列的论文、背景支持的,我们最终采用的是精简的失效模型来设计算法;
- 功能层就是测一下每个cell功能是否正常,常规做法就是直接memtester,但是跟底层貌似有些重合,需确认;
- 性能层就是我们在改变电压、时序等参数的时候,你跑pattern能跑到多高的频率。
基于FaultMOdel来进行测试,而这个缺陷模型又是怎么来的呢? 这是由于以前出现过具体的某个物理缺陷,然后工程师们就抽象出了这个error,然后建立一个模型用来验证这样缺陷,这就是缺陷模型的由来;
内存模型从底层物理层至行为层如下图所示,每一个环节都有可能出问题,因此每个部分均须建模来进行测试。
四层模型分别是:
- Behavioral model (memtester、跑系统及应用)
- Functional model(Fault Model)
- Electrical model
- Layout model (rarely reported)
DRAM架构如上图所示,分地址解码器、内存单元阵列和读写逻辑三大部分。
因此缺陷模型也对应分为地址解码缺陷、内存单元缺陷、动态缺陷三个部分。
三个部分的缺陷概览及分类如下:(来自历年论文)
1. Stuck-at fault (SAF): cell or line s-a-0 or s-a-1 [1].
2. Stuck-open fault (SOF): open cell or broken line .
3. Transition fault (TF): cell fails to transit [1].
4. Data retention fault (DRF): cell fails to retain its logic value after some specified time due to, e.g., leakage, resistor opens, or feedback path opens [2].
5. Coupling fault (CF): Coupling faults are of three types [1].
- Inversion coupling fault (CFin): a transition in one cell (aggressor) inverts the content of another cell (victim). [1,3]
- Idempotent coupling fault (CFid): a transition in one cell forces a fixed logic value into another cell. [1,3]
- State coupling fault (CFst): a cell/line is forced to a fixed state only if the coupling cell/line is in a given state (a.k.a. pattern sensitivity fault (PSF)). [1,3]
6. Bridging fault (BF): short between cells (can be AND type or OR type) [1]
7. Neighborhood Pattern Sensitive Fault (NPSF) [1]
8. Active (Dynamic) NPSF [1]
9. Passive NPSF [1]
10. Static NPSF [1]
1. No cell accessed by certain address [1,3]. 2. Multiple cells accessed by certain address [1,3]. 3. Certain cell not accessed by any address [1,3]. 4. Certain cell accessed by multiple addresses [1].
1. Recovery faults: when some part of the memory cannot recover fast enough from a previous state [2].
- Sense amplifier recovery: sense amplifier saturation after reading/writing a long string of 0s or 1s.
- Write recovery: a write followed by a read or write at a different location resulting in reading or writing at the same location due to slow address decoder.
2. Disturb faults: victim cell forced to 0 or 1 if we read or write aggressor cell (may be the same cell) [2].
3. Data Retention faults: memory loses its content spontaneously, not caused by read or write [2].
- DRAM refresh fault: Refresh-line stuck-at fault
- DRAM leakage fault:
- Sleeping sickness—loose data in less than specified hold time (typically hundreds of micro sec to tens of ms); caused by charge leakage or environment sensitivity; usually affects a row or a column.
- Static data losses—defective pull-up device Inducing excessive leakage currents which can change the state of a cell Checkerboard pattern triggers max leakage.
SAF:Stuck-At Fault
- The logic value of a cell or a line is always 0 or 1.
覆盖的功能缺陷有:Cell stuck、Driver stuck、Read/Write line stuck、chip-select line stck、Data line stuck、open sircuit in data line.
《essentials-of-electronic-testing-for-digital-memory-and-mixed-signal-vlsi-circuits》@2002
TF: Transition Fault
- A cell or a line that fails to undergo a 0->1 or a 1->0 transition.
覆盖缺陷有: cell can be set to 0 but not to 1 (or vice versa 反之亦然).
《essentials-of-electronic-testing-for-digital-memory-and-mixed-signal-vlsi-circuits》@2002
CF: Coupling Fault
- A write operation to one cell changes the content of a second cell.
覆盖功能缺陷有: short circuit between data lines、 crosstalk between data lines.
《essentials-of-electronic-testing-for-digital-memory-and-mixed-signal-vlsi-circuits》@2002
NPSF: Neighborhood Pattern Sensitive Fault
- The content of a cell, or the ability to change its content, is influenced by the contents of some other cells in the memory.
覆盖功能缺陷有: pattern sensitive cell interaction.
《essentials-of-electronic-testing-for-digital-memory-and-mixed-signal-vlsi-circuits》@2002
AF: Address decoding fault
- With a certain address, no cell will be accessed.
- A certain cell is never accessed.
- With a certain address, multiple cells are accessed simultaneously.
- A certain cell can be accessed by multiple addresses.
覆盖功能缺陷有:address line stuck, open circuit in address line, shorts between address lines, open circuit in decoder, wrong address access, multiple simutaneous address access(多地址同时访问),
《essentials-of-electronic-testing-for-digital-memory-and-mixed-signal-vlsi-circuits》@2002
aa: 是电容短路,从而导致SA0(stuck at 0)缺陷; bb: 是capacitor-WL短路,导致SA1缺陷; cc: 两根WLs线短路,同一列的这两个cell出现AND bridging缺陷,就是与操作了嘛!; dd:临近状态耦合缺陷; ee:这个cell与旁边这一整列的cell都AND bridging fault了; ff: 两个bit lines短路,这样子的话每个word line里面都有两个cell是AND bridging fault了。
WL 和 BL短路会使得交点处的cell出现SA1缺陷:
- 比如下图中,当读交点处的cell时,WL被拉高,然后对应BL也被拉高了,因此锁死在1状态;
- 同时对应写1到交叉cell处是看不出来问题的,但是0就无论如何也写不进去了,因为总是被锁死在1啊!
- 显然同列的都被锁死在1了,同样的同一行也被锁死在1(存疑!!?)
在底层缺陷其实是有如下这样的许多种类,在memtester里面的test_stuck_address()是能覆盖测试的,但是只能知道哪个地址出异常了,却不能定位出是下图中的哪种异常!
早期的Functional model (Ad-hoc tests)算法:
Scan = Zero-One Test:O(4n) Data background:0xffffffff,0x0 In short notation: {⇑(w0); ⇑(r0); ⇑(w1); ⇑(r1)} 缺陷:Low Fault coverage
Checkerboard:O(4n) Data background:0xAAAAAAAA,0x55555555 Short Notation: {⇑(w1i , w0i+1); ⇑(r1i, r0i+1);⇑(w0i , w1i+1); ⇑(r0i, r1i+1)} 缺陷:Low fault coverage (similar to Scan)i+1);
Galpat,walking 1/0: O(n2)
**总结:**覆盖率低且时间花销大,因此工业中很难接受,因此覆盖率较高且时间复杂度较低的March系列算法发展起来。
Zero-One跟check board算法缺陷覆盖率不够,其他的一些常规算法又太耗时间,因此March测试算法横空出世。
- 基于fault models设计
- 线性时间花销
- 较好的缺陷覆盖率
- 持续改进...
下图所示为时间复杂度以及测试覆盖率,目前测试场采用较多的算法是March C-,它是折中了时间复杂度跟缺陷覆盖率后的最优选择。
在针对缺陷模型开发的各类算法中,March类算法是性价比最高的,因此较为常用。
不同算法检测不同类型的缺陷,同时必须清楚的是缺陷绝对是无法100%覆盖的,因此我们要组合选用测试算法来进行测试。
SAF: 固定位故障
AF:寻址故障
TF:转换故障
CF:耦合故障
CFin:翻转耦合故障
CFid:幂耦合故障
CFdyn:动态耦合故障
CFst(SCF):状态耦合故障
March算法演变
ps. 步骤中很多操作步骤是为了区分不同的缺陷的,因此我们只需要检测缺陷而不识别缺陷的话,可以进一步减少测试步骤。
- MATS 能以最少时间检测SAF,由Nair在1979年提出,后由Abadir改进为MATS+。
- March A和March B能覆盖一些耦合缺陷,(等幂耦合+转换故障)组合故障,倒置耦合+等幂耦合,等。
- March C于1982年提出,沿用至今三十多年,何其壮哉!!!
- March C-修正了March C,去掉了第四步的读“0”操作,缺陷覆盖率并未降低,还是能测AF、SAF、TF、CF等缺陷,但是并没有DRF缺陷检测能力。
- March-TB因此它增加了(M2,M4,M6,M10)、两个delay操作和一个写操作M9,其中M2,M4,M6是为了区别出已能检测出的故障类型,而M9,M10和delay是为了探测和诊断DRF缺陷的,这是March C-所没有的。
- March-TB+算法在TB的基础上增加了三个操作,都是为了区别出已能检测出的缺陷类型;
- March-TBA增加了操作,但是都是为了区别出已能检测出的故障类型,并未增加故障覆盖率;
(..., w0, r 0,...) to detect SA1 faults and TFd (..., w1, r1,...) to detect SA0 faults and TFu
主要就memtester的一些测试函数进行学习,这里用的是官网上的代码,我们在ARM平台上跑的都是从这里移植过去的。
memtester和 MemTest86的区别?
memtester run on OS, so use api of OS for allocate ram and test it. Memtest86 run without OS and is very small and access to RAM directly.
Memtest and Memtest86 are open source software utilities that scan and test computer memory chips (RAM) for any defects or errors.
系统级使用的均是,也就是说根本不是专门测内存颗粒的。
- 物理或者电性不良会使对RAM造成毁灭性的问题,这样常规算法都能检测出来的;
- 典型问题是电路板的问题,会导致cpu读不了memory、检查不到内存芯片、插入型号不对的内存等 作者的思路是,假如是内存颗粒的问题,那么常规的算法都可以检测出来,但是假如上述的三种板级问题常规的是无法检测出来的,因此我们设计了这些算法.
我们先看一下测试项(上层功能级函数,底层实现汇编级稍后分析):
memtester-4.3.0 | memtester-ARM |
---|---|
int test_stuck_address(bufa, count); | (√ ) 先全部把地址值交替取反放入对应存储位置,然后再读出比较,重复2次(官网的重复了16次):测试address bus |
int test_random_value(bufa, bufb, count); | (√ )等效test_random_comparison(bufa, bufb, count):数据敏感型测试用例 |
int test_xor_comparison(bufa, bufb, count); | (-) 与test_random_value比多了个异或操作,用户场景之一,用例覆盖。数据敏感/指令功能验证,同时可验证SAF; |
int test_sub_comparison(bufa, bufb, count); | (-)与test_random_value比多了个减法操作,用户场景之一,用例覆盖。数据敏感/指令功能验证,同时可验证SAF; |
int test_mul_comparison(bufa, bufb, count); | (-)与test_random_value比多了个乘法操作,用户场景之一,用例覆盖。数据敏感/指令功能验证,同时可验证SAF; |
int test_div_comparison(bufa, bufb, count); | (-)与test_random_value比多了个除法操作,用户场景之一,用例覆盖。数据敏感/指令功能验证,同时可验证SAF; |
int test_or_comparison(bufa, bufb, count); | (√ )在test_random_comparison()里面合并了,用户场景之一,用例覆盖。数据敏感/指令功能验证,同时可验证SAF; |
int test_and_comparison(bufa, bufb, count); | (√ )在test_random_comparison()里面合并了,用户场景之一,用例覆盖。数据敏感/指令功能验证,同时可验证SAF; |
int test_seqinc_comparison(bufa, bufb, count); | (√ )这是 test_blockseq_comparison的一个子集;模拟客户压力测试场景。 |
int test_solidbits_comparison(bufa, bufb, count); | (√ )固定全1后写入两个buffer,然后读出比较,然后全0写入读出比较;这就是Zero-One算法,Breuer & Friedman 1976 ,检测SAF的,算法是{w0,r0,w1,r1}时间复杂度是4N,又叫做MSCAN,验证每个cell能读写,间接测试了stuck at fault |
int test_checkerboard_comparison(bufa, bufb, count); | (√ )把设定好的几组Data BackGround,依次写入,然后读出比较 (注:论文里说设计良好的Data background可以检测出state coupling faults时间复杂度是4N,这是验证相邻位置是否互相影响从而设计的用例。 |
int test_blockseq_comparison(bufa, bufb, count); | (√ )一次写一个count大小的块,写的值是拿byte级的数填充32bit,然后取出对比,接着重复256次;也是压力用例,只是次数变多了; |
int test_walkbits0_comparison(bufa, bufb, count); | (√ )就是bit=1的位置在32bit里面移动,每移动一次就全部填满buffer,先是从低位往高位移,再是从高位往低位移动,(这么做的目的是啥?其中的一个目的是检测NPSF其次是CFs,其次是数据敏感型异常检测,注这里是32bit的,还有8bit的粒度更细了) |
int test_walkbits1_comparison(bufa, bufb, count); | (√ )与上同理,另注:早memtester86中这个算法叫做moving inversions algorithm |
int test_bitspread_comparison(bufa, bufb, count); | (√ )还是在32bit里面移动,只是这次移动的不是单单的一个0或者1,而是两个1,这两个1之间隔着两个空位,(是临近耦合异常的一种data pattern变体:两个1之间间隔1个位置,然后同步移动) |
int test_bitflip_comparison(bufa, bufb, count); | (√ )也是32bit里面的一个bit=1不断移动生成data pattern然后,每个pattern均执行:{取反交替写入a、b缓冲区,写完之后检查一遍,然后不断重复以下步骤八次{用八个DMA从a缓冲区搬数据到b缓冲区,并行搬,模拟短时间内反复读写同一位置看是否有数据丢失异常}}核心思想:短时间内反复读写同一位置。 |
int test_8bit_wide_random(bufa, bufb, count); | (√ )以char指针存值,也就是每次存8bit,粒度更细; |
int test_16bit_wide_random(bufa, bufb, count); | (√ )以unsigned short指针存值,也就是每次存16bit,不同粒度检测; |
× | int test_crosstalk_comparison(bufa, bufb, count):[32个0,接着32bit里面1个0移动]以这样的模型叠加写入内存;(只有上行,没像有moving inversions algorithm一样进行反转) |
总结:整个memtester测试的视角就是从用户的角度来看的,从用户角度设立不同的测试场景即测试用例,然后针对性地进行功能测试,注意是从系统级来测试,也就是说关注的不单单是内存颗粒了,还有系统板级的连线、IO性能、PCB等等相关的因素,在这些因素的影响下,你的memory是否还能正常工作;
注2: checkboard这里虽然有点类似于底层的NPSF(neighborhood pattern sensitive fault),但是这里的锚点却不是这个,而是:比如说我的客户在把内存插入电脑后,使用过程中有这种pattern的数据写入内存,会不会存在数据互相影响从而丢失的问题呢?这搞不好就是蓝屏了啊!也就是说我们关注的是表层的状态而不是底层的缺陷。
测试类型 | 测试内容描述 |
---|---|
Test 0 [Address test, walking ones, no cache] | walking ones address pattern测试所有的地址位 |
Test 1 [Moving Inv, ones&zeros, cached] | moving inversions algorithm with patterns of only ones and zeros. |
Test 2 [Address test, own address, no cache] | 地址写入,检查其连续性,是test0的补充 |
Test 3 [Moving inv, 8 bit pat, cached] | 重点在8bit,检查粒度更细了 |
Test 4 [Moving inv, 32 bit pat, cached] | 检测数据敏感性异常; |
Test 5 [Block move, 64 moves, cached] | 检测压力下内存是否会出现问题; |
Test 6 [Modulo 20, ones&zeros, cached] | 去除cache的影响,还是moving inversions |
Test 7 [Moving inv, ones&zeros, no cache] | 补充测试未chche情况下是否ok,时间花销显著变大哟!(解决用例覆盖度问题) |
Test 8 [Block move, 512 moves, cached] | 既然加压了,那就试试不同压力下的情况吧! |
Test 9 [Moving inv, 8 bit pat, no cache] | 理论上检测所有缺陷,因为粒度都到8bit了,但是时间花销上也是呵呵哒! |
Test 10 [Modulo 20, 8 bit, cached] | 将data pattern(之前的就是0啊1啊的pattern而已)跟去除cache影响的Modulo-X算法组合技能确实效率更高,但是执行时间也是长长的~ |
Test 11 [Moving inv, 32 bit pat, no cache] | 我们用的是32bit的数据pattern,因此在找出数据敏感型的异常情况中最有效,但是由于没有cache这个速度也是很感人。 |
总结:就是从用户的角度来看,设立不同的测试场景即测试用例,然后针对性地进行功能测试,注意是从系统级来测试,也就是说关注的不仅仅是内存颗粒了,而是在系统板级的连线、IO性能、PCB等等相关的因素一同考虑进去后,你的memory是否还能功能正常;
这就不展示了,毕竟平台相关了,说到底也就是一些单片机代码而已。