很多人第一次接触 NAND 的时候,会觉得一件事很自然:Program 会改数据,Erase 会改数据,但 Read 只是把数据读出来,应该不会碰到数据本身。可真实情况并不是这样。NAND 在被反复读取之后,即使没有重新 Program,一些 Cell 的阈值电压也可能慢慢发生变化。这个现象,就是 Read Disturb。

这个话题之所以值得单独讲,是因为它很反直觉。我们明明只是“读”数据,却可能在长期反复读取的过程中,对数据状态本身造成扰动。一次 Read 的影响非常小,小到几乎可以忽略;但当这个过程累积到几十万次、上百万次时,问题就可能逐渐显现出来。

这篇文章就想讲清楚三个问题:Read Disturb 是怎么产生的,它为什么通常表现为 Vth 往右漂移,以及 SSD 又是怎么应对它的。

一、NAND只是被读取,为什么数据也会慢慢改变?

要理解 Read Disturb,还是要先回到最基本的 NAND Read。

NAND String 里的多个 Cell 是串联在一起的。假设现在要读取某一条 Wordline 上的 Cell,NAND 并不是只给这个被选中的 Cell 加电压,然后单独看它的状态。因为在串联结构里,想让电流顺利流过整条 String,除了被选中的那个 Cell 以外,其他没有被选中的 Cell 也必须处于导通状态。否则中间任何一个地方断掉,后面的 Sense 放大器就根本看不到被选中 Cell 的导通情况。

所以,读取某个 Wordline 时,NAND 内部通常会同时做两件事:被选中的 WL 加上用于判读状态的 Read Voltage,而没有被选中的 WL 则加上一个较高的 Vpass,让这些 Cell 保持导通,给被选中的 Cell“让路”。

被选中的 WL 负责“判断数据”,未被选中的 WL 负责“保证通路”。


图注: 读取某个 Wordline 时,被选中的 WL 用于判读数据,未被选中的 WL 需要加 Vpass,以保证整条 NAND String 导通。

理解了这一点,Read Disturb 的入口就找到了:问题并不主要出在被选中的 Cell 上,而是出在同一个 Block 里那些反复承受 Vpass 的未选中 Cell 上。

二、Vpass为什么会带来扰动?

直觉上,Vpass 只是为了让未选中的 Cell 导通,看起来像一个“辅助电压”。但它并不是完全无害的。

Program 一个 Cell 时,会给它施加更高的编程电压,使电子进入存储节点,从而把 Cell 的 Vth 往更高的位置推。Read 时使用的 Vpass 当然远低于 Program Voltage,因此一次 Vpass 并不会像 Program 那样明显改变 Cell 的状态。但“远低于”不等于“完全没有影响”。

如果一个 Cell 一次又一次地承受 Vpass,这个过程中仍然可能出现非常微弱的电荷注入效应。每一次影响都很小,小到几乎测不出来;但当 Read Count 持续累积时,这些极其微弱的影响就可能一点点叠加起来。于是,原本只是为了“让路”的未选中 Cell,反而慢慢被扰动了。

这就是 Read Disturb 最核心的机制:

读取某个 Cell 时,未选中的 Cell 反复承受 Vpass。
一次影响极小,但多次累积后,少量电荷逐渐进入存储节点。
电子越来越多,Cell 的 Vth 也就越来越高。

所以,Read Disturb 不是“Read 直接把数据读坏了”,而是 Read 的配套动作在长期累积后,对其他 Cell 造成了微弱但真实的扰动。

三、为什么Read Disturb通常表现为Vth往右漂?

理解这一点并不难,只要抓住一个核心:电子变多,Vth 就会上升。

一个 NAND Cell 的状态,本质上体现在它的阈值电压上。Cell 里存储的电子越多,想让这个晶体管导通,就需要更高的栅极电压。换句话说,电子增加以后,这个 Cell 的 Vth 会升高。

