3. 時序概念

發現對於時序基礎的介紹這一塊,Intel 的文件竟然要比 Xilinx 的詳細,因此引用了很多 Intel 的文件內容。

3.1 術語

  • 傳送沿(launch edge),指用來發送資料的源時鐘的活動邊緣。

  • 取樣沿(capture edge),Intel 的文件中稱作 latch edge。指的是對資料進行取樣的目的時鐘的活動邊沿。

  • 源時鐘(source clock),用來發送資料時鐘。

  • 目的時鐘(destination clock),用來對資料進行取樣的時鐘。

  • 建立時間要求(setup requirement),是傳送沿和取樣沿之間的關係,它定義了最嚴格的建立時間約束。

  • 建立時間關係(setup relationship),是指對建立時間進行檢查。

  • 保持時間要求(hold requirement),是傳送沿和取樣沿之間的關係,它定義了最嚴格的保持時間約束。

  • 保持時間關係(hold relationship),是指保持時間進行檢查。

3.2 時序路徑

時序路徑的形態:

  • 從輸入埠到內部時序單元的路徑。如圖中 DINREGA 的路徑。
  • 從時序單元到時序單元的內部路徑。如圖中 REGAREGB 的路徑。
  • 從內部時序單元到輸出埠的路徑。如圖中 REGBDOUT 的路徑。
  • 從輸入埠到輸出埠的路徑。如圖中 In-2-Out Data Path

時序路徑分段:

  • 源時鐘路徑(Source Clock Path)。

    是指從時鐘源點(通常是一個輸入埠)到時序單元的時鐘管腳所經過的路徑。對於從輸入埠開始的時序路徑,沒有源時鐘路徑。

  • 資料路徑(Data Path)。

    指資料傳播的路徑。從時序單元的時鐘引腳或資料輸入埠開始,到時序單元的資料輸入引腳或一個數據輸出埠結束。

  • 目的時鐘路徑(Destination Clock Path)。

    是指從目的時鐘源點(通常是一個輸入埠)到取樣時序單元的時鐘管腳所經過的路徑。對於終點為輸出埠的時序路徑,沒有相應的目的時鐘路徑。

3.3 建立時間和保持時間

每個 FPGA 內部的暫存器都有兩個固有的特性引數,建立時間和保持時間,其時間的長短是由器件本身決定的。

  • 建立時間(Setup):在時鐘沿之前,資料需要提前保持穩定的時間。如圖中 Tsu 這一段時間內,資料 D 必須保持穩定不變。
  • 保持時間(Hold):在時鐘沿之後,資料需要繼續保持穩定的時間。如圖中 Th 這一段時間內,資料 D 必須保持穩定不變。

這兩個時間是保證資料能夠被正常取樣的前提,如果不滿足這兩個時間要求,暫存器就可能會出現亞穩態,輸出資料 Q 的值將不再是 D 上的輸入值 ,而會是隨機值。

暫存器還有另一個特性引數 Tco,指的是從時鐘沿到達時鐘引腳開始,到對資料 D 取樣,直到輸出至 Q 的延時。

Recovery 與 Setup 類似,Remove 與 Hold 類似,只是這兩個引數針對的是暫存器的復位引腳,而不是資料輸入引腳 D。

3.4 靜態時序分析(Static Timing Analysis)

靜態時序分析一般可分為兩類:

  • 最大延遲分析(Max Delay Analysis),包括 Setup 和 Recovery 分析。
  • 最小延遲分析(Min Delay Analysis),包括 Hold 和 Remove 分析。

3.3.1 Setup/Recovery 時間檢查

建立時間檢查是為了確保在最悲觀的場景下,仍然可以對資料安全的進行取樣。

以兩個暫存器 REGA 和 REGB 為例。兩者由同一個時鐘 clk 驅動。clk 經過源時鐘路徑 Tclk1 和目的時鐘路徑 Tclk2 延遲後,分別到達 REGA 和 REGB 的時鐘引腳。如要滿足 REGB 的建立時間 Tsu 的要求(REGB.D 在 REGB.clk 的取樣沿之前的 Tsu 時刻之前就保持穩定不變)。語言可能不好理解,我們用公式來表達。

REGB.clk 的取樣沿之前的 Tsu 時刻,我們把它稱作 Data_Required_Time。依照下圖,我們可以很容易得到:

\[Data\_Required\_Time = Capture\_Edge + T_{clk2} - T_{su}
\]

