智能座舱之存储篇第五篇---武林高手DDR 下篇

作者 / 阿宝
编辑 / 阿宝
出品 / 阿宝1990(微信ID woabao1990)
上期内容从DDR的大局观来分析看DDR的价格趋势是上涨的,同时也说了车载DDR的目前容量还是偏小,主要还是使用DDR3和LPDDR3为主,后续3-5年会逐渐切换到DDR4,而且分析了域控制对于DDR带宽的要求,智能驾驶对于DDR带宽的要求,这期咱们的内容有点硬核,主要说说DDR的工作原理和设计注意的事项,都是机哥工作10年的干货,DDR太高深莫测,我就点到为止。

DDR工作原理图简述
既然车载电子领域主要还是DDR3为主,我们这里重点说说DDR3的相关内容,也是从一个博主那里看到的一些关键信息做的融合。
首先,我们先了解一下内存的大体结构工作流程,这样会比较容量理解这些参数在其中所起到的作用。这部分的讲述运用DDR3的简化时序图。
DDR3的内部是一个存储阵列,将数据“填”进去,你可以它想象成一张表格。和表格的检索原理一样,先指定一个行(Row),再指定一个列(Column),我们就可以准确地找到所需要的单元格,这就是内存芯片寻址的基本原理。对于内存,这个单元格可称为存储单元,那么这个表格(存储阵列)就是逻辑 Bank(Logical Bank,下面简称Bank)。

DDR3内部Bank示意图,这是一个NXN的阵列,B代表Bank地址编号,C代表列地址编号,R代表行地址编号。
如果寻址命令是B1、R2、C6,就能确定地址是图中红格的位置
目前DDR3内存芯片基本上都是8个Bank设计,也就是说一共有8个这样的“表格”。寻址的流程也就是先指定Bank地址,再指定行地址,然后指列地址最终的确寻址单元。
目前DDR3系统而言,还存在物理Bank的概念,这是对内存子系统的一个相关术语,并不针对内存芯片。内存为了保证CPU正常工作,必须一次传输完CPU 在一个传输周期内所需要的数据。而CPU在一个传输周期能接受的数据容量就是CPU数据总线的位宽,单位是bit(位)。控制内存与CPU之间数据交换的北桥芯片也因此将内存总线的数据位宽等同于CPU数据总线的位宽,这个位宽就称为物理Bank(Physical Bank,有的资料称之为Rank)的位宽。目前这个位宽基本为64bit。
在实际工作中,Bank地址与相应的行地址是同时发出的,此时这个命令称之为“行激活”(Row Active)。在此之后,将发送列地址寻址命令与具体的操作命令(是读还是写),这两个命令也是同时发出的,所以一般都会以“读/写命令”来表示列寻址。
根据相关的标准,从行有效到读/写命令发出之间的间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟,RAS就是行地址选通脉冲,CAS就是列地址选通脉冲),我们可以理解为行选通周期。tRCD是DDR的一个重要时序参数,广义的tRCD以时钟周期(tCK,Clock Time)数为单位,比如tRCD=3,就代表延迟周期为两个时钟周期,具体到确切的时间,则要根据时钟频率而定,DDR3-800,tRCD=3,代表30ns的延迟。

接下来,相关的列地址被选中之后,将会触发数据传输,但从存储单元中输出到真正出现在内存芯片的 I/O 接口之间还需要一定的时间(数据触发本身就有延迟,而且还需要进行信号放大),这段时间就是非常著名的CL(CAS Latency,列地址脉冲选通潜伏期)。CL 的数值与tRCD 一样,以时钟周期数表示。如DDR3-800,时钟频率为100MHz,时钟周期为 10ns,如果 CL=2 就意味着20ns 的潜伏期。不过CL只是针对读取操作。

由于芯片体积的原因,存储单元中的电容容量很小,所以信号要经过放大来保证其有效的识别性,这个放大/驱动工作由S-AMP负责,一个存储体对应一个S- AMP通道。但它要有一个准备时间才能保证信号的发送强度(事前还要进行电压比较以进行逻辑电平的判断),因此从数据I/O总线上有数据输出之前的一个时钟上升沿开始,数据即已传向S-AMP,也就是说此时数据已经被触发,经过一定的驱动时间最终传向数据I/O总线进行输出,这段时间我们称之为 tAC(Access Time from CLK,时钟触发后的访问时间)

