芯片功耗組成中,有高達(dá)40%甚至更多是由時鐘樹消耗掉的。這個結(jié)果的原因也很直觀,因?yàn)檫@些時鐘樹在系統(tǒng)中具有最高的切換頻率,而且有很多時鐘buffer,而且為了最小化時鐘延時,它們通常具有很高的驅(qū)動強(qiáng)度。此外,即使輸入和輸出保持不變,接收時鐘的觸發(fā)器也會消耗一定的功耗。而且這些功耗主要是動態(tài)功耗。
那么減少時鐘網(wǎng)絡(luò)的功耗消耗,最直接的辦法就是如果不需要時鐘的時候,就把時鐘關(guān)掉。這種方法就是大家熟悉的門控時鐘:clock gating。(大家電路圖中看到的CG cell就是門控時鐘了)。
1 門控時鐘的結(jié)構(gòu)
1.1 與門門控
如果讓我們設(shè)計一個門控時鐘的電路,我們會怎么設(shè)計呢?最直接的方法,不需要時鐘的時候關(guān)掉時鐘,這就是與操作,我們只需要把enable和CLK進(jìn)行“與”操作不就行了么,電路圖如下:
這種直接將控制EN信號和時鐘CLK進(jìn)行與操作完成門控的方式,可以完成EN為0時,時鐘被關(guān)掉。但是同時帶來另外一個很大的問題:毛刺
如上圖所示,EN是不受控制的,隨時可能跳變,這樣純組合輸出GCLK就完全可能會有毛刺產(chǎn)生。時鐘信號上產(chǎn)生毛刺是很危險的。實(shí)際中,這種直接與門的方式基本不會被采樣。
所以我們需要改進(jìn)電路,為了使門控時鐘不產(chǎn)生毛刺,我們必須對EN信號進(jìn)行處理,使其在CLK的高低電平期間保持不變,或者說EN的變化就是以CLK為基準(zhǔn)的。
1 很自然的我們會想到觸發(fā)器,只要把EN用CLK寄存一下,那么輸出就是以CLK為基準(zhǔn)的;
2 其實(shí)還有一種辦法是鎖存器,把EN用鎖存器鎖存的輸出,也是以CLK為基準(zhǔn)的。
1.2 鎖存門控
我們先看一下第二種電路,增加鎖存器的電路如下:
對應(yīng)的時序如下:
可以看到,只有在CLK為高的時候,GCLK才可能會輸出高,這樣就能消除EN帶來的毛刺。這是因?yàn)镈鎖存器是電平觸發(fā),在clk=1時,數(shù)據(jù)通過D鎖存器流到了Q;在Clk=0時,Q保持原來的值不變。
雖然達(dá)到了我們消除毛刺的目的,但是這個電路還有兩個缺點(diǎn):
1如果在電路中,鎖存器與與門相隔很遠(yuǎn),到達(dá)鎖存器的時鐘與到達(dá)與門的時鐘有較大的延遲差別,則仍會出現(xiàn)毛刺。
2 如果在電路中,時鐘使能信號距離鎖存器很近,可能會不滿足鎖存器的建立時間,會造成鎖存器輸出出現(xiàn)亞穩(wěn)態(tài)。
如下圖分析所示:
上述的右上圖中,B點(diǎn)的時鐘比A時鐘遲到,并且Skew > delay,這種情況下,產(chǎn)生了毛刺。為了消除毛刺,要控制Clock Skew,使它滿足Skew >Latch delay(也就是鎖存器的clk-q的延時)。上述的右下圖中,B點(diǎn)的時鐘比A時鐘早到,并且|Skew| > ENsetup 一 (D->Q),這種情況下,也產(chǎn)生了毛刺。為了消除毛刺,要控制Clock Skew,使它滿足|Skew|< ENsetup一(D->Q)。
1.3 寄存門控
如1.1中提到的,我們還有另外的解決辦法,就是用寄存器來寄存EN信號再與上CLK得到GCLK,電路圖如下所示:
時序如下所示:
由于DFF輸出會delay一個周期,所以除非CLKB上升沿提前CLKA很多,快半個周期,才會出現(xiàn)毛刺,而這種情況一般很難發(fā)生。但是,這種情況CLKB比CLKA遲到,是不會出現(xiàn)毛刺的。
當(dāng)然,如果第一個D觸發(fā)器不能滿足setup時間,還是有可能產(chǎn)生亞穩(wěn)態(tài)。
1.4 門控時鐘結(jié)構(gòu)選擇
那么到底采用哪一種門控時鐘的結(jié)構(gòu)呢?是鎖存結(jié)構(gòu)還是寄存結(jié)構(gòu)呢?通過分析,我們大概會選擇寄存器結(jié)構(gòu)的門控時鐘,這種結(jié)構(gòu)比鎖存器結(jié)構(gòu)的問題要少,只需要滿足寄存器的建立時間就不會出現(xiàn)問題。
那么實(shí)際中是這樣么?答案恰恰相反,SOC芯片設(shè)計中使用最多的卻是鎖存結(jié)構(gòu)的門控時鐘。
原因是:在實(shí)際的SOC芯片中,要使用大量的門控時鐘單元。所以通常會把門控時鐘做出一個標(biāo)準(zhǔn)單元,由工藝廠商提供。那么鎖存器結(jié)構(gòu)中線延時帶來的問題就不存在了,因?yàn)槭亲龀梢粋€單元,線延時是可控和不變的。而且也可以通過挑選鎖存器和增加延時,總是能滿足鎖存器的建立時間,這樣通過工藝廠預(yù)先把門控時鐘做出標(biāo)準(zhǔn)單元,這些問題都解決了。
那么用寄存器結(jié)構(gòu)也可以達(dá)到這種效果,為什么不用寄存器結(jié)構(gòu)呢?那是因?yàn)槊娣e!一個DFF是由兩個D鎖存器組成的,采樣D鎖存器組成門控時鐘單元,可以節(jié)省一個鎖存器的面積。當(dāng)大量的門控時鐘插入到SOC芯片中時,這個節(jié)省的面積就相當(dāng)可觀了。
所以,我們在工藝庫中看到的標(biāo)準(zhǔn)門控時鐘單元就是鎖存結(jié)構(gòu)了:
當(dāng)然,這里說的是SOC芯片中使用的標(biāo)準(zhǔn)庫單元。如果是FPGA或者用RTL實(shí)現(xiàn),個人認(rèn)為還是用寄存器門控加上setup約束來實(shí)現(xiàn)比較穩(wěn)妥。
2 RTL中的門控時鐘
通常情況下,時鐘樹由大量的緩沖器和反相器組成,時鐘信號為設(shè)計中翻轉(zhuǎn)率最高的信號,時鐘樹的功耗可能高達(dá)整個設(shè)計功耗40%。
加入門控時鐘電路后,由于減少了時鐘樹的翻轉(zhuǎn),節(jié)省了翻轉(zhuǎn)功耗。同時,由于減少了寄存器時鐘引腳的翻轉(zhuǎn)行為,寄存器的內(nèi)部功耗也減少了。采用門控時鐘,可以非常有效地降低設(shè)計的功耗,一般情況下能夠節(jié)省20%~60%的功耗。
那么RTL中怎么才能實(shí)現(xiàn)門控時鐘呢?答案是不用實(shí)現(xiàn)?,F(xiàn)在的綜合工具比如DC會自動插入門控時鐘。如下圖所示:
這里有兩點(diǎn)需要注意:
- 插入門控時鐘單元后,上面電路中的MUX就不需要了,如果數(shù)據(jù)D是多bit的(一般都是如此),插入CG后的面積可能反而會減少;
- 如果D是單bit信號,節(jié)省的功耗就比較少,但是如果D是一個32bit的信號,那么插入CG后節(jié)省的功耗就比較多了。
這里的決定因素就是D的位寬了,如果D的位寬很小,那么可能插入的CG面積比原來的MUX大很多,而且節(jié)省的功耗又很少,這樣得不償失。只有D位寬超過了一定的bit數(shù)后,插入CG的收益就比較大。
那么這個臨界值是多少呢?不同的工藝可能不一樣,但是DC給的默認(rèn)值是3.
也就是說,如果D的位寬超過了3bit,那么DC就會默認(rèn)插入CG,這樣綜合考慮就會有收益。
我們可以通過DC命令:
set_clock_gating_style -minimum_bitwidth 4
來控制芯片中,對不同位寬的寄存器是否自動插入CG。一般情況都不會去修改它。
2.1 RTL 門控時鐘編碼風(fēng)格
雖然現(xiàn)在綜合工具可以自動插入門控時鐘,但是如果編碼風(fēng)格不好,也不能達(dá)到自動插入CG的目的。比較下面兩種RTL寫法:
左邊的RTL代碼能夠成功的綜合成自動插入CG的電路;
右邊的RTL不能綜合成插入CG的電路;
右邊電路在d_valid為低時,d_out也會一直變化,其實(shí)沒有真正的數(shù)據(jù)有效的指示信號,所以綜合不出來插入CG的電路。
需要注意的是,有的前端設(shè)計人員,為了仿真的時候看的比較清楚,很容易會寫成右邊的代碼,這樣不僅不能在綜合的時候自動插入CG來減少功耗;而且增加了d_out的翻轉(zhuǎn)率,進(jìn)一步增加了功耗。
在不用的時候把數(shù)據(jù)設(shè)成0并不能減少功耗,保持?jǐn)?shù)據(jù)不變化才能減少toggle,降低功耗!
所以我們在RTL編寫的時候一定要注意。
作為前端設(shè)計者,了解這些知識就足夠了,如果想深入了解綜合的控制,可以去了解
set_clock_gating_style 這個核心控制命令。
后記
門控時鐘是低功耗技術(shù)的一種常規(guī)方法,應(yīng)用已經(jīng)很成熟了,所以很多人會忽視它的存在和注意事項,也不了解它的具體時序。本文從SOC前端設(shè)計的角度詳細(xì)解釋了各種門控時鐘的結(jié)構(gòu)和RTL編碼需要注意的事項,希望能對設(shè)計人員有所幫助。
版權(quán)聲明:
本文作者:烓圍瑋未。主要從事ISP/MIPI/SOC/車規(guī)芯片設(shè)計
首發(fā)于知乎專欄:芯片設(shè)計進(jìn)階之路
微信公眾號:芯片設(shè)計進(jìn)階之路
轉(zhuǎn)發(fā)無需授權(quán),請保留這段聲明。
評論