全文约 2200 字|阅读约 9 分钟

上一篇写 Erase 的时候,我们一直在看电子怎么从 Floating Gate 里出去。

那反过来,Program 又是怎么把电子送进去的?

我以前对 Program 的理解其实很简单:Wordline 上加一个很高的电压,电子穿过 Tunnel Oxide 进入 Floating Gate,Vth 升高,结束。

这句话不能算错。

但后来再去看真正的 Program Algorithm,我才发现,真正有意思的问题其实不是“电子怎么进去”,而是:

既然已经知道加高压可以让电子进去,为什么 NAND 不一次把 Cell Program 到位,而是要一下一下地打很多个 Pulse?

这一篇就从一颗 Cell 开始,把这件事顺下来。

一、Program 的时候,电子到底怎么进去?

还是回到 SSD42 里的那颗经典 Floating Gate Cell。

Program 时,被选中的 Wordline,也就是这个 Cell 的 Control Gate,会被拉到很高的正电压。经典 Floating Gate NAND 的公开资料里,Program Voltage 可以到二十多伏;而需要真正执行 Program 的 Cell,Channel 一侧维持在比较低的电位。

Floating Gate 本身没有接线,但它会受到 Control Gate 的电容耦合。

于是 Control Gate 一上高压,Floating Gate 的电位也会被带起来。Floating Gate 和下方 Channel 之间隔着的 Tunnel Oxide 很薄,这时它的两侧就出现了一个很强的电场。

电场强到一定程度,熟悉的一幕又出现了。

还是 Fowler-Nordheim Tunneling,也就是 F-N 隧穿。

只不过方向和 Erase 正好相反:

Erase:电子从 Floating Gate 穿过 Tunnel Oxide 跑出去。

Program:电子从 Channel 一侧穿过 Tunnel Oxide,进入 Floating Gate。

墙并没有被“打穿”。Tunnel Oxide 仍然是绝缘层,只是在强电场作用下,电子有了一定概率通过量子隧穿穿过去。

所以所谓 Program,从 Cell 的角度看,第一步其实很简单:

往电荷存储层里增加电子。

二、电子进去以后,为什么 Vth 会升高?

电子进入 Floating Gate 以后,Floating Gate 上的负电荷越来越多。

这时候,Control Gate 再想控制下面的 Channel,就没原来那么容易了。

可以把它理解成:Control Gate 原本施加一个正电场,想把 Silicon 表面的电子吸引过来形成 Channel;但 Floating Gate 上现在多了一堆负电荷,它会抵消掉一部分 Control Gate 的作用。

于是,要让 Channel 再次“刚好形成”,Control Gate 就必须施加更高的正电压。

而这个临界电压,就是 Vth。

所以整个过程可以连起来:

电子进入 Floating Gate → Floating Gate 变得更负 → CG 需要更高的电压才能形成 Channel → Vth 上升。

从 Cell 的角度看,Program 真正在改变的,其实不是一个抽象的“0”或者“1”。

它是在改变电荷状态,再通过电荷状态改变 Vth。

最后到底读成什么数据,是由这个 Vth 落在哪个区间决定的。

三、那为什么不一发高压直接打到位?

这才是 Program 真正有意思的地方。

既然高压能让电子进去,那我把 Program Voltage 直接调好,一发打到目标位置,不就行了吗?

问题在于,F-N Tunneling 对电场非常敏感。

更关键的是,电子进去以后,Program 自己也会变得越来越难。

因为已经注入 Floating Gate 的负电荷,会削弱 Tunnel Oxide 上原来的有效电场。电场下降以后,F-N Tunneling Current 也会跟着下降。也就是说,在同一个 Program Pulse 里,随着越来越多电子进去,后面的电子会越来越难继续进去。

有点像一扇门。

刚开始门开得比较大,电子往里走;进去的人越来越多以后,反过来把这扇门一点一点顶回来。

所以一次 Program Pulse,通常只能把 Vth 往前推一截。

如果还想继续推,就要在下一轮把 Program Voltage 再提高一点,把有效电场重新拉起来。

