(五)门级电路低功耗设计优化

(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*Pd+Wl*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为睡眠控制信号,用于控制隔离单元的运作。电路在正常工作模式时,ISO=0,ISO_ IN=IN。电路在睡眠模式时,ISO=1时,如果使用下面左图的单元作为隔离单元,输出逻辑为“1";如使用下面右图的单元作为隔离单元,则输出逻辑为“0":

           

 

 

②工艺库中的电源门控单元

  进行电源门控设计,需要用综合库的支持。综合库中的电源门控单元的库模型如下所示:

           

下面是库模型的部分解释:

  ·单元级属性(Cell level attribute)

power_gating_cell:"type","type”不可以是“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

      g=d;

    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命令报告设计中的电源门控单元,如下所示:

           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring3向Spring4升级过程中quartz修改

为什么80%的码农都做不了架构师?>>> 问题 nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.scheduling.quartz.CronTriggerBean] for bean with name ... 原因 org.spri…

EasyUI--messager

1.    alert 方法 <script type"text/javascript">$( function(){$.messager.alert("调用messager","文本内容") ;});</script> 这里还可以通过icon添加相应的图标及info加入回调函数 <script type"text/javascript&quo…

Redis学习第八课:Redis高级实用特性(一)

Redis高级实用特性 注&#xff1a;我学习的环境是vmware7.1 ubantu10.10 redis 3.0.2 1、安全性 设置客户端连接后进行任何其他指定前需要的密码。因为redis速度相当快&#xff0c;一个外部用户可以在一秒钟进行很多次的密码尝试&#xff0c;这就需要设定非常强大的密码来防止…

分布式缓存的面试题9

1、面试题 如何保证缓存与数据库的双写一致性&#xff1f; 2、面试官心里分析 你只要用缓存&#xff0c;就可能会涉及到缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性问题&#xff1f; 3、面试题剖析…

ROS与navigation教程——概述

navigation是ROS的二维导航功能包&#xff0c;简单来说&#xff0c;就是根据输入的里程计等传感器的信息流和机器人的全局位置&#xff0c;通过导航算法&#xff0c;计算得出安全可靠的机器人速度控制指令。 代码库&#xff1a;https://github.com/ros-planning/navigation 代…

【设计模式】单例模式 Singleton Pattern

通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例&#xff08;Instance&#xff09; 的情况&#xff0c; 比如说我们想做一计数器&#xff0c;统计某些接口调用的次数&#xff0c;通常我们的数据库连接也是只期望有一个实例。Windows系统的系统任务管理器…

进程及线程通信总结

上文我们介绍了如何建立一个简单的多线程程序&#xff0c;多线程之间不可避免的需要进行通信 。相比于进程间通信来说&#xff0c;线程间通信无疑是相对比较简单的。 首先我们来看看最简单的方法&#xff0c;那就是使用全局变量&#xff08;静态变量也可以&#xff09;来进行通…

ROS multi-master——multimaster_fkie配置

多主站ROS配置和mutimaster_fkie ROS版本&#xff1a;kinetic 操作系统&#xff1a;Ubuntu 16.04。 multimaster_fkie&#xff1a;github 1网络配置 1.1路由器 设置无线路由器并连接两台计算机/机器人。为这两台计算机设置静态IP地址。相互测试ping命令和ssh。 1.2主机 …

Docker入门

1. Docker简介: docker是一个基于LXC的高级容器引擎。简单地说&#xff0c;docker是一个轻量级的虚拟解决方案&#xff0c;或者说它是一个超轻量级的虚拟机&#xff08;容器&#xff09;。 Docker是一个开源的引擎&#xff0c;可以轻松的为任何应用创建一个轻量级的、可移植的、…

Gmapping——从原理到实践

概述 在SLAM中&#xff0c;机器人位姿和地图都是状态变量&#xff0c;我们需要同时对这两个状态变量进行估计&#xff0c;即机器人获得一张环境地图的同时确定自己相对于该地图的位置。我们用x表示机器人状态&#xff0c;m表示环境地图&#xff0c;z表示传感器观测情况&#xf…

