Vivado時序分析概念setup time, hold time
reference
What is Setup and hold time in an FPGA?
Propagation delay in an FPGA or ASIC?
另外ug906的第五章介紹了時序分析的基礎。最一開始介紹的就是timing path的概念,進而引出了時序分析的兩個關鍵分析點setup slack analysis和hold slack analysis。
作為基礎,本文的reference當中提到了setup time和hold time的概念:
setup time: Setup time is the amount of time required for the input to a Flip-Flop to be stable before a clock edge.
hold time: Hold time is the minimum amount of time required for the input to a Flip-Flop to be stable after a clock edge.
這里\(t_{su}\)就是setup time,\(t_h\)就是那個hold time。setup time和hold time對於一個觸發器來說是固定的參數。也就是說要完成一次正常的數據鎖存,數據必須要在setup time和hold time的時候保持穩定。這里的setup time和hold time都是相對於輸入來說的,一個觸發器的輸入來說的,也就是說上一個觸發器的輸出要在當前分析的觸發器的時鍾設置邊沿前/后(setup/hold)保持穩定的時間。
在實際的電路當中一個觸發器的運行周期必須滿足:
這其中的\(t_{co}\)是指一個觸發器從接收時鍾邊沿開始到該觸發器產生數據輸出的時間間隔,如果兩個相同的觸發器級聯,從上一級觸發器的時鍾邊沿(launch edge)開始考慮,最小的時鍾周期應該等於上一級的\(t_{co}\)加上上一級與該級之間的傳輸時延\(t_{comp}\),再加上該級的\(t_{su}\)。
這里只有\(t_{comp}\)(傳輸延時)是可變的,與具體的電路結構設計有關。傳輸的延時越短,FPGA可運行的時鍾速率就越高。
再來看xilinx當中的Setup/Recovery Relationship的概念。Xilinx說:
The setup check is performed only on the most pessimistic setup relationship between two clocks.
-ug906(v2016.4)P153
因為(dst的setup time)setup time是固定的,所以只要能保證在收發脈沖上升沿時間差值最短的時候保證沒有問題,那么實際運行應該就不會出現問題。所以檢查的是required_time - arrival_time。
即
Data Required Time(hold) =
capture edge time
+destination clock path delay
-clock uncertainty
-setup time
Data Arrival Time(hold) =
launch edge time
+source clock path delay
+datapath delay
省略了\(t_{co}\)
Slack(setup) =
Data Required Time-Data Arrival Time
結合陳小碩的文章,可以看出setup slack實際上評估的是針對兩級級聯的觸發器,下一級接收到的數據能否安全的設置。
在接收端dst的hold time也是固定的,如果在hold時間還沒結束的時候下個數據就被推過來了。在當前傳輸的數據就有可能被覆蓋掉。所以hold check檢查的是arrival_time - required_time。
Data Required Time(hold) =
capture edge time
+destination clock path delay
-clock uncertainty
+hold time
Data Arrival Time(hold) =
launch edge time
+source clock path delay
+datapath delay
Slack(hold) =
Data Arrival Time-Data Required Time
本來hold分許也叫作Min delay analysis,可以這樣理解如果把setup Slack的計算公式當做是一種標准型,那么我們就希望Min delay這個值負的越多越好。當然這里實際是反過來了,取了個相反數,那就是越大越好。
結合Xilinx給的公式結合陳小碩這個圖來看我們能得到什么。
Slack(setup) = Tclkdiff - Tcomp - Tsetup - Tskew;
穩定條件(Tcomp包含Tco)也就是:
Tclkdiff始終未reg2的捕獲時鍾邊沿與當前一個reg1的捕獲時鍾邊沿時刻之差,順序不可顛倒。
如果不考慮skew的影響的話,可得下式
Tclk >= Tcomp + Tsetup - Tclkdiff
如果是單個時鍾的話可以以Tclk表示整個周期時長,而以Tclkdiff表示周期時長的模值(不滿一個周期的多余部分)
Slack(hold) = - Tclkdiff +Tcomp - Thold + Tskew;
穩定條件(Tcomp包含Tco,而且這里的Tclkdiff可為負值,因為Tclkdiff始終未reg2的捕獲時鍾邊沿與后一個reg1的捕獲時鍾邊沿時刻之差,順序不可顛倒)也就是
Tcomp >= Thold + Tclkdiff - Tskew
如果不考慮skew的影響的話,可得下式
Tcomp >= Thold + Tclkdiff
這里的Tclkdiff是指同一主時鍾邊沿下,后級與前級的觸發器上邊沿出現的時間差。Tskew是指時鍾沿抖動相對理想位置的偏移。這與csdn這個文章給出的穩定性結果比較相近。
參見ug902 p153的兩個解釋setup和hold的例子。
最后給出一道例子作為分享:
若fclk1 = 2MHz,fclk2 = 3MHz,而且兩時鍾同相,DFF的保持時間thd = 2ns,建立時間tsu=4ns,Q1的tco = 1ns,請問tcomp必須滿足什么條件才能保證電路正常工作?
這里根據上面推導出的等式:
Tcomp \(\le\) t_mindiff - tsetup - tco
= 1000ns/6 - 4ns - 1ns
= 161.667ns (S2)
Tcomp \(\ge\) thold + (0ns) - tco
= 2ns - 1ns
= 1ns (H1)
因而Tcomp應該滿足上述條件