跨時鐘域(Clock Domain Crossing,CDC)信號處理問題,首先要考慮的就是亞穩態。
1.亞穩態
亞穩態是指在設計的正常運行過程中,信號在一定時間內不能到達穩定的0或者1的現象。
在多時鐘設計中,亞穩態是不可避免的,可以減少亞穩態的發生和傳播,消除亞穩態的有害影響。
為什么會產生亞穩態?
存儲元件,如交叉耦合反相器、SR鎖存器、D鎖存器和D觸發器等都有兩個穩定的狀態,即0和1,也就是能存儲0和1這兩個狀態。亞穩態就是既不是0又不是1的狀態。在分析元器件時,把器件抽象為理想器件以簡化分析,但實際的元器件并不是理想的,一個理想的CMOS反相器的電平傳輸特性如下所示:
理想的CMOS反相器件的電平傳輸特性:
在0 < VIN < VM時,VOUT= V+
在VM < VIN < V+時,VOUT=0
剛好在VM這個點就能完成“突變”,界限明確。實際上變化時一個過程的。實際的CMOS反相器電平傳輸特性如下:
在0 < VIN < VIL時,VOH < VOUT < VMAX
在VIH < VIN < V+時,Vmin < VOUT < VOL
在VIL
如果在后一級的判斷電路把低于VOL電壓判斷為0,把高于VOH的電壓判斷為1,那么在輸入VIL–VLH這個范圍的電壓產生的VOUT后一級電路就不能判斷當前是0還是1,有可能是0,有可能是1,不能準確預測它的輸出。
實際情況下,沒有一個點來作為分界線,實際電路做不出來。實際上是高于VH才算1,低于VL才算0,VH>VL,也就是說高閾值VH和VL之間是由一段距離的。
當輸入數據不滿足寄存器的建立時間和保持時間的時候,寄存器很可能捕捉到輸入數據的電平在未定義的電平區間,就是亞穩態。
不是每個違反寄存器建立時間和保持時間的信號翻轉都會導致亞穩態。一個寄存器進入亞穩態和從亞穩態進入穩態的時間依賴與制造商的制造工藝和使用環境。大部分情況下,寄存器會很快的進入一個定義的穩態中。
亞穩態的危害
由于亞穩態的輸出在穩定下來之前可能是毛刺、振蕩、固定的某一電壓值,因此亞穩態除了導致邏輯誤判之外,輸出在0~1之間的中間電壓值還會使下一級產生亞穩態(導致亞穩態的傳播)。邏輯誤判有可能通過電路的特殊設計減輕危害,亞穩態的傳播擴大了故障面,難以處理。
電平信號的邏輯誤判一般只會對電路造成幾個時鐘的延時,后面還會穩定在需要的電平,不會造成邏輯錯誤。
亞穩態信號的穩定時間通常比一個時鐘周期要短的多。一般情況下不會超過一個或者兩個周期,取決于觸發器的性能。
如果亞穩態超過一個或者兩個周期,那么就會被下一個觸發器采樣到,這樣就會造成亞穩態的傳播。
上圖的bdat1的亞穩態在下一個時鐘沿還沒穩定,就造成了亞穩態的傳播。這里可以選擇更快的觸發器,減少亞穩態收斂的時間。
亞穩態的量化公式
設計人員采用平均故障間隔時間(MTBF:mean-time-between-failure)這個指標來估算從問題出現并導致故障的兩個事件間的平均時間。MTBF越高,說明設計的穩定性越好。如果發生了故障,只是說明沒有解決亞穩態的問題,并不是系統本身真的出現了問題。
C1和C2代表器件的相關的常數,器件的建立時間和保持時間越小,C2越小,MTBF就越大。所以可以通過更快的觸發器,來減少亞穩態發生的概率。
數據變化頻率越小,采樣時鐘越低,MTBF越大。
減少亞穩態的方法
亞穩態是不可避免的,是器件的固有屬性。可以減少亞穩態的發生和傳播,避免亞穩態帶來的消極影響。
減少亞穩態的方法有以下幾種:
(1)使用同步器:比如常用的2級或者多級FF打拍的方法
(2)降低頻率:如果能滿足功能要求,降低頻率能夠減少亞穩態的發生。
(3)避免變化過快或者過于頻繁的信號進行跨時鐘采樣。
(4)采用更快的觸發器:更快的觸發器,也可以亞穩態的產生
同步器
信號跨時鐘邊界,一般有兩種場景:
(1)信號跨時鐘邊界,可以漏掉某些值
(2)信號跨時鐘邊界,不能漏掉任何值
兩級觸發同步器
(1)如果亞穩態維持的時間不止一個周期,在下一個時鐘上升沿沒有穩定,那么第二級的FF也會進入亞穩態,這種情況的概率是1/MTBF
(2)第一級亞穩態在下一個時鐘上升沿穩定,但是被是識別為0,那么第二級的FF輸出bq2_dat就是0,說明信號跨時鐘采樣失敗。但是這種情況不會造成亞穩態的傳播,也就是不會影響后面的設計。針對這種情況,一般會改變設計,不會讓快時鐘域的單cycle脈沖,跨時鐘到慢的時鐘內采樣。
三級或多級同步器
在高速、超高速設計中,兩級的MTBF可能還不夠,為了保險會采樣三級或多級同步器。
3級FF的MTBF是2級FF的MTBF的7倍。
同步器的輸入:源時鐘寄存
采用同步器的另外一個要求:通常,需要跨時鐘的信號,需要在源時鐘經過一級FF進行寄存輸出。即,跨時鐘信號必須是寄存器的輸出,中間不能有組合邏輯。如果輸入不是寄存器的輸出,是組合邏輯的輸出,會是如下情況:
可以看到,adat是組合邏輯的輸出,變化的頻率更快了,根據MTBF公式:
數據變化太快,會減少MTBF,增加亞穩態發生的概率。如果adat是FF的輸出,根據FF的特性,輸出在一個時鐘周期內是不會改變的,數據的變化頻率不會超過時鐘頻率,這樣就能降低跨時鐘信號變化的頻率,減少亞穩態發生的概率:
在使用同步信號時,要求理解了其中的原理,要求輸入信號必須是源時鐘域的寄存器輸出。
2. 跨時鐘信號處理方法
跨時鐘域的信號可以分為單bit信號和多bit信號。
單bit信號跨時鐘域的處理
信號跨時鐘域,根據兩個異步時鐘之間的關系可以分為:
(1)信號從快時鐘域到慢時鐘域
(2)信號從慢時鐘域到快時鐘域
單bit信號一般采用同步器來做CDC(clock domain crossing)。由于在CDC時,會在源時鐘域做寄存器輸出,所以信號的變化頻率不會超過源時鐘的頻率,所以這里可用兩個時鐘間的快慢來分類。
快時鐘域到慢時鐘域
信號從快時鐘域到慢時鐘域CDC如下圖所示:
當在aclk中生成的信號adat被送到了另一個時鐘域bclk中采樣,由于采樣時間太靠近第二個時鐘的上升沿,發生的同步失敗。同步失敗是由于輸出bdat1變為亞穩態,而在bdat1再次被采樣時沒有收斂到合法的穩定狀態。
如果是電平信號進行CDC,不用考慮時鐘快慢,直接用同步器就可以,因為總能被采樣到。
快時鐘到慢時鐘的(單bit)信號處理,主要問題是信號在快時鐘域中,可能會多次改變,這樣慢是可能來不及采樣導致數據丟失。這個問題被稱為信號寬度問題,在CDC檢查工具中,如果快時鐘的信號寬度不足,就會報出CDC違例。
快時鐘到慢時鐘的(單bit)信號處理分為兩種:
(1)采樣丟失是被允許的。單bit信號一般不會是這種情況,如果是,直接用同步器同步就行。
(2)采樣丟失不被允許。這樣就用其他手段來保證數據不丟失。主要原理是保證快時鐘與的信號寬度滿足一定的條件,使得慢時鐘域有足夠時間采樣到。
信號寬度的“三時鐘沿”要求
比較安全的寬度是,快時鐘域的信號寬度必須是慢時鐘域周期的1.5倍以上。也就是要持續3個時鐘沿以上(上升沿和下降沿都算)。這個被稱為“三時鐘沿”要求。
下面是一個CDC信號只持續一個周期的例子:
發送時鐘域的頻率高于接收時鐘域,而CDC脈沖在發送時鐘域只有一個周期寬,這樣CDC信號可以在慢時鐘上升沿之間變動,不會被捕獲到慢時鐘域。
如果CDC信號寬度超過慢時鐘周期,但是不足1.5個周期,也會發生問題。
如上圖所示,信號寬度超過了一個慢時鐘周期,但是可能會setup和hold time違例,導致信號采樣失敗。
信號寬度問題的解決方法:
通過保證信號寬度滿足超過慢時鐘周期的1.5倍,來解決這個問題,這是最直接,也是跨時鐘最快的方法。可以通過system verilog加“斷言”的方式來檢測是否滿足條件。
但實際中很少用這種方法,因為設計可能會變,設計人員在改變設計時,可能會忘記這個限制。
所以,通常還是通過“握手”的方式來保證數據被采樣到。
通常的做法是:發送一個使能控制限號,將它同步到新的時鐘域,然后通過另一個同步器將同步信號作為確認信號作為確認信號傳回發送時鐘域,如下圖所示:
優點:
同步反饋信號是一種非常安全的技術,可以識別第一個控制信號并將其采樣到新的時鐘域中。
缺點:
在允許控制信號改變之前,在兩個方向上同步控制信號有相當大的延遲。也就是時候,在應答信號到來之前,是不允許源信號改變的。
在實際的芯片設計中,脈沖(寬度有限)信號的同步都是采用這種握手機制來處理。
慢時鐘到快時鐘域
慢時鐘域到快時鐘域的CDC,直接使用信號同步器就可以了。
目標時鐘頻率必須是源時鐘頻率1.5倍或者以上,才能算慢時鐘到快時鐘的CDC。
只有滿足快1.5倍以上,才能滿足“三時鐘沿要求”。才能保證快時鐘域能夠采樣到慢時鐘域的脈沖。
如果目標時鐘域只快一點,為保險起見,還是用握手機制。
有的設計中為了保險和以后修改的方便,或者不清楚時鐘之間的關系,都會按照握手機制來處理。
多個信號跨時鐘的處理
不同同步器的芯片上的走線也可能不同,導致延時不一樣。會導致后端走線難度增大。
在CDC檢查的時候,會有專門的規則來檢查是否采樣了多bit信號用同步器聚合使用的情況。
多個信號CDC策略可以分為以下幾種:
(1)多個信號合并,在可能的情況下,將多個CDC合并為1位的CDC信號
(2)多周期路徑發。使用同步負載信號安全地傳遞多個CDC位。
(3)使用格雷碼傳遞多個CDC位。
(4)使用異步FIFO來傳遞多位信號
(5)使用DMUX電路結構進行多位信號傳遞
多個信號合并
有時候并不需要將多個信號做CDC。下面是將兩個信號合并為1位信號做CDC。
下圖中,接收時鐘域中的寄存器需要加載信號和使能信號崔你那個將數據值加載到急促器中。如果負載和使能信號都是在同一個發送時鐘邊緣上驅動的。那么控制信號之間的小偏差就有可能導致兩個信號在接收時鐘域中同步到不同的時鐘周期。在這種情下,數據不會被加載到寄存器中,就會出問題。
解決方法是,將控制吸納后b_load和b_en合起來;b_lden = b_load & b_en同步到aclk時鐘域中。
下面這個例子中,顯示了兩個使能信號,aen1和aen2,它們從發送時鐘域依次驅動到接收時鐘域,以控制流水線數據寄存器的使能輸入。問題是同步器并不能保證兩個cycle一定能同步過來,下面的同步器花了3個cycle才tongue完成數據,導致流水線寄存器不能“流水”起來。
該問題的解決方案是只向接收時鐘域發送一個控制信號,并在接收時鐘域內生成第二個相移流水線使能信號。
多周期路徑(Multi-Cycle Path,MCP)
下圖顯示在時鐘域之間傳遞兩個編碼控制信號。如果這兩個編碼信號在采樣時略有偏差,則在接收時鐘域中的一個時鐘周期內可能會產生錯誤的解碼輸出。
多位數據問題可以用“多周期路徑法(MCP)”來解決。
MCP方法是指直接不同步將數據發生到目標時鐘域,但是同時送一個同步過的控制信號到目標時鐘域。數據和控制信同時發送,允許數據在目標寄存器的輸入端進行設置,同時控制信號在到達目標寄存器的負載輸入端之前做同步。
MCP優點:
(1)不需要在發送時鐘域計算適當的脈沖寬度
(2)發送時鐘域只需要將enable toggle到接收時鐘域,表示數據已經被傳遞完成,已經準備好被加載,使能吸納后不需要返回到初始邏輯電平。
MCP方法的實質是,不同步多位的數據,只同步一位的控制信號,通過握手保證控制信號能夠正確傳輸,然后在目標時鐘域通過控制信號來采樣數據。
MCP需要用到“同步脈沖器”:
同步脈沖器的符號表示如下:
多周期路徑法有兩種方法來傳遞多位信號:
多周期路徑法的思想十分有用,但是實際中用來傳遞多位信號比較少見,因為邏輯過于復雜。但是MCP方法用來傳遞單bit的信號卻十分有用。
格雷碼
對于計數器的CDC,大部分是不需要的,如果需要,那就使用格雷碼。
格雷碼每次只允許更改一個位,從而消除了跨時鐘域同步更改多個CDC位所帶來的問題。
需要注意的是:格雷碼必須是計數到2^n才是每次改變一個bit。
如果計數器是從0-5計數,那么從5–0的計數就不止一個bit改變,就失去了只改變一個bit的初衷。
格雷碼最常見的應用是在異步fifo中,通常異步fifo的深度都是2^N。原因如上,就算浪費面積,也需要把FIFO深度設置為2 ^ N.
異步FIFO(AFIFO)
就是深度為2的AFIFO,來進行多bit數據的CDC. 如下圖所示:
2個寄存器搭建的AFIFO,地址只需要一位。相比MCP方法,邏輯簡單,可以復用AFIFO代碼(一般公司都有芯片驗證過的AFIFO代碼),而且延時也比MCP方法小。
DMUX(數據分配器)
有一個輸入端和多個輸出端1,其邏輯功能是一個輸入端的信號發送到多個輸出端中某一個,簡稱DMUX,作用與MUX正好相反。
3.SpyGlass CDC流程
數字電路的集成度越來越高,設計也就越復雜。系統很少都只工作在一個時鐘頻率之下。一個系統中往往會存在多個時鐘,這些時鐘之間有可能是同步的,也有可能是異步的。一個系統中,異步時鐘之間存在信號通道,則就會存在CDC(clock domain crossign)。
下圖中,CLKA和CLKB之間沒有固定的相位關系,是異步時鐘。前半部分設計屬于時鐘域CLKA,后半部分設計屬于時鐘域CLKB。DA信號從時鐘域CLKA進入到時鐘域CLKB,是一個跨時鐘域的信號,這條路徑被稱為CDC path。
CDC(Clock Domain Crossing)是前端設計中最常見的問題。在RTL中要恰當的處理每個異步的控制信號和數據信號,否則就會出現亞穩態,造成嚴重的function false。
SpyGalss是目前業界唯一可靠的RTL Sign off解決方案,可以幫助客戶在設計早起發現潛在問題,保住產品質量,極大的減少設計風險,降低設計成本。
包括五大模塊:lint,CDC(跨時鐘域檢查),LP(低功耗),Constraint(約束),DFT(可測試性)。
SpyGlass CDC分析使你能夠識別設計中的CDC問題。SpyGlass CDC tool是中Formal Check Methodology工具,相比寫case跑仿真來找CDC問題,靠SpyGlass能更早,更全,更快的發現CDC問題。它能夠:
(1)管理是多時鐘域設計
(2)系統地處理CDC問題
(3)檢查和報告任何不同步的信號:時鐘和復位
SpyGlass CDC與靜態時序分析相比:
(1)STA對async interface不太好使,只適合sync模塊分析
(2)CDC paths總是需要設置成false paths
(3)一般在design的后期能在netlist level做才有意義
SpyGlass CDC與功能仿真相比:
(1)黑盒測試很難窮舉
(2)白盒測試需要assertions
(3)需要覆蓋CDC的所有test branches
(4)很難幸運的覆蓋所有,一般只能發現部分問題
(5)一般在design后期才發現問題
當soc design設計的clock domain太多,用到很多第三方IP,及設計人員水平參差不齊時,用SpyGlass CDC來檢查保證RTL質量是十分必要的。
在工程的block-level和SOC集成的兩個不同階段,所用的CDC Goal也是有所不同的。Block-level關心的是模塊內部,只有模塊內部檢查沒問題后才能做deliver,而SOC集成主要關心的是模塊間interface 的CDC問題。
?
編輯:黃飛
評論
查看更多