Verilog 同步與異步

2022-05-20 14:34 更新

關(guān)鍵詞: 同步,異步

由前5章內(nèi)容可知,當(dāng)觸發(fā)器輸入端的數(shù)據(jù)和觸發(fā)器的時(shí)鐘不相關(guān)時(shí),很容易導(dǎo)致電路時(shí)序不滿足。本章主要解決模塊間可導(dǎo)致時(shí)序 violation 的異步問題。

關(guān)于異步與同步的定義,許多地方都有介紹,細(xì)節(jié)上也有所差異。本章主要的關(guān)注點(diǎn)是解決異步問題的方法,而不關(guān)心為什么會出現(xiàn)異步時(shí)鐘,也不關(guān)心異步電路的具體結(jié)構(gòu),僅從異步時(shí)鐘的時(shí)序結(jié)果去分析解決問題。

同步時(shí)鐘

數(shù)字設(shè)計(jì)中,一般認(rèn)為,頻率相同或頻率比為整數(shù)倍、且相位相同或相位差固定的兩個(gè)時(shí)鐘為同步時(shí)鐘。

或者理解為,時(shí)鐘同源且頻率比為整數(shù)倍的兩個(gè)時(shí)鐘為同步時(shí)鐘。其實(shí),時(shí)鐘同源,就保證了時(shí)鐘相位差的固定性。具體可以分類如下:

同源同頻同相位

此類時(shí)鐘頻率和相位均相同,是同步的。時(shí)鐘間數(shù)據(jù)傳輸只要滿足正常的建立時(shí)間和保持時(shí)間即可,不需要特殊的同步設(shè)計(jì)。

同源同頻不同相位

兩個(gè)時(shí)鐘同頻但不同相位時(shí),只要相位差保持固定,也可以認(rèn)為是同步的。因?yàn)橹灰刂苾蓚€(gè)時(shí)鐘間傳輸?shù)臄?shù)據(jù)延遲在合理范圍內(nèi),就不會導(dǎo)致時(shí)序問題。而且,固定的時(shí)鐘延遲也可以在版圖級網(wǎng)表中修復(fù)。

固定的相位差可以理解為同源時(shí)鐘下兩個(gè)時(shí)鐘因路徑不同而導(dǎo)致的偏移。


同源不同頻但存在整數(shù)倍分頻比

此類情況下,一個(gè)時(shí)鐘往往是另一個(gè)時(shí)鐘的分頻,即便存在相位差也是固定的。

當(dāng)單 bit 信號從慢時(shí)鐘域傳遞到快時(shí)鐘域時(shí),因?yàn)橥矗灰獫M足建立時(shí)間和保持時(shí)間,快時(shí)鐘域總會采集到從慢時(shí)鐘域傳遞來的信號。

如下圖所示,clk2 上升沿總能采集從 clk1 域來的信號 sig1,且采集到的信號 sig2 高電平持續(xù)周期也是兩個(gè)時(shí)鐘的頻率比,即 2 個(gè)周期。


如果要求 clk2 域的信號 sig2 只需要持續(xù)一個(gè)時(shí)鐘周期,則需要對 sig1 進(jìn)行上升沿檢測。同步信號間的上升沿檢測程序 Verilog 描述如下。

   reg [1:0]    sig2_r ;
   always @(posedge clk2 or negedge rstn) begin
     if (!rstn) sig2_r  <= 2'b0 ;
     else       sig2_r  <= {sig2_r[0], sig1} ;
   end
   assign sig2 = sig2_r[0] && !sig2_r[1];

仿真結(jié)果下圖所示。


當(dāng)單 bit 信號從快時(shí)鐘域傳遞到慢時(shí)鐘域時(shí),只要慢時(shí)鐘域能安全采集到從快時(shí)鐘域傳遞來的信號,就不存在異步問題。因?yàn)閮蓚€(gè)時(shí)鐘是同源的。如下圖 sig1 到 sig2 的傳輸。

