大数跨境

技术洞见 | 深入浅出:再谈DDR内存技术原理

技术洞见 | 深入浅出:再谈DDR内存技术原理 牛芯半导体
2024-12-12
1
导读:本文转载自架构师技术联盟,转载文章仅供学习和研究使用。

本文转载自架构师技术联盟,转载文章仅供学习和研究使用。

今天从动态的角度来分析时序结构,包括read/write的整个过程到数据返回发生了什么,其中包括以下内容:
  • DDR是如何完成Read、Write等的操作
  • DDR的基本命令
  • DDR的时序参数
  • DDR的性能分析


DRAM基本组成


对于DRAM,其主要由行和列组成,每一个bit中都是由类似右下图的类晶体管的结构组成,对于sdram的数据,可以通过控制column和row就可以访问sdram的随机地址的内容。
  • 读取某一个bit的状态,就是选中word line,那么图示中的晶体管M1就会导通,通过bit line的sense就可以感知到这个时候电容Cs上的状态,例如,现在如果这个bit的状态为1,那么导通之后就会从bit line上得到1,反之也是同样的道理。
  • 向某一bit写入1,首先通过row decoder选中word line,将会导致m1导通,那么bit line为1,会导致电容Cs充电,导致其电平为1,如果要写入,那么bit line的电平为0,将会导致电容Cs放电,致使此时的电平为0。
由上面可以看出一个位只能表示一个bit,那么我们想读取多个位的时候,该怎么办呢?那就出现了DDR中的bank的概念,由多个memory array就组成了一个bank,如下图,一次可以读取2bit/4bit/8bit的数据:
由多个bank就可以组成一个memory device,如下图,一个dram的芯片,由8个banks组成,而每个bank由4个memory array构成,而此时每个bank输出4个bit的I/O bus,那么为什么会出现bank的概念呢?动态内存区别于静态内存要定时刷新,每读取一个状态的时候,都需要重新充电。如果没有采用bank,假设我们现在要读取01-08地址的数据,当读取01的地址后,要等这个bank自刷新后才能读取02地址的值,而采用8个bank之后,没有这类问题,例如我们读取完01地址之后,那么读取02,因为02与01的控制方式不同,所以对于这段时间01可以后台的完成自刷新,依次类推,那么就可以很好的解决动态内存需要刷新的问题。


DDR工作原理


了解了DDR的基本组成后,我们来看看DDR如何来完成一次的读写过程。如下图所示,DRAM的相关操作在内部大概可以分为以下的四个阶段:
  • command transport and decode:在这个阶段,Host端会通过Command Bus和Address Bus将具体的Command以及相应参数传递给DRAM。DRAM接收并解析Command,接着驱动内部模块进行相应的操作。其中会根据将addr bus上的数据解码成对应的row address和通过bank control解码后得到对应的bank,其次对应的column也会解码得到对应的地址。
  • in bank data movement:在这个阶段,第一阶段发送需要读取的Column的地址给DRAM。然后DRAM再将Active Command所选中的Row中,DRAM就将Memory Array中的数据从DRAM Cells中读出到Sense Amplifiers,或者将数据从Sense Amplifiers写入到DRAM Cells。
  • in device data movement:这个阶段中,数据将通过IO电路缓存到Read Latchs或者通过IO电路和Write Drivers更新到Sense Amplifiers。
  • system data transport:在这个阶段,进行读数据操作时,SDRAM会将数据输出到数据总线上,进行写数据操作时,则是Host端的Controller将数据输出到总线上。
在上述的四个阶段中,每个阶段都会有一定的耗时,例如数据从DRAM Cells 搬运到Read Latchs的操作需要一定的时间,因此在一个具体的操作需要按照一定时序进行。同时,由于内部的一些部件可能会被多个操作使用,例如读数据和写数据都需要用到部分IO电路,因此多个不同的操作通常不能同时进行,也需要遵守一定的时序。此外,某些操作会消耗很大的电流,为了满足SDRAM设计上的功耗指标,可能会限制某一些操作的执行频率。


DRAM基本命令


