很多人以为,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 不是直接帮你找状态编码。
它先做的是更底层的一件事:
把一个很小、很模糊、还带着噪声的模拟变化,强行变成一个二值判断。
也就是:
- 这个变化够明显 → 算导通
- 这个变化不够明显 → 算不导通
所以整个读取过程,其实可以理解成:
- bitline 先被充到一个初始电压
- 目标单元如果导通,就让 bitline 慢慢掉电
- sense amp 在某个时刻去看这个 bitline
- 然后判断:它掉得够不够多
这一步之后,控制器才有资格往上层继续做:
- 它在这个 Vread 下导通了
- 或者没导通
- 那它的阈值大概在哪个区间
- 最终映射成哪个状态
所以从职责上讲:
- bitline 承载的是那个非常微弱的物理变化
- sense amp 负责把这个变化判成“是”还是“否”
七、这就是为什么读操作天然带着“猜”
到这里,你应该就能明白“弱信号”是什么意思了。
NAND 读取不是那种:
- 一通电,结果立刻跳出来
- 高就是高,低就是低
- 几乎没有解释空间
它更像是:
先给 bitline 存一口气,再看目标单元能不能把这口气慢慢放掉。
问题就在于,这个“放气”的过程:
- 很慢
- 很小
- 很容易被干扰
- 而且最后还要在边界附近拍板
所以 sense amp 看到的,不是一个特别确凿的证据,而只是一个:
bitline 掉了一点点,或者没掉太多的细微差别。
这就是为什么 NAND 读取天然带着脆弱感。
因为只要下面这些因素稍微变一点:
- bitline 上耦合噪声多一点
- 温度变一点
- 浮栅里的电荷漂一点
- 数据保持让阈值电压偏一点
- 放电速度慢一点
- sense amp 自己的判决门限卡得紧一点
最后那个“到底算不算导通”的结果,就可能翻过去。
所以 NAND 读取真正难的地方,不是说它没有 Vread 这个标准。标准当然有。
难的是:
它拿来套这个标准的证据,本身就很弱。
换句话说,NAND 最底层做的,不是在看一个清清楚楚的答案,而是在观察:
bitline 上那一点点几乎看不清的变化,够不够像“它导通了”。
这也决定了,NAND 的本质一定带着“猜”。
结尾
我们总以为,存储是一件很确定的事。
写进去的数据,就该安安静静躺在那里;需要的时候,再被完整地拿出来。
但 NAND 不是这样。
它的底层,从来不是一个干净、整齐、没有争议的世界。
那里充满了电荷、漂移、门槛、扰动、噪声,以及一层层并不完美的判决。
所以所谓读取,从来不是把答案直接取出来。
而是:
先用参考电压去试探,
再看一条 bitline 上那一点点微弱的变化,
最后尽可能判断:它原本最可能是谁。
这就是 NAND 读取真正的本质。
不是读取。
而是猜测。
Alipay
Wechat