前言:
对于DDR3的使用,相信大家都不会陌生。由于高带宽、大容量、廉价的特点,DDR3(颗粒或DIMM)常应用于存储数据、建立表项等场合。但是,在我们的应用中DDR3的接口带宽(即接口速率)利用率有多高呢?这是个棘手的问题,至少在此次测试之前博主本人是没有一个明确的答案的。如果不考虑开销,单纯从时钟和数据位宽的角度看,一个工作时钟为533M,数据总线位宽为64bits的DIMM,由于接口是DDR(Double Data Rate,双倍数据速率),那么这样一个DIMM的理论最大带宽为8.528GB/s。但是,DDR3的读写共用同一组数据总线,同时DDR3内部是以BANK/行/列的形式组织起来的,一个DDR3包含若干个BANK(4/8个),一个BANK包含若干行,一行包括若干列。读写切换、同BANK不同行间切换都需要比较长的切换时间,同时不同指令之间也有各种时间间隙要求。根据应用模式的不同,DDR3的接口带宽利用率差异非常大。
本次测试的目的是为了获得Xilinx的DDR3控制器与DDR3芯片配合时的带宽利用率等数据,用于发现现有设计的缺陷,并寻求解决和规避的办法。本次测试按照使用情形的不同,构造不同的测试条件对被测对象进行测试。本次测试计算带宽效率的方式是,往Xilinx的DDR3控制器中输入指定的激励,观察DDR3芯片接口上的有效数据所占的比例,由此计算出有效带宽。在本测试报告中主要图表为Modelsim上的截图,反应的是DDR3芯片接口上的时序图。
本次测试的全部内容会以五篇博文的形式分享给大家。
图表说明:
表1 Modelsim截图中信号描述
信号名
| 描述
| ddr3_sram_a_dq
| DDR3的64位输入输出数据总线
| ddr3_sram_a_addr
| DDR3的行/列地址输入总线
| ddr3_sram_a_ba
| DDR3的Bank地址输入总线
| ddr3_sram_a_ras_n
| DDR3命令输入线(行地址片选,低有效)
| ddr3_sram_a_cas_n
| DDR3命令输入线(列地址片选,低有效)
| ddr3_sram_a_we_n
| DDR3命令输入线(读写选择,低有效)
| ddr3_sram_a_reset_n
| DDR3复位输入(低有效)
| ddr3_sram_a_cs_n
| DDR3芯片片选输入
| ddr3_sram_a_odt
| DDR3 ODT控制输入
| ddr3_sram_a_cke
| DDR3时钟使能
| ddr3_sram_a_dm
| DDR3数据掩码输入线
| ddr3_sram_a_dqs_p
| DDR3数据锁存信号输入输出线(组随路时钟P端)
| ddr3_sram_a_dqs_n
| DDR3数据锁存信号输入输出线(组随路时钟N端)
| ddr3_sram_a_ck_p
| DDR3差分时钟输入(P端)
| ddr3_sram_a_ck_n
| DDR3差分时钟输入(N端)
| 表2 DDR3接口输入指令格式
指令类型
| CS# | RAS# | CAS# | WE# | BA | A12 | A10 | 单Bank precharge | L | L | H | L | BA | V | L | 8Banks precharge | L | L | H | L | V | V | H | Bank active | L | L | H | H | BA | Row address | Write BL8 MRS | L | H | L | L | BA | V | L | Write BL8 MRS (auto precharge) | L | H | L | L | BA | V | H | Read BL8 MRS | L | H | L | H | BA | V | L | Read BL8 MRS (auto precharge) | L | H | L | H | BA | V | H |
图1 仿真波形对应信号名 一.单Bank多行切换测试:
描述:单Bank内行切换时,每次打开一个Row,进行一次写操作以后,必须重新打开另外一个Row,才能进行该Row的写操作。两个Row打开操作有时间间隙要求,打开Row到写操作也有时间间隙要求。因此导致单Bank内行切换时,带宽利用率极低。图中每个写操作中8个数据有效,后8个数据无效。因此,在一个写操作所占用的时间内,有效时间仅有8ns,无效时间为60ns,导致总的带宽利用率仅为8/68=11.8%。
图2 单Bank多行切换时序图 二.两Bank不换行平滑过渡测试
描述:先在Bank0的同一个Row内连续写8次然后过渡到Bank1的同一个Row内连续写8次。可以在Bank0的写操作过程中打开Bank1的一个Row,而不影响Bank0的写操作。由于提前了足够的时间打开Bank1,那么等Bank0的写操作结束后,可以直接平滑的过渡到Bank1的写操作阶段,中间没有等待。在不考虑DDR3的定时充电对带宽的消耗,以及读写切换对带宽的消耗,这种工作模式的带宽利用率接近100%。这种应用模式很适合于数据的连续缓存,可以使带宽利用率最大化。
图3 两Bank不换行平滑过渡时序图 三.8Bank依次访问测试
描述:在此项测试中,每个Bank只访问一次,接着依次访问其它Bank。DDR3有限制在一定时间内可以输入的Bank打开指令个数,即在一定时间内只允许输入最多4个Bank打开命令。同时,连续两个不同Bank的行打开命令之间也有间隙要求。从整体效果上看,只要满足两个Bank之间行打开命令的间隙,就能满足在一定时间内只打开4个Bank的限制。这些限制本身只要调度合理的话,并不会到来带宽损耗。但由于Xilinx的DDR3控制器实现方面的原因,这种限制几乎被放大了一倍,DDR3控制器每次最多只能打开4个Bank ,然后必然先关闭已打开Bank,然后再打开新的Bank。由此带来的带宽开销也是惊人的。这种模式下,在一组写操作占用的时间内,有效时间长度为32ns,无效时间长度是48ns,带宽利用率为32/80=40%。
图4 8Bank依次访问时序图
四.4Bank依次访问测试:
描述:在此项测试中,依次访问其他Bank,共使用4个Bank。4个Bank访问完以后,再依次访问一遍这四个Bank,且同一个Bank的被访问地址在同一行同一列。用于观察Xilinx对Bank管理。测试情形基本和测试项三类似。结果显示,下发了四个Bank打开指令后,即使下一次访问的是已经打开Bank的已打开行,也要先把当前已打开的四个Bank关闭,重新打开新的Bank。这种Bank管理办法显然简单,但是会极大的浪费DDR3的带宽。这个测试项中,一组写操作所占用的时间内,有效时间长度为32ns,无效时间长度为48ns,带宽利用率为32/80=40%。
图5 4Bank依次访问时序图
五.相同Bank同一行读写切换测试
描述:在此项测试中,发起四次读写访问,其中读写操作分别间隔开,四次读写操作访问的地址都是同一个,由此观察读写切换引入的带宽开销。由图可见,在执行完一次读/写操作后,即使下一次写/读操作的地址不变,也不能立即执行下一个命令,必须等待一段时间。经测量,发现在连续的读写切换过程中,一组读写操作所需总时间为8000ps+23508ps+8000ps+40492ps=80ns,其中有效时间为16ns,带宽利用率为20%。
图6 相同Bank同一行读写切换时序图
六.相同Bank不同行读写切换测试
描述:在此项测试中,发起四次读写访问,其中读写操作分别间隔开,四次读写操作访问的地址在相同Bank的不同行,由此观察读写切换引入的带宽开销。由图可见,由于读写切换以及行切换,在连续的读写切换过程中,一组读写操作所需总时间为8000ps+35508ps+8000ps+76492ps=128ns,其中有效时间为16ns,带宽利用率为12.5%。
图7 相同Bank不同行读写切换时序图
七.结论
经过上面若干测试项的验证,可以发现:Xilinx的DDR3控制器结合DDR3芯片对于按地址连续存储,效率还是比较高的,基本上可以达到95%以上(一些零散的开销未详细计算,故取5%作为这些开销的总和)。但Xilinx的DDR3控制器对DDR3的随机地址存取效率比较低。对于一些查表应用,由于查表地址是随机的,DDR3的存取效率是很低的。
造成随机存取效率较低的原因主要有:1.同Bank行切换;2.同时打开的Bank数只能是4个;3.读写切换。
随机存取DDR3带宽利用率基本维持在11.8%-40%之间。 八.解决办法
1.将Xilinx的DDR3控制器的同时能打开的bank数改为8;
2.调整DDR3访问(读或写)的顺序,避免同Bank行切换以及读写切换。 |
|
|