对于一款DDR,我们需要知道通过什么样的方式来控制完成我们需要,我们来看看DDR的状态,DDR的工作就是在这几个状态之间切换:
在芯片上电后,完成初始化后,DRAM处于idle阶段,上图是需要进入各个阶段的时候,应该需要进行那些基本的操作,对于DRAM使用比较频繁的几个基本命令访问方式如下:
  • 刷新模式:储体中电容的数据有效是有时间限制的,所以为了保证数据的不丢失,所以要对DDR进行定时的刷新,SDRAM内部有一个行地址生成器(也称刷新计数器)用来自动的依次生成行地址。由于刷新是针对一行中的所有存储体进行。该模式是由Host主动控制DRAM完成刷新,存储体中电容的数据有效保存期上限是64ms(毫秒,1/1000秒),也就是说每一行刷新的循环周期是64ms。
  • 自我刷新模式:当系统进入低功耗模式,只需要发送一条SRF指令,主要用于休眠模式低功耗状态下的数据保存,比较常见的应用是STR(Suspend to RAM,休眠挂起于内存)。就进入了该模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。期间除了CKE之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使CKE有效才能退出自刷新模式并进入正常操作状态。
  • MRS模式(mode register set):模式寄存器中的数据控制着DDR2 SDRAM的操作模式。它控制着CAS延迟,突发长度,突发顺序,测试模式,DLL复位,WR等各种选项,支持着DDR2 SDRAM的各种应用。模式寄存器的默认值没有被定义,所以上电之后必须按规定的时序规范来设定模式寄存器的值。
  • EMRS扩展模式寄存器:存储着激活或禁止DLL的控制信息,输出驱动强度,ODT值的选择和附加延迟等信息。
  • 预充电:对一行读写操作后,关闭现有工作行,准备打开新行的操作就是预充电。
  • 读过程:访问操作开始ACT一个激活命令,主要是激活bank和rol,就等于选通了某一Bank的某一行,接着发送一个read指令,就可以通过数据总线将数据送出去了,然后就进行预充电,恢复到读写的状态,预充电完成后,就恢复到idle状态。
  • 写过程:与读过程基本类似。
DRAM的基本命令是通过操作各种控制信号/地址信号的组合来完成,下表是DRAM的命令表:


DDR的时序参数


Row Active Command
在进行数据的读写前,Controller需要先发送Row Active Command,打开DRAM Memory Array中的指定的Row。Row Active Command的时序如下图所示:
tRCD:RAS-to-CAS Delay(tRCD),内存行地址传输到列地址的延迟时间。
Row Active Command通过地址总线指明需要打开某一个Bank的某一个 Row。DRAM在接收到该Command后,会打开该Row的Wordline,将其存储的数据读取到Sense Amplifiers中,这一时间定义为tRCD(RCD for Row Address to Column Address Delay)。DRAM在完成Row Sense 阶段后,Controller就可以发送Read或Write Command进行数据的读写了。这也意味着,Controller在发送Row Active Command后,需要等待tRCD时间才能接着发送Read或者Write Command进行数据的读写。
tRAS:Row Active Time,内存行地址选通延迟。
由于DRAM的特性,Row中的数据在被读取到Sense Amplifiers后,需要进行Restore的操作。Restore操作可以和数据的读取同时进行,即在这个阶段,Controller可能发送了Read Command进行数据读取。
DRAM接收到Row Active Command到完成Row Restore操作所需要的时间定义为tRAS(RAS for Row Address Strobe)。
Controller在发出一个Row Active Command后,必须要等待tRAS时间后,才可以发起另一次的Precharge和Row Access。
Column Read Command
Controller发送Row Active Command并等待tRCD时间后,再发送Column Write Command进行数据写入。数据Burst Length为8时的 Column Write Command时序如下图所示:
tCWD/tCL/tCWL:内存CAS延迟时间。
Column Write Command通过地址总线A[0:9]指明需要写入数据的 Column的起始地址。Controller在发送完Write Command后,需要等待tCWD(CWD for Column Write Delay)时间后,才可以发送待写入的数据。tCWD在一些描述中也称为tCWL(CWL for Column Write Latency)
tWR(WR for Write Recovery)
DRAM接收完数据后,需要一定的时间将数据写入到DRAM Cells中,这个时间定义为tWR(WR for Write Recovery)。该值说明在一个激活的bank中完成有效的写操作及预充电前,必须等待多少个时钟周期。这段必须的时钟周期用来确保在预充电发生前,写缓冲中的数据可以被写进内存单元中。同样的,过低的tWD虽然提高了系统性能,但可能导致数据还未被正确写入到内存单元中,就发生了预充电操作,会导致数据的丢失及损坏。
Precharge Command
要访问DRAM Cell中的数据,需要先进行Precharge操作。相应地,在 Controller发送Row Active Command访问一个具体的Row前, Controller需要发送Precharge Command对该Row所在的Bank进行 Precharge操作。下面的时序图描述了Controller访问一个Row后,执行 Precharge,然后再访问另一个Row的流程。
DRAM执行Precharge Command所需要的时间定义为tRP(RP for Row Precharge)。Controller在发送一个Row Active Command后,需要等待tRC(RC for Row Cycle)时间后,才能发送第二个Row Active Command进行另一个Row的访问。
从时序图上我们可以看到,tRC = tRAS + tRP,tRC时间决定了访问DRAM 不同Row的性能。在实际的产品中,通常会通过降低tRC耗时或者在一个Row Cycle执行尽可能多数据读写等方式来优化性能。
Row Refresh Command
一般情况下,为了保证DRAM数据的有效性,Controller每隔tREFI(REFI for Refresh Interval)时间就需要发送一个Row Refresh Command给DRAM,进行Row刷新操作。DRAM在接收到Row Refresh Command 后,会根据内部Refresh Counter的值,对所有Bank的一个或者多个Row进行刷新操作。
DRAM刷新的操作与Active + Precharge Command组合类似,差别在于 Refresh Command是对DRAM所有Bank同时进行操作的。下图为DRAM Row Refresh Command的时序图:
DRAM完成刷新操作所需的时间定义为tRFC(RFC for Refresh Cycle)。
tRFC包含两个部分的时间,一是完成刷新操作所需要的时间,由于DRAM Refresh是同时对所有Bank进行的,刷新操作会比单个Row的Active + Precharge操作需要更长的时间;tRFC的另一部分时间则是为了降低平均功耗而引入的延时,DRAM Refresh操作所消耗的电流会比单个Row的Active + Precharge操作要大的多,tRFC中引入额外的时延可以限制Refresh操作的频率。
Read Cycle
一个完整的Burst Length的Read Cycle如下图所示:
下面是DDR常见的一些参数及定义如下:
上述的DRAM Timing中的一部分参数可以编程设定,例如tCAS、tAL、Burst Length等。这些参数通常是在Host初始化时,通过Controller发起Load Mode Register Command写入到DRAM的Mode Register中。DRAM完成初始化后,就会按照设定的参数运行。


