很多人以为,SSD 读取数据是一件非常确定的事。

写进去是 0,读出来就是 0。
写进去是 1,读出来就是 1。
就像把东西放进抽屉,再原样拿出来。

但 NAND 的真实世界,并没有这么体面。它不是“看见答案”,再把答案拿出来。它真正做的,是在一堆已经开始模糊、漂移、甚至彼此重叠的信号里,尽可能判断:

这个答案,原本最可能是什么。

换句话说:

NAND 不是在读取数据。它是在猜数据。

这听起来像一句故意耸动的话。
但如果真的理解了 NAND 的底层,就会发现:这不是夸张,而是事实。


一、NAND 里真正存的,不是 0 和 1

这是理解 NAND 读取的第一步。

我们平时说“写入数据”,总会下意识觉得,存进去的是数字本身。但在 NAND 里,真正被存进去的,不是 0,也不是 1,而是电荷。这些电荷最终决定了一个东西:

阈值电压。

之前文章里已经讲过,编程操作本质上就是通过高压,把电子一点点泵进浮栅层。

浮栅里电子越多,这个单元就越难导通,阈值电压越高;
浮栅里电子越少,这个单元就越容易导通,阈值电压越低。

所以,一个存储单元的真实状态,从来不是:

  • 我是 0
  • 我是 1

而是:

我的阈值电压,大概落在这里。

也就是说,NAND 的底层世界,根本不是一个天然纯粹的数字世界。它首先是一个模拟世界,然后才被我们强行解释成数字世界。


二、所谓读取,本质上只是“试一下它通不通”

NAND 的读取,表面看起来很简单:选中某个存储单元,给它加上一个参考电压;
如果它导通,就判成一种状态;如果它不导通,就判成另一种状态。

但真实过程远没有这么干净。

因为在 NAND 里,存储单元不是一个个彼此独立站着的。它们是串联成串的。如图所示:

这意味着,当读取某个目标单元时,真正面对的,并不是“单独观察它自己”,而是在看:

这一整条串联通路,最终能不能导通。

如果看 NAND 阵列的组织方式,会发现:

  • 一个页上的单元共享同一条 wordline
  • 沿着 bitline 方向,多个单元是串联在一起的

所以,当读取图中那个被选中的红色单元时,控制器并不是只盯着它本身,而是通过 wordline 和 bitline 的交叉定位,把它放到整条通路中唯一的“关卡”位置。


三、为什么加一个电压,就能判断它存了什么?

这里要先回到 MOS 管的导通原理。

对于普通 MOS 管来说,控制栅极加上电压后,如果这个电压高到足以形成沟道,源极和漏极之间就会导通。这个“刚好能导通”的门槛,就是它的阈值电压。

但 NAND 的存储单元不是普通 MOS 管,它是浮栅晶体管。它和普通 MOS 最大的区别在于:浮栅层里存着电子。

这些电子会形成一个反向电场,削弱控制栅极对沟道的拉动能力。
结果就是:

同样的栅极电压下,浮栅晶体管会比普通 MOS 更难导通。

换句话说,要让一个 NAND 单元导通,控制栅极施加的电压,不仅要满足普通 MOS 的导通条件,还要额外克服浮栅中存储电荷带来的“屏蔽作用”。

浮栅里的电子越多,这个单元就越难打开,它的阈值电压也就越高。


四、Vpass 和 Vread,到底分别在干什么?

这时候,Vpass 和 Vread 的分工就清楚了。

对于那些不需要读取的单元

控制器并不关心它们当前存的是什么。它只希望它们:

别挡路。

所以,对这些未选中的单元,控制器会施加一个相对较高的电压,这个电压是 Vpass。

它的目的很简单:

不管这些单元原来的阈值电压是多少,都尽量把它们强行打开,让它们处于“放行”状态。

这样,未选中的单元就不再参与判决,它们只负责把整条通路保持畅通。


对于真正被选中的那个单元

情况就完全不同了。

这时候控制器不能直接给它一个很高的电压。
因为如果电压太高,那不管它处于什么状态,都会被打开,判别就失去意义了。

所以,对这个真正要读的单元,控制器施加的是一个测试电压,也就是 Vread。

这里一定要分清:

Vread 不是这个单元自己“带着的电压”。它是外部施加在控制栅极上的测试电压。