目前内存的读写基本都是连续的,因为与CPU交换的数据量以一个Cache Line(即CPU内Cache的存储单位)的容量为准,一般为64字节。而现有的Rank位宽为8字节(64bit),那么就要一次连续传输8次,这就涉及到我们也经常能遇到的突发传输的概念。突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输的周期数就是突发长度(Burst Lengths,简称BL)。
在进行突发传输时,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作而不再需要控制器连续地提供列地址。这样,除了第一笔数据的传输需要若干个周期(主要是之前的延迟,一般的是tRCD+CL)外,其后每个数据只需一个周期的即可获得。

突发连续读取模式:只要指定起始列地址与突发长度,后续的寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与BL相同)即可做到连续的突发传输。

可以看到DDR3BL是4, DDR4 BL是8,DDR5 BL是16,BL是越来越大,这样读取的数据就会更多,速度更快。
谈到了突发长度时。如果BL=4,那么也就是说一次就传送4×64bit的数据。但是,如果其中的第二笔数据是不需要的,怎么办?还都传输吗?为了屏蔽不需要的数据,人们采用了数据掩码(Data I/O Mask,简称DQM)技术。通过DQM,内存可以控制I/O端口取消哪些输出或输入的数据。
这里需要强调的是,在读取时,被屏蔽的数据仍然会从存储体传出,只是在“掩码逻辑单元”处被屏蔽。DQM由北桥控制,为了精确屏蔽一个P-Bank位宽中的每个字节,每个DIMM有8个DQM 信号线,每个信号针对一个字节。这样,对于4bit位宽芯片,两个芯片共用一个DQM信号线,对于8bit位宽芯片,一个芯片占用一个DQM信号,而对于 16bit位宽芯片,则需要两个DQM引脚。

全志T7 4PCS DDR的设计,可以看到CPU的DDR位宽是32位,所以需要4位DQM的引脚去控制。
在数据读取完之后,为了腾出读出放大器以供同一Bank内其他行的寻址并传输数据,内存芯片将进行预充电的操作来关闭当前工作行。还是以上面那个Bank示意图为例。当前寻址的存储单元是B1、R2、C6。如果接下来的寻址命令是B1、R2、C4,则不用预充电,因为读出放大器正在为这一行服务。但如果地址命令是B1、R4、C4,由于是同一Bank的不同行,那么就必须要先把R2关闭,才能对R4寻址。从开始关闭现有的工作行,到可以打开新的工作行之间的间隔就是tRP(Row Precharge command Period,行预充电有效周期),单位也是时钟周期数。

