前言:把欠的账还上

《从 DRAM 到 HBF》写到第 008 篇,讲完 NAND 的大概之后,我留了一句话:”涉及物理细节和深入话题(浮栅结构、Vth 分布、Read Level、接口 Training 等),这篇点到为止,后续再开专题细聊。” 然后就拐去讲 HBF 的规范了。

欠的账,这个系列来还。

先交代定位,免得进来的人走错门:

  • 比《从 DRAM 到 HBF》深一层。那套系列回答”为什么要有这一层存储”,这套回答”这一层里面到底怎么运转”。
  • 比 datasheet 浅一层。会保留关键的命令码、电压量级、时序参数,但不逐条抄规范——那些该由厂商手册负责,抄得再全也长不出理解。
  • 一篇只回答一个问题,回答到底。

第一篇的问题最朴素:NAND 到底是怎么把 1 个 bit 写进去的?

剧透答案:给控制栅加上约 20 V 的电压,然后真正被关进浮栅的电子,只有几百个。

这个数字我第一次算出来的时候也愣了一下——手机里存着几万张照片,每张照片几十万个 bit,每个 bit 背后站着的”犯人”,只有几百个。下面把这件事从头拆一遍。

一、先看 Cell 长什么样:一块夹心饼干

NAND 存 1 个 bit 的最小单元叫 Cell,本体是一颗浮栅晶体管(Floating-gate MOSFET,FGMOS)。它和普通 MOSFET 的差别,一句话说清:在控制栅和沟道之间,多塞了一层被绝缘体完全包住的浮栅。

浮栅晶体管剖面:控制栅在最上,浮栅被两层氧化层夹在中间,像一块夹心饼干

从上往下,五层结构:

  • 控制栅(Control Gate):最外层的电极,负责”发号施令”——所有操作电压都加在它(或衬底)上。
  • 阻挡层(IPD,层间介质):把浮栅和控制栅隔开的绝缘层。
  • 浮栅(Floating Gate):真正存电子的地方。它四周全是绝缘体,没有任何一根导线连到它——这就是”浮”字的含义,也是非易失性的物理根源。
  • 隧穿氧化层(Tunnel Oxide):极薄的一层绝缘体(量级几纳米到十纳米),电子进出的唯一关卡。
  • 衬底(Substrate)与源漏(Source / Drain):晶体管的”地基”和出入口,中间那一段叫沟道。

对比一下普通 MOSFET:普通管只有一个栅,撤掉电压,沟道恢复原状,什么都不留下——它只能当个开关。FGMOS 多出的那层浮栅,让晶体管从”临时开关”变成了”永久记忆体”:电子进去了,就出不来。

一个准确性上的补丁。 今天主流的 3D NAND 大多已经换成了 CTF(Charge Trap Flash,电荷陷阱)——用一层氮化硅里的”陷阱”锁住电子,而不是一整层导电的浮栅。但两者追求的是同一件事:把电子关在一个没有导线连接的地方。为了讲清原理,这个系列仍沿用”浮栅”这个叫法,遇到差异会单独点出来。

二、电子怎么进去,又为什么出不来

要让电子穿过绝缘层,靠的是量子隧穿(Tunneling)——量子力学里一个反直觉的现象:粒子有一定概率穿过它”本来没有能量翻过去”的势垒,像穿墙术。

墙要多厚,才拦得住电子

隧穿概率对势垒厚度极其敏感,大致随厚度指数下降。所以这道墙的设计有个精妙的平衡:

  • 太厚 → 电子进不去也出不来,写不动;
  • 太薄 → 电子自己就漏走了,数据保不住。

工程上落在几纳米到十纳米的量级,再配合约 10 MV/cm 量级的场强(可以粗略理解成”每厘米一千万伏”)才能把隧穿概率拉到可用。约 20 V 加在几十纳米的栅叠层上,正好落在这个区间。

为什么”进去了就不出来”

关键在电场撤掉之后发生了什么:没有电场,隧穿概率低到可以忽略。浮栅四周是绝缘体,电子既没有导线可走,又没有足够的能量翻过势垒,于是被”关”在里面。

