天天看點

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

(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指令來映射保持寄存器。例如對于下面的代碼

    ······

    [email protected] (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指令報告設計中的電源門控單元,如下所示:

           

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

繼續閱讀