今天开始打算开一个新的系列:低功耗设计。对我自己来说,低功耗设计的经验虽然算不上非常丰富,但是至少在做过的项目中有些在低功耗方面要求极高,因此对低功耗设计的一般做法和主要手段还算有些了解。同时鉴于某些公司由于产品类型、技术、市场等诸多方面的限制让很多同学完全无法接触到低功耗设计,因此想借次机会和大家聊聊我的一些基本经验和感受。
尽管如此,仍然需要承认,对于低功耗设计本人完全谈不上有多精通,很多细节我也不见得理解地有多到位,因此希望有经验的同学共同探讨,不吝赐教。
今天我想先从基本概念说起,对基本概念已经比较清楚的同学可以跳过。
对低功耗设计的追求缘起于日渐膨胀的芯片功能,不断增高的运行频率和随之而来的高功耗与高发热等方面的因素渐渐对设备整体性能造成越来越严重的影响。CPU在高功耗和高发热方面的问题人尽皆知,因此很多电脑都需要额外的散热设备;移动设备上充电间隔越来越短,这固然因为电池技术迟迟没有重大突破,但是芯片的高功耗也难辞其咎。因此在多年前,业界就对低功耗设计做了大量的理论和实践的尝试,积累了很多至今仍广泛应用并行之有效的手段。
从原理上说,功耗即为功率,指的是单位时间内消耗的能量。在此我们不再详述功耗的原理,直接引出在芯片设计上常用的低功耗设计思路:
上面列举了芯片设计领域比较常见的低功耗设计方向,其中应用最多的就是优化芯片架构,升级生产工艺、降低芯片工作电压、采用不同速度的标准单元,分区域采用不同电压的电源以及模块关断(多电压域),而其中和后端设计有关的,基本上有以下几种:
升级生产工艺;
降低芯片工作电压;
关断部分时钟(Clock Gating);
采用不同速度的标准单元(Multi-Vth库);
多电压域设计(Multi-Voltage)。
在详细解释上述概念之前,我想先把芯片中主要的功耗构成简单提一下。芯片功耗主要分为静态功耗和动态功耗,基本原理如下图所示:
关于静态功耗和动态功耗的细节方面可以参考本专栏之前的文章:【数字后端基础之:芯片的整体功耗是如何计算出来的?】在上述各种低功耗设计手法中,也是从降低这两方面的功耗出发的。下面我们详细解释一下这几种与后端息息相关的低功耗设计方法。
- 升级工艺
这是应用最广泛,最行之有效的方法之一。它的原理在于,随着晶体管的尺寸越来越小,leakage power在芯片整体功耗中所占的比重越来越大,而先进工艺的晶体管尺寸更小,泄漏电流也更小,从而能够整体降低leakage power。因此我们经常能够看到这样的新闻:某某芯片从22nm升级到14nm,性能提升x%,功耗降低y%等。这其中的功耗降低固然可能包含架构方面的改善,但是工艺升级带来的优势一定是非常明显的。
上图是TSMC公开资料中最近几代工艺的PPA比较,其他foundary厂的工艺参数在变化趋势上应该大致相同。正因如此,众多手机用的SoC,包括但不限于苹果A系列、高通骁龙系列、华为麒麟系列、三星Exynos系列等,每一代都迫不及待地争抢最先进工艺上的实现,就是因为先进工艺带来地功耗和性能优势太过明显,以至于谁都无法忽视。
- 降低芯片工作电压
按照中学物理的计算公式,功率与电压和电流的乘积正相关。在芯片上计算功耗虽然没有这么简单,但是从原理上降低芯片电压仍然是降低功耗最直观最有效的方法。也正因为如此,当前大多数芯片的工作电压从最初的5V、3V一路下降,目前基本都在1V以下甚至0.5V以下。而随之而来的困难在于,随着电压的下降,标准单元的速度也会随之变慢,但是电子设备对处理速度亦即芯片频率的要求却越来越高。以移动设备为例,最初的芯片频率不过几十上百兆赫兹,而现今最快的手机SoC频率峰值已经超过2GHz。这方面也是每一代芯片升级背后所需要解决的技术难题之一。
- 关断时钟(Clock Gating)
动态功耗主要是由信号的翻转引起的,而在芯片中,翻转最频繁的信号就是时钟(Clock)信号。我们知道,芯片中各种逻辑功能的传输,数据保存等电路是由下列timing path组成的:
简而言之,就是前面的FF1寄存器的数据通过一系列运算后,在时钟信号clk的作用下,被后面的FF2寄存器捕捉,完成一次数据传输。但在实际中会有这样的情况发生:FF1传过来的数据和FF2当前保存的数据相同,也就是FF2的数据无需翻转刷新仍能保证功能的正确性,而此时clk仍然翻转一次刷新了FF2的数据。这种情况尽管在功能上没有任何问题,但是在功耗方面却是实实在在的浪费。因此,在电路设计阶段以及逻辑综合阶段,设计者和EDA工具会根据芯片的功能和实际数据的变化情况,人为或者自动地插入一系列的clock gating cell,从而保证仅在数据发生变化的时候信号才会翻转。下面是典型的Integrated Clock Gating(ICG)的结构:
- 采用不同速度的标准单元(Multi-Vth库)
这是当前芯片行业最常用也是最容易使用的设计方法之一。所谓Vth,指的是逻辑门的阈值电压。而阈值电压和功耗与速度存在如下关系:阈值电压越高,cell速度越慢,功耗越小;反之阈值电压越低,cell速度越快,功耗越高。
在实际应用中,一般采用的策略为:对于性能要求高的模块,或者频率比较高的部分,采用Vth比较低的cell,让setup更容易收敛;对于性能要求较低的模块,或者频率较低的部分,多采用Vth比较高的cell,让功耗更低。通过这种方法,可以实现在同一块芯片上,根据性能和功耗的不同要求而调整cell的使用,从而避免在不太重要的功能上浪费过多的功耗。
- 多电压域设计(Multi-Voltage, Power Gating)
在使用手机的时候,我们经常会遇到这种情况:当我们看到电池快要没电而手头有没有充电设备的时候,我们会尽量关闭所有应用,不再听歌不再看视频,甚至连地图的定位与导航功能都不再开启,其根本目的就在于减少消耗电池的功能。在芯片设计中也引入了这种理念:一颗SoC中可能包含很多功能模块如视频处理(DSP),音频处理(AUDIO),定位(GPS),游戏(GPU),存储(Memory)等,但大多数功能并不会同时开启,因此为了降低不用模块在等待状态下消耗的功耗,干脆就设计成在不用的时候把它们关闭。这就是Power Gating最初的想法。与此同时,对于性能要求较高的CPU,GPU等模块,由于需求频率较高,在设计上可能采用较高的电压,而一些不太核心的模块如AUDIO,GPS等,可以采用相对低的电压来设计。这样一来,整颗芯片可能就会变成下面的样子(下图不影射任何实际芯片):
这样一来,芯片的功耗最低时仅有一个CPU内核处于开启状态,可以大幅度减少其他模块在等待时的电量消耗,从而增加电池使用时间。
尽管它的思路很简单,但是在实际设计中不管是不同电压还是模块关断,都会带来很多额外的问题,这些问题以及业界普遍应用的解决方案我们将在后面的文章中一一提及。
今天关于低功耗的基本概念就介绍到这里,这篇文章是在假设各位读者有了基本的芯片设计概念的基础上写的,如果大家有任何不懂的概念或者名词,请留言或者加群讨论。
相关文章
如果大家有任何后端技术与职业发展方面的问题,抑或关于数字后端感兴趣的技术话题想要了解和探讨,欢迎关注我的知乎专栏: 数字IC后端设计工程师修炼之路同时欢迎关注微信公众号:数字后端芯讲堂,一起探讨技术,共同提升!
本极术专栏也会同步更新芯片设计后端的技术干货,也请关注数字IC后端设计工程师修炼之路。