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 時序路徑
時序路徑的形態:
- 從輸入端口到內部時序單元的路徑。如圖中
DIN到REGA的路徑。 - 從時序單元到時序單元的內部路徑。如圖中
REGA到REGB的路徑。 - 從內部時序單元到輸出端口的路徑。如圖中
REGB到DOUT的路徑。 - 從輸入端口到輸出端口的路徑。如圖中
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。依照下圖,我們可以很容易得到:
也就是說,REGA.Q 在經過 Tdata 延遲之后到達 REGB.D 的時刻在 Data_Required_Time 之前就即可滿足建立時間要求。這個時刻也可以用公式來表式,我們稱作它為 Data_Arrival_Time。
將上述兩個值相減,即可以得到建立時間的余量 Setup_Slack(下圖中綠色部分)。
當建立時間的余量為正數時,即表示滿足建立時間要求。當為負數時,即不符合建立時間要求。

上圖中需要理解的是,一般情況下,對於同一時鍾,每個時鍾沿既是發送沿也是采樣沿。
上述公式都是在時鍾完全理想的情況下推導的,但實際硬件上是不存在理想時鍾的,因此要讓代碼在硬件上正常工作,還需要把時鍾的不確定性(Clock Uncertainty)添加上。Clock Uncertainty 是指任何一對時鍾邊緣之間可能的時間變化之和。不確定性包括時鍾抖動(Clock Jitter),某些硬件原語引入的相位誤差,以及用戶在約束(set_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 才能保證滿足保持時間特性。綠色部分是多出來的保持時間余量。

同樣,把新數據要求到達的時間用公式表示如下,新數據實際到達時間只能比這個時間晚。
新數據實際到達時間用公式表示如下:
將上述兩個值相減,即可以得到建立時間的余量 Hold_Slack(下圖中綠色部分)。
保持時間檢查是基於建立時間檢查的,對於每一個建立時間檢查都有兩個對應的保持時間檢查:
- 第一 hold 檢查確保 Launch Edge 打出的數據不會被 Capture Edge 前一個沿采集到。(下圖中的H1a 和 H2a)
- 第二 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 越是落后,余量就越大。
至於移除時間余量的計算方法和保持時間的一樣,只是移除時間針對的是寄存器的復位端口。
