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





