软件层面的低功耗
为了降低处理器的功耗,软件程序应该在以下方面合理地调用处理器的硬件资源。
仅在关键的场景下调用耗能高的的硬件,在一般的场景下尽可能使用耗能低的硬件。
在空闲的时刻,尽可能让处理器进入休眠模式,以降低功耗。
系统层面的功耗
在SOC划分不同的电源域,以对SOC中的大部分硬件关闭电源
在SOC划分不同时钟域,以使小部分电路以低速低功耗的方式运行。
通过不同时钟域和电源域的组合,划分出不同的低功耗模式。为SOC配备电源管理单元PMU,以控制进入或者退出不同的低功耗模式。
软件可以通过使用PMU,在不同的场景下进入和退出 不同的低功耗模式。
处理器层面的低功耗
处理器指令集定义了一种休眠指令,运行该指令后,处理器核便进入休眠状态。
休眠状态分为 浅度休眠和深度休眠
浅度休眠状态,往往将处理器核的整个时钟关闭,但仍接通电源,因此可以降低动态功耗,但仍然有静态漏电功耗。
深度休眠状态,不仅关闭处理器核的时钟,还关闭电源,因此可以降低动态和静态功耗。
在深度休眠,断电后,其内部上下文可以通过两种策略进行保存和恢复。
在处理器核内部使用具有低功耗维持能力的寄存器 或者使用SRAM保存处理器状态。这种寄存器或者SRAM在主电源关闭后可以使用较低的漏电消耗保存处理器状态。
使用软件的保存恢复机制,在断点之前将处理器的上下文状态保存在SOC层面的电源常开域中,待唤醒、恢复供电后,使用软件从电源常开域中读取回来,加以恢复。
第一种方法速度快,但设计难度复杂。
模块和单元层面的低功耗
一个功能完整的单元往往需要配备独立的时钟门控,当该单元空闲时,使用时钟门控将其时钟关闭以降低动态功耗。
对于某些独立和规模较大的模块,划分独立的电源域来支持关闭电源,以进一步降低静态功耗。
寄存器层面的低功耗
1 使用时钟门控
2 减小数据通路的寄存器翻转
为了降低动态功耗,应该尽量降低寄存器的翻转。
以处理器流水线为例,每级流水线通常需要配置一个控制位vaild,以表示该级流水线是否有有效指令。当指令加载至此级流水线时,将vaild设置为1,当离开此级流水线,将vaild置为0.但是对于此级流水线的数据通路载体部分,只有在指令加载至此级流水线,才向载体部分的寄存器加载指令信息。 而当指令离开此级流水线时候,载体的部分寄存器无须清零。 此方法能够极大降低数据通路部分的寄存器翻转率。
以FIFO缓存设计为例,虽然理论上可以使用数据表项逐次移位的方式,实现FIFO缓存的先入先出功能。但是应该使用维护读写指针的方式实现先入先出的功能。 因为数据表项逐次移位的方式会造成寄存器的大量反转,相比而言读写指针保持了表项中的值不变,降低了动态功耗。
3 使数据通路不复位
数据通路部分可以使用不带复位信号的寄存器,不带复位信号的寄存器面积更小,时序更优,功耗更低。
锁存器层面的低功耗
锁存器相比寄存器面积更小,功耗更低,某些场合下锁存器可以降低芯片功耗。
SRAM层面的低功耗
1 选择合适的SRAM
2 尽量减小SRAM的读写
尽量一次从SRAM读读取一些指令,而不是多次读取SRAM
3 在空闲的时候关闭SRAM
关闭电源
组合逻辑层面的低功耗
1 减小芯片面积
使用尽量小的组合逻辑面积可以降低静态功耗。因此尽量将大的数据通路进行复用,以减小芯片面积。另外避免使用除法,乘法等大面积的运算单元,尽量将乘除法转化为加减法。
2 降低数据通路的翻转率
使用逻辑门控在数据通路加入一级 与门,使没有用到的组合逻辑在空闲时不翻转,从而降低动态功耗。
工艺层面的低功耗
使用特殊的工艺单元库
RISC-V架构的低功耗机制
处理器架构定义一条休眠指令 wfi指令。
wfi指令是专门用于休眠的指令,处理器执行到wfi指令后,将会停止执行当前的指令流,进入一种空闲状态。直到处理器接收到中断信号,处理器便被唤醒。
蜂鸟E203的低功耗机制
系统层面的低功耗
蜂鸟E203处理器配套的SOC整体上划分为3个时钟域。
JTAG接口时钟域,JTAG相关逻辑使用JTAG时钟。
主域,将所有的外设,存储器,总线以及处理器核置于 一个时钟域,。
常开域,此域使用极其低速的时钟,因为此域中主要包含看门狗计数器,实时计数器等计数器模块。使用低速的时钟作为时钟频率。控制计数器计数。
将SOC划分为3个电源域。
调试域,此域包含所有与调试相关的硬件模块,在不需要调试功能的场景下,关闭此域的电源以降低功耗。
主域,将所有的外设,存储器和总线以及处理器核均放置于一个电源域。
常开域,此域为看门口计数器,实时计数器模块。还包含电源管理模块。
蜂鸟E203处理器层面的低功耗
蜂鸟E203处理器层面的低功耗主要取决于wfi指令的实现。
检测core_wfi信号,当该信号为高电平,表示处理器核已进入休眠模式。SOC通过检测此输出信号确定处理器是否进入休眠状态,若进入休眠状态,则可以安全关闭其电源。
执行了wfi指令后将阻止处理器执行后续的指令,并要求处理器核中所有的单元完成正在执行的操作。在进入休眠模式后,如果新的中断到来,则会重新唤醒处理器,并将core_wfi置为低电平。
当处理器核执行了wfi指令后,时钟控制模块将处理器核所有单元的时钟门控关闭,处理器进入休眠状态。
蜂鸟E203在单元层面的低功耗
处理器核主要功能单元配备了独立的时钟门控,一旦功能单元处于空闲状态的周期,就自动将时钟关闭。
蜂鸟E203在寄存器层面的低功耗
1 使用门控时钟
将所有寄存器编码为D触发器,从而方便综合工具轻松识别,推断出IGG集成时钟门控,取得很高的时钟门控率。
2 减少数据通路的寄存器翻转
流水线或者数据通路的负荷部分 只在流水线加载时更新。在清空流水线时,寄存器中的值并不会清除,从而减小数据通路的寄存器翻转。
3 使数据通路不复位
对于大片的纯数据通路寄存器不使用复位信号。以减小面积并降低功耗。典型的如FIFO模块和通用寄存器组模块。
蜂鸟E203在锁存器层面的功耗
通用寄存器组模块 基于锁存器实现,可以大幅减小通用寄存器组占用的面积。
蜂鸟E203在SRAM层面的功耗
1 选择合适的SRAM
ITCM和DTCM均采用SRAM。单口SRAM最省电。 ITCM使用64位比32位具有更好的面积压缩比,有助于降低动态功耗。
2 减小读写SRAM
64位宽的SRAM可以一次取出64位指令流。降低功耗
64位宽的SRAM相比于32位,能够进一步降低取指令落入地址未对齐边界的概率。
3 空闲时关闭SRAM
SRAM均配备了门控时钟单元。
蜂鸟E203在组合逻辑层面的功耗
1 减小芯片面积
尽量复用较大的数据通路,或者运算单元
ALU中的数据通路复用,多周期乘除法器 也共用数据通路。
2 降低动态功耗
降低组合逻辑的翻转率。 蜂鸟E203处理器的每个运算单元的输入信号均额外配备了一级与门,当每个运算单元不被使用时,某输入信号被与门置为0. 从而使运算单元的输入组合逻辑部分在空闲时不发生翻转,降低动态功耗。
蜂鸟E203处理器中寄存器组模块的每个读端口都是一个纯粹的并行多路选择器,多路选择器的选择信号,为操作数的寄存器索引。为了降低功耗,读端口的寄存器索引信号被专用的寄存器寄存,只在执行需要读操作数的指令时才会加载。
从而降低读端口的动态翻转功率。
蜂鸟E203在工艺层面的功耗
涉及特殊的工艺单元库