文章内容较多,如有错误恳请指正,谢谢。
DDR的主要电压
VDD核心供电
VDDQ IO接口供电
VPP 字线供电
VTT 位线供电(DDR5取消)
VREF 基准电压(DDR5取消独立引脚)
DDR内存层级
Cell-Array-Bank-BankGroup-Chip-Rank-Dimm
Cell与VPP电压
![]()
Cell
Cell是组成内存的基本单元,由一个Nmos和一个电容组成。电容内存储电荷越多电压越高,反之电压越低,我们规定电容电压低于VDD/2表示0,高于则表示1,这样就能够借助电容的电压存储数据,但是一个电容只能存储1bit。
Nmos像一个开关,Gate上的电压=VPP的时候Nmos导通,Gate上电压=0V的时候Nmos关闭。
Array与读写过程
![]()
1个array
![]()
8个array
array是由数量庞大的cell组成的存储阵列,指定行地址和列地址就能精确定位到1bit数据。
每个array都有一行Sense Amplifier感测放大器(简称SA),由于电容可以存储或者释放的电荷量很小,位线上的电压变化很难被感测到,于是就需要SA放大这种变化。
整个读过程为Precharge预充电-RAS行地址激活-CAS列地址激活
![]()
Precharge:首先将word line字线电压将至0V从而关闭Nmos,由VTT供给电压将bit line位线的电压充电到VDD/2,描述这个过程所消耗的时钟周期数的时序就是tRP。
RAS行地址激活:指定一行的word line字线电压上升至VPP电压从而开启Nmos,Nmos开启之后,如果电容电压大于bit line电压则对外放电使得bit line位线电压略微大于VDD/2,SA感测到这个变化就会增大这个变化,让bit line电压上升到VDD,如果电容电压小于VDD/2,则在SA干预下放电到0V,自此一行的cell被打开,数据被放到了bit line,等待取用,描述这个过程所消耗的时钟周期数的时序是tRCD。
CAS列地址激活:在已经打开的行里面,选中一个列,这个行列同时被激活的cell数据就会被送到Brust缓冲区,经过读驱动器输出到主板的DQ总线,最后送入CPU的内存控制器接口。
Prefetch预取
打开一行cell要经历预充电,行地址激活非常耗时;程序有一个重要的特性即空间局限性,当程序使用一条数据,不久它大概率也会使用临近的数据。根据以上两条,我们可以在CPU指定一个行列之后,把这一位地址的数据,连同它后面的数据打包一并发送给CPU,提升缓存命中率(当然这种方式肯定是有边际效应)DDR5预取宽度为16n,也就是说一次寻址连续发送16批数据,DDR4和DDR3为8n,DDR2为4n,DDR1为2n。
Bank与颗粒位宽
bank内由多个array组成,同一个bank内的array共享行列地址。
所以假如一个bank有8个array,指定一个bank的行列地址,8个array都会收到相同的地址,并同时将数据输出出来,所以实际输出总数据量就是1*8bit。
另外内存颗粒的位宽与array的数量一致,16bit位宽的颗粒意味着有每个bank由16个array组成。
BankGroup与DDR5残血颗粒
一个bankgroup通常由4个bank组成(取决于规格)
bankgroup是DDR4引入的新技术,再此之前的DDR内存没有这个层级,一个颗粒内的bank共享资源,同一时间只能激活一个bank无法并行。DDR4将bank划分为不同的组,每个bankgroup拥有独立的资源,bankgroup之间可以并行,当然同一个bankgroup内的bank之间依旧无法并行,因为共享资源,一个bank占用同组内的其他bank只能等。
DDR5 2GB容量8bit位宽的颗粒,拥有8个bankgroup,每个bankgroup由4个bank组成通常是我们所说的满血颗粒
残血颗粒常见有两种:
第一种1GB 8bit位宽,拥有8个bankgroup但是每个bankgroup只有2个bank,bank大小不变所以容量砍半。
第二种2GB 16bit位宽,bankgroup被砍到4个,通过上个小节可知,array数量翻倍意味着bank容量翻倍,但是bankgroup数量砍半,所以容量依旧2GB,但是bankgroup还被砍了。
Chip与专用条的由来
chip即为我们所说的内存颗粒,DDR1-5 每内存通道内DQ通道(数据通道)位宽为64bit,所以假如8bit位宽颗粒,就需要8个。16bit位宽颗粒需要4个。
AMD或者Intel不同代数产品的内存控制器对于内存颗粒位宽的支持不一样,比如某个时期Intel最小可支持4bit颗粒,AMD只支持8bit颗粒,那么就会出现拿服务器4bit颗粒做成的内存条,被称为英特尔内存条。
Rank双面内存条
一根内存条的位宽所能容纳的内存颗粒是有限的,物理插槽的数量也是有限的,那么如何再提升内存容量?答案就是在一根内存条再增加一个层级rank,共享64bit的位宽,虽然DQ总线同一时间只能被一个rank占用,无法提升并行能力,但是却实打实提升了容量。
物理上把颗粒做到两面不一定是双面条,也有可能是每面4个8bit颗粒。真正的双面条是指诸如每面8个8bit颗粒这种,多rank内存条。
DIMM与双通道
除了APU,绝大多数消费级产品只提供两个内存通道,一个内存通道上面可以做两个槽称为
2DPC,由于内存通道属于高速信号线,并且属于并行总线(要求理想情况下64条数据总线的数据从输出到输入完全同步)布线要求极高,所以布线水平和用料一致的情况下主板总计只有2个槽的1DPC电气性要显著优于4槽的2DPC,这就是为什么内存超频特化板都会设计成2槽主板。
那么2DPC该怎么优化,主流有两种拓扑,分别是T走线和菊花链,目前主流是菊花链,链接到每条通道最后一个槽,即可消除残线干扰,增强信号完整性,但是实际上空槽和背部针脚依旧像天线一样损耗信号。于是你可以看到设计师的各种努力,比如使用贴片引脚槽,优化触点,1DPC主板,加厚PCB层数降低布线压力,调整内存位置靠近CPU等。
![]()
优化触点
DDR4时期一个DQ通道位宽是64bit,双通道提升性能的本质是2个通道并行,总计128bit位宽,带宽翻倍,延迟降低。
DDR5将64bit的DQ通道拆分成两个,每条子通道32bit,双子通道带宽和完整单通道没区别,所以并没有完整双通道提升那么大,不能混为一谈。
那么为什么非要把DDR5拆分成32bit?仅仅是为了降一点延迟吗?其实和x86架构的缓存有关,内存读写实际上是受限于缓存,每个通道每次操作必须完整刷新缓存行,x86架构处理器缓存行大小为64B(512bit)。
结合DDR预取,DDR5一次输出为64bit*16n=1024bit,超出一个缓存行大小,多余的数据会被浪费掉,全部做无用功。那么把64bit拆分成32bit呢?32bit*16n=512bit正好一个缓存行大小,这便是拆分的原因。
DDR6(以下为根据LPDDR6标准推测)
我们都已经得知DDR历经5代终于是改通道位宽了,从64bit升级到96bit,每个通道拆分成4个24bit通道,预取提升到24n。
那么按照上面的理论24bit*24=576bit,很明显不对齐,这是怎么回事?这些多余的数据是无用数据吗?答案是这些数据中有512bit是送给缓存的,其余64bit是ECC校验等功能性数据。或者你可以理解为把以前ECC校验的专用通道都改成DQ通道,然后把ECC和DQ一起打包发给CPU了。
![]()
频率,时间与时序
DDR内存时序指的是某个过程所占用或者间隔的时钟周期数,DDR的时钟周期即为IO时钟周期,也就是说6400Mhz的内存,由于这个频率是DDR特性带来的,实际的IO频率为3200Mhz,一秒内有3200*1000*1000个时钟周期,那么每个时钟周期是1/3200000000=3.125e-10秒,那么tCL为28时,tCL占时为3.125e-10*28s,常用计算就是tRFC计算,比如Adie极限一般在120ns,所以在6400Mhz情况下就是120ns/(1s*1000000000/3200mhz*1000000)换算一下公式就是 (等效频率*tRFC时间)/2000,这就是这个tRFC公式或者tCL延迟公式的由来。
一些时序的说明
tRCD:前文已经说明,行打开的周期数
tRP:预充电周期数
tCL:从列地址激活到DQS导通的周期数,意味着数据已准备传递到DQ总线
tRTP:读到预充电的时间,时间上是和tCL并行计数的,因为把选中列地址和预取的数据从bit line位线写入到burst缓冲区需要时间,期间不能执行预充电否则bit line上的数据就全完了,所以需要规定tRTP,保证tRTP计时结束之前禁止预充电。
tRAS:行打开时间,从行地址激活开始算直到行关闭。一般最佳能效是tRCD+tRTP,也就是打开行并且把列地址选中以及预取的数据都加载进burst缓冲区里面所需要的周期数,干完这些就可以关闭行并执行预充电了。
tRC:行激活到完成预充电的周期数,tRAS+tRP就够了,也就是完成了行激活,数据读取至burst,预充电。
tWR:读到写延迟
tREFI:刷新指令间隔周期数,因为Nmos会漏电不可能完全不导通,所以电容里的电荷逐渐流失,就需要执行一次读操作类似过程重新刷新里面的电荷保证数据不出错,但是刷新过程中行需要打开,占用SA所以是没法进行读写的。JEDEC要求DDR4每64ms完全刷新一次,DDR5 32ms完全刷新一次。假设颗粒有8192行,那么DDR5每行刷新间隔应该是32/8192=3906.25ns,根据上一节的时间换算,tREFI=(频率*时间)/2000,注意频率是等效频率,时间单位是ns,6400Mhz内存的话按照JEDEC的标准就是6400*3906.25/2000=12500,当然JEDEC的标准是比较保守的。
tREFI越高性能越强但是对温度耐受性越差
tRFC1/2/sb:tREFI计时完成意味着开始执行刷新,tRFC描述完成刷新指令所需要的周期数,这三个tRFC对应三种模式:
Normal只会采纳tRFC1其他两个值无效,对全部bank都执行刷新;
FGR采纳tRFC2和tRFCsb,自动减半tREFI,逐步刷新1/4的bank,其他未进入刷新的部分仍可以继续读写;
Mixed模式采纳tRFC2和tRFCsb,在以上两种模式实时自动切换
![]()
tRFC对颗粒的保守要求如上图。
激进要求如下(并非绝对要求,体质好的可能能超过这些值,计算公式tRFC=等效频率*时间/2000)
海力士Adie-120ns,Mdie-160ns
三星Bdie-260ns,Ddie-270ns
镁光A G-260ns,B-360ns
tRRD_S:DDR4加入bankgroup催生出的时序,用来描述激活不同bankgroup的行之间的间隔,由于DDR5是16n预取也就是16笔数据,DDR可以在一个周期传输两次数据,所以16笔实际上只需要消耗8个周期,所以按照8周期间隔激活不同bankgroup即可实现,bankgroup并行无缝占用IO,实现资源利用最大化,形成如下图的工作流。始终有数据输出(红色)并且不在同一个时间抢IO。
![]()
tRRD_L:描述同一个bankgroup内激活bank的行所需时间,同一个bankgroup的bank共享资源,无法并行,所以一般要比_S长,一般设置12-16之间。
tFAW:连续4次行激活的最小时间间隔,直接取tRRD_S*4
