先說為什么要做clock switching,在現(xiàn)代的SoC設(shè)計中,很多時候我們設(shè)計的模塊并不是要跑在一個固定的頻率下,而是根據(jù)性能和功耗的要求要跑在不同的時鐘頻率下,當(dāng)需要降低功耗以及不需要很高性能的時候,我們可以降低時鐘頻率,將驅(qū)動這個模塊的時鐘換成一個慢速時鐘。通常時鐘控制模塊會產(chǎn)生不同頻率的時鐘,可能來自不同的PLL,也可能是來自不同的時鐘分頻器,然后有選擇邏輯來選擇讓哪一個時鐘驅(qū)動電路。
那么針對這個,面試官可能直接問你如何做時鐘切換。如果你對于時鐘切換完全沒有概念,你腦子里可能想到的是一個MUX結(jié)構(gòu),如下圖所示
看起來解決了問題,當(dāng)SEL為0的時候,CLK0被上面的AND門給block住,當(dāng)SEL為1的時候,CLK1被下面的AND門給block住。但是問題會出在SEL變化的時候,AND的門變化是立刻的,當(dāng)SEL恰好在CLK0為高的時候從1變?yōu)?,或者恰好在CLK1為高的時候從0變?yōu)?,那么輸出的CLK_OUT就會產(chǎn)生一個毛刺glitch。
(電路中產(chǎn)生了glitch為什么有害?)
那么接下來我們就要思考如何避免毛刺的產(chǎn)生。一個思路就是,我們要先把當(dāng)前正選中的時鐘完全停下來,然后再切換成我們想要的目標(biāo)時鐘。
然后問題就變成了,我們在什么時候可以把當(dāng)前時鐘停下來且無毛刺,以及我們在什么時候可以讓目標(biāo)時鐘通過且無毛刺。
關(guān)于什么時候讓時鐘停下來且無毛刺,我們回想一下我們在設(shè)計clock gating里也遇到過類似的問題,解決的辦法是利用一個負(fù)沿觸發(fā)的latch,使得真正的gating發(fā)生在clock為低的時候。這里我們也要利用這個想法,即在clock為低的時候停住clock。相應(yīng)的,對于目標(biāo)clock,我們也在它為低的時候打開,這樣下一個正沿就可以完整的輸出。
利用clock gating的設(shè)計,這樣我們就可以得到下面一個電路:
上面的兩個flop注意都是負(fù)沿觸發(fā)的,也就是說它們的Q會在CLK1和CLK2的下降沿到來之后才發(fā)生變化,這樣就可以保證CLK1/2為高的半個周期完整的輸出,同時,切換為另外一路的時候由于Flop之前的AND門,也保證了即使SELECT立刻變化,AND門的輸出也是在另外一路停下來之后才能發(fā)生變化,這樣就保證了先停一路,再切另外一路。
看起來問題解決了,但是上面的電路有什么問題呢?如果你看過老李之前的跨時鐘域系列文章,應(yīng)該很迅速地發(fā)現(xiàn),這里面有個CDC的問題。請問,SELECT信號到底是同步于CLK1還是CLK2呢?甚至有沒有可能SELECT信號是異步于CLK1和CLK2呢?我們說,如果CLK1和CLK2為兩個異步的CLK,那么SELECT至多和其中之一同步,和另外一路必然異步。既然是一個異步信號,那么直接去寄存器的D端就會產(chǎn)生CDC的問題,flop可能會產(chǎn)生亞穩(wěn)態(tài)!當(dāng)flop出現(xiàn)亞穩(wěn)態(tài)的時候,輸出CLK_OUT當(dāng)然也不是干凈穩(wěn)定的,造成的惡果不亞于毛刺!
好,那么要怎么解決問題亞穩(wěn)態(tài)的問題?很簡單加synchronizer,也就是要在flop前面再加一級flop,來達(dá)到利用2flop synchronizer來synchronize SELECT的目的。電路變成下面
這樣我們就解決了metastable的問題。一般來說,面試的時候你能把上面這個電路圖畫出來,并且解釋清楚里面每一個門的作用,以及這樣設(shè)計的思路,基本就達(dá)到了面試官的考察要求。
當(dāng)然老李給大家分析面試題通常都不會止步于此,上面的這個電路結(jié)構(gòu)大家在任何地方一搜索就可以得到。老李下面帶來時鐘切換中更加進(jìn)階的干貨內(nèi)容。
我們再來仔細(xì)思考上面的電路,有幾個點需要注意
- 因為synchronizer的引入,當(dāng)SEL變化到en0發(fā)生變化需要2個CLK0周期,之后才能把CLK0停下來。也就是說,當(dāng)前CLK不是立刻停下來的,這一點大家在設(shè)計模塊的時候要留心一下,不能想當(dāng)然認(rèn)為SEL一變化CLK立刻就會停。
- 而由于另外一路的synchronizer的延時,當(dāng)之前的CLK停下之后,目標(biāo)clock也不是立刻開始反轉(zhuǎn),所以兩個clock切換中間會有一段時間CLK_OUT沒有clock,這個gap對你的系統(tǒng)是否有影響要仔細(xì)考慮。
- 我們說是利用1個clock周期去使得metastable來穩(wěn)定下來。但就上面這個設(shè)計而言,我們在負(fù)沿觸發(fā)的flop之前只加了一級正沿觸發(fā)的flop,這樣留給flop輸出穩(wěn)定下來的時間只有 半個周期 。可能會使得MTBF達(dá)不到我們需要的值,所以這其實是一個trade off,你可以在前面再加一級正沿觸發(fā)的flop,這樣變成真正的2flop synchronizer。但是代價就是需要更多一個周期來停下clock,以及中間沒有clock的gap時間更長。
- 在綜合以及PNR的時候,對于后面的兩個AND門和OR門要設(shè)為dont touch,避免綜合工具給替換成別的cell。
下面老李可能會問,如果我不希望你用負(fù)沿觸發(fā)的flop,因為我的工藝庫里面沒有,那么你要怎么設(shè)計?
思路就是用一個clock gating cell來替換掉上面的negedge flop和AND 門,clock gating我們說過打開時鐘和關(guān)閉時鐘都是無毛刺的。所以你可能會想到下面的電路
但是很不幸,上面的電路看起來完美無缺,但是其實并不能達(dá)到無毛刺的時鐘切換。往下看老李的提示之前,請你自己思考一下為什么?和上面的negedge flop + AND有什么區(qū)別呢?
其實原因就是en0變?yōu)?的時候CLK_OUT并不是立刻停住的!這是clock gating cell的特征。那么當(dāng)你把en0b傳給下一路,下面CLK1可能會在CLK0沒有完全停下的時候就打開了,還是會產(chǎn)生glitch。你可能會說,en0b到en1不還得經(jīng)過一段時間嗎?en1變?yōu)?到ICG打開不也得要時間嗎?你期望CLK0利用這段時間完全關(guān)斷。但是這并不一定,因為你并不知道CLK0和CLK1的頻率關(guān)系,如果CLK1比CLK0快很多,下面的synchronizer delay可能并不夠。我們要設(shè)計的是一個能夠在clk0和clk1在任意頻率下都可以工作的電路。
所以改進(jìn)的設(shè)計是要在en0之后再加一級flop,將延一拍之后的en0b_dly反饋給另外一路,這樣才能保證在當(dāng)前路完全關(guān)斷的情況下切換。
再擴(kuò)展問一個問題,上面我們設(shè)計的都是兩路clock之間進(jìn)行切換,如果要求你設(shè)計一個多路時鐘切換的電路,甚至要求時鐘的路數(shù)是參數(shù)化的,你要怎么設(shè)計呢?
關(guān)于多路時鐘切換,第一個要考慮的問題是,如何設(shè)計SEL?是用binary來編碼SEL還是別的方式?這里推薦用獨熱碼onehot來編碼SEL,因為任意時刻只會選中其中一路,天然就和onehot的編碼性質(zhì)相同,也就是N路clock,那么SEL就是N位,每一位對應(yīng)一路。利用onehot encoding的還有一個好處是參數(shù)化方便,如果利用binary,那么可能會遇到不合法的輸入,比如只有3路clock,但是SEL=2‘b11。
另外一個要考慮的問題是最后的那個OR門的實現(xiàn),當(dāng)我們只有2路,3路clock需要切換的時候,庫里面有2輸入的普通OR門,但是并不推薦大家直接用。原因在于,由于最終我們輸出的是一個時鐘信號,那么我們通常要求時鐘信號的transition是非常干凈的,而且上升沿和下降沿是平衡的,即tr(rising delay)和tf(falling delay)是幾乎差不多的,而普通的2輸入OR門并不保證它們tr和tf相等,而且是與2輸入中連哪一個輸入pin有關(guān)。為了解決這個問題,工藝庫廠家一般會提供一些特殊的CELL,進(jìn)行了專門的設(shè)計,可以使得tr和tf幾乎相等,并且兩個輸入pin的延時也是一樣的,并不區(qū)分,所以我們要例化那些特殊的專門給clock path上用的cell。但是當(dāng)輸入變成了多路clock,比如4路,5路,甚至更多路比如8路,16路的時候,廠家也不會提供balanced 多輸入clock OR cell。這個時候我們就要專門利用NAND tree來實現(xiàn)最后的OR邏輯,并且要保證每一路所需要的NAND cell delay是一樣的(思考題:為什么要balance每一路?)舉個例子一個利用NAND tree來達(dá)到2input OR的結(jié)構(gòu)如下
最后再提一個很多人都會忽視的問題,請問大家,在上面設(shè)計的無毛刺時鐘切換電路,對于其中synchronizer flop,以及clock gating cell,你有沒有考慮reset信號的影響? 如果你的reset信號是異步reset,那么當(dāng)你reset active的時候,clock會立刻被切斷,那么是不是也會產(chǎn)生glitch?
這個問題的解決思路有兩個,一是假設(shè)你在reset狀態(tài)下選中的是clock0,那么需要你在assert reset之前要先切換到clock0;如果不是,比如reset assert的時候是clock3,那么你需要保證所有被clock3驅(qū)動的下游邏輯也都會被這個reset信號給復(fù)位。
-
分頻器
+關(guān)注
關(guān)注
43文章
445瀏覽量
49587 -
SoC設(shè)計
+關(guān)注
關(guān)注
1文章
147瀏覽量
18720 -
CDC技術(shù)
+關(guān)注
關(guān)注
0文章
9瀏覽量
6834 -
PLL電路
+關(guān)注
關(guān)注
0文章
92瀏覽量
6371
發(fā)布評論請先 登錄
相關(guān)推薦
評論