XDC約束技巧——I/O篇(上)
掃描二維碼
隨時隨地手機看文章
01
I/O約束的語法
XDC 中可以用于 I/O 約束的命令包括set_input_delay/set_output_delay 和set_max_delay/set_min_delay。其中,只有那些從 FPGA 管腳進入和/或輸出都不經(jīng)過任何時序元件的純組合邏輯路徑可以用set_max_delay/ set_min_delay 來約束,其余I/O時序路徑都必須由set_input_delay/ set_output_delay來約束。如果對 FPGA 的 I/O 不加任何 約束,Vivado 會缺省認(rèn)為時序要求為無窮大,不僅綜合和實現(xiàn)時不會考慮 I/O 時序,而且在時序分析時也不會報出這些未約束的路徑。
本文以下章節(jié)將會著重討論 XDC 接口約束和時序分析的基礎(chǔ),介紹如 何使用set_input_delay/set_output_delay 對 FPGA 的 I/O 時序進行約束。
Input約束
上圖所示 set_input_delay 的基本語法中,是想要設(shè)定 input 約束的端口名,可以是一個或數(shù)個 port;-clock 之后的指 明了對時序進行分析所用的時鐘,可以是一個FPGA 中真實存在的時鐘也可以是預(yù)先定義好的虛擬時鐘;-max之后的描 述了用于 setup 分析的包含有板級走線和外部器件的延時;-min之后的描述了用于hold分析的包含有板級走線和外部器件的延時。上述這些選項是定義 Input 約束時必須寫明的,還有少數(shù)幾個可選項,如-add_delay和-clock_fall用于DDR接口的約束。
Output
上圖所示set_output_delay的基本語法中,是想要設(shè)定output 約束的端口名,可以是一個或數(shù)個port;-clock之后的指明了對時序進行分析所用的時鐘,可以是一個 FPGA 中真實存在的時鐘也可以是預(yù)先定義好的虛擬時鐘;-max 之后的描述了用于 setup 分析的包含有板級走線和外部器件的延時;-min之后的描述了用于 hold 分析的包含有板級走線和外部器件的延時。上述這些選項是定義Output約束時必須寫明的,還有少數(shù)幾個可選項如-add_delay 和 -clock_fall用于DDR接口的約束。
02
Setup/Hold時序分析
我們知道約束是為了設(shè)計服務(wù),而設(shè)置好的約束必須在時序報告中加以驗證。所以,怎樣理解時序分析中 的檢查規(guī)則就成了重中之重,這一點對 I/O 約束來說尤為重要。理解時序分析工具如何選取路徑分析的發(fā)送端 (Launch)和接收端(Capture)時鐘沿(Clock Edges),在Setup和Hold 分析時又有怎樣的具體區(qū)別,以及這些數(shù)字在時序報告中如何體現(xiàn)等等是設(shè)置正確I/O 約束的基礎(chǔ)。更具體的時序分析方法以及如何深入解讀時序報告等內(nèi)容將會在后續(xù)另開主題文章詳述,這里僅就Setup/Hold分析時對時鐘邊沿的選擇加以描述,便于以下章節(jié)的展開。
Setup時序分析
同步電路設(shè)計中,一般情況下,數(shù)據(jù)在時鐘上升沿發(fā)送,在下一個時鐘上升沿接收,發(fā)送的時鐘沿稱作Launch Edge,接收沿稱作Capture Edge。時序分析中的 Setup Check跟Capture Edge 的選擇息息相關(guān)。
在 SDR 接口的 setup 分析中,工具如下圖這樣識別發(fā)送和接收時鐘沿。

而在DDR接口的setup分析中,因為數(shù)據(jù)是雙沿采樣,所以發(fā)送和接收時鐘沿變成上升(下降)沿發(fā)送,下降(上升)沿接收。
Hold時序分析

