NAND技术(三):终于讲明白:为什么 NAND 不能原地改写?从 Vt Window、Sense Amp、写放大到 SSD Channel,一次把 NAND 续篇补全
2026-07-17 10:42:01

上一篇我们讲了 NAND 的 channel、die、LUN、P/E cycle、LDPC、DQS、ODT 等概念。看完以后,很多问题会自然冒出来,而且这些问题比“ONFI 是什么”更接近工程现场。

比如:

已经 program 过的 page,为什么不能像硬盘一样直接覆盖? 一个 block 里可能几百甚至几千个 page,erase 的时候难道都要搬家? Vt 是不是 Voltage threshold?Vt window、Vt shift 又到底在看什么? Sense amplifier 是不是因为 cell 电流太弱,所以要放大? SSD 的写放大到底从哪里来?为什么 FC SAN 存储系统也会有写放大? 主流 cSSD / eSSD controller 到底有几个 NAND channel?一颗 BGA152 NAND package 能不能接两个 channel?

这些问题很关键。因为它们把 NAND 从“概念科普”推进到了“真正做 SSD、NAND 测试、controller 验证时必须搞明白”的层面。

一、为什么已经 Program 过的 Page 不能随便再写?

先说最重要的一句话:

NAND 的写入,本质上不是像铅笔写字那样随时擦掉重写,而更像往一个很小的电荷水桶里继续加水。加水相对容易,但要把水精确倒回某个刻度,非常难。

在 NAND 里,Erase 之后的 cell 通常处于一个“擦干净”的状态。以传统表达方式来说,很多 NAND 会把 erased state 看成逻辑 1。Program 的过程,是通过电场把电荷注入 floating gate 或 charge trap 结构,让 cell 的阈值电压 Vt 升高,从而变成某个 programmed state。公开资料里也经常把 program 描述为把电荷注入 floating gate,erase 则是把电荷移走;program/read 通常按 page 进行,而 erase 按 block 进行。

问题来了: 如果一个 page 已经 program 过,你想把它改成另一组数据,很多 cell 的 Vt 可能需要降低,而不是升高。

但 program 操作比较擅长“继续把 Vt 往上推”,并不擅长把某个 cell 的 Vt 精确拉低一点点。真正把电荷整体清掉,通常要靠 erase。而 NAND 的 erase 不是按 page,而是按 block。

为什么 erase 粒度这么粗?因为 NAND 阵列的物理结构决定了 erase 通常要对一个 block 共享的结构施加高电压。你很难只把一个 page 对应的 cell 精确擦掉,同时完全不影响同一个 block 里的其它 page。可以把它想成一排货架共用一套高压清洗系统:清洗时只能清洗整排货架,而不是只冲其中一个小格子。

所以 NAND 的基本规则就是:

Read:按 page 读。 Program:按 page 写。 Erase:按 block 擦。

这也是 SSD Controller 必须做 FTL、垃圾回收、磨损均衡的根本原因。

二、Erase 一个 Block 时,几百/几千个 Page 都要搬家吗?

不一定。这个地方特别容易误解。

Erase 一个 block 之前,SSD Controller 要先看这个 block 里还有没有“有效数据”。

假设一个 block 里有 1024 个 page:

如果 1024 个 page 都已经无效,直接 erase 就行,不用搬任何数据。 如果 900 个 page 无效,124 个 page 仍然有效,就只搬那 124 个有效 page。 如果大部分 page 都有效,Controller 通常不会优先选择这个 block 做垃圾回收,因为搬家成本太高。

这就是垃圾回收选择 victim block 的艺术。

Controller 会尽量挑那些“垃圾最多、有效数据最少”的 block 来回收。比如一个 block 里 90% 都是过期数据,只剩 10% 有效数据,那就很适合做 GC。ATP 对 SSD endurance / garbage collection 的解释也提到,当一个 used block 中仍有 valid data 时,controller 需要先把有效数据复制到空 block,然后原 block 才能整体 erase。

所以答案是:

Erase 是整 block 擦,但搬家只搬有效 page,不搬无效 page。

这就像仓库清理:

一整排货架要重新喷漆。 过期货不用搬,直接扔。 还要卖的货,必须先搬到别的货架。 货架喷完漆,才可以重新上货。

如果这个 block 里有效 page 越多,搬家越多,写放大越严重。 如果这个 block 里几乎全是无效 page,erase 就很轻松。

三、Vt 是 Voltage Threshold 吗?更准确叫 Threshold Voltage

我们平时说的 Vt,严格来说是Threshold Voltage,中文叫阈值电压

你说 Voltage Threshold,工程师之间也能理解,但标准表达更常见的是 Threshold Voltage。

通俗讲,Vt 就是让一个 memory cell transistor “刚好导通”所需要的电压。

可以继续用“水桶刻度”来理解:

Cell 里存了多少电荷,就像水桶里有多少水。 水越多,门越难打开。 门刚好被推开的那个力度,就是 Vt。

NAND 读数据时,不是真的把电荷拿出来数,而是给 cell 一个参考读电压,看它导不导通。导通和不导通之间,就可以判断这个 cell 落在哪个状态。

Kioxia 对多值 NAND 的科普里,也用不同阈值电压状态来解释多值化存储:一个 cell 不只是区分 0/1,而是通过多个阈值电压范围表示多个数据状态。

四、Vt Window 是什么?用 TLC / QLC 来看最直观

Vt window 可以理解成 NAND cell 可用的“阈值电压刻度范围”。

如果是 SLC,每个 cell 只存 1 bit,只需要 2 个状态:

Erase state Program state

两个状态之间距离很宽。就像停车场只有两条车道,中间隔得很远,不容易停错。

TLC 每个 cell 存 3 bit,要分成 8 个状态。通常可以想象成:

Er, P1, P2, P3, P4, P5, P6, P7

QLC 每个 cell 存 4 bit,要分成 16 个状态:

Er, P1, P2 ... P15

问题是,整个可用 Vt 范围并不会因为你从 TLC 变成 QLC 就无限变大。原来两条车道,现在要划成 8 条、16 条,每条车道自然变窄。

所以:

TLC 的 Vt window 要容纳 8 个状态。 QLC 的 Vt window 要容纳 16 个状态。

状态越多,相邻状态之间的 margin 越小。 margin 越小,就越怕噪声、温度、老化、read disturb、program disturb、retention loss。

可以把 Vt distribution 想象成一排小山包。每一个小山包代表一种数据状态。Controller 读数据时,会在两个小山包之间放一条“判决线”,也就是 read reference voltage。

如果小山包之间距离很远,判决很容易。 如果小山包越挤越近,稍微一漂移,就会压线、串线、读错。

这就是 TLC、QLC 难做的根本原因之一。

五、Vt Shift 是什么?为什么 NAND 测试经常盯着它?

Vt shift,就是这些“小山包”在电压轴上移动了。

比如刚 program 完的时候,P7 状态的小山包在一个位置。 经过高温烘烤、长时间 retention、反复 read disturb、很多次 P/E cycle 后,它可能往左移,也可能变宽,还可能和邻近状态发生重叠。

这就是 Vt shift / Vt distribution widening。

它重要在哪里?

因为 SSD Controller 的读阈值是放在相邻状态之间的。如果 Vt 分布整体漂了,原来的 read threshold 就不再是最佳位置。Controller 可能需要 read retry,换几个参考电压再读,甚至需要 LDPC soft decode 才能救回来。

学术研究里也反复提到,NAND 的错误和 threshold voltage distribution 的变化密切相关;read disturb 研究中也明确观察到 read operation count、P/E cycle、retention age 会影响 threshold voltage shift 和错误率。

通俗一点:

刚出厂时,车道线很清楚。 用久以后,车道线被雨水冲淡,车也开始漂。 Controller 原来按旧车道线判断,现在就容易误判。 Vt shift 测试,就是看这些车道线到底漂了多少。

六、NanoCycler 怎么测 Vt Shift?

这里要讲一个很真实的工程限制:

普通用户模式下,测试设备通常不能像 NAND 原厂 test mode 那样,直接逐个 cell 测出真实阈值电压。

