module介面訊號的收斂與發散的思考

在離散數學課程中,曾學到如何把一個發散的數學式子轉換到收斂的數學式子;其做法是把原來式子做整理(積分或是微分的處理),重新寫出新的數學式子,這樣子才可能把發散的條件轉換到收斂的條件,然後才能得到我們想要的結果。

同理,一個控制流程的很好的module(模組),它在介面訊號上,也會是一個收斂的。如何確保你的module是一個收斂的介面module。

第一步: 選擇一個clock為主要的clock domain,所有的控制訊號都是在這個主要的clock domain下被控制、操作。

第二步: 把所有不同步的控制訊號處理同步到主clock domain。這種做法就是把原來發散條件轉換到收斂條件。以下是示意圖。

以下的波形圖是用來解釋上面圖形的。從波形圖中clockA有一個需求reqA,向clockBmodule提出。因為不相同頻率的訊號直接使用,會有meta stable問題,所以reqB_syn1就是來解決meta stable。之後再拿reqB_syn2reqB_syn3來操作,得到一個需求訊號reqB_getModule B用這個reqB_get是安全的。然後再產生reqB_clr去回覆module A 的需求。reqB_clr一樣,也是經過一連串的同步處理,最後,module A得到在clockA domain reqA_clrmodule AreqA_clr清除reqA訊號,這也是安全的。以下是波形圖。

這樣子的做法,可解決大部份介面訊號發散的情況,也可以運用到所有的控制訊號的處理。目前我唯一遇過比較不同的是DDR PHY的控制訊號處理,它沒有辦法把所有的訊號線同步到相同的clock domain,而這是因為DDR PHY的設計上比較講究latency的長短以及它本身是clock的上升緣及下降緣都是資料處理的時間點,所以做法上更複雜,但是其基本精神也是沒有脫離上述的觀念。

在設計一個模組時,一定都要隨時隨地保有發散、收斂的觀念在心中,並確保每個控制訊號都是收斂的環境下操作,這樣子才可以確保每個IP都是收斂且穩定高的module。 

原文地址:https://www.cnblogs.com/orchid123/p/3635169.html