DDR4 SDRAM -1. 理解基本原理

引子:

最近在看DDR4方面的材料,Google到了一硬件大佬的Blog,近期几篇将会翻译学习下文章。强烈推荐感兴趣的同学可以去阅读原文。
本篇文章原文:https://www.systemverilog.io/ddr4-basics

绪论

DDR4 SDRAM在ASIC和FPGA设备中使用非常普遍。在这篇文章中,我们将探讨一些基本知识。

• DDR4 SDRAM的内部是什么样子的?
• 在诸如READ和WRITE等基本操作过程中发生了什么,以及
• SDRAM子系统的高级图画,即你的ASIC/FPGA怎样才能与DDR4 SDRAM存储器进行对话

物理结构

一个好的开始是看看一些基本的IO,并了解它们的功能是什么。从这里开始,我们将深入研究,直到了解构成DRAM存储器的基本单元。

顶层

正如你所期望的那样,DRAM有时钟、复位、芯片选择、地址和数据输入。下面的表格对每一个输入都有更多的细节。这并不是一个完整的IO列表,这里只列出了基本的IO。请花一点时间仔细阅读每个IO的作用,特别是双功能地址输入

image
                                                                             Figure 1: Top Level

符号 类型 功能描述
RESET_n Input 只有当该信号为高电平时,DRAM才处于激活状态
CS_n Input 只有当它为低电平时,内存才会查看其他所有的输入
CKE Input 时钟使能。高电平激活内部时钟信号和设备输入缓冲器和输出驱动器
CK_t/CK_c Input 差分时钟输入。所有的地址和控制信号在CK_t的正沿和CK_n的负沿交叉时被采样。
DQ/DQS Input 数据总线和数据选通。这就是数据被写入和读出的方式。选通器本质上是一个数据有效标志
RAS_n/A16
CAS_n/A15
WE_n/A14
Input 这些是双重功能的输入。当ACT_n和CS_n为低电平时,它们被解释为行地址位。当ACT_n为高电平时,它们被解释为命令引脚以指示 READ、WRITE 或其他命令
ACT_n Input 激活指令输入
BG0-1
BA0-1
Input bank Group、bank地址
A0-13 Input 地址输入

BankGroup, Bank, Row, Column

顶层图片显示了 DRAM 的外在。再往下看,这就是内存的组织方式----bank Group和banks
image
                                                                             Figure 2: BankGroup & Bank

要从内存中读出,你要提供一个地址,而要向它写入,你还要提供数据。这个由用户提供的地址,通常被称为 "逻辑地址"。

这个逻辑地址在被提交给DRAM之前被翻译成物理地址。物理地址是由以下字段组成的:

• Bank Group
• Bank
• Row       #行
• Column #列

然后,这些单独的字段被用来识别内存中的确切位置,以便进行读出写入

再继续往下看,这就是你将在每个bank中看到的内容。

• Memory Arrays       #内存阵列
• Row Decoder           #行解码器
• Column Decoder      #列解码器
• Sense Amplifiers       #感应放大器

image
                                                                             Figure 3: Row & Column解码

一旦识别了Bank Group和Bank,地址的Row部分将激活内存阵列中的一行。这一行称为word line(字线) ,激活它会将数据从内存阵列读取到Sense Amplifiers感应放大器 中。然后,列地址读出加载到Sense Amplifiers感应放大器 中的 部分字。列的宽度称为Bit Line(位线) 【即部分字的宽度】

列的宽度是标准的 - 它是 4 位、8 位或 16 位宽,DRAM 根据此列宽分为 x4、x8 或 x16。另外需要注意的是,DQ 数据总线的宽度与列宽相同。因此,为简化起见,您可以说 DRAM 是根据 DQ 总线的宽度进行分类的。
[旁注:x16 设备只有 2 个 Bank Group,而 x4 和 x8 有 4 个,如图 2 所示。]


类比时间:一块DRAM芯片相当于一栋满是文件柜的大楼

Bank Group → 确定楼层
Bank Address → 确定你所需要的文件在该楼层的文件柜
Row Address → 识别文件在柜子里的哪个抽屉。将数据读入感应放大器,相当于打开/拉出文件抽屉。
Col Address → 识别该抽屉内的文件编号


在最底层,一个比特本质上是一个保持电荷的电容和一个充当开关的晶体管。

image
                                                                             Figure 4: Bit

由于电容会随着时间的推移而放电,除非定期对电容器进行刷新,否则信息最终会消失。这就是DRAM中 "D "的由来--它指的是动态,而不是SRAM(静态随机存取存储器)

DRAM的大小和寻址

DRAM有标准尺寸,这在JEDEC规格中有所规定。JEDEC是决定DDR存储器的设计和路线图的标准委员会。这是来自DDR4 JEDEC规范(JESD79-4B)的第2.7节。