在不同Bank间读写也是这样,先把原来数据写回,再激活新的Bank/Row。
数据选取脉冲(DQS)
DQS 是DDR中的重要功能,它的功能主要用来在一个时钟周期内准确的区分出每个传输周期,并便于接收方准确接收数据。每一颗芯片都有一个DQS信号线,它是双向的,在写入时它用来传送由北桥发来的DQS信号,读取时,则由芯片生成DQS向北桥发送。完全可以说,它就是数据的同步信号。
在读取时,DQS与数据信号同时生成(也是在CK与CK#的交叉点)。而DDR内存中的CL也就是从CAS发出到DQS生成的间隔,DQS生成时,芯片内部的预取已经完毕了,由于预取的原因,实际的数据传出可能会提前于DQS发生(数据提前于DQS传出)。由于是并行传输,DDR内存对tAC也有一定的要求,对于DDR266,tAC的允许范围是±0.75ns,对于DDR333,则是±0.7ns,有关它们的时序图示见前文,其中CL里包含了一段DQS 的导入期。
DQS 在读取时与数据同步传输,那么接收时也是以DQS的上下沿为准吗?不,如果以DQS的上下沿区分数据周期的危险很大。由于芯片有预取的操作,所以输出时的同步很难控制,只能限制在一定的时间范围内,数据在各I/O端口的出现时间可能有快有慢,会与DQS有一定的间隔,这也就是为什么要有一个tAC规定的原因。而在接收方,一切必须保证同步接收,不能有tAC之类的偏差。这样在写入时,芯片不再自己生成DQS,而以发送方传来的DQS为基准,并相应延后一定的时间,在DQS的中部为数据周期的选取分割点(在读取时分割点就是上下沿),从这里分隔开两个传输周期。这样做的好处是,由于各数据信号都会有一个逻辑电平保持周期,即使发送时不同步,在DQS上下沿时都处于保持周期中,此时数据接收触发的准确性无疑是最高的。

在写入时,以DQS的高/低电平期中部为数据周期分割点,而不是上/下沿,但数据的接收触发仍为DQS的上/下沿

DDR设计注意事项
1、选用成熟稳定的DDR方案
由于DDR涉及到信号完整性,EMC辐射、信号稳定性,所以首先使用的时候就最好使用CPU适配过,大批量出货,并有成熟的layout设计的方案。


上图就是RK某一款CPU 匹配过的DDR的芯片厂家和型号,可以看到打√的芯片是大批量使用验证出货的,T/A的是验证过完整测试,但是没有批量出货,N/A这部分是没有适配过的,此时这种芯片就最好不要选用,否则螃蟹没有迟到,反惹到一身骚。
2、在设计初期使用DQ窗口去验证DDR的稳定性
通过软件的DQ窗口去查看,主要是去验证整个CPU、DDR、以及PCB板几个因素一起对于信号的传输的延时的一致性,想想一起传输数据,每个通道的延迟不同,如果很大对于数据的接收就有影响了,为什么DDR这么强调等长,等距。
下面以海思CPU为例,怎么查看DQ窗口的稳定性。
步骤 1. 准备一块可以正常启动的单板,将单板的串口同PC相连,让单板与PC机可以通过串口正常通信。
步骤 2. 让单板停留在uboot下,通过mw命令配置寄存器,打开ddr training的开关。具体配置需要根据单板实际使用的DDR规格确定,关于ddr training寄存器的开关配置如下:

步骤 3. 继续输入ddr dataeye命令查看DDR DQ的窗口。
\结束。





依据 Demo的测试情况,海思给出了一个建议的窗口级数标准供用户参考 。具体标准如下图所示 ,如果不满足窗口级数标准, DDR可能存在不稳的因素。

3、软件驱动中对于DDR底层参数的配置要准确

上图是一个安霸平台对于DDR底层参数的配置表,这里面这些参数都需要参考DDR的规格书进行一项一项的配置,而且需要驱动工程师对于每一个参数的意义进行理解,对于信号有什么影响,配置的参数错误会带来什么样的失效模式。

为什么说更换DDR的时候tRC、tRCD这么重要,其实上面也有解释了。
根据相关的标准,从行有效到读/写命令发出之间的间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟,RAS就是行地址选通脉冲,CAS就是列地址选通脉冲),我们可以理解为行选通周期。tRCD是DDR的一个重要时序参数,广义的tRCD以时钟周期(tCK,Clock Time)数为单位,比如tRCD=3,就代表延迟周期为两个时钟周期,具体到确切的时间,则要根据时钟频率而定,DDR3-800,tRCD=3,代表30ns的延迟。

很多时候DDR兼容性不稳定,软件很大情况就是调节ODT参数,DQ输出驱动能力大小,tRCD参数等等。
4、DDR的稳定性依赖数量足够大的可靠性验证。
正常情况下,信号都应该用白盒测试去保障它的可靠性,但是DDR这个比较特殊,不像普通的FLASH、I2C等信号,通讯速率比较低,DDR的通讯速率越来越高,哪怕是普通的DDR3基本上都是跑的1866MHZ。这个就给测试带来了巨大的困扰。
鉴于DDR的stub(短线)拓扑结构和紧张的时序容限,在验证和测试中要求检验多种指标,包括:电气电源和信号电源质量,噪声、毛刺和地弹/地跳;时钟信号质量,上升时间和下降时间/slew rate ;命令、地址和数据有效窗口(建立/保持时间);DQS/DQ/时钟偏斜。
至于DDR测试的难点,第一,DDR数据信号DQ和DQS是双向的,所以读信号和写信号会同时出现在数据线上,比较难分离哪些数据是读数据哪些数据是写数据;
第二,就是探测问题,DDR3使用的是BGA封装,测试管脚隐藏在芯片的底下,因此探头的选择非常重要。另外由于DDR2和DDR3速率非常高,所以对于带宽和探测信号保真度要求就格外的高,而且很多时候我们光靠示波器已经满足不了测试的要求了,需要联合比如逻辑分析仪等进行协议和时序的联合测试。目前测试DDR3的示波器带宽都是70G的带宽,仪器费用非常昂贵。

