1. 背景
????????現在的芯片(比如SOC,片上系統)集成度和復雜度越來越高,通常一顆芯片上會有許多不同的信號工作在不同的時鐘頻率下。比如SOC芯片中的CPU通常會工作在一個頻率上,總線信號(比如DRAM BUS)會工作在另一個時鐘頻率下,而普通的信號又會工作在另外的時鐘頻率下。這3個不同時鐘頻率下工作的信號往往需要相互溝通和傳遞信號。
????????不同時鐘域下的信號傳遞就涉及到跨時鐘域信號處理,因為相互之間的頻率、相位不一樣,如果不做處理或者處理不當,可能導致:
- 數據丟失,無法采到預期中的信號;
- 亞穩態的產生。
????????跨時鐘域的信號可以分為單bit信號和多bit信號,處理方法有所不同。
2. 單bit
2.1?快時鐘域到慢時鐘域
2.1.1 問題
????????下圖顯示了當在一個時鐘域(aclk)中生成的信號adat被送到了另一個時鐘域(bclk)中采樣,由于采樣時間太靠近第二個時鐘的上升沿時,發生的同步失敗。同步失敗是由于輸出bdat1變為亞穩態,而在bdat1再次被采樣時沒有收斂到合法的穩定狀態。
????????這里注意一下,如果是電平信號進行CDC, 那么不用考慮時鐘快慢,直接用同步器就可以了,因為總能被采樣到。所以,下面考慮的主要是信號位寬有限的CDC。
????????快時鐘到慢時鐘的(單bit)信號處理,主要問題就是信號在快時鐘域中,可能會多次改變,這樣慢時鐘可能來不及采樣,導致丟失數據。這個問題被稱為信號寬度問題,在CDC檢查工具中,如果快時鐘的信號寬度不足,會報出CDC違例。
????????快時鐘到慢時鐘的(單bit)信號處理分為兩種:
- 采樣丟失是被允許的。單bit信號一般不會是這種情況,如果是這種情況,直接用同步器同步就可以了。
- 采樣丟失不被允許。這樣就要采樣其他手段來保證數據不丟失。主要原理是保證快時鐘域的信號寬度滿足一定的條件,使得慢時鐘域有足夠時間采樣到。
2.1.2?信號寬度的“三時鐘沿”要求
????????那么信號在快時鐘域到底需要多寬,才能保證在慢時鐘域安全的被采樣到呢?比較安全的寬度是,快時鐘域的信號寬度必須是慢時鐘域時鐘周期的1.5倍以上。也就是要持續3個時鐘沿以上(上升沿和下降沿都算)。這個被稱為:“三時鐘沿”要求。
????????下面是一個CDC信號只持續一個周期的例子。發送時鐘域的頻率高于接收時鐘域,而CDC脈沖在發送時鐘域中只有一個周期寬,這樣CDC信號可以在慢時鐘上升沿之間變動,不會被捕獲到慢時鐘域,如下圖所示
????????如果CDC信號寬度超過慢時鐘周期,但是不足1.5個周期,也會發生問題。如下圖所示
????????如上圖所示,信號寬度超過了一個慢時鐘周期,但是可能會setup和hold time違例,導致信號采樣失敗。
2.1.3?信號寬度問題的解決方法
????????一種最簡單的方法是,通過保證信號寬度滿足超過慢時鐘的時鐘周期1.5倍,來解決這個問題。這種方法是最直接,也是跨時鐘最快的方法。可以通過system Verilog加“斷言”的方式來檢測是否滿足條件。但是實際中很少用這種方式,因為設計可能會變,設計人員在改變設計時,可能會忘記這個限制,以為是一個通用的解決方法。
????????所以,常用的還是通過“握手”的方式來保證數據被采樣到。通常的做法是:是發送一個使能控制信號,將它同步到新的時鐘域,然后通過另一個同步器將同步信號作為確認信號傳回發送時鐘域。如下圖所示:
????????優點:
????????同步反饋信號是一種非常安全的技術,可以識別第一個控制信號并將其采樣到新的時鐘域。
????????缺點:
????????在允許控制信號改變之前,在兩個方向上同步控制信號可能會有相當大的延遲。也就是說,在應答信號到來之前,是不允許源信號改變的。
????????在實際的芯片設計中,脈沖(寬度有限)信號的同步都是采用這種握手機制來處理。
2.2?慢時鐘到快時鐘域
????????慢時鐘域到快時鐘域的CDC, 直接使用信號同步器就可以了。很多人可能會問,為什么是兩級DFF呢?一級或者三級DFF行不行呢?這里有一個平均失效間隔時間MTBF(Mean Time Between Failure)的考慮。MTBF時間越長,出現亞穩態的概率就越小,但是也不能完全避免亞穩態。注意采樣時鐘頻率越高,MTBF可能會迅速減小。
????????有文獻給出的數據:對于一個采樣頻率為200Mhz的系統,如果不做同步MTBF是2.5us,一級DFF同步的MTBF大概是23年,兩級DFF同步的大約MTBF大概是640年,MTBF越長出錯的概率越小。所以一級看上去不太穩,二級差不多夠用了,至于三級可能會影響到系統的性能,而且增加面積,所以看上去沒什么必要。
????????但是,這里有一點要指出來,那就是怎么才算慢時鐘域到快時鐘域的CDC呢?這里和平常理解的有點不一樣。
????????目標時鐘頻率必須是源時鐘頻率1.5倍或者以上,才能算慢時鐘到快時鐘的CDC.
????????這也很好理解,只有滿足快1.5倍以上,才能滿足“三時鐘沿”的要求,才能保證快時鐘域保證能夠采樣到慢時鐘域的脈沖。如果目標時鐘域只快一點,比如1~1.5倍之內,為了保險起見,請按照1.1中快時鐘到慢時鐘域的處理方法來處理。
????????另外,有的設計中為了保險和以后修改的方便;或者還不清楚時鐘之間的關系;都會按照2.1中的方式來進行單bit的CDC處理。
3. 多bit
????????在兩個時鐘域之間傳遞多個信號,簡單的同步器已經不能滿足要求。工程師經常容易犯的錯誤是,直接用簡單同步器來同步多個信號。
????????這里列出兩個信號分別通過同步器同步后,在目標時鐘域聚合后使用的場景。問題是兩個同步器,跨時鐘的延時可能不一樣,比如信號從2’b00->2’b11, 上面的同步器花了2個周期同步到了目標時鐘域;下面的同步器花了3個周期才同步到目標時鐘域。那么在第二和第三周期之間,就出現了2’b10的值了,即出現了錯誤的采樣信號,這樣功能有可能就不正確了。
????????另外,不同同步器的芯片上的走線也可能不同,導致延時不一樣。即使我們完美的控制后端不同bit同步信號的走線長度一樣,同一個die上面不同芯片之間或者不同制程之間的偏差,都可能引入差異,導致多bit信號的延時不同。而且這樣對后端走線難度增大。
????????考慮到以上兩點,多個信號的CDC一般不用簡單同步器的方法。在CDC檢查時,會有專門的規則來檢查是否采樣了多bit信號用同步器同步聚合使用的情況。
????????為了避免多位CDC傾斜采樣的情況,多個信號CDC策略可以分為三種:
- 多周期路徑法。使用同步負載信號安全地傳遞多個CDC位。
- 使用格雷碼傳遞多個CDC位。
- 使用異步FIFO來傳遞多位信號。
3.1?多周期路徑(Multi-Cycle Path, MCP)
????????下圖中顯示了在時鐘域之間傳遞的兩個編碼控制信號。如果這兩個編碼信號在采樣時略有偏差,則在接收時鐘域中的一個時鐘周期內可能會產生錯誤的解碼輸出。
????????多位數據問題可以用“多周期路徑法(MCP)”來解決。MCP方法是指直接不同步將數據發送到目標時鐘域,但是同時送一個同步過的控制信號到目標時鐘域。數據和控制信號同時發送,允許數據在目標寄存器的輸入端進行設置,同時控制信號在到達目標寄存器的負載輸入端之前做同步。
????????MCP方法的優點:
- 不需要在發送時鐘域計算適當的脈沖寬度
- 發送時鐘域只需要將enable toggle到接收時鐘域,表示數據已經被傳遞完成,已經準備好被加載。使能信號不需要返回到初始邏輯電平。
????????MCP方法的實質就是,不同步多位的數據,只同步一位的控制信號,通過握手保證控制信號能夠正確傳輸,然后在目標時鐘域通過控制信號來采樣數據。MCP需要用到“同步脈沖器”:
????????同步脈沖器的符號表示如下:
????????多周期路徑法有兩種方法來傳遞多位信號:
3.1.1 帶反饋的MCP
3.1.2?帶應答反饋的MCP
????????多周期路徑法的思想十分有用,但是實際中用來傳遞多位信號比較少見,因為邏輯過于復雜。但是MCP方法用來傳遞單bit的信號卻十分有用。這里就不展開講了,有興趣的可以參考最后的參考文檔中的描述。
3.2?格雷碼
????????對于計數器的CDC, 大部分是不必要的。如果一定需要,那么可以使用格雷碼。格雷碼每次只允許更改一個位,從而消除了跨時鐘域同步更改多個CDC位所帶來的問題。格雷碼和二進制碼之間的轉換是一種很成熟的技術,很容易就能找到現成的代碼,這里就不在詳細描述。
????????需要注意的是:格雷碼必須是計數到2^n才是每次改變一個bit。
????????如果計數器是從0~5計數,那么從5->0的計數,不止一個bit改變,就失去了只改變一個bit的初衷。格雷碼最常見的應用是在異步FIFO中,通常異步FIFO的深度都是2^N,原因就是上面說的。所以,就算浪費面積,也需要把FIFO深度設置為2^N。
3.3?通過AFIFO進行多位信號CDC
????????多位信號CDC的工程上的一般做法都是采用異步FIFO,這里有一個特殊的應用,那就是深度為2的AFIFO,來進行多bit數據的CDC. 如下圖所示:
????????2個寄存器搭建的AFIFO,地址只需要一位。相比MCP方法,邏輯簡單,可以復用AFIFO代碼,而且延時也比MCP方法小。所以多bit僅僅跨時鐘域,不需要進行數據吞吐率匹配(FIFO的重要功能之一)的情況,推薦用深度為2的AFIFO來實現,而不是MCP方法。