Fork me on GitHub
0%

DDR基础与原理

前面的文章对SRAM的Cache做了详细分析,而这部分将对另一种随机存取器动态随机存储器DRAM做进一步说明。本文大部分是基于BranchEducation的视频内容和其它文章进行行文的,文章截图全部来自视频,部分是自己所画,视频连接放在最后的参考资料部分。

DRAM

DRAM:Dynamic Random Access Memory,动态随机存储器。

在DRAM的分类中,SDRAM(Synchronous DRAM)同步动态随机存储器在各个行业则占较大的比例。而我们经常听到的DDR(Double Data Rate SDRAM)即双倍速率SDRAM则又是SDRAM中的主要代表,本篇将着重对DDR原理进行分析

DRAM是程序运行的和临时数据存储的媒介,无论是计算机还是手机的参数主存大小即指的是DRAM的大小。在工作中我们其实很少区分DDR和DRAM,严格来说DDR只能是DRAM中的一种,whatever,工作中不影响正常理解和使用就好。

DDR SDRAM

简介

Wiki:英文中文

  • DDR SDRAM:Double Data Rate Synchronous Dynamic Random Access Memory,双倍数据率同步动态随机存取存储器。之所以“同步”是指内存的工作需要同步时钟,命令的发送和数据的传输都要以此为基准;“动态”则是因为我们需要为其提供电压定时刷新来保证数据的完整性,掉电则数据丢失;“双倍”则是由于其在时钟的上升沿和下降沿都可以进行数据的传输

  • LPDDR SDRAM:Low-Power Double Data Rate SDRAM,是一种功耗较低的同步动态随机存取存储器,主要用于移动计算机和手机等设备。较旧的变体也称为移动 DDR,缩写为 mDDR。现代 LPDDR SDRAM 与DDR SDRAM截然不同,具有多种差异,甚至LPDDR 技术标准是独立于 DDR 标准开发的。(本篇不对此做详细说明)

各版本参数对比

DDR SDRAM Standard Bus clock (MHz) Internal rate (MHz) Prefetch (min burst) Transfer Rate (MT/s) Voltage DIMM pins SO-DIMM pins MicroDIMM pins
DDR 100–200 100–200 2n 200–400 2.5/2.6 184 200 172
DDR2 200–533 100–266 4n 400–1066 1.8 240 200 214
DDR3 400–1066 100–266 8n 800–2400 1.5 240 204 214
DDR4 800–1200 200–300 16n 1600–5067 1.2 288 260 214

