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 越是落後,餘量就越大。
至於移除時間餘量的計算方法和保持時間的一樣,只是移除時間針對的是暫存器的復位埠。