这也是为什么 Program 不适合“一锤砸到底”。

你真正想要的不是“电子进去得越多越好”,而是:

让 Vth 最后停在它应该停的位置。

四、NAND 的办法:推一下,量一下

既然一次推不准,那就不要一次推完。

真正的 Program 会被拆成很多个小循环。

这个过程叫 ISPP,Incremental Step Pulse Programming,也就是增量步进脉冲编程。

它的思路其实非常朴素:

Program Pulse → Verify → 还没到 → 电压再提高一点 → 再 Program

先打一发比较短的 Program Pulse,让一些电子进入存储层,Vth 往上走一点。

然后马上做一次 Program Verify。

Verify 本质上是在问:

这个 Cell 的 Vth 到目标了吗?

如果还没到,下一发 Program Pulse 的电压就再提高一点;如果已经达到目标,这个 Cell 就停止继续 Program。公开资料里的典型 ISPP 正是这样:每一轮 Program Pulse 之后都会 Verify,没有达到目标的 Cell 继续下一轮,而已经达到目标的 Cell 会进入 Program Inhibit,不再继续被推高。

所以 Program 并不是:

“算一个准确电压,然后一次写进去。”

而更像:

推一点。

看一眼。

还差一点,再推。

到了,就停。

这时候再回头看 ISPP 的“Incremental Step”,就很形象了。

每走一步,Program Voltage 往上抬一点,Cell 的 Vth 也跟着一点一点往目标位置靠近。资料里的经典模型甚至给出了很直观的结果:在这种 ISPP 控制下,Vth 每一步的变化可以近似跟随 Program Voltage 的步进。

Program 的精度,不是靠一次把电压算得特别准,而是靠边写边验。

五、同一根 Wordline 都吃到高压,为什么不是所有 Cell 一起被写?

讲到这里,又会自然冒出一个问题。

一根 Wordline 上挂着那么多 Cell。

Program Voltage 加到 Selected Wordline 上以后,这一行 Cell 明明都“看到”了高压。

那为什么有些 Cell 要继续 Program,有些 Cell 已经到位以后却可以停下来?

这里就要用到 Program Inhibit,也就是编程抑制。

它的核心思想其实也不复杂:

既然 Program 靠的是 Tunnel Oxide 两边足够大的电压差,那对于不想继续 Program 的 Cell,我把它下面的 Channel 电位也抬高,不就行了吗?

Channel 一高,Tunnel Oxide 两边的有效压差变小,F-N Tunneling 就被压下去了。

所以即使同一根 Wordline 上的 Cell 一起面对 Program Voltage,也不意味着它们一定一起继续 Program。Page Buffer 会根据 Program Data 和 Verify 的结果,控制哪些 Cell 继续,哪些 Cell 进入 Inhibit。

至于 Channel 到底是怎么被抬起来的,为什么会自己“升压”,这一篇先不展开。

这个机制有一个专门的名字:

Self-Boosted Program Inhibit。

我觉得值得下一篇单独讲。

写到最后

现在再回头看“把数据写进 NAND”这句话,会发现它其实挺容易让人误解。

Cell 里面并没有一个小开关,被控制器从 0 拨到 1。

真正发生的是:

Control Gate 加高压。

Tunnel Oxide 上形成强电场。

电子通过 F-N Tunneling 进入电荷存储层。

负电荷增加,Cell 的 Vth 上升。

Program Pulse 把 Vth 推一点,Verify 看一眼。

还没到,就继续;到了,就停。

所以如果让我现在用一句话解释 Program,我会说:

Program,就是一点一点往存储层里增加电子,再通过一次次 Pulse + Verify,把 Cell 的 Vth 推到它应该去的位置。

而且这里还有一个很重要的区别:

NAND 可以很精细地“加”电子,却不能像改寄存器一样,想把某几个电子再精细地拿回来。

这也是为什么 NAND 可以 Page Program,却必须 Block Erase。

至于同一根 Wordline 上,已经 Program 到位的 Cell 到底是怎么“下车”的,下一篇就接着讲 Program Inhibit 和 Self-Boosting。

谢谢你读我的文章