SRAM BIST技术学习

        MBIST 方法是目前大容量存储器测试的主流技术,该技术利用芯片内部专门设计的BIST 电路进行自动化测试,能够对嵌入式存储器这种具有复杂电路结构的嵌入式模块进行全面的测试。MBIST 电路将产生测试向量的电路模块以及检测测试结果的比较模块都置于芯片的内部,在测试完成后,将测试的结果通过芯片的测试引脚送出到芯片的外部。

        MBIST 的核心思想是在芯片内部,存储器外部建立测试电路结构,实现对存储器的读写控制:写入测试向量,读出响应数据。MBIST 电路的基本结构一般包括测试向量产生电路、BIST 控制电路、响应分析电路三部分,结构如图所示:

一、SRAM基本介绍

1、SRAM的基本结构

        SRAM,名为静态随机存储器,它是一种随机存取存储器。它采用双稳态触发器作为存储元件,由于双稳态电路的稳定特性,这种存储器可以实现静态稳定读取:只要不掉电,存储单元就可以长期保存所写入的信息,并且无需刷新。SRAM具有存取速度快,外围电路简单,功耗低等优点,在数据高速缓存和存储阵列中被广泛应用,SRAM 的存储单元如图:

         嵌入式存储器结构模型的存储阵列就是SRAM 存储单元阵列。由基本存储单元组成的存储阵列和存储器外围电路共同组成了存储器的整体结构。存储器的外围电路一般包括地址译码电路和读/写控制电路。SRAM 的结构模型如图:

         地址译码电路包括地址寄存器和行/列译码器,读/写控制电路由数据寄存器、灵敏放大器和写驱动器组成。当地址信号给定存储单元地址,通过行/列译码器锁定存储单元位置,若当前为读操作则从锁定的存储单元读出数据并经过灵敏放大器放大摆幅,从数据寄存器输出数据;若当前为写操作则将输入数据写入数据寄存器,通过写驱动器写入指定单元。
        由于存储器内部非常复杂,非常容易出现各种故障,这些故障可能是对存储器进行读写操作的过程中的读写控制电路故障,可能是地址译码电路出现的故障,而存储器的核心存储单元阵列由数以万计的存储单元排列而成,更容易出现故障,并且产生的故障也更加难以应对,接下来将介绍存储器的相关故障模型。

2、SRAM故障模型

        故障模型是指逻辑故障模型。发生在真实存储器上的故障通常是物理故障,而引入故障模型的概念是因为物理故障是随工艺而变化的,引起物理故障的原因很多,如果测试人员对每一种物理故障在每一工艺下都去研究是不现实的,可行的办法是不直接研究物理故障,而是去研究模型化了的故障——故障模型。

        当然故障模型必须要对实际的物理故障实现精确地反映。集成电路中有与故障相关的几个容易混淆的概念:缺陷,故障、误差和漏洞。这几个概念是集成电路设计中的问题在不同阶段的不同表现形式。

  • 缺陷是指集成电路制造过程中,在硅片上所产生的物理异常,比如多余或者错放了某些器件。
  • 故障是指集成电路制造中的缺陷表现在电路功能上的异常现象,比如电路的逻辑功能固定为1 或者0。
  • 误差则是由于故障的存在而导致的系统功能的偏差和错误。
  • 漏洞一般指由于设计问题而造成的功能错误,也就是我们常说的“bug”

        故障建模是用数学模型来描述芯片制造过程中可能出现的物理缺陷,用于研究缺陷对系统或者电路功能造成的影响,以及确定故障发生的位置。采用故障模型的另一个原因就是:电路中可能存在的物理缺陷的种类繁多,并且某些物理缺陷可能对电路功能产生非常复杂的影响,分析难度大。而采用故障模型的形式,一个逻辑故障往往可以描述多种物理缺陷行为,从而回避了对物理缺陷的直接分析

        常见的存储器故障类型包括:固定型故障(Stuck-At Faults,SAF),跳变故障(Transition Faults,TF),耦合故障(Coupling Faults,CF),相邻图形敏感故障(Neighborhood Pattern Sensitive Faults,NPSF)和地址译码故障(Address DecoderFaults,ADF)。

1)固定型故障(SAF)

        固定型故障会在控制信号和存储器单元中出现,表现为控制信号或者存储单元中的值固定为1 或0,也就是持续为高电平或者低电平,简记为SA0(Stuck-At-0)和SA1(Stuck-At-1),固定故障图示为:

        固定型故障可以通过对所有待测单元写入0 再读出0,然后写入1 读出1 来进行检测。

