前言:把内存芯片拆开看

上一篇把带宽的账算清了:带宽 = 位宽 × 数据率。公式很简单,但结尾留了个悬念——位线、字线、Bank、行缓冲,内存条内部到底是怎么组织的?延迟到底花在哪?

这一篇就打开内存芯片的外壳,看看里面的组织方式:Bank、行缓冲、三步访问时序、刷新,最后再把 SDRAM 到 DDR5 二十多年的演进史串一遍。

看完你会明白两件事:为什么内存延迟是几十纳秒而不是零;为什么每一代 DDR 都能”莫名”翻倍提速。

一、芯片内部:一座分阅览室的图书馆

一颗 DRAM 芯片并不是一整块大阵列,而是切成了多个 Bank(存储库)——每个 Bank 都是一个独立的小阵列,自带一套行译码器(Row Decoder)灵敏放大器(Sense Amplifier),可以独立干活。

DRAM 芯片的组织方式:多个独立 Bank,每个 Bank 是行 × 列的单元矩阵,打开一行后整行数据进入行缓冲

再把一个 Bank 放大看:它就是第一篇讲过的 1T1C 单元排成的行 × 列矩阵

  • 字线(Word Line):接一行单元的晶体管栅极,由行译码器驱动——选中一条字线,就是选中一行;
  • 位线(Bit Line):接一列单元的电容,负责传出电荷信号;
  • 灵敏放大器:电容里那点电荷实在太微弱,位线末端的灵敏放大器负责把它读出来、放大成标准逻辑电平,并顺手写回去(这也是刷新能”续命”的原因)。

最关键的角色是行缓冲(Row Buffer):激活一行后,整行(几百到上千个单元)的数据会一起冲进灵敏放大器,暂时摊在那里。接下来的读、写命令,其实都是在跟这份”摊开的整行数据”打交道。

一个比喻:Bank 像图书馆的一个阅览室,行是书架,行缓冲就是你的桌面——把整个书架的书全搬上桌,之后翻哪本都伸手即得。

为什么切成多个 Bank,而不是做一整块大阵列?因为一整块阵列只有一套灵敏放大器,所有访问都得排队;切成多个 Bank,等于把一张桌子换成多张桌子——这也是下一节”多 Bank 并行”的基础。

二、访问三步曲:激活 → 读写 → 预充电

对 DRAM 的一次访问,并不是”给个地址就出数据”这么简单。因为数据必须先”上桌”,标准流程分三步:

DRAM 访问三步曲:ACT 激活(等 tRCD)→ READ/WRITE 读写(等 tCL)→ PRE 预充电(等 tRP)

第一步:激活(ACT)

控制器先发 ACT(Activate,激活)命令,带上行地址。行译码器打开对应的字线,整行数据冲进灵敏放大器。

从发 ACT 到行就绪,要等 tRCD(行地址到列地址的延迟)

第二步:读 / 写(READ / WRITE)

行就绪后,控制器再发读或写命令,这次带的是列地址——在摊开的整行里挑出具体位置。

从发读命令到数据真正出现在引脚上,还要等 tCL(CAS Latency,列地址选通延迟)

第三步:预充电(PRE)

访问完了要收摊:发 **PRE(Precharge,预充电)**命令关掉打开的行,把位线恢复到待命状态。这一段要等 tRP(行预充电时间)

为什么要先关旧行? 因为每个 Bank 只有一套灵敏放大器,也就是只有一张”桌子”——桌面只摊得开一行。想访问另一行?必须先把当前这行收回去(PRE),再把新行搬上来(ACT)。这条最贵的访问路径有个名字:行冲突(Row Conflict)

反过来,如果接下来的访问还落在同一行里(行命中),tRCD 和 tRP 全免,只付 tCL——这就是访问局部性好的程序跑起来快得多的原因。上一篇问”延迟从哪来”,答案就是这三段:tRCD + tCL + tRP,量级几十纳秒。

三、Bank 并行:轮流干活,藏住延迟

单个 Bank 串行等待很浪费,于是 DRAM 里放了很多个 Bank,各自有独立的行缓冲,互不干扰。

控制器完全可以这样调度:Bank 0 在等 tRCD 的时候,让 Bank 1 发数据;Bank 1 忙着预充电,Bank 2 又接上……这就是**交错(Interleaving)**访问——把连续地址分布到不同 Bank 上,让多个 Bank 轮流干活,用并行把延迟”藏”起来。

Bank 数量一路增长:DDR3 时代 8 个,DDR4 到 16 个,DDR5 达到 32 个——而且是 8 组 Bank Group(Bank 组)× 每组 4 个 Bank 的两级结构。Bank Group 是给高频率补的缓冲:外部接口太快、内部阵列跟不上时,不同 Bank Group 的数据可以在组间错峰出列,不至于堵在门口。

