建立時間、保持時間、建立余量、保持余量的理解


分析說明:D2:目的寄存器;D1:源寄存器; edge2:下一個時鍾上升沿;edge1:當前時鍾上升沿;edge0:當前時鍾上升沿的前一個時鍾沿;如下圖:

 

 

建立時間:觸發器D2(數據要到達目的的地方)在時鍾上升沿edge1(以edge1是當前的時鍾上升沿)輸入端的數據data1(data1是edge0時D1打給D1的數據,或者說是edge0時刻D1的輸出。edge0是edge1的前一個上升沿)的前一段時間t_setup要求data1數據穩定(為什么要這樣要求呢?)。很明顯建立時間是對D2的輸入數據的時間要求,或者說data1要在edge1來之前的某段時間內到達D2。

1、為什么要求建立時間呢?

 為了使數據正確鎖存就需要數據是穩定的,如果知道觸發器的實現電路的話。如果在edge1-t_setup到edge1這段時間有可能變動的話,就會造成不知道鎖存的是1還是0,這就是所說的亞穩態情況之一。這樣是不能使數據可靠傳輸的。所以需要建立時間。

2、數據data1(來自觸發器D1,即數據源)要傳輸到D2的輸入端,這個數據data1到達D2時間t12如何計算呢?

在edge0來的時候之后的某個很小的時間t1(可以認為是觸發器的傳播延時),開始由D1出發,經過組合邏輯延時t2,到達D2(數據的目的地)。答案已經知道t12= t1 + t2。(一定要注意當前時刻是edge1,對於t12的分析是以edge0作為參考時鍾。為什么要這樣呢?看3小點。此時時鍾到達D2,D1的差沒有考慮,即時鍾抖動。還有t2一般都是給最大延時,最小延時即t2max, t2min。具體用哪個看???等等說。。。。

3、在當前時刻edge1的D2 data1建立時間的時候,那data1的數據在什么時候由D1輸出呢?

再次強調建立時間是分析D2輸入端的數據時間要求。此時刻即edge1,D2輸入端的數據在哪個時刻由D1發出呢(假設在同步系統中,為什么要做這個假設呢?)?肯定是在某個edge,或者說是……edge2,edge1,還是edge0,edge(-1),………。如果說在edge1的時候才開始發出??想想。。。。這是不可能滿足建立時間的!推推看:假設edge1能夠滿足建立時間。要求是什么呢?要求clk 的edge1到D2要遠遠慢於D1在這里是多少:t12 + t_setup。這樣所有的edge到達目的寄存器要至少慢於t(t組合邏輯的延時)+t_setup。這樣的同步系統我不知道如何實現。如果是在edge2,edge3,……時刻才發出data1,要滿足建立時間是不是更不可能實現?    如果在edge0就開始了數據的傳輸,會有什么樣的結果呢?很明顯此時的數據data1有一個clk的時間來傳輸,因為提前一個clk D1就將data1發出,只要data1能在edge1 - t_setup的時刻前到達D2的輸入端就可以滿足建立時間了。這樣分析的優點在哪?我也不太專業,反正這樣分析感覺很對。這也是目前時序分析工具的默認data1數據由D1出發的時間點這也是要求的數據傳輸時序,實際硬件電路可是不管這些的所以這些只是我們希望的要求時序它只管數據在要求穩定的時候是否穩定。后面的多周期也是如此。如果在edge(-1)就開始輸出呢,會有什么樣的結果?因為D2要求data1穩定的時間還是不變的即:edge1 - t_setup。這樣data1就有2 * clk的時間來傳輸了。很明顯這樣就更能滿足在edge1 - t_setup前就穩定的要求了。這就是系統工具(如quartus 的timequest)中用到的指定多周期。如edge(-2),edge(-3),……都是多周期分析了。

4、data1數據是如何走的呢?

假設不是多周期(因為多周期分析我還沒用到過,不會分析)在各個時刻data1數據的傳輸還是很容易搞錯的。因為在edge1時刻D2的輸出不是data1,那此時D2輸出的數據什么呢?肯定是edge(-1)D1的輸出。data1在什么時刻輸出呢?在edge2+t1(t1可以認為是觸發器的傳播延時)才從D2輸出。這樣就能解釋為什么數據經過一層的觸發器,就要多延遲一個時鍾。如何才能使data1正確的由D2輸出呢?或者說在edge0時,data1如何才能正確的由D1輸出呢?這就是要求滿足保持時間。也就是說只有滿足保持時間data才能正確的由D發出。只是要在保持時間要討論的。

 

5、如何才算data1滿足D2保持時間?

數據到達D2的時間比D2要求數據穩定的時間要早,就說data1滿足D2保持時間。假設是提前一個clk,則 t_q(這個不好描述,,,,在一個時鍾周期內除了傳輸時間還剩的時間) = clk - t12,此時可以確定t12中的t2是用最小還是用最大的呢?為了分析的保險t2 = t2max,這樣data1的到達時間就會晚點,這樣就更有可能不滿足D2對data1的建立時間。 只要t_q = clk - t2max - t1 > t_setup(t_setup也是一個時間段),就說data1由D1輸出滿足到D2輸入的建立時間。t_q > t_setup是相對時間段。不是時間軸上的時間。如果能在時間軸上標出那就好了。我就不標了。我就寫寫:|t_q|(data1由D1輸出到D2的時間軸上的時間) = edge0 - t2max - t1, |t_setup|(D2要求data1穩定的時間軸的時間)= edge1 - t_setup。這個時候滿足建立時間的標准是|t_q|在時間軸的左邊,|t_setup|在時間軸的右邊即|t_q| < |t_setup|。這個時候(edge1)千萬不要想到data1在D2的輸出,因為這個時候data1只要等着,還不到輸出的時候

6、建立時間的余量t_setup_slack?

到這里就很清楚了,就是data1到達了D2的一個clk內還剩的時間 減 D2要求的建立時間段就是建立時間的余量:t_setup_slack = t_q(在一個時鍾周期內除了傳輸時間還剩的時間) - t_setup。即建立時間余量大於0,就可以滿足data1由D1傳輸到D2,一個時鍾周期內滿足建立時間。

 

7、在Verilog中是如何體現這種建立關系的?

在Verilog中要產生觸發器必須要這句 always @(posedge clk or negedge rst_n),有這句不一定產生觸發器。看看下面的代碼:

 

always @(posedge clk_200M or negedge rst_n)    begin
    if(!rst_n)
        tx_start_flag <= 0;
    else if(byte_flag == 1)
        tx_start_flag <= 1;
    else
        tx_start_flag <= 0;
end

 

byte_flag 也是 clk_200M同步產生的,並且最多只有一個時鍾的高。 在這段代碼中能檢測到byte_flag == 1嗎?這里的tx_start_flag是一個觸發器。byte_flag是一個觸發器(數據源)的輸出。 在clk_200M edge0時刻,byte_flag輸出數據1,此時會經過上面的判斷執行tx_start_flag <=(非阻塞) 1; 此時分析的是建立時間,而且此時的tx_start_flag輸出還是0。這個時候的輸出為什么還是0?不是已經運行了tx_start_flag <=(非阻塞) 1; 了嗎?我的理解是tx_start_flag在edge0時刻的輸出,是edge(-1)滿足建立時間的值。還是這句話,建立時間分析的是輸入,執行的這句tx_start_flag <=(非阻塞) 1; 也只是給到tx_start_flag觸發器的輸入端在edge0,執行的tx_start_flag <=(非阻塞) 1; 還不會影響tx_start_flag(觸發器)在edge0時刻的輸出。在edge1時刻,byte_flag輸出數據0,同過選擇器會執行tx_start_flag <=(非阻塞) 0; 此時tx_start_flag輸出是1,是edge0滿足的建立時間的等待要輸出的(當然要滿足保持時間)。總結這個always @(posedge clk or negedge rst_n)的行為 1)給滿足保持時間的輸出,也即是上一個edge的滿足建立時間的輸入端,先更新輸出。2)經過判斷執行語句,觸發器輸入端滿足建立時間。輸入,輸出是並發的沒有先后,這里的1)是先執行完)。 到這里很明顯只要byte_flag有一個高脈沖都會使tx_start_flag產生一個高脈沖。

 