NplusT 的 NAND characterization 文章里也提到,NAND characterization 通常是在 user mode 下执行,因为 NAND 原厂的 test mode 不公开;test mode 才能提供 cell-level threshold voltage / current 等更高可见性。

那在 user mode 下怎么办?

答案是:通过read retry / read threshold sweep 间接重建 Vt 分布。

简单说,NanoCycler 这类 NAND characterization 平台可以按工程实验流程去做:

先选定某些 block/page/wordline。 写入特定 pattern,比如 pseudo-random、全 0、全 1、checkerboard 等。 做预处理,比如 P/E cycling 到 100、500、1000、3000 次。 施加 stress,比如 read disturb、program disturb、retention bake、高温、低温。 然后用不同 read reference voltage 多次读取。 统计每个 read threshold 下的 bit error / RBER。 通过这些数据推算 Vt distribution、Vt shift、distribution widening。

NplusT 的资料里把实验条件拆成 pre-conditions、solicitations 和 observations:pre-condition 包括 P/E cycles、patterns、read stress;solicitation 包括 P/E/R patterns、read disturb、program disturb、retention time、temperature、voltages、interface speed 等;observation 包括 RBER、readout content、response times、Vt、Icc。

更关键的是,NplusT 明确提到,在 user mode 限制下,可以使用 read retry commands 获得足够准确的 Vt distribution,用来观察分布的 shift 或 widening。

所以,NanoCycler 不是把探针扎到每个 cell 里直接量电压,而是像医生做影像诊断:

不打开身体直接看细胞, 而是通过多角度扫描、不同参数读数、错误分布统计, 把内部状态反推出一张“可靠性地图”。

这就是 NAND characterization 的价值。

七、Sense Amplifier 是干什么用的?

你的理解方向是对的。

Sense amplifier 可以理解成 NAND 内部的“微弱信号判读器”。

NAND 读一个 cell 时,真正要判断的是: 在某个 read reference voltage 下,这个 cell 对应的通路到底导不导通? bitline 上的电流/电压变化到底落在哪一边?

这个信号非常小,而且 NAND array 很大,bitline 很长,寄生电容和噪声都存在。直接把这个微弱变化拿出来当数字 0/1,并不现实。

所以需要 sense amplifier。

它会把 bitline 上非常小的电流或电压差异,与参考电流/参考电压比较,然后放大并锁存成清晰的数字结果。

这就像夜里看远处一盏很弱的灯。

人眼直接看,可能觉得“亮了?没亮?” 望远镜加图像增强以后,就能更清楚地判断。 Sense amplifier 就是 NAND 里的“图像增强器 + 判决器”。

专利和电路资料中也会把 flash read 描述为通过 sense amplifier 感测 bitline 上由 cell 状态决定的电流/电压,并将其转换成数据。

八、High-Voltage Generator / Charge Pump 是干什么的?

NAND 的外部供电可能只有 3.3V、1.8V、1.2V 这类电压,但 NAND 内部 program / erase / pass-through read 等操作需要更高、更复杂的电压。

比如:

Program 需要把电荷注入 cell。 Erase 需要把电荷从 cell 中移走。 Read 时还要给选中 wordline 和未选中 wordline 不同的电压。 Read disturb / program disturb 很多也和这些内部电压有关。

这些高压不能都从外部直接给,所以 NAND 内部会有 high-voltage generator,也就是高压发生器。Charge pump 是其中非常常见的一种实现方式。

Charge pump 可以理解成片内“电压升压泵”。

外部给它 1.8V 或 3.3V, 它通过电容开关电路一节一节“打气”, 在内部生成 program、erase、read pass 所需的高电压。

一些资料会提到,NAND flash 的 program 和 erase 需要高电压,high-voltage generator / charge pump 就是为了产生这些内部操作电压。

形象一点:

VCC 像城市自来水。 Charge pump 像楼里的增压泵。 普通洗手用自来水就够了,但高压冲洗整排货架时,必须打开增压泵。

九、SSD 的“写放大”到底怎么来的?

写放大,英文 Write Amplification。

最简单的定义是:

主机以为自己只写了 1GB,但 SSD 内部 NAND 实际可能写了 1.5GB、2GB,甚至更多。这个倍数就是写放大。

