clock domain crossing(CDC)

 

隨着技術的發展,數字電路的集成度越來越高,設計也越來越複雜。很少有系統會只工作在同一個時鐘頻率。一個系統中往往會存在多個時鐘,這些時鐘之間有可能是同步的,也有可能是異步的。如果一個系統中,異步時鐘之間存在信號通道,則就會存在CDC(clock domain crossing)問題。在下面的文章裏,我們將會討論CDC的一些技術細節。


一, CDC的基本概念

我們首先來看CDC的一些基本的概念:

1. 時鐘域(Clock domain)

如果某一設計只有一個或者幾個有固定相位關係的時鐘驅動,我們稱這個設計屬於一個時鐘域。比如,一個時鐘和它的反相時鐘以分頻時鐘一般有固定的相位關係,屬於同一個時鐘域。而如果兩個或者多個時鐘之間沒有固定的相位關係,則它們屬於不同的時鐘域。

如下圖中,divCLK是由CLK分頻得到的,divCLK和CLK被認爲是同步時鐘,而由divCLk和CLK驅動的設計被認爲是屬於同一個時鐘域。

如下圖中,CLKA和CLKB之間沒有固定的相位關係,是異步時鐘。前半部分設計屬於時鐘域CLKA,後半部分設計屬於時鐘域CLKB。DA信號從時鐘域CLKA進入到時鐘域CLKB,是一個跨時鐘域的信號,這條path也會被稱爲CDC path。

 

如今的數字電路設計中,跨時鐘域的情況及其普遍。舉一個最簡單的例子,一個USB轉串口的模塊,串口因爲波特率的不同,會工作在不同的時鐘頻率下,USB接口也會因爲工作在不同的速度而有不同的工作頻率。USB接口的時鐘和串口的時鐘之間不存在任何相位上的關係,也就是說,USB接口模塊和串口模塊屬於不同的時鐘域,他們之間相連的path就是跨時鐘域的path。

二 跨時鐘域設計的潛在問題

一般來講,如果設計中存在有多個時鐘域,那麼就必然會存在跨時鐘域的timing path。如果對跨時鐘域的timing path處理不當,則容易導致亞穩態,glitch,多路扇出,重新聚合等等問題,導致設計不能穩定工作或者就根本不能正常工作。

1. 亞穩態

對時序邏輯電路來說,一個DFF的輸入信號必須在該DFF的時鐘沿前後一段時間內都保持穩定才能保證DFF能鎖存到正確的值。這既我們所說的setup time和hold time,其中信號在時鐘沿之前的保持時間爲setup time,信號在時鐘沿之後的保持時間爲hold time。正常情況下,如果DFF的輸入能滿足setup time和hold time的要求,那麼在tCO(the clock to output delay)時間內DFF的輸出就會達到一個有效的邏輯值(高電平或者低電平)。否則,DFF的輸出就需要遠大於tCO的時間來達到有效的邏輯值,這段時間內,DFF的輸出信號是不穩定的,被稱爲不穩定狀態,或者叫亞穩態。

在下圖中,如果CLK B在DA變化的時候來對DA進行採樣,那麼DB就會出現亞穩態。

 

對於同時鍾域的信號。無論是在ASIC設計還是在FPGA設計中,我們也可以方便的通過STA來保證同時鍾域的信號能滿足setup/hold time的要求,不會出現亞穩態的問題。

但對於異步信號,相位關係是完全不可控的,而且會隨時間發生變化,這就必然會存在亞穩態的問題,而且STA工具也沒有辦法對不同時鐘域之間的timing path進行分析。也就是說,我們是沒有辦法完全避免異步信號之間的亞穩態問題的,但是可以通過在跨時鐘域的信號上加入一些特殊的電路來減少亞穩態問題對電路功能所產生的負面影響。

2. Glitch

前面我們講過,STA工具室不會對跨時鐘域的信號做STA。跨時鐘域的信號很容易產生glitch並最終影響電路功能。如下圖中,CLKA domain中,DA1和DA2分別爲兩個DFF的輸出,理想狀態下,DA1和DA2到達與門兩個輸入端的時間是一樣的,這樣設計就不會出問題。但由於後端佈局,環境等等因素導致的傳播延遲Td會使A&B存在一個Glitch。而由於CLKB和CLKA爲兩個clock domain,之間不存在固定的相位關係,假設這個Glitch恰好被CLKB鎖存住,那麼就會在DB2生成一個有效的高電平信號,這個高電平信號不是我們的設計所期望的,那就會導致後繼的電路功能出現問題。

也有可能是下面的情況,因爲Td的影響,導致本應該傳遞到CLKB的高電平信號沒有被傳遞過去,從而導致後繼電路的功能出現問題。

在實際系統中,如果沒有處理好跨時鐘域的信號,那麼由此導致的問題是很容易出現的。我在做silicon debug的時候,曾經多次遇到過由CDC導致的問題。由CDC導致的問題,在實際系統上的表現並不是非常一致,但經常表現出來的就是設計時而可以正常工作,時而出錯,而且出錯的概率不盡相同,這對問題的分析解決是非常不利的。我曾經遇到過一個CDC導致問題,需要執行數千次的操作,纔可能復現出來,但問題一出現就是致命的,會導致系統出錯。由於非常難復現問題,分析解決起來就特別困難。所以我們在做設計的時候,要儘量從一開始就解決掉這些問題。

3 多路扇出

如果信號從一個時鐘域分多路進入另外一個時鐘域,那麼很有可能會導致功能上的錯誤。如下圖所示,由於Td的存在,DA1和DA2到達CLKB的時間不同,最終導致fsm1_en和fsm2_en這兩個本應該同時有效的信號實際上相差一個CLKB的週期。這很可能會影響到後繼的電路功能。

l 重新聚合

如果多個信號從一個時鐘域進入另外一個時鐘域,然後這些信號在目標時鐘域中又聚合到一起,那麼就有可能因爲信號的重新聚合導致電路功能上的異常。

如下圖所示,原本EN1和EN2轉換時鐘域後,期望得到的值是2’b00和2’b11,但由於EN1和EN2到達CLKB時鐘域的時間有差異,實際得到的值是2’b00,2’b10和2’b11,最終導致後繼電路功能出現問題。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章