如果把横轴画成阈值电压,从左到右代表 Vth 从低到高,那么 Vth 升高就意味着分布向右移动。也就是说,Read Disturb 通常表现为 Vth Distribution 右移。

这也是为什么大家在谈 Read Disturb 时,经常会说“波形右移”。这里所谓的“波形”,其实更准确地说,是不同状态对应的 Vth Distribution。Read Disturb 累积后,某些状态分布会逐渐往高电压方向偏移,看起来就像整条分布曲线慢慢往右边挪。

所以如果把结论压缩成一句话,就是:

Read Disturb 的典型结果,是未选中 Cell 在 Vpass 的长期作用下发生正向 Vth 漂移,也就是 Vth 往右漂。

四、是不是所有State都会一样右移?

并不是。低 Vth 的状态,通常更容易受到 Read Disturb 的影响。

原因也不复杂。未选中的 Cell 承受的是同一个 Vpass,但不同 Cell 自己的 Vth 不一样。对于低 Vth 的 Cell 来说,Vpass 和它自身 Vth 之间的差值更大,这意味着它更容易在这个电场条件下发生不希望出现的电荷变化。于是,低电压状态往往比高电压状态更容易被扰动。

如果用更直观的话说,就是:原本“门槛”比较低的 Cell,在同样的 Vpass 作用下,更容易被进一步往高处推一点。

所以在实际观察里,更常见的情况不是“所有状态整整齐齐地一起平移”,而是 低 Vth 的状态漂移更明显,高 Vth 的状态变化相对更小。对于 TLC、QLC 这样的多电平存储来说,这一点尤其重要,因为不同状态之间本来就挤得更近,低状态如果更容易右移,就更容易侵占原本的判决裕量。

五、Vth只是漂了一点,为什么会变成真正的数据错误?

Vth 漂移本身,并不等于立刻读错。

因为 NAND 中的每一个状态,本来就不是一个单独的点,而是一段分布。比如某个状态对应一片 Vth 区间,相邻状态之间再通过一个个 Read Reference Voltage 来做分界。只要这些分布和判决边界之间仍然保留足够余量,哪怕某些 Cell 的 Vth 有一点点漂移,也不一定马上出错。

真正危险的地方在于:漂移是累积的,而判决裕量是有限的。

随着 Read Count 越来越高,某些 Cell 的 Vth 逐渐右移,最终可能跨过原本的判决边界。一旦越过了那条 Read Reference,NAND 在读取时就可能把它判成另一个状态。到这一步,Vth 漂移才真正变成了 bit error。

所以 Read Disturb 最终造成错误,并不是因为“电压变了一点点”本身有多可怕,而是因为:

Vth 的持续漂移,破坏了原本不同状态之间的判读边界。

这个地方也很适合配第二张图。


图注: Read Disturb 累积后,低 Vth 状态更容易向右漂移,最终可能跨过判决边界,形成读取错误。

六、为什么NAND越老,Read Disturb问题越容易显现?

Read Disturb 不是孤立存在的,它和 NAND 本身的老化状态也有关系。

随着 P/E Cycle 不断增加,NAND 的氧化层和整体器件状态都会逐渐老化。老化之后,Cell 对各种扰动通常会更敏感。也就是说,同样数量的读取操作,落在一颗“年轻”的 NAND 上,影响可能比较轻;落在一颗已经经历了很多次 P/E 的 NAND 上,影响就可能更明显。

这也是为什么 Read Disturb 不能脱离 NAND 的整个生命周期单独看。它不是一个完全固定的效应,而是会随着介质老化、阈值分布变窄、判读裕量下降等因素变得越来越值得关注。

简单说就是:

一颗 NAND 越接近寿命后期,越需要警惕反复读取带来的累积扰动。

七、Read Disturb会永久损坏数据吗?

这里要分清两件事:暂时性的电荷状态变化,和 永久性的器件损伤。

