1. 程式人生 > >vivado xdc約束基礎知識10:Vivado使用誤區與進階——XDC約束技巧之I/O篇 (上)

vivado xdc約束基礎知識10:Vivado使用誤區與進階——XDC約束技巧之I/O篇 (上)

Vivado使用誤區與進階——XDC約束技巧之I/O篇 (上)

《XDC約束技巧之時鐘篇》中曾對I/O約束做過簡要概括,相比較而言,XDC中的I/O約束雖然形式簡單,但整體思路和約束方法卻與UCF大相徑庭。加之FPGA的應用特性決定了其在介面上有多種構建和實現方式,所以從UCF到XDC的轉換過程中,最具挑戰的可以說便是本文將要討論的I/O約束了。

I/O 約束的語法
XDC 中可以用於 I/O 約束的命令包括 set_input_delay / set_output_delay 和set_max_delay / set_min_delay 。其中,只有那些從 FPGA 管腳進入和/或輸出都不經過任何時序元件的純組合邏輯路徑可以用 set_max_delay / set_min_delay 來約束,其餘 I/O 時序路徑都必須由set_input_delay / set_output_delay 來約束。如果對 FPGA 的 I/O 不加任何約束,Vivado 會預設認為時序要求為無窮大,不僅綜合和實現時不會考慮 I/O 時序,而且在時序分析時也不會報出這些未約束的路徑。

本文以下章節將會著重討論 XDC 介面約束和時序分析的基礎,介紹如何使用set_input_delay / set_output_delay 對 FPGA 的 I/O 時序進行約束。

Input 約束

上圖所示 set_input_delay 的基本語法中, 是想要設定 input 約束的埠名,可以是一個或數個 port;-clock 之後的 指明瞭對 時序進行分析所用的時鐘,可以是一個 FPGA 中真實存在的時鐘也可以是預先定義好的虛擬時鐘;-max 之後的 描述了用於 setup 分析的包含有板級走線和外部器件的延時;-min 之後的 描述了用於 hold 分析的包含有板級走線和外部器件的延時。

上述這些選項是定義 Input 約束時必須寫明的,還有少數幾個可選項,如 -add_delay和 -clock_fall 用於 DDR 介面的約束。

Output 約束

上圖所示 set_output_delay 的基本語法中, 是想要設定 output 約束的埠名,可以是一個或數個 port;-clock 之後的 指明瞭對 時序進行分析所用的時鐘,可以是一個 FPGA 中真實存在的時鐘也可以是預先定義好的虛擬時鐘;-max 之後的 描述了用於 setup 分析的包含有板級走線和外部器件的延時;-min之後的 描述了用於 hold 分析的包含有板級走線和外部器件的延時。

上述這些選項是定義 Output 約束時必須寫明的,還有少數幾個可選項如 -add_delay和 -clock_fall 用於 DDR 介面的約束。

Setup/Hold 時序分析


我們知道約束是為了設計服務,而設定好的約束必須在時序報告中加以驗證。所以,怎樣理解時序分析中的檢查規則就成了重中之重,這一點對 I/O 約束來說尤為重要。理解時序分析工具如何選取路徑分析的傳送端(Launch)和接收端(Capture)時鐘沿(Clock Edges),在 Setup 和 Hold 分析時又有怎樣的具體區別,以及這些數字在時序報告中如何體現等等是設定正確 I/O 約束的基礎。

更具體的時序分析方法以及如何深入解讀時序報告等內容將會在後續另開主題文章詳述,這裡僅就 Setup/Hold 分析時對時鐘邊沿的選擇加以描述,便於以下章節的展開。

Setup 時序分析
同步電路設計中,一般情況下,資料在時鐘上升沿傳送,在下一個時鐘上升沿接收,傳送的時鐘沿稱作 Launch Edge,接收沿稱作 Capture Edge。時序分析中的 Setup Check 跟Capture Edge 的選擇息息相關。

在 SDR 介面的 setup 分析中,工具如下圖這樣識別傳送和接收時鐘沿。

而在 DDR 介面的 setup 分析中,因為資料是雙沿取樣,所以傳送和接收時鐘沿變成上升(下降)沿傳送,下降(上升)沿接收。

Hold 時序分析