也就是說,REGA.Q 在經過 Tdata 延遲之後到達 REGB.D 的時刻在 Data_Required_Time 之前就即可滿足建立時間要求。這個時刻也可以用公式來表式,我們稱作它為 Data_Arrival_Time

\[Data\_Arrival\_Time = Launch\_Edge + T_{clk1} + T_{co} + T_{data}
\]

將上述兩個值相減,即可以得到建立時間的餘量 Setup_Slack(下圖中綠色部分)。

\[Setup\_Slack = Data\_Required\_Time\ –\ Data\_Arrival\_Time
\]

當建立時間的餘量為正數時,即表示滿足建立時間要求。當為負數時,即不符合建立時間要求。

上圖中需要理解的是,一般情況下,對於同一時鐘,每個時鐘沿既是傳送沿也是取樣沿。

上述公式都是在時鐘完全理想的情況下推導的,但實際硬體上是不存在理想時鐘的,因此要讓程式碼在硬體上正常工作,還需要把時鐘的不確定性(Clock Uncertainty)新增上。Clock Uncertainty 是指任何一對時鐘邊緣之間可能的時間變化之和。不確定性包括時鐘抖動(Clock Jitter),某些硬體原語引入的相位誤差,以及使用者在約束(set_clock_uncertainty)中指定的時鐘不確定性。對上計算公式修改後:

\[Data\_Required\_Time = Capture\_Edge + T_{clk2} - T_{su} - Clock\_Uncertainty
\]

對於源時鐘和目的時鐘不是同一時鐘時,建立時間檢查只在兩個時鐘之間最悲觀的建立時間關係上執行。例如下圖,源時鐘和目的時鐘是不同頻的,為 2:3 的關係,週期的最小公倍數為 12ns。在這 12ns 內有兩個建立時間關係,Setup(1) 和 Setup(2)。Setup(1) 為 4ns,Setup(2) 為 2ns,所以使用 Setup(2) 做分析檢查。

至於恢復時間餘量的計算方法和建立時間的一樣,只是恢復時間針對的是暫存器的復位埠。

3.3.2 Hold/Removal 時間檢查

保持時間檢查,是為了滿足器件的保持時間特性。即在取樣沿之後,資料仍要保持一段 Th 時間。如下圖中,REGB.D 的新資料的到達時間要比取樣沿至少落後 Th 才能保證滿足保持時間特性。綠色部分是多出來的保持時間餘量。

同樣,把新資料要求到達的時間用公式表示如下,新資料實際到達時間只能比這個時間晚。

\[Data\_Required\_Time = Capture\_Edge + T_{clk2} + T_h + Clock\_Uncertainty
\]

新資料實際到達時間用公式表示如下:

\[Data\_Arrival\_Time = Launch\_Edge + T_{clk1} + T_{co} + T_{data}
\]

將上述兩個值相減,即可以得到建立時間的餘量 Hold_Slack(下圖中綠色部分)。

\[Hold\_Slack = Data\_Arrival\_Time - Data\_Required\_Time
\]

保持時間檢查是基於建立時間檢查的,對於每一個建立時間檢查都有兩個對應的保持時間檢查:

  1. 第一 hold 檢查確保 Launch Edge 打出的資料不會被 Capture Edge 前一個沿採集到。(下圖中的H1a 和 H2a)
  2. 第二 hold 檢查確保由下一個 Launch Edge 打出資料不會被當前 Capture Edge 採集到。(下圖中的H1b 和 H2b)

在保持時間檢查期間,時序引擎只報告兩個時鐘之間最差的保持關係。最差的保持關係並不總是與最差的建立關係聯絡在一起。時序引擎會檢查所有可能的建立關係及其對應的保持關係,以確定最差的保持關係。

上圖中,有兩種 Setup 關係(S1 和 S2),每種 Setup 對應兩種 Hold 關係(H1b 和 H2a 為兩個 Setup 關係共有)。

  • S1 對應兩個 Hold 關係為 H1a(0ns)和 H1b(-2ns)。
  • S2 對應兩個 Hold 關係為 H2a(-2ns)和 H2b(-4ns)。

上述括號中的值是 Launch Edge 減去 Capture Edge 得到的,時序引擎在做時序分析的時候會選擇 H1a 進行分析,而不是 H2b。因為 Launch Edge 比 Capture Edge 越是落後,餘量就越大。

至於移除時間餘量的計算方法和保持時間的一樣,只是移除時間針對的是暫存器的復位埠。