在学习了比较简单的DDR3的大部分知识后,我们来增量的学习DDR4/DDR5,然后再去研究一下DDR控制器。
一、DDR4和DDR3的区别
按照之前文章的总结,DDR4和DDR3区别如下:
(具体区别可以参考"深入理解DDR:DDR的演进"这篇文章)
除了速率,电压,容量,引脚这些功能上的升级和改进,DDR4引入的新技术主要如下:
- 信号完整的:RASR技术;
- 预取机制的:Bank Group技术
- 可靠性的:CRC校验和奇偶校验
- 功耗管理的:DDR4 SDRAM引入了多种低功耗模式,包括Deep Power Down Mode,低功耗非常重要,内容也比较多,这里就不展开了。
二、RASR技术
在自刷新模式下,DRAM需要定期刷新其存储单元以防止数据丢失。传统的自刷新模式下,刷新周期是固定的,这会导致不必要的功耗,尤其是在低功耗应用场景中。为了优化功耗,DDR4引入了Reduced Auto Self-Refresh (RASR) 技术。
RASR技术通过减少刷新周期的数量来降低功耗,同时确保数据的完整性。其核心原理在于动态调整刷新周期的数量,以适应不同的工作状态和温度条件。
- 减少刷新周期:在RASR模式下,DDR4 SDRAM会根据当前的工作状态和温度动态减少刷新周期的数量。这意味着在某些情况下,DRAM可以使用更长的刷新间隔,从而减少刷新操作的频率。
- 优化算法:DDR4 SDRAM内部使用优化算法来决定何时减少刷新周期的数量。这些算法考虑了当前的温度、工作负载和其他相关因素,以确保在减少刷新周期的同时,数据的完整性不受影响。
- 温度监测:DDR4 SDRAM内部集成了温度传感器,可以实时监测当前的温度。温度信息用于调整刷新周期的数量,确保在高温条件下仍然能够保持数据的完整性。
三、DDR4的Bank Group
1. 什么是Bank Group
DDR(Double Data Rate)内存技术中的预取(Prefetch)机制是提高数据传输效率和减少内存访问延迟的关键技术之一。预取机制通过在一次内存访问中读取多个数据位,并将这些数据暂存到缓冲区中,以便后续的快速访问。 预取位数随着DDR技术的演进而不断增加,从DDR1的2位预取到DDR5的16位预取。以下是各个DDR版本的预取位数:
DDR1:2位预取(2n Prefetch)
DDR2:4位预取(4n Prefetch)
DDR3:8位预取(8n Prefetch)
DDR4:8位预取(8n Prefetch)
DDR5:16位预取(16n Prefetch)
按照发展趋势,其实DDR4的预取应该为16位预取,但是DDR4并没有增加到16位预取。DDR4不使用16倍预取的原因主要有以下几点:
- 与CPU Cache Line大小不匹配:16倍预取会导致数据浪费,降低带宽利用率。现代CPU的Cache Line大小通常是64字节(64B)。如果DDR4使用16倍预取,对于64位(8字节)的DDR,一次会取出128字节的数据。而CPU的Cache Line大小是64字节,这意味着多取出来的64字节数据可能会被浪费,因为这些数据可能不会立即被使用。
- 增加DRAM内部面积资源:16倍预取需要更大的内部缓冲区,增加芯片面积和制造成本。
- 平衡性能和功耗:8倍预取在满足高带宽需求的同时,避免了不必要的数据传输,降低了功耗。
所以,这是当时情况下的最优解。同时为了提高速度,DDR4引入了Bank Group这个技术。
Bank Group的设计使得在同一时间可以并行处理多个读写操作,从而提高了内存系统的整体性能。如下图所示:
DDR4将多个Bank分组形成一个Bank Group,每个Bank Group可以包含多个Bank。通过Bank Group,DDR4内存可以在不同的Bank Group之间同时执行命令,而不会相互干扰。这意味着,当一个Bank Group正在进行数据传输时,另一个Bank Group可以同时进行其他操作,从而提高了内存的整体性能。
通过多个BG再进行MUX,这样多级MUX结构,2个BG就能够实现等效16N预取的效果。
在DDR4中,Bank Group的引入使得设计者能够在不增加预取长度的情况下,提升内存的带宽和效率。通过将Bank分组,设计者可以更灵活地管理内存的访问,避免了因增加预取长度而带来的复杂性和潜在的性能瓶颈。
2. Bank Group对性能的影响
DDR4增加Bank Group后,引入了tCCD_S和tCCD_L(CCD:Column to Column Delay)两个时序参数。
tCCD_S(Short Column to Column Delay)
- 定义:tCCD_S表示不同Bank Group之间的列访问等待时间。
- 值:通常是4个时钟周期(Cycle),与一个数据Burst长度相同。
- 作用:允许不同Bank Group之间的快速切换,提高并发操作能力。
tCCD_L(Long Column to Column Delay)
- 定义:tCCD_L表示同一个Bank Group内部的列访问等待时间。
- 值:通常比4个时钟周期长,即会超过一个数据Burst长度。
- 作用:确保在同一Bank Group内部进行连续列访问时,有足够的等待时间来避免冲突和数据错误。
tCCD_S 的影响
- 快速切换:由于tCCD_S只有4个时钟周期,不同Bank Group之间的切换非常快,可以迅速开始新的读写操作。
- 并行处理:多个Bank Group可以同时进行操作,显著提高内存系统的带宽和并发操作能力。快速的列访问切换使得内存控制器可以更高效地管理多个读写请求。
tCCD_L 的影响
- 避免冲突:tCCD_L较长,确保在同一Bank Group内部进行连续列访问时,有足够的等待时间来避免冲突和数据错误。
- 数据完整性:较长的等待时间有助于确保数据的完整性和一致性。
- 增加延迟:tCCD_L较长,会增加在同一Bank Group内部进行连续列访问时的延迟。
- 限制并发:在同一Bank Group内部,连续列访问的等待时间较长,可能会限制并发操作的能力,尤其是在高带宽需求的应用中。
3. 减小Bank Group对性能的影响方法
通过合理的地址映射策略,可以有效地减少tCCD_L(Long Column to Column Delay)对DDR4性能的影响。tCCD_L是在同一个Bank Group内部进行连续列访问时的等待时间,通常比tCCD_S(Short Column to Column Delay)长,因此优化地址映射策略可以减少这种等待时间,提高内存系统的性能。下面详细解释几种有效的地址映射策略:
1). 分散内存访问
交错地址映射
- 原理:通过交错地址映射,将连续的内存地址分散到不同的Bank Group中,减少在同一Bank Group内的连续访问。
- 实现:将地址的高位部分用于选择Bank Group,低位部分用于选择Bank和列地址。例如,对于一个64位地址,可以将高几位用于选择Bank Group,中间几位用于选择Bank,低几位用于选择列地址。
假设我们有一个DDR4 x4/x8配置的内存模块,共有4个Bank Group,每个Bank Group有4个Bank,总共16个Bank。
地址格式:
- Bank Group选择:使用地址的高2位(A[17:16])选择Bank Group。
- Bank选择:使用地址的中间2位(A[15:14])选择Bank。
- 行地址选择:使用地址的中间8位(A[13:6])选择行地址。
- 列地址选择:使用地址的低6位(A[5:0])选择列地址。
地址映射:
- 地址
0x00000000
映射到 Bank Group 0, Bank 0, 行 0, 列 0。 - 地址
0x00000001
映射到 Bank Group 0, Bank 0, 行 0, 列 1。 - 地址
0x00000002
映射到 Bank Group 0, Bank 0, 行 0, 列 2。 - ...
- 地址
0x00000040
映射到 Bank Group 1, Bank 0, 行 0, 列 0。 - 地址
0x00000041
映射到 Bank Group 1, Bank 0, 行 0, 列 1。 - ...
通过这种方式,连续的内存访问会被分散到不同的Bank Group中,减少在同一Bank Group内的连续访问,从而减少tCCD_L的影响。
2). 优化数据布局
数据分块
- 原理:将数据分成多个小块,每个小块分布在不同的Bank Group中。
- 实现:将一个大的数据结构(如数组、矩阵)分成多个小块,每个小块分配到不同的Bank Group中。
假设有一个1024x1024的矩阵,可以将其分成4个256x256的小块,每个小块分配到一个不同的Bank Group中。
矩阵分块:
- 小块1(0-255, 0-255)分配到Bank Group 0。
- 小块2(0-255, 256-511)分配到Bank Group 1。
- 小块3(0-255, 512-767)分配到Bank Group 2。
- 小块4(0-255, 768-1023)分配到Bank Group 3。
通过这种方式,访问矩阵的不同部分时,可以利用多个Bank Group的并行操作能力,提高性能。
3). 减少跨Bank Group的跳转
局部性优化
- 原理:尽量访问相邻的内存地址,减少跨Bank Group的跳转。
- 实现:通过优化数据访问模式,确保连续的访问尽可能在同一个Bank Group内完成。
假设有一个数组,可以通过循环访问数组的元素。为了减少跨Bank Group的跳转,可以优化循环的步长,确保每次访问的元素尽可能在同一个Bank Group内。
通过这种方式,可以减少跨Bank Group的跳转。虽然tCCD_S较短,但频繁的跨Bank Group跳转仍然会增加额外的等待时间,影响内存访问的效率。
四、CRC校验和奇偶校验
DDR4内存技术中,CRC(循环冗余校验)和奇偶校验是两种重要的错误检测机制,用于确保数据传输的完整性和准确性。这两种也是非常常见的错误检测技术,在很多领域都会使用。
1. CRC校验
CRC校验是一种广泛使用的错误检测技术,它通过计算数据包的CRC值来检测在传输过程中数据是否被篡改或损坏。在DDR4中,CRC校验可以通过模式寄存器开启,并在写操作时进行校验操作。当CRC校验开启时,数据结构格式为固定10个UI,同时对BL8与BC4有效。如果在写操作时启用了CRC,DRAM会在数据突发末尾添加CRC。
2. 奇偶校验
奇偶校验是一种简单的错误检测机制,它通过在数据中添加一个额外的位(奇校验或偶校验位)来确保数据中1的总数是奇数或偶数。在DDR4中,奇偶校验可以通过模式寄存器启用。启用后,DRAM会使用ACT_n,RAS_n/A16,CAS_n/A15,WE_n/A14,BG0-BG1,BA0-BA1,A17-A0计算奇偶校验。输入奇偶校验应保持在时钟的上升沿,并同时与CS_n LOW的命令和地址保持一致。如果命令地址奇偶校验中存在错误,则Alert_n会在相当长的一段时间内变为低电平。
当然,DDR4还支持数据的ECC,ECC(Error Correction Code)。它通过在数据中添加冗余信息(ECC码),可以检测并纠正一定数量的错误比特。但是这个是需要额外的存储空间才能实现的,一般在车载,服务器领域才会使用。
PS:推荐一下做SoC架构,或者理解学习SoC架构必备的书籍,基本需要反复学习和阅读,总能有很多收获,如果一个架构师没有读过这本书,大体是不太合格的。
后纪
技术很重要,技术背后的思想更重要!
技术背后的某些思想就是你解决以后问题的钥匙。我的文章可能一篇中知识点不太多,但是力求让你能深入理解,为你进阶打下基础。如果有一点点收获,也算是我对中国芯片行业的一点点贡献吧。
赠人玫瑰,手有余香。如果你有所收获,麻烦花一秒时间帮我点个赞和在看吧,谢谢!
知乎专栏:芯片设计进阶之路
微信公众号:芯片设计进阶之路 x_chip
——————————————————————————————
参考文献
JESD79-3D
https://blog.csdn.net/m0_5355...
END
作者:烓围玮未
文章来源:芯片设计进阶之路
推荐阅读
更多 IC 设计干货请关注IC 设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。