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