第二章SDRAM基本操作与优化策略.docx
- 文档编号:8666536
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:15
- 大小:418.89KB
第二章SDRAM基本操作与优化策略.docx
《第二章SDRAM基本操作与优化策略.docx》由会员分享,可在线阅读,更多相关《第二章SDRAM基本操作与优化策略.docx(15页珍藏版)》请在冰豆网上搜索。
第二章SDRAM基本操作与优化策略
第二章SDRAM基本操作与优化策略
由于指令操作的存在,SDRAM系统的硬件带宽往往得不到充分利用。
良好的SDRAM访问策略可以提高SDRAM系统的硬件带宽的利用率,在相同硬件条件下获得更好的性能或在相同性能要求下降低硬件成本。
SDRAM具有多Bank、流水线化等结构特性,如果能够巧妙地排列指令,可以开发SDRAM的并行化优势节省总线时间;SDRAM具有行缓冲,如果根据数据访问的空间局部性、请求延时的限度,适当重排访问请求、控制缓冲策略,可以减少指令的数量,提高总线效率。
本章内容包括:
SDRAM的特性回顾与基本操作、SDRAM访问的优化方向与常用策略。
由于SDRAM的初始化与带宽利用率的优化策略无关,故另行归入控制器设计原理的章节中。
从本章开始SDRAM专指SDRSDRAM。
1SDRAM的基本操作
1.1SDRAM回顾
SDRAM是同步动态随机存储器的缩写。
同步,指它有统一的时钟,在时钟上升沿采样指令、读入或输出数据,与早期的异步DRAM不同;动态,指它必须不断刷新以维持数据,与SRAM不同;随机存储器,指对它的访问是任意的,而不像FIFO或堆栈那样存在访问限制;同时,RAM一直以来也隐含着掉电后会丢失数据的意思,与ROM、PROM、Flash等非挥发存储器相对。
SDRAM具有由Bank、行(Row)、列(Column)构成的三维结构,如下图:
如图,SDRAM分为4个Bank;每个Bank都包含一套二维存储阵列,以及一个行缓冲(即一排灵敏放大器);阵列中的每一行,分为若干列,行激活(Activate)时,对应的行被放入行缓冲中,预充电(Precharge)时,对应的行被写回存储阵列;行中的每一个列,由若干DRAM单元构成,单元个数由SDRAM芯片的数据总线位宽决定,SDRAM的读写操作对应的都是行缓冲中的某个列。
SDRAM的多个Bank可以进行不同的工作。
例如,Bank0进行行激活时,Bank1的数据传输或预充电不会受到影响。
实质性的限制只有两方面:
SDRAM的指令、数据总线个只有一套,SDRAM指令之间必须满足规定的延时条件。
了解SDRAM指令与基本操作,是研究SDRAM访问优化策略的基础,接下来将对它们作简要介绍。
1.2SDRAM的基本指令
首先简要介绍一下SDRAM的管脚。
1973年Mostek发布了MostekMK4096存储器,容量为4k,创新地采用了行列地址线复用技术,从而减少了管脚降低了成本,这个传统延续至今。
典型SDRAM的I/O管脚包括:
时钟输入(clk)。
SDRAM的最高工作频率一般在100~200MHz之间。
时钟使能(cke)。
与各种休眠模式有关,不在本课题研究范围之内,相关设计中直接置为1。
Bank地址(ba1,ba0)。
Bank地址,选取当前指令对应的Bank。
地址总线(an~a0)。
这就是复用的行列地址总线,行操作时发送行地址,列操作时发送列地址。
在Precharge、Read、Write时a10有特殊含义,见下文表格。
数据总线(dqn~dq0)。
在SDRAM术语中,dqn~dq0所有数据的总和也称为1个word,它是三维存储整列访问的最小单元。
数据Mask(dqm或dqm[3:
0]或dqmh、dqml)。
4位和8位的SDRAM使用dqm对应整个word;16位SDRAM使用dqmh、dqml对应高、低字节;32位SDRAM使用dqm分别对应4个字节。
读数据时dqm为1会使输出高阻态,写数据时DQM为1表示当前数据不写入。
指令输入(cs_n、ras_n、cas_n、we_n、a10)。
负责向SDRAM发送指令,不考虑休眠模式的指令真值表如下:
指令
缩写
cs_n
ras_n
cas_n
we_n
a10
地址
LoadModeRegister
LMR
0
0
0
0
x
Op-Code
AutoRefresh
REF
0
0
0
1
x
x
Precharge
PRE
0
0
1
0
0
Bank/x
PrechargeAll
PREA
0
0
1
0
1
x
BurstTerminate
BT
0
0
1
1
x
x
Write
WR
0
1
0
0
0
Bank/Col
Writewithautoprecharge
WRA
0
1
0
0
1
Bank/Col
Read
RD
0
1
0
1
0
Bank/Col
Readwithautoprecharge
RDA
0
1
0
1
1
Bank/Col
Activate
ACT
0
1
0
1
1
Bank/Row
NoOperation
NOP
0
1
1
1
1
x
Deselect
DSEL
1
x
x
x
x
x
1.2.1LMR指令与模式寄存器
模式寄存器的典型定义如下图:
通常,WriteBurstMode取0,OperationMode取2'b00,BurstType取0,而突发传送长度(BurstLength)、CAS延时(CasLatency)根据需要来选取。
BurstLength,即读写突发传送的周期数,一般可设置为1、2、4、8以及FullPage,在初始化时通过写模式寄存器来设置。
需要注意的是,如果列读写时,地址没有与BL对齐,SDRAM会自行Wrap地址,导致意外的结果。
CasLatency,即从发送列读取指令到有效数据出现的延时,一般为2或3个时钟周期,少数器件可以为1个周期,在初始化时通过写模式寄存器来设置。
一般CL=3时,tAC参数(即时钟上升沿到有效数据出现的延时)较小,从而使器件可以工作在较高的频率。
LMR(LoadModeRegister)指令用于写模式寄存器,以设定BurstLength、CasLatency等参数。
进行LMR前,必须关闭所有的Bank中的行缓冲。
发送LMR指令的同时,Bank地址为2'b00,模式寄存器的值通过地址总线发送。
通常,只在初始化时设定一次LMR之后不再更改。
LMR指令之后,必须隔tMRD才能发送其他指令,当代SDRAM中tMRD的典型值为2个时钟周期。
从此处开始的讲解中,如非特殊说明,则默认WriteBurstMode取0,OperationMode取2'b00,BurstType取0,突发传送长度(BurstLength)取4,CAS延时(CasLatency)取3。
1.2.2ACT(Activate)指令、WR(write)指令、RD(Read)指令
ACT(Activate)指令。
用于把指定Bank中的指定行放入该Bank的行缓冲里。
发送ACT指令的同时,ba[1:
0]给出Bank地址,地址总线发送行地址。
如果需要读写的数据不在相应Bank的行缓冲里,就需要先发送ACT指令,载入相应的行,之后才能完成列读写。
ACT指令之后可以进行列读写,但必须间隔tRCD的时间。
不同Bank的ACT指令之间必须满足tRRD的时间间隔;相同Bank的ACT指令之间比满足tRC的时间间隔。
WR(Write)指令。
用于向行缓冲中的指定列写入数据。
发送WR指令的同时,ba[1:
0]给出Bank地址,地址总线发送列地址,并给出第一个word的数据,之后的(BurstLength-1)个周期里给出剩下数据。
给出数据的同时可用DQM来做Mask,1为不写入,0为写入。
表示列地址时,跳过a10位,而a10为0,表示是不在写操作后自动Precharge。
RD(Read)指令。
用于从行缓冲中的指定列读出数据。
发送RD指令的同时,ba[1:
0]给出Bank地址,地址总线发送列地址。
有效数据在CL个周期后输出,在BurstLength个周期内,分别输出BurstLength个word的数据。
读操作时,也可给出DQM,时序与写操作类似,但是不常用到。
表示列地址时,跳过a10位,而a10为0,表示是不在读操作后自动Precharge。
如果要访问的列在当前行缓冲中,就不必先执行ACT指令了。
连续的读或写指令之间要满足tCCD间隔,tCCD一般为2个时钟周期,如果BurstLength为4或8,则连续的数据输入或输出不受其影响。
所以说,开发空间局部性可以提高SDRAM访问效率。
从读切换到写的时候,由于数据总线的参数限制,可能要添加一个BusTurnAround的周期,视具体情况而定。
1.2.3PRE(Precharge)、PREA(PrechargeAll)、WRA(Writewithautoprecharge)、RDA(Readwithautoprecharge)指令
PRE(Precharge)指令。
用于关闭指定Bank的行缓冲,并写回数据。
发送PRE指令的同时给出Bank地址,A10为0,表示只对当前Bank预充电。
PREA(PrechargeAll)指令。
用于关闭所有Bank的行缓冲,并写回数据。
发送PRE指令的同时,A10为1,表示只对当前Bank预充电。
PRE、PREA指令之后必须隔tRP后才能进行相应Bank的列操作,tRP典型值略小于20ns,约对应2~3个时钟周期。
当由WR指令发起的写操作给出最后一个数据后,间隔tWR才能发送PRE指令。
因为数据写入行缓冲需要时间。
tWR也称tDPL,典型值为2个时钟周期。
因此写操作给出最后一个数据后,相隔tWR+tRP才能给出相应Bank的下一个列操作指令,这个延时简称tDAL。
由于SDRAM的流水线化设计,tWR对同一行内的写后写、写后读无限制。
当由RD指令发起的读操作输出最后一个数据前的CL-1个周期可以发送PRE指令。
后面的列操作只要满足tRP就行。
WRA(Writewithautoprecharge)指令。
特性与WR指令一样,只是给出指令时A10为1,表示是不在写操作后自动Precharge。
其效果与“由WR指令发起的写操作给出最后一个数据后间隔tWR发送PRE指令”一致。
RDA(Readwithautoprecharge)指令。
特性与RD指令一样,只是给出指令时A10为1,表示是不在读操作后自动Precharge。
其效果与“在由RD指令发起的读操作输出最后一个数据前的CL-1个周期发送PRE指令”一致。
1.2.4REF(Refresh)指令
REF(Refresh)指令。
用于通知SDRAM进行“自动”刷新,每次刷新对应一行(row)。
“自动”指的是SDRAM内部都包含刷新计数器,发送REF指令时,不需要发送对应的Row地址,故也把Refresh也称为CBR(ColumnBeforeRow)操作。
发送REF指令前,必须保证每个Bank都空闲,如果任意一个Bank中有打开的RowBuffer,必须先发送PrechargeAll或Precharge指令。
每次Refresh指令发送后,必须等待tRFC时间才能发送下一条指令,这就是刷新延时。
通用SDRAM要求在64ms内将所有Row刷新一遍,这个周期称为tREF。
SDRAM的row数一般为4096或8192,故如果均匀地刷新,每隔15.625us或7.8125us要发送一次REF指令。
有时,即使SDRAM的row数不到4096,刷新周期也按4096row的情况计算。
只要能满足tRFC、tREF,连续的突发Refresh也是允许的。
2SDRAM的优化策略
SDRAM的优化策略主要包括:
行缓冲策略选取、地址重映射、访问请求重排、SDRAM指令重排。
决定SDRAM优化策略时的重要因素包括:
带宽利用率、最大访问延时、存储器功耗。
行缓冲策略选取,与访问的空间局部性、延时限制有关。
核心思想包括:
OpenPagePolicy,ClosePagePolicy,各类折中优化的策略,以及一些动态调整PagePolicy的技术。
一般而言,ClosePagePolicy适用于实时性要求高或者空间局部性差的应用场合;OpenPagePolicy适用于实时性要求不高且空间局部性好的应用场合。
SDRAM指令重排,着重发挥SDRAM的多Bank并行、流水线化的特性,从而提升总线效率。
访问请求重排、地址重映射,是为行缓冲策略、SDRAM指令重排服务的。
可以向提高访问请求空间局部性的方向优化,从而提升OpenPagePolicy的效率;也可以使请求目标地址更分散的方向优化,从而便于SDRAM指令重排,充分发挥多Bank并行工作的优势。
下面对这些技术做简要讨论。
2.1行缓冲与SDRAM优化策略。
2.1.1SDRAM读写特征与行缓冲回顾
SDRAM的四个Bank各有一个RowBuffer。
ACT指令会将一行数据放入相应Bank的RowBuffer中;PRE、PREA指令会关闭RowBuffer写回数据。
如果某Bank的RowBuffer是关闭的,我们称它为空闲(Idle)的。
SDRAM的访问存在三种情况:
(1)PageHit。
当前访问的Row,正好保存在相应bank的rowbuffer里。
此时,不需要激活Row,直接发读写指令和Column地址,就可以进行列读写,这就是BacktoBack读写。
此情况,读写延时最小。
(2)PageEmpty。
当前访问的Row所在的bank中,rowbuffer关闭。
此时,需要先激活Row,再发读写指令和Column地址。
此情况,读写延时中等。
(3)PageMiss。
当前访问的Row所在的bank中,rowbuffer打开,存的是另一个Row的数据。
此时,必须先发送Precharge或PrechargeAll指令关闭rowbuffer,再激活Row,最后发读写指令和Column地址。
此情况,读写延时最大。
假设PRE指令延时tRP为2个时钟周期、ACT指令延时tRCD为2个时钟周期,则以上三种情况的写时序简图如下:
从图中可以看出,PageHit不导致带宽损失,PageEmpty的带宽损失较小,PageMiss导致的带宽损失最大。
需要注意的是,在进行指令重排优化的情况下,多Bank并行工作,PRE指令延时、ACT指令延时可以被“隐藏”,不一定会导致带宽损失,详细情况将在后文叙述。
2.1.1ClosePagePolicy简介
ClosePagePolicy指的是尽量保持行缓冲关闭的策略。
对当前行访问结束后立刻进行Precharge操作,不论后面是否还要访问该行。
ClosePagePolicy中只发生一种情况:
PageEmpty(即行缓冲为空,需要先激活行)。
其读延时为tRCD+CL,写延时为tRCD。
ClosePagePolicy的读写延时适中并且恒定,与访问请求的时间空间局部性无关,具有良好的可预测性(Predictabilility),适用于实时性要求较高的应用场合。
ClosePagePolicy的硬件实现比较简洁,因为每次读写都是一个行激活、列读写、预充电的过程。
2.1.2OpenPagePolicy简介
OpenPagePolicy指的是尽量保持行缓冲打开的策略。
除非需要访问当前同一bank中的其它行,则不进行Precharge操作。
OpenPagePolicy中常会发生两种情况:
PageHit(即再次访问RowBuffer中的数据)、PageMiss(RowBuffer中的行不是要访问的行)。
前者读延时为CL,写延时为0;后者读延时为tRP+tRCD+CL,写延时为tRP+tRCD。
如果访问请求的时间空间局部性很好,则发生PageHit的概率远大于发生PageMiss的概率,应用OpenPagePolicy可以大大减少读写延时;如果访问请求的时间空间分部很分散,则发生PageMiss的概率远大于发生PageHit,应用OpenPagePolicy会造成较大的读写延时。
假设RowBuffer中的数据能被下次访问用到的概率为x,则OpenPagePolicy优于ClosePagePolicy的判断条件如下:
即当x大于tRP/(tRP+tRCD)时,OpenPagePolicy的平均读写延时低于ClosePagePolicy。
OpenPagePolicy的硬件实现比ClosePagePolicy略复杂一些,需要判断PageHit与否,还需要保证RowBuffer开启时间不超过tRASmax的限制以防数据丢失。
2.1.4OpenPagePolicy与ClosePagePolicy的进一步讨论
由于RowBuffer的开启与关闭消耗的能量比较多,ClosePagePolicy的功耗大于OpenPagePolicy,且访问的局部性越好,差距越明显。
对于轻量级的应用,ClosePagePolicy具有读写延时固定、电路简洁的优势,Xilinx公司在《SynthesizableHighPerformanceSDRAMController》中给出了一个不错的设计方案。
PC应用以及单核SOC,往往具有较好的访问请求局部性,多采用OpenPagePolicy或类似的衍生方案。
Altera公司为其NIOS软核设计的SDRAMIP就是一个典型的例子。
对于图像处理的应用,存储器的访问是很有规律性的,这给访问的优化带来了方便。
在每次访问的同时给出连续访问长度等信息,即可实现存储器的高效访问,这也是接下来的几章中将要详细讨论的设计方案。
在多核应用、网络服务器应用中,由于访问请求的来源较为分散导致局部性下降,似乎更倾向于ClosePagePolicy,但实际应用中往往采用更复杂动态的行缓冲策略。
2.1.5动态的行缓冲策略
动态的行缓冲策略,即根据运行中前一段时间的访问历史动态决定SDRAM行缓冲策略的技术。
Intel在其2003年的一份专利中提出了如下思想:
假设存在偏向于Open-Row和偏向于Close-Row的两种策略。
若当前策略偏向于Open-Row,则对下列情况进行双向计数:
关闭当前行以打开新行、访问当前行,如果前者接二连三地出现并超过阈值,则更换策略;若当前策略偏向于Close-Row,则对下列情况进行双向计数:
打开新行、打开上一次操作中被关闭的行,如果后者接二连三地出现并超过阈值,则更换策略。
不难发现,如果两个计数器的阈值都设为2,则整个结构与计算机体系结构课上讨论的2-bit分支跳转预测器类似。
这种设计的简化框图如下:
AMD在其2005年的一份专利中,阐述了另一种典型的动态行缓冲策略。
它是基于定时器和动态计数阈值实现的,依然采样如下四个事件:
关闭当前行以打开新行、访问当前行、打开新行、打开上一次操作中被关闭的行。
如果“关闭当前行以打开新行”接二连三地发生,则下调动态计数阈值;如果“打开上一次操作中被关闭的行”接二连三地发生,则上调动态计数阈值。
每当定时器数值到达动态计数阈值时,定时器清零。
另外,更新动态计数阈值时,也要清零定时器。
行缓冲关闭操作,在定时器数值到达动态计数阈值时触发,其他时间不进行任何关闭行缓冲的操作。
基于定时器的设计有两个好处:
SDRAM的行缓冲开启有时间极限,此设计中只需给定动态计数阈值的上限即可满足此要求;此设计对应的电路相对简单,不必为各种策略设计不同的状态机与控制逻辑。
此设计的简单框图如下。
Utah大学的研究人员在2011年提出了一种基于请求预测的动态行缓冲策略。
请求预测存储在行地址连续访问次数表中。
首次访问时保持行缓冲打开,记下行地址、连续访问次数;如果又一次访问该行,则预测将发生相同次数的连续访问。
如果连续访问次数预测过低(发生同一行关了又开的情况),则保持行缓冲打开直到连续访问结束,更新连续访问预测值;如果连续访问次数预测过高(提前开始访问其他行),则将连续访问预测值减1。
行地址连续访问次数表,采取FIFO形式,只对最近访问过的行做记录,以减少硬件开销。
Utah大学的研究人员认为此方法优于之前提到的基于动态策略选择的方案和基于可调阈值定时器的方案,但是我认为这需要进一步硬件验证与跟具体的Benchmark测试。
当然不论采用什么样的动态行缓冲策略,都是在以控制器的功耗、面积为代价,换取性能(或者说带宽利用率、最大访问延时)的改善,小型应用往往不需要这么复杂的策略。
动态行缓冲策略的实现粒度可分为:
全局、Bank、行三个层次。
以全局或Bank为粒度的实现十分普遍;以行为粒度,效果最好,但硬件代价巨大,可以改进为只对最近用到过的行做预测。
2.2SDRAM指令重排
SDRAM具有四个Bank,可以同时进行不同的操作。
SDRAM的操作也存在一些资源限制:
每个Bank只有一个RowBuffer;指令总线只有一条;指令之间要满足规定的延时;数据总线只有一条;数据总线从读切换到写可能需要等待。
SDRAM的指令重排,与超标量CPU的乱序执行十分类似,都是在不产生数据冲突的前提下,尽快把可用资源调配给待执行的指令,用有意义的指令去替代NOP指令。
下图给出了一个通过指令重排节省总线时间的实例。
Bank交错是一种简单有效的指令重排,常常与ClosePagePolicy合用。
如果能保证相邻请求访问的Bank不同且读写方向一致,则通过此技术可以达到几乎100%的带宽利用率。
下图给出Bank交错的写时序示例。
DenisShekhalev在OpenCore网站上给出了一种结合OpenPagePolicy以及SDRAM指令流水线化的SDRAM控制器设计实例。
该设计的读写请求预取深度为3,在满足指令延时的情况下,将第1条请求未用到的资源分配给第2条请求,将前两条请求都没用到的资源分配给第3条请求。
其基本结构如下图。
此设计的关键部件为BankMap以及AccessManager。
BankMap为OpenPagePolicy服务,记录4个Bank是否空闲,若不空闲则RowBuffer中存的是哪一行,从而判断当前读写请求需要用什么样的指令实现。
AccessManager用以判断SDRAM总线资源的可用性并保证
指令之间满足规定的延时,有了它,就可以合理地实现SDRAM指令流水线化。
然而,像这样见缝插针的指令重排虽然可以有效地提高SDRAM带宽利用率,降低平均等待时间,但是也带来了请求响应时间的不可预测性,不利于大型系统中的整体性能分析。
荷兰的研究人员提出了一种基于“预先计算的访问pattern”的解决方案,在保证响应时间可预测性的同时,达到了较高的性能。
通过Bank交错构建较短的读pattern、写pattern、读写切换pattern、写读切换pattern。
所有的读写请求都用这些pattern来实现,由于这些pattern的形式固定,读写请求的相应实现有较高的可预测性。
读pattern和写pattern有近乎100%的带宽利用率,并且同类pattern之间可以无缝拼接并保持100%的带宽利用率。
拼接pattern以完成系统端读写请求后,带宽利用率可能由于读写方向变化略有退化,但任然保持了较高的水平。
请求响应简图如下:
2.3SDRAM地址映射方案
SDRAM地址映射方案由两个优化方向:
提高读写请求的时间空间局部性、增加SDRAM操作的可并行性。
良好的地址映射方案,不会把原本空间连续的请求拆分到不同的SDRAM行中;良好的地址映射方案,会使连续的操作面向不同Bank中的不同行,从
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二章 SDRAM基本操作与优化策略 第二 SDRAM 基本 操作 优化 策略
![提示](https://static.bdocx.com/images/bang_tan.gif)