[Verilog] 10分鐘看懂CDC的2DFF

更新於 發佈於 閱讀時間約 8 分鐘

上篇文章提到說

由於STA的設計上沒辦法去檢查不同clk domain的兩個register之間timing是否可以滿足所需,

因為沒有一個比較的基準點,

所以需要靠其他的方式來解決這種沒辦法check timing卻又要他保證function work的機制


那麼對於解CDC issue來說

最常見的招數就是2DFF

不過究竟2DFF解決了什麼樣的現象

他真的內涵我也是思考了好一陣子才悟出

這邊就來分享一下


2DFF 顧名思義 為兩級Filpflop的架構

大家都說只需要靠敲兩T Register就可以解掉metastable把訊號拿去用了

但是實際上這個設計只是解掉了metastable並不代表value正確

因此使用上有一個限制就是沒辦法利用2DFF來解Multibits的register

如果本身多bits的register每個bits之間是有關連的則無法使用2DFF的方法解CDC issue

如果還是有這個需求就必須換別種架構來解決

raw-image


來說明一下上面提到的

2DFF可以解掉metastable卻沒辦法保證value正確,所以multibits reg沒辦法使用是甚麼意思?

大家不都是說因為第1T的訊號不穩但是通常第2T就穩定了嗎

這樣還不保證value正確?


實際上是這樣的

來看一張常看到的例子


raw-image

clk0和clk1為async的,意味著兩者個clk在toggle的時機互不知道,

由clk0帶動的Q0發起了req後傳遞到D1的input上等待clk1 rising edge去抓Data

但是剛好Q0的toggle點落在了D1的setup/hold check的區間內導致出現了timing violation,也就是metastable的原因

那麼等到再下個clk1的rising edge此時因為Q0的訊號已經維持stable

不再會有發生timing violation的風險,因此clk1的第2次就可以抓到完美的req=1的訊號

Q2即再後面的cycle也成功抓取


因此這張圖看到了幾個重點

所謂的metastable是因為兩著clk不知道對方甚麼時候會變化,

所以只好造著自己自身的clk動作,在下游的reg在準備要抓Data時上游剛好動了,

因此讓下游端的reg發生了timing violation形成了metastable的訊號.

但是第二個cycle因為源頭的req不再改變因此可以完美的滿足Timing check,

因此在2T過後就不太會看到metastable的問題.


不知道大家有沒有發現實際上在說明的時候是有些假設在裡面的,

這些假設也就成為了使用上的Constraint,只要Constraint不滿足則這個架構就廢了


第一個就是

上面所說req不再動,所以下1T可以滿足timing check

也就是說,我們對於req的訊號長度是有一定要求的,

如果我req一直瘋狂跳動那麼這架構肯定不work,

那麼req最短要拉多久呢

從上面的圖中可以看到,我希望在clk1第二個rising edge要取值的時候還要看到是stable的

因此最短最短req需要可以維持3個clk1 edge的長度,這裡的edge部論是rising或falling都算是1個,加起來要是3個就好(上下上 或 下上下)

只要Reg0可以拉住req維持住3個edge的長度(e.g. req拉個3T後才放掉),

或是clk1頻率快於clk0 1.5倍的速度,

則最少最少一定會讓clk1端的reg取到一次stable的value (x=unstable, o=stable)

raw-image
raw-image


raw-image

第二個是不能使用在multibits上

從上圖可以發現說,123張的圖中Q1 toggle起來的時機點各不相同

有些在第一個1個edge就敲到了有些則要在後面的edge才會成功取樣到

假設圖二是reg的bit0 圖三則是reg的bit1

Q[1:0] = {0,0} -> {1,1} 對應到的 reg[1:0]的變化會是 {0,1} -> {1,1}

兩個bits抵達的時間各不相同(抵達時間會根據apr時reg擺放位置的不同有所差異),

雖然reg1幫忙消除了metastable的問題,但是卻不保證當T的value是正確的,

有可能因為metastable的關係先取到0下一個cycle在變1

也有可能直接就取到1了

這時候會讓function在抓到{0,1}的時候就拿去用了導致後續的錯誤

但如果你的multibits是彼此之間沒關聯的只是單純把原先個別獨立的訊號merge起來則不在這個限制內


第三個則是Q0必須提供一個夠可靠的訊號,

因此Q0到D1的中間絕對不能有Combinational circuit,

因為組合邏輯並沒有時序的概念從輸入改變到輸出穩定前會不斷的0/1/0/1的跳動

這樣會讓D1取到中間暫態的glitch

如同 [Verilog] 10分鐘看懂ic design的reset 內文提過的

這時因為沒有sta的約束不知道Combinational要何時stable

如果D_in剛好取到glitch則會讓function有錯誤的output

raw-image



因此最後來總結一下

2DFF最常用來解CDC造成的metastable問題

但是他有一些Constraint

  1. req的訊號必須要拉夠長,才能讓下游的Reg可以順利取要值
  2. 訊號長度至少需要3個edge的長度或是當clkB > clkA 1.5倍時則可以自動滿足條件

同時也意味著req的performance被限制住了,無法頻繁的一直toggle.