Hold Check 主要是為了保證資料在接收(取樣)端時鐘沿之後還能穩定保持一段時間,對 Hold 分析而言,同一個時鐘沿既是 Launch Edge 也是 Capture Edge,這一點對 SDR和 DDR(不論是中心對齊還是邊沿對齊)都一樣。

Input 介面型別和約束
由於歷史的原因,相當一部分 FPGA 設計仍然在系統中起到膠合邏輯(Glue Logic)的作用,當然,如今的 FPGA 中嵌入了高速序列收發器和嵌入式處理器等,早就不僅僅侷限於系統設計的配角,反而成為了其中的主角甚至是明星。但資料介面的同步一直是FPGA 設計中的常見問題,也是一個重點和難點,很多設計不穩定都是因為資料介面的同步有問題。

FPGA 的資料介面同步根據系統級設計方式來講可以分為系統同步和源同步兩種。

系統同步介面
系統同步介面(System Synchronous Interface)的構建相對容易,以 FPGA 做接收側來舉例,上游器件僅僅傳遞資料訊號到 FPGA 中,時鐘訊號則完全依靠系統板級來同步。時鐘訊號在系統級上同源,板級走線的延時也要對齊。正因為這樣的設計,決定了資料傳遞的效能受到時鐘在系統級的走線延時和 skew 以及資料路徑延時的雙重限制,無法達到更高速的設計要求,所以大部分情況也僅僅應用 SDR 方式。

對系統同步介面做 Input 約束相對容易,只需要考慮上游器件的 Tcko 和資料在板級的延時即可。下圖是一個 SDR 上升沿取樣系統同步介面的 Input 約束示例。

設定和分析 I/O 約束一定要有個系統級思考的視角,如上右圖所示,Launch Edge 對應的是上游器件的時鐘,而 Capture Edge 則對應 FPGA 的輸入時鐘,正因為是系統同步時鐘,所以可以將其視作完全同步而放在一張圖上分析,這樣一來,就可以用一般時序分析方法來看待問題。

一條完整的時序路徑,從源觸發器的 C 端開始,經過 Tcko 和路徑傳輸延時再到目的觸發器的 D 端結束。放在系統同步的介面時序上,傳輸延時則變成板級傳輸延時(還要考慮 skew),所以上述 -max 後的數值是 Tcko 的最大值加上板級延時的最大值而來,而-min後的數值則是由兩個最小值相加而來。

源同步介面
為了改進系統同步介面中時鐘頻率受限的弊端,一種針對高速 I/O 的同步時序介面應運而生,在傳送端將資料和時鐘同步傳輸,在接收端用時鐘沿脈衝來對資料進行鎖存,重新使資料與時鐘同步,這種電路就是源同步介面電路(Source Synchronous Interface)。

源同步介面最大的優點就是大大提升了匯流排的速度,在理論上訊號的傳送可以不受傳輸延遲的影響,所以源同步介面也經常應用 DDR 方式,在相同時鐘頻率下提供雙倍於SDR 介面的資料頻寬。

源同步介面的約束設定相對複雜,一則是因為有 SDR、DDR、中心對齊(Center Aligned)和邊沿對齊(Edge Aligned)等多種方式,二則可以根據客觀已知條件,選用與系統同步介面類似的系統級視角的方式,或是用源同步視角的方式來設定約束。

如上圖所示,對源同步介面進行 Input 約束可以根據不同的已知條件,選用不同的約束方式。一般而言,FPGA 作為輸入介面時,資料有效視窗是已知條件,所以方法 2 更常見,Vivado IDE 的 Language Templates 中關於源同步輸入介面 XDC 模板也是基於這種方法。但不論以何種方式來設定 Input 約束,作用是一樣,時序報告的結果也應該是一致的。

針對上圖所示中心對齊源同步 SDR 介面時序,分別按照兩種方式來約束,需要的已知條件和計算方式雖然不同,但卻可以得到完全一樣的結果。

DDR 介面的約束設定
DDR 源同步介面的約束稍許複雜,需要將上升沿和下降沿分別考慮和約束,以下以源同步介面為例,分別就輸入介面資料為中心對齊或邊沿對齊的方式來舉例。

DDR 源同步中心對齊輸入介面

已知條件如下:

