棋子 · 1月9日

【低功耗】芯片低功耗-硬件

Perface

最近在做验证,有个待机启动小组的成员给我说最新的逻辑版本总线不支持P-Channel,需要换个版本。

我就挺纳闷这个玩意是啥?之前低功耗看过一点点知识,是关于Linux电源管理的。

这必须得看一下,免得逻辑忽悠我,于是就找了点资料,这里记录学习一下。

但是按照学习习惯,一定是先站在宏观的角度去看一下整个芯片的电源管理架构【ARM】。

内容为学习笔记,来自几位前辈的博客,非原创,链接见文中与文末。

随着芯片的集成化程度提升,很多模块都做到芯片的内部,比如isp、dsp、gpu,这样做成片上系统(System on Chip,简称SoC),好处是整个系统功能更内聚,板级面积会减少,但是芯片的体积却越来越大。

为了减少芯片面积、降低芯片成本、减少芯片功耗,逐渐地提升了芯片的工艺,从而降低了功耗,提升了能耗比。

光靠工艺的提升来减少功耗,还不够。

为了更好地功耗管理,ARM提出了功耗控制系统架构(power control system architecture,简称PCSA),用来规范芯片功耗控制的逻辑实现。

PCSA基于ARM的组件实现,规范包括:

  • 电压、电源和时钟的划分
  • 电源的状态和模式
  • ARM 电源控制框架和集成规范
  • ARM 特定组件的电源和时钟集成
  • 带有低功耗Q-channel和P-channel接口的IP

软件功耗管理都是基于芯片的相应功能实现的,接下来我们看一看这个PCSA具体由哪些部分组成,通过这些组成与整个功耗控制框架的学习,了解芯片上的低功耗是如何设计的。

文末注明参考资料出处,有一些无伤大雅小错误已更正,资料都是干货,致敬!

框架

基于ARM的软硬件管理框架

image.png

  • 首先用户发起的一些操作,通过用户空间的各service处理,会经过内核提供的sysfs,操作cpu hotplug、device pm、EAS、IPA等。
  • 在linux内核中,EAS(energy aware scheduling)通过感知到当前的负载及相应的功耗,经过cpu idle、cpu dvfs及调度选择idle等级、cpu频率及大核或者小核上运行
  • IPA(intrlligent power allocation)经过与EAS的交互,做热相关的管理。
  • Linux kernel中发起的操作,
  • 会经过电源状态协调接口(Power State Coordination Interface,简称PSCI)
  • 由操作系统无关的framework(ARM Trusted Firmware,简称ATF)做相关的处理后,
  • 通过系统控制与管理接口(System Control and Management Interface,简称SCMI)
  • 系统控制处理器(system control processor,简称SCP)发起低功耗操作。
  • SCP最终会控制芯片上的sensor、clock、power domain、及板级的pmic做低功耗相关的处理。

功耗控制框架

在SoC设计中,需要一个硬件模块能够配合操作系统的功耗管理软件或驱动,来完成顶层的功耗控制,这个硬件模块可以是硬件电路,也可以是一个低功耗的处理器。

考虑到灵活性,这个硬件模块一般是一个微处理器核(比如cortex-M0)加上一些外围逻辑电路做成的功耗控制单元(SCP)。

为了SCP能够完成SoC的功耗管理,又定义了一个功耗控制框架(power control framework,简称PCF),PCF包含了一些接口、组件、协议来配合SCP做整个SoC的功耗管理。

image.png

PCF是用于构建SoC功耗管理所需的标准基础设施组件、接口和相关操作方法集合。

其中,标准基础设计组件包括电源、时钟和接口组件

比如:支持SCP通过软件接口编程的电源策略单元(power policy unit,简称PPU)用于低功耗控制的低功耗接口(low power interface,简称LPI)。

1) PPU

PPU实现了软件控制power domain开关控制的功能,SCP向PPU发起对power domain的开、关操作,其中PPU会通过LPI向power domain发起复位/解复位、时钟开/关、电源隔离开/关的操作,然后PPU经由电源控制系统状态机(power control state machine,简称PCSM)控制power domain电的开、关。

image.png

2) LPI

