CDC(Clock Domain Crossing,時鐘穿越)有很多的論文都討論過這個主題。本文主要從原理上分析一下為什么CDC是問題、常用的CDC設(shè)計思路。不能算權(quán)威總結(jié),只是對工作幾年CDC設(shè)計的經(jīng)驗的一個總結(jié)。
源起:建立時間和保持時間
集成電路設(shè)計專業(yè)的同學(xué)期末考試肯定考過“setup time"或者”hold time"的定義,這個也是應(yīng)屆畢業(yè)生面試數(shù)字集成電路設(shè)計崗位的“明牌”必面題目。
先回顧一下setup time(建立時間)和hold time (保持時間)的定義:
建立時間(t
su) 是在時鐘翻轉(zhuǎn)(對于正沿觸發(fā)寄存器為0→1的翻轉(zhuǎn))之前數(shù)據(jù)輸入(D)必須有效的時間。維持時間(t
hold)是在時鐘邊沿之后數(shù)據(jù)輸入必須仍然有效的時間。
對于單一時鐘的電路進(jìn)行 時序分析 ,最主要是為了滿足這些條件。
比如,說你的設(shè)計時序“很緊張”,往往是兩級寄存器之間的組合邏輯很多,延時很長。從上一級的數(shù)據(jù)傳到下一級時,無法滿足下一級的建立時間。我們這個時候需要做時序修復(fù)(timing fix)。
單時鐘這個問題比較好考慮,因為數(shù)據(jù)什么時候開始發(fā)送是明確的——上一個時鐘沿——我們能夠有很多辦法去修復(fù)時序。(比如前文推送的“模板”)
但對于多時鐘設(shè)計(異步電路),從一個時鐘域向另一個時鐘域送數(shù)據(jù),時鐘(周期)不同,在一個時鐘域隨時隨刻都可能收到另外時鐘域的數(shù)據(jù),這自然是不能滿足建立時間的。
不滿足建立時間,那么數(shù)據(jù)的傳輸就會失敗。何謂“失敗”?就是我想傳一個數(shù)據(jù)1過去,我可能成功的傳了個1,也可能傳了個0,也可能我不知道傳了什么值。
不滿足建立時間,簡單的理解就是:目標(biāo)時鐘域(dest. clock) 的時鐘沿和發(fā)起時鐘域的數(shù)據(jù)(src. clock)來的時間 很接近 ,而時鐘沿和數(shù)據(jù)的誰先誰后錯開一點,傳輸?shù)较乱患壍臄?shù)據(jù)就是完全不一樣,這種不同這是不可接受的。
因為不滿足建立時間,我的數(shù)據(jù)是不穩(wěn)的、不可預(yù)知的、不精確的。對于單個寄存器而言,我們叫做 亞穩(wěn)態(tài) (Metastability)。
總結(jié)一下: 在數(shù)據(jù)從一個時鐘域向另一個時鐘域傳輸時,無法滿足建立時間,數(shù)據(jù)在被目標(biāo)時鐘域寄存器采值時,會進(jìn)入亞穩(wěn)態(tài),無法準(zhǔn)確傳輸數(shù)據(jù) 。
我們用 時鐘穿越 (CDC,Clock Domain Crossing)來描述我們現(xiàn)在處理的這種情況。把所有的這種問題都叫做 時鐘穿越問題 (CDC issue)。
隨著工藝技術(shù)的迭代,很多的公司的集成電路項目出現(xiàn)錯誤,都是出現(xiàn)在CDC的解決方法有問題,或者驗證不夠充分上。
本章節(jié)先討論1比特的情況。
那如何解決“1bit的時鐘穿越”問題呢?
既然根子上是亞穩(wěn)態(tài)的問題,那我就破掉亞穩(wěn)態(tài) 。
破掉亞穩(wěn)態(tài)有很多種方法,方法都是讓數(shù)據(jù)來到目標(biāo)時鐘域的時鐘沿之前穩(wěn)定住。
延長源信號的方法(不推薦):
我要傳輸1,那我就在源時鐘域?qū)π盘?持續(xù)上拉;我要傳輸0,那我就在源時鐘域?qū)π盘?持續(xù)下拉。換句話說,就是讓想傳的數(shù)據(jù)1和0都維持“ 足夠長 ”的時間——長到我這個時鐘沿采不到,下個時鐘沿肯定能采到。
這就是我們看很多年前"老代碼"中很普遍的方法:延長源信號長度。比如對源信號連續(xù)打多少拍,然后“或”起來組成一個信號使用。
或者干脆不做任何處理直接穿越,前提是能夠證明雖然這個信號是一個CDC信號,但是不會輕易改變(比如寄存器初始化之后的一個控制信號,只會在初始化階段改變)。
延長源信號方法總結(jié):
-
很多老的設(shè)計是直接CDC使用,或者打多拍然后進(jìn)行傳輸。
-
優(yōu)點:簡單,邏輯比較少
-
缺點:
3.1.如果源信號的 前提假設(shè)發(fā)生變化 ,容易出現(xiàn)bug。如第二代設(shè)計的時鐘頻率比變化,或者一個不輕易改變的配置信號(control signal)“與”上了一個經(jīng)常變的控制信號。不經(jīng)過仔細(xì)驗證,維持原有設(shè)計,很容易出“大“問題。
3.2.邏輯雖然簡單,但是設(shè)計不具有通用性。比如你需要對不同時鐘頻率比例的進(jìn)行不同的打拍。
-
所有可以用“延長源信號”方法的地方,都可以加上同步器(syncer)邏輯 ,這更加保險。
-
總結(jié):除非維護(hù)不好修改的歷史代碼,新代碼不推薦。
同步器(synchronizer, syncer)
那破掉亞穩(wěn)態(tài)還有什么辦法呢?
方法很簡單,就是在目標(biāo)時鐘域 加速穩(wěn)定過程 。
D觸發(fā)器是一個簡單的加速穩(wěn)定的簡單結(jié)構(gòu)。雖然1級D觸發(fā)器,可能不滿足建立時間,但是后面再跟一個D觸發(fā)器,就會 使不穩(wěn)態(tài)要么迅速變化為傳輸0,要么迅速變化為傳輸1 。
兩級D觸發(fā)器的串聯(lián),就是一個簡單的同步器(synchronizer, 或者syncer,或者Sync2D)。
A synchronizer is a device that samples an asynchronous signal and outputs a version of the signal that has transitions synchronized to a local or sample clock."
這種穩(wěn)定是概率性的,與工藝相關(guān)的。穩(wěn)定下來而不是處于亞穩(wěn)態(tài)的時間,有數(shù)學(xué)上的MTBF(平均失敗時間)公式進(jìn)行計算。在日常的設(shè)計中,一般工藝廠會告知你的一個參數(shù)公式(或者是一個查找表),輸入你的輸入輸出頻率,就能查找到在當(dāng)前工藝下的MTBF,然后比對MTBF的要求決定是不是選擇SYNC2D(打兩拍的同步器)。
如果SYNC2D不滿足MTBF的要求,那么就再接一級D觸發(fā)器,組成SYNC3D(打三拍的同步器)。SYNC3D的MTBF比SYNC2D會長許多數(shù)量級。(我在前東家做一個設(shè)計,同樣的時鐘頻率,查MTBF表SYCN2D的MTBF是10天,SYNC3D的平均失敗時間是50年……)
我在過去做14nm工藝下的設(shè)計,項目主管就要求所有的SYNC2D替換為SYNC3D。
我們這里暫時用SYNC2D作為例子(SYNC3D同理)。
同步器有什么好處?
能夠安全的排除亞穩(wěn)態(tài)。
同步器有什么壞處或者局限?
目的時鐘域會晚幾個周期。
這個不算是個問題,既然是跨時鐘域的,晚兩三個周期沒什么問題。
** 數(shù)據(jù)傳過來,對SYNC2D而言,會delay2個周期或者3個周期。** 也就是說你不能確定是2個周期后還是3個周期后能傳過目標(biāo)數(shù)據(jù)來。對于單比特沒有問題,對于多比特存在對齊的問題。 同步器 只能保證數(shù)據(jù)沒有亞穩(wěn)態(tài),不能保證是正確數(shù)據(jù) 。
怎么理解呢?就是說,你給我同步器什么數(shù)據(jù),我都能給你穩(wěn)住。但是 你若給我的是錯誤的值,這不能怨我 。
例如,在這個周期給同步器輸入端一個信號1,同步器在能給你穩(wěn)到0或者1,你只要在發(fā)送端的下個周期還給同步器1就好了。經(jīng)過同步器一走,給個干凈的1給你。
同步器的正確前提是,信號必須穩(wěn)定足夠長的時間(能夠持續(xù)上拉,或者下拉)。
那么多長算長呢?前人理論已經(jīng)有了研究結(jié)論了。在同步器設(shè)計理論中,叫做”1.5x規(guī)則“或者”三沿規(guī)則“: 輸入端的信號長度,至少是1.5倍接收時鐘周期的長度,或者三個接收時鐘沿的長度 。
滿足了這個規(guī)則,因為是三個邊沿,那么肯定會有一個安全的上升沿可以采到。
這是非常重要的一個規(guī)則。只要滿足了這一規(guī)則,同步器就是安全的。
使用同步器本身,可能會漏采或者多采。
其實這只是上一個要點的延伸。同步器是一個穩(wěn)定單元,只能做到”穩(wěn)“,你需要“穩(wěn)+準(zhǔn)”,這超出了同步器的能力范圍,需要加上一些配合電路才能工作。但幾乎所有的CDC電路在時鐘穿越的核心邏輯,同步器都包含其中。
-
寄存器
+關(guān)注
關(guān)注
31文章
5434瀏覽量
124576 -
D觸發(fā)器
+關(guān)注
關(guān)注
3文章
173瀏覽量
48777 -
CDC
+關(guān)注
關(guān)注
0文章
57瀏覽量
18224 -
同步器
+關(guān)注
關(guān)注
1文章
109瀏覽量
15187 -
時鐘電路
+關(guān)注
關(guān)注
10文章
243瀏覽量
51398
發(fā)布評論請先 登錄
FPGA User Guide之report_cdc
cdc_acm類設(shè)備與主機(jī)建立通信問題
火幣為什么要停止CDC交易
如何使用report_cdc命令分析、調(diào)試和修復(fù)CDC問題
ic設(shè)計——CDC的基本概念

CapTIvate技術(shù)中CDC設(shè)計平臺的介紹(1)

vc++-CDC常用函數(shù)總結(jié)

STM32 USB如何配置多個CDC設(shè)備—5個CDC設(shè)備

各種類型CDC路徑中的毛刺問題
cdc減振器控制原理是什么
Texas Instruments CDC6CEVM評估模塊數(shù)據(jù)手冊

評論