内存为什么要Training? 内存初始化代码为什么是BIOS中的另类?

内存为什么要Training? 内存初始化代码为什么是BIOS中的另类?

有人说BIOS程序就是按照硬件手册和根据用户选择填寄存器,几张表就能解决的事为什么要这许多程序呢?虽然数千个选择形成的组合爆炸让穷举表成为不可能,但它也道出了BIOS大部分程序的实质:填写寄存器。有一个声音发出了不同意见,在BIOS程序里面,长期居住了一个另类,他的名字叫做MRC:内存参考代码。他的任务就是初始化内存,而他却管自己叫做Memory Training代码,主打的是调整时序和提高信号完整性。好高级的名字:Training,训练,似乎和人工智能有关?

当然不是,但和AI 模型的training之所以取名如此一样,都是为了通过实验来寻找可以解决问题的方案。Deep Learning的Training得到神经网络的权重矩阵;而Memory Training得到一组对齐、补偿和参考电压参数,来平衡和对冲线路的差异和信号的噪声。

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

内存为什么要Training?

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

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

从源头开始包括MC (内存控制器,memory Controller)、PHY(MC和PHY有些在一起,很多是分离设计来增加灵活性);从Pitch到pin,再从pin穿过主板到达slot的布线;slot过金手指通过fly-by或者直连到内存颗粒;内存颗粒中到内存Cell。这么长的链条每个点都有可能引入时钟不同步和采样延迟的问题,所以要在各个部分分别对齐,让内存DIMM的上百条连线整齐划一。

我在这篇文章中介绍了JEDEC标准的Write Leveling:

老狼:内存系列三:内存初始化浅析zhuanlan.zhihu.com图标

这其实是内存初始化对齐大步骤共十几个的末尾部分。对齐和补偿要从芯片内部开始,当芯片出口好了,再对齐DCA、DCS(因为下面的步骤需要下command);再是jedec spec里面的Read Leveling,read DQS/DQ;再下来才是Write Leveling,和write DQS/DQ。为了信号好,还要匹配RON和ODT电阻,以及通过调整vRef来让眼图眼睛张开,并寻找安全和合适的采样点。DDR5因为速度太高,还要加入DFE等均衡器来提高信号完整性:

老狼:芯片中的数学——均衡器EQ和它在高速外部总线中的应用zhuanlan.zhihu.com图标

这些步骤还不包括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?

其他内存相关文章:

老狼:内存频率是怎么算出来的?2133MHz这么奇怪的数字是怎么来的?zhuanlan.zhihu.com图标老狼:服务器最大内存是多少?制约因素有些什么呢?zhuanlan.zhihu.com图标老狼:神秘消失的内存去哪了?zhuanlan.zhihu.com图标老狼:内存系列一:快速读懂内存条标签zhuanlan.zhihu.com图标老狼:内存系列二:深入理解硬件原理zhuanlan.zhihu.com图标老狼:内存系列三:内存初始化浅析zhuanlan.zhihu.com图标老狼:为什么现在的电脑都这么吃内存?zhuanlan.zhihu.com图标老狼:内存条应该怎么插?为什么要从远端插起?不遵循为啥还可以work?有啥副作用?zhuanlan.zhihu.com图标老狼:16个内存小问题,一次全部回答!zhuanlan.zhihu.com图标老狼:内存的容错设计是怎样的?内存容量比你看到的更大!zhuanlan.zhihu.com图标老狼:Win10任务管理器中的"专用GPU内存"是怎么回事?“共享GPU内存”又是什么?zhuanlan.zhihu.com图标老狼:单根内存条的极限容量是多少?内存条上的2R X 8代表了什么意思?zhuanlan.zhihu.com图标老狼:显存为什么不能当内存使?内存、Cache和Cache一致性zhuanlan.zhihu.com图标老狼:内存不刷新会怎样?内存的物理攻击和旁路攻击zhuanlan.zhihu.com图标老狼:为什么内存和闪存制程比CPU低?它们现在都在什么节点?zhuanlan.zhihu.com图标老狼:内存是怎么映射到物理地址空间的?内存是连续分布的吗?zhuanlan.zhihu.com图标老狼:DDR3 vs DDR4? 为什么说内存是个很傻的设备?DDR5在哪里?zhuanlan.zhihu.com图标老狼:DDR5有什么新特性?是不是该等它再升级电脑呢?zhuanlan.zhihu.com图标老狼:GDDR6 vs DDR4 vs HBM2?为什么CPU还不用GDDR?异构内存的未来在哪里?zhuanlan.zhihu.com图标老狼:傲腾内存预热:什么是RDIMM和LRDIMM?zhuanlan.zhihu.com图标老狼:傲腾内存和普通内存与闪存的区别在哪里?zhuanlan.zhihu.com图标老狼:傲腾内存是如何混进现有计算机系统的?一个有趣的异构内存系统构成问题zhuanlan.zhihu.com图标

欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。

用微信扫描二维码加入UEFIBlog公众号

编辑于 2020-02-20

文章被以下专栏收录

    从首次运用于Intel 安腾处理器,到第一版统一的可扩展固件接口(UEFI)规范出版,无论是在高性能服务器,移动设备或是深度嵌入式设备等,UEFI已在所有平台完全淘汰了BIOS。这里有关于UEFI的一切。