2)跳变故障(TF)

        跳变故障(也称跳变延迟故障)出现在控制信号和存储器单元中,表现为控制信号或者存储单元中的值无法(或者延迟)从0 跳变到1,或者从1 跳变到0,简记为TF (0->1)和TF (1->0),跳变故障图示为图:

        跳变故障可以通过写入1 到0 的跳变再读出0,然后写入0 到1 的跳变再读出1 来进行检测。 

3)耦合故障(CF)

        耦合故障主要发生在存储单元中,表现为对某个单元的写入操作影响其它单元的值,使其它单元的值发生变化,根据发生的变化不同,耦合故障可以分为反相耦合故障(CFin:inversion),幂等耦合故障(CFid:idempotent)、状态耦合故障(CFst:state)和桥连故障(Bridging Faults,BF)。

        耦合故障可以通过先升序对所有存储单元进行写读操作,然后再降序对所有存储单元进行写读操作的方法进行故障检测。

3)相邻图形敏感故障(NPSF)

        这种故障主要发生在存储单元中,表现为对某特定单元周围的若干存储单元的赋值或者跳变会影响:

4)地址译码故障(ADF)

        这种故障主要发生在地址译码逻辑中,地址与存储单元是一一对应的,一旦地址译码逻辑发生故障,将会出现以下四种故障类型中的一种或多种:

  1. 对于给定的地址,不存在相对应的存储单元;
  2. 对于一个存储单元,没有相对应的物理地址;
  3. 对于给定的地址,可以访问多个固定的存储单元;
  4. 对于一个存储单元,可以通过多个地址访问。 

二、MBIST测试算法

        存储器内建自测试的中心思想就是在嵌入式存储器周围建立测试电路,测试电路控制存储器按照一定的步骤去工作,得到的输出结果与期望值进行比较来检验存储器的正确性。这些“一定的步骤”就是测试算法,测试算法的好坏决定了MBIST 的质量和效率。

1、性能指标

        存储器测试算法的性能指标有两个:测试时间和故障覆盖率。

        测试时间可以用算法时间复杂度来表征。算法时间复杂度是算法评价的通用指标,一般用O(f(N))表示,其中f(N)可以是常数、N、N2、NlogN 等,在存储器中,N 是存储器的存储单元数。算法复杂度是对算法效率的一个粗略的定量表示,它只区分常数复杂度、一阶复杂度、二阶复杂度等,而在存储器算法中,大多数算法的复杂度都是一阶的,那么为了更加细致的比较各种测试算法,存储器测试中通常也会用操作数来定量表征测试时间。

        故障覆盖率:用来表征测试算法对某种故障类型的检测能力。对于存储器测试算法的评价有时也要考虑故障覆盖范围,它用来表征一个测试算法能覆盖多少种覆盖类型。在保证对能覆盖的故障类型的覆盖率的情况下,能覆盖的故障类型越多越好。

        测试时间和测试覆盖率本身就是相悖的一对指标。想达到高的覆盖率,测试时间就可能被延迟;想减少测试时间,也许测试覆盖率就会降低。一个优秀的测试算法应该是在保证测试时间可接受的情况下,尽可能多的去覆盖故障类型并且覆盖率尽可能高。如何权衡测试时间和测试覆盖率是测试算法选择和设计的核心。

2、常见算法

        常用的确定性测试算法有MSCAN(Memory Scan)算法,跳步 (GALPAT) 和走步 (Walking 1/0)算法,Checkerboard 算法和March 类算法。每种测试算法总有它针对的故障类型,这样每种算法的测试向量的规模和测试效率不尽相同,我们要综合考虑,选取最适合的测试算法。

1)MSCAN 算法

        MSCAN 算法是一种最基本,最简单的测试算法。其算法过程是首先对所有待测单元写入全0 然后读取所有存储单元并判断是否有故障,接着写入全1 再读取所有存储单元并判断是否有故障,这种算法所使用的测试向量实际上是形式固定的存储器扫描序列,其操作次数是4N,与存储器地址位数成正比关系,时间复杂度为O(N)。这种测试算法时间复杂度低,测试向量简单,但是除可以检测所有SAF故障外,仅支持部分耦合故障的测试,故障覆盖率有限。

2)跳步(GALPAT)和走步(Walking 1/0)算法

        跳步算法和走步算法操作过程类似,首先选定一个存储单元作为基本单元,其他单元作为普通单元,向基本单元内写入1(或0),普通单元写入0(或1),然后读取所有单元的数据,重复该过程,直到所有存储单元都曾经被选定为基本单元为止。

        以跳步算法为例,其操作过程如下:

  • (1) 对所有的存储单元写入0(或1);
  • (2) 选定一个存储单元Cj 作为基本单元:对Cj 内的值求补;
  • (3) 对基本单元Cj 和普通单元Ck(k≠j)进行以下操作:读单元Cj;读单元Ck。
  • (4) 恢复单元Cj 的内容。
  • (5) 重新选定一个存储单元作为基本单元,重复操作(2)(3)。

        该算法可以覆盖以下故障:SAF、TF、ADF以及部分CF。

