一、先把Nand结构关系说透

如图所示,在一个 LUN(Logical Unit Number) 内部:

  • LUN 是命令接收和状态反馈单位(die 级别)

  • LUN 内包含多个 plane

  • 每个 plane 内部都有:

    • page register
    • cache register

这两个寄存器是实现 cache read / cache program 的核心。


二、两个寄存器到底分别干什么?

很多资料说得很模糊,其实它们功能是分层的:

寄存器
作用
物理位置
page register
与 NAND cell array 直接交互
靠近Nand存储阵列
cache register
与 I/O 总线交互
靠近外围接口电路

可以理解成:

NAND Array  <->  Page Register  <->  Cache Register  <->  I/O Bus

page register 是“阵列接口缓冲区”, cache register 是“总线接口缓冲区”。


三、为什么不只用一个寄存器?

因为 NAND 操作本质上有两个完全不同时间尺度的过程:

  1. 总线传输时间(tXFER)

    • 数据通过 ONFI / Toggle 总线进出
    • 典型几十到几百 ns
  2. 阵列操作时间

    • Program:tPROG(几百微秒)
    • Read:tR(几十微秒)

两者时间量级差异是 100~1000 倍。

如果只有一个寄存器,那么:

  • 写入时:必须等 tPROG 结束才能再传下一页
  • 读取时:必须等 tR 完成才能开始下一页

总线会大量空闲。


四、Cache Program 的真实时序机制

我们精确拆一下:

假设:

  • t1 = 总线传输时间
  • t2 = tPROG(阵列写入时间)

❌ 不用 cache program

流程:

dataA:  t1 (bus)  +  t2 (program)
dataB:  t1 (bus)  +  t2 (program)

总时间:

2 × (t1 + t2)

总线在 t2 期间是完全空闲的。


✅ 使用 cache program

流程:

  1. dataA → cache register

  2. cache → page register

  3. 开始 program A(t2)

  4. 同时:

    • 总线传 dataB → cache register

时间线变成:

t1 (A 传输)
t2 (A program)
        t1 (B 传输,被隐藏)
        t2 (B program)

如果 t2 > t1:

总时间 ≈

t1 + 2 × t2

相比原来的:

2t1 + 2t2

节省了一个 t1。


⚠ 关键点:cache program 不是让写入变快

很多人误解这一点。

cache program:

  • 没有降低 tPROG
  • 只是减少总线空闲
  • 提升的是“pipeline 利用率”

五、Cache Read 的真实机制

读过程是反方向的 pipeline。

定义:

  • tR:array → page register
  • t1:page → cache → I/O bus

❌ 不使用 cache read

dataA:  tR + t1
dataB:  tR + t1

总时间:

2 × (tR + t1)

✅ 使用 cache read

流程:

  1. 读 A → page register(tR)
  2. A → cache register
  3. A 正在通过总线输出(t1)
  4. 同时开始读 B(tR)

如果 tR > t1:

总时间:

tR + 2 × tR
≈ 2tR + t1

等价于隐藏了一个 t1。


六、“乒乓”机制本质

本质是一个 两级双缓冲 pipeline。

和 CPU cache 类比:

CPU 系统
NAND 系统
L1 Cache
cache register
内存
NAND array
Store buffer
page register

但更准确的类比是:

两个寄存器在“阵列操作”和“总线操作”之间做流水线隔离。


七、再往深一点:什么时候 cache 不起作用?

有三种情况:

1️⃣ 随机写

如果下一页不是同一 block 的下一页:

  • cache program 可能无法连续 pipeline

2️⃣ 受限于总线带宽

如果 t1 > t2:

  • 隐藏不了时间
  • 优化收益不明显

3️⃣ controller 没发 cache 命令

如果只是普通 program:

  • cache register 和 page register 内容相同
  • 等价单缓冲

八、一个更准确的插秧类比

我父亲的插秧比喻跟这个非常类似,腰间别着几捆秧苗,右手插秧,当右手插入秧苗时,左手立马拿下一棵秧苗,然后右手接住直接拿起插入水田中:

  • page register = 右手正在插的那棵秧苗
  • cache register = 左手已经准备好的下一棵
  • NAND array = 水田
  • I/O bus = 腰间秧苗筐

如果没有 cache:

每插一棵都要回头从筐里拿。

如果有 cache:

右手插秧时,左手已经准备好下一棵。


九、技术总结一句话

Cache register 和 page register 组成双缓冲机制,通过阵列操作与总线操作并行化,实现 NAND 内部的 pipeline,从而提高吞吐率,但不降低单次读写延迟。