數(shù)字IC低功耗設(shè)計(jì)入門(mén)(五)——RTL級(jí)低功耗設(shè)計(jì)(續(xù))
掃描二維碼
隨時(shí)隨地手機(jī)看文章
這里就主要介紹一下使用門(mén)控時(shí)鐘進(jìn)行低功耗設(shè)計(jì)。
(4)門(mén)控時(shí)鐘
門(mén)控時(shí)鐘在我的第一篇博客中有簡(jiǎn)單的描述,這里就進(jìn)行比較詳細(xì)的描述吧。我們主要學(xué)習(xí)門(mén)控時(shí)鐘電路是什么、什么使用門(mén)控時(shí)鐘、綜合庫(kù)里的門(mén)控時(shí)鐘、如何使用門(mén)控時(shí)鐘、對(duì)門(mén)控時(shí)鐘的一些處理、手動(dòng)插入門(mén)控時(shí)鐘。我們重點(diǎn)介紹如何使用門(mén)控時(shí)鐘和門(mén)控時(shí)鐘的處理。
①門(mén)控時(shí)鐘概述
門(mén)控時(shí)鐘有兩種方案:一種直接針對(duì)寄存器的時(shí)鐘進(jìn)行門(mén)控,一種對(duì)模塊級(jí)別的時(shí)鐘進(jìn)行門(mén)控。相比之下,直接對(duì)寄存器的時(shí)鐘進(jìn)行門(mén)控更為靈活。因?yàn)樵诤芏鄷r(shí)候,我們不能保證剛好將不需要門(mén)控的寄存器與需要門(mén)控的寄存器分配在不同的模塊。因此我們主要介紹寄存器級(jí)的門(mén)控時(shí)鐘。
下圖是門(mén)控時(shí)鐘的一個(gè)簡(jiǎn)單電路圖:
上述電路圖中,將控制信號(hào)(EN)直接與時(shí)鐘信號(hào)(CLK)進(jìn)行與操作,以完成門(mén)控。門(mén)控后的時(shí)鐘信號(hào)GCLK送到寄存器陣列中。這樣,當(dāng)EN為0時(shí),該時(shí)鐘被關(guān)掉。相應(yīng)的波形如下所示:
可以看出,如果EN信號(hào)不加控制,會(huì)導(dǎo)致門(mén)控時(shí)鐘信號(hào)出現(xiàn)毛刺。時(shí)鐘上的信號(hào)出現(xiàn)毛刺是非常危險(xiǎn)的。所以在進(jìn)行門(mén)控時(shí),為了使門(mén)控時(shí)鐘不產(chǎn)生毛刺,使能信號(hào)必須滿足條件:它是寄存器的輸出,該寄存器的時(shí)鐘信號(hào)與要門(mén)控的時(shí)鐘信號(hào)是相同的。由于上述原因,雖然采用這種門(mén)控方式最直接,但在實(shí)際中很少采用。
為了解決這種問(wèn)題,引入基于鎖存器的門(mén)控時(shí)鐘方案,如下圖所示:
對(duì)應(yīng)的時(shí)序圖如下所示:
可以看到,這種方式消除了EN與CLK組合產(chǎn)生的毛刺對(duì)門(mén)控時(shí)鐘的影響。該方法的原理在于:鎖存器在CLK為低時(shí)透明。這樣,EN 信號(hào)上的毛刺僅出現(xiàn)在CLK的低電平處,EN1與CLK進(jìn)行與操作,可以將這部分毛刺消除掉。這樣,GCLK上就沒(méi)有毛刺了。
不過(guò)需要注意的是,如果在電路中,鎖存器與與門(mén)相隔很遠(yuǎn),到達(dá)鎖存器的時(shí)鐘與到達(dá)與門(mén)的時(shí)鐘有較大的延遲差別,則仍會(huì)出現(xiàn)毛刺,下面就來(lái)分析一下:
上述的右上圖中,B點(diǎn)的時(shí)鐘比A時(shí)鐘遲到,并且Skew > delay,這種情況下,產(chǎn)生了毛刺。為了消除毛刺,要控制Clock Skew,使它滿足Skew >Latch delay(也就是鎖存器的clk-q的延時(shí))。上述的右下圖中,B點(diǎn)的時(shí)鐘比A時(shí)鐘早到,并且|Skew| > ENsetup 一 (D->Q),這種情況下,也產(chǎn)生了毛刺。為了消除毛刺,要控制Clock Skew,使它滿足|Skew|< ENsetup一(D->Q)。
常見(jiàn)的是第一種毛刺,不過(guò)我們可以將這個(gè)邏輯做成一個(gè)單元,這樣就基本上能消除上面的那兩種毛刺了,即:
通常情況下,時(shí)鐘樹(shù)由大量的緩沖器和反相器組成,時(shí)鐘信號(hào)為設(shè)計(jì)中翻轉(zhuǎn)率最高的信號(hào),時(shí)鐘樹(shù)的功耗可能高達(dá)整個(gè)設(shè)計(jì)功耗30%。加入門(mén)控時(shí)鐘電路后,由于減少了時(shí)鐘樹(shù)的開(kāi)關(guān)行為,節(jié)省了開(kāi)關(guān)功耗。同時(shí),由于減少了時(shí)鐘引腳的開(kāi)關(guān)行為,寄存器的內(nèi)部功耗也減少了。采用門(mén)控時(shí)鐘,可以非常有效地降低設(shè)計(jì)的功耗,一般情況下能夠節(jié)省20%~60%的功耗。
此外,由于門(mén)控時(shí)鐘不需要用到MUX單元,加入門(mén)控時(shí)鐘電路后,設(shè)計(jì)的面積也減少了。門(mén)控時(shí)鐘電路的扇出越大,減低功耗和面積的效能越好。當(dāng)然,扇出太大了,又會(huì)產(chǎn)生時(shí)序等的問(wèn)題。
門(mén)控時(shí)鐘電路非常容易實(shí)現(xiàn),用工具自動(dòng)插入門(mén)控時(shí)鐘,不需要修改RTL代碼,門(mén)控時(shí)鐘與工藝無(wú)關(guān)。
這些優(yōu)點(diǎn)本來(lái)應(yīng)該放在總結(jié)處說(shuō)的,這里提前進(jìn)行敘述是為了能夠給大家一個(gè)印象。其中低功耗的優(yōu)點(diǎn)是通篇進(jìn)行講解的,然后降低面積和實(shí)現(xiàn)的問(wèn)題,我們會(huì)在后面的具體實(shí)現(xiàn)進(jìn)行講解。
②綜合庫(kù)中的門(mén)控時(shí)鐘模型
前面我們說(shuō)了,門(mén)控時(shí)鐘可以以三種方式實(shí)現(xiàn):一個(gè)與門(mén)(即不帶鎖存的門(mén)控時(shí)鐘)、分散的鎖存器+與門(mén)、集成的鎖存器+與門(mén)。在綜合庫(kù)中,與門(mén)、鎖存器是基本邏輯單元,因此可以構(gòu)成門(mén)控時(shí)鐘。此外,綜合庫(kù)中還專門(mén)提供了集成的門(mén)控單元。一般情況下,我們使用的是集成的門(mén)控單元,因?yàn)檫@個(gè)門(mén)控單元是對(duì)Skew作了控制,不存在前面描述的毛刺問(wèn)題。
一個(gè)示例的 綜合庫(kù)中的時(shí)鐘門(mén)控單元描述如下所示:
(該綜合庫(kù)模型中,E為門(mén)控信號(hào);CK為時(shí)鐘信號(hào);ENL是鎖存器輸出;ECK為對(duì)輸出門(mén)控后的時(shí)鐘信號(hào);statetable描述了該門(mén)控單元中內(nèi)部鎖存器的功能。該單元的其他內(nèi)容描述就不具體描述了,我在Tcl與Design Compiler這個(gè)分類的博客里面有對(duì)綜合庫(kù)進(jìn)行具體的介紹。)
③門(mén)控時(shí)鐘實(shí)現(xiàn)
我們要實(shí)現(xiàn)門(mén)控時(shí)鐘,首先就得從RTL代碼中進(jìn)行設(shè)置。在RTL代碼中將需要門(mén)控的寄存器寫(xiě)成“載入-使能”的形式,如下所示:
always @(posedge CLK)
if (EN)
Q <=D;
上述代碼中,如果EN有效,則寄存器在時(shí)鐘上升沿采樣數(shù)據(jù),否則保持原值。一般情況下,綜合會(huì)得到下圖右上角的電路,而插入門(mén)控時(shí)鐘的電路為下圖右下角的電路:
上圖的典型綜合結(jié)果中(即不使用門(mén)控時(shí)鐘的情況),在每個(gè)受EN使能控制的寄存器之前加入了一個(gè)MUX,當(dāng)EN信號(hào)有效時(shí),寄存器鎖存輸入信號(hào)D;否則保持原值。這種方法也能減少寄存器上的翻轉(zhuǎn),因而節(jié)省翻轉(zhuǎn)功耗。然而,這種“載入一使能”結(jié)構(gòu)中,每個(gè)寄存器都有一個(gè)MUX,假設(shè)MUX面積為4,則8位寄存器需要增加的面積為32。面積越大,意味著芯片成本越高,而且整體的功耗也會(huì)增加。另外,這種方式不能消除時(shí)鐘樹(shù)上的功耗。
對(duì)于右下角的門(mén)控時(shí)鐘形式的綜合電路,假設(shè)一個(gè)門(mén)控邏輯的面積為10,一個(gè)門(mén)控時(shí)鐘信號(hào)可以驅(qū)動(dòng)8位寄存器,則在門(mén)控時(shí)鐘電路中,對(duì)每8個(gè)寄存器需增加一個(gè)門(mén)控邏輯,增加的面積為10。由此可以看到,門(mén)控時(shí)鐘的電路比普通綜合結(jié)果的面積更小、功耗更低。
鑒于門(mén)控時(shí)鐘的優(yōu)點(diǎn),我們需要把普通的綜合結(jié)果“轉(zhuǎn)換”為門(mén)控時(shí)鐘的結(jié)果,我們主要是通過(guò)DC的power compiler來(lái)自動(dòng)實(shí)現(xiàn)的。我們主要通過(guò)命令來(lái)設(shè)置門(mén)控時(shí)鐘的風(fēng)格和通過(guò)命令“啟動(dòng)”插入門(mén)控時(shí)鐘。綜合工具根據(jù)我們所設(shè)置的時(shí)鐘門(mén)控的風(fēng)格,插入相應(yīng)的門(mén)控邏輯。因此,門(mén)控時(shí)鐘的實(shí)現(xiàn)主要有兩步,一步是設(shè)置門(mén)控時(shí)鐘的風(fēng)格,通過(guò)命令set_clock_gating_stale 及其選項(xiàng)來(lái)實(shí)現(xiàn);另一步就是在網(wǎng)表中加入門(mén)控時(shí)鐘,通過(guò)命令insert_clock_gating來(lái)實(shí)現(xiàn)。下面我們就來(lái)介紹一下這兩個(gè)設(shè)置,由于命令在不同版本的DC中有所不同,命令的具體選項(xiàng)就可能不一樣,這里就只介紹一些常用或者說(shuō)是可能用到的選項(xiàng)。
在執(zhí)行insert_clock_gating命令前,我們一般先使用set_clock_gating_style命令來(lái)指定要插入門(mén)控時(shí)鐘電路的結(jié)構(gòu)(或者說(shuō)是插入門(mén)控時(shí)鐘的風(fēng)格)。下面我們就來(lái)介紹一下使用這個(gè)set_clock_gating_style命令可以進(jìn)行插入哪些門(mén)控時(shí)鐘電路結(jié)構(gòu)。
-sequential_cell 選項(xiàng)設(shè)置是否采用基于鎖存器的風(fēng)格。因?yàn)槲覀兊拈T(mén)控時(shí)鐘有三種形式(不適用鎖存器的與門(mén),基于鎖存器+離散與門(mén),集成的鎖存器+與門(mén)),因此就要指定使用哪一種形式:
A:基于鎖存器的離散門(mén)控單元是默認(rèn)值,可以通過(guò)下面的命令來(lái)設(shè)置:
set_clock_gating_style -sequential_cell latch
B:不使用鎖存器的門(mén)控單元,可以通過(guò)下面的命令來(lái)設(shè)置:
set_clock_gating_style -sequential_cell none
C:使用集成的門(mén)控單元?jiǎng)t不需要使用這個(gè)-sequential_cell來(lái)設(shè)置了,因?yàn)?sequential_cell 選項(xiàng)設(shè)置是否采用基于鎖存器的風(fēng)格。使用集成的門(mén)控單元直接設(shè)置參數(shù)就可以了,例如可以通過(guò)下面的命令來(lái)設(shè)置使用集成的門(mén)控單元:
set_clock_gating_style “integrated”
一般推薦使用集成門(mén)控這種方式。
-positive_edg_logic選項(xiàng)(簡(jiǎn)寫(xiě)為-positive或-pos)設(shè)置在RTL代碼中用上升沿鎖存的寄存器(也就是上升沿沿觸發(fā)的寄存器)采用何種門(mén)控邏輯。
-negative_edg_logic選項(xiàng)(簡(jiǎn)寫(xiě)為-negative或-neg)設(shè)置在RTL代碼中用下降沿鎖存的寄存器(也就是下降沿觸發(fā)的寄存器)采用何種門(mén)控邏輯。
例如下面的命令:
set_clock_gating_style -sequential_cell none -pos “or”
該命令設(shè)置了不適用鎖存器的風(fēng)格,然后對(duì)于上升沿觸發(fā)的寄存器,其門(mén)控單元使用或門(mén)邏輯構(gòu)成。
set_clock_gating_style -neg “integrated”
該命令置在RTL代碼中用下降沿鎖存的寄存器(也就是下降沿觸發(fā)的寄存器)使用集成門(mén)控時(shí)鐘單元。
set_clock_gating_style -positive “integrated” -negative “integrated”
該命令設(shè)置RTL代碼中,無(wú)論你的寄存器是上升沿觸發(fā)還是下降沿觸發(fā),控制該寄存器的時(shí)鐘單元都是使用集成門(mén)控時(shí)鐘單元。
-minimum_bitwidth 選項(xiàng)用于設(shè)置進(jìn)行時(shí)鐘門(mén)控的寄存器陣列的最小寬度。對(duì)于寬度小于該設(shè)置的寄存器陣列,不進(jìn)行時(shí)鐘門(mén)控;然而當(dāng)電路由有公共使能時(shí),會(huì)對(duì)電路進(jìn)行分解進(jìn)行集體門(mén)控。例如下面的命令作用與下面的電路:
set_clock_gating_style -minimum_bitwidth 4
上述命令意味著一個(gè)門(mén)控時(shí)鐘至少要觸發(fā)4個(gè)寄存器。左圖中有3個(gè)寄存器組,每組只有3個(gè)寄存器,不能滿足至少要有4個(gè)寄存器的要求。因此,對(duì)于每個(gè)組的寄存器,不能用門(mén)控時(shí)鐘。然而,所有的3個(gè)寄存器組,都有1個(gè)公共的使能信號(hào)”a”,我們可以把它分解出來(lái)作為控制時(shí)鐘的門(mén)控信號(hào)。這樣一來(lái),信號(hào)“a”控制9個(gè)寄存器,它滿足最少要觸發(fā)4個(gè)寄存器的要求。因此將上面的命令約束上面左邊的電路時(shí),綜合得到結(jié)果就會(huì)成為右邊有門(mén)控時(shí)鐘的電路。
-num_stages選項(xiàng)用于設(shè)置一個(gè)多級(jí)門(mén)控的級(jí)數(shù)。在有些設(shè)計(jì)中,頂層的門(mén)控信號(hào)會(huì)分解成不同的子門(mén)控信號(hào)。在缺省情況下,僅對(duì)跟寄存器陣列相連的門(mén)控制信號(hào)生成門(mén)控邏輯。例如對(duì)于下面的電路圖:
在這個(gè)例子中,全局門(mén)控信號(hào)EN分別跟a,b,c信號(hào)組合,然后驅(qū)動(dòng)不同的寄存器陣列。缺省情形下(set_clock_gating_style命令的默認(rèn)設(shè)置為“num_stages”等于“1",缺省時(shí)也為1),跟寄存器陣列相連的門(mén)控信號(hào) 由門(mén)控單元給出。
由于所有的3個(gè)寄存器組都有1個(gè)公共使能“a",它可以被分解出來(lái)產(chǎn)生1個(gè)額外(級(jí))的門(mén)控時(shí)鐘單元。在set_clock_gating_style命令加選項(xiàng)“-num_stages 2",就可以產(chǎn)生下圖所示的兩級(jí)門(mén)控時(shí)鐘:
使用多級(jí)門(mén)控時(shí)鐘,時(shí)鐘綜合器可以盡量地?cái)[放門(mén)控時(shí)鐘單元,使它靠近時(shí)鐘源,從而最大限度地降低時(shí)鐘樹(shù)的功耗。
-control_point與-control_signal選項(xiàng)跟DFT有關(guān),用于設(shè)置該門(mén)控單元在DFT時(shí)是否可控,DFT控制信號(hào)是scan-enable還是test-mode,以及DFT控制信號(hào)與EN信號(hào)的組合邏輯是放在門(mén)邏輯中的鎖存器之前還是之后。通常,將DFT控制信號(hào)與EN信號(hào)進(jìn)行或操作,這樣在DFT時(shí),可以控制該門(mén)控邏輯。例如下面的命令約束:
set_clock_gating_style -control_point before -control_signal test_mode
設(shè)置得到下面的電路結(jié)構(gòu):
上圖給出了在門(mén)控邏輯中插入控制點(diǎn)的示例。在這個(gè)例子中,DFT控制信號(hào)為test_mode,控制點(diǎn)位于鎖存器之前。
-observation_point選項(xiàng)跟DFT有關(guān),用于設(shè)置是否要插入觀測(cè)邏輯,以便在DFT時(shí)能看到門(mén)控邏輯內(nèi)部的信號(hào)。
例如下面的約束命令:
set_clock_gating_style -observation_point true
則設(shè)置插入觀測(cè),邏輯,如下圖所示:
除了上述選項(xiàng)外,該命令還有一些其他的選項(xiàng)設(shè)置,比如-setup選項(xiàng)設(shè)置建立時(shí)間約束。-hold選項(xiàng)設(shè)置保持時(shí)間約束。-observation_logic_depth選項(xiàng)用于設(shè)置觀察電路中異或門(mén)的數(shù)目。-max_fanout選項(xiàng)設(shè)置一個(gè)門(mén)控單元所驅(qū)動(dòng)的最大負(fù)載數(shù)目,定義CG單元最大扇出的一個(gè)目的是減少CG后面的時(shí)鐘延遲,門(mén)控時(shí)鐘單元的扇出越大,它到達(dá)寄存器的延遲越長(zhǎng);此外,還有用來(lái)約束重新平衡(后面會(huì)有對(duì)重新平衡進(jìn)行介紹)。"set_clock_gating_style"命令有很多選項(xiàng),我們可以在Power Compiler用"man set_clock_gating_style"命令來(lái)查看其詳細(xì)的使用方法。
設(shè)置了門(mén)控時(shí)鐘的加入風(fēng)格之后,我們就可以設(shè)置在門(mén)級(jí)網(wǎng)表電路中加入門(mén)控時(shí)鐘。在Power Compile:里,用insert_clock_gating命令可在GTECH網(wǎng)表上加入門(mén)控時(shí)鐘。這個(gè)命令可以單獨(dú)使用,也可以配合一些選項(xiàng),設(shè)置一些功能,我們下面主要介紹一下-global選項(xiàng)。
我們來(lái)看一下下面這段代碼:
always @ (posedge clk)begin
if (a && b) q=d;
end
當(dāng)有多個(gè)模塊都有這段代碼時(shí),單單利用insert_clock_gating命令就會(huì)得到下面的帶門(mén)控時(shí)鐘的電路:
上述電路中,有兩個(gè)模塊都有門(mén)控時(shí)鐘,都是同一個(gè)控制信號(hào)。那么我們就可以使用insert_clock_gating -global選項(xiàng),讓門(mén)控時(shí)鐘可以穿越層次結(jié)構(gòu),插入到設(shè)計(jì)中。這樣一來(lái),既可以省門(mén)控時(shí)鐘,又可以省面積。使用該選項(xiàng)后,綜合得到的帶門(mén)控時(shí)鐘的電路如下所示:
因此使用insert_clock_gating加選項(xiàng)“-global",可以使門(mén)控時(shí)鐘穿越層次結(jié)構(gòu)。如果不用選項(xiàng)“-global",在每個(gè)模塊里有一個(gè)門(mén)控時(shí)鐘單元。
實(shí)現(xiàn)門(mén)控時(shí)鐘的方法就如前面所示,主要是設(shè)置門(mén)控時(shí)鐘的風(fēng)格和加入門(mén)控時(shí)鐘這兩個(gè)命令以及他們的一些選項(xiàng)。
④門(mén)控時(shí)鐘的處理
我們?cè)陂T(mén)級(jí)網(wǎng)表中加入門(mén)控時(shí)鐘之后,有時(shí)候需要對(duì)門(mén)控時(shí)鐘進(jìn)行修修改改,比如說(shuō)刪除一些門(mén)控時(shí)鐘之類的。下面我們就來(lái)介紹一下常見(jiàn)的一些門(mén)控時(shí)鐘處理。
重新連接門(mén)控時(shí)鐘
如下圖所示:
上面的左邊圖中,寄存器A由CG1觸發(fā)(也就是原來(lái)由上面的門(mén)控單元CG1進(jìn)行控制)。由于寄存器A距離門(mén)控時(shí)鐘單元CG2更接近,我們更想讓寄存器A與門(mén)控單元CG2進(jìn)行連接來(lái)減少連線的長(zhǎng)度,因此我們需要進(jìn)行重新連接。重新連接后,寄存器A由CG2觸發(fā),如上面右邊的圖所示。上面重新連接所使用的命令如下所示:
rewire_clock_gating -gating_cell CG2 -gated_objects {reg_A}
此外,我們可以使用rewire_clock_gating的-proximity選項(xiàng),使用這個(gè)選項(xiàng)后,Power Compiler會(huì)自動(dòng)重新連接寄存器,使時(shí)鐘門(mén)控單元CG到寄存器的連線最短:
rewire_clock_gating -proximity
重新平衡門(mén)控時(shí)鐘的扇出
如下圖所示:
左圖是原來(lái)的設(shè)計(jì)。當(dāng)我們對(duì)電路進(jìn)行優(yōu)化時(shí)(比如使用compiler_utral -retiming 或者 optimize_registers命令),設(shè)計(jì)中的寄存器可能被移動(dòng)或刪除,如中圖所示。
寄存器優(yōu)化后,門(mén)控時(shí)鐘的扇出不平衡。而門(mén)控時(shí)鐘有最小和最大扇出的約束,對(duì)于每一個(gè)單獨(dú)的CG單元(如中圖所示)最小扇出的條件不能滿足。Power Compiler就需要相關(guān)的命令重新平衡門(mén)控時(shí)鐘的扇出,使用的命令如下所示:
rewire_clock_gating -balance_fanout
使用上述命令后,Power Compiler將CG單元合并,以滿足最小/最大扇出的約束。重新平衡后的設(shè)計(jì)如右圖所示。
合并門(mén)控時(shí)鐘
如果兩個(gè)或以上的門(mén)控時(shí)鐘單元的輸人邏輯相等,它們可以被合并。合并只能在一個(gè)層次內(nèi)部進(jìn)行。合并后,冗余的邏輯被刪除。如下圖所示:
合并的命令為"merge_clock_gating_cells"
刪除門(mén)控時(shí)鐘
有時(shí)候,我們需要?jiǎng)h除某些門(mén)控時(shí)鐘,這個(gè)時(shí)候我可以使用remove_clock_gating命令。該命令即一些選項(xiàng)如下所示:
remove_clock_gating
[-gating_cells CG_cells_list]
[-gated_registers gated_register_list]
[-all] [hier]
如下圖所示:
上圖上半部分是使用了-gated_registers這個(gè)選項(xiàng),將原來(lái)的門(mén)控單元?jiǎng)h除,換成“使能-載入”模式;上圖的下半部分是使用了-gating_cells這個(gè)選項(xiàng),原來(lái)的一個(gè)門(mén)控時(shí)鐘刪除。
因此我們可以通過(guò)指定門(mén)控時(shí)鐘單元或通過(guò)指定寄存器刪除門(mén)控時(shí)鐘。如果在使用刪除門(mén)控時(shí)鐘命令時(shí)用了開(kāi)關(guān)選項(xiàng)“-all",當(dāng)前設(shè)計(jì)中的所有門(mén)控時(shí)鐘都會(huì)被刪除。
⑤手動(dòng)插入門(mén)控時(shí)鐘
上面介紹的是使用EDA工具,配合代碼自動(dòng)生成門(mén)控時(shí)鐘。我們也可以以手工的方式設(shè)計(jì)門(mén)控時(shí)鐘,下面是一個(gè)手動(dòng)設(shè)計(jì)門(mén)控時(shí)鐘的的代碼例子:
assign Gated_Clock = Clock&Enable ;
always@(posedge Gated_Clock or negedge Reset)begin
if(!Reset)
Data_ Out<=8’b0;
else
Data Out<=Data Out+8'b1
end
對(duì)于手工門(mén)控時(shí)鐘,Power Compiler將不插入時(shí)鐘門(mén)控單元,也不能對(duì)它進(jìn)行操作(比如重新平衡之類的)。
手工門(mén)控時(shí)鐘可以被取代,取代的腳本如下:
······
create_clock -period 5 [get_ports clk]
set_clock_gating_style ...
replace_clock -gating_cells
······
取代前后的電路如下所示:
取代手工門(mén)控時(shí)鐘的好處在于:取代后,它可以避免產(chǎn)生潛在的毛刺(glitch),也可以允許在它上使用其他的CG命令。例如我們可以使用remove_clock_gating命令去掉門(mén)控時(shí)鐘或使用rewire_clock_gating命令重新連接門(mén)控時(shí)鐘。
門(mén)控時(shí)鐘的低功耗設(shè)計(jì)到這里就介紹完了,關(guān)于門(mén)控的STA、DFT和CTS的問(wèn)題我們就不進(jìn)行介紹了。
(5)其他
有的時(shí)候,我們不經(jīng)意間就會(huì)引入多余的翻轉(zhuǎn),多余翻轉(zhuǎn)就引起的多余的功耗。下面是多余翻轉(zhuǎn)的例子(類似于操作數(shù)隔離):
上圖中,當(dāng)load_out無(wú)效時(shí),如果laod_op有效,那么數(shù)據(jù)就會(huì)進(jìn)行操作,也就是存在相應(yīng)的翻轉(zhuǎn)。因?yàn)檩敵鍪菬o(wú)效的,所以這些翻轉(zhuǎn)是多余的,消耗了功耗,但卻沒(méi)有輸出。因此我們就要注意,當(dāng)load_out無(wú)效時(shí),load_op也要設(shè)置為無(wú)效,這樣就可以節(jié)省部分功耗。
對(duì)于上面的多余翻轉(zhuǎn),可以進(jìn)行相應(yīng)的壓縮來(lái)節(jié)省功耗,如下所示:
sel_in同時(shí)控制了數(shù)據(jù)輸入和多路選擇器的輸出。SEL=0時(shí),讀入A和B,選通操作1;SEL=1時(shí),讀入C和D,選通操作2;這時(shí)候就可以減少另一半操作引起的翻轉(zhuǎn),從而減少了功耗。
對(duì)于這種數(shù)據(jù)輸入,然后進(jìn)行操作選擇性輸出的,可以進(jìn)行相應(yīng)的門(mén)控來(lái)減少多余的翻轉(zhuǎn),從而減少功耗。
結(jié)合綜合進(jìn)行RTL級(jí)的低功耗就如上所述了,重點(diǎn)是門(mén)控時(shí)鐘的使用和操作數(shù)隔離技術(shù),這是我們前端設(shè)計(jì)人員需要懂的。