LPI主要是指ARM的Q-channel和P-channel。Q-channel是ARM公司定义的一个低功耗接口,接口很简单,只有四根线。

从AXI的低功耗接口演变过来的,其用处是控制设备静止状态时的时钟和电源。控制器可以根据设备的工作状态或系统状态,发起低功耗请求。

设备可以根据自己的工作状态,从而决定是否接受请求。相比Q-channel,P-channel把PACTIVE信号加宽了,不再是一根信号,设备可以传递更多的工作状态给控制器。控制器会额外多发出一组PSTATE信号,描述切换power状态的请求。

image.png

电源域和电压域

为了更好地对电进行控制,ARM划分了两个电相关的概念:

  • 电源域(power domain)
  • 电压域(voltage domain)。

电压域指使用同一个电压源的模块合集,如果几个模块使用相同的电压源,就认为这几个模块属于同一个电压域。

电源域指的是在同一个电压域内,共享相同电源开关逻辑的模块合集。

即在同一个电源域的模块被相同的电源开关逻辑控制,同时上、下电。

一个电压域内的模块,可以根据设计需求,拆分到不同电源域。

因此,电压域对应的是功能是dvfs,而电源域的概念对应的是power gating。

如下图,不同颜色表示不同的电压域,

  • VBIG是大核处理器的电源供电
  • VLITTLE是小核处理器的电源供电
  • VGPU是图形处理器的电源供电
  • VSYS是系统电源

虚线框包围的模块表示可以做电源开关处理,比如处理器核

实线框包围的模块表示不能做电源开关,比如SCP

image.png

来自:黑客与摄影师

AMBA提供了,低功耗的接口。用于实现power控制功能。目前,AMBA里面,包含2种低功耗接口。

  • ◾Q-Channel:实现简单的 power控制,如上电,下电。
  • ◾P-Channel:实现复杂的 power控制,如全上电,半上电,1/4上电等。

ARM引入这2种低功耗接口,是为了满足不同的应用场景下,对power的控制。

在一些场景下,组件只有两种power状态,分别为power-up,power-down。因此对这种组件的power控制,只需要对其上电,断电即可。用Q-Channel,即可实现。

而在另外的场景下,组件拥有多种power状态,比如全上电,半上电,1/4上电等。因此对这种组件的power控制,就要复杂很多,不能简单的对其上电,断电即可,还需要额外的一些控制。此时,用Q-Channel,就不合适了,需要使用P-Channel。

嵌入式设备就没有什么s3、s4这些说法。但是像手机、电脑设备就会有。

比如在DynamlQ技术中,引入了L3 cache,并且每个core拥有自己的L1 cache,L2 cache,这样,整个系统中,cache的容量就变大了,相应的,消耗在cache上的功耗,也增多了。

此时,就需要复杂的对cache的power控制,来实现低功耗,比如对L3 cache,1/4上电,也就是只有1/4的L3 cache工作,其余的都断电,以此来节省功耗。此时,就要用到P-Channel。

下面首先来看看Q-Channel。

Q-Channel

Q-Channel是从AXI的低功耗接口中,演变过来。但是可以向后兼容。

1、接口

以下是Q-Channel的接口:

image.png

分为device端和power controller端(下文均简称为PMU)

  • device端,就是需要被电源控制的组件,比如core,外设等。
  • PMU端,就是提供电源管理的组件。

在Q-Channel中,将device的power状态,分成了2种,

  • ◾operational状态:device处于工作状态,简单理解为上电状态,下文称为上电状态
  • ◾quiescent状态:device处于停止状态,简单理解为断电状态,下文称为断电状态

接口如下:

image.png

2、Q-Channel接口的握手状态

ARM对Q-Channel的interface,定义了几种握手状态:

  • ◾Q_RUN: device处于上电状态。
  • ◾Q_REQUEST:device处于上电状态,但是在idle状态时,可以接收power request,进入断电状态。
  • ◾Q_STOPPED:device进入了断电状态。
  • ◾Q_EXIT:等待被提供时钟或者power的状态。当device得到外部提供的时钟或者power时,将QACCEPTn拉高,进入Q_RUN状态。
  • ◾Q_DENIED: device拒绝外部power的请求,不进入断电状态,而保持上电状态。
  • ◾Q_CONTINUE:PMU在Q_DENIED状态后,将QREQn拉高后的状态。

