2. 片上存储层次结构:寄存器、SRAM、eDRAM、Cache,速度与功耗的权衡

好,咱们开始聊存储层次。说白了,芯片里头的存储就是个「速度换容量,容量换功耗」的游戏。你想想看,CPU 要数据,恨不得光速拿到,但最快的存储又贵又小,还特别耗电。怎么搭这个梯子,就是今天要聊的核心。

我个人习惯把片上存储分成四层:寄存器、SRAM、eDRAM、Cache。注意,Cache 不是一种物理存储,它是个架构概念,但咱们放在一起讲,因为实际设计中它们密不可分。

2.1 寄存器:最快,但也最「贵」

寄存器是离运算单元最近的存储。它用触发器(Flip-Flop)搭的,读写只要一个时钟周期。我在项目中遇到过,有些工程师喜欢把所有中间变量都塞进寄存器,结果面积爆炸,功耗也跟着起飞。

关键参数:

  • 访问时间:~0.1 ns(7nm 工艺下)
  • 面积:约 1000 F²(每个 bit)
  • 功耗:动态功耗高,静态漏电也不低

寄存器最大的问题是面积。一个寄存器 bit 占的面积,能放几十个 SRAM bit。所以,寄存器只适合放少量、频繁访问的数据,比如状态机状态、循环计数器。

我的经验:设计时先问自己——这个数据每个周期都要用吗?如果不是,就别用寄存器。我曾经见过一个设计,把查找表用寄存器实现,结果面积比用 SRAM 大了 20 倍,功耗也翻了三番。

2.2 SRAM:片上存储的主力军

SRAM 是片上存储的「中坚力量」。它用 6 个晶体管存 1 个 bit,速度比寄存器慢一点,但密度高得多。大部分 Cache 的底层存储就是 SRAM。

SRAM 的功耗很有意思。它有个特点:读操作和写操作的功耗不一样。写操作通常更耗电,因为要翻转存储节点的电平。我建议在设计时,尽量把频繁读、少写的数据放在 SRAM 里。

参数 寄存器 SRAM eDRAM
单元结构 6-8 晶体管 6 晶体管 1 晶体管 + 1 电容
面积 (F²/bit) ~1000 ~150 ~30
访问时间 ~0.1 ns ~0.5 ns ~2 ns
静态功耗 高 中 低(需刷新)
是否需要刷新 否 否 是(~64 μs)

注意:SRAM 有个「软错误」问题。高能粒子轰击可能翻转存储节点。我曾经在一个航天项目中,不得不在 SRAM 外围加 ECC 纠错,代价是额外 20% 的面积和 10% 的功耗。

2.3 eDRAM:高密度,但有代价

eDRAM 是把 DRAM 技术集成到芯片上。它用一个晶体管加一个电容存 1 个 bit,密度比 SRAM 高 5 倍左右。但代价是什么?速度慢,而且需要定期刷新。

刷新操作是 eDRAM 的「阿喀琉斯之踵」。每 64 微秒就得把所有行读一遍再写回去。这个操作本身耗电,而且刷新期间不能正常访问。我建议只在需要大容量片上存储、且对延迟不敏感的场景用 eDRAM,比如 GPU 的帧缓冲。

嗯,这里要注意:eDRAM 的电容是堆叠在逻辑层上方的,所以制造工艺比纯逻辑工艺复杂。不是所有代工厂都支持。

2.4 Cache:架构的艺术

Cache 不是一种物理存储,而是一种架构策略。它利用「时间局部性」和「空间局部性」,把常用数据放在离 CPU 近的地方。L1 Cache 通常用 SRAM,L2/L3 可以用 SRAM 或 eDRAM。

Cache 的设计核心是三个问题:

  1. 容量多大? 太大,命中率上去了,但访问延迟和功耗也上去了。
  2. 关联度多高? 全相联查找慢,直接映射冲突多。组相联是个折中。
  3. 写策略? 写直达(Write-Through)简单但费带宽,写回(Write-Back)高效但复杂。

功耗权衡:Cache 的功耗大头在标签比较和数据的位线充放电。我做过一个实验,把 L1 Cache 的关联度从 4 路降到 2 路,命中率只降了 3%,但动态功耗降了 18%。这就是权衡的艺术。

2.5 速度与功耗的权衡:一张图说清楚

下面这张图是我自己总结的。它把四层存储放在一个坐标系里,横轴是速度,纵轴是功耗效率(每 bit 每纳秒的能耗)。

片上存储层次:速度 vs 功耗效率 速度(越快 → 越右) 功耗效率(越高 → 越上) 寄存器 最快 · 最耗电 SRAM 主流 · 平衡 eDRAM 高密度 · 需刷新 片外 DRAM 最慢 · 最省电/bit 设计要点 • 寄存器:关键路径 • SRAM:L1/L2 Cache • eDRAM:L3 Cache • 片外:主存

你看,从寄存器到片外 DRAM,速度越来越慢,但每 bit 的功耗效率越来越高。这就是为什么我们需要层次结构——把热数据放上层,冷数据放下层。

2.6 实际设计中的避坑指南

我做了十几年芯片,踩过不少坑。这里列几个常见的:

  • 别把 Cache 当寄存器用。 我曾经见过一个设计,把中断向量表放在 L1 Cache 里,结果每次中断都要先查 Cache,延迟多了好几个周期。后来改成直接映射的寄存器组,问题解决。
  • 注意 eDRAM 的刷新窗口。 如果刷新周期和关键任务冲突,性能会断崖式下跌。我建议在系统设计时,把刷新操作安排在低负载时段。
  • SRAM 的位线预充电功耗不可忽视。 大容量 SRAM 阵列,每次读操作都要给位线预充电,这部分功耗可能占到总动态功耗的 30%。

特别提醒:不要盲目追求「全 SRAM」方案。虽然 eDRAM 有刷新开销,但在大容量场景下,它的面积优势带来的成本降低,往往能抵消功耗劣势。我参与的一个 AI 加速器项目,就是用 eDRAM 做 L3 Cache,芯片面积直接砍了一半。

2.7 小结

存储层次的设计,说白了就是「用速度换容量,用复杂度换效率」。寄存器快但贵,SRAM 平衡,eDRAM 密度高但有刷新代价,Cache 是架构层面的调度艺术。实际项目中,没有银弹。你得根据应用场景,反复权衡面积、速度、功耗这三个维度。