它的作用,不是保证导通,而是去试探:

这个单元当前到底有多难打开。

如果这次施加的 Vread 还不够高,无法克服浮栅电荷带来的屏蔽作用,沟道就形不成,这个单元就不导通。

如果 Vread 足够高,终于把沟道拉出来了,它才导通。

所以从物理层面看,读取的本质就是一个试探门槛的过程:

Vread 一点点升高,本质上是在逐步克服浮栅电荷带来的屏蔽作用。
当它刚好能够把沟道拉出来的那一刻,对应的那个门槛,就是这个单元当前的阈值电压。


五、NAND 不是把答案“测出来”,而是把它“夹出来”

这里还有一个很容易误解的地方。

虽然从物理上讲,你可以不断调整 Vread,逐步逼近这个单元的阈值电压;但在正常读取中,控制器通常不会真的去把精确阈值测出来。

原因很简单:

那样太慢了。

如果每次都从低到高一档一档扫过去,效率根本无法接受。

所以实际 NAND 读取真正做的事情是:

用几个预先设定好的参考电压,去判断这个单元的阈值电压大概落在哪个区间里。

也就是说,NAND 在读取时,看的并不是:

  • 这个单元上直接写着什么标签

而是在看:

  • 在这个参考电压下,它通不通
  • 换一个参考电压后,它又通不通
  • 于是它的阈值电压大概落在哪个区间

如果几个测试结果表明,这个单元的阈值电压落在某个状态对应的区间里,控制器就把它判成那个状态。所以 NAND 读取最底层的逻辑,并不是:

把值直接读出来

而是:

先把其他单元全部放行,只留下目标单元作为唯一关卡,再看整条通路到底通不通。

最终你真正得到的,并不是“这个单元主动亮出了身份牌”,而只是:

这条通路通了,还是没通。

所以 NAND 读取的第一层本质,不是“读值”,而是:

看它通不通。


六、更麻烦的是:“通不通”看的还不是强信号,而是一点点很微弱的痕迹

如果 NAND 读取只是“通 / 不通”,问题还没那么严重。真正难的地方在于:

“通 / 不通”依赖的不是一个强烈、清晰、稳定的信号,而是一点点非常微弱的电压变化。

那为什么“通/不通”会是一个非常微弱的电压变化呢?使用强烈、清晰、稳定的信号不是更好吗?

因为NAND 不是没有判决标准,难的是它拿来判决的证据,本身就很弱。目标 cell 就算导通,整条 string 的电流也通常只有 100~200 nA。这样的信号,远不足以直接变成一个干净的数字结果。它只能先在外围那根信号线上留下一个很细微的变化,然后再由后面的电路去判断:这点变化到底够不够算“导通”。说到这里,就必须先认识两个关键角色:bitline 和 sense amp。

这里必须先认识两个关键角色:

  • bitline
  • sense amp

1)bitline 到底是什么?

如果把 NAND 阵列想象成一个二维表格,横向的一根根线是 wordline,纵向的一根根线就是 bitline。

  • wordline 用来选中哪一个页
  • bitline 负责把这一列单元和外围读取电路连接起来

可以把 bitline 理解成:

这一列存储单元通向外部判断电路的一根信号竖线。

但 NAND 和很多人想象的不一样,它不是“一个单元配一根独立导线”。
在 NAND  string里,多个单元是沿着 bitline 方向串联在一起的。

所以读取某个单元时,外围电路面对的,不是一个孤立小器件,而是一整条串联路径。

这也意味着,控制器真正要判断的,不是“这个单元自己有没有亮灯”,而是:

这一列对应的这条串联通路,到底有没有被打通。


2)为什么不直接看“有没有电流”?

因为在电路里,“有电流”这件事并不总是那么容易直接、干净地看出来。

NAND 读取时,目标单元就算导通了,流过串的电流也非常小,远不是那种强到一眼就能判出来的程度。所以控制器不会傻等着看“有没有大电流冲出来”,而是换了一种更适合电路实现的办法:

先给 bitline 预充一点电,再看它会不会被这条串慢慢放掉。

这个动作,才是 NAND 读取的关键。


3)为什么 bitline 要先预充电?

因为 bitline 不只是一根线,它本身还带有寄生电容。可以把它想象成:

一根很长的细管子,同时还带着一点储电能力。

