在早期的IC设计中,关注的参数主要是性能(timing)和面积(area)。EDA工具在满足性能要求的情况下,最小化面积。此时,功耗是一个不怎么被关心的问题。
因为CMOS工艺在相对较低的时钟频率下具有相当低的功耗,漏电流可忽略不计。随着晶体管密度和时钟频率的提高,CMOS工艺的静态功耗也大幅增加。同时,电源电压和阈值电压的降低导致漏电流增加。
这些因素使得功耗成为影响性能和面积的关键参数,功耗问题变得和性能/面积一样重要了。
功耗过高会带来多方面的负面影响。
IC设计中要考虑动态功耗和静态功耗。
动态功耗由开关功耗和短路功耗组成。开关功耗是电路负载电容充放电时消耗的功耗。短路功耗是电路逻辑状态变化时流过PMOS管-NMOS管的短路电流消耗的功耗。下图展示了开关功耗的原因。
反相器输出从0变为1时,通过PMOS管对负载电容充电;从1变为0时,通过NMOS管对负载电容放电。因此,动态功耗与电源电压、电容负载、时钟频率和开关活动有关。
在早期CMOS技术中,泄漏电流很小。但是,随着晶体管尺寸和阈值电压减小,泄漏功耗增大,有时甚至达到动态功耗水平。晶体管只要接通电源,就会产生泄漏电流。减慢或停止时钟不能降低泄漏功耗。只有降低或关闭电源电压才能减少或消除泄漏功耗。
降低功耗是数字IC设计中的一个重要目标。为此,可以从RTL级别和门级别采用不同的设计策略。时钟门控(clock gating)是一种常用的方法,可以在寄存器保持不变的时候停止其时钟信号,从而减少动态功耗。其他的方法,例如动态电压和频率调节,虽然可以根据工作负载调整电压和频率,但实施难度较大。
随着工艺技术的进步,功耗问题变得越来越突出,需要开发更多的方法来满足设计的功耗要求。
降低电源电压是一种最基本的降低功耗的方法。因为功耗与电源电压的平方成正比,如图所示
如果电源电压降低50%,则功耗可以降低75%。CMOS技术为了降低功耗,不断降低电源电压。从20世纪80年代双极TTL电路的5V供电开始,到目前的先进工艺,电源电压已经降到约1 V左右。但是降低电源电压也会影响开关速度和抗噪声能力,并且增加泄漏电流和接口难度等问题。
时钟门控是一种有效的降低动态功耗的方法,它可以在寄存器保持相同逻辑值的时候停止其时钟信号,从而避免不必要的开关活动。时钟门控的实现如图所示:
时钟门控适用于在多个时钟周期内需要保持相同逻辑值的寄存器。关闭时钟可以节省每个时钟周期重新触发寄存器所消耗的功耗。时钟门控的主要挑战是找到合适的位置,并在合适的时机生成时钟门控信号。 时钟门控是一种成熟的降低功耗技术,已经被广泛使用了很多年。Power Compiler等综合工具可以在时钟路径上自动插入时钟门控单元。时钟门控实现起来相对简单,因为它只需要修改网表。
一些CMOS标准单元工艺库提供了具有不同阈值(Vt)的标准单元。这样,标准单元库可以提供具有不同阈值电压的标准单元来实现相同的逻辑功能。例如,该库可以提供两个反相器单元:一个使用低阈值(Low-Vt)晶体管,另一个使用高阈值(High-Vt)晶体管。
综合工具可以根据速度和功耗之间的trade-off选择合适类型的标准单元。
例如,它可以在关键路径上使用低阈值单元,在非关键路径上使用高阈值单元。
芯片的不同部分可能具有不同的速度要求。例如,CPU和RAM模块可能需要比外围模块更快。如前所述,较低的电源电压可以降低功耗,但也会降低速度,如图所示。
在单个芯片上提供两个或更多电源电压会带来一些复杂性,并且电源网格必须将每个电压源分别分配给适当的模块。如果逻辑信号从一个电压域进入另一个电压域,则需要一个电平转换器(level-shifter)单元产生具有合适的电压摆幅的信号。在上图所示的示例中,电平转换器将1.0V的信号转换为1.5V的信号。电平转换器本身需要两个与输入和输出电源电压相匹配的电源。
电源开关是一种降低功耗的技术,它可以在芯片的一部分不需要工作时将其断电。
例如,在手机芯片中,当手机处于待机模式时,可以关闭语音处理模块。当用户拨打或接听电话时,语音处理模块必须从断电状态“唤醒”。
电源开关可以显著降低总体功耗,因为它既降低了静态功耗又降低了动态功耗。但它也带来了一些其他挑战,包括需要电源控制、电源开关网络、隔离单元(isolation cells)和保留寄存器(retention registers)等。
电源控制是一个逻辑块,用于确定何时断电和上电。打开和关闭电源需要一定的时间和功耗成本,因此电源控制器应确定合适的断电时间。可以被断电的模块必须连接到由大量串联晶体管组成的,在always-on的电源轨道和电源引脚之间的电源开关网络。电源开关网络分布在模块的周围或内部。
采用多阈值CMOS(MTCMOS)工艺的高阈值晶体管作为电源开关是因为它们可以最大限度地减少泄漏功耗,并且它们的开关速度不是非常关键。PMOS开关可以放置在VDD和模块的电源引脚之间,NMOS开关可以放置在VSS和模块接地引脚之间,如图所示。
要合理地选择开关的数量、驱动强度和位置,以保证在模块工作时达到可接受的电压降(IR Drop)。
上图所示的电源开关策略称为粗粒度策略,因为整个模块共用一个或多个并联的电源开关。在细粒度策略中,每个库单元都有自己的独立的电源开关。细粒度策略可以进一步降低功耗,但也需要更多的面积。
在信号从断电模块传输到always-on模块时,需要使用隔离单元(isolation cells)。隔离单元可以在断电模块断电时向always-on模块提供一个固定的逻辑值,从而避免可能产生的泄漏电流。隔离单元的一个简单实现如图所示。
当左边的模块上电时,信号Iso为低电平,输出信号通过隔离单元不变(除了延迟)。当左边的模块关闭时,Iso为高电平,输出信号保持恒定的逻辑0。其他类型的隔离单元可以保持逻辑1或者断电时的信号值。在模块断电期间,隔离单元本身必须有always-on的电源。
电源开关可以与多电压技术结合使用。不同的模块可以在不同电压下工作,并且也可以分别断电。在这种情况下,不同模块之间的接口单元必须同时具备电平转换和隔离功能。这种类型的单元称为使能电平转换器(enable level shifter)。该单元必须有两个独立的电源,就像普通的电平转换器一样。
当模块被断电后再上电时,通常需要模块恢复到断电前的状态。有几种方法可以实现这一目标。例如,断电前可以将模块内的寄存器内容复制到模块外的RAM中,然后在上电后再复制回来。
另一种方法是在断电模块中使用保留寄存器。断电前,保留寄存器可以将数据保存到影子寄存器(shadow register)中,在断电期间保留数据。上电后,它可以将数据从影子寄存器恢复到主寄存器中。影子寄存器有always-on的电源,但它使用高阈值晶体管,以最大限度地减少断电期间的泄漏功耗。主寄存器使用快速但漏电的低阈值晶体管。保留寄存器的一个实现如图所示。
SAVE信号在断电和恢复之前将寄存器数据保存到影子寄存器中,RESTORE信号在上电后恢复数据。保留寄存器使用电平敏感的控制信号,而不是边沿敏感的SAVE和RESTORE信号。
保留寄存器占用比普通寄存器更大的面积,并且除了模块其余部分使用的电源外,它还需要一个always-on的电源。
在多电压技术的基础上,可以根据芯片的实时工作负载动态地调整电压和频率,从而优化功耗。例如,在笔记本电脑中,处理器芯片在执行简单的电子表格计算时可以使用较低的电压和频率,从而节省功耗;而在进行3-D图像渲染时,则可以使用较高的电压和频率,以提高性能。这种根据工作负载要求变化供电电压和工作频率的技术称为动态电压和频率调节。
芯片电源可以设计为具有多个离散的或连续的电压等级。动态电压调节需要有多级电源和逻辑模块来确定给定任务所需的最佳电压等级。
由于存在多种可能的电压等级和频率组合,设计、实现、验证和测试都非常具有挑战性。
动态电压调节可以与电源开关技术相结合。设计中的模块可以在不同的电压等级下工作,以满足不同的性能要求,或者在不使用时完全断电。