公式可以这样理解:

WAF = NAND 实际写入量 / Host 写入量

如果主机写 1GB,NAND 也只写 1GB,WAF = 1。 如果主机写 1GB,NAND 最后写了 3GB,WAF = 3。

为什么会这样?

核心原因还是 NAND 不能原地覆盖,而且 erase 粒度比 write 粒度大。

举个例子。

主机写入 4KB 新数据。 这个 LBA 原来已经有旧数据。 SSD Controller 不能直接覆盖旧 page,只能找一个新 page 写进去。 旧 page 标记 invalid。

一开始还好,空 block 很多。

但写久以后,盘里出现大量 valid page 和 invalid page 混在一起的 block。 为了腾出干净 block,Controller 要做 garbage collection:

挑一个 victim block。 把里面仍然有效的数据搬走。 擦掉整个 block。 这个 block 才能重新使用。

问题是:搬走有效数据本身也要写 NAND。

所以主机只写了一点点新数据,SSD 内部为了腾空间,还额外搬运了一堆旧的有效数据。 这些额外写入,就是写放大。

Kioxia 的 FDP 资料也明确提到,moving valid host written data to another block 再 erase 原 block 的过程就是 garbage collection,而 garbage collection 会造成 write amplification:存储一次 host write 可能变成底层 flash media 上的多次写入。

所以写放大不是一个玄学指标。 它就是 SSD 内部“搬家成本”的量化。

十、为什么 FC SAN 存储系统也有写放大?

这个问题非常好,因为它说明“写放大”不只存在于 SSD 内部。

只要一个系统里出现:

上层写一次, 下层为了实现可靠性、快照、校验、迁移、压缩、日志、RAID, 实际写了多次,

就会有写放大。

在 FC SAN 存储设备里,写放大可能来自很多层:

RAID 5/6 小块随机写: 上层写一个小块,后端可能要读旧数据、读旧 parity、写新数据、写新 parity。一次小写变成多次 I/O。

Snapshot / Copy-on-Write: 第一次修改旧数据前,要先把旧数据保存到快照空间,再写新数据。主机写一次,阵列内部可能写两次甚至更多。

Thin Provisioning 元数据: 写用户数据的同时,还要更新空间分配表、映射表、bitmap。

Dedup / Compression: 去重和压缩可能减少物理写入,也可能带来额外元数据写入、索引更新、后台整理。

日志 / Journal: 为了保证掉电一致性,系统可能先写日志,再写正式位置。

分层存储 / 数据迁移: 热数据、冷数据在不同介质之间移动,也会制造额外后端写入。

所以 FC SAN 里的写放大,是“存储系统层面的写放大”。 SSD 里的写放大,是“FTL + NAND 垃圾回收层面的写放大”。

二者不在同一层,但会叠加。

比如主机写 1GB 到 SAN。 SAN 因为 RAID / snapshot / metadata,后端对 SSD 写了 2GB。 SSD 内部因为 GC,NAND 实际写了 3GB。

那从最上层业务到 NAND cell,最终放大就可能很可观。

所以,存储系统优化不能只看 SSD,也不能只看阵列。真正的写入路径是分层的:

应用层 文件系统 / 数据库 SAN 控制器 RAID / snapshot / cache SSD Controller FTL / GC / wear leveling NAND Flash

每一层都可能加一点写放大。

十一、NAND Flash 层面有没有“写放大”问题?

严格说,“写放大”通常不是 raw NAND cell 自己的概念,而是 controller / system 管理 NAND 时产生的现象。

Raw NAND 只是执行:

Program page Read page Erase block

它不会自己说:“我写放大了 2.3 倍。”

真正计算 WAF 的,是 SSD Controller 或更上层存储系统:

主机写了多少? Controller 实际往 NAND program 了多少? GC 搬了多少有效 page? metadata 写了多少? parity 写了多少?

但从 NAND 寿命角度看,写放大会真实反映到 NAND 上。

因为 NAND 不管这些写入是主机新数据,还是 GC 搬家数据,只要 program 了 page、erase 了 block,就会消耗 P/E cycle 和 endurance。

