来自 http://www.ssdfans.com/?p=1778

闪存存在几个问题,影响着数据可靠性:

1.擦除次数,闪存擦除次数增多,会使隔离栅极的电化学键变弱。

2.data retention问题,随着时间的流逝,存储在闪存中的数据会消失,原因是浮栅极里面的电子跑出来了。电子跑出来的速度是跟擦除次数成正比的,也就是,闪存擦写次数越多,电子跑得越快,也就是数据消失得越快。

3.program disturb和read disturb,顾名思义,就是读写闪存的时候,会影响数据。

《闪存问题之READ DISTURB》总结-LMLPHP

还是这张图,基本存储单元结构图,浮栅极被上下绝缘层(黄色标示)包裹,电荷就存储在里面。牢记这张图,这是闪存的根。

《闪存问题之READ DISTURB》总结-LMLPHP

闪存由Block组成,是擦除的基本单元。一个Block包含若干个Page,上图以256个Page为例。一个Wordline(上图黄色所示)对应着一个Page或几个Page,取决于SLC, MLC和TLC:对SLC来说,一个WordLine对应一个Page;MLC则对应2个Page,这两个Page是一对:Lower Page 和Upper Page;TLC对应3个Page。(关于上述论断,是按单个Plane来说的,而且是2D闪存的)一个Page有多大,那么WordLine上面就有多少个存储单元(Cell),即有多少个Bitline。上图示例有71488个bitline,表明该闪存Page大小是71488/8 = 8936 bytes。

以MLC为例:

《闪存问题之READ DISTURB》总结-LMLPHP

我们知道,要使一个晶体管导通,在控制极必须加一个大于晶体管阈值电压的控制电压。对浮栅极晶体管来说,往浮栅极里面注入不同数量的电子,将改变晶体管的阈值电压。由于不同的状态有不同的阈值电压,我们可以通过在控制极加不同的参考电压来判断当前存储单元数据。以上图为例,低比特数据代表lower Page数据,高比特数据代表Upper Page数据。 如果我们要读Upper Page数据,要区分0还是1,只需在控制极加个参考电压V2:如果晶体管导通,说明是1 (因为不管11还是10状态,其阈值电压都小于V2);否则就是0 (因为不管01还是00,阈值电压都大于V2)。如果要读取Lower Page数据,要区分0和1的话,就稍微复杂了:我们首先得在控制极加个参考电压V1,如果导通,说明数据是1(因为11状态阈值电压小于V1);如果截止,没有办法说明是0和1,因为10,01,00三个状态阈值电压都比V1大,这个时候我们需要改变控制极的参考电压为V2,再看晶体管的导通状态,如果导通,说明数据是0 (10状态阈值电压小于V2),如果晶体管截止,还是无法判断数据是0和1,因为01和00状态阈值电压都大于V2。这个时候,我们需要再次改变控制极的电压为V3,这个时候,导通说明是1,截止说明数据是0。从中我们看出,读lower page需要尝试多次参考电压,才能获得最后的数据,而读upper page时,只需一次,所以对MLC来说,读lower page和读upper page的时间是有所差异的。

在上图中,如果我们把00和01状态调换一下,如下图所示:

《闪存问题之READ DISTURB》总结-LMLPHP

如果我们还是读lower Page数据。首先,我们在控制极加个参考电压V1,如果晶体管导通,说明数据是1;如果截止,这个时候我们在控制极直接加参考电压V3,如果导通,说明是0,因为不管10还是00,低比特都是0;如果截止,就是1。我们最多经过两次电压尝试就把数据区分出来了,比前面少了一次电压尝试。有些闪存厂家采取前面那种编码方式,而有些闪存厂家采取后面那种编码方式。所以,不同商家的闪存特性存在差异。

《闪存问题之READ DISTURB》总结-LMLPHP

如上图所示,先看左边(a)部分,如果我们要读取一个Block当中的某个Page,需要在其它所有Wordline控制极上加一个Vpass电压,这样保证了其它晶体管都是导通的;对被读取的Page,需要在其所在Wordline的控制极上加参考电压Vref,可能加一次参考电压就能把数据读出来,也可能需要几次,具体做法如前面描述。

再看右半部分(b)。读操作时,衬底加电压是0,读取的page,控制极上的电压是Vref,而对其他Page,控制极上加的电压是Vpass。问题来了,由于其他Page上加了一个Vpass,相对来说是一个比较大的电压,这样就会在浮栅极和衬底形成一个较强的电场,可能就把一些电子吸入浮栅极,有点轻微Program的意思。随着该Block上Page数据读的次数越来越多,无辜的page(没有被读到的)中的浮栅极电子进入越来越多,导致里面数据状态发生变化,也就意味着数据出错。

这就是Read Disturb。同一个block上page读,自己没事,导致其他没有被读的page数据出错。

Read Disturb会导致浮栅极进入电子,跟Data Retention浮栅极电子流失不同。由于有额外的电子进入,会导致晶体管阈值电压右移(Data Retention问题导致阈值电压左移),如下图所示:

《闪存问题之READ DISTURB》总结-LMLPHP

由于晶体管阈值电压偷偷的发生了变化(变大了),闪存内部逻辑如果还是按照之前的参考电压加在控制极上,然后去判断数据的话,肯定会发生误判,也就是读到错误的数据。 阈值电压右移的速度,也就是Read Disturb影响数据的程度,一方面与你读该Block上数据的次数有关,读的越多,右移越多,影响越大,另一方,还跟你block的擦除次数有关,擦写次数越多,绝缘效果越差,电子进入浮栅极就越容易,read Disturb的影响也就越大。

闪存使用者如何对付Read Disturb呢?

一般做法就是记录每个Block读的次数,赶在这个数值达到阈值(闪存厂家提供)之前,把block上所有的数据刷新一遍(读出来,擦除,然后在写回),或者把数据搬到别的地方。回到开头那个问题,Read Disturb为什么会导致SSD性能下降?就是因为一个Block上的数据读的次数太多了,固件需要赶在UECC出现之前,把整个Block数据刷新或者搬移,占用底层带宽,导致Host读写性能下降。

还有人研究发现,减小Vpass可以缓解Read Disturb。因为Vpass变小,电场减弱,吸入电子的能力减弱,能缓解read Disturb影响。一方面,现在闪存厂商都没有开放调Vpass电压的接口给用户;另一方面,过低的Vpass会导致读失败。该方法只能缓解,不能从源头上杜绝Read Disturb的影响。

05-14 13:30