芯片設計中跨時鐘域CDC的那些事 天天新消息

2023-06-20 16:15:26 來源:IC加油站

這里我們先復習一下同步電路和異步電路的概念。在現代SoC設計中,絕大多數的電路都是同步電路。同步電路是由時鐘驅動存儲元件的電路,也就是說存儲元件的狀態只在時鐘沿到來的時候才能發生變化。因為組合邏輯電路在輸入變化時輸出可能出現毛刺(glitch),而存儲元件因為只會在時鐘沿到來時才會更新狀態,那么在時鐘沿之間的時間狀態是穩定的,這樣的同步電路可以消除組合電路中的毛刺,如下圖所示。


(資料圖)

相應的,時鐘周期的大小取決于最長的傳輸延時(propagation delay)。同步電路的好處是時序很清晰,電路中的存儲元件例如觸發器都是依照一個固定的節拍來工作,便于EDA工具來進行延時的分析和計算,所以同步電路幾乎占據了當前數字芯片的絕大多數部分。

而異步電路就沒有時鐘的概念了,存儲元件所存的狀態跟隨了輸入信號的變化立刻發生變化。信號之間的傳遞通常通過握手(handshake)來完成,因為沒有時鐘的約束,每一級存儲元件之間的邏輯電路都是各自獨立的,可以各自進行優化,這樣可以達到很好的性能。但是這既是優勢,也是劣勢。劣勢就在于EDA工具沒有滿足每一級都單獨優化的計算能力,而且由于相鄰的級之間互相影響,使得計算總的時序時變得異常復雜,所以異步電路的規模通常無法做大,進而也限制了它的用途。目前更多的也只是在學術研究方面,并沒有成為當今SoC設計的主流。下面這個例子實現了一個狀態存儲單元,next state Y會依據當前狀態以及R,S的值立刻發生變化,顯然這樣的狀態變化更加快速,但是分析起來也更加復雜。

我們接下來的跨時鐘域分析,當然都是基于同步電路的。同步電路的核心就是觸發器,觸發器的種類有很多種,最常用的就是D觸發器。在這里我們還是首先復習一下基本概念: 建立時間setup time和保持時間hold time, 以及亞穩態metastability。

setup time:時鐘沿到來之前輸入信號D必須保持穩定的最小時間

hold time:時鐘沿到來之后輸入信號D必須保持穩定的最小時間

clk-to-q time:輸入D滿足setup/hold time要求,從時鐘沿到來時刻到輸出端Q變化至穩定的時間

那么當輸入信號D無法滿足setup time 或者hold time的要求,我們稱之為產生了setup time / hold time violation, Flop Q的輸出這個時候是0還是1是不確定的,需要一定的時間才能夠穩定在0或者1。所以如果當Q端在clk-to-q時間之后才變得穩定的話,我們就說這個觸發器產生了亞穩態metastability。

很多工程師在面試的時候都可以回答得上setup time和hold time的定義,但是回答不上為什么D觸發器有setup time和hold time的要求。這個問題其實大家在學校里學過,如果你在面試的時候被問到卻不知道,那么你應該回去好好復習一下基礎知識。它們與D觸發器的內部結構有關系。D觸發器的內部是一個主從鎖存器(master-slave latch),一個常見的D觸發器結構如下圖所示

Latch能夠存儲住狀態,靠的是上面的背靠背的反相器。而這個背靠背的反相器能夠鎖住狀態是需要時間的。由此,我們可以分析出

setup time: 在clk的上升沿到來之前,D要傳輸到Z的時間。因為當Z的值還沒有穩定的時候,D如果變化,那么這個背靠背的反相器就無法鎖住值。

hold time: 第一個傳輸門關閉需要的時間,在傳輸門關閉期間,D->W要保持穩定,這樣在傳輸門關閉之后,W穩定才不會導致背靠背反相器鎖住的值發生變化。

所以我們可以看出,當D在setup/hold time window內發生變化,鎖存器可能無法鎖住一個穩定的值,會發生的結果是

Q的值可能不是正確的D隨著D的變化越靠近時鐘沿,Q變穩定的時間越長最后Q穩定到的值可能是隨機的

