一、存在背景分析
文檔的說法是,set_input_delay和set_output_delay描述的是數據在端口處與某時鍾的時序關系。這樣的說法是很表面的。input/output其實是模擬數據在端口外的延時,實際上這是端口的一個外部約束條件,目的是為了約束FPGA輸入端口到內部寄存器數據輸入端或者內部寄存器輸出端到FPGA輸出端口之間允許的延時(因為這中間可能有組合邏輯),理解這一點非常重要。
既然模擬的是數據在外部的情況,那么弄清楚這個延時是相對於哪個時鍾而言的就很重要(這里也是泛泛而談,后面有詳細一點的分析)。很顯然,這里的對象時鍾是虛擬時鍾virtual clock。
對於任何一種情況,有一點必須要保證:必須保證接收端能接收到數據。在推導過程中,這一條是隱含的前提。
二、set_input_delay的推導
對於set_input_delay,虛擬時鍾是Launch,為保證FPGA能采樣到數據,對源寄存器與目的寄存器之間的路徑延時是有限制的。假如延時太大,FPGA端的建立時間可能不滿足;延時太小,FPGA端的保持時間可能不滿足。因此,計算max時考慮的是建立時間的情況,計算min時考慮的是保持時間的情況。
考慮保持時間時,可得如下關系:
Launch + Tco_ext + Td_ext + Td_in + uTsu = Latch
假如Td_in為Td_in_max,如果時鍾周期不變,外界最糟糕的情況是,(Tco_ext + Td_ext)的值也為最大。SDC對輸入時max的定義如下:
set_input_delay –max {Tco_ext + Td_max}
實際上這並不是FPGA內部的延時,這只是FPGA內部延時的相關量,因為很明顯內部的延時是Td_in。為什么不直接使用內部延時呢?因為那樣的話涉及到的變量太多,而這兩個參數,在板卡和板卡環境確定之后,幾乎是不會變化的。這個相關量的意義是,Td_in想往上增大是要受到這個相關量的約束的。
考慮建立時間時,可得:
Launch + Tco_ext + Td_in + Td_ext + Tsrc = Latch + uThd
假如Td_in為Td_in_min,外界最糟糕的情況是(Tco_ext + Td_ext)的值也為最小。SDC對輸入是min的定義如下:
set_input_delay –min {Tco_ext + Td_min}
當然這也是相對量。
有一點應該說明,-max和-min不會同時達到極限值,因為Td不會同時既為max又為min。因此,假如su或者hd有一個時序不收斂,內部的路徑延時是有調整空間的。
三、set_output_delay的推導
對於set_output_delay,虛擬時鍾是Latch。
考慮外部寄存器的建立時間,可得:
Launch + uTco + Td_in + Td_ext + Tsu_ext = Latch
假如Td_in為Td_in_max,最糟糕的情況是(Td_ext + Tsu_ext)也為最大。SDC對輸出時max的定義如下:
set_output_delay –max {Td_max + Tsu_ext}
考慮外部寄存器的保持時間,可得:
Launch + uTco + Td_in + Td_ext + Tsrc = Latch + Thd_ext
假如Td_in為Td_in_min,最糟糕的情況是Td_ext亦為最小。SDC對輸出是min的定義如下:
set_output_delay –min {-Thd_ext + Td_ext_min}
至於為什么不寫成(Thd_ext – Td_ext_min),是為了計算時與max一致。在驗證建立時間是否滿足時,在Latch確定了的情況下,需要Latch減去max得到Data Required Time。在驗證保持時間時,為了計算一致,希望也用Latch減去min來得到Data Required Time,而這時Required的計算應寫為
Latch + Thd_ext – Td_ext_min
變換一下可得
Latch – (-Thd_ext + Td_ext_min)
min就是這樣得來的。