一个比喻:一个窗口排长队,不如开 32 个窗口轮叫号。

四、刷新:64 毫秒的大扫除

第一篇说过,DRAM 的电容会漏电,所以必须刷新(Refresh)。现在可以讲得更具体了。

JEDEC 标准要求:每 64 ms,所有行都要刷新一遍。刷新本质上是”把行读出来、放大、再写回去”——正好复用灵敏放大器,给每行的电容补满电荷。而且刷新是按行进行的:控制器逐行发出刷新命令,相当于周期性地把图书馆每个书架都巡视一遍、把书重新码放整齐。

温度越高漏电越快,所以高温环境下(约 85°C 以上)刷新周期要缩短一半,变成 32 ms。这也是数据中心拼命控温的原因之一:内存一热,刷新开销直接翻倍。

刷新的代价大约是 3%~5% 的时间——不算致命,但随着容量增大、行数增多,这场大扫除越来越费时。怎么把刷新拆散、趁空闲插空做,一直是 DRAM 控制器的重要课题,这里点到为止。

五、DDR 演进史:一路提频,一路降压

从 SDRAM 到 DDR5,二十多年走了六代。先上总表:

代际 大致年代 电压 预取 典型数据率
SDRAM 1990s 末 3.3 V 1n 100~166 MT/s
DDR 2000 前后 2.5 V 2n 200~400 MT/s
DDR2 2003 1.8 V 4n 400~800 MT/s
DDR3 2007 1.5 V 8n 800~2133 MT/s
DDR4 2014 1.2 V 8n 1600~3200 MT/s
DDR5 2020 1.1 V 16n 4800~8000+ MT/s
DDR 六代演进:数据率阶梯式上涨(柱高按平方根缩放便于对比),电压从 3.3 V 一路降到 1.1 V

每代怎么提频率:预取翻倍

DRAM 内部阵列的速度其实没涨多少——涨的是接口。秘诀是预取(Prefetch)

内部一次取 2n、4n、8n、16n 个 bit,攒成一批,再由高速接口一口气发出去。打个比方:仓库里拣货员手脚没变快,但改成一次拣一批、整批发货,门口的车流自然翻倍。

  • DDR:内部取 2 bit,接口按 2 倍速发;
  • DDR2 → 4n;DDR3 / DDR4 → 8n;DDR5 → 16n。

顺带一提:DDR4 的预取没翻倍(还是 8n),数据率照样涨——靠的正是前面说的 Bank Group:组内、组间错峰出数据,把内部并行度又提了一档。

预取翻倍 + 时钟提升 + 双沿采样(上一篇讲过的 MT/s = 2 × MHz),三招叠加,才有了每代翻倍的数据率。

电压为什么一路降

从 3.3 V 降到 1.1 V,一是省电——动态功耗大致随电压的平方下降,降到 1.1 V 功耗只剩当年的一成左右;二是频率高了以后,低电压摆幅的信号更”扛得住”高速翻转。

DDR5 的两个新花样

DDR5 除了 16n 预取和 32 Bank,还有两个结构变化值得记:

  • 板载 PMIC(电源管理芯片):供电管理从主板挪到了内存条上,供电更干净、时序更可控;
  • 一条 DIMM 拆成 2 个 32 位子通道:以前一条 64 位通道一次只能伺候一个请求,现在拆成两个独立小通道,并行度更高。

六、彩蛋:Row Hammer

最后送一个八卦:Row Hammer(行锤攻击)。如果疯狂反复激活同一行,邻近行的电容会被电场”骚扰”得加速漏电,积累到一定程度,隔壁行的数据就自己翻转了——这是 DRAM 物理结构与生俱来的副作用,也被安全研究者做成了真实攻击。ECC、限制激活频率等缓解手段由此而来。

总结:一张芯片的作息表

  • 一颗 DRAM 芯片 = 多个独立 Bank,每个 Bank 是行 × 列矩阵,靠灵敏放大器摊开整行;
  • 访问三步曲:ACT(tRCD)→ 读写(tCL)→ PRE(tRP)——同行最便宜,换行最贵;
  • 多 Bank 交错并行,把延迟藏起来;
  • 刷新:64 ms 一轮大扫除,高温减半,开销约 3~5%;
  • DDR 六代:预取翻倍提频率,电压一路降到 1.1 V

到这里,单颗 DRAM 芯片的里里外外都看过了。但 HBM 的野心是把 8~16 层芯片垂直堆叠成一个整体——芯片和芯片之间怎么连接?下一篇,我们讲那部”电梯”的施工方案:3D 堆叠与 TSV