​[DRAM Test]Memory Initialization, Training ,Calibration and RMT (内存初始化、训练、校准,Rank Margin Tool)

内存初始化

内存初始化是在PEI阶段完成的。一般来说我们把内存初始化分成四个阶段:

1、准备阶段

这个阶段主要是为了内存training做好准备。它要完成:

A. 初始化内存控制器寄存器。

B. 读取SPD内容。通过SMBUS读取SPD的内容,对各个延迟记录在案,下个阶段会用到。各个DIMM的SMBUS地址不同,一般是A0/A1/A2/A3,和主板走线有关。这个步骤也可以检查出来内存插槽上有没有插DIMM。在有些嵌入式主板上内存颗粒是直接焊到主板上的,这时很可能没有SPD。这时就需要固件工程师根据实际的内存颗粒的硬件手册,将延迟信息硬编码到代码中了。

2、内存Training

看到Training也许你会感到奇怪,人工智能是要训练,内存也要训练吗?

从DDR2到DDR3,一个很大的改动是信号线的连接方式。一个典型的DDR2的连接方式如图:

而DDR3变成:

这种菊花链式的方式,DDR标准的制定者JEDEC对它有个专门的叫法——“Fly-by”。这种设计大大减小DIMM厂商的硬件制造难度。同时由于CLK/CLK#、DQS、AD和CMD信号不需要同时传递,改善了信号完整性,使更高频率成为可能。世界上没有免费的午餐,它也带了不少麻烦,一个很大的问题是内存控制器的时序协调难度变大了很多。菊花链的连接方式也意味着信号在各个内存颗粒之间传递有个时间差。第一个内存颗粒和第二个颗粒也许延迟不大,但到了第八个就相当可观了。回忆一下我们上次的介绍,在行有效和列有效后,过了CL的时间第一颗chip把数据放在数据线DQ相应位上,而要过了很久第八颗Chip才把数据准备好,内存控制器要何时才能采集数据呢?现在每个内存通道一般都有两个内存插槽,情况会更加复杂。火上浇油的是,DDR标准是JEDEC制定的,内存颗粒和DIMM厂商是个生态圈,里面鱼龙混杂,内存颗粒和DIMM的延迟千奇百怪。这和ARM做的嵌入式平台只需要支持固定的内存颗粒完全不同,所有主板厂商都希望支持市面上更多的内存条。有时这就像踩钢丝,对内存A很好的时序,也许对内存B就不行。如果在启动阶段就发现时序错误还好,错误或者过激的时序如果躲过了BIOS的内存检测,到了操作系统运行的时候会造成更大的麻烦。

如何才能准确的设定时序呢?所幸JEDEC提供了标准做法,叫做Write Leveling Coarse。简单来说,就是内存控制器不停的发送不同时延的DQS 信号,内存 颗粒在DQS-DQS#的上升沿采样CK 的状态,并通过DQ 线反馈给DDR3 控制器(一组01010101的数据)。控制器端反复的调整DQS-DQS#的延时,直到控制器端检测到DQ 线上0 到1 的跳变控制器就锁住此时的延时值,此时便完成了一个Write leveling过程。如下图:

它结合其他的如on-die termination (ODT)和调节Vref电压等一起完成了内存的Training。这是个不断找到平衡点的过程,也是个训练内存控制器了解DIMM的Timing和电压的过程。

内存为什么要Training?

在BIOS程序里面,长期居住了一个另类,他的名字叫做MRC:内存参考代码。他的任务就是初始化内存,而他却管自己叫做Memory Training代码,主打的是调整时序和提高信号完整性。

Memory Training得到一组对齐、补偿和参考电压参数,来平衡和对冲线路的差异和信号的噪声。

如果我们查看Intel的BIOS的代码,会发现MRC代码量很大。而它所以另类因为它是唯一与模拟信号和信号完整性打交道的地方,大量的采样、眼图代码让它与众不同。ARM和AMD则没有如此大量的Memory Training代码,这是为什么呢?内存不Training行不行?

内存I/O部分频率越来越高,如此高的频率让小小的一点误差都会被放大。熟悉主板布线的同学应该知道高速信号布线的时钟约束十分严苛,一组高速信号在主板上拐个弯,内圈和外圈的走线长度会产生差距,尽管很小,低速信号没关系,但高速信号时钟约束就达不到,必须在相反的方向拐回来补偿一下。

内存I/O频率上G的频率,让任何细小的误差都必须得到补偿,所以要在整个数据链路进行对齐和补偿。

一个比较完整的内存访问链路包括了很多部分:


从源头开始包括MC (内存控制器,memory Controller)、PHY(MC和PHY有些在一起,很多是分离设计来增加灵活性);从Pitch到pin,再从pin穿过主板到达slot的布线;slot过金手指通过fly-by或者直连到内存颗粒;内存颗粒中到内存Cell。

这么长的链条每个点都有可能引入时钟不同步和采样延迟的问题,所以要在各个部分分别对齐,让内存DIMM的上百条连线整齐划一。(DIMM是内存插槽的类型。 DIMM全称Dual-Inline-Memory-Modules,中文名叫双列直插式存储模块)

这其实是内存初始化对齐大步骤共十几个的末尾部分:

1、对齐和补偿要从芯片内部开始,当芯片出口好了;
2、再对齐DCA、DCS(因为下面的步骤需要下command);
3、再是jedec spec里面的Read Leveling,read DQS/DQ;
4、再下来才是Write Leveling,和write DQS/DQ。
5、为了信号好,还要匹配RON和ODT电阻,
6、以及通过调整vRef来让眼图眼睛张开,并寻找安全和合适的采样点。
7、DDR5因为速度太高,还要加入DFE等均衡器来提高信号完整性:
8、这些步骤还不包括RDIMM要求的backside training和LRDIMM的 DB到颗粒的额外Training步骤,所以服务器内存初始化更加繁杂的多。

谁来进行Training?


这些步骤大部分是所有内存方案都要做的,包括焊在板子上的Solder Down方案和不同的内存控制器。关键是谁来执行这些步骤,谁来Training整个命令和数据链条。

有两种方案:In Band和OOB(Out Of Band)。大家经常在通信领域听到band概念,这里没有通信调制,还提band是怎么个意思呢?其实这种说法在silicon技术文档里面经常提到,这个所谓的band,是指CPU的计算资源,即CPU的Compute Bandwidth。

In Band,就是CPU自己亲历亲为,自己完成任务;
OOB是说不占用CPU资源,让别家完成,比较典型的是由一个MCU完成,当然完成过程中和过后还需要和CPU通过mailbox等机制互相交互。
OOB training十分常见,比大家认为的常见更加常见。现在几乎所有高速通信线路都需要Training,包括但不限于PCIe、USB、SATA等等。而完成这个Training的并不是CPU,可以是MCU和DSP等。

好了,我们回到原来的问题:为什么Intel的MRC代码量很大,而ARM和AMD则没有如此大量的Memory Training代码?

相信同学们都已经有了答案。是的,Intel采用In Band training,而ARM和AMD采用OOB Training。

最后给大家留个思考题:这两种方式各有什么优缺点,为什么Intel采用In Band,而ARM和AMD采用OOB?

OOB的training sequencer集成在PHY里面,访问DRAM更快,所以training速度也快。

但由于第三方vendor的封闭性,开放的FW接口有限,所以不够灵活,后期兼容性调整比较费力。

arm总比intel先进,intel搞cpu时还没有mcu,后来积重难返,为了复用和兼容只好一条道走到黑。MRC是一段程序,程序执行需要ram,它是初始化ram的,ram未初始化之前是不能用的,先有鸡还是先有蛋,这代码写起来一定很纠结。
oob用mcu,mcu自带不用trainning的低速ram。

oob也只是让另外的固件去做初始化。不存在修代码更方便的说法吧。无论bios去做还是其他的去做,最后都要通过更新固件来更新内存training过程。

我看未必是技术上的问题。估计Intel的MC和PHY都是自己做的,用处理器training顺理成章,他自己也不做小mcu内核,更不太可能专门为training集成个第三方的小mcu;ARM,AMD系统,更有可能会采购第三方的MC/PHY,由IP设计方集成的方案自然更可靠和高效。

 CS训练模式 (CSTM)


CS训练模式是一种促进CS_n信号采样序列的环回的方法。在这种模式下,CK在运行,而CA信号保持在NOP命令编码状态。一旦启用了这个模式并选择了DRAM设备来主动采样和驱动反馈,DRAM将在CK的上升沿时对CS_n信号进行采样。每组四个CK上升沿的采样将被包含在逻辑计算中,以确定发送回主机的CSTM输出结果,通过DQ总线发送回主机。一旦开始采样,DRAM必须保持每4个tCK的连续采样组。当CS_n Sample[0]和Sample[2]的结果为逻辑0,而CS_n Sample[1]和Sample[3]的结果为逻辑1时,DRAM将在所有的DQ信号上驱动0。没有要求驱动任何时序信号,输出信号可以每4个tCK转换一次。
 CSTM的进入和退出