性能分析


在学习完DDR的基本操作和时序参数之后,我们就看看性能的影响。当频率和位宽固定后,带宽也就不可更改,但是在内存的工作周期内,不可能总处于数据传输的状态,因为要有命令、寻址等必要的过程。那么这些操作占用的时间越短,内存工作的效率就越高,性能也就越好。
对于我们来说,最好的方法是提高频率,但是提高频率会受多方面的影响,还有什么办法提高内存访问采取速度
  • 多通道:现代内存控制器从北桥移入CPU内部,而内存控制器都可以同时操作多个通道。比如现在的笔记本开始支持双通道、三通道,如果数据分布在不同通道的内存条上,内存控制器就可以不用管上面的这些延迟时序,同时可以读取它们,速度可以增加两倍,甚至三倍。
  • 交织方式(Interleaving):同一块内存分布到不同的通道中去,这样无论Cache命中与否都可以同时存取,多通道的技术才能发挥更大的用处。
  • 超频内存:也就是提升DDR的频率来增加速度。


总结


对于DDR的读写以及一些时序参数的原理性知识后,下一步就进入到DDR的驱动调式,主要是对于一款控制器,我们该如何去调试DDR。其实对于DDR的调试,主要的读写的控制,都是由DDR的控制器完成了,我们主要是通过MRS模式/EMRS模式来完成对于DDR参数的配置,而对于MRS模式的使用,已经集成到DDR控制器中完成了,我们只需要根据控制器手册配置相应的寄存器就可以完成对于DDR调试。
参考文档:
1. DRAM Memory-Access Protocol
2. DRAM Timing
3. DDR2_SDRAM操作时序


往期推荐

01

牛芯半导体入选2024大湾区高成长企业100强

▲ 点击阅读

02

牛芯半导体荣获2024年度硬核IP产品奖

▲ 点击阅读

03

牛芯半导体荣获国家级专精特新“小巨人”企业认定

▲ 点击阅读


牛芯半导体(深圳)有限公司(简称“牛芯半导体”)成立于2020年,聚焦接口IP的开发和授权,并提供相关整体解决方案,致力成为全球领先的IP供应商。


基于自主可控的核心技术,牛芯半导体在主流先进工艺布局SerDes、DDR等中高端接口IP,产品广泛应用于消费电子、网络通信、数据存储、人工智能、汽车电子、医疗电子等领域。


未来,牛芯半导体持续响应IP国产化需求,适应不断演进的接口技术和日益拓展的接口互联场景,赋能数智时代下的千行百业。

【声明】内容源于网络
0
0
牛芯半导体
牛芯半导体,专注于高速互联技术的研发和持续创新,拥有完全自主可控的知识产权,提供全栈式接口IP授权和高速互联芯片的定制方案,赋能芯片国产化;已服务客户超百家,涵盖智能驾驶、人工智能、特种计算等领域,致力成为全球领先的高速互联半导体公司。
内容 0
粉丝 0
牛芯半导体 牛芯半导体,专注于高速互联技术的研发和持续创新,拥有完全自主可控的知识产权,提供全栈式接口IP授权和高速互联芯片的定制方案,赋能芯片国产化;已服务客户超百家,涵盖智能驾驶、人工智能、特种计算等领域,致力成为全球领先的高速互联半导体公司。
总阅读0
粉丝0
内容0