(五)門級電路低功耗設計優化

(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.pswp.cn/news/253912.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253912.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253912.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL三大范式

第一范式(1NF) (必須有主鍵,列不可分) 數據庫表中的任何字段都是單一屬性的,不可再分 create table aa(id int,NameAge varchar(100)) insert aa values(1,無限-女 ) 沒有達到第一范式 create table aa(id int,name varcahr(10),age char(2)) insert aa …

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…

Socket編程知識必學/SELECT 編程

Select在Socket編程中還是比較重要的,可是對于初學Socket的人來說都不太愛用Select寫程序,他們只是習慣寫諸如 connect、accept、recv或recvfrom這樣的阻塞程序(所謂阻塞方式block,顧名思義,就是進程或是線程執行到這些…

EasyUI--messager

1.    alert 方法 <script type"text/javascript">$( function(){$.messager.alert("調用messager","文本內容") ;});</script> 這里還可以通過icon添加相應的圖標及info加入回調函數 <script type"text/javascript&quo…

ROS與navigation教程——基本導航調整指南

說明&#xff1a; 介紹如何調整機器人上的ROS導航包 步驟&#xff1a; (1) 機器人導航需要那些準備? 在調整新機器人上的導航包時遇到的大部分問題都在本地規劃器調諧參數之外的區域。機器人的里程計&#xff0c;定位&#xff0c;傳感器以及有效運行導航的其他先決條件常常…

小程序跨行跨列多列復雜表格實現

今天來實現個跨行跨列多列表格。 如圖&#xff0c;這是個列數不確定&#xff0c;有的單元格還要跨行跨列的復雜表格。 這里暫時最多支持4列&#xff0c;列數再多就放不下了。 實現原理 實現原理比較簡單&#xff0c;通過多個嵌套的循環將數據取出。 上面的例子中&#xff0c;最…

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 代…

Linux下c開發 之 線程通信與pthread_cond_wait()的使用

pthread_cond_wait() /************pthread_cond_wait()的使用方法**********/pthread_mutex_lock(&qlock); pthread_cond_wait(&qready, &qlock);pthread_mutex_unlock(&qlock);/*****************************************************/The mutex passed …

ROS與navigation教程——ACML參數配置

<launch> <!--//后為wiki官網的參數說明 &#xff08;&#xff09;中為粗讀算法參數說明及理解 面臨的問題常用地圖有2種&#xff1a;1.基于特征&#xff0c;僅指明在指定位置&#xff08;地圖中包含的對象的位置&#xff09;的環境的形狀。特征表示使得調節對象的位置…

【設計模式】單例模式 Singleton Pattern

通常我們在寫程序的時候會碰到一個類只允許在整個系統中只存在一個實例&#xff08;Instance&#xff09; 的情況&#xff0c; 比如說我們想做一計數器&#xff0c;統計某些接口調用的次數&#xff0c;通常我們的數據庫連接也是只期望有一個實例。Windows系統的系統任務管理器…

修改輸入框placeholder的默認樣式

一般網頁中都用到input的placeholder屬性&#xff0c;想讓這個默認樣式和網頁保持一致&#xff0c;就需要重新設定樣式&#xff0c;百度百度&#xff1a; :-moz-placeholder { / color: #000; opacity:1; }支持/* Mozilla Firefox 4 to 18 * ::-moz-placeholder { color: #000;…

進程及線程通信總結

上文我們介紹了如何建立一個簡單的多線程程序&#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;可以輕松的為任何應用創建一個輕量級的、可移植的、…

樂器庫的混合

每臺微機一個聲卡&#xff0c;也就是一片D/A&#xff0c;驅動按波特率、采樣位數、采樣通道傳輸給D/A&#xff0c;輸出模擬音頻。播放時僅一種與硬件支持格式對應&#xff0c;其他需驅動&#xff08;有損&#xff09;變換到硬件支持格式。每個應用都可單獨播放聲音&#xff0c;…

kafka認知--(1)

文檔參考&#xff1a;http://kafka.apache.org/documentation.html 下載代碼&#xff1a; tar -xzf kafka_2.11-0.11.0.0.tgz cd kafka_2.11-0.11.0.0 啟動 bin/zookeeper-server-start.sh config/zookeeper.properties 創建topic&#xff08;主題為test&#xff0c;只有一個分…

帶頭尾指針的list的C實現

一、緣起 很早寫了一個帶頭尾指針的list&#xff0c;該list支持從尾部插入元素&#xff0c;在任意位置刪除元素&#xff0c;最近用這個list時發現一個bug&#xff0c;修正了&#xff0c;并加了幾個接口函數。貼出來&#xff0c;希望對C的初學者有用。 二、基本說明 2.1、數據結…

Gmapping——從原理到實踐

概述 在SLAM中&#xff0c;機器人位姿和地圖都是狀態變量&#xff0c;我們需要同時對這兩個狀態變量進行估計&#xff0c;即機器人獲得一張環境地圖的同時確定自己相對于該地圖的位置。我們用x表示機器人狀態&#xff0c;m表示環境地圖&#xff0c;z表示傳感器觀測情況&#xf…