3. 关于Isolation cell的插入有一个需要注意的问题,power domain的某些接口信号在网表中可能是直接接电源或地的,如果在这些信号上插入了
Isolation cell,在ICC中不能正确derive出这些Isolation cell的power连接关系。会报告这样的告警”The isolation cell ‘xxx’ does not have any associated UPF isolation strategy ”。解决的方法就是在UPF中指定对这些信号不要插入Isolation cell,或者在ICC中直接指定这些Isolation cell的电源和地。
4. 需要在Voltage Area的边界用hard blockage留出足够的间隙或者在创建voltage area的时候加上guard_band的选项,工具就不会在这些区域摆放cell,否则如果voltage area边界内外cell紧密摆放的话,不同电源、地的cell就物理连接到一起了,就会有电源或地的短路出现。具体需要留多少间隙,要根据不同工艺的 design rule来计算。
5. 关于MTCMOS的插入数量,可以先根据该模块的功耗大致估算一下。首先通过功耗分析估算出掉电区的功耗P,根据P=VI,及电源电压,计算出供电电流 I;再根据foundry提供的MTCMOS的电阻值R,可以计算出并联n个MTCMOS的IR drop大致为IR/n;这样就可以根据期望达到的IR drop值,计算出需要插入多少MTCMOS了。当然最后还需要通过更精确的IR drop分析工具(比如Prime Rail)来分析IR drop是否满足要求。
6. 关于MTCMOS的摆放和分布,则需要考虑掉电区的功耗分布,功耗密度大的地方电流密度也大,所以MTCMOS摆放密度要高一些,以减小IR drop。比如在我们的设计中,掉电区有个大块的Macro(见图22左上),且它的时钟频率比其他部分高,功耗密度比其他部分大很多,所以我们在其外围 放了一圈紧挨着的MTCMOS,而在其他部分,则是按阵列形式摆放了几列MTCMOS,每列MTCMOS都是隔行摆放。
7. 掉电区的电源网络规划、以及MTCMOS的电源连接也是需要特别考虑的地方。掉电区有三个PG nets(True VDD、Virtual VDD和VSS),在做电源网络规划时,建议对三个PG nets都画一个密度相当的电源网格。True VDD和Virtual VDD的网格通过MTCMOS连接,MTCMOS处是电流密度最大的地方,所以为了减小IR drop,在MTCMOS上方尽量用宽金属走Power Strap。这样做出来的电源网络,一般不会有IR drop的问题。
4. 结论及建议
利用Synopsys基于UPF标准的低功耗流程,帮助我们在设计的整个流程(从前端到后端,以及验证)中,达成对低功耗 设计意图描述上的连贯性、简洁性与一致性,并提供各方面的验证功能,极大的提高了设计实现的效率,并保证了设计的正确性。
对于设计实现工程师来说,UPF流程仅比传统流程增加了如何用UPF来描述自己设计中的低功耗意图,工具就可以根据UPF 里面的约束,自动实现低功耗设计。
而且实现与验证可能要用到多个工具,传统流程中,每个工具都要求有自己独立的低功耗设计命令,这样很难保证各个工具之间 的描述是否一致,有了UPF,这个问题就彻底解决了,各个工具都使用统一的UPF文件来得到一致的低功耗设计要求。另外,低功耗设计需要的特殊单元,如 Isolation cells和Level Shifters在前端综合时工具会根据UPF的描述自动插入,MTCMOS在后端实现工具中插入以及连接,整个过程中复杂及容易出错的Power连接、 控制信号连接等步骤都由工具根据UPF的描述自动实现了,操作简单方便,且不容易出错。 觉得需要增强的是,当我们在作这个项目的时候,Synopsys的低功耗流程还不支持在优化的中间过程对UPF进行修改。 比如在物理实现的后期,想对power domain做些微小的修改,又不想从头开始重做,要是UPF也能像SDC一样可以remove后再load就更方便了。但是令人振奋的是,当前 ICC0906的版本提供了一个叫reset_upf的新命令,已经可以实现这个功能了。
5. 致谢
UPF流程对于我们是一个全新的低功耗流程,完成本设计,离不开华为通信芯片团队的集体智慧和不懈的努力。在此,要特别感 谢张方、张小珏、吕忠华、宋隽、乐彬、戴方明、余剑锋,以及各位同事的大力协助。另外,还要感谢Synopsys工程师杜广山、黄秋儿,他们提出了很多宝 贵的意见和建议,并现场支持,及时解答每一个疑问,给予了我们极大的支持和帮助。
6. 参考文献
[1] Synopsys Low-Power Flow User Guide, Version B-2008.09, September 2008 [2] Synopsys’ Low Power Solution white paper, December 2008
[3] Michael Keating, David Flynn, Robert Aitken, Alan Gibbons, Kaijian Shi, “Low Power Methodology Manual For System-on-Chip Design”
7. 附件
7.1 UPF范例
# create power domains
create_power_domain PD_TOP –include_scope create_power_domain PD_1 –elements BLOCKA create_power_domain PD_2 –elements BLOCKB
# supply nets definitions
create_supply_net VDD –domain PD_TOP create_supply_net VDD –domain PD_1 –reuse create_supply_net VDD_2 –domain PD_TOP create_supply_net VDD_2 –domain PD_1 –reuse create_supply_net VDD_2 –domain PD_2 –reuse create_supply_net VDD_1 –domain PD_1 create_supply_net VSS –domain PD_TOP create_supply_net VSS –domain PD_1 –reuse create_supply_net VSS –domain PD_2 –reuse #define the primary power/ground for power domains set_domain_supply_net PD_TOP –primary_power_net VDD –primary_ground_net VSS
set_domain_suupply_net PD_1 –primary_power_net VDD_1 –primary_ground_net VSS
set_domain_supply_net PD_2 –primary_power_net VDD_2 –primary_ground_net VSS # power ports definitions
create_supply_port VDD –domain PD_TOP –direction in create_supply_port VDD_2 –domain PD_TOP –direction in create_supply_port VSS –domain PD_TOP –direction in #connect the supply net to power port connect_supply_net VDD –ports VDD connect_supply_net VDD_2 –ports VDD_2 connect_supply_net VSS –ports VSS
#create the power switch
create_power_switch SW1 –domain PD_1 –output_supply_port {VDD_OUT VDD_1} –input_supply_port {VDD_IN VDD} –control_port {PW_CTRL pd1_pw_en} –on_state {PW_ON VDD_IN {PW_CTRL}} –ack_port {{PW_ACK pd1_pw_ack}
#define the isolation cell rules
set_isolation pd1_iso_in –domain PD_1 –no_isolation –applies_to inputs
set_isolation pd1_iso_low –domain PD_1 –isolation_power_net VDD –isolation_ground_net VSS –clamp_value 0 –applies_to outputs set_isolation_control pd1_iso_low –domain PD_1 –isolation_signal iso_en –isolation_sense high –location parent
set_isolation pd1_iso_high –domain PD_1 –isolatioin_power_net VDD –isolation_ground_net VSS –elements {BLOCKA/pin1 BLOCKA/pin2} –clamp_value 1
set_isolation_control pd1_iso_high –domain PD_1 –isolation_signal iso_en –isolation_sense high –location parent
set_isolation pd2_iso_out –domain PD_2 –isolation_power_net VDD_1 –isolation_ground_net VSS –clamp_value 0 –applies_to outputs set_isolation_control pd2_iso_out –domain PD_2 –isolation_signal iso_en –isolation_sense high –location parent
set_isolation pd2_iso_high –domain PD_2 –isolation_power_net VDD_2 –isolation_ground_net VSS –elements {BLOCKB/pin1}
set_isolation_control pd2_iso_high –domain PD_2 –isolation_signal iso_en –isolation_sense high –location self
set_isolation zsp_tcm_iso_en –domain PD_2 –no_isolation –elements BLOCKB/iso_en
#create the state table
add_port_state VDD –state {NOR_VOL 1.2} add_port_state VDD_1 –state {NOR_VOL 1.2}
add_port_state VDD_1 –state {OFF_VOL off} add_port_statte VDD_2 –state {NOR_VOL 1.2} add_port_state VDD_2 –state {LOW_VOL 0.8}
create_ps top_pst –supplies [list VDD VDD_1 VDD_2]
add_pst_state pst_pd1_ON –pst top_pst –state {NOR_VOL NOR_VOL NOR_VOL} add_pst_state pst_pd1_OFF –pst top_pst NOR_VOL}
add_pst_state pst_pd2_LOW –pst top_pst LOW_VOL}
state {NOR_VOL OFF_VOL state {NOR_VOL OFF_VOL ––