Hold Check主要是為了保證數(shù)據(jù)在接收(采樣)端時鐘沿之后還能穩(wěn)定保持一段時間,對Hold分析而言,同一個時鐘沿既是Launch Edge也是 Capture Edge,這一點對SDR和 DDR(不論是中心對齊還是邊沿對齊)都一樣。
03
Input接口類型和約束
由于歷史的原因,相當(dāng)一部分FPGA設(shè)計仍然在系統(tǒng)中起到膠合邏輯(Glue Logic)的作用,當(dāng)然,如今的FPGA中嵌入了高速串行收發(fā)器和嵌入式處理器等,早就不僅僅局限于系統(tǒng)設(shè)計的配角,反而成為了其中的主角甚至是明星。但數(shù)據(jù)接口的同步一直是FPGA設(shè)計中的常見問題,也是一個重點和難點,很多設(shè)計不穩(wěn)定都是因為數(shù)據(jù)接口的同步有問題。
FPGA 的數(shù)據(jù)接口同步根據(jù)系統(tǒng)級設(shè)計方式來講可以分為系統(tǒng)同步和源同步兩種。
系統(tǒng)同步接口
系統(tǒng)同步接口(System Synchronous Interface)的構(gòu)建相對容易,以 FPGA 做接收側(cè)來舉例,上游器件 僅僅傳遞數(shù)據(jù)信號到 FPGA 中,時鐘信號則完全依靠系統(tǒng)板級來同步。時鐘信號在系統(tǒng)級上同源,板級走線的 延時也要對齊。正因為這樣的設(shè)計,決定了數(shù)據(jù)傳遞的性能受到時鐘在系統(tǒng)級的走線延時和 skew 以及數(shù)據(jù)路 徑延時的雙重限制,無法達(dá)到更高速的設(shè)計要求,所以大部分情況也僅僅應(yīng)用 SDR 方式。

對系統(tǒng)同步接口做Input約束相對容易,只需要考慮上游器件的 Tcko 和數(shù)據(jù)在板級的延時即可。下圖是一個SDR上升沿采樣系統(tǒng)同步接口的Input約束示例。
固定布局
工具條上設(shè)置固定寬高
背景可以設(shè)置被包含
可以完美對齊背景圖和文字
以及制作自己的模板
設(shè)置和分析I/O約束一定要有個系統(tǒng)級思考的視角,如上右圖所示,Launch Edge對應(yīng)的是上游器件的時 鐘,而 Capture Edge 則對應(yīng) FPGA 的輸入時鐘,正因為是系統(tǒng)同步時鐘,所以可以將其視作完全同步而放在 一張圖上分析,這樣一來,就可以用一般時序分析方法來看待問題。
一條完整的時序路徑,從源觸發(fā)器的 C 端開始,經(jīng)過 Tcko 和路徑傳輸延時再到目的觸發(fā)器的 D 端結(jié)束。放在系統(tǒng)同步的接口時序上,傳輸延時則變成板級傳輸延時(還要考慮 skew),所以上述 -max 后的數(shù)值是 Tcko 的最大值加上板級延時的最大值而來,而-min 后的數(shù)值則是由兩個最小值相加而來。
源同步接口
為了改進系統(tǒng)同步接口中時鐘頻率受限的弊端,一種針對高速I/O的同步時序接口應(yīng)運而生,在發(fā)送端將 數(shù)據(jù)和時鐘同步傳輸,在接收端用時鐘沿脈沖來對數(shù)據(jù)進行鎖存,重新使數(shù)據(jù)與時鐘同步,這種電路就是源同步接口電路(Source Synchronous Interface)。
源同步接口最大的優(yōu)點就是大大提升了總線的速度,在理論上信號的傳送可以不受傳輸延遲的影響,所以源同步接口也經(jīng)常應(yīng)用DDR方式,在相同時鐘頻率下提供雙倍于SDR接口的數(shù)據(jù)帶寬。
源同步接口的約束設(shè)置相對復(fù)雜,一則是因為有SDR、DDR、中心對齊(Center Aligned)和邊沿對齊(Edge Aligned)等多種方式,二則可以根據(jù)客觀已知條件,選用與系統(tǒng)同步接口類似的系統(tǒng)級視角的方式,或是用源同步視角的方式來設(shè)置約束。
如上圖所示,對源同步接口進行Input約束可以根據(jù)不同的已知條件,選用不同的約束方式。一般而言,F(xiàn)PGA作為輸入接口時,數(shù)據(jù)有效窗口是已知條件,所以方法2 更常見Vivado IDE的Language Templates 中關(guān)于源同步輸入接口XDC模板也是基于這種方法。但不論以何種方式來設(shè)置Input約束,作用是一樣,時序報告的結(jié)果也應(yīng)該是一致的。
針對上圖所示中心對齊源同步 SDR 接口時序,分別按照兩種方式來約束,需要的已知條件和計算方式雖 然不同,但卻可以得到完全一樣的結(jié)果。

