通过上一篇文章我们知道了现代数字CMOS电路最主要的功耗为动态功耗,其中动态功耗的主要组成部分又是容性功耗,这一部分功耗又是可以通过我们的设计去优化的。因此需要我们重点去掌握和分析。
本篇文章的内容偏理论分析,需要大家多多思考,动手演算才能取得较好的学习效果。
首先回顾一下容性功耗的公式:
其中 � 代表开关活动率,指的是一个电路里面,一个时钟周期内,不同输出节点从0跳到1的平均数,该平均数与以下几个因素有关系:
- 与电路的逻辑功能相关
- 与电路输入之间的时间和空间相关
- 与输出节点的毛刺和寄生信号的变化相关
下图所示的输出信号,它的开关活动率为 26
下图是个具体的例子,说明了不同情况下如何去分析开关活动率�,我们需要列出所有的可能情况,然后去算相应的开关活动率。图中所说的空间相关指的是不同输入信号在同一时刻彼此之间存在的联系,它们的组合存在一定的限制。而时间相关指的是同一信号自己存在前后的数据依赖关系(有点类似于有限的状态变化,可以简单理解为是一个有限状态机)。时空相关则是二者的结合。
上述考虑的是理想的信号翻转,即不存在毛刺,下面考虑出现毛刺的情况:
- 当输出节点出现毛刺的情况下,会附加从0到1的变换,进而导致开关的活动率提高。
- 对于数据通路很强的通路,毛刺的功耗可以达到40%。
- 如果想要进行计算,可以利用时间段的概念来计算出现毛刺时的开关活动率。我们看下面这个例子,当a进行翻转而b保持不变的时候,a到x之间存在一个逻辑门的延迟,假设c和a同时进行翻转,那么z就会出现毛刺,从而导致能量浪费。
进一步进行分析,假定时钟周期为 ���� ,最小门延迟为 ��� ,输入信号为平稳随机的输入信号x(t),因此相应的时间段S为 �=���� / ���
基于时间段的概念,可以进一步推导出信号 �� 更多的信息:
进而可以得到信号在 ��(�) =0的前提下, ��(�+1)=1 的概率,即 ���1/0=���0−>1���0−>1+���0−>0
因此基于信号的条件概率或变化概率可以完全确定信号的特点!
我们简单看一个习题,巩固一下上面所讲的内容:
掌握了这一方法,有什么用呢?那当然是知道怎么做题啊(bushi
当然是为了更好的分析现在的开关活动率,以及怎么去优化开关活动率
我们再看上面提到的那个例子,这样的一种翻转情况概率,可以用动态逻辑实现,从而降低功耗
我们在这里重点考虑毛刺功耗,首先回顾一下上面那个毛刺产生的例子,针对这样的情况可以使用基于延迟平衡的技术:
- 门的所有的输入信号要同时到达
- 电路总的延时基本不变
- 需要在某些路径插入buffer以平衡延迟
如下图所示,这里假定右下角的那个1上面的输入为A,下面的输入为B。
如果不插入这一个buffer,那么大概率A的变化和B的变化不会同时到达,这样就产生了毛刺,从而带来了信号翻转,引起了动态功耗。因此插入Buffer是数字后端甚至是FPGA或数字前端设计中很常见的一个优化策略。
此外对于每个门的一个逻辑输入,门的输出不应该有多于一次的翻转,否则会浪费能量。
我们看下面这个例子,由于门的内部延时小于相邻两次逻辑输入间的间隔时间,从而导致了输出进行了两次翻转。为了避免这一点,要保证门的内部延时大于相邻两次逻辑输入的间隔时间。
我们再回顾一下容性功耗的公式:������2����
当电源电压的下限取决于外部限制或者当减小电源电压引起的性能降低是不能接收的时候,减少功耗的唯一方法就是减小等效电容。(系统的吞吐率决定了不能够再降低频率 ���� ,电压的优化下一节课再分析)
- 减小实际电容和减小翻转活动性
- 减小实际电容可以改善电路的性能
- 组合逻辑电路中大部分电容是晶体管电容,即栅电容和扩散电容,这表明要保持晶体管有尽可能或合理的最小尺寸
- 晶体管尺寸太小会影响电路性能,但是可以通过逻辑或者结构上的加速技术来弥补
接下来通过两个题巩固一下上面所讲的内容:
解析:从该题的晶体管实现方式可以看出,这是一个动态电路的实现方式, �=��¯+�¯�¯ 。当NMOS阵列导通的时候,f的取值为0。因此
�=�(�=0)=�(��¯+�¯�)=�(��¯)+�(��¯)=�(�)�(�¯)+�(�¯)�(�)=3/4∗2/3+1/4∗1/3=7/12
我们再看一个问题:
很明显A是对的,因为A的逻辑门延迟更长,尤其是最右边的这个逻辑门,没有做buffer的情况下,两个输入到达的时间会差很多,会有很长的一段毛刺。设计中要避免这种情况,多写能生成右边这样电路的代码。
再看一下C选项,没什么问题,这是我们开始得出的结论。当门内部延迟大于输入信号的延迟的时候,也就是输入信号的延时达不到门内部延时的值,因此自然会减少了毛刺的影响。
再看一下D选项,单个门的设计风格当然会影响开关活动率,比如某些情况下用动态逻辑实现可以减少开关活动率,优化设计。
回顾一下本节的内容:我们对功耗进行了分析,重点讲解了开关活动率,毛刺功耗对开关活动率的影响,如何从开关活动率的角度去优化设计。这一部分内容不多,但是比较重要,需要大家掌握大概思想。
下一节是低功耗设计中最重要也最常见的内容,功耗降低技术,我将从系统级、RTL级、门级、电路级和版图级别去讲解相应的低功耗技术和优化方法,这一部分内容。无论你是架构师还是RTL民工,都是必须要掌握的。校招或者社招面试都会经常问到相关的内容。下一节预计周五左右更新。
本节内容主要参考之前上课的课件以及Keshab K. Parhi教授的《VLSI数字信号处理系统:设计与实现》第十七章,如有侵权请联系我删除。