上图可以看到由于是DDR3是BGA封装,所以需要增加一个socket转接小板在DDR3上,让DDR的BGA的信号转接到小板的测试点上,这样做有一个弊端,高速信号上增加一个转接板,本身对于信号就有衰减,如果socket转接板做的不等长或者有很大衰减,反而测试结果是不准确的。
所以基于目前的情况,基本上都是测试出来的数据做参考,除非有很严重的回沟或者延迟,目前DDR的可靠性,需要使用数量足够多的机器,去做高低温,去跑满负荷的安卓大程序应用,让DDR处于满负荷的状态,同时处于极限的温度状态去验证可靠性。

DDR layout保障地平面的完整性
以下案例是机哥4年项目遇到的问题,比较有典型意义,拿出来说一下。
DDR部分的走线参考了厂家给的demo,由于很多厂家使用的电阻电容的物料封装大小和我们公司的不一样,而且画图软件工具也不一样,转换为mentor后基本上线都是断的,需要一段一段的去接上,电源和地基本上都掉了,需要layout工程师自己去画,这个时候需要特别注意,一定需要保证DDR部分地的完整性,因为DDR那里的频率跑的越高的时候,地的完整性越重要,对于静电和雷击也有好处,如果DDR部分地不完整,很容易造成静电死机情况的发生,特别是第一个新平台的时候,DDR部分的layout需要工程师仔细去检查。
下面就以MSD7S75新平台来说说最初的layout和修改后的layout。

MSD7S75刚开始layout的DDR部分的地
该DDRlayout就是从厂家参考的走线画的,但是电源和地的走线都是公司layout工程师layout的,红色的走线是电源。从上图中可以看到有四处的地基本上都没有连接起来,DDR左右两边的地没有连贯,上下的地也没有连贯,从DDRlayout规则来看,至少要保证一边的地是连贯的,比如上下或者左右,从上图中来看保证上下的地的连贯性是比较好的。此时需要看看厂家给到的DDRlayout地是怎么铺设的。

厂家参考的DDR部分的地
从厂家参考的来看,基本上有5路保证了上下的地是通畅的,它是通过上下的5路电源全部通过正面顶端的电源拉下来的,这样就能保证上下的地是通的。


修改后的MSD7S75的DDR部分的地
此时可以看到修改后的明显地完善多了,但是仍然有一处那里的地没有上下连贯,打×的位置明显可以不用连接,因为电源都是从顶端连接的,不需要这两根线电源连接在一起,所以在DDR部分的电源和地的铺设一定要咨询参考厂家给的DEMO,因为他们都是做了SI信号完整性测试以及仿真的,仿真涉及到板材材质,铜厚,走线到地的距离,走线宽度等等,幸好现在DDR3基本上不用像DDR2那样做严格的阻抗匹配,最好设计按照仿真的来做,出问题的概率会小很多。

DDR仿真事半功倍
在前期设计参考CPU厂家的DDR这部分的设计,基本上使用不到仿真,但是如果遇到本身CPU厂家能力就不咋样,而且DDR又很多片的时候,此时就需要考虑仿真验证拓扑结构是否适合自己项目的设计。(以下仿真图片是公司大牛张鑫哥的DDR软件仿真的图片)
我们就以DDR的简单的拓扑结构来看

可以从上图可以看到,就是通过DDR本身的布局来命名的,如果是左边的T型拓扑,就是DDR对的布局相对于CPU而言是对称的,而Fly-BY你可以理解为串联设计,就是DDR一个串一个,类似葡萄。
T型拓扑优缺点:

可以看到T型拓扑的设计非常对称,对称有什么好处呢,其实这个就是好处多了,你想想我们要控制不同的走线地址,比如发送了DRAM 1,半天没有发送给DRAM 2,此时是不是对于命令识别有很大的延迟,这样的好处就是每个DDR的命令、数据线的距离都是相同的,这样主控到每颗DDR的长度基本一致,也就是说每个颗粒的信号质量都差不多,如果PCB布局空间够大的情况下,画图起来比较简单,非常利于CPU的时序的控制。