以下是编码:

image.png

下图是各个握手状态的切换:

image.png

对于握手信号,有以下的规则:

  • ◾QREQn只能在QACCEPTn为高并且QDENY为低时,才可以从高变为低。
  • ◾QREQn满足以下条件,才可以从低变为高
  • ◾QACCEPTn和QDENY都为低
  • ◾QACCEPTn和QDENY都为高
  • ◾QACCEPTn只能在QREQn和QDENY都为低情况下,才可以从高变为低
  • ◾QACCEPTn只能在QREQn和QDENY都为高情况下,才可以从低变为高
  • ◾QDENY只能在QREQn和QACCEPTn都为高情况下,才可以从高变为低
  • ◾QDENY只能在QREQn为低并且QACCEPTn为高情况下,才可以从低变为高

上面的这些原则,在设计P-Channel时,需要遵守的。

3、Q_Channel的握手协议

3.1、device接受PMU的power请求

以下是握手协议时序图:

image.png

  • 在T1,QREQn和QACCEPTn为高,Q_Channel进入Q_RUN状态。
  • 在T2,QREQn为低,PMU请求device进入断电状态,然后等待外设响应,此时Q_Channel进入Q_REQUEST状态。
  • 在T3,QACCEPTn为低,表示device接收PMU的请求,将自己进入断电状态。此时Q_Channel进入Q_STOPPED状态。
  • 在T4,QREQn为高,PMU请求device进入上电状态,然后等待外设响应。此时Q_Channel进入Q_EXIT状态。
  • 在T5,QACCEPTn为高,表示device接收PMU的请求,将自己进入上电状态。此时Q_Channel进入Q_RUN状态。
3.2、device拒绝PMU的power请求
  • 当外部PMU给device发送power请求,device可以拒绝该power请求。
  • PMU收到device的拒绝响应后,应取消该power请求。

image.png

  • 在T1,QREQn和QACCEPTn为高,Q_Channel进入Q_RUN状态。
  • 在T2,QREQn为低,PMU请求device进入断电状态,然后等待外设响应,此时Q_Channel进入Q_REQUEST状态。
  • 在T3,QDENY为高,表示device拒绝PMU的请求,自己保持上电状态。此时Q_Channel进入Q_DENIED状态。
  • 在T4,PMU接收到device的拒绝响应,将QREQn拉高,PMU请求device进入上电状态,然后等待外设响应。此时Q_Channel进入Q_CONTINUE状态。
  • 在T5,QDENY为低,表示device接收PMU的上电请求,将自己保持上电状态。此时Q_Channel进入Q_RUN状态。

4、device复位信号与Q_Channel的结合

复位信号,需要和Q_Channel的信号,进行组合。一般来说,复位信号,也会由PMU来控制。

组合分为以下2种情况。

4.1、RESETn复位无效时,QREQn为低

image.png

  • T2时刻,RESETn为高,复位取消。
  • T3时刻,QREQn为高,PMU向device请求上电。Q_Channel进入Q_EXIT状态。
  • T4时刻,QACCEPTn为高,device接受PMU的上电请求。Q_Channel进入Q_RUN状态。
  • T5时刻,QREQn为低,PMU向device请求断电,Q_Channel进入Q_REQUEST状态。T6时刻,QACCEPTn为低,device接受PMU的断电请求。Q_Channel进入Q_STOPPED。
  • T7时刻,将RESETn拉低。
4.2、RESETn复位有效时,QREQn为高

image.png

  • T2时刻,QREQn拉高,PMU向device请求上电。Q_Channel进入Q_EXIT状态。
  • T3时刻,因为RESETn为低,复位有效,device将QACCEPTn保持为低,Q_Channel保持Q_EXIT状态。
  • T4时刻,因为RESETn为高,复位无效。device将QACCEPTn拉低,响应PMU的上电请求。Q_Channel进入Q_RUN状态。
  • T5时刻,QREQn拉低,PMU向device请求断电,Q_Channel进入Q_REQUEST状态。
  • T6时刻,device将QACCEPTn拉低,响应PMU的断电请求。Q_Channel进入Q_STOPPED状态。
  • T7时刻,RESETn拉低。

