目录
简介
理解阅读需要具有DDR相关的背景知识,可以对照协议进行理解推导。这里以最新的GDDR6 JESD250C为例子,进行带宽的计算。由于各类DDR都是类似的,因此各类型的DDR都可以基于该方法进行拓展。
计算前需要补充的知识
在发送DDR的读写命令前,需要发送ACT命令打开DDR bank中的row,并且同一时间段内同一bank中仅有一个row能被打开。如果需要访问同bank内的其他row,需要先发送PRE命令关闭当前 row,然后再发送ACT命令,激活想要访问的row。这里以JEDEC250C的ACT命令为例子:
从图片中可以看到有几个主要时序参数需要满足:
参数名称 | 解释 |
---|---|
tRCD | ACT打开row后,间隔tRCD才能发送WR/RD命令,读写命令满足的tRCD不一致,需要区分 |
tRASmin | ACT打开row后需要保持一直打开的最小时间,满足后才可以发送PRE命令 |
tRC | 同bank发送ACT和ACT需要满足的最小时间间隔 |
tRP | PRE命令后,需要tRP时间才能发送同bank ACT命令 |
接下来看读写命令,正常访问DRAM流程是ACT->WR/RD->PRE。RD命令->PRE命令需要满足tRTP,WR命令->PRE命令需要满足WLmrs+BL/8+tWR/tCK. 同时GDDR6中提供了RD/WR with auto-precharge命令,即在读写命令中存在一个auto-precharge命令关闭当前bank。WRA和RDA命令同样需要满足tRP。
DDR6中总共有16个bank,不同bank之间有ACT命令的限制。不同bank之间的ACT命令间隔需要满足tRRD。其次在tFAW的窗口内,最多只能发送4个Bank的ACT命令。
GDDR6的Burst Length为BL16,DQ位宽为16bit,因此每发送一笔命令访问的数据量为:
data_bytes = 16 / 8 * 16 = 32 Bytes
理论带宽计算
根据DRAM的时序参数,可以获取到上面时序的具体值。部分参数是cycle为单位,部分参数是 以纳秒为单位,通常统一以cycle为单位。因此需要根据DRAM工作频率来换算时序参数。
假设以16Gbps为最高速率,那么tCK=0.5ns. 假设tRASmin=32ns,那么换算成cycle即为64 cycle。依次类推,把所有时序参数都换算成以cycle为单位。这里假设一部分参数,用于计算示例,实际参数需要根据vendor提供的datasheet来计算:
参数名字 | 描述 | Unit(cycle) |
---|---|---|
tRCDR | ACT打开row后,间隔tRCDR才能发送RD命令,读写命令满足的tRCD不一致,需要区分 | 36 |
tRCDW | ACT打开row后,间隔tRCDW才能发送WR命令,读写命令满足的tRCD不一致,需要区分 | 36 |
tRASmin | ACT打开row后需要保持一直打开的最小时间,满足后才可以发送PRE命令 | 64 |
tRC | 同bank发送ACT和ACT需要满足的最小时间间隔 | 100 |
tRP | PRE命令后,需要tRP时间才能发送同bank ACT命令 | 36 |
tRTP | RD命令到PREpb需要满足的时间间隔 | 4 |
tRTP+RU(tRP/tCK) | RD w/ AP到ACT需要满足的时间间隔 | 4+36=40 |
WLmrs+BL/8+RU(tWR/tCK) | WR命令到PREpb需要满足的时间间隔 | 10+16/8+36=48 |
WLmrs+BL/8+WR+RU(tWR/tCK) | WR w/ AP到ACT需要满足的时间间隔 | 10+16/8+12+36=60 |
tRRD | 不同bank的ACT命令之间需要满足的时间间隔 | 5 |
tFAW | 在tFAW的窗口内,最多只能发送4个Bank的ACT命令。 | 20 |
那么根据我们之前整理的时序约束,开始计算。
32B随机地址读请求场景,每一笔命令的bank和row都不相同。这意味着同一个bank每次发送读命令前,都需要先发送ACT命令,然后发送RD命令,再发送PRE命令。当有新请求时,都需要重复执行 ACT->RD->PRE。或者使用RDA代替RD->PRE。
为了方便理解,这里以一个bank的ACT-RD-PRE-ACT场景作为例子(最顶上数字代表cycle数,数字不连续是因为隐藏了中间的部分):
-
黄色部分:0-36 cycle,tRCDR时序
-
绿色部分:36-39cycle,tRTP时序,由于没有满足tRASmin的时序,因此这里不能发送PRE命令
-
橙色部分:64-99cycle,tRP时序,发送PRE命令后满足tRP时序才能再次发送ACT
-
蓝色部分:0-64cycle,tRASmin时序,只有满足tRASmin之后,才能发送PRE命令
-
红色部分:0-99cycle,tRC时序,同bank发送ACT和ACT命令的最小间隔
这是一个bank的行为,dram有16个bank,可以基于这个bank的行为进行一个拓展:
上图蓝色的部分代表tFAW时序,可以看到不同 bank的ACT命令之间间隔tRRD,正好5个cycle。这里因为tFAW正好为20个cycle,因此可以忽略tFAW的影响。
忽略了tFAW的影响后,进入我们的正题,进一步推导16个bank的ACT-RD-PRE-ACT场景(中间隐藏了没有命令的cycle):
这样一来,我们可以从图中看到在100个cycle内,可以发送完15笔ACT命令,但是RD命令只能发送出12笔。这样一来,我们就可以计算出读32B命令随机地址有效的带宽为12%:
读32B随机地址理论带宽 = 12 * 32Byte / 100 * 32Byte * 100 = 12%
如果AXI发送过来的是256B的随机地址读请求,可知一笔读命令数据量为32B,那么命令转换后的场景为:ACT->RD->RD->RD->RD->PRE。那么新的时序图如下:
我们可以从图中看到在100个cycle内,RD命令只能发送出46笔。这样一来,我们就可以计算出读256B命令随机地址有效的带宽为46%:
读256B随机地址理论带宽 = 46 * 32Byte / 100 * 32Byte * 100 = 46%
写方向的理论带宽也可以根据这个方法进行计算。需要注意的是,这里没有考虑刷新命令的影响,更详细的计算需要考虑刷新。同时我们可以发现,如果在ACT-PRE之间的命令数量n增加,那么带宽是可以提高至接近100%的。