zl程序教程

您现在的位置是:首页 >  其他

当前栏目

软硬件融合技术内幕 终极篇 (8) —— 美味的豆汁

技术 融合 终极 内幕 软硬件 美味
2023-06-13 09:17:15 时间

上期我们介绍了针对SRAM降成本的方案——DRAM。DRAM的每bit只需要1个晶体管实现,大大降低了芯片面积,功耗和成本。

DRAM接口也与SRAM有所不同。

如图,DRAM的总体结构当然是Cell构成的存储矩阵。而存储矩阵的行线和列线则控制了每个Cell单元的读写。

那么问题来了:

我们知道,现代主流的CPU的位宽为64bit,也就是CPU的数据总线为64bit。而Intel Xeon Scalable 三代处理器整机可以支持4TB内存,也就是物理地址总线至少为42bit,最高可达64bit。那么,我们如何实现让地址线最终控制每一条行线和列线,从而能够读写到具体的cell呢?

我们在前面提到过,Intel处理器在保护模式下,指令中的地址是逻辑地址(Virtual Address),它将被MMU翻译为物理地址(Physical Address),也就是CPU向DRAM控制器发送的地址。DRAM控制器拿到物理地址后,会将物理地址进行拆分,将物理地址拆分为Row (行),Column(列)后,分别发送给内存芯片,其时序如下图所示:

如图,DRAM控制器拉低RAS的电平,同时发送行地址(Row Address),然后拉低CAS的电平,发送列地址。两个地址发送完毕后,CAS和RAS恢复高电平,从DQ也就是数据线读出数据。

在内存芯片中,会在RAS下降沿和CAS下降沿分别锁存行地址和列地址,并且通过译码,确定Cell矩阵的哪条线应该拉为低电平。

我们发现,在这种情况下,每次读写都需要向DRAM发送两次地址,才能读到数据。而计算机读取内存中的数据,往往是有连续性的,这叫做空间局部性。

什么是空间局部性呢?

让我们打一个比方。

方老师认识一位Z同学,喜欢喝豆汁,经常提着一壶豆汁在办公室招摇过市,每次路过豆汁店都要买上一大碗享用一番。

然而,Z同学在一次洗涤心灵的旅游中,认识了一位美丽的女孩,擦出了心灵的火花,两个人心心相印,如胶似漆。但是,这个女孩不喜欢豆汁的味道,而Z同学却难以舍弃豆汁的美味,两个人产生了难以调和的矛盾。

有一天,Z同学发现,自己常去的豆汁店隔壁的便利店有卖漱口水和香水,于是每次Z同学享用完豆汁后,都要去隔壁便利店购买漱口水和香水。从此,两个人重归于好,达成了生命的大河蟹。

正如Z同学每次访问过豆汁店后,都要访问隔壁的便利店一样,计算机系统中,访问某内存地址后,紧接着访问其临近地址的可能性是很大的。这就是空间局部性。

在对DRAM的访问中,如果应用空间局部性,并不是每次都要发送Row Address,而是对访问的地址做一个判断,如果Row Address没有变化,则只发送Column Address,就可以大大提升DRAM的访问效率!

工程师们立即着手进行了改进,这就是FPM DRAM,它的读写时序如下图:

图中,在第一次访问时,DRAM控制器向DRAM发送了Row Address和Column Address,但随后的访问中,由于Row Address并没有更新,因此只更新Column Address,DRAM就返回了数据。

进一步地,工程师们发现,在DRAM返回数据或接受写入数据时,DRAM的地址总线是空闲的。能否利用这段时间传输下一次读写的地址呢?这就是EDO DRAM的改进。

EDO是Extended Data Out的缩写。EDO内存可以在上一次读写尚未完成的时候,就接收DRAM为下一次读写更新的Column Address,从而让读写时序更加紧凑,进一步提升性能。

实际上,有开发经验的同学会发现,对内存块的读写,地址连续的场景是比较多的。如网卡将收到的数据包通过DMA的方式写入内存缓冲区的场景,有可能连续读写上千字节的内容。这叫做猝发访问(Burst Access)。

EDO内存也增加了对Burst Address的支持,如图:

图中,由于CPU读写的内存地址是连续的,DRAM控制器发送了Row Address和Column Address后,可以连续读取一串数据,而无需更新地址。

EDO内存的出现大大提升了DRAM内存读写的效率,但由于其工作频率较低,工程师们又想出了一项新的改进——让DRAM的时钟复用前端总线FSB的时钟。这就是所谓同步DRAM(Synchronous DRAM,SDRAM)。

SDRAM的读写时序如上图。注意到SDRAM可以在发送Row Addr和Col Addr的同时,发送读写命令信号,并支持EDO内存的猝发读写等特性。SDRAM的时钟频率与CPU的FSB(前端总线)频率一致,理论上其猝发读写能力可以与CPU指令执行时间仅差一个倍频系数。

如,Pentium-II 350处理器的前端总线频率为100MHz,其SDRAM的工作频率也就是100MHz。在最好的情况下,每个10ns的时钟周期可以猝发读写64bit的数据,相当于3.5个CPU的指令周期。

那么,有没有更好的方案,让内存工作频率进一步提高,甚至能跟上CPU的工作速率呢?

这在内存行业引发了一起不小的纷争。

请看下期。