第六章 時鐘域緩存
有一個有趣的現象,衆多數字設計特別是與FPGA設計相關的教科書都特別強調整個設計最好採用惟一的時鐘域。換句話說,只有一個獨立的網絡能夠驅動一個設計中全部觸發器的時鐘端口。雖然這樣能夠簡化時序分析以及減小不少與多時鐘域有關的問題,可是因爲FPG**外各類系統限制,只使用一個時鐘經常又不現實。FPGA時常須要在兩個不一樣時鐘頻率系統之間交換數據,在系統之間經過多I/O接口接收和發送數據,處理異步信號,以及爲帶門控時鐘的低功耗ASIC進行原型驗證。本章討論一下在FPGA設計中多時鐘域和異步信號處理有關的問題和解決方案,並提供實踐指導。網絡
這裏以及後面章節提到的時鐘域,是指一組邏輯,這組邏輯中的全部同步單元(觸發器、同步RAM塊以及流水乘法器等)都使用同一個網絡做爲時鐘。假如設計中全部的觸發器都使用一個全局網絡,好比FPGA的主時鐘輸入,那麼咱們說這個設計只有一個時鐘域。假如設計有兩個輸入時鐘,如圖6-1所示,一個時鐘給接口1使用,另外一給接口2使用,那麼咱們說這個設計中有兩個時鐘域。數據結構
圖6-1:雙時鐘域設計架構
平時咱們在設計中遇到的門控時鐘、衍生時鐘以及事件驅動的觸發器均可歸爲時鐘域類別。如圖6-2所示,經過一個簡單門控時鐘建立了一個新的時鐘域。咱們知道,這類時鐘控制在FPGA設計中並不被推崇(可使用時鐘使能替代時鐘門控),然而它卻很是有利於咱們理解時鐘域這一律念。dom
本章咱們將着重詳細討論如下主題:異步
l 兩個不一樣時鐘域之間傳輸信號。ide
n 亞穩態的產生以及對設計的可靠性的影響工具
n 經過相位控制避免亞穩態佈局
n 在時鐘域之間傳輸單個信號,將信號打兩拍優化
n 使用FIFO在時鐘域之間傳輸多位數據
n 使用分區同步器模塊提升設計的組織架構
l 處理ASIC驗證原型裏的門控時鐘
n 創建一個單時鐘模塊
n 自動門控移除
圖6-2:經過門控時鐘建立的時鐘域
6.1 跨時鐘域
設計中包含多時鐘域,首先要解決的是在不一樣時鐘域之間傳輸信號的問題。信號跨時鐘域傳輸將會是一個大問題,緣由以下:
一、 信號跨時鐘域傳輸產生的故障老是不太容易復現。設計中若是存在兩個異步時鐘域,故障每每與這兩個時鐘沿的相對時序有關。來自片外時鐘源的時鐘一般與器件實際功能並沒有任何關聯。
二、 根據技術的不一樣,問題也不同。(儘管因爲其餘因素的影響,這種狀況並不老是成立)咱們經常會發現,若是約束較小的創建和保持時間,從統計上來講高速設計技術比低速設計技術更不容易產生故障。同時,其它因素,好比同步器件中設計實現對輸出的緩衝,也會對一個可能的故障產生顯著影響。
三、 EDA工具通常不會探測和標註這類問題,靜態時序分析工具是基於獨立的時鐘區域來進行時序分析,並且只有在特定的方式下根據指定的要求才能進行跨時鐘域的時序分析。
四、 一般來講,若是沒有很好地理解,跨時鐘域故障難以探測且難以調試。因此全部跨時鐘域接口都必需要在任何功能實現以前被很好地定義和處理。
讓咱們首先來看看在不一樣時鐘域之間傳輸信號到底會產生什麼錯誤。考慮圖6-3所示的狀況,一個信號在兩個時鐘域之間傳播。
如圖6-4所示,低速時鐘的週期是高速時鐘週期的兩倍。低速時鐘上升沿與高速時鐘上升沿之間的間隔爲常量,並且老是等於dC。因爲這兩個時鐘的這種相位匹配關係,dC老是保持不變(假定頻率沒有漂移),並且在這個例子中,dC老是大於邏輯延時與高速時鐘驅動的觸發器創建時間之和。
圖6-3:時鐘域之間的簡單信號傳輸
圖6-4:兩個時鐘域之間的時序關係
當這些時鐘一啓動,它們之間存在一個固定的相位關係,如此能夠避免任何創建時間和保持時間違規。只要時鐘沒有漂移,就沒有任什麼時候序違規出現,而且器件會如預想那樣工做。如今咱們再考慮另一種狀況,一樣的時鐘上電後的相位關係如圖6-5所示。
圖6-5:會形成時序違規的時鐘相位關係
圖6-5中兩個時鐘之間的這種相位關係就會形成時序問題。這種狀況會在任意頻率的兩個時鐘域之間。然而,若是時鐘的頻率匹配不對,這種時序問題在這種狀況下也不會發生。
總結來講,時鐘同步問題在FPGA設計中一般是一種不可復現的問題,並且會對設計的可靠性帶來嚴重後果。後面咱們會討論解決這類問題的方案,在此以前,咱們必需要討論當創建和保持時間違規時到底會發生什麼。下一小節就是關於這個主題。
6.1.1 亞穩態
觸發器的創建時間和保持時間在時鐘上升沿左右定義了一個時間窗口,若是觸發器的數據輸入端口上數據在這個時間窗口內發生變化(或者數據更新),那麼就會產生時序違規。存在這個時序違規是由於創建時間要求和保持時間要求被違反了,此時觸發器內部的一個節點(一個內部節點或者要輸出到外部節點)可能會在一個電壓範圍內浮動,沒法穩定在邏輯0或者邏輯1狀態。換句話說,若是數據在上述窗口中被採集,觸發器中的晶體管不能可靠地設置爲邏輯0或者邏輯1對應的電平上。因此此時的晶體管並未處於飽和區對應的高或者低電平,而是在穩定到一個肯定電平以前,徘徊在一箇中間電平狀態(這個中間電平或許是一個正確值,也許不是)。如圖6-6所示,這就是所謂的亞穩態。
圖6-6:時序違規致使亞穩態
如圖6-6的波形所示,信號的跳變發生在創建和保持邊界組成的時間窗口內,這意味着輸出不會是邏輯0或邏輯1對應的肯定電平,而是它們之間的一箇中間電平。若是觸發器包含有一個輸出緩衝,那麼亞穩態自己就能夠稱爲隨着內部信號的逐漸穩定而在輸出上表現的雜散過渡。輸出保持亞穩態的時間是隨機的,甚至可能在整個時鐘週期內都保持亞穩態。那麼,若是這個亞穩態值輸入到組合邏輯,根據邏輯門電路的切換門檻,錯誤的操做就能夠發生。從時序收斂的角度來講,兩個觸發器之間的組合邏輯延時都要求要小於最小的時鐘週期,可是這種亞穩態信號保持亞穩態的時間,自己就是變相地增長了邏輯延時。很顯然,一個亞穩態信號會給設計帶來致命的功能故障,並且該信號也將沒法在各個時鐘沿上採集到一致的結果。
事實上須要注意的是,在FPGA設計流程中想經過仿真來肯定亞穩態對設計的危害是很是困難的。純數字的仿真器並不能檢查到創建和保持違規,從而在違規發生時,仿真出一個邏輯「X」(未知)值。而普通的RTL仿真,並不會出現創建和保持違規,因此也就不會有信號出現亞穩態狀態。儘管門級仿真的時候會檢查創建和保持是否違規,可是仿真由兩個異步信號對齊而致使一個同步故障依然是一件十分困難的事情。尤爲困難的是,設計或者驗證工程師並非在設計伊始即查找問題。那麼,理解如何保持設計的可靠性以及如何避免須要經過仿真來揭露設計的同步問題,就顯得十分重要了。解決亞穩態的方法有不少,後面咱們將逐一進行討論。
6.1.2 解決亞穩態方案1:相位控制
考慮這樣一個設計,兩個時鐘域的週期不一樣,並且相位關係任意。若是至少有一個時鐘由FPGA內部的PLL或者DLL控制,並且在PLL或者DLL的精度範圍內,其中一個時鐘的週期是另一個時鐘週期的數倍。那麼如圖6-7所示,經過相位對齊能夠避免實現違規。
考慮這樣一個例子,一個信號從低速時鐘域傳遞進入另外一個時鐘域,而此時鐘域的週期是低速時鐘域的一半。根據前面的分析,若是沒有任何相位關係的保證,那麼時序違規就有可能發生。而後,經過使用DLL由低速時鐘派生這個高速時鐘,那麼相位對齊就能夠達成。
圖6-7中,DLL調整高速時鐘(採集)的相位來對齊低速時鐘(發送)。數據在兩個時鐘域之間傳遞的時間是dC,該傳遞時間老是處於其最大可能值。本例中,只要從低速觸發器到高速觸發器的傳播延時小於高速時鐘週期,那麼就不會有創建時間違規發生。若是由於時鐘歪斜不夠小而致使保持時間要求沒法知足,那麼能夠經過配置實用高速時鐘的降低沿來採集信號,固然前提是有足夠的時序餘量能確保創建時間要求獲得知足。
圖6-7:使用DLL對齊相位
總結來講,相位控制技術能夠在一個時鐘頻率是另一個時鐘的數倍且其中一個時鐘能夠由FPGA內部PLL或者DLL控制時使用。
在不少例子中,設計控制時鐘域之間的相位關係是很奢侈的。尤爲是時序要求由FPG**外的芯片施加,或者時鐘域之間沒有任何肯定相位關係的時候。舉例來講,若是FPGA在兩個系統之間提供了一個接口,而這兩個系統施加在芯片輸入輸出延時上的時序要求很是緊張,調整任何這兩個系統的時鐘相位是不可能的。相似這種例子在實踐中會常常遇到,因此須要使用新的方法來解決,下一節將討論這種新的方法。
6.1.3 解決亞穩態方案2:打兩拍處理,即寄存兩拍
跨越兩個異步時鐘域傳輸單比特信號時,可使用打兩拍技術。根據上一節的討論,創建或保持時間違規會致使一個觸發器內節點上電平徘徊在一箇中間狀態,從而產生亞穩態問題,並且信號從這種中間狀態到一個穩定狀態須要時間,此時間的長度未知。這個未知的時間會被加入到時鐘到輸出的時間(Tco)裏(影響隨後路徑上的延時),且會在下一級致使一個時序違規。若是該信號輸入到一個控制分支或者一個判決樹,那將是很是危險的。不幸的是,沒有很好的辦法來預測這種亞穩態將會持續多長時間,也沒有很好的辦法將這些信息反標註到時序分析工具以及優化工具。假定兩個時鐘域之間徹底異步(即沒法實現相位控制),那麼儘量避免亞穩態的一個最簡單辦法就是使用雙觸發。在其它也許教科書中也稱這種方法爲同步位、兩級觸發器或兩級同步器。
圖6-8所示的配置中,同步器電路(其輸入爲Din)中的第一拍後也許會產生亞穩態,可是信號有機會在其被第二級鎖存以及被其它邏輯看到以前穩定下來,如圖6-9所示。
圖6-8:打兩拍處理
圖6-9:打兩拍重同步器
圖6-9中,Dsync是同步器中第一個觸發器的輸出,而Dout是第二個觸發器的輸出。Dout本質上是等到同步後的信號一旦穩定下來後將其往下傳,而且確保其它電路不會收到亞穩態信號。同步器兩級觸發器之間不要添加任何邏輯,這樣可使得信號得到儘量長的時間來回到穩定狀態。因此總結來講,打兩拍同步器在單比特信號跨異步時鐘傳輸時,用來將該單比特信號從新同步到異步時鐘域。
理論上來講,第一個觸發器的輸出應該一直保持不肯定的亞穩態,可是在現實中它會受到實際系統一系列因素影響後穩定下來。打個比方,想象一下一個皮球穩定地停住在一個山尖上,從任何方向上輕推一下球,它都會由相反的方向從山上滾落。一樣,處於亞穩態的一個邏輯門,由發熱、輻射等產生的隨機波動都會促使該亞穩態回到邏輯0或者邏輯1對應的穩態。
使用打兩拍技術採樣一個異步信號時,沒法徹底預知咱們想要的信號跳變,將在當前時鐘發生仍是下一個時鐘發生。當信號屬於一個數據總線中的一部分(有些數據位比其它比特晚一個時鐘週期跳變)時,或者關鍵數據必需要精確到單個時鐘週期內到達時,這種打兩拍技術是沒有幫助的。不過,對於控制信號來講,若是它們能夠忍受正負一個或更多個時鐘週期的變化,這種技術仍是很是有用的。
舉例來講,一個外部事件控制一個比特來觸發FPGA內部動做,這個觸發動做發生的頻率能夠很是的低,好比兩個事件之間的間隔能夠達到微秒甚至毫秒級。在這個例子中,一些額外的數納秒的延時並不會影響該事件的行爲。若是由外部事件驅動的改比特輸入到一個狀態機的控制結構中,經過同步器打兩拍處理,那麼想要的信號變化只是被延遲了一個時鐘週期。然而,若是沒有進行打兩拍處理,那麼判決邏輯也許會從該異步信號的亞穩態狀態解碼出不一樣狀態跳轉信息,並使得狀態機同時跳轉到不一樣的分支。
除了純數字系統外,還有一種混合信號系統,這種系統會一般會產生異步反饋信號到FPGA,如圖6-10所示。
圖6-10:從新同步模擬反饋
上述對異步信號打兩拍的同步器的Verilog代碼以下所示:
module analog_interface(
...
output regfbr2,
input feedback);
reg fbr1;
always @ (posedge clk) begin
fbr1<=feedback;
fbr2<=fbr1;//;doubleflop
end
...
反饋信號會產生時序違規,並且fbr1在時鐘沿後一個不肯定的時間內處於亞穩態。那麼,其它邏輯只可使用的信號fbr2。
使用打兩拍同步處理技術時指定時序約束是很是重要的,須要施加的約束是將位於第一個和第二個寄存器時鐘域之間的信號路徑指定爲假路徑,即讓時序分析器部分此路徑。由於打兩拍同步器結構用於從新同步信號,在這兩個時鐘域之間並無須要分析的同步路徑。此外,如前所述這兩個觸發器之間的時序要儘量的小,這樣能夠減少亞穩態被傳播到第二級觸發器的可能性。
6.1.4 解決亞穩態方案3:使用FIFO結構
跨時鐘域傳輸數據用得最多的方法就是使用先入先出(即FIFO)結構。FIFO能夠用於在兩個異步時鐘域之間傳輸多個比特信號。咱們一般看到的FIFO應用包括在兩個標準總線之間傳輸數據,以及從可突發訪問的存儲器中讀出數據或者對其寫入數據。例如,如圖6-11所示,顯示的是一個可突發訪問存儲器與一個PCI總線之間的接口。
圖6-11:FIFO在PCI應用中
在不少不一樣的應用中,FIFO都是一種很是有用的數據結構,不過這裏咱們僅僅關注其處理跨時鐘域突發數據的能力。
FIFO很是相似於在超市裏的結帳通道,每一個客戶到達結帳臺的時間多少有點隨機性,結帳速度在必定意義上說是勻速的。有時候結帳客戶可能會不多,而其餘某些時候又會突發不少客戶須要結帳,收款員不可能馬上爲每一個客戶服務,因此須要排隊。抽象地來講,咱們稱這種排成一隊的數據爲一個序列。隨後,收款員會以或多或少平均的速度爲每個顧客服務,並不會理會隊列的長度。假如須要結帳的顧客涌入收銀臺的速度超過了收款員的服務速度,那麼這種收款結構就沒法支撐了。那麼此時,就須要採起措施,要麼加快收款員的服務速率,要麼減小新增顧客數。
一樣的道理也存在於數據傳輸中,數據可能到達某個時鐘域的間隔是徹底隨機的,有時候或許會面臨一個很大突發數據塊。這種狀況下,處在另外一個時鐘域的接收設備只能以指定的速率來處理數據。如圖6-12所示,一個FIFO被用於緩存數據,這樣在設備中就造成了一個數據序列。
圖6-12:異步FIFO
經過使用異步FIFO,數據發送端能夠以隨意的間隔發送數據,而接收端也能夠以其固有的帶寬從數據序列裏取出數據並進行處理。因爲任何由FIFO實現的數據序列的長度都不能無限制,因此須要一些控制來防止FIFO溢出。這時候,有兩種選項能夠採用:
l 事先定義好的發送速率(可突發或不可突發),最小接收速率以及對應最大的序列尺寸。
l 握手控制。
注意,發送設備的時鐘頻率沒有必要高於接收端設備,不然容易形成溢出。以較慢的頻率將數據送入FIFO,那麼數據寫入FIFO的時鐘週期數要少於接收端將要處理數據的時鐘週期數。那麼,若是不採起握手控制,就必需要理解以上描述會產生溢出的最壞的狀況。
在任何一段時間內,假設數據發送寫FIFO的速率大於接收處理數據的速率,那麼很輕易地使系統沒法維持。由於沒有任何存儲設備能夠存得下無限的數據,這種問題須要在系統結構層級才能解決。一般來講,突發發送通常是以小週期性或非週期性發生。因此FIFO的最大尺寸要大於等於(具體還要根據數據接收器的屬性)突發的尺寸。
在不少例子中,無論是突發尺寸仍是數據到達的分配都沒法很好地定義。這種時候,就有必要使用握手控制來防止FIFO產生數據溢出。如圖6-13所示,這種握手控制一般由一些標誌信號來實現。這些標誌信號,一個是發送側的滿標誌,用於提示FIFO沒有多餘空間存儲數據了,另外一個是而空標誌,用於提示接收側,FIFO中沒有數據須要處理了。管理這些握手信號可能還須要一個狀態機,正如圖6-13所示。
圖6-13:FIFO的握手控制
FIFO在FPGA內通常是經過封裝一個雙口RAM來實現。表面上看微不足道的標誌信號如空和滿指示等,其實是實現起來反而比較困難。緣由就在於輸入控制經常須要依據輸出來產生,一樣的輸出控制也經常須要依據輸入來產生。例如,驅動輸入的邏輯必需要知道FIFO是否已滿,而這隻能經過獲取從輸出端讀出的數據數量才能得知。一樣的道理,在輸出側從FIFO讀數據的邏輯必需要了解FIFO中是否還有數據(即FIFO是否已空),而這隻能經過輸入端口的寫指針才能判決。
這裏咱們探討使用FIFO在兩個異步時鐘域之間傳輸數據,不過一樣會面臨實現FIFO自己時遇到的握手標誌問題。爲了在兩個時鐘域之間傳遞必要的信號,咱們必須重回上一節討論到的打兩拍技術。下面咱們以圖6-14所示的簡單異步FIFO框圖爲例進行闡述。
圖6-14:異步FIFO簡單框圖
圖6-14中,在產生空和滿信號時,寫地址和讀地址都必須是異步傳遞到對方時鐘域中。這樣在從新同步多比特意址總線時,問題就來了,即根據各個比特不一樣的走線,總線中某些比特可能會比其它比特晚一個時鐘週期。換句話說,因爲兩個時鐘域異步的天然屬性,使得地址總線有些比特在一個時鐘沿上被採集,而另外一些比特卻在下一個時鐘沿上被採集,固然這取決於數據是否在第一個觸發器的時鐘沿到達以前提早足夠長時間有效。若是上述狀況發生,那麼會給系統帶來嚴重後果,由於二進制地址中有些位變化有些位卻沒有,所以接收邏輯將會獲得一個徹底無效的地址,這個地址既不是當前地址也不是上一個地址。
這個問題能夠經過將二進制地址轉換爲格雷碼來解決。格雷碼是一種很是特殊的計數器,兩個相鄰地址中只有一個比特是不一樣的。因此當地址改變時,只須要改變地址中的一個比特便可,這樣就能夠避免上面提到的問題。若是發生變化的那個比特並無被下一個時鐘正確採集,地址線上會「同步地」保留舊的地址值。那麼,任何不正確的地址(即既不是當前地址也不是舊地址)操做都被消除了。因此總結來講,格雷碼經常使用來在異步時鐘域之間傳遞多比特計數值,且多用於FIFO內。
須要額外注意的一點是,因爲只有讀寫地址是須要在異步時鐘域之間傳遞,因此地址就有可能比預想的晚一個時鐘週期,同時意味着空或者滿標誌置位晚一個時鐘週期,可是這並不表示錯誤致使了數據溢出情況。若是這種狀況在傳遞地址到讀時鐘域時,讀邏輯將簡單地認爲數據沒有寫入,且將認爲FIFO已空儘管此時FIFO已經被寫入一個數據。這隻會對總的吞吐率有一些小影響,可是不會致使下溢(即讀已空的FIFO)情況發生。一樣地,當地址被傳遞到寫時鐘域時,若是讀地址被延時了,那麼寫邏輯會認爲FIFO裏沒有多餘空間,儘管此時FIFO還未滿。這一樣只會對總的數據吞吐率有些微小影響,卻不會形成上溢(寫已滿的FIFO)發生。
FIFO是一種足夠通用的模塊,大部分FPGA供應商都提供了工具,可讓客戶根據本身的要求來自動產生軟核。這些用戶FIFO能夠像其它IP模塊那樣由用戶手動地在設計中例化。那麼,在一個FPGA設計中使用本身的FIFO時,上述討論的問題極可能將沒必要由設計本身來解決。固然,一樣的問題也常常在異步時鐘域之間傳遞數據的時候發生,因此理解這類設計實踐對於一個高級FPGA設計者來講很是重要。
6.1.5 設計分區同步器模塊
在頂層爲設計劃分好設計分區是一個好的設計實踐行爲,這樣任何功能模塊外面都包含一個獨立的同步器模塊。這樣有利於在劃分模塊的基礎上實現所謂的理想時鐘域狀況(即整個設計模塊只有一個時鐘),如圖6-15所示。
圖6-15:設計分區同步器模塊
對設計進行分區有不少理由。首先,對每一個獨立的功能模塊進行時序分析變得簡易,由於模塊都是徹底的同步設計。其次,整個同步模塊中的時序例外也很容易獲得定義。再次,底層模塊的同步器加時序例外在代入到設計頂層時,大大下降了因爲人爲失誤形成的疏漏。因此,同步寄存器應該在功能模塊外單獨分區。還有不少相似的設計實踐在使用FPGA做爲ASIC的設計原型時獲得應用,下一節咱們將再進行詳細地討論。
6.2 ASIC原型設計中的門控時鐘
ASIC設計通常對功耗很是敏感,同時ASIC的時鐘樹設計又很是靈活,因此會在整個設計中常用門控時鐘在邏輯不須要活動的時候來去使能這些邏輯。雖然使用FPGA做爲ASIC的原型能夠模擬整個邏輯功能,可是兩者之間的有些物理屬性,如功耗方面,仍是不太同樣。那麼,要求FPGA來模擬ASIC的整個低功耗優化是沒有必要的。實際上,正是因爲FPGA的粗放式的時鐘資源,讓其模擬這方面功能也是不太可能的。這一節咱們將討論一些解決這個問題方法,而且再討論一些能夠應用於ASIC設計的技術來使FPGA原型設計更加容易。對於門控時鐘更詳細的容易能夠參考前面第三章。
6.2.1 時鐘模塊
若是一個ASIC設計中使用了大量的門控時鐘,建議將全部這些門控操做統一放在一個專門的時鐘生成模塊中,並與功能模塊隔離,如圖6-16所示。
圖6-16:統一的時鐘模塊
經過將時鐘門控置於一個單一的模塊,不但能夠是約束處理更簡單,並且當要對FPGA原型進行任何修改時也更容易。例如,若是設計者選擇某次編譯時刪除全部門控單元,那麼一個單一的模塊裏很容易實現。下一節咱們將對此進行詳細討論。
6.2.2 時鐘門控移除
有不少辦法能夠從FPGA原型裏刪除時鐘門控,下面的例子就顯示了一個很明顯,但卻也是很麻煩的一個方法。這個例子的代碼以下所示,該代碼是刪除FPGA原型裏全部的門控功能。
‘define FPGA
//‘define ASIC
module clocks_block(...)
‘ifdef ASIC
assign clock_domain_1=system_clock_1&clock_enable_1;
‘else
assign clock_domain_1=system_clock_1;
‘endif
若是上述代碼須要開放時鐘門控,那麼在FPGA原型設計中只須要修改宏定義便可。不足之處是,任什麼時候候要將FPGA原型轉化爲ASIC設計時老是須要作出一些修改(其實就是修改宏定義)。不少設計者對此會感受不是太舒服,由於他們認爲兩者使用的不是同樣的RTL。一個更好的辦法是使用一個自動門控刪除工具來消除任何認爲形成失誤的可能。許多現代的綜合工具經過正確的約束,如今都提供這項功能。例如,Synplify就有一個稱爲「Fix gated clocks」選項,就是用於自動地從時鐘線上將門控操做刪除,並將其移動到數據路徑上。咱們來看下面這個代碼示例:
module clockstest(
output reg oDat,
input iClk,iEnable,
input iDat);
wire gated_clock=iClk&iEnable;
always @ (posedge gated_clock)
oDat<=iDat;
endmodule
在上面的代碼中,系統時鐘被一個使能信號門控產生一個門控時鐘。這個門控時鐘被用於驅動觸發器oDat,而oDat用於寄存器輸入iDat。若是沒有啓用「fixing the clock gating」選項,那麼綜合工具將會直接實現邏輯功能,如圖6-17所示。
圖6-17:直接時鐘門控
圖6-17的邏輯實現中,在時鐘線上放置了門控操做。那麼設計中如今有了兩個時鐘域,必須分別對它們進行約束,並且必須分別將它們佈局到時鐘資源。可是,若是啓動了時鐘門控刪除,這個邏輯門就會比較容易地被移動到數據路徑上,如圖6-18所示。
圖6-18:時鐘門控刪除
如今大部分邏輯器件裏邏輯單元都提供了一個時鐘使能輸入,有了該使能輸入就能夠不使用本方案。然而,若是一個特定的技術並未提供觸發器時鐘使能,那麼只能使用本技術來刪除時鐘門控,只是這樣就將會在數據路徑上增長延時。
6.3要點總結
l 時鐘同步問題一般是不可復現的問題,而且會給FPGA設計帶來可靠性問題。
l 亞穩態會給FPGA帶來災難性故障。
l 相位控制技術在一個時鐘頻率是另一個的數倍且其中一個時鐘能夠由內部PLL或者DLL控制的時候使用。
l 打兩拍技術可用於在異步時鐘域之間同步單比特信號。
l 在打兩拍同步器中,時序分析應該忽略第一個觸發器,同時要確保兩個同步觸發器之間的延時最小。
l FIFO用於在兩個異步時鐘域之間傳遞多比特信號。
l 格雷碼用於在兩個異步時鐘域之間傳遞計數值數據,並且多用在FIFO內部。
l 同步寄存器應該在功能模塊外面獨立分區。
l 若是可能,請儘可能不要使用時鐘門控。若必須使用,請將全部的門控時鐘放置在一個專門的時鐘模塊中,並與其它功能模塊隔離。