注意我們并不是說Q最后的值不是穩定的1或者0, Q的值最后一定會穩定下來,穩定在高電平或者低電平,這是由于背靠背的反相器會產生正反饋,最終一定會穩定下來。但是當這個穩定的時間超出了clk-to-q的限制,我們就說產生了亞穩態。

接下來我們就可以正式進入跨時鐘域的討論了。當只有一個時鐘存在時,life is simple,只要保證setup/hold time就好了,那么當有多個時鐘存在的時候會發生什么呢?我們來看最簡單的情況,如下圖所示,aclk時鐘域的信號需要傳輸到bclk時鐘域去。在各自時鐘域內,EDA工具可以保證觸發器不會產生metastable,但是當aclk和bclk異步的時候,我們是無法保證aclk和bclk之間的關系的,也就是說adata相對于bclk的沿來說,可能在任何時候發生變化,這樣bdata這個flop就可能產生亞穩態。

當bdata發生亞穩態的時候,會造成什么影響呢?影響主要發生在bclk時鐘域的后級電路上,讓后級電路無法sample到一個確定的正確的值,進而導致運算邏輯錯誤。

在這里要澄清的一點是,亞穩態的出現并導致邏輯錯誤并且芯片失效是一個概率事件,而不是一個100%會發生的確定性事件。這一點可能有點難以理解,舉例來說明,很有可能bdata這個flop的后面組合邏輯的delay很小,而這個flop在發生亞穩態之后所需要穩定的時間也很短,這樣即使flop發生了亞穩態,而后級的flop的setup time/hold time也可能可以得到滿足,這樣的話在實際芯片工作中,我們可能觀察不到產生錯誤輸出的情況。但也正是這樣的原因,很多看似正常工作的芯片內部可能其實有跨時鐘域設計上的問題,卻從來沒有暴露出來。這種情況其實非常危險,因為這種問題一旦出現,則會非常難以debug,因為出現的概率很低,看起來很隨機。或者很可能同樣的設計換一個工藝,以前可以工作在新的工藝上突然產生問題,造成很嚴重的后果。所以芯片在設計的時候需要盡量在流片前發現并解決所有的CDC問題,這一點大家要銘記在心。

芯片一旦出現CDC的問題,可能會導致以下后果

邏輯功能發生錯誤,比如控制信號,握手信號錯位數據發生錯誤,比如data bus的值,memory中存的值發生錯誤發生錯誤的時間可能隨機,很難以復現相同的錯誤很難以通過軟件修復,即使能夠修復,也可能需要犧牲性能和功耗

那么我們能夠完全消除亞穩態嗎?答案是否定的。其實我們關心的并不是亞穩態,而是說能否避免由于亞穩態而造成的邏輯問題。在這里要引入一個MTBF的概念。MTBF-- mean time between failure. 意思是兩次失效之間的平均時間。簡單來說,就是這個芯片或者這個IP或者這個電路發生兩次發生錯誤之間的間隔。對于不同的系統和應用場景,MTBF的要求也不同。比如說對于我們的手機,沒有人拿一個手機用二三十年吧?那么如果能夠保證MTBF大于30年,那么也等效于在整個手機的使用壽命中,這個邏輯錯誤不會發生2次,那么針對這個錯誤來說,這樣的MTBF是可以接受的。但是對于有些應用場景,比如通訊衛星,一個通訊衛星的壽命可能超過二三十年,那么這種情況下MTBF 如果只有30年,那么就無法接受了。

關于MTBF,還有一個誤區需要澄清,就是MTBF只要大于產品的設計使用壽命就可以了,這其實是不嚴謹的。因為一個產品可能由多個系統組成,每個系統又是由多個子系統組成,每個子系統可能細分下去是由更小的單元組成。整個產品不發生失效的概率是所有部分不發生失效概率的乘積。所以越是小的單元,越要保證MTBF越高,這樣才能不會導致整個產品的MTBF 有顯著下降。

說回來觸發器的MTBF,MTBF的具體公式將在下一篇推送中呈現。這里大家只需要知道,MTBF反比于采樣時鐘頻率(destination clock frequency),反比于數據變化頻率(source data change frequency),還和工藝、電壓、溫度等因素相關即可。

標簽:

上一篇:如何計算晶體管開關電路-1_今日熱訊
下一篇:最后一頁