IC面試中常被問到——跨時鐘域信號如何處理?

來自專欄跟IC君一起學習集成電路15 人贊了文章

IC君的第31篇原創文章 (歡迎關注公眾號 icstudy 哦)

最近是IC相關專業學生找工作的高峯期,大家可以在文章末尾或者知識星球留言討論筆試或者面試題哦。

跨時鐘域的處理在面試中常常被問到,今天IC君就來聊一聊這個話題。

跨時鐘域是如何產生的呢?現在的晶元(比如SOC,片上系統)集成度和複雜度越來越高,通常一顆晶元上會有許多不同的信號工作在不同的時鐘頻率下。比如SOC晶元中的CPU通常會工作在一個頻率上,匯流排信號(比如DRAM BUS)會工作在另一個時鐘頻率下,而普通的信號又會工作在另外的時鐘頻率下。這3個不同時鐘頻率下工作的信號往往需要相互溝通和傳遞信號。

不同時鐘域下的信號傳遞就涉及到跨時鐘域信號處理,因為相互之間的頻率、相位不一樣,如果不做處理或者處理不當,如下圖所示的時鐘域CLK_A的數據信號A可能無法滿足時鐘域CLK_B的setup/hold時間,可能導致:

1.數據丟失,無法採到預期中的信號;

2.亞穩態的產生。

從而導致某個電路模塊或者整顆IC無法工作。

那麼,常見的跨時鐘域信號處理方法都有哪些呢?有如下的三種:

  1. 兩級DFF同步器
  2. 握手協議
  3. 非同步FIFO

最簡單的單比特信號處理通常採用兩級DFF串聯進行同步,如下圖所示:

從時鐘域A(CLKA)傳過來的信號a_in, 直接用時鐘域B CLKB採用很容易產生亞穩態,用兩級DFF 敲過後再使用就可以把亞穩態概率降到一個合理的值。

很多人可能會問,為什麼是兩級DFF呢?一級或者三級DFF行不行呢?這裡有一個平均失效間隔時間MTBF(Mean Time Between Failure)的考慮。MTBF時間越長,出現亞穩態的概率就越小,但是也不能完全避免亞穩態。注意採樣時鐘頻率越高,MTBF可能會迅速減小。

有文獻給出的數據:對於一個採樣頻率為200Mhz的系統,如果不做同步MTBF是2.5us,一級DFF同步的MTBF大概是23年,兩級DFF同步的大約MTBF大概是640年,MTBF越長出錯的概率越小。所以一級看上去不太穩,二級差不多夠用了,至於三級可能會影響到系統的性能,而且增加面積,所以看上去沒什麼必要。

兩級DFF同步器聽起來夠簡單的吧?這個方法雖然很簡單,但是很多人用起來還是常常會犯錯。

錯誤1 :時鐘域A的組合邏輯信號直接敲兩級DFF同步到時鐘域B

如下圖(1)所示雖然時鐘域A的邏輯信號c0 傳輸到時鐘域B的時候,也用了兩級DFF 同步器,但我們知道組合邏輯電路各個輸入信號的不一致性以及組合邏輯內部路徑的延時時間不一樣,運算後的信號存在毛刺如圖(2),而我們又無法預先知道CLKB 的上升沿何時會到來,CLKB 採樣到的信號就無法預知,這顯然不是我們想要的結果。

因此,要想CLKB 能採到穩定的信號,時鐘域A的信號必須是經過CLKA 敲過,在一個時鐘週期內是穩定的信號,如圖(3)所示:

錯誤2 : Clock-gating enable 信號沒有經過非同步處理

在下圖中a_in 信號經過CLKA的DFF敲過,再送到兩級DFF 同步器處理,完全沒毛病。但是F2的使能信號EN是從時鐘域A來的,當EN信號變化的時候,由於時鐘域不一樣,無法保證使能之後的CLKB信號採樣數據時滿足setup/hold time 要求,這時F2輸出信號也就變得無法預測了。

兩級同步器處理單比特信號雖然比較簡單,但還是要注意它的使用方法,不要犯上面的錯誤哦。

後續文章會繼續講述跨時鐘域的處理中的握手協議和非同步FIFO哦!

強烈推薦一下IC君的知識星球(文件、討論都可以長期保存),在這裡你可以得到:

  1. 提供公眾號文章所分享技術更多的細節和實現方法,包括文檔、電路、RTL代碼、腳本等;
  2. 星球成員不斷積累的優質內容分享和討論;
  3. 回答星球成員提出的IC相關問題
  4. 優質分享的現金紅包讚賞;
  5. 可能的技術分享、讀書分享、項目實戰

t.zsxq.com/EAAUzJY (二維碼自動識別)


推薦閱讀:
相關文章