image
                                                                             Figure 5: 寻址

DRAM 大小计算

让我们尝试通过手工计算其中的两个尺寸,使上表更有意义一些。

	/* 4Gb x4 Device */                                                   /* 4Gb x8 Device */
	Number of Row Address bits: A0-A15 = 16 bits                         Number of Row Address bits: A0-A14 = 15 bits
	          Total number of row = 2^16 = 64K                                     Total number of row = 2^15 = 32K
	Number of Column Address bits: A0-A9 = 10 bits                       Number of Column Address bits: A0-A9 = 10 bits
	          Number of columns per row = 1K                                       Number of columns per row = 1K
	Width of each column = 4 bits                                        Width of each column = 8 bits
	Number of Bank Groups = 4                                            Number of Bank Groups = 4
	Number of Banks = 4                                                  Number of Banks = 4
	
	Total DRAM Capacity =                                                Total DRAM Capacity = 
	       Num.Rows x                                                           Num.Rows x 
	       Num.Columns x Width.of.Column x                                      Num.Columns x Width.of.Column x 
	       Num.BankGroups x Num.Banks                                           Num.BankGroups x Num.Banks
	   
	       Total DRAM Capacity =                                                Total DRAM Capacity = 
	       64K x 1K x 4 x 4 x 4 = 4Gb                                           32K x 1K x 8 x 4 x 4 = 4Gb

DRAM Page Size

在上面的表格中,提到了页面大小。页面大小本质上是指每行的比特数。或者换个说法,它是当一行被激活时加载到感应放大器的位数。由于列地址是10位宽,每行有1K位线。因此,对于一个X4设备,比特数是1K x 4 = 4K比特(或512B)。同样,对于x8设备,每页是1KB,对于x16设备,每页是2KB。

Rank(深度级联)

在处理DRAM时,你会遇到一些术语,如Single-Rank、Dual-Rank或Quad-Rank。Rank 是最高的逻辑单元,通常用于增加系统的内存容量。
假设你需要16Gb的内存。取决于市场上有哪些产品,哪些产品更便宜,你可以有一个16Gb的内存芯片,在这种情况下,你会称之为Single Rank系统,因为你只需要一个ChipSelect信号(CS_n)来读取内存的所有内容。或者你可以选择在PCB上焊接2个独立的8Gb器件(因为2x8Gb器件刚好比1x16Gb便宜)。在这种情况下,这两个设备将被连接到相同的地址和数据总线上,但你需要两个ChipSelects来分别给每个设备寻址。因为你需要两个ChipSelects,所以这种配置被称为Dual-Rank。

[旁注:你可能会遇到的另一个DRAM品种是 "双die封装 "或DDP。在这种情况下,你会有一个焊接在电路板上的单一DRAM芯片,但在封装内部上,它是一个2个die的堆叠。每个芯片将再次共享地址和数据线,但将有独立的芯片选择,使其成为一个Dual Rank设备。]

image
                                                                             Figure 6: Rank

宽度级联

另一个例子 - 假设您需要一个 8Gb 内存,并且您的芯片接口是 x8。然后,您可以选择一个 8Gb x8 设备或两个 4Gb x4 设备,并在 PCB 上以“宽度级联”方式连接它们。在宽度级联的情况下,两个DRAM都连接到相同的芯片选择、地址和命令总线上,但使用不同的数据总线部分(DQ和DQS)。在下图中,第一个X4 DRAM连接到DQ[3:0],第二个连接到DQ[7:4]。
image
                                                                             Figure 7: DRAMs宽度级联

访问内存

• 对DDR4 SDRAM的读和写操作是以突发为导向的。它从一个选定的位置开始(由用户提供的地址指定),并继续进行4个或8个突发长度。
• 读取和写入操作是一个两步过程。它以 ACTIVATE 命令开始(ACT_n 和 CS_n 在一个时钟周期内变为低电平),然后是 RD 或 WR 命令。
• 与 ACTIVATE 命令同时注册的地址位用于选择要激活的 BankGroup、Bank 和 Row(x4/8 中的 BG0-BG1 和 x16 中的 BG0 选择 bankgroup;BA0-BA1 选择 bank;A0-A17 选择row)。此步骤也称为 RAS - Row Address Strobe(RAS - 行地址选通)
• 与读或写命令同时注册的地址位用于选择突发操作的起始列位置。此步骤也称为CAS - Column Address Strobe(CAS - 列地址选通)。
• 每个bank只有一组感应放大器。在对同一bank的不同行进行读/写之前,必须使用PRECHARGE命令解除当前打开的row的激活。PRECHARGE相当于关闭柜子里当前的文件抽屉,它使感应放大器中的数据被写回row中。
• 可以使用 RDA(自动预充电读取)和 WRA(自动预充电写入)命令,而不是发出显式 PRECHARGE 命令来停用行。这些命令告诉 DRAM 在读取或写入操作完成后自动停用/预充电行。由于列地址只使用地址位A0-A9,A10在CAS期间是一个未使用的位,它被重载以指示自动预充电。