所以在正式判决之前,控制器会先把 bitline 充到一个初始电压。这个动作,相当于先给这根线“装上一点电”。

接下来就分两种情况。

情况一:目标单元在当前 Vread 下导通

如果目标单元被打开,而其他未选中的单元又都已经在 Vpass 下放行,那么整条串就形成了一条导通路径。这时,bitline 上原本那点电荷,就可以顺着这条路径慢慢泄掉。

结果就是:

bitline 电压开始下降。

情况二:目标单元在当前 Vread 下不导通

如果目标单元没被打开,那整条路径就被卡在这里。bitline 上的电荷泄不出去,电压就保持得更多。

结果就是:

bitline 电压下降得很少,甚至几乎不掉。

所以读取时,外围电路真正观察的,并不是“单元自己在说话”,而是:

bitline 在这一小段时间内,电压掉了多少。

这一步非常关键。

因为它说明 NAND 读取并不是在“直接读取某个标签”,而是在看:

这个单元有没有让 bitline 产生一个足够明显的放电痕迹。


4)sense amp 在干什么?

sense amp,一般叫灵敏放大器。

但它不是那种“把信号放大一点”这么简单的东西。
在 NAND 读取里,它更像一个非常敏感的裁判。

它干的事情是:

观察 bitline 当前的电压状态,然后拍板:这到底算导通,还是不算导通。

注意,sense amp 不是直接帮你找状态编码。
它先做的是更底层的一件事:

把一个很小、很模糊、还带着噪声的模拟变化,强行变成一个二值判断。

也就是:

  • 这个变化够明显 → 算导通
  • 这个变化不够明显 → 算不导通

所以整个读取过程,其实可以理解成:

  1. bitline 先被充到一个初始电压
  2. 目标单元如果导通,就让 bitline 慢慢掉电
  3. sense amp 在某个时刻去看这个 bitline
  4. 然后判断:它掉得够不够多

这一步之后,控制器才有资格往上层继续做:

  • 它在这个 Vread 下导通了
  • 或者没导通
  • 那它的阈值大概在哪个区间
  • 最终映射成哪个状态

所以从职责上讲:

  • bitline 承载的是那个非常微弱的物理变化
  • sense amp 负责把这个变化判成“是”还是“否”

七、这就是为什么读操作天然带着“猜”

到这里,你应该就能明白“弱信号”是什么意思了。

NAND 读取不是那种:

  • 一通电,结果立刻跳出来
  • 高就是高,低就是低
  • 几乎没有解释空间

它更像是:

先给 bitline 存一口气,再看目标单元能不能把这口气慢慢放掉。

问题就在于,这个“放气”的过程:

  • 很慢
  • 很小
  • 很容易被干扰
  • 而且最后还要在边界附近拍板

所以 sense amp 看到的,不是一个特别确凿的证据,而只是一个:

bitline 掉了一点点,或者没掉太多的细微差别。

这就是为什么 NAND 读取天然带着脆弱感。

因为只要下面这些因素稍微变一点:

  • bitline 上耦合噪声多一点
  • 温度变一点
  • 浮栅里的电荷漂一点
  • 数据保持让阈值电压偏一点
  • 放电速度慢一点
  • sense amp 自己的判决门限卡得紧一点

最后那个“到底算不算导通”的结果,就可能翻过去。

所以 NAND 读取真正难的地方,不是说它没有 Vread 这个标准。标准当然有。
难的是:

它拿来套这个标准的证据,本身就很弱。

换句话说,NAND 最底层做的,不是在看一个清清楚楚的答案,而是在观察:

bitline 上那一点点几乎看不清的变化,够不够像“它导通了”。

这也决定了,NAND 的本质一定带着“猜”。


结尾

我们总以为,存储是一件很确定的事。

写进去的数据,就该安安静静躺在那里;需要的时候,再被完整地拿出来。

但 NAND 不是这样。

它的底层,从来不是一个干净、整齐、没有争议的世界。
那里充满了电荷、漂移、门槛、扰动、噪声,以及一层层并不完美的判决。

所以所谓读取,从来不是把答案直接取出来。

而是:

先用参考电压去试探,
再看一条 bitline 上那一点点微弱的变化,
最后尽可能判断:它原本最可能是谁。

这就是 NAND 读取真正的本质。

不是读取。
而是猜测。