另外如果不知道clkB到底碰到了3個edge了沒,則可靠scenario來控,換算頻率差放慢update req的速度,或是改成ack base的2DFF,讓clkB順利取直後回傳ack給clkA端的req reg告知可以update新的vaule.

  1. 對於multibits的訊號來說並無法靠2DFF的架構來解決CDC,雖然消除了metastable的問題但同時引發了vaule 不正確的風險
  2. 對於跨越CDC的boundary時,最後一級一定要是register output才不會因為誤抓glitch造成後續錯誤



<note.>

clk1比clk0快1.5倍的概念在於說

我只要clk1取樣的速度比clk0快就能保證reg0在下次變動之前就能取到一次stable的值

不過1.5這個倍率經過我servey相關的paper後依然沒有找到比較好的rule來說明

只有提到是實驗過後得出來的答案

我自己的觀點是clk1>clk0 2倍就能保證一定可以在req拉起後常是取樣兩次

其中一次一定會是stable的,因此得到最長可能需要2倍

最短則是clk1 至少 > clk0 1倍 確保在clk0 1T內能成功數完3個edge

因此頻差被夾在 1 < clk1/clk0 < 2

至於為甚麼是1.5則還額外考量了setup/hold time check所需使用掉的時間

因此由實驗得到了這個經驗值

如果各位讀者對倍率的算法有研究也歡迎一起討論



#CDC #2DFF #Clock domain crossing #STA #setup time #hold time #metastable