当主机发送带有CS训练模式进入操作码的MPC命令时,CS训练模式被启用。由于CS训练必须在建立CK和CS_n信号对齐之前进行,MPC命令会延伸到多个tCK周期,期间CS_n信号被断言。当DRAM处于此模式下时,命令仍然会被主动处理。在启用CS训练模式时,主机内存控制器只能发送NOP命令和MPC退出CS训练模式命令。发送其他命令可能会产生不可靠的结果。一旦DRAM启用了CS训练模式,DRAM开始在每个上升的CK边沿进行采样,4个采样组连续循环。根据采样值的不同,驱动DQ信号为高电平或低电平。在进入CS训练模式之前,DRAM不驱动DQ信号,并根据默认的RTT_PARK设置终端。启用CS训练模式后,DQ信号将开始根据CS训练模式的采样驱动输出值。一旦DQ信号由DRAM驱动,RTT_PARK终端将不再应用,类似于读操作。
要退出CS训练模式,必须发送一个MPC命令来禁用CS训练模式。由于在退出CS训练模式时CS_n和CK之间的时序关系已被理解,主机可以在MPC命令期间发送多周期CS_n断言或单个tCK断言。
CSTM操作
在CS训练模式下,CS_n值在所有CK上升沿上进行采样。每组连续的4个采样按照两个一组进行评估,然后在发送到DQ输出之前,将这两组合并进行逻辑或操作。确定输出的采样评估结果如表


在CS训练模式下,CA ODT像功能性操作一样被启用。根据功能设置(通过VrefCA命令),VrefCA被分组设置。
从在第四个CK上升沿(Sample[3])期间采样CS_n信号到将采样评估的输出驱动到DQ引脚上的稳定值之间的延迟被指定为tCSTM_Valid,如图83所示。 tCSTM_entry、tCSTM_exit和tCSTM_DQ_Window的详细信息也被说明。
展示了一个示例,其中DQ输出从逻辑0切换到逻辑1值,展示了最小的tCSTM_DQ_Window:
 

当主机使用CSTM对DDR5进行CS_n时序训练时,由于每个DRAM的内部时序变化不同,每个DRAM的CS_n采样时序可能会不同。因此,即使每个DRAM的CS设置/保持时间都是适当的,可能具有不同起始点的4-tCK CS_n采样窗口可能会显示不同,如图85所示。
主机应该基于对每个CS_n边沿的断言来训练CS_n时序,以覆盖多个DRAM,而无需退出CSTM。
 输出信号
哪些信号将传输CS训练模式环回采样评估的输出。这些值是异步驱动的,但可能会随着每个4tCK而切换。

3、扫尾阶段

假定上个阶段成功的发现并设置了参数,下面就比较简单了。主要是设置Channel和Interleave,将结果报告给固件的其他部分了。这里有许多信息比较有趣,有内存的厂家、具体型号、数量多寡、内存条和内存插槽的配合情况,多CPU还有内存的亲缘性关系等等,这些信息会被放入HOB中以备以后调用。

1。如何得到源码

内存初始化代码一般由芯片厂商提供,Intel管它叫MRC(memory reference code)。因为其中涉及大量的寄存器操作,一般采取授权访问的方式提供给IBV和OEM而不是open source。所幸Intel的开源硬件平台伽利略(Galileo)开放了SOC Quark的所有源代码,包括MRC代码,它在:

tianocore/edk2

有兴趣的同学可以去学习一下。

2。CAR

“我看内存初始化之前,UEFI已经在执行c程序了。这时堆栈在哪里呢?”。好问题,在内存准备好之前。UEFI固件一般把cache初始化为内存(CAR, Cache As Ram)。不但如此,我们还可以把一部分cache拿来继续做cache用,缓存数据和代码,而且被用作内存的cache还可以执行代码!Cache可真是强大啊!

3。Fast boot/S3

“内存初始化要训练,感觉很慢,有没有办法加速呢?”。有的,如果我们没有更换内存条,我们其实没有必要每次都从头开始训练。我们可以把第一次开机训练的内存数据存储下来,以后用前面的数据就行了,这就是很多BIOS内存部分的Fast Boot。

“那我要是换了内存呢,会死机吗?“。不会的,主板有个GPIO连接到机箱开关上,我们打开机箱,BIOS会捕捉到这个信息(叫做Intrude)。利用这个信号,我们可以认为用户做了些改变配置的事,我们在从头训练就好了。有的MRC还会在SPD信息改变后自动重新训练。

“能讲讲休眠模式下内存的设置吗?”。S3,也就是Sleep to memory,是ACPI规定的一种休眠模式,具体我们以后再讲(再挖个坑有没有?)。这里我就简单说下内存的状态。一般SDRAM都要刷新,这是由它的设计决定的,它有个特殊的模式,叫做自刷新,在这个模式下,内存内容不会消失而且耗电极小。我们的S3就是把内存设置成这种状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值