DDR基础

DRAM基本单元Cell

SRAM存储1bit,需要6个晶体管,面积较大,但是只要有电,数据就不会丢失。
DRAM存储1bit,只需要1T1C(1个晶体管一个电容),通过判断电容中是否有电荷,判断存储的是1还是0,晶体管用作开关。电容中的电荷会慢慢消失,因此需要定时对其进行刷新;此外,读时,电荷也会消失,也需要重新写入。
图片

Cell阵列

图片

sense amplifier

读取数据时,先向所有bit line预充电到1/2 VDD;word line选通,把对应row的所有晶体管开关打开;此时该row所有的电容将向与之相连接的bit line放电,充放电会导致对应bit line上电压的微弱变化,比如如果电容中存储的数字1,即存在电荷,开关打开后,会导致对应bit line电压升高;反之降低。因此通过判断bit line电压变化,就可以得到对应电容中存储的数据值。
但是电容充放电所产生的电压波动是很微弱的,充放电所造成的电压波动的时间也是很短的,因此很难直接读取充放电信息,为此 cell 阵列的读取使用到了“ sense amplifier ”,即读出放大器
读出放大器可以捕捉到微弱的电压波动,并根据电压波动的情况在本地还原出 cell 的电容电压,而且放大器内还有锁存器,可以把还原出来的电容电压值保存起来,这样一来 cell 保存的信息就从 cell 电容转移到了放大器本地。
图片

SA的作用

  • 放大信号,测量电压变化,识别电容中数值
  • 临时存储单元,SA也被成为行缓冲器,如果连续对同一row进行读写,通过行缓冲器可省掉预充电;可以直接读写行缓冲器,无需每次都写回
  • 刷新:DRAM读是破坏性读,读完要将数据写回,即对电容进行充放电
    刷新完成后,就可以断开word line

DRAM刷新

DRAM中电容里面的电荷随着时间会慢慢泄漏,如果不做处理,存储的数据1会变成0;因此需要在电荷泄漏前,对其进行充电,即refresh。
DRAM需要周期性的对所有存储单元进行refresh。刷新时,需要控制器主动读、并写回。刷新周期一般为32ms、64ms

行/列地址解码器

DRAM中有很多row,因此需要一个行地址解码器,通过解析address,选中对应的row;
此外,每一row中一般存储很多的bit,但是读数据一般只需要其中的部分bit,因此还需要一个列地址解码器,根据address选中行缓冲器中的部分bit;
为了节省PAD引脚,一般行地址、列地址分时复用地址总线,通过标志位判断是行地址还是列地址
图片
简化时序图如下:
图片

DRAM读写过程

读取一个比特的总体流程是:获得行号,译码行号,开启单元行,放大位线电压波动并暂存数据到放大器,获得列号并根据列号选择一位进行输出,写回数据,关闭字线,重新预充电。

而写一个比特的总体流程是:获得行号,译码行号,开启单元行,放大位线电压波动并暂存数据到放大器,获得列号并输入写入数据,根据列号把写入数据送到放大器并改写暂存值,写回数据,关闭字线,重新预充电。
在以上两个流程中,时间花费的大头是“开启单元行”、“放大电压波动并暂存数据”

  • 开启单元行”之所以花费时间,是因为行地址译码器需要拉高一整条字线,需要拉高单元行上所有晶体管的栅极电压,而拉高这么多的栅极电压很耗时间。因为可以把这些栅极抽象成一个一个电容,拉高电容的电压,其实就是对电容充电,是需要时间的,电容越大,所需时间越长,而单元行上的所有的栅极由于是并联的,可以整体抽象成一个很大的电容, DRAM 读写选通环节就是用一根字线给这个很大的电容充电,因此时间消耗很大。如果cell阵列设计的不合理,即单元行上的 cell 数量太多,那么“开启单元行”会变得很昂贵。
  • 放大器放大电压波动并暂存数据也很消耗时间,因为放大器大部分是模拟电路,工作速度不快。

在允许 row buffer 长时间保持行数据的情况下,如果读写请求发生在 row buffer 保存的单元行中(这种情况称为“行命中”),那么 DRAM 的读写速度会很快,因为 DRAM 可以直接操作 row buffer ,而不需要读取新的单元行;而如果读写请求发生在 row buffer 之外的单元行中(这种情况称为“行缺失”),那么 DRAM 就要把 row buffer 写回并读取新的单元行,这样做速度会很慢

