摘要:复杂IC的低功耗设计是成功设计的关键。在基于单元的设计中,通过改变驱动力、β值和晶体管宽度等参数可以实现减小功耗和面积的最优化设计。本文将以实际例子详细说明IC的功耗优化设计方法。
在典型的综合和布局布线(SPR)流程中,通常使用静态库单元实现设计。在静态库中,单元的个数以及能实现优化的程度是有限的。这种方法的效率比完全用户定制设计更低。过去,由于SPR工具不能有效地在晶体管级实现自动化设计,因而静态库的这种局限性是不可避免的。其结果是无法在EDA设计流程中自动生成单元,而绝大多数需要手工实现。 随着第三方库设计公司的出现,现在的单元库常常采用外购的形式。
如果可以在设计流程中生成库,就能避免固定库元件的局限性,使性能提高10%到15%,面积减小25%,功耗降低25%甚至更多,面市时间也将因减少了设计的反复次数而缩短。这种方案适用于任何电路或逻辑类型。
尽管静态的标准单元库通常有很多逻辑功能,但是对于任何一个特定的逻辑功能,可用的晶体管种类数是有限的。在常见的有300个单元的库中,每一逻辑功能-如四输入的或门可以有一到十种不同的电特性。但是,晶体管体积却可能有成千上万种变化,产生的时序特性也各不相同。例如,对于给定的逻辑功能,改变β比值(P型晶体管和N型晶体管的宽度之比),就可以改变单元的驱动能力。如果一个单元由多级逻辑组成,还可以通过改变级间驱动力(drive strength)的比值来改变单元的特性。这样,每个逻辑单元的电特性可以有上千种可能的有用变化。
在选择晶体管的最佳体积时,应根据单元所处的电路状况来确定,包括单元的负载和前级的驱动力。较大的晶体管驱动负载的能力较大,但是加重了前级电路的负载,功耗也较大。如果可用的元件数有限,则不能实现全面的优化设计,设计周期、功耗、面积都会增加。
降低功耗的几种途径
静态CMOS模块的功耗可以用CV2f来近似表示,其中C为该模块的总电容,V为电压,f为设计频率。假定电压和频率在给定的设计中是固定的,则功耗与总电容大小成正比。影响功耗的还有其它因素,如在开关动作期间电源对地的短路等。但是,只要减小晶体管总宽度和互连电容,这些因素的影响将随之减小。
如果不受固定元件库的限制,任意设定晶体管体积可以在以下几个方面优化设计:
1. 减小关键路径的延时,提高性能;2. 避免了因为没有合适的库元件而使时序路径超出预算,不得不手工修改的情况,提高了时序/设计的收敛性。3. 减少设计中晶体管的总体积,降低功耗;4. 通过减小晶体管的总体积可使面积减小,也减小了互连电容,进而降低功耗。
图1所示为标准单元模块的时序路径。假设图中反相器的初始驱动力固定为触发器的输出驱动能力的4倍(表示为4x),同时假设被驱动门的输入电容为48个单位(以1x反向器的输入电容为一个单位)。
假设P型晶体管的驱动能力为N型晶体管的一半,而四输入或非门的上升沿和下降沿时间相同,则其输入电容是具有相同驱动力的反相器的三倍。在这里互连电容成为增大延时和功耗的重要因素,假设每一连线的电容为4。设定两个门的驱动力为m和n,用下式可计算通过路径的延时:
T = (3.0 × m + 4) / 4 + (3.0 × n + 4) / m + (48 + 4)/ n
例如,当第一个门是8x或非门,第二个门是16x或非门,总的延时为:
T = (3.0 × 8 + 4) / 4 + (3.0 × 16 + 4) / 8 + 52 / 16
= 7.0 + 6.5 + 3.25
= 16.75
忽略前级和后级电路的固定电容,该路径的输入电容为:
C = 4.0 + 3.0 × m + 4.0 + 3.0 × n
功耗与总电容量成正比,以1x反相器的功耗为单位。
门的驱动力越大,延时越小,但前级延时却随之增加。在一般的库中,每一单元有多种驱动力。假设驱动力的典型值为:1x、2x、4x、8x等。这样的库的最佳时序方案为:
m = 8x,n = 16x
该方案产生的延时为16.75,功耗为80.0。
在目标周期时间为16.75的条件下,上面的方案尽管驱动力逐级减小,而且第二个或非门的功耗很高,但是在使用固定库元件的条件下这是唯一能满足时序要求的方案。
产生派生单元的好处之一是提高时序和设计的收敛性。下面考虑在标准单元库中仅有1x的四输入或非门的情况。在这种情况下,m=1x、n=1x(唯一的可行情况),产生的延时为60.75,几乎是要求周期的四倍。很明显,这种方案不可行,必须重新进行设计。
虽然插入缓冲器有时可以缓解这种矛盾,但是缓冲器会产生额外的延时,使时序仍然无法达到要求。在库中添加由较小驱动力门电路加缓冲器组成的较高驱动力的门,同样于事无补。实际上,它与插入缓冲器的效果是一样的,反而不能单独改变各级的驱动能力。很多标准单元库中普遍存在缺少单级、高驱动能力的一些不常用门器件的问题。
自动生成派生单元可解决这一问题,更容易实现设计的收敛性。在这种情况下允许任意设定库元件的体积,因此可以根据下列条件下获得最佳延时:
m = 7.0x,n = 11.0x
在该条件下产生16.3个单位的时延,功耗为62.0个单位。
任意确定晶体管体积可以使晶体管体积减小30%、功耗降低22%(包括互连电容对减小功耗的贡献),而面积可减小30%。但是,如果目标周期为16.75,而且已经在设计的其它部分固定下来,在上例中减小路径的延时并没有什么好处。
如果选用周期为16.75,还可以进一步降低功耗。最佳方案为:
m = 5.3x,n = 8.1x
产生的延时为16.73,功耗为48.2,功耗降低高达40%。而且,晶体管体积减小了44%,视标准单元库的版图形式和布线密集度的不同,面积最多可减小44%。这将减小布线引起的电容,进一步降低功耗。
对于设计中时序并不关键的路径,甚至可以将功耗减小更多。例如,如果周期是16.9,而不是16.75,可以采用以下方案优化功耗:
m = 5.0x, n = 7.8x
这一方案的功耗为46.4,减小42%。
即使驱动力只能取整数,如限制m,n在整数内取值(如1x、2x、3x、4x或5x),依然可以降低功耗。方案如下:
m = 5x,n=9x
该方案产生的功耗为50.0个单位,降低了37%(略低于前方案的40%)。
功耗减小的平均大小与具体的设计和所用的静态库有关。假设SPR布线工具选用了满足时序要求的功耗最小单元。对于每一个单元都有一个替代单元,该替代单元满足通过该级的最低时序要求,但功耗最低。这个替代单元的大小可以在一定范围内随意调整,既可以大于相邻较小单元又可以与静态库中使用的单元一样大。例如,上例中16x单元可以用8.7x单元替代,仍然满足时序要求:
m = 8.0x,n = 8.7x
这一方案的延时为16.75。同样地,对于另外一级重复这一过程可以得出:
m = 5.0x,n = 8.7x
其延时为16.75,而功耗为49.1。由于没有考虑两级间的相互作用,这实际上并不是真正的最优结果。
使用这个简单算法,并用一个驱动力以2x的库,可以使用体积减少将近50%的单元替代。根据延时曲线特性,从统计学角度分析,替代单元有可能比最初选用的单元更接近体积小50%的单元所产生的时延,而功耗和面积减小25%,这只是相当保守的估计。根据这个结果可将单元分类的方法进一步改善。
前面的讨论都集中在驱动力的改变上,实际上这是几个可以改变的电参数之一。其它方法包括改变β值以及改变晶体管宽度。在任意定制晶体管的体积时,使用这些方法都可以缩短周期、降低功耗和减小面积。例如,如果上述例子中关键路径仅仅为最终负载从逻辑高降到逻辑低的变换,则最后一级中的P型晶体管就可省去。因为4输入或非门的P型晶体管占整个晶体管宽度的89%,这样既可以改善时序又降低功耗。省去这个P型晶体管,单元的功耗和面积都将减小80%左右,而总功耗在原来降低40%的基础上又降低40%(总共降低64%)。如果在静态库中包括所有能降低功耗和面积的单元,则库中的单元数目将大量增加,只生成在设计中能用到的单元可以避免产生太大的库。
进一步改善设计的时序、功耗和面积的最佳办法是逐一确定每个晶体管的体积。但是这对SPR、功耗和时序分析来说将会有很多的困难。Prolific公司的自动库生成工具是一个基于单元的方案,并对标准流程的影响很小;该工具可建立驱动力精确为0.1的库,用该工具生成的设计可用于光学接近校正(OPC)和相移掩膜(PSM)处理(图2) 。
根据流程设计所用工具的功能,在综合阶段使用基本库(实际上就是静态库)来生成设计。在布局和布线阶段后,进行缓冲器大小调整或通过在位优化(in-place optimization),根据给定的布线环境插入合适体积的单元。在这一流程中并没有限制在基本库中选择缓冲器大小,而是使用驱动力、β值、缩小因子等参数可改变的虚拟库。根据综合、布局和布线工具的能力,可以将这个库看作一个抽象的库,也可看作一个很大的单元。在满足周期的前提下,根据面积和功耗的减小要求选择单元。ProGenesis标准单元设计生成工具可以自动生成不属于基本库的单元,并用基本库对单元进行参数设置的方法对这些单元重新设置参数。
这样生成的库使得SPR工具更容易实现高质量的设计。而且,通过限制新生成单元的数量和单元间间隔大小,可以使增加单元的总数控制在合理范围内。如果要在基本库中包括所有可能的电性能变化,将需要数千甚至数百万个单元。根据经验,只需选用满足时序或功耗要求的单元,在数量为300个单元的库中增加50到150个单元,便能实现这种方案的许多优点。
由于消除了固定库的限制,上述自动化方案允许用户完全定制晶体管的体积。一旦SPR工具可以在晶体管级优化和定义器件,基本库就只包括一组逻辑功能、未定尺寸图和版图结构。所有的调整和优化完全由集成流程实现,包括从综合版图生成到晶体管级的过程。