但是如果快時(shí)鐘域信號過窄,慢時(shí)鐘域可能會漏掉該信號,如下圖 sig11 到 sig22 的傳輸。此時(shí)就需要對快時(shí)鐘域的窄脈沖信號進(jìn)行展寬。


當(dāng)兩個(gè)時(shí)鐘頻率比相對較小時(shí),可以在快時(shí)鐘域采用對信號延遲的方法進(jìn)行展寬;

當(dāng)兩個(gè)時(shí)鐘頻率比相差較大時(shí),可在快時(shí)鐘域采用計(jì)數(shù)的方法來延長單 bit 信號有效的時(shí)間。

利用延遲來展寬窄脈沖信號的方法 Verilog 描述如下。因?yàn)?nbsp;clk1 與 clk2 的頻率比為 2,只需要在 clk2 時(shí)鐘域延遲 2 拍即可。

   reg [1:0]    sig11_r ;
   always @(posedge clk1 or negedge rstn) begin
     if (!rstn) sig11_r  <= 2'b0 ;
     else       sig11_r  <= {sig11_r[0], sig11} ;
   end

   reg          sig22_r ;
   always @(posedge clk2 or negedge rstn) begin
      if (!rstn)        sig22_r  <= 1'b0 ;
      else              sig22_r  <= |sig11_r ;
   end
   assign sig22 = sig22_r ;

此時(shí),快時(shí)鐘域的信號被延遲 2 拍,總會被慢時(shí)鐘域采集到,如下圖所示。


總之,同源且頻率比為整數(shù)倍關(guān)系時(shí),可以理解為這兩個(gè)時(shí)鐘是同步的,不需要特殊的同步處理。下面,簡單介紹下異步時(shí)鐘的情況。

異步時(shí)鐘

工作在異步時(shí)鐘下的兩個(gè)模塊進(jìn)行數(shù)據(jù)交互時(shí),由于時(shí)鐘相位關(guān)系不可控制,很容易導(dǎo)致建立時(shí)間和保持時(shí)間 violation。以下 3 種情況下的時(shí)鐘可以認(rèn)為是異步的。

不同源

由兩個(gè)不同的時(shí)鐘源產(chǎn)生的兩個(gè)時(shí)鐘是異步的,這是最常見的異步時(shí)鐘。即便兩個(gè)時(shí)鐘頻率相同,但是也不能保證每次上電后兩者的相位或相位差是相同的,所以信號間的傳輸與時(shí)鐘關(guān)系也是不確定的。

同源但頻率比不是整數(shù)倍

此時(shí)兩個(gè)時(shí)鐘間相位差也可能會有多個(gè),例如同源的 7MHz 時(shí)鐘和 3MHz 時(shí)鐘,他們之間也會出現(xiàn)多個(gè)相位差,時(shí)序也難以控制。一般情況下也需要當(dāng)異步時(shí)鐘處理。

同源雖頻率比為整數(shù)倍但不滿足時(shí)序要求

前面介紹同步問題時(shí)有說明,當(dāng)信號從快時(shí)鐘域傳遞到慢時(shí)鐘域時(shí),只要慢時(shí)鐘域能安全采集到從快時(shí)鐘域傳來的信號,就不存在異步問題。但如果信號在快時(shí)鐘域翻轉(zhuǎn)速率過快,慢時(shí)鐘域可能不會安全的采集到從快時(shí)鐘域傳來的信號,這也可以認(rèn)為是異步問題。

一般來說,慢時(shí)鐘域時(shí)序約束較為寬松,快時(shí)鐘域較為嚴(yán)格。

如下圖,快時(shí)鐘域信號在慢時(shí)鐘域上升沿前翻轉(zhuǎn)了 2 次。此時(shí),慢時(shí)鐘域會漏掉部分?jǐn)?shù)據(jù)。而且,數(shù)據(jù)的快速變化也可能導(dǎo)致 timing violation。


這里只簡單介紹下異步時(shí)鐘的分類情況,異步問題的解決方法請參考后面的章節(jié)。

點(diǎn)擊這里下載源碼


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號