留言
avatar-img
留言分享你的想法!
eating LIN-avatar-img
2024/12/19
作者好,想請教在講解 req 最短要拉多久的第一張圖。 為什麼在 clk1 第 3 個 clk edge 所採樣到的 是 o.o.x, 不是 o 或 x
出一張嘴-avatar-img
發文者
2024/12/19
eating LIN 抱歉我字寫太隨便>< 第三個edge是O or X 沒錯唷 來張高清版
avatar-img
數位IC設計第一品牌
67會員
24內容數
數位IC設計第一品牌 從0到1用嘴做IC 觀念大權
2024/12/28
到了最後一個階段, 我們做了這麼多CG cell insertion後, 要怎麼知道到底是不是對Design有幫助的呢? 是否有個rule又或是量化的數據來解釋說CG的效果如何 在下面這篇paper中提到了幾種觀測CG cell efficiency的方法 J. Srinivas, M
Thumbnail
2024/12/28
到了最後一個階段, 我們做了這麼多CG cell insertion後, 要怎麼知道到底是不是對Design有幫助的呢? 是否有個rule又或是量化的數據來解釋說CG的效果如何 在下面這篇paper中提到了幾種觀測CG cell efficiency的方法 J. Srinivas, M
Thumbnail
2024/12/16
前面文章曾經提到說, 除了我們在寫rtl當下直接撰寫加入的cg cell外, 實際上我們有些clk gating cell是靠tool自己幫忙插的, [Verilog] 10分鐘由淺入深看懂 clock gating -2 那麼tool是怎麼判斷說哪邊要插gating cell的呢?
Thumbnail
2024/12/16
前面文章曾經提到說, 除了我們在寫rtl當下直接撰寫加入的cg cell外, 實際上我們有些clk gating cell是靠tool自己幫忙插的, [Verilog] 10分鐘由淺入深看懂 clock gating -2 那麼tool是怎麼判斷說哪邊要插gating cell的呢?
Thumbnail
2024/12/11
前面文章提到過clk gating check實際上就是在check gating cell的enable訊號 檢查enable的timing是否能滿足STA的check, 不過不知道各位有沒有發現到, 這條path看起來很單純呀而且我還用上了latch大法, 可能讓訊號走完1整個cycle
Thumbnail
2024/12/11
前面文章提到過clk gating check實際上就是在check gating cell的enable訊號 檢查enable的timing是否能滿足STA的check, 不過不知道各位有沒有發現到, 這條path看起來很單純呀而且我還用上了latch大法, 可能讓訊號走完1整個cycle
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
上篇文章提到說 由於STA的設計上沒辦法去檢查不同clk domain的兩個register之間timing是否可以滿足所需, 因為沒有一個比較的基準點, 所以需要
Thumbnail
上篇文章提到說 由於STA的設計上沒辦法去檢查不同clk domain的兩個register之間timing是否可以滿足所需, 因為沒有一個比較的基準點, 所以需要
Thumbnail
CDC (Clock Domain Crossing) 屬於當今IC design中非常常見的問題, 雖然增加了Design的難度, 卻因為它所帶來的諸多優勢令人難以放棄, 舉例來說, 假如module A的spec對於performance的需求 遠小於module B, 那麼modul
Thumbnail
CDC (Clock Domain Crossing) 屬於當今IC design中非常常見的問題, 雖然增加了Design的難度, 卻因為它所帶來的諸多優勢令人難以放棄, 舉例來說, 假如module A的spec對於performance的需求 遠小於module B, 那麼modul
Thumbnail
clk skew 和 clk jitter差別是甚麼? clk skew 指的是兩顆reg 因為clk 到達的時間不同 導致雖然後是屬於於同一個cycle的行為 卻會有先到後到的問題 通常成因為 wire length cell delay clock distribution
Thumbnail
clk skew 和 clk jitter差別是甚麼? clk skew 指的是兩顆reg 因為clk 到達的時間不同 導致雖然後是屬於於同一個cycle的行為 卻會有先到後到的問題 通常成因為 wire length cell delay clock distribution
Thumbnail
前篇內容提到說,async reset有著打出glitch的風險, 但除了glitch之外, 如果reset deassert的時間點不對的話可是造出大量metastable的data, 直接導致function fail, 至於assert的時間點因為是async reset,所以何時出發
Thumbnail
前篇內容提到說,async reset有著打出glitch的風險, 但除了glitch之外, 如果reset deassert的時間點不對的話可是造出大量metastable的data, 直接導致function fail, 至於assert的時間點因為是async reset,所以何時出發
Thumbnail
探討如何使用DP動態規劃的方法來進行單字串接,包含了DP遞迴關係式、狀態定義、優化技巧和程式碼示例。同時分析了時間複雜度、空間複雜度和關鍵知識點。這是LeetCode的一個應用題,類似於Word Break I的延伸。
Thumbnail
探討如何使用DP動態規劃的方法來進行單字串接,包含了DP遞迴關係式、狀態定義、優化技巧和程式碼示例。同時分析了時間複雜度、空間複雜度和關鍵知識點。這是LeetCode的一個應用題,類似於Word Break I的延伸。
Thumbnail
這篇文章,會帶著大家複習以前學過的二進位DP框架, 並且以0~N的整數有幾個bit1,有幾個bit0的概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 常見的考法 請問整數k有幾個bit1? 有幾個bit0? 請問整數0到整數N分別各有幾個bit1? 有幾個
Thumbnail
這篇文章,會帶著大家複習以前學過的二進位DP框架, 並且以0~N的整數有幾個bit1,有幾個bit0的概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 常見的考法 請問整數k有幾個bit1? 有幾個bit0? 請問整數0到整數N分別各有幾個bit1? 有幾個
Thumbnail
題目敘述 題目會給定三個參數a, b, c。 請問透過bit flip a 或 b 的binary bits,讓 a OR b = c 最少需要幾次bit flip? 題目的原文敘述 測試範例 Example 1: Input: a = 2, b = 6, c = 5 Output:
Thumbnail
題目敘述 題目會給定三個參數a, b, c。 請問透過bit flip a 或 b 的binary bits,讓 a OR b = c 最少需要幾次bit flip? 題目的原文敘述 測試範例 Example 1: Input: a = 2, b = 6, c = 5 Output:
Thumbnail
續傳遞函數離散化的核心環節,就是將控制器的s轉移函數(s-TF)轉換為z轉移 函數(z-TF)。 一般情況下,由連續到離散的設計最好多實驗幾種方法(通過模擬,得出滿意的 結果)。 用於PID連續系統映射轉換成PID離散系統的方塊圖如下: ■離散化演算法摘要 ■離散化演算法比較 ■MATLAB 指令說
Thumbnail
續傳遞函數離散化的核心環節,就是將控制器的s轉移函數(s-TF)轉換為z轉移 函數(z-TF)。 一般情況下,由連續到離散的設計最好多實驗幾種方法(通過模擬,得出滿意的 結果)。 用於PID連續系統映射轉換成PID離散系統的方塊圖如下: ■離散化演算法摘要 ■離散化演算法比較 ■MATLAB 指令說
Thumbnail
簡介   I2C (Inter - Intertraed circuit)內部整合電路,顧名思義就是主要控制短距離的內部裝置,而不適用於長距離的傳輸,I2C有不同的速度模式通常都是雙向傳輸,如標準模式100 Kbit/s、低速模式 10 Kbit/s、快速模式400Kbit/s、高速模式3.4Mbi
Thumbnail
簡介   I2C (Inter - Intertraed circuit)內部整合電路,顧名思義就是主要控制短距離的內部裝置,而不適用於長距離的傳輸,I2C有不同的速度模式通常都是雙向傳輸,如標準模式100 Kbit/s、低速模式 10 Kbit/s、快速模式400Kbit/s、高速模式3.4Mbi
Thumbnail
【TIPS】 每個人的手機天線要傳送出去的數位訊號 0 與 1 都變成不同波形的 電磁波,問題來了,這麼多不同波形的電磁波丟到空中,該如何區分 USER 呢? 就是用多工技術(TDMA、FDMA、CDMA、OFDM):將電磁波區分給 不同的使用者使用。 ■多重路徑載波對信號傳遞的影響 ●ZP-補零
Thumbnail
【TIPS】 每個人的手機天線要傳送出去的數位訊號 0 與 1 都變成不同波形的 電磁波,問題來了,這麼多不同波形的電磁波丟到空中,該如何區分 USER 呢? 就是用多工技術(TDMA、FDMA、CDMA、OFDM):將電磁波區分給 不同的使用者使用。 ■多重路徑載波對信號傳遞的影響 ●ZP-補零
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News