概念

  • channel:通道,属于控制器端的概念。可以简单理解为一个通道对应一个DDR控制器,每个通道拥有一组地址线、控制线和数据线

  • SIMM:Single In-line Memory Module,单列内存模组。内存模组电路板与主板插槽的接口只有一列引脚

  • DIMM:Double In-line Memory Module,双列内存模组,主板上的一个内存插槽,内存模组电路板与主板插槽的接口有两列引脚。一个Channel可以包括多个DIMM。

  • Rank:CPU在一个时钟周期取数据的大小取决于数据总线的位宽(这个位宽被称为物理 Bank(Physical Bank),通常内存颗粒都没有P-Bank大小的位宽,这时就需要多个内存颗粒组合起来满足CPU的一次访存。假设P-Bank=64bit即64位数据总线,而内存颗粒Chip的位宽是8bit,则8个chip组成了一个Rank。

  • Chip:1个chip大多是4bit/8bit/16bit等,多个chip组成一个rank,配合完成一次访问的位宽要求。这就是颗粒。内存颗粒共享地址和命令总线,各自有自己的数据总线

  • Bank:也称Logic Bank逻辑Bank,与物理bank的概念相对应。由于成本、技术以及SDRAM工作原理的限制,做一个全容量的Bank不太现实(寻址冲突),所以在寻址时需要先选中Bank,在根据行列选中数据。DDR2、DDR3已经有8个Bank

  • row/column:行列,存储的最小单元,每一个行列交叉点存储了1bit的数据。

笼统上讲从大到小为:channel > DIMM > rank > chip > bank > row/column,如下图:

image

内存大小

SDRAM总存储容量 = 行数 x 列数 x L-Bank数量 = 存储单元个数 x 存储单元容量(4bit/8bit/16bit)

基本结构

Tips:判断MOS管是N沟道还是P沟道,里N外P,即箭头指向G是NMOS,反之是PMOS

利用了电容能够保持电荷及其充放电的特性。目前市场最常用的存储1bit数据的SDRAM的结构是由一个MOS管、一个电容和两根导线组成的。电容一段连接晶体管一端另一端接地、字线连接MOS管的栅极,位线连接到晶体管通道的另一端,如下图所示:

image

  • 当字线(WL)电压为逻辑1时开关打开,存储单元选通,如果此时位线(BL)为高电压,则向电容中充电,则就是向存储单元中写1;相反如果WL=1,BL=0电容放电,这就是向存储单元中写0

  • 当字线(WL)电压为逻辑1时开关打开,此时在位线上连接电量计就可以测量电容中存储的的值。如果电容放电,那么就表示这个单元里原来存的值是 1,如果电容不放电,则表示原来的值是 0。可见当DRAM进行数据读取的时候会使存储单元中的1变成0,是有破坏性的,而实际中我们需要读出继续保持数据或电荷,后面有对此的解决办法(感应放大器)

当字线关闭的时候就不进行任何读写操作了,晶体管也紧跟着被关闭,电容器与位线隔离从而保存了之前写入的数据或电荷。但是由于晶体管十分小,存储在电容器中的电荷会在通道上慢慢泄露,因此又需要另外的技术来对此进行修复(Recharge)

工作原理

下图是对一个bank的一部分作图进行说明。行译码器、列选择复用器之所以这样设计是因为:当数据进行读写的时候,只需要打开某一个固定行(其它行关闭)即可,这样子该行所在的电容将连接到位线上,而在进行列选择的时候,由于是进行多比特的选择(4bit/8bit)所以要这里的列多路复用器相当于列中的第几组(组数*位宽)

image

读/写

通用流程

预充电电压根据DDR每一代是有所不同的,但一定是充电电压的一半

  1. 选择bank;
  2. 关闭所有行;关闭所有字线,隔离所有电容
  3. 预充电;将所有位线的电压升值供电电压一半(DDR5:0.55V;DDR4:0.6V;DDR3:0.75V)
  4. 行选择;字线上电打开MOS管形成的开关,电容连接到对应的位线
  5. 列选择;位线通过多路复用选择器连接到数据线上

说明

  • 读(保证数据不丢失)

    行选择时,当字线选中后,该行所在的电容被连接到对应的位线。如果电容存储的数据是1(电容压差是供电电压1.1 / 1.2 / 1.4),由于位线预充电后电压至供电电压的一半,所以电荷将从电容流向位线,进而位线电压增加,这时位线下面所连接的感应放大器能感受到这种轻微的变化或扰动,并放大这一变化,将位线电压再增加到供电电压(1.1 / 1.2 / 1.4);相反,如果存储的是0,电荷将从位线流向电容,位线电压降低,感应放大器放大这一变化,将位线电压降低至0V。这样就保证了既能够通过位线读取数据又保证电容数据不丢失

  • 写流程与读类似,但当要写入的数据–>数据总线–>写驱动器器–>多路选择复用器–>感应放大器—>位线 这样流程下来的时候,由于写驱动器的存在,它比感应放大器强大的多,这将会导致写驱动器出来的数据直接覆盖掉位线上原有的数据

实例

假设32位地址总线,32个bank,65536(2^16^)行,8192(2^13^)列,8bitddr颗粒

  • 0-4,5位地址将选择某个bank
  • 行关闭 + 预充电
  • 5-21,16位选择某个行
  • 22-31,10bit选择某个组(每一组8列,这个由L-bank位宽决定)

刷新Refresh

refresh每一行的刷新时间是50ns。而整个bank刷新的时间间隔是64ms/次(小于电荷泄露1->0的最短时间)

目的

由于SDRAM最小存储单元电路形式是电容,电容是有自放电的特性。长时间存储电容电荷会漏电,故需要刷新和预充电进行补充。

分类

  • 自动刷新(Auto Refresh,简称AR/REF,需要CK,CKE高)
  • 自刷新(Self Refresh,简称SR/SRE-SRF,SDRAM内部产生,不依赖CK,CKE低,用于休眠模式或低功耗)

步骤

  1. 关闭所有行
  2. 预充电
  3. 打开行,感应放大并填充电荷
  4. 从第一行到最后一行重复第3步骤

参数

  • CAS:Column Address Select,列地址选择
  • RAS:Row Address Select,行地址选择
  • CAS Latency:(CL)CAS延迟。指的是从行打开到到接收到存储在列中的数据的时间
  • tRCD:RAS to CAS Delay RAS-CAS延迟,激活时间。指的是在字线全部关闭,位线被预充电的情况下,打开一行所需要的时间
  • tRP:RAS Precharge Time ,行预充电时间。指的是再打开一行之前对位线进行预充电的时间
  • tRAS:激活一行和接下来预充电之间的时间

image

优化/访存加速

行命中

在DRAM的读写过程中,其中比较耗时的步骤应该就是行打开。

可以考虑这样一个场景:CPU第一次访存是在249行,第二次所需要的数据大概率也可能在249行,因此在第一次和第二次访存中间我们就可以不关闭行了,而是等到新的行访存再进行整个读写步骤。进而将一个bank内的情况推广到整个内存颗粒,每一个bank上都存在一行未关闭(即上次访存数据所在的行),而当下次访存所在的行如果打开则成为Row Hit行命中,如果没有称为Row Miss(参考【5参数】章节的图片)

Burst Buffer

Burst:突发,是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(Burst Lengths,简称 BL)。

如果所示就是两个128bit的burst buffer,上端连接列选择即数据段,下面连接读写驱动器。人们只要指定起始列地址与突发长度,内存就会依次地自动对后面 相应数量的存储单元进行读/写操作而不再需要控制器连续地提供列地址。这样,除了第一笔数据的传输需要若干个周期(主要是之前的延迟,一般的是 tRCD+CL)外,其后每个数据只需一个周期的即可获得。

至于 BL 的数值,也是不能随便设或在数据进行传输前临时决定。一定要参考相应的数据手册进行设置,比较常见的设定是 4 和 8。

image

感应放大器

  • 优化方式

    让每一个感应放大器上由两个位线连接到其上,让交替排列的存储单元分别连接在左侧和右侧的位线。交叉耦合反相器的存在使得一半的位线处于1,另一半处于0,这被称为差分对

  • 好处:

    1. 预充电时,由于差分对两侧一边是0,一边是1,所以断开两个反相器然后通过三极管将两个位线连接,电压将降低到中值
    2. 抗噪音
    3. 减少位线寄生电容

image

参考链接

1、2链接为同一视频,区别在于1是Youtube英文版,2是B站中文译版

  1. How does Computer Memory Work?
  2. 计算机如何工作?
  3. SDRAM与DDR2存储器原理详解【FPGA应用场景】
  4. 美光SDRAM MT48LC2M32B2TG-7 数据手册