DRAM层级结构

Channel

一个主板上可能有多个插槽,用来插多根内存。这些槽位分成两组或多组,组内共享物理信号线。这样的一组数据信号线、对应几个槽位(内存条)称为一个channel(通道)。简单理解就是DDRC(DDR控制器),一个通道对应一个DDRC。CPU外核或北桥有两个内存控制器,每个控制器控制一个内存通道。内存带宽增加一倍。(理论上)

BANK

一个 cell 阵列一次可以提供一个比特,那么多个cell阵列就可以一次提供多个比特。假如CPU一次读写8个比特,那么就可以用 8 个 cell 阵列。查找cell阵列中的一个单元需要有其行号和列号,那CPU是否需要给8个cell阵列提供 8 组地址呢?不需要,8 个 cell 阵列可以共享一组行地址和列地址。

共享行、列地址的一组 cell 阵列被称作一个 BANK

下图展示了一个含有 8 个 cell 阵列的 bank 。它们共用行地址、列地址和地址选通、写使能,每个阵列提供一条输出线,8 个阵列最终组成 8 根输出线,可以输出 8 个比特。
图片
一颗DRAM上一般包含多个BANK,每次读写只选中一个bank,因此address中需要一个bank号

RANK 、

拆过电脑的朋友知道电脑用的内存芯片都嵌在一个电路板上,把这个电路板插入内存插槽后,就可增加电脑内存。电路板加板上的芯片,这就是所谓的内存条,也称为 DIMM 条(全称 Dual-Inline-Memory-Modules ,中文名叫双列直插式存储模块)。内存条通过“内存通道”连接到内存控制器,
一组可以被一个内存通道同时访问的芯片称作一个 rank 。
一个 rank 中的每个芯片都共用内存通道提供的地址线、控制线和数据线,同时每个芯片都提供一组输出线,这些输出线组合起来就是内存条的输出线。

下图是一个包含 8 颗芯片的 DIMM 条。这 8 颗芯片被一个内存通道同时访问,所以它们合称为一个 rank 。有的 DIMM 条有两面,即两面都有内存芯片,这种 DIMM 条拥有两个 rank 。
图片
图片

图片

假设上图中的每个芯片都包含 8 个bank,每个 bank 都包含 8 个阵列,那么这条内存条就可以一次读写 8×8=64 比特,其中第一个 8 是指每个芯片输出 8 位(即为每一个bank是由8个阵列构成的可以一次输出8bit),第二个 8 是指这个 rank 总共有 8 颗芯片(即为上图的8个黑方块,每一个芯片都可以输出8bit),因为这 8 颗芯片被同一个内存通道访问,所以其被访问的 bank 和 bank 内的行地址、列地址都是完全一致的。下图是一个描述这个过程的简图:显然,我们在读写 8 颗芯片同一个 bank 同一个位置的 cell ,注意,图中没有显示不在工作状态的 bank

图片
图片

Bank Group

DDR Bank Group 是 DDR4 及更新的 DDR5 内存技术中的一项关键架构设计,它通过将内存内部的存储单元进行逻辑分组,来提升数据访问的并行性和效率,从而降低延迟并提高整体性能。‌

  • 层级结构‌:在内存颗粒(Die)内部,Bank Group 位于 Rank 之下、Bank 之上。一个 Rank 通常包含多个 Bank Group(例如 DDR4 常见为 4 个 Bank Group,每个组再分为 4 个 Bank,共 16 个 Bank)。‌
  • 提升并行性‌:传统 DDR3 内存中,所有 Bank 共享同一套控制路径,导致行激活(ACTIVATE)命令会相互阻塞(受 tRRD 延迟限制)。而 Bank Group 通过将 Bank 分组,允许不同组的 Bank 同时执行操作(如激活不同行),实现真正的多体并行访问。
  • 降低访问冲突‌:通过增加 Bank Group 数量(如 DDR5 最多支持 8 组),内存可以同时维持更多激活页面,减少操作冲突,尤其在多任务处理或高负载场景下更流畅。‌

Prefetch

Brust Length

版权声明:本文为CSDN博主「呆呆象呆呆」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41554005/article/details/134234240
通过上面的分析,我们可以推导出一个结论:在读写 DRAM 时,最好不要频繁地开启新单元行和使用放大器

posted @ 2025-12-06 20:20  刘朝锋  阅读(78)  评论(0)    收藏  举报