Read Disturb 本质上主要是让某些 Cell 在长期反复读取下,电荷状态发生了偏移,导致 Vth 漂移。这并不等同于一次不可逆的永久损坏。只要把这个 Block 重新擦除,再重新 Program,原先累积的这类扰动通常是可以被清掉的。

但这并不意味着它可以不管。因为在真正执行 Erase 之前,Block 里的数据还要继续对外提供读取服务;如果 Read Disturb 已经把某些 Cell 推到了错误边界附近,那么在 Erase 发生之前,它就已经可能表现为可纠正错误,甚至在更严重时演变成不可纠正错误。

所以更准确地说:

Read Disturb 不一定意味着这个 Cell 被永久“读坏”了,但它确实会在数据仍然留在原 Block 的期间,持续增加出错风险。

八、SSD是怎么应对Read Disturb的?

既然 Read Disturb 是一种“少量影响、长期累积”的问题,那么 SSD 的应对思路也很自然:不要让同一个 Block 在同一次擦除之后无限制地被反复读取。

一种常见做法是,控制器会跟踪某个 Block 自上次 Erase 以来的读取次数。当这个次数达到某个门限,或者结合 ECC 状态判断这个 Block 的风险已经升高时,就会提前处理它。处理方式通常是把其中仍然有效的数据搬到新的 Block,然后擦除原来的 Block。这样一来,原 Block 中累积的 Read Disturb 也就随之被清掉了。

从现象上看,这有点像“给数据挪个地方住”。数据搬到新 Block 后,相当于从一个已经被反复读取、存在扰动累积风险的环境,迁移到了一个重新开始的环境里。

当然,实际产品里门限怎么定、是否按 Block 统计、是否结合介质类型、P/E 状态、ECC 余量等一起判断,都会因具体设计而不同。这些就属于更深入的固件策略细节了。在科普层面,只要理解一个结论就够了:

SSD 不会傻等到 Read Disturb 把数据真的“读坏”以后再处理,而是会通过计数、搬移、刷新等方式提前降低风险。

九、Read Disturb真正反直觉的地方在哪里?

它最反直觉的地方就在于:Read 明明不是写操作,却仍然可能慢慢改变 Cell 的状态。

如果只从命令名字上看,Read 像是在“旁观”;但从器件角度看,Read 并不是完全被动的。为了读出被选中 Cell 的状态,NAND 必须让整条 String 建立起可观测的通路,而这个过程中,未选中的 Cell 必须反复承受 Vpass。也正是这个看似只是配角的动作,构成了 Read Disturb 的物理根源。

所以,Read Disturb 不是一个额外附带的小知识点,它其实是在提醒我们:NAND 的每一次读、写、擦,背后都不是“零代价”的。 只不过 Read 的代价足够轻,轻到短时间里难以察觉;但当次数被拉到很高时,它依然会留下痕迹。

十、最后总结一下

把整篇文章压缩一下,Read Disturb 的逻辑其实很清楚。

读取某个 Cell 时,被选中的 WL 用 Read Voltage 来判断数据;而同一条 String 上未被选中的 WL 则需要加 Vpass,以保证整条路径导通。Vpass 虽然远低于 Program Voltage,但在大量重复读取下,仍可能带来微弱的电荷注入效应。随着读取次数不断累积,某些 Cell 中的电子逐渐增多,导致 Vth 升高,也就是我们常说的 Vth 往右漂。

这种漂移对低 Vth 状态通常更明显。开始时它也许只是轻微挤压判读裕量,但继续积累后,就可能让某些 Cell 跨过 Read Reference,最终形成真正的读错。为了避免这种风险,SSD 通常会通过统计读取次数、提前搬移数据、擦除旧 Block 等方式,尽量把问题控制在出错之前。

所以,Read Disturb 最值得记住的一句话就是:

NAND 并不是“只要不写就不会变”。即使只是被反复读取,Cell 的阈值电压也可能在长期累积下发生漂移。