命令真值表

我经常提到一些叫做“命令”的东西——ACTIVATE 命令、PRECHARGE 命令、READ 命令、WRITE 命令。但在本文的第一张图片中,DRAM 没有“命令”输入。那么这些命令是如何发出的呢?
真相是,DRAM 根据下面的真值表将 ACT_n、RAS_n、CAS_n 和 WE_n 输入解释为命令。

Function Shortcode CS_n ACT_n RAS_n/A16 CAS_n/A15 WE_n/A14 A10/AP
Refresh REF L H L L H H or L
Single Bank Precharge PRE L H L H L L
Bank Activate ACT L L Row Address Row Address Row Address Row Address
Write WR L H H L L L
Write with Auto-Precharge WRA L H H L L H
Read RD L H H L H L
Read with Auto-Precharge RDA L H H L H H

                                                                             部分命令真值表

上面的表格只是你可以向DRAM发出的命令的一个子集。整个DDR4命令真值表在JEDEC规范JESD79-4B的第4.1节中规定。

Read

image

                                                                             Figure 8: 读操作

图8显示了突发长度为8(BL8)的READ操作的时序图。

• 第一步是一个ACT命令。这时地址总线上的值表示行地址。
• 在第二步,发出RDA(自动预充电的读)。这时地址总线上的值是列地址。
• RDA命令告诉DRAM在读取完成后自动PRECHARGEs bank。

Write

image

                                                                             Figure 9: 写操作

图9是WRITE操作的时序图。

• 第一步激活一行
• 然后发出 2 个 WRITE 命令。第一个寻址COL,第二个寻址COL+8。
• 第二个写入操作之前不需要 ACT,因为我们要写入的行已经在Sense Amps(感应放大器)中被激活了。
• 还要注意的是,第一条命令是一个普通的WR,所以它使行处于激活状态。第二条命令是WRA,它在写完后取消了该行的激活。

[旁注:我在这里偷偷加了点东西,没有过多解释。A16、A15和A14不是唯一具有双重功能的地址位。自动预充电命令通过 A10 发出,如果在模式寄存器中启用,则通过 A12 选择 BurstChop4 (BC4) 或 BurstLength8 (BL8) 模式]

DRAM子系统

现在我们已经对DRAM进行了足够长的讨论,现在是时候谈谈ASIC或FPGA需要什么来与DRAM对话。这就是所谓的DRAM子系统,它由三个部分组成:
• DRAM存储器本身,包括上述的所有内容
• DDR PHY物理层
• DDR控制器

image

                                                                             Figure 10: DRAM子系统

上面的图片中发生了很多事件,所以让我们把它分解一下:
• DRAM 被焊接在板上。 PHY 和控制器以及用户逻辑通常是同一 FPGA 或 ASIC 的一部分。
• 用户逻辑和控制器之间的接口可以是用户定义的,不需要是标准的。
• 当用户逻辑向控制器发出读或写请求时,它会发出一个逻辑地址
• 然后控制器将此逻辑地址转换为物理地址并向 PHY 发出命令。
• 控制器和 PHY 通过称为 DFI 接口的标准接口相互通信。你可以从这里下载DFI的规范。
• 然后,PHY完成所有低级别的信令,并将物理接口驱动到 DRAM。
• JEDEC标准中规定了PHY和存储器之间的这种接口。JESD79-49B specification

将控制器视为大脑,将 PHY 视为肌肉。
• 当你激活一个行时,整个页面会被加载到Sense Amps中,所以对一个已经打开的页面进行多次读取,成本较低,因为你可以跳过激活行的第一步。控制器通常有能力对用户发出的请求重新排序,以利用这一优势。为了进行重新排序,它使用了一个小的缓存或TCAM,并总是返回最新的数据,所以你不必担心陈旧的数据或由于控制器的重新排序而发生的碰撞
• PHY包含模拟驱动器,并提供调整寄存器的能力,以增加驱动强度或变更终止,以改善信号完整性。

概括地说

我们来总结一下:
• DRAM包含Bank Groups, Bank, Row & Columns。
• 用户发出的地址被称为逻辑地址,并由DRAM控制器将其转换为物理地址,然后提交给DRAM。
• 根据DQ数据总线的宽度,DDR4 DRAM被分为x4、x8或x16。
• 可以通过深度级联或宽度级联 DRAM 以达到所需的大小。
• 读取和写入操作是一个两步过程。第一步激活一行,第二步读取或写入内存
• DRAM子系统由存储器、PHY层和控制器组成。

posted on 2022-06-24 10:00  miyan  阅读(9835)  评论(0编辑  收藏  举报