|
楼主 |
发表于 2010-5-7 13:10:28
|
显示全部楼层
第十一部分 多电压域设计的实现
这一部分从实现的角度,介绍了芯片设计流程中每一个实现环节要重点考虑的低功耗相关问题。
这一部分以ARM1176JZF-S项目为例,先简单介绍一下这个项目。和前面项目一样,它包括一个CPU核、一个cache子
系统、存储器管理子系统、AXI总线系统。整个项目分为三个电压域:VSOC域永远上电,包括所有AXI总线上的单元;
VCPU域支持电压缩放和关断,包括所有CPU核逻辑部分;VRAM域包括Cache子系统。它和VCPU域一起缩放但在VCPU域
关断时保持上电。
要实现这样一个系统,与常规流程相比增加的工作包括逻辑上和物理上电压域划分、相关单元的插入(电平移位单元
、隔离单元、保持寄存器)、VCPU域电源开关网络的插入,还有在实现中检查电源网格的IR Drop、路径时序、电气完整
性等检查的工作。
在讨论设计流程之前,先引入两个概念:
Power Domain:(电源域)是一个逻辑上的概念、表明逻辑上各个模块间的电压关系。
Voltage Area:(电压域)是一个物理上的概念,表示芯片上用来布局一个power domain里相关单元的有一定几何尺
寸的区域。它是power domain物理上的实现,一个power domain在芯片上可能有多个不相连的voltage area。
power domain创建于流程中的综合环节,voltage area则对应流程中布局规划后的各环节。
在这个项目中,power domain和voltage area是一一对应的。
*设计划分
对一个设计进行各个电源域的划分意味着在模块接口间引入相关的单元(隔离、电平移位等),这些单元引入会对设
计的整体性能带来影响。设计划分的工作需要系统架构工程师、RTL工程师、物理实现工程师在理解了目标应用、功耗
性能指标、工艺特性后,共同参与才可以。
电源域的划分的一个原则是尽量和逻辑层次完整的吻合。否则,如果一个电源域需要跨多个逻辑层次会造成时序上
收敛的困难和设计复杂度的增大。而且尽可能减少电源域的个数和跨电源域的接口信号数目也有助于优化设计。
另一个原则是避免在已经是关键路径的地方划分电源域,电源域的接口会引入额外的电路增加延时,对路径延时不
利。对接口时序的充分考虑会极大帮助后续工作的顺利完成。另外,也要避免上电模块的状态值与断电模块内部状态值
相关,这样会减小接口单元的复杂度。
*设计流程一览
流程如下图
图一
可以看到和常规IC设计流程相比增加了以下步骤:
1、在RTL级定义好电源体系的spec
2、逻辑综合时创建不同的电压域(生成的逻辑网表应该包含电源相关单元,分析了各种电压/频率下的时序信息)
3、在布局规划阶段划分物理上电压区域、引入MTCMOS开关单元并对其综合(MTCMOS的size、个数等)
4、早期的电源网络性能分析
5、电源相关单元的布局优化
6、多电压域时钟优化
7、电源网络的布线,包含上电顺序的验证
*逻辑综合
多电源域的逻辑综合比常规综合增加了电源相关方面的考虑,包括引入的电源相关单元对时序的影响,对design
rule的影响等。它的输入除了RTL、SDC外还增加了对电源系统的描述。
对电源系统的描述可以有以下几种方式:
1、显示的在RTL中定义(手动例化移位器、隔离器等)
2、通过HDL语句(系统函数等)有RTL中定义
3、通过工具相关的命令定义
4、通过一个独立的标准格式的电源文件(UPF)
在这里,使用了UPF格式描述电源系统。下面列举典型语句,因为这一部分重点不在这里,不作具体解释了。
#定义电源域:
create_power_domain domain_name
[-elements list]
[-include_scope]
[-scope instance_name]
#插入隔离单元
set_isolation isolation_name
-domain domain_name
<-isolation_power_net net_name | -isolation_
-isolation_power_net net_name -isolation_
-no_isolation>
[-elements list] [-clamp_value <0 | 1 | latch
[-applies_to <inputs | outputs | both>]
#定义隔离单元控制方式
set_isolation_control isolation_name
-domain domain_name
-isolation_signal signal_name
[-isolation_sense <high | low>]
[-location <self | parent | sibling | fanout | automatic>]
#插入保持寄存器
set_retention retention_name
-domain domain_name
<-retention_power_net net_name | -retention_ground_net net_name |
-retention_power_net net_name -retention_ground_net net_name>
[-elements list]
#定义保持寄存器的控制方式
set_retention_control retention_name
-domain domain_name
-save_signal {{net_name <high | low | posedge | negedge>}}
-restore_signal {{net_name <high | low | posedge | negedge>}}
#移位寄存器的插入
set_level_shifter level_shifter_name
-domain domain_name
[-elements list]
[applies_to <inputs | outputs | both>]
[-threshold value]
[-rule <low_to_high | high_to_low | both>]
[-location <self | parent | sibling | fanout | automatic>]
[-no_shift]
多电源域逻辑综合对扫描链的要求
1、尽可能减少跨电源域的扫描链路径,如果跨电源域的扫描路径不能避免,要自动插入移位单元并考虑对时序的
影响。
2、尽可能将scan path限制在一个电源域内,这样可以在扫描测试时,一个电源域内的扫描链单独工作,避免所有
寄存器同时工作,芯片热量过大。
对always-on网络的综合
在门控电源的电路中,电源控制相关信号如电源开关信号、隔离控制信号、保持寄存器控制信号在电路断电时也
需要保持上电。这部分的电路被称做always-on网络,它与其它单元完全一样,只是电源是连在always-on电源网格上。
这部分工作现在已经可以由工具自动完成。综合工具可以自动识别这些单元,并从库中找到标有always-on属性的单元
用于电路网表中。尽管工具可以自动完成这一步骤,我们还需要在最后的电源验证中,检查这些控制信号通路是否连在
一直上电的电源上。
*多电压设计中的多边界条件优化
现代SOC设计中,一个芯片有多种工作模式是很正常的了。在多电压域设计中,又引入了多种工作电压、性能等级
和各种低功耗模式。这些增加的工作模式又会工作在各种PVT(process,voltage,temperature)条件下。这些模式和工作
条件组合,形成了各种我们称之为“场景”(scenarios)的工作状态。在实现的过程中,我们要对每一种场景进行分析
与优化。
在单电压电路设计中,我们的最差边界(对于建立时间)是最低的电压、最高的温度、最差的工艺条件。但在多电压
多频率设计中,系统的最差边界可能就不是在工作条件窗口的边界,而是在电压和频率的某一个组合值中。确定这个最
差边界的过程可以由EDA工具完成,工具需要工作在设计者指定的多种工作模式和边界条件下,在这些“场景”中确定
最差边界。这会消耗相当长的设计时间。
在实际多边界、多模式技术中,我们需要在最优结果和设计时间中取得平衡。定义全部的工作模式和边界会消耗
工具大量的优化时间也不一定能得出最优化的结果。一般来说,指定某几个特定的边界约束条件(SDC)进行优化设计,
最后在sign-off前用更复杂的工作模式、边界条件做STA分析是比较好的方法。
*设计布局规划
设计规划是低功耗设计最重要的一个步骤,是整个设计环节中会面对最主要设计挑战和可能对设计结果带来最大负面
影响的地方。设计规划确定芯片的全局拓扑结构。一般来说,全局拓朴会由许多因素决定,包括IO PAD的位置、存储器系
统的位置和其它硬IP的位置。这些都限制了设计者对布局的自由度和灵活度。从低功耗角度出发考虑布局不要给原有的布
局规划带来不必要的约束。
创建电压区域
在这一环节,我们要在物理版图上为逻辑上的电源域创建电压域。同一电源域的单元将会尽量放在一起,方便电源
网络的有效布线。
各个电压域的之间的相对位置关系要尽量保证各电压域接口这间有效的连接,避免跨其它电压域信号走线。和大多
数设计规划的任务一样,电压域的确定是一个需要反复迭代的过程,需要尝试各种形状、尺寸以达到最适合的电压区域。
我们建议每一个逻辑上的电源域都只有一个电压区域对应,尽管工具支持将一个电压域分成不相连的几个,但这样会增
加设计要考虑的因素。每一个电压域都需要有一个隔离带将其保护起来,与其它电压域隔离。设计中,逻辑上的电源域
可能会有不同电源域嵌套的情况,物理上的电压域要尽量避免嵌套,如果实在不能避免也要加上隔离带将其保护起来。
移位器是另一个要考虑的布局规划因素。前面说过,移位器由于驱动的原因需要放在目标电压域内,而移位器的输
入是不能插入buffer的,长的无buffer的线可能会造成信号时序的问题。这就要求,所有的移位器都要尽量放在目标电
压域的边界上。这会造成潜在的问题。比如接口上有一个宽的数据总线,则总线上所有path移位器都要放在目标电压域
的边界上,这些移位器会把边界的位置资源用完,造成其它移位器不得不远离电压域边界。解决这个问题的办法可以是
加大电压域的边界,将移位器分散在边界上,这样也可以减小两个电源域中单元的物理距离。
电源开关的拓朴
门控电源开关有不同的拓朴结构,第十四部分会有详细介绍。
大多数电源网络会设计成网格状。一般现代的工具会提供两种方式在电源网络上摆放开关,一种是指定x、y增量,
工具则均匀地在电源网格上摆放开关。另一种方式是告诉工具一个设计目标(提供电流能力或IR drop),工具会尝试各
种布局,然后给出多种方案供设计者选择。
开关的尺寸和位置是决定电源网格IR drop的关键,同时也决定着时序路径的延时大小。UPF中,开关由下面指令描
述:
create_power_switch switch_name
-domain domain_name
-output_supply_port {port_name supply_net_name}
{-input_supply_port {port_name supply_net_name}}*
{-control_port {port_name net_name}}*
{-on_state {state_name input_supply_port {boolean_function}}}*
[-on_partial_state {state_name input_supply_port {boolean_function}}]*
[-ack_port {port_name net_name [{boolean_function}]}]*
[-ack_delay {port_name delay}]*
[-off_state {state_name {boolean_function}}]*
[-error_state {state_name {boolean_function}}]*
过冲电流的管理
开关同时打开引起的过冲电流可能会造成电源网格上的电压尖峰,这个电压波动可能会破坏域中保持寄存器中的状
态或相临电源域中的数据值。
一个有效的办法是把这些开关分组,并把各组开关的开关信号用buffer串接起来形成一个菊花链,这样一组内的开
关同时打开,各组之间会有一个相对延时,避免同时打开造成的过大的过冲电流。每个开关组的大小决定着上电速度和
电源噪声的平衡。
几点建议
1、电压区域应该用保护带隔离
2、一个电源域中的单元尽量摆放在一个电压区域中
3、在物理实现中增加的新单元要确保放在适合的电压区域中,并和正确的电源网络相连
4、直接穿过一个电压区域的路径上避免在优化过程中和design rule fixing中加上新单元
5、隔离单元和移位单元尽量放置在电压区域边界上,使得其对时序的影响最小
6、尝试不同的开关拓朴结构,选择对于当前设计最优的,并且考虑电源走线对开关拓朴的影响
*电源网络设计
设计布局规划后就可以考虑电源网络的设计。电源网络设计的一个主要原则是减小网络上的压降。而低功耗引进的
各种技术都会不利于这个原则。
当代EDA工具都会提供某种程度上的电源网络综合(power network synthesis PNS)的自动化设计。设计中要尽量利
用这个功能分析许多互相影响的因素(如压降、布线资源等),手动设计很难达到最优结果。设计时,可以给PNS施加一
定约束,如最大压降、布线层次、穿孔的使用等。PNS会自动分析,并给出全局压降分析和电迁移分析结果。
电源开关晶体管的电源网络设计包括三个部分:永远上电的电源网、一个虚拟(受控)电源网和开关晶体管本身。这
部分网络的设计要考虑压降、布线资源和面积的因素。在以前的设计中,这部分工作都是手工写脚本插入和布局的,现
在的PNS工具已经可以自动这些因素,完成电源开关网络的布局和设计。
一些建议:
1、使用支持开关单元的工具完成开关网络的设计、插入和布局
2、在开关网络上运行静态和动态IR Drop分析,验证电源完整性
3、动态的IR Drop问题可以通过插入滤波电容修复。精确的瞬态分析可以得到上电过程的I-V特性,保证没有动态
电源波动问题
4、遇到任何IR Drop问题,尽量在永久上电的电源网络中修复。对开关单元、虚拟电源的改动都要重新进行唤醒延
延迟分析和峰值电流分析。
5、运行唤醒过冲电流分析,检查唤醒延迟和最大过冲电流是否满足要求。对于小规模设计,这可以通过SPICE仿真。
对于较大规模可以用专用电源分析工具完成
6、运行动态IR Drop分析还可以分析电压尖峰是否会对相临电源网络产生干扰
解耦电容的引入
电源和地之间、电源和电源之间都会有因为电路工作、电源开关而引起的噪声,这些噪声会危害到电路的正常工作,
插入解耦电容是通常解决办法。电源开关的打开会引起较大的电源、地的噪声(尽管有菊花链可以减轻这种现象)。这些
噪声会耦合到相临的上电区域。在永久上电的电源域中加上一定电容,会有效解决这个问题。电容的位置放在靠近开关
的地方效果最好。
除了这种噪声,电路工作的翻转也会引起电源的噪声。解决的办法也是在电源、地之间加入滤波电容。但是,一方
面,在90nm工艺下,滤波电容的静态漏电会显著增大;另一方面,如果是在门控的电源网络上,大的滤波电容会造成唤
醒时过大的过冲电流和长的上电延时。因此,在加这些电容时,要分析出电路中翻转的热点,在热点附近加入适当的电
容。现代的EDA工具可以自动分析这些滤波电容的插入方式。
建议:
1、在永久上电的电源域中,离相临开关域中开关最近的地方加尽可能多的解耦电容(主要受漏电和面积约束),
可以达到最大的滤波效果。将这些电容和开关单元集成在一起可以使设计方便。
2、尽量避免在虚拟电源中加入解耦电容,如果动态IR drop严重,一定要加解耦电容,则只在有电压波动最大的地
方加入适量的电容即可。
*时钟树综合
时钟树会消耗大量的功耗(可能会超过芯片功耗的一半),在常规电路中会用到门控时钟和减小时钟树延迟的办法
减小时钟树功耗。对于多电压系统的时钟树设计,又会有一些新的考虑。
如果系统中只有一个时钟,则这个时钟有可能会跨多个电压域,电压的变化会造成时钟树延迟的变化,如果数据和
时钟的延迟没有很好的平衡,可能会对时序造成问题。
如下图,数据路径在VCPU和VRAM电压域中有buffer缓冲,而时钟路径单元主要在VRAM域中。当两边电压一致时,
假设时钟在两个域中skew达到最小。则当VCPU域电压下降后,VCPU域中数据、时钟路径延时变大,而VRAM域中延时
没变,则可能会造成时钟skew变大,出现setup规则违反。
图二
为了解决这个问题,现代的EDA工具可以意识到这个问题,会采取一种自低向上的时钟树综合办法。先在每一个电
压域中做时钟树综合,保证skew最小,再将这些各个域中的子时钟树拼接在一起形成完整的时钟树。这种办法帮助在同
一电压域中缓冲数据路径同时缓冲时钟路径,也避免了时钟在各个域中来回跨越。每次跨越就会引入一个移位器,会加
大时钟延迟。
*布线
现代的布线工具已经可以意识到低功耗的要求,自动完成布线,但还有一些细节需要注意。首先在电压域划分和
布局时就要考虑到布线的可能性,特别是总线和一些全局控制网络。
如果一条最佳的走线要穿过一个或多个电压域,则可以有两个办法:
1、在每个电压域中加入移位器
2、绕过这些中间电压域布线
第一个方法会增加在这条路径上增加面积、功耗、延时。第二个方法也会增加延时,但相比之下还是好于第一种。
两种办法都会带来不好的影响,因此在设计中还是用避免这种情况出现。在布局规划的早期就应该考虑避免这种情况,
虽然完全避免是不可能的,但尽量考虑周全还是必要的。
*电源分析
完成上面工作后,就要考虑验证分析电源网络完整性了。两个方面要重点分析,一个是逻辑单元上的电压降,另一个
是门控电源上电时的过冲电流。
粗粒度的电源网络分析在电源布局规划时就做了,这里主要分析细粒度的,局部电路的功耗热点。现代的实现工具
为了实现性能的目标,倾向于将相关的寄存器、时钟门单元、时钟树缓冲单元集中在一起,这会恶化动态工作时电源的
波动。由于这时,电路已经固定,不能再改变,只有改变这一区域开关管和电源网络的尺寸是最好办法。
电源网络分析可以给出每个单元上的电压下降情况,我们可以根据这一信息,在电压下降不能接受的地方增加开关
单元或加大电源线。电路中每个单元的电压下降信息还可以用于最后的sign off时序分析。
对于唤醒过冲电流的分析,则需要在各种条件、情况下进行大量的瞬态分析。从而达到唤醒时间和过冲电流的平衡。
*时序分析
在多电压系统设计过程中,我们是在众多工作环境(不同模式+边界条件)中选择了其中几个进行设计实现的。现在
我们期望我们当时选的刚好是最好和最差的工作环境,这样这个设计就可以适应所有可能的工作环境了。signoff的静态
时序分析就是要确认这一点,因此这时需要把所有可能的工作环境约束都用来验证设计,包括所有必须的工艺库。工艺
库中的单元需要有所有工作环境下的时序模型。这个静态时序分析的时间可能会比不是低功耗设计的项目要长许多。
在芯片生产过程中,工艺会或多或少有漂移,造成同一芯片中不同区域的电阻、电容值会有微小的区别。这有可能
会影响到timing。保守的做法是在每一种工作环境约束里加一点余量,以抵消这种片上不一致性(on-chip variation,
OCV)。OCV可能会造成数据路径和时钟路径往相反的方向变化,比如造成路径延时加大,同时时钟路径延时变短。
*低功耗相关电路验证
这里要保证低功耗相关的电路是否和设计初衷一致。
这个工作可以通过三种方式:
1、门级仿真
2、一致性检查
3、基于规则的方法
门级仿真可以确认电路功能是否正确,包括验证上电后复位电路是否正常、可以进入不同睡眠模式、下电过程正常、
下电后上电功能正常。一致性检查可以最后的门级网表等效于原始的RTL加UPF代码。基于规则的检查工具可以检查最后
网表的电源网络是合理的。它可以检查是否放置了隔离单元和移位单元、一些需要保持上电的单元-保持寄存器、隔离
单元、相关控制信号等-是否是连在永久上电的电源中。还可以用这个工具检查是否有冗余的隔离单元和移位单元。
*生产测试
在设计和实际应用中,芯片都是工作在各种低电压、低功耗的模式。但在测试模式下,芯片会工作在正常电压模式
下,会造成芯片消耗比应用时多得多的功耗。如果芯片的封装只是考虑到正常低功耗的模式,那么在测试时的高热量可
能会损坏芯片和封装。另外,增加的热量也会导致芯片中过大的电压降,造成功能失败。因此,在多电源系统设计时就
要考虑到测试的这个问题,设计好测试模式。
另外,在90nm工艺以下,路径延时测试(delay fault testing)是和电压、频率密切相关的,关键路径在不同的工作
模式下还会发生变化。每一个芯片性能等级下都会有相应的关键路径。
自动化的生产测试要在芯片的各种电压模式、速度模式下和高低温模式下测试stuck-at故障和延迟故障。保证测试
的覆盖率同时还要降低测试成本是一个复杂的问题,需要针对不同的应用,进行不同的折衷。
(这一部分内容挺充实,涉及到多电源系统实现的许多具体环节。现在的EDA工具已经可以自动化完成大部分的工作,但
还是要清楚工具干了什么,用什么方法实现的,才能够灵活应用。下一部分要介绍另一个重点了,单元库对低功耗设计
的支持。) |
|