所以更准确的说法是:

写放大是 controller / storage system 的行为指标;NAND Flash 是承受写放大后果的物理介质。

NAND 层面确实有 program pulse、verify、内部多步 program 等复杂行为,但工程上讲 WAF,通常不是指这些内部脉冲次数,而是指主机写入量和 NAND media 写入量之间的比例。

十二、主流 cSSD Controller 一般几个 Channel?

这里要分档。

当前主流 client SSD,也就是 cSSD,大致可以这样看:

入门 / 主流 DRAM-less cSSD:常见 4 channels。 高端 client SSD:常见 8 channels。 极致高端或下一代方案:仍以 8 channels 为主,但 NAND interface 速度会继续提高。

比如 Silicon Motion 官方产品页显示,SM2504XT 是 4-channel 架构,NAND data rate up to 3600MT/s,面向 PCIe Gen5 x4 client SSD。 Phison E31T 这类 Gen5 DRAM-less client controller 也被公开资料描述为 4-channel 方案。

而高端 client 方向,Silicon Motion SM2508 官方资料显示它有 8 个 NAND channel,每 channel up to 3600MT/s,用于高性能 PC / 高端 client 应用。

所以可以简单总结:

普通消费级 / AI PC / 主流 M.2 SSD:4-channel 很常见。 旗舰级 PCIe Gen5 M.2 SSD:8-channel 很常见。 未来 controller 会继续提升每 channel NAND 速率,比如 3600MT/s、4800MT/s,而不一定无限增加 channel 数。

为什么 client SSD 不无限堆 channel?

因为 M.2 板子面积小、功耗有限、散热有限、成本敏感。 多 channel 能提高并行度,但也会增加 controller die size、封装 pin 数、PCB routing、功耗和 firmware 复杂度。

十三、主流 eSSD Controller 一般几个 Channel?

企业级 SSD,也就是 eSSD,情况就不一样了。

eSSD 面向数据中心、数据库、AI 训练/推理、云存储,关注高容量、高并发、低延迟、稳定 QoS 和长时间可靠性。所以 eSSD controller 通常有更多 NAND channels。

典型范围可以这样理解:

中低端 / 容量型 eSSD:8 channels 常见。 高端 PCIe Gen5 eSSD:16 channels 很常见。 面向 hyperscale / AI / 高容量场景的 controller:16 channels 是非常重要的规格点。

Marvell Bravera SC5 的官方资料显示,其 PCIe 5.0 SSD controller 系列中 MV-SS1331 和 MV-SS1333 分别支持 8 或 16 个 high-performance NAND channels。 Microchip Flashtec NVMe 5016 资料也明确写着这是 16-channel Gen5 PCIe flash controller,并列出 16 independent Flash channels。

所以可以这么和客户说:

cSSD 主流看 4/8 channels。 eSSD 主流高端看 8/16 channels。 真正企业级高性能 Gen5 eSSD,16 channels 是非常有代表性的配置。

当然,不同厂家的 controller 还会配合不同 NAND speed、CE 数量、die interleaving、DRAM、SRAM、LDPC、RAID、firmware 架构,不能只看 channel 数一个指标。

十四、一颗 BGA152 / BGA132 / BGA154 NAND Package 可以通过 2 个 Channel 和 SSD Controller 通讯吗?

答案是:可以,但要看这颗 NAND package 的具体 ball assignment 和内部组织,不是看到 BGA152 就一定可以。

有些 NAND package 是 single x8 data access,也就是一组 DQ[7:0]。 有些 package 支持 dual 8-bit data access,也就是两组独立 x8 bus。 还有更大封装可能支持 quad 8-bit data access。

ONFI 5.2 资料目录里就能看到 BGA-152 / BGA-132 ball assignment 对应 dual 8-bit data access,也有 272-ball / 252-ball / 316-ball 等封装对应 quad 8-bit data access。 老的 Micron NAND datasheet 里也有四 die package、八 die package 的组织图,能看到 DQ[7:0]0、DQ[7:0]1、DQS0、DQS1、Target 0、Target 1 这类双接口组织。