====================================================================================================================

保持時間:在clk edge1(當前時刻)到達D2(目的寄存器)后的一段時間(t_hold),輸入端的數據要穩定。只要滿足在t_hold這段時間輸入端的數據穩定,輸入端的數據就能穩定的輸出。

1、輸出的時間是多少?

在edge1到達D2后(沒有考慮時鍾到達D1,D2的差,或者是時鍾偏移),假設此時輸入端的數據穩定(因為只想知道輸出要的時間,即假設滿足建立時間),數據輸出需要的時間可以稱為觸發器的傳輸延時t1即要求的保持時間。如果真的要追究t1由哪些部分組成:這就要看觸發器構成門電路,更細點的話要看構成門電路的cmos的制作工藝(不知道理解對么,反正時間很短0.幾個ns)。t_hold > t1。 可以估計保持時間應該很短。

2、什么會導致這一段的時間的輸入端數據不穩定?

在時序能控制的就是在edge1(為什么是edge1,而不是……edge(2),edge(0),edge(-1),……)時刻來自D1的輸出data1,經過一段時間t12(數據由D1出發到達D2的時間)到達D2,如果到達的時間破壞了edge1要輸出數據date0(edge0時刻到達D2的數據)。如果滿足這種情況要求是 t12 < t_hold。 如果edge2時刻D1輸出的數據data2要破壞edge1時刻D2數據data1的輸出,有什么要求?D1,在edge2時刻的數據比edge1時刻輸出的數據跑的快。這是不現實的,因為data1,data2走的是同一條電路。而edge0就是要edge1輸出的數據。總結:唯一破壞穩定性的理由是t12 < t_hold。

3、保持余量?

首先要滿足保持時間是穩定的即:t12 > t_hold, 才有保持余量。保持余量是:t12 - t_hold。但是其中還有個問題就是t2取 max還是min,為了是數據以最快的速度到達,即t2 = t2max。即t12  = t2min + t1 - t_hold。

4、data1破壞data0?

edge1時刻要滿足保持時間的是data0(D2 edge1輸出的數據),data1是D1在edge1時刻的輸出到D2為了滿足edge2 D2的輸出的建立時間。如果data1到達D2太快,有可能破壞D2在edge1輸出輸出的data0的數據。這種可能性小,但還是存在的。如D1_t1 = 0.06ns, t2 = 0.06ns(沒有組合邏輯),D2_t_hold  = 0.2ns,不考慮時鍾偏移。t12 = 0.06 + 0.06 = 0.12ns < D2_t_hold = 0.2ns。這樣的話和clk的周期是沒有關系的。

 

 

總結:數據的傳遞要搞清。這樣就能明白要哪樣的時序。

 

 

 

 

 

 

 

 

 

有了一天的時間將其寫好。看來,事情認真了還是可以做好!!這個過程,結果。。。。2015.4.24 cornhill

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM