建设企业网站哪家有实力,中建南方建设集团网站,深圳建设网站,外贸流程基本知识#xff08;1#xff09;门级电路的功耗优化综述 门级电路的功耗优化(Gate Level Power Optimization#xff0c;简称GLPO)是从已经映射的门级网表开始#xff0c;对设计进行功耗的优化以满足功耗的约束#xff0c;同时设计保持其性能#xff0c;即满足设计规则和时序的要…1门级电路的功耗优化综述 门级电路的功耗优化(Gate Level Power Optimization简称GLPO)是从已经映射的门级网表开始对设计进行功耗的优化以满足功耗的约束同时设计保持其性能即满足设计规则和时序的要求。功耗优化前的设计是已经映射到工艺库的电路如下图所示 门级电路的功耗优化包括了设计总功耗动态功耗以及漏电功耗的优化。对设计做优化时优化的优先次序如下 由此我们可以找到 优化时所产生的电路首先要满足设计规则的要求然后满足延迟(时序)约束的要求在满足时序性能要求的基础上进行总功耗的优化再进行动态功耗的优化和漏电功耗的优化最后对面积进行优化。 优化时先满足更高级优先权的约束。进行低级优先权约束的优化不能以牺牲更高优先权的约束为代价。功耗的优化不能降低设计的时序。为了有效地进行功耗优化需要设计中有正的时间冗余(timing slacks)。功耗的减少以时序路径的正时间冗余作为交换即功耗优化时会减少时序路径上的正的时间冗余。因此设计中正的时间冗余越多就越有潜力降低功耗。 通过上面的描述对门级功耗优化有了一下了解之后这里先介绍一下静态功耗优化的方法——多阈值电压设计然后介绍基于EDA工具的动态功耗的优化接着介绍总体功耗的优化在最后介绍一种常用的门级低功耗的方法——电源门控。电源门控我放在明天发表今天的内容主要就是围绕静态、动态、总功耗来写。 2多阈值电压设计
①多阈值电压设计原理 由于半导体工艺越来越先进半导体器件的几何尺寸越来越小器件中的晶体管(门)数越来越多器件的供电电压越来越低单元门的阈值电压越来越低。由于单位面积中的单元门越来越多功耗密度高器件的功耗大。因此设计时我们要对功耗进行优化和管理。在90nm或以下的工艺静态功耗要占整个设计功耗的20%以上。因此使用超深亚微米工艺时除了要降低动态功耗还要降低静态功耗。在超深亚微米工艺单元门的阈值电压和漏电功耗静态功耗有如下图所示的关系 由图可见阈值电压Vt以指数关系影响着漏电功耗。阈值电压Vt与漏电功耗和单元门延迟有如下关系: 阈值电压Vt越高的单元它的漏电功耗越低但门延迟越长也就是速度慢 阈值电压Vt越低的单元它的漏电功耗越高但门延迟越短也就是速度快。
我们可以利用多阈值电压工艺库的这种特点进行漏电功耗的优化设计静态功耗低性能高的电路。 一般的设计中一个时序路径组((timing path group)有多条时序路径延迟最大的路径称为关键路径。根据多阈值电压单元的特点为了满足时序的要求关键路径中使用低阈值电压的单元(low Vt cells)以减少单元门的延迟改善路径的时序。而为了减少静态功耗在非关键路径中使用高阈值电压的单元(high Vt cells)以降低静态功耗。因此使用多阈值电压的工艺库我们可以设计出低静态功耗和高性能的设计。上面的描述如下图所示 ②门级网表/RTL代码的多阈值电压设计 多阈值电压设计可以在门级网表或者RTL代码的时候就进行也可以在后面布线后进行。门级网表/RTL代码的多阈值电压设计或者说是静态功耗优化流程如下所示 一个对应的示例脚本如下所示 set target_library hvt.db svt.db lvt.db ······ read_verilog mydesign.v current_design top source myconstraint.tcl ······ set_max_leakage -power 0mw compile ······
与以前的脚本不同设置target_library时我们用了多个库。上列中目标库设置为 hvt.db svt.db lvt.db脚本中使用set_max_leakage_power命令为电路设置静态功耗的约束。在运行compile命令时Power Compiler将根据时序和静态功耗的约束在目标库选择合适的单元在满足时序约束的前提下尽量使用Svt或Hvt单元使优化出的设计性能高静态功耗低。 PS如果在Physical Compiler工具现在我们使用DC的拓扑模式里做漏电功耗优化时我们可以保留一点正的时间冗余(positive slack)使电路不会在极限的时序下工作.这些时间冗余量也可被后面其他的优化算法所使用。设置时间冗余的命令如下: set physopt_power_critical_range 时间量 ③布线后的多阈值电压设计 上面是门级网表/RTL代码的多阈值电压设计下面简单介绍布线后的多阈值电压设计流程如下图所示 相应的一个示例脚本如下所示 set target_library hvt.db svt.db lvt.db read_verilog routed_design.v current_design top source top.sdc ······ set_max_leakage -power 0mw physopt -preserve_footprint -only_power_recovery -post_route -incremental
physopt命令中使用了“-poat_route”的选项特别用于进行布线后的漏电功耗的优化。优化时单元的外形名称(footprint)保留下来原有的布线保持不变。 ④多阈值电压设计与多阈值库的报告 进行漏电功耗的优化时Power Compile将报告如下的漏电优化的信息: LEAKAGE POWER的列(Column)展出了内部优化的漏电成本值。它和报告出来的漏电功耗可能不一样。我们用“report_power”命令得到功耗的准确的报告。 我们现在来看一下多阈值库。多阈值库定义了两个属性一个为库属性default_threshold_voltage_group另一个为单独库单元的属性threshold_voltage_group。然后报告多阈值电压组的命令是report_threshold_voltage_group.我们可以使用多阈值库的这两个属性报告出设计中使用多域值库单元的比例一个示例的脚本如下所示 set_attr -type string lvt.db:slow default_threshold_voltage_group LVt set_attr -type string svt.db:slow default_threshold_voltage_group SVt set_attr -type string hvt.db:slow default_threshold_voltage-group HVt report_threshold_voltage_group
报告得到的结果如下所示 3基于EDA工具的动态功耗优化 前面介绍了静态功耗的优化下面介绍动态功耗的优化。动态功耗优化通常在做完时序优化后进行。动态功耗优化时需要提供电路的开关行为工具根据每个节点的翻转率来优化整个电路的动态功耗。用compile/physopt命令可以同时对时序和功耗做优化。设置动态功耗的命令为 set_max_dynamic_power xxmw.一般设置为0 动态功耗优化的流程如下所示 一个对应的示例脚本如下所示 read_verilog top.v source constraints.tcl set target_library tech.db compile read_saif set_ max_dynamic_power 0 mw compile -inc
动态功耗的优化的实现如上面所示。优化过程用了很多技术比如插入缓冲器、相位分配之类的。由于这些都是power compiler在背后自动实现或者说是进行低功耗优化时工具使用的原理不需要我们进行设置因此这里不进行介绍。 4总体功耗优化 前面分别介绍了静态功耗和动态功耗的优化方法。我们可以把它们结合在一起进行整个设计总功耗的优化。总功耗是动态功耗和静态功耗的和总功耗的优先级比动态功耗和静态功耗高。总功耗优化时工具尽量减少动态功耗和静态功耗的和。优化时如果减少了漏电功耗增加了动态功耗但它们的和减少了优化是有效的。反之亦然。我们可以通过设置开关使动态功耗优化和静态功耗优化用不同的努力级别(effort levels)和权重(weights)进行优化。 总功耗的优化流程如下图所示 一个对应的示例脚本如下所示 read_verilog top.v source constraints.tcl set target_library hvt.db svt.db lvt.db ······ compile read_saif set_max_total_power 0 mw -leakage_weight 30 compile -inc ······
脚本中target_library设置为多阈值电压的库用于做静态功耗的优化。读入含有开关行为的saif文件用于约束动态功耗的优化。在设置总功耗的约束时我们可以在set_max_total_power命令中使用静态或/和动态功耗权重(weight)的选项使工具在优化时偏重于静态或动态功耗。假设P、Pd和Pl分别为总功耗、动态功耗和静态功耗Wd和Wl分别为动态功耗和静态功耗的权重则 总功耗P (Wd*PdWl*P1)/Wd 我们可以在DC或PC中设定只对功耗做优化。这时候工具仅优化设计的功耗而不会对更高优先级的约束做任何的优化和修正设计规则DRC违例。但是这种优化也不会使设计的更高优先级约束的性能变差和引起DRC违例。这种优化的优点在于运行时间较短可用于优化设计的动态功耗、静态功耗和总功耗。在DC和PC中只能以增量编辑的形式工作。 PC中只对功耗做优化的命令如下: set_max_total -power 0 mw physopt -only_power_recovery DC中只对功耗做优化的命令如下由于现在PC在DC中因此下面的脚本更常用: set compile_power_opto_only true set_max_leakage_power 0 mw compile -inc
现在来记录一下门级层次有点书也说是在系统级常用的一种低功耗方法——电源门控。
①电源门控概述与原理 电源门控是指芯片中某个区域的供电电源被关掉即该区域内的逻辑电路的供电电源断开。电源门控(Power Gating)的设计如下图所示 如果某一模块在一段时间内不工作可以关掉它的供电电源关掉供电电源可以使用MTCMOS开关通常在使用后端工具进行布局布线时加入MTCMOS这属于后端知识这里不进行介绍。断电后设计进入睡眠模式其漏电功率很小。唤醒时为了使模块尽快恢复工作模式需要保持关电前的状态。保持寄存器(retention register)可用于记忆状态。使用保持寄存器设计电源门控如下图所示 下面来解释一下上面的设计 ·在睡眠模式寄存器的电源Vdd2被切断因此它的漏电功耗极小;这时候仅仅保持锁存器处于工作状态寄存器的值保留在锁存器里。由于锁存器是用高阈值电压的晶体管组成漏电功耗很低。 ·当Restore信号被激活时寄存器的电源Vdd2被加上保留在锁存器里的值被载入到寄存器。寄存器在工作(活跃)状态时它作为一般的寄存器工作。Save/Restore引脚也称为电源门控引脚(power gating pins)它们被用于把电路置于适当的模式。 ·电源门控模块的输出端需要使用隔离单元(Isolation Cell)我们在前面讲过因为在睡眠模式时模块的输出为不确定值。为了保证在睡眠模式时下一级的输入不会悬空插入隔离单元提供一个1”或”0”的输出使下一级的输入为确定的逻辑值如下所示 ISO为睡眠控制信号用于控制隔离单元的运作。电路在正常工作模式时ISO0,ISO_ ININ。电路在睡眠模式时ISO1时如果使用下面左图的单元作为隔离单元输出逻辑为“1如使用下面右图的单元作为隔离单元则输出逻辑为“0 ②工艺库中的电源门控单元 进行电源门控设计需要用综合库的支持。综合库中的电源门控单元的库模型如下所示 下面是库模型的部分解释 ·单元级属性(Cell level attribute)
power_gating_cell:typetype”不可以是“none”或空字符它鉴别所描述的保持寄存器的类型。本例中保持寄存器的类型为PG_1。 ·电源门控寄存器的功能描述
它是保持寄存器在活跃模式的功能。 ·引脚级的属性(Pin level attribute)
power_pin_1~ power_pin_5列出了现有的电源门控信号的名字。例如power_pin_1可以用于定义为睡眠(sleep)信号power_pin_2可以用于定义叫醒(wake)信号。power_pin_[1-5]信号的默认值是寄存器处于非工作(disable)状况的值可以是“0”或“1。例如如果当power_pin_1的逻辑值为“1”时电路进入睡眠模式那么其非工作(disable)状况的值应该是逻辑“0”。 ③电源门控设计流程
了解了电源门控的原理和综合库的电源门控单元下面我们就来介绍电源门控的设计流程。使用电源门控的设计流程和相应的脚本如下所示 下面进行解释一下部分命令 ·脚本中使用set_power_gating_style命令来映射保持寄存器。例如对于下面的代码 ······ always (posedge clk) begin:sub_block_1 gd; end ······
set_power_gating -style -type PG_1 -hdl_block sub_block_1命令可以把代码中的寄存器映射为保持寄存器。选项“-type PG_1”指定使用库中类型为PG_1的保持寄存器。选项“-hdl_block sub_block_1”指定把RTL代码中进程(process)名为“sub_block_1中的所有寄存器用类型为PCG_ 1的保持寄存器代替。 · 脚本中使用hookup_power_gating_ports命令来自动插入power_pin[1-5]端口和层次模块的引脚。同类功耗引脚的端口或引脚会被连接在一起。例如属性同为“power_pin_1”的引脚将被连接在一起其默认名为“power_pin_1。下图为执行hookup_power_gating_ports命令后设计中插入端口和层次模块的引脚。我们可以使用选项“-default_port_naming_style”和“-port_naming_styles”来改变端口和/或层次模块引脚的命名 下面的脚本用set_power_gating_signal命令指定把电源门控引脚与现有的端口或层次引脚连接起来如下所示 set_power_gating_signal -power_pin_index 1 [get_ports Save] set_power_gating_signal -power_pin_index 2 [get_pins A/p1] ······ hookup_power_gating_ports
结果如下所示 ·最后我们可以用report_power_gating命令报告设计中的电源门控单元如下所示