这就是”非易失”三个字的全部内容。它不是什么神秘机制,只是一道足够高的墙,加一段足够长的等待——断电十年,电子还在里面。

但隧穿是”概率性”的

这里埋一个后面要反复用的伏笔:隧穿是概率事件,并不是所有电子在同一瞬间完成穿越。

这一个”概率性”,直接决定了 NAND 世界里一堆事情的形态:为什么 Vth 是一条钟形曲线而不是一根线,为什么需要一整套纠错码,为什么读取要设那么多档判断电压。这个系列的后半程会一次次回到这句话。

三、电子一多,Vth 就高了

现在浮栅里有电子了,怎么读出”这是 1 还是 0”?

先看 MOSFET 本身的性格:它本质是一个电压控制的可变电阻。在栅极和源极之间加电压 Vgs,漏极到源极之间的导通程度就跟着变。

转移曲线(Id–Vg):浮栅里的电子把整条曲线往右推,Vth 因此升高——ΔVth 就是存进去的电荷量

横轴是栅压 Vgs,纵轴是漏极电流 Id。曲线长这样:Vgs 低时几乎不导通,越过某个点之后电流陡然上升、最后饱和。那个”刚好开始导通”的临界点,就是阈值电压 Vth。

浮栅里的电子,等于一个”负偏压”

浮栅里存了电子,等于在栅极和沟道之间偷偷叠了一个负向的内建偏压 Vfb。真正作用在沟道上的有效电压就变成了:

Vgs(eff) = Vgs(外施) − Vfb

也就是说,要让沟道导通的难度变大了:外施电压得先把这份”负偏压”抵消掉,剩下的才能用来开沟道。等效地看,就是 Vth 变高了——整条曲线往右平移。

于是读取的逻辑就成立了:给一个固定的判断电压,看它导通不导通。

状态 浮栅电子 Vth 施加 Vread 读出
擦除态 无 低 Vread ≥ Vth → 导通 1
编程态 有 高 Vread < Vth → 截止 0

注意这张表的方向——它和不少人的直觉相反,但必须记住:

  • 擦除 = 把电子赶出去 = Vth 变低 = 逻辑 1;
  • 编程 = 把电子塞进去 = Vth 变高 = 逻辑 0。

所以 NAND 的”写”(Program)是单向的:只能往里加电子,只能把 1 改成 0。想把 0 改回 1?没有这种操作,只能整块擦掉重来。后面讲写放大、垃圾回收时,那些别扭的机制都是从这条规矩里长出来的。

四、三种电压,三种命运

同一个 Cell,三种操作靠三种电压区分:

操作 电压量级 干什么 对 Vth 的影响
Program(编程 / 写) 约 +18 ~ +20 V(加在控制栅) 电子隧穿进入浮栅 升高
Erase(擦除) 约 −18 ~ −20 V(加在控制栅,或衬底加正高压) 电子被拉出浮栅 降低
Read(读取) 0 ~ 10 V 之间的若干档 只检测导通状态 不改变

三个细节值得停一下。

读为什么不改变数据? 因为读取用的电压永远低于”能让电子隧穿”的场强门槛。读操作只是”看一眼”,不动手。

擦除为什么只能整块来? 因为一个 Block 里所有 Cell 的衬底(P-well)是连在一起的。擦除的做法是给整个衬底加高压,让这个 Block 里所有 Cell 的电子一起被拽出去——物理上做不到只擦其中一页。这就是”Block 是最小擦除单位”的由来,也是 FTL(闪存转换层)那一整套复杂机制的总根源。

为什么写和擦的极性要相反? 因为要让电子往相反方向跑。加正高压,电子从沟道隧穿进浮栅;加负高压(或给衬底加正高压),电子从浮栅隧穿回沟道。同一道墙,两个方向。

五、一步一台阶:ISPP 与那几百个电子

现在回到开头那个问题:为什么加了 20 V,只进去几百个电子?

先说结论:因为根本不会一次加到位。

不能”一把梭”

假设直接给一个刚好能把 Vth 顶到目标的电压。问题在于隧穿是概率性的:这一批 Cell 里,有的墙薄一点、有的杂质少一点,隧穿得快;有的慢。同样是 20 V、同样加这么长时间,结果会散成一片 Vth。