这说明: 一颗 package 里可以存在两个相对独立的 target / bus,把一个物理 package 接到 controller 的两个 NAND channel 上。

但一定要注意:

Package ball 数不等于 channel 数。

BGA152 可能支持 dual x8,也可能具体产品只用其中一部分功能。 BGA132 / BGA154 也要看 ONFI ball map 和 vendor datasheet。 同样是 8-die package,有的组织成一个 channel 下多个 LUN,有的组织成两个 channel 各挂一部分 die。

工程判断不能靠“封装名字”,必须看 datasheet 里的:

DQ bus 数量 DQS 数量 CE# 数量 R/B# 数量 Target / LUN organization Ball assignment 是否标注 dual x8 / quad x8 data access Controller PCB 上是否真的把两组 bus 分别接到两个 channel

所以,客户如果问:

“这颗 BGA152 NAND 能不能接两个 channel?”

最稳妥的回答是:

BGA152 这类 ONFI 封装有支持 dual x8 data access 的定义,理论上可以做成一颗 package 对接两个 controller channel;但具体到某个 NAND part number,必须查 vendor datasheet 的 ball assignment 和 device organization,确认它是否真的提供两组独立 DQ/DQS/控制信号。

十五、把这几个问题串起来看:NAND 的麻烦,根源都在“物理限制”和“系统伪装”之间

NAND Flash 最有意思的地方,是它底层其实非常不“像硬盘”。

它不能原地覆盖。 它读写按 page,擦除按 block。 它每次 P/E 都会磨损。 它的 Vt window 会随着温度、时间、读扰动、写扰动而移动和变宽。 它需要 sense amplifier 才能把微弱 bitline 信号判读成 0/1。 它需要 charge pump 在芯片内部生成高压。 它的 QLC / TLC 状态像越来越挤的车道线,必须靠 read retry、LDPC、FTL、wear leveling 来兜住。

但主机看到的 SSD,却像一块非常听话的磁盘:

我要写哪里就写哪里。 我要改哪个 LBA 就改哪个 LBA。 我要随机写就随机写。 我要高 IOPS 就高 IOPS。 我要企业级寿命就企业级寿命。

这中间的巨大差距,就是 SSD Controller 填上的。

FTL 负责地址翻译。 GC 负责清理垃圾。 Wear leveling 负责别把某些 block 用死。 LDPC 负责把错误 bit 救回来。 Read retry 负责在 Vt 漂移后换个角度再读。 多 channel 负责把很多 NAND 并行调度起来。 eSSD controller 通过 8/16 channels,把一堆“不完美”的 NAND 组织成高性能、高可靠的企业级存储设备。

所以 NAND 技术越往后走,越不能只看单点参数。

不能只看 QLC 还是 TLC。 不能只看 P/E cycle。 不能只看 channel 数。 不能只看 2.4GT/s、3.6GT/s、4.8GT/s。 也不能只看 LDPC 有多强。

真正要看的是:

NAND 本身的 Vt window 够不够稳; P/E 后 Vt shift 和 distribution widening 有多严重; read disturb / retention / program disturb 的错误增长曲线怎么样; Controller 的 read retry 和 LDPC 能不能接住; FTL / GC / wear leveling 会不会把写放大控制住; channel / CE / LUN / plane 并行有没有真正发挥出来; 最后做成 SSD 后,性能、寿命、延迟和 QoS 能不能同时站得住。

这才是 NAND 和 SSD Controller 真正难、也真正有价值的地方。

更多PCIe5&6.0, CXL, NVMe SSD, SAS/SATA, NVMe over Fabric (NVMoF), NAND,新型存储技术NVM(RRAM/ReRAM, FRAM/FeRAM, MRAM, PCM, 3D-NOR, SRAM/DRAM等) DDR5/LPDDR5以及UFS测试方面的问题想咨询,可以查看Saniffer公司2026.2.24最新更新的测试工具白皮书15.1版本,我们已经整理收录在Saniffer公众号的【白皮书】菜单中。

欢迎关注Saniffer公众号,点击底部菜单栏即可免费获取。如有任何技术问题,也可直接在公众号内留言交流。