時鐘訊號 src_sync_ddr_clk 的頻率: 100 MHz資料匯流排: src_sync_ddr_din[3:0]上升沿之前的資料有效視窗 ( dv_bre ) : 0.4 ns上升沿之後的資料有效視窗 ( dv_are ) : 0.6 ns下降沿之前的資料有效視窗 ( dv_bfe ) : 0.7 ns下降沿之後的資料有效視窗 ( dv_afe ) : 0.2 ns

可以這樣計算輸入介面約束:DDR 方式下資料實際的取樣週期是時鐘週期的一半;上升沿取樣的資料(Rise Data)的 -max 應該是取樣週期減去這個資料的傳送沿(下降沿)之前的資料有效視窗值 dv_bfe,而對應的-min 就應該是上升沿之後的資料有效視窗值dv_are ;同理,下降沿取樣的資料(Fall Data)的 -max 應該是取樣週期減去這個資料的傳送沿(上升沿)之前的資料有效視窗值 dv_bre,而對應的-min 就應該是下降沿之後的資料有效視窗值 dv_afe 。

所以最終寫入 XDC 的 Input 約束應該如下所示:

DDR 源同步邊沿對齊輸入介面

已知條件如下:

時鐘訊號 src_sync_ddr_clk 的頻率: 100 MHz資料匯流排: src_sync_ddr_din[3:0]上升沿之前的資料 skew (skew_bre ) : 0.6 ns上升沿之後的資料 skew (skew_are ) : 0.4 ns下降沿之前的資料 skew (skew_bfe ) : 0.3 ns下降沿之後的資料 skew (skew_afe ) : 0.7 ns

可以這樣計算輸入介面約束:因為已知條件是資料相對於時鐘上升沿和下降沿的skew,所以可以分別獨立計算;上升沿的 -max 是上升沿之後的資料 skew (skew_are ),對應的-min 就應該是負的上升沿之前的資料 skew (skew_bre );下降沿的 -max 是下降沿之後的資料 skew (skew_afe ),對應的-min 就應該是負的下降沿之前的資料 skew (skew_bfe )。

所以最終寫入 XDC 的 Input 約束應該如下所示:

出現負值並不代表延時真的為負,而是跟資料相對於時鐘沿的方向有關。請一定牢記 set_input_delay 中 -max/-min 的定義,即時鐘取樣沿到達之後最大與最小的資料有效視窗(set_output_delay 中 -max/-min 的定義與之正好相反,詳見後續章節舉例說明)。

在這個例子中,資料是邊沿對齊,只要有 jitter 跟 skew 的存在,最差情況下,資料有效視窗在到達時鐘取樣沿之前就已經結束,所以會有負數出現在-min 之後。因此,在實際應用中,FPGA 用作輸入的邊沿對齊 DDR 源同步介面的情況下,真正用來取樣資料的時鐘會經過一個MMCM/PLL 做一定的相移,從而把邊沿對齊變成中心對齊。

另外,在經過 MMCM/PLL 相移後的取樣時鐘跟同步介面輸入的時鐘之間需要做set_false_path 的約束(如下述例子)而把那些偽路徑從時序報告中剔除,這裡不再詳述。

虛擬時鐘
在 FPGA 做系統同步輸入介面的情況下,很多時候上游器件送入的資料並不是跟某個 FPGA 中已經存在的真實的時鐘相關,而是來自於一個不同的時鐘,這時就要用到虛擬時鐘(Virtual Clock)。

舉例來說,上游器件用一個 100MHz 的時鐘送出資料到 FPGA,實際上這個資料每兩個時鐘週期才變化一次,所以可以用 50MHz 的時鐘來取樣。FPGA 有個 100MHz 的輸入時鐘,經過 MMCM 產生一個 50MHz 的衍生時鐘,並用其來取樣上游器件送來的同步資料。

當然,系統級的設計上,必須有一定的機制來保證上游器件中的傳送時鐘和 FPGA 中的接收時鐘的時鐘沿對齊。

此時,我們可以藉助虛擬時鐘的幫助來完成相應的 Input 介面約束。

篇幅所限,對 XDC 中 I/O 約束的設計思路、分析方法以及如何具體設定 Input 介面約束的討論就到這裡,下一篇我們接著分析如何設定 Output 介面約束,看看 Vivado 中有什麼方式可以幫助使用者準確便捷地定義介面時序約束。