3 内存原理 基本DDR subsystem架构图:DDRC +DDRphy +SDRAM颗粒,DDR IP一般包括DDR Controller和DDR PHY,内部涉及的内容包括但不限于以下几个方面:数据保序、仲裁、最优调度、协议状态机设计、防饿死机制、bypass通路、快速切频、DDR training 从外观上就可以看出来小张的内存条由很多内存颗粒组成。 从内存控制器到内存颗粒内部逻辑,笼统上讲从大到小为:channel>DIMM>rank>chip>bank>row/column,如下图: 一个现实的例子是: 在这个例子中,一个i7 CPU支持两个Channel(双通道),每个Channel上可以插俩个DIMM,而每个DIMM由两个rank构成,8个chip组成一个rank。由于现在多数内存颗粒的位宽是8bit,而CPU带宽是64bit,所以经常是8个颗粒可以组成一个rank。所以小张的内存条2R X 8的意思是由2个rank组成,每个rank八个内存颗粒。由于整个内存是4GB,我们可以算出单个内存颗粒是256MB。 3.1 Channel 内存控制器(Memory Controller)是计算机系统内部控制内存并且负责内存与CPU之间数据交换的重要组成部分。CHANNEL即内存通道,实际上是一种内存的带宽加速技术。一个DDR控制器中可能有一个内存通道,也可能有两个内存通道。最常见的是双通道,民用级电脑都支持,服务器还有3通道和4通道等。 3.1.1 DDR3/DDR4内存通道 内存通道实际是对应一组时钟、命令、地址、数据线,这组总线也就是所谓的内存通道。一般一个内存通道,可以连接若干个DIMM。 DDR3/DDR4的内存通道,如下图所示: DDR3/DDR4内存通道关键点,一个通道上可以插多根DIMM,每个DIMM只会占用一个通道。 下面以双通道为例,解释一下多通道技术。
DDR5不会为每个DIMM提供一个64位数据通道,而是为每个DIMM提供两个独立的32位数据通道(考虑ECC时为40位)。也就是说一个DIMM会占用2个通道。 一个DDR5内存控制器,对应2个通道,每个通道32bit。这2个通道一起向一根DIMM累计提供64bit的数据访问。 与传统的DDR4双通道相比,一个DDR5内存控制器对应2个通道,2个DDR5内存控制器就对应4个通道。说的更直白就是,DDR4需要至少2根DIMM才能组成双通道;DDR5一根DIMM就可以组成双通道,2根DIMM就可以组成4通道。 Channel: 通道,芯片支持多少个DDRC(DDR控制器)就支持多少个通道。一个主板上可能有多个插槽,用来插多根内存。这些槽位分成两组或多组,组内共享物理信号线。这样的一组数据信号线、对应几个槽位(内存条)称为一个channel(通道)。简单理解就是DDRC(DDR控制器),一个通道对应一个DDRC.CPU外核或北桥有两个内存控制器,每个控制器控制一个内存通道。内存带宽增加一倍。(理论上) 3.1.3 一个内存通道可以插多少根内存条 关于这个问题,我之前也有个误区,想当然的认为每个通道,应该可以插无数根内存条,就看硬件厂商做了多少个插槽,而实际这是错误的。 一个内存控制器无论是,有一个或两个内存通道,但是一般单个通道支持的RANK数量是有限的。 比如,一个通道最大支持8个RANK,那么可能有以下几种情况: 若单条DIMM有1个RANK,那么这样的DIMM,可以插8根; 若单条DIMM有2个RANK,那么这样的DIMM,可以插4根; 若单条DIMM有4个RANK,那么这样的DIMM,可以插2根; 所以理论上,一个通道到底可以插多少根内存条,与通道支持的最大RANK数,以及DIMM的RANK数有关。 3.2 DIMM(dual inline memory module) DIMM(Dual Inline Memory Module)双列直插内存模块,也就是我们常见的内存条。 DIMM(dual inline memory module)是主板上的(一条可传输64bit数据的内存PCB,也就是内存颗粒的载体)。 但是它的历史,你知道吗? 最初在80286时代,内存颗粒(Chip)是直接插在主板上的,叫做DIP(Dual In-line Package)。 到了80386时代,换成1片焊有内存颗粒的电路板,叫做SIMM(Single-Inline Memory Module)。由阵脚形态变化成电路板带来了很多好处:模块化,安装便利等等,由此DIY市场才有可能产生。当时SIMM的位宽是32bit,即一个周期读取4个字节。 到了奔腾时,位宽变为64bit,即8个字节,于是SIMM就顺势变为DIMM(Double-Inline Memory Module)。这种形态一直延续至今,也是内存条的基本形态。 DIMM说白了就是将若干个内存颗粒,单独焊接在一块独立的电路板上,方便模块化和安装。 当然现在DIMM因其用途不同,又分为很多种,比如: RDIMM: 全称(Registered DIMM),寄存型模组,主要用在服务器上,为了增加内存的容量和稳定性分有ECC和无ECC两种,但市场上几乎都是ECC的。 UDIMM:全称(Unbuffered DIMM),无缓冲型模组,这是我们平时所用到的标准台式电脑DIMM,分有ECC和无ECC两种,一般是无ECC的。 SO-DIMM:全称(Small Outline DIMM),小外型DIMM,笔记本电脑中所使用的DIMM,分ECC和无ECC两种。 Mini-DIMM:DDR2时代新出现的模组类型,它是Registered DIMM的缩小版本,用于刀片式服务器等对体积要求苛刻的高端领域。 可以看到这些DIMM规格尺寸,都会有所差异: DIMM(dual inline memory module)是主板上的(一条可传输64bit数据的内存PCB,也就是内存颗粒的载体)。 3.2.1 DIMM容量计算 我们知道一根DIMM上可能有多个RANK,所以我们用通道位宽/内存芯片位宽,就可以得到一个RANK需要几颗芯片组成,然后使用芯片容量*芯片数,就可以得到一个RANK的容量大小,再结合RANK数量,可以计算出整根DIMM的容量。 DDR3或DDR4的DIMM计算公式,如下:
DDR5的DIMM计算公式,如下:
3.3.1 RANK是什么 下文中提到的,内存颗粒皆指Package的概念了,也就是电路板上肉眼实实在在看到的芯片。 上面讲到内存颗粒,我们都知道内存条上可不止一个内存颗粒,一般都是由很多内存颗粒共同组成一根内存条。那么你知道这些颗粒是怎么组织起来的吗,还是说多一个颗粒,少一个颗粒都无所谓呢?接下来,继续介绍。 我们知道,CPU与内存之间的数据接口位宽是64bit,也就意味着CPU在一个时钟周期内会向内存发送或从内存读取64bit的数据。可是,单个内存颗粒的位宽仅有4bit、8bit或16bit,个别也有32bit的。显然发送方和接收方的位宽必须一致,不能说我发了64位数据出来,你才收到前面的16位,后面的就丢掉了。因此,必须把多个颗粒并联起来,组成一个位宽为64bit的数据集合,才可以和CPU互连。生产商把64bit集合称为一个物理BANK(Physical BANK),简写为P-BANK。为了和逻辑BANK相区分,也经常把P-BANK称为RANK或Physical RANK,把L-BANK则简称为BANK。如果每个内存颗粒的位宽是8bit,应该由8个颗粒并联起来,组成一个RANK(64bit);同理,如果颗粒的位宽是16bit,应该由4个颗粒组成一个RANK。由此可知:Rank其实就是一组内存颗粒位宽的集合。具体说,当颗粒位宽×颗粒数=64bits时,这个模组就是有一个RANK。 为了保证和CPU的沟通,一个模组至少要有一个RANK。但是,为了保证有一定的内存容量,目前,DDR2内存,经常是采用一个模组两个RANK的架构。(过去也有用几个模组组成一个RANK的情况)。 我们可以,把这样一个由多个颗粒组成的64bit位宽集合,称为一个RANK。 大家需要认识到的就是,多个颗粒组成当前内存通道的位宽,这个位宽集合,称之为一个RANK。 不同类型DDR,其通道位宽不一样,如: 1在DDR3、DDR4上内存通道位宽为64bit。 1DDR5上,单根DIMM双通道,每个通道位宽为32bit。 为了和逻辑BANK相区分,也经常把RANK称为Physical BANK(物理BANK),简写为P-BANK。逻辑Bank,简写为L-BANK。 一个RANK中颗粒数量 = 通道位宽 / 颗粒位宽 比如,128MB内存芯片,其位宽为8bit,那么需要8块芯片才能组成64bit位宽,将这些芯片焊接到一块DIMM上,插到主板上就可以使用了。这时,该DIMM的总容量就是128MB*8=1GB。 假设,该主板只有一个DIMM插槽,并且我们还想将DIMM扩容至2GB,并且还只能使用128MB,位宽为8bit的内存颗粒。那么应该如何实现呢?说的更直白一点,就是如何做到单个DIMM容量翻倍。下面,就开始介绍。 |