5、QACTIVE

QACTIVE,是提供给device,给PMU发送power请求的信号。可以由多个来源的组合。如果为高,那么PMU要给自己上电,并且之后,不能给自己断电。

QACTIVE和握手信号(QREQn,QACCEPTn,QDENY)是独立开的。

5.1、请求上电和请求下电

image.png

  • T1时刻,device将QACTIVE拉高,向PMU发起退出断电请求。T2时刻,PMU将QREQn拉高,Q_Channel进入Q_EXIT状态,T3时刻,进入Q_RUN状态。
  • T4时刻,device将QACTIVE拉低,device向PMU发起进入断电请求。T5时刻,PMU将QREQn拉低,Q_Channel进入Q_REQUEST状态,在T6时刻,进入Q_STOPPED状态。
5.2、PMU不允许断电

image.png

  • T1时刻,device将QACTIVE拉高,向PMU发起上电请求。T2时刻,PMU将QREQn拉高,Q_Channel进入Q_EXIT状态,T3时刻,进入Q_RUN状态。之后,device处于上电状态。
  • T4时刻,PMU将QREQn拉低,PMU想让device进入断电状态,但是QACTIVE为高,表示device要一直处于上电状态。因此QACCEPTn持续保持高,Q_Channel一直维持在Q_REQUEST状态。device维持在上电状态。
  • T5时刻,因为之前QACTIVE拉低,device想进入断电状态,device将QACCEPTn拉低,响应PMU的断电请求,然后Q_Channel进入Q_STOPPED状态。device进入断点状态。

6、Q_Channel的实现

一般来说,device和PMU的时钟是异步时钟。因此,需要一些同步化

下图是同步化的框图:

image.png

ARM提供了以下的一些实现指导:

  • ◾被使用的所有信号,都需要进行同步化
  • ◾只有当Q_Channel进入Q_STOPPED状态是,才可以将时钟和power给关掉
  • ◾为了保证握手信号的正确性,QREQn,QACCEPTn,QDENY需要使用寄存器直接输出
  • ◾QACTIVE使用寄存器直接输出,或者是相关寄存器输出的组合输出。ARM强烈建议组合输出,使用或门。

7、Q_Channel的向后兼容

Q_Channel是从AXI的低功耗结构,演化过来。但是Q_Channel也可以兼容AXI的低功耗接口。

如下图,device使用AXI的低功耗接口,PMU使用Q_Channel。只需要按照如下的连接进行连接即可。

image.png

如下图,device使用Q_Channel,PMU使用AXI的低功耗接口,只需要按照如下的连接进行连接即可。

image.png

P_Channel

为了满足复杂的power管理的需求,arm提供了P_Channel的低功耗接口,来满足这样的应用场景。

P_Channel,提出了一个概念,叫power state transition,power状态的切换。在P_Channel的应用场景中,power的状态有很多,这个是实现自己定义的。

power的各个状态之间,是可以切换的。

2个最基本的状态:

  • lower-power状态:在这个状态下,power消耗比较少,device处于低功耗状态(具有部分功能)
  • higher-power状态:在这个状态,power消耗比较大,device处于正常状态(具有完整功能)

1、接口

以下是P_Channel接口。

image.png

分为device端和power控制端(下文简称PMU)。

image.png

  • PACCEPT和PDENY在握手中,只能有一个为高。PACCEPT表示接受请求,PDENY表示拒绝请求。
  • PACCEPT,PDENY,PREQ,PSTATE,必须是从寄存器直接输出。

2、P_Channel接口握手状态

对P_Channel的接口,arm也定义了一些握手状态。不过状态,有加入了RESETn信号的影响。

  • P_RESET:device处于reset状态
  • P_STABLE: device处于非reset状态,并且PMU没有发送power状态切换请求
  • P_REQUEST:PMU向device发送power状态切换请求
  • P_ACCEPT:device接受PMU的power状态切换请求
  • P_DENIED:device拒绝PMU的power状态切换请求
  • P_COMPLETE:device接受PMU的power状态切换请求后,PMU取消power状态切换请求
  • P_CONTINUE: device拒绝PMU的power状态切换请求后,PMU取消power状态切换请求

