我们将介绍:
ddr x4 x8 x16 chip width
ddr bank & rank
ddr bankgroup
ddr prefetch
ddr page size
ddr row buffer
ddr bank interleaving
ddr cell & command sequence
ddr x4 x8 x16
x4 x8 x16 指的上图黑色的chip输出的位宽,正常的ddr bus width 需要64bit,所以
chip width x4 x8 x16
黑色chip数量 16 8 4
上图是最常见的x8,也就有8个黑色的chip颗粒。x16的性能和x8的性能相比怎么样呢?
更差,因为x16的bankgroup更少。
ddr4 x8 4 bankgroup
图自 https://www.micron.com/-/media/client/global/documents/products/data-sheet/dram/ddr4/8gb_ddr4_sdram.pdf
ddr4 x16 2 bankgroup
ddr bank rank
ddr 正面就是一个rank,背面如果也有颗粒,那就又是一个rank。实物图中的8个颗粒组成了一个rank。
其中的一个颗粒的架构图如上面两个图所示,内部分成bankgroup,bankgroup内又分成bank。
我们每次发送的读写命令都是操作的各个颗粒里面同一个位置的bank。比如chip0的bank3,chip1的bank3,chip2的bank3…
ddr bankgroup
ddr的bankgroup可以理解为是将颗粒分成了group进行操作,也可以抽象成是把黑色颗粒chip内又独立成了各个单独的小颗粒,即各个bankgroup。
增加bank的数量就意味着可以增加各个bank之间pipeline操作,因此bank数量越多,吞吐率越大。
为什么有bankgroup?
解决这个问题我们先要理解prefetch。
ddr每更新一代,外面管脚pin的传输速度都翻倍。但是其实ddr内部真正memory的速度和latency是没有变化的,ddr通过预取完成这个假象。
ddr3 x8的预取的本质:
x8即每个颗粒输出8bit,ddr内部慢速的memory通过每次输出64bit,在外部快速的pin管脚上连续输出,即可以得到8倍频。
如果xw w为每个颗粒的位宽,ddr memory和外部管脚的速度相差为m,那么每个颗粒预取wxn bit。
截自 1 gig x 8的图,右侧的64即为预取的64bit。
ddr n ddr ddr2 ddr3 ddr4 ddr5
prefetch 2 4 8 8 16
8倍频的ddr3的prefetch 8,bus width 64bit,正好对应64b。
16倍频的ddr4如果继续prefetch16,那么就会对应128b,与cacheline的64byte对应不上,因此ddr4采用了上文说的bankgroup,在不同的bankgroup间切换输出,来避免连续的输出128byte。
32倍频的ddr5 prefetch16,难道就不会有输出128b的问题了吗?
确实没有这个问题。如果想要继续使用bankgroup的方法,在多个bankgroup之间切换,也很难做到。因此ddr5的64bit bus切成了两半,32bit x 16 仍然是64b。
实际上64bit额外还有ecc bit,不过我们不必理解。
ddr page size
ddr page size实际上是每次激活ddr时,输出到row buffer中的数据大小,具体的计算方式是2^column_width * chip_width / 8 byte.
如果ddr的column address 10 bit, 那么chip_width是4的 page size对应512b,chip_width是8的 page size对应1kb。
ddr row buffer
每次activation激活命令发送到ddr时,将ddr的一整行输出到row buffer中,如上图所示。row buffer中的一小部分当前请求的被预取的数据被输出到外部。 如果我们下一次需要读取另一行,那么就需要先写回这一行,然后precharge bit line,再去打开新的一行,这样代价还是挺大的。
所以比较理想的情况是继续读取当前这一行的下一个部分数据,这样不需要写回,可以持续的从row buffer中读取。
图自https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=6853217
上图中,row size即page size为2kb,本次预取chip3中的128b,如果下一次能继续读取后面的128b,那么只需要发送一个command命令就可以了。
我们借着这张图回顾一下上面介绍过的内容:
每个chip位宽16bit,需要4个chip组成64bit
外部时钟800mhz,因为ddr double rate传输,所以实际上是1600mhz,内部时钟200mhz,时钟相差8倍。所以我们每次需要预取16x8=128bit.
注意看上图中的每个chip都有一个红色的横条,也就是每次读取的时候都是不同chip的同一个位置的bank被读取。
那么为什么chip3中的不同的bank的红色横条的位置不一样?
ddr bank interleaving
ddr 同一个bank内不同的row之间切换需要上文说的 restore写回和precharge。
但是不同bank之间,共享命令地址数据总线,但是内部的memory是独立的,所以我们可以访问bank0的第1行之后,访问bank1的第7行,再访问bank3的第2行,bank之间的pipeline输出,最大程度的利用数据总线。
如下图所示,
ddr cell & command sequence
上文说的ddr需要写回,是因为ddr是电容组成,存在泄露,除了写回,也需要定期刷新。上图中的cs存储真正的memory。为了简单,我们将电压理解成0/1 v.
图自https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7446096
上一次操作结束后,会对dram precharge,将cbl charge到0.5v的电位。
我们如果发起读命令,activation操作,会激活一行,即拉高wl线,这时cs的电位0/1 v和cbl0.5v的电压会发生charge sharing
sensing阶段会将电压差经过sense amplifier 存储这一行的数据到row buffer中
read 命令会从row buffer中,预取对应长度的数据,输出到外侧
在sense amplifier 完成工作后,会将vdd的电压充至1v,即为restore,此时被破坏了的数据得到了恢复
断开wordline,充电bitline至0.5v,即为precharge操作。
简单的说
activate 激活对应行 word line,数据输出到row buffer
read 列命令对应从row buffer中读取数据
precharge命令恢复bitline至一半电压
315遥控接收发射电路图
MS2630—Sub-1 GHz、低噪声放大器芯片
VS10X无线混合信号采集仪
贸泽即日起备货优化物联网边缘应用能效的Silicon Labs EFM32PG22 MCU
怎样使用RFID RC-522和Arduino创建一个简单的超市应用程序
DDR的基础知识
变频器输出电压有1000多伏是怎么回事?
【数据库数据恢复】oracle数据库误truncate table的数据恢复案例
裸机下运行Hello,World【常见错误解决方案】
华为问界M9内饰曝光
如何正确的理解工业互联网
人工智能蓬勃发展还缺了点什么
谷歌回国,AI人才争夺正式开启
现代逆变器系统的结构功能及其对功率因数校正
索尼PS5开发机照片曝光 深V造型亮眼
猜测Redmi Note 8 Pro的6G+128G售价,竟只比上一代涨了200元?
微软语音助手微软小娜:人工智能大热 小娜不再只是语音助手
使用仿真皮电子皮肤的机器人:可自由移动,人对机器人的操控将会更便捷
GTC23 | 3 月 22 日预告 — 在线观看派对:重塑软件定义汽车的电子架构
高校资产管理:全周期、全流程、动态数字化管理