3)Checkerboard 算法

        Checkerboard 算法也叫做棋盘算法,基本过程是对每个存储单元进行赋值,保证每一个存储单元的值都与相邻单元的值不同,这样就将整个存储阵列分为了两块:存储值是0 的为A 块,存储值是1 的为B 块:

        分块后,按如下过程完成算法:

  • (1) 对A 和B 块分别写入0 和1;
  • (2) 读所有存储单元;
  • (3) 对A 和B 块分别写入1 和0;
  • (4) 读所有存储单元。 

        该算法的操作数为4N,时间复杂度为O(N),可以检测和定位固定型故障和部分桥连故障,在BIST 算法中应用较为广泛。

4)March 算法

        March算法是一系列的算法,由于这类算法具有较高的故障覆盖率同时测试时间较短,使得其在存储器测试领域得到了广泛研究和应用。这类算法已经广泛应用于运用于对大容量SRAM 和DRAM 的测试,随着研究的深入,各种改进算法也相继出现。目前的March 算法主要有MATS,MATS+,March X、March C、March C-、March C+、March LR 等类型。

        March 的基本思想是在有限状态机的控制下遍历每个存储单元,并对每个存储单元进行一系列的操作,在对下一个存储单元操作之前,对当前单元的这些操作被称为March 元素,而各种March 类型算法的不同之处也恰恰体现在March 元素上。每个March 元素都有规定的地址升降顺序,当一个存储单元完成一系列操作后,根据地址升降顺序来决定下一个执行操作的存储单元。当某个March 元素对所有的存储单元做完所有操作后执行下一个March 元素。为了便于描述各种March 算法的执行过程,我们首先进行如下约定:

        目前March 算法针对不同的测试目的衍生出了各种类型的March 算法,这些算法的不同之处在于March 元素的不同上,也就是对地址的操作顺序和对每个存储单元进行的操作不同。对单个存储单元的操作数和对故障的覆盖率体现了各种March 算法的不同特点,各种March 算法的操作数和覆盖率对比如表:

        算法可以覆盖的故障如下:

  • 21
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
好的,下面是一个简单的SRAMBIST控制器的Verilog代码,采用FSM来实现: ```verilog module SRAM_BIST_Controller( input clk, input rstn, input [31:0] sram_addr, input [31:0] sram_data_in, output [31:0] sram_data_out, output bist_done ); // 定义状态 parameter IDLE = 2'd0; parameter WRITE = 2'd1; parameter READ = 2'd2; parameter COMPARE = 2'd3; reg [1:0] state; reg [31:0] sram_data_out_reg; reg [31:0] sram_data_out_prev; reg bist_done_reg; always @ (posedge clk or negedge rstn) begin if (~rstn) begin state <= IDLE; bist_done_reg <= 1'b0; sram_data_out_reg <= 32'h0; sram_data_out_prev <= 32'h0; end else begin case (state) IDLE: begin bist_done_reg <= 1'b0; sram_data_out_reg <= 32'h0; if (sram_addr[0] == 1'b0) begin state <= WRITE; end else begin state <= READ; end end WRITE: begin sram_data_out_reg <= 32'h0; sram_data_out <= sram_data_in; state <= COMPARE; end READ: begin sram_data_out_reg <= 32'h0; state <= COMPARE; end COMPARE: begin if (sram_data_out_prev != sram_data_out_reg) begin bist_done_reg <= 1'b1; end sram_data_out_prev <= sram_data_out_reg; state <= IDLE; end default: begin state <= IDLE; bist_done_reg <= 1'b0; sram_data_out_reg <= 32'h0; sram_data_out_prev <= 32'h0; end endcase end end endmodule ``` 上述代码中,我们定义了四个状态:IDLE、WRITE、READ、COMPARE。在IDLE状态下,根据sram_addr的最低位判断是进行写操作还是读操作,然后转移到WRITE或READ状态。在WRITE状态下,将输入的数据写入SRAM中;在READ状态下,从SRAM中读取数据。在WRITE和READ状态下,都会转移到COMPARE状态。在COMPARE状态下,将读取的数据和之前的数据进行比较,如果不相同则设置bist_done信号为1,并转移到IDLE状态。在IDLE状态下,等待下一次操作。注意,在rstn信号为低电平时,SRAMBIST控制器将复位到IDLE状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沧海一升

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值