本期我们学习美光的一篇文章,关于如何估算 DDR 功耗,本文是对这篇文章粗略翻译和一点儿个人见解。原文链接:Calculating Memory Power for DDR4 SDRAM
原文是美光 DDR4 Technology Note (TN) 系列文章中的一篇,写的比较详尽又比较好懂,大家可以看下这系列的文章。传送门:美光 DDR4 TN
0 引言
相比 DDR3,DDR4 有更高的数据带宽,但是工作电压从 1.35v (DDR3L) 降低到了 1.2v。DDR4 颗粒增加了一路 2.5V 的 word-line boost 电源,相比使用 1.2v 电源,提高了 word-line 的电源供应效率。总的来说,DDR4 可以在系统级提供更高性能的同时,不提高甚至降低 DDR 消耗的电能。
不过你要细究 DDR 究竟在系统功耗中占比多少,只靠 spec 的数据来算的话,一般很难算的准确的,本文要讨论的就是这个问题,本文首先介绍了 DDR 功耗的理论组成,然后提供了一个系统设计者可以用来估算功耗的方法。
1 DRAM 工作原理
要估算 DDR4 功耗,首先需要了解其基本工作原理。
图 1- DRAM 结构图,以 8Gb, x8 DDR4 颗粒为例
DDR4 和 DDR3 类似,颗粒基本的运行模式由 clock enable 信号控制,也就是 DRAM 的 CKE pin。如果 CKE 电平为低,那么 DRAM 的输入端(input buffer)就会关闭。DRAM 运行时,CKE 电平必须为高,打开 DRAM 输入 buffer,并把 address/command pin 上的信号读取到 DRAM 的逻辑和译码器中。
在一次 DRAM 访问中,第一个发送给 DRAM 的命令是 ACT(Active)。ACT 命令的作用是选择访问 DRAM 的 Bank 和 Row 地址。此时 DRAM 还不知道这次具体要访问这个 Row 中哪个单元,但是整个 Row 的所有单元都会被从存储阵列中读取出来,放入灵敏放大器(sense amplifier)中。ACT 命令相关的单元在图 1 中用金色和蓝色标出。
DRAM 每个 Bank 中都有一组灵敏放大器,可以存放一个 Row 的所有单元。DRAM 颗粒中有多个 Bank,每个 Bank 都可以独立地读取不同的 Row 地址,把数据存放在自己的灵敏放大器中。以图中的 x8 颗粒为例,总共有 16 个 Bank,分成了 4 个 Bank group。当任意 Bank 的灵敏放大器中有缓存的数据时,我们称这个 DRAM 进入了 active 状态。
数据会一直存放在 Bank 的 sense amplifier 中,直到 Bank 接收到给他的 PRE 命令(Precharge),Bank 会把灵敏放大器中的数据原样存回存储阵列,地址还是原本的 Row 地址。一般来说,ACT 和 PRE 命令是成对使用的,有一个例外是接收到了 PRE ALL 命令,这个命令相当于给所有 Bank 发出了 PRE 命令。
DRAM 只有在 active 状态下,才能接收 READ 和 WRITE 命令,进行读写访问。读命令中指定了要读取的数据在灵敏放大器中的 Column 地址。(这部分在图 1 中用绿色表示)对应的数据会通过 IO gating 被读取到内部的读数据锁存器,然后被输出到数据复用器中,最终通过输出驱动电路从 DRAM 输出。这部分对应图 1 中的紫色部分。
DRAM 写操作的流程和读操作相同,只是数据的方向变为输入进 DRAM。DQ 管脚上的数据被锁存到数据接收器和寄存器,然后进入内部的数据接收器,在这里转换位宽为 64 比特后,数据通过 IO gating 被发送给灵敏放大器,存进译码出的地址里。
DDR4 和 DDR3 都在 IO 上有 ODT 管脚。ODT 功能使能时会产生额外的功耗,这些功耗别忘了统计在 DDR 的功耗内。DDR4 增加了更多 ODT 功能相关的模式寄存器(MR),增加系统的灵活性和优化信号的完整性。
值得注意的是,DDR4 增加了 Vpp 电源,用于 boost DRAM 内部的 word line 上的电压,所以 DDR4 和 DDR3 功耗统计的主要不同就是 DDR4 需要覆盖 Vpp 的功耗。Vpp 功耗主要发生在 ACT,PRE 和 REF 命令时。在图-2 中绘制了各个命令时的实时 Ipp 电流数值。
standby 电流
- I_PP2P
- I_PP2N
- I_PP3P
- I_PP3N
- 有时候会直接用 I_PP3N 的数值为其他三种电流的数值,因为他们都很接近
read 和 write 电流
- I_PP4R
- I_PP4W
active 和 refresh 电流
- I_PP0
- I_PP5B
图 2- Vpp 电流情况
2 DRAM 功耗计算
本文功耗计算用到的 I_DD 来自 Mircron 8Gb DDR4-2666 的数据手册。不同颗粒的 I_DD 可能不同,需要在计算功耗之前查询对应的数据手册。
3 功耗计算方法学概述
总共分 4 步
计算各个子模块的功耗
根据命令调度情况调整各子模块功耗
根据系统实际的工作电压 V_DD 和频率调整各子模块功耗
累加各子模块功耗得到总功耗
4 背景功耗
前文提过,CKE 是整个颗粒的总开关,CKE 置低时所有 DRAM 的输入端都会关闭,此时是 DRAM 颗粒功耗最低的运行状态,这时候如果所有的 Bank 都被 Precharge 了,那么此时的电流在数据手册里标记为 I_DD2P,而如果任意 Bank 打开着,那么其电流被标记为 I_DD3P。
CKE 置高打开 DRAM 输入 IO 和命令译码器,使 DRAM 可以接收 ACT,PRE,READ 和 WRITE 等命令,这些活动会增加额外的功耗。此时的电流按照 Bank 有没有 activie,分别记为 I_DD2N 和 I_DD3N。
图 3 描述 CKE 变化时 DRAM 随之的功耗变化,此时所有的 Bank 都处于关闭状态。当 CKE 置高时,颗粒产生了最高 35mA 的 I_DD2N 电流。当 CKE 置低时,电流降低为 25mA,记为 I_DD2P。如果 DRAM 处于 active 状态,自然颗粒消耗的电流会更大,也就是更大的 I_DD3P 和 I_DD3N。
图 3 - CKE 对 I_PP 的影响
计算 DRAM 在这些状态下的 standby 电流是很简单的,I_DD/I_PP 电流乘以实际的电压值 V_DD/V_PP 即可。下表中的四种 I_PP 电流都使用 I_PP3N 表示。
数据手册中提供的电流都基于最差的电压情况(即最高电压值),DDR4 极端高压是 1.26v 的 VDD 和 2.75v 的 VPP。把手册中的数值带入上图中的公式即可得到以下的结果。
在正常工作期间,DRAM 的背景功耗是始终存在的,由以上四种类型的功耗按比例组成。因此实际的功耗由处于这四种状态的时间比例计算得到。即 Bank precharge 和 activie 的时间比例和 CKE 置低和置高的时间比例。
原文此处有详细的按照四种状态持续时间比例计算总背景功耗的例子,比较简单这里就不再赘述了。
5 Activate 功耗
在读写 DRAM 之前,需要使用 ACT 命令打开相应的 Bank 的 Row,ACT 命令和 PRE 命令成对使用,ACT 打开 Row,PRE 关闭 Row。图 4 展示的是 ACT 命令之后典型的 I_DD0 电流变化。在收到 ACT 命令之后,颗粒将消耗大量的功耗来进行地址译码,以及把数据从存储阵列中转移到灵敏放大器中。在完成数据转移后,DRAM 就保持在 active 状态,直到接收到 PRE 命令。 PRE 命令会让 DRAM 把数据还到存储阵列的老地方,并重置 Bank 为precharged 状态为下一次 ACT 命令做好准备
图 4 - ACT 命令前后 I_DD0 电流示意图
图中的蓝线表示两次 ACT 命令之间(tRC)的平均 I_DD0,图中的橘线表示始终存在的背景功耗,ACT 状态的 I_DD3N 和 Precharge 状态的 I_DD2N。在计算动态功耗的时候,要按照电流对应的状态去除这些背景功耗,如下图中的表格为例。
上图中的公式 10 里的 tRC 用的是数据手册里规定的最小 ACT 间隔,在实际系统中,ACT 之间的平均间隔一般不等于 tRC,所以引入一个 tRRDsch (tRRD_scheduled) 表示实际的平均 Row-Row ACT 间隔。接下来是两个实际的例子,一个 tRRDsch 大于 tRC,另一个是 tRRDsch 小于 tRC 的例子。
第一个例子 tRRDsch 为 52.4ns,大于 tRC 的 46.46ns,电流变化情况如图 5 所示。这时候 tRRDsch 为 70 个时钟周期,时钟频率 1333MHz。
图 5- tRRDsch 大于 tRC 时的 ACT-ACT 电流变化
此时,基于实际的 ACT 间隔,大于 tRC,所以实际的 ACT 动态功耗实际上会按比例减小,计算如下表所示。
第二个例子是 tRRDsch 小于 tRC 的情况。对于单个 Bank 来说,他的两个 ACT 相邻间隔是不能小于 tRC,但因为 DDR4 颗粒拥有多个 Bank,因此可以交织地打开关闭多个 Bank 的 Row,从而 DRAM 接收到的 ACT 命令之间的间隔可以小于 tRC。图 6 中是交织打开两个 Bank 时电流变化示意图,在 46.16ns 内,平均 ACT 命令之间的间隔是 23.08ns。图中的黄色曲线代表第一个 Bank 消耗的电流,其中也包括了静态的 I_DD3N 电流,紫色曲线代表第二个 Bank 打开时增加的电流,绿色曲线表示的是两者之和
图 6- tRRDsch 小于 tRC 时的 ACT-ACT 电流变化
在第二个例子中,因为 DDR4 的多个 Bank 可以交织打开和关闭,因此 ACT 功耗相比单个 Bank 时的情况增加了。推广开来,DDR4 最多拥有 16 个 Bank,因此总的 ACT 功耗需要考虑所有 Bank 交织 ACT&PRE 情况。
6 Write 功耗
在 Bank 被打开后,可以进行数据的读或者写操作,这两种操作大差不差,我们首先看写操作的功耗。图 7 是两个写命令(BL8)时电流变化的例子。
图 7- 写命令时的电流变化
写操作时的平均动态电流被称为 I_DD4W,同样地,计算动态电流时需要减去静态电流 IDD3N。Pds(WR) 计算公式如下表所示。
值得注意的是,写操作时在 VPP 上并没有动态功耗产生。
上述计算的是整个写操作时间内所有动态功耗,要计算实际的写功耗需要考虑写时间占整个操作周期的比例。从图 7 中可以发现,写命令 WR 本身不会产生功耗,真正产生功耗的是数据写周期,在这个 Burst 长度为 8 的例子中,共有 8 个写数据时钟周期。整个操作周期为两个 ACT 命令间隔的 36 个时钟周期,因此写数据的时间比例 WRsch% 为 22%,按比例计算得到 WRsch = 108.4 x 22% = 23.8mW。
这里举的是 BL8 的例子,那么在另一个 BC4 的 Burst 长度情况下,写功耗比例计算有区别吗?因为在 DRAM 内部 BC4 操作和 BL8 相同,只是忽略了后四个时钟周期而已,所以在计算写功耗比例时只要将 8 个周期减少到 4 个周期就可以了。
7 Read 功耗
读功耗与写功耗计算方式类似,笔者这里不再赘述,只贴出原文的图例和计算公式。
图 8- 读命令时的电流变化
以下章节将在后文中更新。
原文:知乎
作者:LogicJitterGibbs
相关文章推荐
- 一些PCIE知识整理——PCIe体系的拓扑结构
- 一些PCIE知识整理——带宽计算
- 译文:DDR4 - Initialization, Training and Calibration
- 快来看看用FPGA做的开源示波器(二)
- 【译文】 在综合中约束逻辑无关时钟
更多FPGA干货请关注FPGA的逻辑技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。