2. SRAM与DRAM核心原理:6T单元结构、刷新机制、行/列选通延迟分析

大家好,我是老张。今天咱们聊聊存储芯片里最基础、也最绕不开的两个家伙——SRAM和DRAM。很多刚入行的朋友总觉得它们差不多,都是存数据的嘛。但实际项目里,选错一个,整个芯片的性能可能就崩了。我当年就吃过这个亏,所以今天把这部分掰开揉碎了讲清楚。

2.1 6T SRAM单元结构:为什么它这么快?

SRAM,静态随机存取存储器。名字里带“静态”,意思是只要不掉电,数据就能一直保持,不需要像DRAM那样不断刷新。它的核心存储单元,就是经典的6晶体管结构,简称6T。

这6个管子怎么工作的?我画个简图你就明白了。

6T SRAM单元结构示意图 位线 BL 位线 BLB 字线 WL M5 M6 M1 M3 M2 M4 Q QB VDD GND 存取管 上拉管(PMOS) 下拉管(NMOS) 存储节点

看到这个图了吧?两个交叉耦合的反相器(M1+M3 和 M2+M4),加上两个存取管(M5、M6)。数据存在Q和QB这两个节点上,一个高电平,一个低电平,互为相反。这就是一个锁存器结构。

为什么SRAM这么快? 说白了,因为它是用触发器存数据的。读的时候,字线WL一拉高,M5和M6导通,Q和QB的值直接送到位线上。不需要像DRAM那样先给电容充电再检测。我做过一个28nm的SRAM编译器项目,读延迟可以做到0.3ns以内。这个速度,DRAM只能望尘莫及。

关键点: SRAM的6T结构本质是一个双稳态电路。只要VDD不掉,数据就稳稳地锁在那里。没有刷新,没有电容漏电的烦恼。

2.2 DRAM单元:电容的烦恼

DRAM就简单多了——1个晶体管加1个电容,也就是1T1C结构。电容里存电荷,有电荷代表1,没电荷代表0。听起来很美好对吧?但问题来了:电容会漏电。

我打个比方。你拿个水桶接水,桶底有个小洞。过一会儿水就漏光了。DRAM的电容就是那个水桶。所以你得不停地给它“加水”——这就是刷新。

DRAM的刷新周期一般是64ms。也就是说,每64ms内,每一行都必须被刷新一次。刷新的时候,先读出这一行的数据,再写回去。这个过程会占用总线时间,所以DRAM的有效带宽要比理论带宽低不少。

避坑指南: 我曾经在一个DDR3控制器设计里,把刷新策略写得太激进,结果导致连续读请求被刷新操作打断,延迟直接飙到200ns以上。后来改成“集中刷新+紧急刷新”的混合策略,才把延迟压下来。记住:刷新不是越多越好,够用就行。

2.3 行选通延迟(tRCD)与列选通延迟(tCL)

这两个参数,是DRAM延迟的核心。很多做系统优化的朋友,一看到时序图就头疼。我换个角度讲,你肯定能懂。

DRAM的存储阵列,就像一个二维表格。行地址对应“行”,列地址对应“列”。你要读某个数据,得先告诉它行号,再告诉它列号。

  • tRCD(RAS to CAS Delay): 从发出行地址选通信号(RAS)到发出列地址选通信号(CAS)之间的最短时间。说白了,就是打开一行需要多久。
  • tCL(CAS Latency): 从发出列地址选通信号到数据第一次出现在数据总线上的时钟周期数。说白了,就是找到列并读出数据需要多久。

我整理了一个常见DRAM颗粒的延迟参数表,你看看就明白了:

DRAM类型 tRCD (ns) tCL (ns) 典型频率
DDR3-1600 11.25 11.25 800 MHz
DDR4-3200 13.75 13.75 1600 MHz
LPDDR4-4266 18.75 18.75 2133 MHz
GDDR6-12000 12.5 12.5 6000 MHz

