(五)门级电路低功耗设计优化
(1)門級(jí)電路的功耗優(yōu)化綜述
門級(jí)電路的功耗優(yōu)化(Gate Level Power Optimization,簡(jiǎn)稱GLPO)是從已經(jīng)映射的門級(jí)網(wǎng)表開始,對(duì)設(shè)計(jì)進(jìn)行功耗的優(yōu)化以滿足功耗的約束,同時(shí)設(shè)計(jì)保持其性能,即滿足設(shè)計(jì)規(guī)則和時(shí)序的要求。功耗優(yōu)化前的設(shè)計(jì)是已經(jīng)映射到工藝庫(kù)的電路,如下圖所示:
?
門級(jí)電路的功耗優(yōu)化包括了設(shè)計(jì)總功耗,動(dòng)態(tài)功耗以及漏電功耗的優(yōu)化。對(duì)設(shè)計(jì)做優(yōu)化時(shí),優(yōu)化的優(yōu)先次序如下:
?
由此我們可以找到, 優(yōu)化時(shí),所產(chǎn)生的電路首先要滿足設(shè)計(jì)規(guī)則的要求,然后滿足延遲(時(shí)序)約束的要求,在滿足時(shí)序性能要求的基礎(chǔ)上,進(jìn)行總功耗的優(yōu)化,再進(jìn)行動(dòng)態(tài)功耗的優(yōu)化和漏電功耗的優(yōu)化,最后對(duì)面積進(jìn)行優(yōu)化。
優(yōu)化時(shí)先滿足更高級(jí)優(yōu)先權(quán)的約束。進(jìn)行低級(jí)優(yōu)先權(quán)約束的優(yōu)化不能以犧牲更高優(yōu)先權(quán)的約束為代價(jià)。功耗的優(yōu)化不能降低設(shè)計(jì)的時(shí)序。為了有效地進(jìn)行功耗優(yōu)化,需要設(shè)計(jì)中有正的時(shí)間冗余(timing slacks)。功耗的減少以時(shí)序路徑的正時(shí)間冗余作為交換,即功耗優(yōu)化時(shí)會(huì)減少時(shí)序路徑上的正的時(shí)間冗余。因此,設(shè)計(jì)中正的時(shí)間冗余越多,就越有潛力降低功耗。
通過上面的描述,對(duì)門級(jí)功耗優(yōu)化有了一下了解之后,這里先介紹一下靜態(tài)功耗優(yōu)化的方法——多閾值電壓設(shè)計(jì),然后介紹基于EDA工具的動(dòng)態(tài)功耗的優(yōu)化,接著介紹總體功耗的優(yōu)化;在最后介紹一種常用的門級(jí)低功耗的方法——電源門控。電源門控我放在明天發(fā)表,今天的內(nèi)容主要就是圍繞靜態(tài)、動(dòng)態(tài)、總功耗來寫。
?
(2)多閾值電壓設(shè)計(jì)
①多閾值電壓設(shè)計(jì)原理
由于半導(dǎo)體工藝越來越先進(jìn),半導(dǎo)體器件的幾何尺寸越來越小,器件中的晶體管(門)數(shù)越來越多,器件的供電電壓越來越低,單元門的閾值電壓越來越低。由于單位面積中的單元門越來越多,功耗密度高,器件的功耗大。因此,設(shè)計(jì)時(shí),我們要對(duì)功耗進(jìn)行優(yōu)化和管理。在90nm或以下的工藝,靜態(tài)功耗要占整個(gè)設(shè)計(jì)功耗的20%以上。因此,使用超深亞微米工藝時(shí),除了要降低動(dòng)態(tài)功耗,還要降低靜態(tài)功耗。在超深亞微米工藝,單元門的閾值電壓和漏電功耗(靜態(tài)功耗)有如下圖所示的關(guān)系:
?
由圖可見,閾值電壓Vt以指數(shù)關(guān)系影響著漏電功耗。閾值電壓Vt與漏電功耗和單元門延遲有如下關(guān)系:
閾值電壓Vt越高的單元,它的漏電功耗越低,但門延遲越長(zhǎng),也就是速度慢;
閾值電壓Vt越低的單元,它的漏電功耗越高,但門延遲越短,也就是速度快。
我們可以利用多閾值電壓工藝庫(kù)的這種特點(diǎn),進(jìn)行漏電功耗的優(yōu)化,設(shè)計(jì)靜態(tài)功耗低性能高的電路。
一般的設(shè)計(jì)中,一個(gè)時(shí)序路徑組((timing path group)有多條時(shí)序路徑,延遲最大的路徑稱為關(guān)鍵路徑。根據(jù)多閾值電壓?jiǎn)卧奶攸c(diǎn),為了滿足時(shí)序的要求,關(guān)鍵路徑中使用低閾值電壓的單元(low Vt cells),以減少單元門的延遲,改善路徑的時(shí)序。而為了減少靜態(tài)功耗,在非關(guān)鍵路徑中使用高閾值電壓的單元(high Vt cells),以降低靜態(tài)功耗。因此,使用多閾值電壓的工藝庫(kù),我們可以設(shè)計(jì)出低靜態(tài)功耗和高性能的設(shè)計(jì)。上面的描述如下圖所示:
?
?
?
②門級(jí)網(wǎng)表/RTL代碼的多閾值電壓設(shè)計(jì)
多閾值電壓設(shè)計(jì)可以在門級(jí)網(wǎng)表或者RTL代碼的時(shí)候就進(jìn)行,也可以在后面布線后進(jìn)行。門級(jí)網(wǎng)表/RTL代碼的多閾值電壓設(shè)計(jì)(或者說是靜態(tài)功耗優(yōu)化)流程如下所示:
?
一個(gè)對(duì)應(yīng)的示例腳本如下所示:
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
······
與以前的腳本不同,設(shè)置target_library時(shí),我們用了多個(gè)庫(kù)。上列中,目標(biāo)庫(kù)設(shè)置為 "hvt.db ??svt.db ??lvt.db"腳本中使用set_max_leakage_power命令為電路設(shè)置靜態(tài)功耗的約束。在運(yùn)行compile命令時(shí),Power Compiler將根據(jù)時(shí)序和靜態(tài)功耗的約束,在目標(biāo)庫(kù)選擇合適的單元,在滿足時(shí)序約束的前提下,盡量使用Svt或Hvt單元,使優(yōu)化出的設(shè)計(jì)性能高,靜態(tài)功耗低。
PS:如果在Physical Compiler工具(現(xiàn)在我們使用DC的拓?fù)淠J?#xff09;里做漏電功耗優(yōu)化時(shí),我們可以保留一點(diǎn)正的時(shí)間冗余(positive slack),使電路不會(huì)在極限的時(shí)序下工作.這些時(shí)間冗余量也可被后面其他的優(yōu)化算法所使用。設(shè)置時(shí)間冗余的命令如下:
set ??physopt_power_critical_range ??時(shí)間量
?
③布線后的多閾值電壓設(shè)計(jì)
上面是門級(jí)網(wǎng)表/RTL代碼的多閾值電壓設(shè)計(jì),下面簡(jiǎn)單介紹布線后的多閾值電壓設(shè)計(jì),流程如下圖所示:
?
相應(yīng)的一個(gè)示例腳本如下所示:
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”的選項(xiàng),特別用于進(jìn)行布線后的漏電功耗的優(yōu)化。優(yōu)化時(shí),單元的外形名稱(footprint)保留下來,原有的布線保持不變。
?
?
④多閾值電壓設(shè)計(jì)與多閾值庫(kù)的報(bào)告
進(jìn)行漏電功耗的優(yōu)化時(shí),Power Compile將報(bào)告如下的漏電優(yōu)化的信息:
?
LEAKAGE POWER的列(Column)展出了內(nèi)部?jī)?yōu)化的漏電成本值。它和報(bào)告出來的漏電功耗可能不一樣。我們用“report_power”命令得到功耗的準(zhǔn)確的報(bào)告。
?======================================================================
我們現(xiàn)在來看一下多閾值庫(kù)。多閾值庫(kù)定義了兩個(gè)屬性,一個(gè)為庫(kù)屬性:default_threshold_voltage_group,另一個(gè)為單獨(dú)庫(kù)單元的屬性:threshold_voltage_group。然后報(bào)告多閾值電壓組的命令是:report_threshold_voltage_group.我們可以使用多閾值庫(kù)的這兩個(gè)屬性,報(bào)告出設(shè)計(jì)中使用多域值庫(kù)單元的比例,一個(gè)示例的腳本如下所示:
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
報(bào)告得到的結(jié)果如下所示:
?
?
?
(3)基于EDA工具的動(dòng)態(tài)功耗優(yōu)化
前面介紹了靜態(tài)功耗的優(yōu)化,下面介紹動(dòng)態(tài)功耗的優(yōu)化。動(dòng)態(tài)功耗優(yōu)化通常在做完時(shí)序優(yōu)化后進(jìn)行。動(dòng)態(tài)功耗優(yōu)化時(shí),需要提供電路的開關(guān)行為,工具根據(jù)每個(gè)節(jié)點(diǎn)的翻轉(zhuǎn)率,來優(yōu)化整個(gè)電路的動(dòng)態(tài)功耗。用compile/physopt命令可以同時(shí)對(duì)時(shí)序和功耗做優(yōu)化。設(shè)置動(dòng)態(tài)功耗的命令為:
set_max_dynamic_power ?xxmw.(一般設(shè)置為0)
動(dòng)態(tài)功耗優(yōu)化的流程如下所示:
?
一個(gè)對(duì)應(yīng)的示例腳本如下所示:
read_verilog ??top.v
source ??constraints.tcl
set ??target_library ??"tech.db"
compile
read_saif
set_ max_dynamic_power ??0 mw
compile ?-inc
動(dòng)態(tài)功耗的優(yōu)化的實(shí)現(xiàn)如上面所示。優(yōu)化過程用了很多技術(shù)比如插入緩沖器、相位分配之類的。由于這些都是power compiler在背后自動(dòng)實(shí)現(xiàn)(或者說是進(jìn)行低功耗優(yōu)化時(shí)工具使用的原理),不需要我們進(jìn)行設(shè)置,因此這里不進(jìn)行介紹。
?
(4)總體功耗優(yōu)化
前面分別介紹了靜態(tài)功耗和動(dòng)態(tài)功耗的優(yōu)化方法。我們可以把它們結(jié)合在一起,進(jìn)行整個(gè)設(shè)計(jì)總功耗的優(yōu)化。總功耗是動(dòng)態(tài)功耗和靜態(tài)功耗的和,總功耗的優(yōu)先級(jí)比動(dòng)態(tài)功耗和靜態(tài)功耗高。總功耗優(yōu)化時(shí),工具盡量減少動(dòng)態(tài)功耗和靜態(tài)功耗的和。優(yōu)化時(shí)如果減少了漏電功耗增加了動(dòng)態(tài)功耗,但它們的和減少了,優(yōu)化是有效的。反之亦然。我們可以通過設(shè)置開關(guān),使動(dòng)態(tài)功耗優(yōu)化和靜態(tài)功耗優(yōu)化用不同的努力級(jí)別(effort levels)和權(quán)重(weights)進(jìn)行優(yōu)化。
總功耗的優(yōu)化流程如下圖所示:
?
一個(gè)對(duì)應(yīng)的示例腳本如下所示:
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設(shè)置為多閾值電壓的庫(kù),用于做靜態(tài)功耗的優(yōu)化。讀入含有開關(guān)行為的saif文件,用于約束動(dòng)態(tài)功耗的優(yōu)化。在設(shè)置總功耗的約束時(shí),我們可以在set_max_total_power命令中使用靜態(tài)或/和動(dòng)態(tài)功耗權(quán)重(weight)的選項(xiàng),使工具在優(yōu)化時(shí),偏重于靜態(tài)或動(dòng)態(tài)功耗。假設(shè)P、Pd和Pl分別為總功耗、動(dòng)態(tài)功耗和靜態(tài)功耗,Wd和Wl分別為動(dòng)態(tài)功耗和靜態(tài)功耗的權(quán)重,則
總功耗P = (Wd*Pd+Wl*P1)/Wd
我們可以在DC或PC中設(shè)定只對(duì)功耗做優(yōu)化。這時(shí)候,工具僅優(yōu)化設(shè)計(jì)的功耗,而不會(huì)對(duì)更高優(yōu)先級(jí)的約束做任何的優(yōu)化和修正設(shè)計(jì)規(guī)則DRC違例。但是這種優(yōu)化也不會(huì)使設(shè)計(jì)的更高優(yōu)先級(jí)約束的性能變差和引起DRC違例。這種優(yōu)化的優(yōu)點(diǎn)在于運(yùn)行時(shí)間較短,可用于優(yōu)化設(shè)計(jì)的動(dòng)態(tài)功耗、靜態(tài)功耗和總功耗。在DC和PC中,只能以增量編輯的形式工作。
PC中只對(duì)功耗做優(yōu)化的命令如下:
set_max_total ??-power ?0 ?mw
physopt ???-only_power_recovery
DC中只對(duì)功耗做優(yōu)化的命令如下(由于現(xiàn)在PC在DC中,因此下面的腳本更常用):
set ??compile_power_opto_only ??true
set_max_leakage_power ?0 ?mw
compile ?-inc
現(xiàn)在來記錄一下門級(jí)層次(有點(diǎn)書也說是在系統(tǒng)級(jí))常用的一種低功耗方法——電源門控。
①電源門控概述與原理
電源門控是指芯片中某個(gè)區(qū)域的供電電源被關(guān)掉,即該區(qū)域內(nèi)的邏輯電路的供電電源斷開。電源門控(Power Gating)的設(shè)計(jì)如下圖所示:
?
?
如果某一模塊在一段時(shí)間內(nèi)不工作,可以關(guān)掉它的供電電源(關(guān)掉供電電源可以使用MTCMOS開關(guān),通常在使用后端工具進(jìn)行布局布線時(shí)加入MTCMOS,這屬于后端知識(shí),這里不進(jìn)行介紹)。斷電后,設(shè)計(jì)進(jìn)入睡眠模式,其漏電功率很小。喚醒時(shí),為了使模塊盡快恢復(fù)工作模式,需要保持關(guān)電前的狀態(tài)。保持寄存器(retention ?register)可用于記憶狀態(tài)。使用保持寄存器設(shè)計(jì)電源門控如下圖所示:
?
下面來解釋一下上面的設(shè)計(jì):
·在睡眠模式,寄存器的電源Vdd2被切斷,因此它的漏電功耗極小;這時(shí)候僅僅保持鎖存器處于工作狀態(tài),寄存器的值保留在鎖存器里。由于鎖存器是用高閾值電壓的晶體管組成,漏電功耗很低。
·當(dāng)Restore信號(hào)被激活時(shí),寄存器的電源Vdd2被加上,保留在鎖存器里的值被載入到寄存器。寄存器在工作(活躍)狀態(tài)時(shí),它作為一般的寄存器工作。Save/Restore引腳也稱為電源門控引腳(power gating pins),它們被用于把電路置于適當(dāng)?shù)哪J健?/p>
·電源門控模塊的輸出端需要使用隔離單元(Isolation Cell)(我們?cè)谇懊嬷v過),因?yàn)樵谒吣J綍r(shí),模塊的輸出為不確定值。為了保證在睡眠模式時(shí),下一級(jí)的輸入不會(huì)懸空,插入隔離單元,提供一個(gè)"1”或”0”的輸出,使下一級(jí)的輸入為確定的邏輯值,如下所示:
?
ISO為睡眠控制信號(hào),用于控制隔離單元的運(yùn)作。電路在正常工作模式時(shí),ISO=0,ISO_ IN=IN。電路在睡眠模式時(shí),ISO=1時(shí),如果使用下面左圖的單元作為隔離單元,輸出邏輯為“1";如使用下面右圖的單元作為隔離單元,則輸出邏輯為“0":
?
?
?
②工藝庫(kù)中的電源門控單元
進(jìn)行電源門控設(shè)計(jì),需要用綜合庫(kù)的支持。綜合庫(kù)中的電源門控單元的庫(kù)模型如下所示:
?
下面是庫(kù)模型的部分解釋:
·單元級(jí)屬性(Cell level attribute)
power_gating_cell:"type","type”不可以是“none”或空字符,它鑒別所描述的保持寄存器的類型。本例中保持寄存器的類型為PG_1。
·電源門控寄存器的功能描述
它是保持寄存器在活躍模式的功能。
·引腳級(jí)的屬性(Pin level attribute)
power_pin_1~ power_pin_5列出了現(xiàn)有的電源門控信號(hào)的名字。例如,power_pin_1可以用于定義為睡眠(sleep)信號(hào),power_pin_2可以用于定義叫醒(wake)信號(hào)。power_pin_[1-5]信號(hào)的默認(rèn)值是寄存器處于非工作(disable)狀況的值,可以是“0”或“1"。例如,如果當(dāng)power_pin_1的邏輯值為“1”時(shí),電路進(jìn)入睡眠模式,那么,其非工作(disable)狀況的值應(yīng)該是邏輯“0”。
?
③電源門控設(shè)計(jì)流程
了解了電源門控的原理和綜合庫(kù)的電源門控單元,下面我們就來介紹電源門控的設(shè)計(jì)流程。使用電源門控的設(shè)計(jì)流程和相應(yīng)的腳本如下所示:
?
下面進(jìn)行解釋一下部分命令:
·腳本中使用set_power_gating_style命令來映射保持寄存器。例如對(duì)于下面的代碼
······
always@ (posedge clk) ?begin:sub_block_1
??g=d;
end
······
set_power_gating ?-style ?-type ??PG_1 ?-hdl_block ??sub_block_1命令可以把代碼中的寄存器映射為保持寄存器。選項(xiàng)“-type PG_1”指定使用庫(kù)中類型為PG_1的保持寄存器。選項(xiàng)“-hdl_block ??sub_block_1”指定把RTL代碼中進(jìn)程(process)名為“sub_block_1"中的所有寄存器用類型為PCG_ 1的保持寄存器代替。
· 腳本中使用hookup_power_gating_ports命令來自動(dòng)插入power_pin[1-5]端口和層次模塊的引腳。同類功耗引腳的端口或引腳會(huì)被連接在一起。例如屬性同為“power_pin_1”的引腳將被連接在一起,其默認(rèn)名為“power_pin_1"。下圖為執(zhí)行hookup_power_gating_ports命令后設(shè)計(jì)中插入端口和層次模塊的引腳。我們可以使用選項(xiàng)“-default_port_naming_style”和“-port_naming_styles”來改變端口和/或?qū)哟文K引腳的命名:
?
下面的腳本用set_power_gating_signal命令指定把電源門控引腳與現(xiàn)有的端口或?qū)哟我_連接起來,如下所示:
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
結(jié)果如下所示:
?
·最后,我們可以用report_power_gating命令報(bào)告設(shè)計(jì)中的電源門控單元,如下所示:
?
總結(jié)
以上是生活随笔為你收集整理的(五)门级电路低功耗设计优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 转账引发数据一致性思考
 - 下一篇: ROS与navigation教程——基本