DDR接口的約束設(shè)置
DDR 源同步接口的約束稍許復(fù)雜,需要將上升沿和下降沿分別考慮和約束,以下以源同步接口為例,分別就輸入接口數(shù)據(jù)為中心對齊或邊沿對齊的方式來舉例。
固定布局
工具條上設(shè)置固定寬高
背景可以設(shè)置被包含
可以完美對齊背景圖和文字
以及制作自己的模板
DDR 源同步中心對齊輸入接口

已知條件
1、時鐘信號src_sync_ddr_clk的頻率: 100 MHz;
2、數(shù)據(jù)總線:
src_sync_ddr_din[3:0]
3、上升沿之前的數(shù)據(jù)skew(skew_bre) :0.6 ns;
4、上升沿之后的數(shù)據(jù)skew (skew_are) :0.4 ns;
5、下降沿之前的數(shù)據(jù)skew (skew_bfe) :0.3 ns;
6、下降沿之后的數(shù)據(jù)skew (skew_afe) :0.7 ns。
可以這樣計算輸入接口約束:因為已知條件是數(shù)據(jù)相對于時鐘上升沿和下降沿的skew,所以可以分別獨 立計算;上升沿的 -max是上升沿之后的數(shù)據(jù)skew (skew_are),對應(yīng)的-min就應(yīng)該是負(fù)的上升沿之前的數(shù) 據(jù)skew(skew_bre);下降沿的 -max是下降沿之后的數(shù)據(jù) skew (skew_afe),對應(yīng)的-min就應(yīng)該是負(fù)的下 降沿之前的數(shù)據(jù)skew (skew_bfe )。
所以最終寫入 XDC 的 Input 約束應(yīng)該如下所示:
固定布局
工具條上設(shè)置固定寬高
背景可以設(shè)置被包含
可以完美對齊背景圖和文字
以及制作自己的模板
出現(xiàn)負(fù)值并不代表延時真的為負(fù),而是跟數(shù)據(jù)相對于時鐘沿的方向有關(guān)。請一定牢記set_input_delay中-max/-min的定義,即時鐘采樣沿到達(dá)之后最大與最小的數(shù)據(jù)有效窗口(set_output_delay中-max/-min的定 義與之正好相反,詳見后續(xù)章節(jié)舉例說明)。
在這個例子中,數(shù)據(jù)是邊沿對齊,只要有jitter跟skew的存在,最差情況下,數(shù)據(jù)有效窗口在到達(dá)時鐘采樣沿之前就已經(jīng)結(jié)束,所以會有負(fù)數(shù)出現(xiàn)在-min之后。因此,在實際應(yīng)用中,F(xiàn)PGA用作輸入的邊沿對齊 DDR源同步接口的情況下,真正用來采樣數(shù)據(jù)的時鐘會經(jīng)過一個MMCM/PLL做一定的相移,從而把邊沿對齊Vivado使用誤區(qū)與進階 變成中心對齊。
另外,在經(jīng)過MMCM/PLL 相移后的采樣時鐘跟同步接口輸入的時鐘之間需要做set_false_path的約束(如下述例子)而把那些偽路徑從時序報告中剔除,這里不再詳述。
虛擬時鐘
在FPGA做系統(tǒng)同步輸入接口的情況下,很多時候上游器件送入的數(shù)據(jù)并不是跟某個 FPGA中已經(jīng)存在 的真實的時鐘相關(guān),而是來自于一個不同的時鐘,這時就要用到虛擬時鐘(Virtual Clock)。
舉例來說,上游器件用一個100MHz的時鐘送出數(shù)據(jù)到FPGA,實際上這個數(shù)據(jù)每兩個時鐘周期才變化一 次,所以可以用50MHz的時鐘來采樣。FPGA有個100MHz的輸入時鐘,經(jīng)過MMCM產(chǎn)生一個50MHz的衍生時鐘,并用其來采樣上游器件送來的同步數(shù)據(jù)。當(dāng)然,系統(tǒng)級的設(shè)計上,必須有一定的機制來保證上游器件中的發(fā)送時鐘和FPGA 中的接收時鐘的時鐘沿對齊。
此時,我們可以借助虛擬時鐘的幫助來完成相應(yīng)的Input接口約束。

篇幅所限,對XDC中I/O約束的設(shè)計思路、分析方法以及如何具體設(shè)置Input接口約束的討論就到這里,下一篇我們接著分析如何設(shè)置Output接口約束,看看Vivado中有什么方式可以幫助用戶準(zhǔn)確便捷地定義接口時序約束。