编码:

image.png

以下是状态转移图:

image.png

握手协议规则:

  • PREQ只有在PACCEPT和PDENY都为低情况下,才可以从低变为高
  • PREQ要满足以下的任意条件,才可以从高变为低:
  • PACCETP是高,PDENY为低
  • PACCEPT为低,PDENY为高
  • PSTATE满足以下的任意条件,才可以变化:
  • PREQ,PACCEPT,PDENY都为低
  • PREQ和PDENY为高,PACCEPT为低
  • PACCEPT只有在PREQ为高,并且PDENY为低,才可以从低变为高
  • PACCETP只有在PREQ为低,并且PDENY为低,才可以从高变为低
  • PDENY只有在PREQ为高,并且PACCEPT为低,才可以从低变为高
  • PDENY只有在PREQ为低,并且PACCEPT为低,才可以从高变为低

3、P_Channel的握手协议

握手协议,涉及到PREQ,PSTATE,PACCEPT,PENDY这4个信号。

3.1、device接受power状态切换

下图是该时序图:

image.png

在T2时刻之前,P_Channel处于P_STATBLE状态。

  • T2时刻,PMU拉高PREQ,将PSTATE置为STATE B。向device发送power状态切换请求,请求将device切换到STATE B的power状态。P_Channel进入P_REQUEST状态。
  • T3时刻,device将PACCEPT拉高,表示接受PMU的power状态切换请求。P_Channel进入P_ACCEPT状态。
  • T4时刻,PMU接收device的PACCEPT响应,拉低PREQ,取消请求。P_Channel进入P_COMPLETE状态。
  • T5时刻,device将PACCEPT拉低,表示完成power状态切换。P_Channel进入P_STABLE状态。
3.2、device拒绝power状态切换

下图是时序图:

image.png

  • T2时刻以前,P_Channel处于P_STABLE状态。
  • T2时刻,PMU将PREQ拉高,将PSTATE置为STATE B。向device发送power状态切换请求,请求将device切换到STATE B的power状态。P_Channel进入P_REQUEST状态。
  • T3时刻,device将PDENY拉高,表示拒绝PMU的power切换请求。P_Channel进入P_DENIED状态。
  • T4时刻,PMU接收到device的PDENY响应,将PREQ拉低,取消请求,并且把PSTATE置为STATE A。P_Channel进入P_CONTINUE状态。
  • T5时刻,device将PDENY拉低,P_Channel进入P_STABLE状态。

4、device的复位和初始化

device在复位时,必须将PACCEPT和PDENY置为低,但对PACTIVE没有要求。

P_Channel的状态为P_STABLE时,device的复位信号,才可以设置为有效。

当device的复位无效时,device要进入初始化,此时PMU要设置PSTATE信号值,device会在复位之后,采样该信号值,从而采用合适的初始化流程。PSTATE要在复位信号无效后要保持稳定。

device,要提供一个初始化周期时间,tinit。用来表示,复位之后,PSTATE需要保持多久时间,供device初始化使用。PSTATE在tinit时间之内,必须要保持稳定。

以下是时序图:

image.png

  • T1时刻之前,RESETn为低,复位有效,P_Channel处于P_RESET状态。
  • T1时刻,RESETn为高,PMU将PSTATE置为STATE A。P_Channel进入P_STABLE状态。
  • T2时刻,由于tinit的限制,PMU要将PSTATE一直保持在STATE A,以便device正确的初始化。device必须要在tinit时间内,采样PSTATE。此后,PMU就可以发送power切换请求了。
  • T3时刻,PMU将PREQ置高,并且将PSTATE置为STATE B,发送power切换请求。P_Channel进入P_REQUEST状态。
  • T4时刻,device将PACCEPT拉高,表示接受PMU的power状态切换请求。P_Channel进入P_ACCEPT状态。
  • T5时刻,PMU接收device的PACCEPT响应,拉低PREQ,取消请求。P_Channel进入P_COMPLETE状态。
  • T6时刻,device将PACCEPT拉低,表示完成power状态切换。P_Channel进入P_STABLE状态。
  • T7时刻,P_Channel在P_STATBLE状态,可以进行复位,外部拉低RESETn,P_Channel进入P_RESET状态。