更麻烦的是:一旦充过头,没有”往回拧”这个动作——想把电子减回去,只能整块擦除。

所以工程上的做法是小步逼近:

ISPP 增量步进脉冲编程:每个脉冲后校验一次,没到目标就把电压抬高一个 ΔVpp 再来——像上台阶一样逼近目标 Vth

这套流程叫 ISPP(Incremental Step Pulse Programming,增量步进脉冲编程):

  1. 先给一个偏保守的编程电压,打一个脉冲;
  2. 校验(Verify):读一下,和目标的判断电压比一比;
  3. 没到?把电压抬高一个 ΔVpp(量级约 0.2 ~ 0.5 V),再打一个脉冲;
  4. 重复,直到校验通过。

每一步只挪一小格,充过头的概率大幅降低,最终落在目标档位上的 Cell 也更集中。代价是慢——写完一个 Cell 要打好几个脉冲。精度、速度、寿命,又一次明码标价的交换。

顺带一提,这也是”写比读慢得多”的底层原因之一:读是一次判断,写是一串”脉冲 + 校验”的循环。

算一下那几百个电子

现在可以算账了。一个现代 NAND Cell,控制栅到浮栅的耦合电容,量级在几 aF 到十几 aF(1 aF = 10⁻¹⁸ F)。SLC 的编程窗口,大约是 2 ~ 3 V 的量级。

用 Q = C × ΔV 粗算,取 C ≈ 10 aF、ΔV ≈ 3 V:

Q ≈ 30 aC,折成电子数 ≈ 30 × 10⁻¹⁸ ÷ (1.6 × 10⁻¹⁹) ≈ 不到 200 个

也就是说,把一个 bit 从 1 写成 0,真正挪动的电子大约就是几百个这个量级。

这个数字解释了 NAND 的很多”娇气”:电子数越少,一个跑错队的电子占比就越大。温度一高、放得久了、读得多了,几十个电子悄悄溜走,读出来的值就可能翻面。存储的可靠性,本质上是在跟极小的数字搏斗。

(以上是量级估算,不同代际、不同结构的 Cell 差异不小;要精确值只能看具体产品的 datasheet 和实测。)

“只进不出”反而是好事

最后给这条单向规矩说句公道话:正因为编程只能加电子、擦除只能整块来,NAND 才得以把 Cell 做得极小、极密、极便宜——每次操作都不需要知道”原来是什么”,只需要”再垫一点”。

这种”只追加、不修改”的思路你其实很熟:数据库的追加式日志(WAL)、对象存储的不可变数据、Git 的提交历史,都是同一个智慧。用”不能改”换来”可以极快、极省地写”。

总结:一个 bit 的一生

  • Cell = 一块夹心饼干:控制栅、阻挡层、浮栅、隧穿氧化层、衬底。浮栅四周没导线,这是非易失性的根源。
  • 进出的唯一通道是隧穿,靠强电场把概率拉起来;电场一撤,概率低到可以忽略,电子就被关住了。
  • 电子一多,Vth 就高:整条 Id–Vg 曲线右移,固定读电压一看,1 和 0 就分开了。记住方向——擦除是 1,编程是 0。
  • 三种电压分工:约 +20 V 写、约 −20 V 擦、0~10 V 读。读不动数据,擦只能整块。
  • ISPP 小步逼近:一次只垫一格 ΔVpp,靠 verify 收口。一个 bit 的差别,其实只有几百个电子。

那么下一个问题自然就来了:既然编程是一个脉冲一个脉冲垫上去的,几百万个 Cell 的 Vth 怎么可能整齐划一?

答案是不可能。它们会散成一堆”钟形”的峰——而 TLC 要在一个窗口里塞下 8 个这样的峰。

下一篇,我们就把这 8 个峰拆开看:Vth 为什么天然服从正态分布,以及为什么 TLC 的 8 个峰偏偏要按格雷码排——一个听起来跟存储八竿子打不着的词,居然是 NAND 可靠性的关键设计。

我们下一篇见。