我们来看看2PCS 的T型的仿真图,从上图可以看到,当走线比较远的时候,此时在中心节点处容易发生信号发射,导致眼图变的很差,此时需要中心节点处串联端接一个电阻,此时信号如右边眼图所示,会好很多。

我们再来看看如果T型拓扑中的分支走线如果不等长会有什么结果,从上图仿真来看,如果偏差4mm还可以接受,到偏移到6mm此时跑1333Mbps速率的眼图已经杂乱无章了,此时是不可以接受的,所以T型的分支要求非常高,一定要对称等长。
优点总结:
T型拓扑适合在2PCS的DDR设计中,此时布局空间够,而且在走线可控的情况下可以不使用VTT和RTT电阻端接;只有走线很长且阻抗难以控制时,可以使用端接来实现更好的信号完整性,可以很好的实现DDR的时序控制,一致性比较好。
缺点总结:
信号在被发送到各个内存模块前会先到达一个中心节点,在节点处阻抗发生变化引起信号反射;而且要求每个分支都要严格等长,此时对于布局的空间要求非常大,如果是多片4pcsDDR,此时不太好绕等长,此时就不太适合。
Fly-BY拓扑优缺点

Fly-By是分支更短的菊花链拓扑形式,上图 DDR3内存的时钟、地址、控制命令均采用了Fly-by拓扑结构,将命令和地址信号以及CLK串联到各个内存模块上,并在末端配备合适的电阻。一般是该拓扑最后一片DDR的后面端接。也就是上图中所示意的这种端结形式。端结电压是参考电压,也就是Vccq/2,端结电阻根据CPU的不同也不一致,我有见过51欧姆的,也有见过49.9欧姆的,还见过33欧姆的。该走线比较容易实现,但是该种拓扑在不添加端接电阻时,很难实现阻抗匹配,只有使用合适的端接电阻,才能改善过冲现象。
在该拓扑结构中,信号可在不同的间隔时间内到达不同的内存模块,即具写入均衡功能,可延迟遭遇内存模块输入容性负载的时间。
写入均衡功能:
为了获得更好的信号完整性,DDR3内存模块采用了FLY-BY拓扑结构,用于命令,地址,控制信号和时钟。fly-by拓扑结构受益于减少短截线数量及其长度,但它也会导致DIMM上每个DRAM的时钟和其他时序之间的传输时间偏差。这使得控制器难以满足tDQSS,tDSS和tDSH规范。因此,DDR3 SDRAM支持“写入平衡”功能,允许控制器补偿偏斜。内存控制器可以使用“写入均衡”功能和来自DDR3 SDRAM的反馈调整DQS - DQS#到CK - CK#的关系。涉及的存储器控制器必须在DQS-DQS#上具有可调延迟设置,以使DQS-DQS#的上升沿与DRAM引脚的时钟对齐。
简单一点解释就是虽然CPU的命令和数据到达的DDR的时间不同,但是由于这个写入均衡功能,可以让先到达那部分数据等待,等待最好达到的那片DDR达到后一起在进行数据的处理,这样就能保障信号的完整性。

最通俗易懂的解释就是,比如一家人去吃火锅,有的先到,有的后到,但是最终必须等到一家人到齐后才能动筷子,就是一样的原理,此时必须要有一个主持大局的人安排这个事情,对于电子来说,就是CPU要支持写入均衡的功能。
优点总结:
使用这个拓扑,其中数据组不需要和时钟信号绕等长,这样就可以节省较多的布线空间,同时也可以支持更高的信号速率,特别适合4PCS的DDR的布局设计。
缺点总结:
使用这个拓扑结构一定要使用端接电阻,而且基本上都需要CPU去处理写入均衡的算法,这个有一定的难度,所以不太适合在2pcs 简单的DDR上。
好的,到这篇为止最小系统中的CPU、FLASH、DDR已经告一段落了,下次再把汽车电子中EMMC讲完,就最小核心系统的器件科普完整了,下期内容为汽车电子EMMC相关科普。
