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 的设计核心是三个问题:
- 容量多大? 太大,命中率上去了,但访问延迟和功耗也上去了。
- 关联度多高? 全相联查找慢,直接映射冲突多。组相联是个折中。
- 写策略? 写直达(Write-Through)简单但费带宽,写回(Write-Back)高效但复杂。
功耗权衡:Cache 的功耗大头在标签比较和数据的位线充放电。我做过一个实验,把 L1 Cache 的关联度从 4 路降到 2 路,命中率只降了 3%,但动态功耗降了 18%。这就是权衡的艺术。
2.5 速度与功耗的权衡:一张图说清楚
下面这张图是我自己总结的。它把四层存储放在一个坐标系里,横轴是速度,纵轴是功耗效率(每 bit 每纳秒的能耗)。
你看,从寄存器到片外 DRAM,速度越来越慢,但每 bit 的功耗效率越来越高。这就是为什么我们需要层次结构——把热数据放上层,冷数据放下层。
2.6 实际设计中的避坑指南
我做了十几年芯片,踩过不少坑。这里列几个常见的:
- 别把 Cache 当寄存器用。 我曾经见过一个设计,把中断向量表放在 L1 Cache 里,结果每次中断都要先查 Cache,延迟多了好几个周期。后来改成直接映射的寄存器组,问题解决。
- 注意 eDRAM 的刷新窗口。 如果刷新周期和关键任务冲突,性能会断崖式下跌。我建议在系统设计时,把刷新操作安排在低负载时段。
- SRAM 的位线预充电功耗不可忽视。 大容量 SRAM 阵列,每次读操作都要给位线预充电,这部分功耗可能占到总动态功耗的 30%。
特别提醒:不要盲目追求「全 SRAM」方案。虽然 eDRAM 有刷新开销,但在大容量场景下,它的面积优势带来的成本降低,往往能抵消功耗劣势。我参与的一个 AI 加速器项目,就是用 eDRAM 做 L3 Cache,芯片面积直接砍了一半。
2.7 小结
存储层次的设计,说白了就是「用速度换容量,用复杂度换效率」。寄存器快但贵,SRAM 平衡,eDRAM 密度高但有刷新代价,Cache 是架构层面的调度艺术。实际项目中,没有银弹。你得根据应用场景,反复权衡面积、速度、功耗这三个维度。