动态时钟配置下的SoC低功耗管理
(3)Idle模式
如果CPU核在当前状态下已经处理完所有任务,在很长一段时间内都将处于空闲状态,那么系统应该进入到Idle模式。在Idle模式下,只会关闭CPU核的时钟源,而所有的模块都保持原状。但在这种模式下,不可动态配置PLL,以得到不同的时钟频率;也不可以动态地管理各模块的时钟源,因为这个时钟Core已经休眠了,它没办法对功耗管理模块内部的寄存器进行配置。无论前一个状态是Slow模式还是Normal模式,系统都可以进入到Idle模式下;而当系统退出Idle模式时,它应该退回到前一个工作模式。当系统重新需要CPU核进行事务处理时,可以通过一个唤醒信号让系统退回到Slow模式或Normal模式。
javascript:window.open(this.src);" style="cursor:pointer;"/>
(4)Sleep模式
如果整个系统都已经处理完所有的事务,并且在很长的一段时间内都将处于空闲状态,那么系统应该进入到Sleep模式。在Sleep模式下,关闭CPU核和所有模块的时钟源。虽然可以从Slow模式或Normal模式切换到Sleep模式,但是当它退出Sleep模式时,系统只能回到Slow模式。因为为了进一步降低整个芯片的功耗,在Sleep模式时会同时关闭PLL,所以在它退出时只能回到Slow模式,然后根据当前的应用决定有没有再切换到Normal模式的必要。当系统需要再次进行事务处理时,可以通过一个唤醒信号唤醒整个SoC芯片系统。
3 功耗管理模块的实现
功耗管理模块主要由一个状态机、一些多路选择器和一些门控时钟电路组成。状态机的责职就是完成各种模式之间的切换和送出PLL的控制信号。多路选择器主要完成各种时钟源之间的选择,而门控时钟电路则完成CPU核和各模块时钟源的打开和关闭功能。图3是功耗管理模块中时钟源路线。
从图3中可以清楚地看出,在功耗管理模块中例示了两个PLL:一个是主PLL(MPLL),它提供整个SoC中除USB模块以外的所有模块的时钟源;另一个是次PLL(UPLL),它只对USB提供时钟源。MUX完成晶振时钟和PLL时钟的选择,被选中的时钟(FCLK)同时送到CPU核、HCLK和PCLK,然后根据各个模块的需要门控地送出时钟源。这是基于AMBA总线结构的SoC。根据AMBA总线的协议,CPU核、AHB上的模块和APB上的模块的时钟频率可以配置成倍比关系[6]。经过HCLK分频的时钟源只提供给AHB上的模块,而经过PCLK分频的时钟源只提供给APB上的模块。AHB_con 、APB_con、Core_con和USB_con一起管理SoC内部模块的时钟源供给。
4 动态时钟管理中的问题及消除方法
动态地配置整个系统的时钟频率,虽然可以很方便地控制好整个SoC芯片的功耗,但同时也带来了一些负面影响。功耗管理单元中的多路选择器和门控时钟电路是最有可能产生毛刺的,而毛刺对同步数字系统是致命的。它会导致同步的失败、数据的丢失、寄存器进入亚稳态,更为严重的是,使整个同步系统的功能失败。毛刺的产生是因为那些输入信号的时序匹配出现了问题,没有按照既定的顺序出现,或者说那些信号装转换的时机不合适。因此在RTL设计时要保证做到时序的匹配,以降低毛刺产生的可能性。
在功耗管理模块中有三种情况需要用到多路选择器:
a. 由Slow模式切换到Normal模式;
b. 在Normal模式下重新配置PLL;
c. 由Normal模式切换到Slow模式。
图4是功耗管理模块中的一个二选一MUX。它的控制信号是OscillatorOrMPLL,两个选择源是clk_MPLL和clk_Osci,输出是out_ClockSource。当OscillatorOrMPLL为“1”时,MUX选中clk_Osci;当OscillatorOrMPLL为“0”时,MUX选中clk_MPLL。在MUX选择其中任何一个时钟信号之前,clk_MPLL或clk_Osci必须已经稳定下来了。强调一下,这里的稳定不是指已经输送出完整的时钟信号,而是输送出高电平或低电平。这样当选择开关达到它们那一方时,接受到的是没有毛刺的且对整个SoC不会产生操作的时钟信号。虽然在这时因为这种操作把SoC的频率降了下来,但这是暂时的(大约2~3个晶振时钟周期),因此对整个SoC性能的影响是微乎其微的。接下来被选中的信号(clk_MPLL或clk_Osci)才开始输送出没有毛刺的时钟信号,从而最终送出的时钟信号是去除了毛刺的。
图5
图5是系统从Slow模式切换到Normal模式时的时序图。通过配置功耗管理模块的内部寄存器打开PLL,即in_PLLStartOrStop信号,由它触发Slow2Normal_r信号,表明当前将要从Slow模式过渡到Normal模式。然后,由这个信号触发Lock Time 计数器开始计数(计数值由PLL的IP提供商所给的公式中确定),接着先把晶振时钟的使能信号关掉,再把多路选择器打到MPLL那一方。最后,把PLL时钟的使能信号打开,这时得到的就是经过倍频的PLL时钟。
从时序图可以清晰看出,在时钟源切换的过程中,最终送出的时钟(out_ClockSource)频率会很明显地降低下来(大约是晶振时钟频率的1/3或1/2);但是如果选择的晶振时钟频率在10MHz以上,则不会对整个SoC芯片的性能产生影响。
至于门控时钟电路,已经有许多人在这方面作了很广泛的研究,本文不再对此作过多的解释[7]。
5 结 论
本文提出了一种SoC芯片的低功耗管理策略。其基本思想是,首先从全局考虑,在满足性能的前提下,根据各种应用环境动态地配置SoC芯片的时钟频率。然后,从局部单独考虑单个模块,通过判断它当前的工作状态决定是否打开其时钟源。
该低功耗管理方案已经应用于我们设计的一款SoC芯片——Garfield。经过表2所列Power Compiler的功耗分析,可以清晰地看出:在Slow模式下的功耗仅为Normal模式下功耗的17%左右,而在Sleep模式下的功耗更低。
表2 功耗分析结果
Slow | Normal | Idle | Sleep | |
功率/mW | 68.910 | 405.453 | 60.078 | 0.00142 |
工作频率/MHz | 10 | 60 | 10 | 0 |