下图,展示了,当复位时,PMU发送power切换情况的时序图。

image.png

  • T1时刻,PMU将PREQ拉高,并置PSTATE为STATE A,但是复位信号有效,device不接收PMU请求。P_Channel保持为P_RESET状态。
  • T2时刻,复位信号释放,因为PREQ为高,P_Channel进入P_REQUEST状态。device接收PMU的power切换请求。

之后的就和上面的分析原理是一样的了。

下图,展示了,复位后,PMU发送使device进入STATE A的power状态请求,当该转换完成后,PMU又继续发送使device进入STATE B的power状态请求。

image.png

PMU在发送下一个power切换请求前,必须保证上一个power切换请求,传输完毕。

5、多个power状态切换

利用P_Channel,PMU可以使device,来回切换不同的power状态。

image.png

在T0,device处于STATE A状态。

在T1到T4,通过P_Channel,使device进入STATE B状态。在T4,P_Channel进入P_STABLE状态。

在T5-T8,通过P_Channel,使device进入STATE C状态。在T8,P_Channel进入P_STABLE状态。

6、PACTIVE

PACTIVE,提供给device给PMU发送请求。PACTIVE的每一个bit,表示一种请求。bit为高,表示device发送请求给PMU,让PMU处理,bit为低,表示device没有发送请求给PMU处理。

PACTIVE和握手协议,是独立开的。PACTIVE是设计自定义的,请求完全自己定义。当然,也可以不使用PACTIVE,如果不是用PACTIVE,需要将PACTIVE置为0。

以下是PACTIVE的例子:

image.png

PACTIVE有3个bit,每个bit,映射到一个power状态,MSB具有高优先级。

  • PACTIVE[2]:  STATE C
  • PACTIVE[1]:     STATE B
  • PACTIVE[0]:  STATE A

T1时刻,device将PACTIVE设置为3'b011,表示device向PMU发送power切换请求,将自己切换为STATE B。

PMU接收到device的请求后,从T2到T5,向device发送power切换请求,并且切换到STATE B状态。最后P_Channel进入P_STABLE状态。

T6时刻,device将PACTIVE设置为3'b111,表示device向PMU发送power切换请求,将自己切换为STATE C。

PMU接收到device的请求后,从T7到T10,向device发送power切换请求,并且切换到STATE C状态。最后P_Channel进入P_STABLE状态。

7、对于device,需要提供的信息

为了PMU的设计的正确性,device需要向PMU提供以下的一些信息:

  • device支持的power状态,包括以下:
  • PSTATE定义和编码
  • PACTIVE每个bit代表的请求
  • 用于初始化power状态,推荐的PACTIVE输出
  • PACTIVE需要被忽略,或者一直置0的bit信息
  • power状态的切换,包括以下:
  • power状态切换之后的device行为
  • device拒绝power状态切换的条件
  • 复位释放后,用于初始化device的PSTATE的合理值
  • tinit值

8、实现

对于device和PMU来说,有各自的时钟,因此他们的时钟,是当成异步来进行处理的,所以需要同步化的操作。

下图展示了,P_Channel的实现框图:

对于PSTATE,PREQ,PACCETP,PDENY,需要从寄存器直接输出,在接收端,需要使用同步器,对异步输入信号进行同步化输出。

对于PACTIVE,如果是多个来源的组合,ARM建议使用或门来实现。并且每个对PACTIVE贡献的来源,必须是寄存器直接输出。

image.png

9、P_Channel使用例子

以下是P_Channel使用的2个例子。

9.1、独立的power domain使用P_Channel
  • device0处于power domain0,PMU使用PD0来控制。
  • device1处于power domain1和power domain2,PMU使用PD1和PD2来分别控制。

image.png

9.2、父子关系的power domain使用P_Channel

device1内部有3个power domain,分别为power domain0,power domain1,power domain2,但是domain0是domain1和domain2的父domain,也就是domain0控制domain1和domain2。

PMU和device1有3个P_Channel接口,但是都是在power domain0中。

image.png

参考资料

作者:Hcoco
文章来源:TrustZone

推荐阅读

更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
10965
内容数
1214
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息