看到没?虽然频率越来越高,但tRCD和tCL的绝对值并没有大幅下降。为什么?因为行选通和列选通本质上是在对电容充放电,这个物理过程的速度是有上限的。你频率再高,也得等电容充到足够的电压才能判断是0还是1。

我的经验: 在做存储系统设计时,不要只看带宽。tRCD和tCL决定了随机访问的延迟。如果你的应用是大量随机小数据访问(比如数据库),那延迟比带宽更重要。我见过有人用DDR4-3200做数据库缓存,结果因为tRCD太大,性能还不如优化好的DDR3-1600。选型时一定要看应用场景。

2.4 SRAM vs DRAM:怎么选?

这个问题,我几乎每次面试都会问。答案其实很简单:

  • SRAM: 速度快,延迟低(1-3ns),不需要刷新。但面积大(6个管子),成本高。适合做Cache、寄存器文件、片上缓冲。
  • DRAM: 密度高(1个管子+电容),成本低。但速度慢(10-50ns),需要刷新。适合做主存、显存、大容量存储。

我举个例子。一个现代CPU的L1 Cache,通常用SRAM,容量几十KB到几百KB,延迟1-2ns。而主存用DRAM,容量几GB到几十GB,延迟50-100ns。差了将近两个数量级。这就是为什么CPU要设计多级缓存——用SRAM的速度来弥补DRAM的慢。

一句话总结: SRAM用面积换速度,DRAM用速度换密度。没有谁更好,只有谁更适合。

2.5 刷新机制的深入分析

DRAM的刷新,不是你想的那样简单粗暴。它分几种模式:

  1. 自动刷新(Auto Refresh): 由DRAM控制器定时发送刷新命令。每次刷新一行。64ms内必须刷完所有行。
  2. 自刷新(Self Refresh): 进入低功耗模式后,DRAM自己内部定时刷新。这时候外部时钟可以停掉,省电。
  3. 局部刷新(Partial Array Self Refresh): 只刷新部分存储阵列。适合休眠模式,只保留关键数据。

我做过一个IoT芯片的低功耗设计,用的就是局部刷新。系统休眠时,只保留RTC(实时时钟)和几个配置寄存器所在的Bank,其他Bank全部断电。这样刷新电流从mA级降到了uA级。嗯,这个技巧在低功耗项目里很实用。

注意: 刷新操作会占用数据总线。如果你的系统对实时性要求很高(比如视频处理),一定要预留足够的刷新带宽。我曾经在一个1080p视频处理项目里,因为刷新占用了太多带宽,导致帧率不稳。后来把刷新分散到行消隐期,才解决问题。

2.6 行/列选通延迟的优化思路

既然tRCD和tCL是物理限制,那我们怎么优化?

我的思路是:减少随机访问,增加顺序访问。

DRAM有一个特性:打开一行后,访问同一行的不同列,只需要tCL,不需要再等tRCD。这就是所谓的“行命中”。如果你能连续访问同一行的数据,延迟就能从tRCD+tCL降到tCL。

举个例子:

// 随机访问(每次都要打开新行)
for (i = 0; i < N; i++) {
    addr = rand() % ROWS;
    data = dram_read(addr);
}

// 顺序访问(同一行连续读)
for (i = 0; i < N; i++) {
    addr = base_row + i;  // 同一行,不同列
    data = dram_read(addr);
}

顺序访问的延迟,比随机访问低40%-60%。这个优化,在DDR控制器设计里非常常见。我建议你在做存储系统时,尽量把数据排布成顺序访问的模式。

小技巧: 如果你无法避免随机访问,可以考虑使用“Bank交错”技术。把数据分散到不同的Bank里,这样当一个Bank在预充电时,另一个Bank可以立即响应。我做过一个测试,4-Bank交错可以把随机访问的吞吐量提升3倍。

好了,SRAM和DRAM的核心原理就讲到这里。记住:理解底层物理结构,才能做出好的系统优化。下一章我们聊聊存储控制器的设计,到时候会用到今天讲的知识。


公众号:蓝海资料掘金营,微信deep3321