對於FPGA而言,時序收斂是一個很重要的概念。在我看來,時序約束是必要的,但不是在最重要的,我們應該在設計初始就考慮到時序問題,而不是完全的靠約束來獲得一個好的結果。但我認為,對FPGA時序的分析能力是理解其運行機制的必要條件。之前也簡單看過這方面的內容,卻沒有很正確的認識。這兩天看了看UG612和相關內容,記錄在此,這應該有一系列文章,現已基本完成。
系列目錄
建立時間和保持時間(setup time 和 hold time)
OFFSET約束(OFFSET IN 和OFFSET OUT)
Clock Skew , Clock uncertainly 和 Period
1. FPGA時序的基本概念
FPGA器件的需求取決於系統和上下游(upstream and downstrem)設備。我們的設計需要和其他的devices進行數據的交互,其他的devices可能是FPGA外部的芯片,可能是FPGA內部的硬核。
對於FPGA design來說,必須要關注在指定要求下,它能否正常工作。這個正常工作包括同步時序電路的工作頻率,以及輸入輸出設備的時序要求。在FPGA design內部,都是同步時序電路,各處的延時等都能夠估計出來,但是FPGA內部並不知道外部的設備的時序關系。所以,Timing constraints包括
- 輸入路徑(Input paths )
- 寄存器-寄存器路徑(Register-to-register paths )
- 輸出路徑(Output paths )
- 例外(Path specific exceptions )
這正好對應了上圖中三個部分,Path specific exceptions 暫時不提。
Input paths對應的是OFFSET IN約束,即輸入數據和時鍾之間的相位關系。針對不同的數據輸入方式(系統同步和源同步,SDR和DDR)有不同的分析結果。
Register-to-register paths 對應的是整個FPGA design的工作時鍾。如果只有一個時鍾,那么只需要指定輸入的頻率即可。如果有多個時鍾,這些時鍾是通過DCM,MMCM,PLL生成的,那么顯然ISE知道這些時鍾之間的頻率、相位關系,所以也不需要我們指定。如果這些不同的時鍾是通過不同的引腳輸入的,ISE不知道其相位關系,所以指定其中一個為主時鍾,需要指定其間的相位關系。
Output paths對應的是OFFSET OUT 約束,和OFFSET IN約束很類似,不過方向相反。
2.輸入時序約束
The input timing constraints cover the data path from the external pin or pad of the package of the FPGA device to the internal synchronous element or register that captures that data.
輸入時序約束控制外部引腳到內部模塊的路徑。采用OFFSET IN來指出輸入時序約束。也就是說OFFSET IN定義了時鍾沿河被采集數據的關系(相位)。這里我們關心兩類不同的輸入方式,系統同步輸入和源同步輸入。(對於SDR和DDR,即單數據速率和雙數據速率而言,區別只在於一個時鍾周期的采樣次數,不做說明)
System Synchronous inputs
系統同步輸入,指由同一時鍾傳輸和捕獲數據,如下圖所示。
上圖可以看出,FPGA和輸入源設備是同源的,共用一個系統時鍾。這一個系統時鍾在源設備觸發輸出數據,同時還作為FPGA的時鍾接收輸入的數據。因此源設備只需要提供輸入的數據就可以了。
Source synchronous inputs
源同步如下圖所示(這里是DDR,同時在上升沿和下降沿采樣)
源同步和系統同步的最大區別在於源設備(Source Device)在輸出數據的同時,輸出了一路和數據同步的時鍾。FPGA采用這一路時鍾來進行數據的采樣。
這兩種輸入方式看起來有很大的差別,但是OFFSET IN約束的寫法是一致的,后文將詳細明。
3.寄存器-寄存器的時序約束
寄存器-寄存器的約束,在同步時序電路中,就是周期的約束。對於完全采用一個時鍾的電路而言,對這一個clk指定周期約束即可。但是如果采用了多個時鍾,那么情況就復雜了。多個時鍾中的“多個”,可能由DCM等倍/分頻得到,也有可能FPGA外部就引入了兩個時鍾信號,還有可能是其他情況。這里Xilinx將其分成了以下幾類
- 自動相關同步時鍾域
- 手動相關同步時鍾域
- 異步時鍾域
自動相關同步時鍾域(DLL,DCM,PLL,MMCM)
因為它是自動的,從字面意思上看就是自動分析。當我們例化了一個DCM,DCM的輸入輸出信號之間的關系就已近確定了,譬如頻率關系和相位關系。當指定了DCM輸入時鍾的頻率和相關信息之后,再去指定輸出的相對關系就有畫蛇添足的感覺了,因為這些關系以及在生成DCM的時候確定了。對於PLL,MMCM來說也是一樣的。
手動相關同步時鍾域
對應上文的“自動”,這里的“手動”指需要人為指定時鍾之間的關系。在什么情況下,ISE套件無法知道時鍾之間的關系?如果兩組時鍾都是由FPGA外部引入的,那么它們之間的相位關系是未知的,需要認為指定。時鍾之間的相位關系都是相對的,因此這個過程需要指定一個主時鍾,之后定義其他時鍾和主時鍾之間的相對相位關系。
NET “PrimaryClock” TNM_NET = “TNM_Primary”;
NET “RelatedClock” TNM_NET = “TNM_Related”;
TIMESPEC “TS_primary” = PERIOD “TNM_Primary” PeriodValue HIGH HighValue%;
TIMESPEC TS_related” = PERIOD “TNM_Related” TS_Primary_relation PHASE value;
異步時鍾域
xilinx無法分析,具體參考ug612。
4.輸出時序約束
輸出就是輸入的逆,因此分析的過程是類似的,分類也是類似的。針對時鍾的不同,有系統同步和源同步兩種。此處不再詳細說明。
系統同步SDR
源同步DDR(一般來說不給約束就可以)
5. 總結
時序收斂的目的是讓FPGA design 按預設的邏輯正常的工作。
為了使其正常工作,需要考慮至少三處:FPGA內部的寄存器-寄存器時序要求,FPGA輸入數據的時序要求,FPGA輸出信號的要求。
2、3、4節的介紹目的在於簡述可能遇到的不同情況,旨在說明約束實際上是告訴ISE套件通過設計本身的邏輯不能看出來的關系和要求。



![clipboard[1] clipboard[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvNjYzNzYwLzIwMTQwOC8yODIzMDYzODYyNjQ3MjMucG5n.png)
![clipboard[6] clipboard[6]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvNjYzNzYwLzIwMTQwOC8yODIzMDYzOTU2MzkzMzUucG5n.png)
![clipboard[7] clipboard[7]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvNjYzNzYwLzIwMTQwOC8yODIzMDY0MDI5ODkxNzkucG5n.png)