【机器学习经典算法源码分析系列】-- 逻辑回归

1.逻辑回归&#xff08;Logistic Regression&#xff09;又常被成为“逻辑斯蒂回归”&#xff0c;实质上是一个二元分类问题。 逻辑回归代价函数&#xff1a; 代价函数导数&#xff1a; Matlab实现&#xff1a; 采用matlab中自带的无约束最小化函数fminunc来代替梯度下降法&…

ROS——不同版本间ROS进行通信

在相同版本间的ROS进行通信不在赘述了&#xff0c;修改/etc/hosts文件即可。 最近项目遇到在Ubuntu16.04 与Ubuntu18.04两个系统间进行ROS通信&#xff0c;ROS版本分别为Kinetic和Melodic。配置网络后&#xff0c;两边都能够ping通&#xff0c;但是在获取ros数据是&#xff0c…

大数据开发实战:数据流图及相关数据技术

1、大数据流程图 2、大数据各个环节主要技术 2.1、数据处理主要技术 Sqoop&#xff1a;&#xff08;发音&#xff1a;skup&#xff09;作为一款开源的离线数据传输工具&#xff0c;主要用于Hadoop(Hive) 与传统数据库&#xff08;MySql,PostgreSQL&#xff09;间的数据传递。它…

跨时钟域电路设计——亚稳态及双锁存器

一、同步电路 定义&#xff1a;电路中所有受时钟控制的单元&#xff0c;全部由一个统一的时钟控制。 优点&#xff1a;在同步设计中&#xff0c;EDA工具可以保证电路系统的时序收敛&#xff0c;避免电路设计中的竞争冒险。 缺点&#xff1a;时钟树综合需要加入大量延迟单元&…

跨时钟域电路设计——单bit信号

前面提到了简单的双电平锁存器&#xff0c;下面是一些单bit同步电路。 一、慢时钟域向快时钟域 边沿检测同步器 将慢时钟域的脉冲搬移并缩小为快时钟域的脉冲。 既可以检测上升沿&#xff0c;也可以检测下降沿。 如上图&#xff0c;慢时钟下一个有效脉冲的最短周期为慢时钟的…

C语言100例01 PHP版(练习)

题目&#xff1a;有1、2、3、4个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f; 程序分析&#xff1a;可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 代码&#xff1a; 1 for($i1;$i&l…

跨时钟域电路设计——结绳法

信号从快时钟域到慢时钟域过渡时&#xff0c;慢时钟可能无法对快时钟变化太快的信号进行采样。 之前的同步器法对两个时钟间的关系有要求&#xff0c;结绳法适用于任何时钟域之间的过渡。 结绳法的原理是将快时钟信号的脉冲周期延长&#xff0c;等到慢时钟周期采样后再“解绳”…

我之理解---计时器setTimeout 和clearTimeout

今天在写个图片切换的问题 有动画滞后的问题&#xff0c;才动手去查setTimeout 和clearTimeout。之前写的图片播放器也有类似的问题&#xff0c;有自动start按钮 和stop按钮&#xff0c; 其他都正常&#xff0c;问题出在每次多次快速的点击start按钮时&#xff0c;图片播放的速…

关于二维码分块上色(彩色二维码)的算法研究

原文:关于二维码分块上色&#xff08;彩色二维码&#xff09;的算法研究众所周知&#xff0c;二维码通常是黑白的&#xff0c;而且是由若干个长方形或正方形小块平铺而成。但从人们的审美角度来看&#xff0c;常见的黑白二维码不免让人审美疲劳。本文试着从分块上色的角度对二维…

20145309信息安全系统设计基础第12周学习总结后篇

指针与声明 声明 1、C语言中变量的声明 类型&#xff08;type&#xff09; 声明符&#xff08;declarator&#xff09; 2、最简单的声明是变量 3、指针数组 指针数组是一个数组数组里的元素都是指针例&#xff1a;int *daytab[13]4、数组指针 数组指针是一个指针指针指向一个类…