Xilinx的新一代設(shè)計套件Vivado中引入了全新的約束文件 XDC,在很多規(guī)則和技巧上都跟上一代產(chǎn)品 ISE 中支持的 UCF 大不相同,給使用者帶來許多額外挑戰(zhàn)。Xilinx 工具專家告訴你,其實用好 XDC 很容易,只需掌握幾點核心技巧,并且時刻牢記:XDC 的語法其實就是 Tcl 語言。
XDC的優(yōu)勢
XDC 是 XilinxDesign Constraints 的簡寫,但其基礎(chǔ)語法來源于業(yè)界統(tǒng) 一的約束規(guī)范 SDC(最早由 Synopsys 公司提出,故名 Synopsys Design Constraints) 。所以 SDC、XDC 跟 Vivado Tcl 的關(guān)系如下圖所示。
XDC 在本質(zhì)上就是 Tcl 語言,但其僅支持基本的 Tcl 語法如變量、列表和運算符等等,對其它復(fù)雜的循環(huán)以及文件 I/O 等語法可以通過在 Vivado 中 source 一個 Tcl 文件的方式來補充。(對 Tcl 話題感興趣的讀者可以參考作者的另一篇文章《Tcl 在 Vivado 中的應(yīng)用》)XDC 與 UCF 的最主要區(qū)別有兩點:
1.XDC 可以像 UCF 一樣作為一個整體文件被工具讀入,也可以在實現(xiàn)過程中被當(dāng)作一個個單獨的命令直接執(zhí)行。這就決定了 XDC 也具有 Tcl 命令的特點,即后面輸入的約束在有沖突的情況下會覆蓋之前輸入的約束(時序例外的優(yōu)先級會在下節(jié)詳述)。另外,不同于 UCF 是全部讀入再處理的方式,在 XDC 中,約束是讀一條執(zhí)行一條,所以先后順序很重要,例如要設(shè)置 IO 約束之前,相對應(yīng)的 clock 一定要先創(chuàng)建好。
2.UCF 是完全以 FPGA 的視角看問題,所以缺省認為所有的時鐘之間除非預(yù)先聲明是同步的,否則就視作異步而不做跨時鐘域時序分析;XDC 則恰恰相反,ASIC 世界的血緣背景決定了在其中,所有的時鐘缺省視作全同步,在沒有時序例外的情況下,工具會主動分析每一條跨時鐘域的路徑。
XDC的基本方法
XDC 的基本語法可以分為時鐘約束、I/O約束以及時序例外約束三大類。根據(jù) Xilinx 的 UltraFast 設(shè)計方法 學(xué)中 Baseline 部分的建議(UG949 中有詳細介紹),對一個設(shè)計進行約束的先后順序也可以依照這三類約束依次進行。本文對可以在幫助文檔中查到的基本 XDC 語法不做詳細解釋,會將重點放在使用方法和技巧上。
時鐘約束
時鐘約束必須最早創(chuàng)建。對 7 系列 FPGA 來說,端口進來的時鐘以及 GT 的輸出 RXCLK/TXCLK 都必須 由用戶使用 create_clock 自主創(chuàng)建為主時鐘。如果是差分輸入的時鐘,可以僅僅在差分對的 P 側(cè)用 get_ports 獲取端口,并使用 create_clock 創(chuàng)建。例如,
Vivado 自動推導(dǎo)的衍生時鐘
MMCM/PLL/BUFR 的輸出作為衍生時鐘,可以由 Vivado 自動推導(dǎo),無需用戶創(chuàng)建。自動推導(dǎo)的好處在于 當(dāng)MMCM/PLL/BUFR 的配置改變而影響到輸出時鐘的頻率和相位時,用戶無需改寫約束,Vivado 仍然可以自 動推導(dǎo)出正確的頻率/相位信息。劣勢在于,用戶并不清楚自動推導(dǎo)出的衍生鐘的名字,當(dāng)設(shè)計層次改變時,衍生鐘的名字也有可能改變。這樣就會帶來一個問題:用戶需要使用這些衍生鐘的名字來創(chuàng)建 I/O 約束、時鐘關(guān)系或是時序例外等約束時,要么不知道時鐘名字,要么時鐘名字是錯的。
推薦的做法是,由用戶來指定這類衍生時鐘的名字,其余頻率等都由 Vivado 自動推導(dǎo)。這樣就只需寫明 create_generated_clock 的三個 option,其余不寫即可。如上所示。
當(dāng)然,此類情況下用戶也可以選擇完全由自己定義衍生時鐘,只需補上其余表示頻率/相位關(guān)系的 option, 包括-multiply_by 、-divide_by 等等。需要注意的是,一旦 Vivado 在 MMCM/PLL/BUFR 的輸出檢測到用戶自定義的衍生時鐘,就會報告一個 Warning,提醒用戶這個約束會覆蓋工具自動推導(dǎo)出的衍生時鐘(例外的情況見文章下半段重疊時鐘部分的描述),用戶須保證自己創(chuàng)建的衍生鐘的頻率等屬性正確。
用戶自定義的衍生時鐘
工具不能自動推導(dǎo)出衍生鐘的情況,包括使用寄存器和組合邏輯搭建的分頻器等,必須由用戶使用 create_generated_clock 來創(chuàng)建。舉例如下,
I/O約束
在設(shè)計的初級階段,可以不加 I/O 約束,讓工具專注于滿足 FPGA 內(nèi)部的時序要求。當(dāng)時序要求基本滿足后,再加上 I/O 約束跑實現(xiàn)。XDC 中的 I/O 約束有以下幾點需要注意:
1.不加任何 I/O 約束的端口時序要求被視作無窮大。 2.XDC 中的 set_input_delay / set_output_delay 對應(yīng)于 UCF 中 OFFSET IN / OFFSET OUT,但視角相反。 OFFSETIN / OFFSET OUT 是從 FPGA 內(nèi)部延時的角度來約束端口時序,set_input_delay / set_output_delay 則是從系統(tǒng)角度來約束。 3.典型的 I/O 時序,包括系統(tǒng)同步、源同步、SDR 和 DDR 等等,在 Vivado 圖形界面的 XDC templates 中都有示例。2014.1 版后還有一個 Timing Constraints Wizard 可供使用。
時序例外約束
時序例外約束包括 set_max_delay/set_min_delay,set_multicycle_path,set_false_path 等,這類約束除 了要滿足 XDC 的先后順序優(yōu)先級外,還受到自身優(yōu)先級的限制。一個總的原則就是針對同一條路徑,對約束目標(biāo)描述越具體的優(yōu)先級越高。不同的時序例外約束以及同一約束中不同條件的優(yōu)先級如下所示:
舉例來說,依次執(zhí)行如下兩條 XDC,盡管第二條較晚執(zhí)行,但工具仍然認定第一條約束設(shè)定的 15 為 clk1 到 clk2 之間路徑的 max delay 值。
再比如,對圖示路徑依次進行如下四條時序例外約束,優(yōu)勝者將是第二條。但如果再加入最后一條約束, false path 的優(yōu)先級最高,會取代之前所有的時序例外約束。
高級時鐘約束
約束最終是為了設(shè)計服務(wù),所以要用好 XDC 就需要深入理解電路結(jié)構(gòu)和設(shè)計需求。接下來我們就以常見 FPGA 設(shè)計中的時鐘結(jié)構(gòu)來舉例,詳細闡述 XDC 的約束技巧。
時序的零起點
用 create_clock 定義的主時鐘的起點即時序的“零起點”,在這之前的上游路徑延時都被工具自動忽略。所以主時鐘創(chuàng)建在哪個“點”很重要,以下圖所示結(jié)構(gòu)來舉例,分別于 FPGA 輸入端口和 BUFG 輸出端口創(chuàng)建一個主時鐘,在時序報告中體現(xiàn)出的路徑延時完全不同,很明顯 sysclk_bad 的報告中缺少了之前一段的延時,時序報 告不可信。
定義時鐘的先后順序
時鐘的定義也遵從 XDC/Tcl 的一般優(yōu)先級,即: 在同一個點上,由用戶定義的時鐘會覆蓋工具自動推導(dǎo)的時鐘,且后定義的時鐘會覆蓋先定義的時鐘。若要二者并存,必須使用 -add 選項。
上述例子中 BUFG 的輸出端由用戶自定義了一個衍生鐘 clkbufg,這個衍生鐘便會覆蓋此處原有的 sysclk。此外,圖示 BUFR 工作在 bypass 模式,其輸出不會自動創(chuàng)建衍生鐘,但在 BUFR 的輸出端定義一個 衍生鐘 clkbufr,并使用 -add 和 -master_clock 選項后,這一點上會存在 sysclk 和 clkbufg 兩個重疊的時鐘。 如下的 Tcl 命令驗證了我們的推論。
同步時鐘和異步時鐘
不同于 UCF 約束,在 XDC 中,所有的時鐘都會被缺省認為是相關(guān)的,也就是說,網(wǎng)表中所有存在的時序路徑都會被 Vivado 分析。這也意味著 FPGA 設(shè)計人員必須通過約束告訴工具,哪些路徑是無需分析的,哪些時鐘域之間是異步的。
如上圖所示,兩個主時鐘 ssclkin 和 sysclk 由不同的端口進入 FPGA,再經(jīng)由不同的時鐘網(wǎng)絡(luò)傳遞,要將它們設(shè)成異步時鐘,可以使用如下約束:
其中,-include_generated_clocks 表示所有衍生鐘自動跟其主時鐘一組,從而與其它組的時鐘之間為異步關(guān)系。不加這個選項則僅僅將時鐘關(guān)系的約束應(yīng)用在主時鐘層面。
重疊(單點多個)時鐘
重疊時鐘是指多個時鐘共享完全相同的時鐘傳輸網(wǎng)絡(luò),例如兩個時鐘經(jīng)過一個 MUX 選擇后輸出的時鐘,在有多種運行模式的設(shè)計中很常見。
如下圖所示,clk125 和 clk250 是 clkcore_buf 的兩個輸入時鐘,不約束時鐘關(guān)系的情況下,Vivado 會對圖示路徑做跨時鐘域(重疊時鐘之間)分析。這樣的時序報告即便沒有違例,也是不可信的,因為 clk125 和 clk250 不可能同時驅(qū)動這條路徑上的時序元件。這么做也會增加運行時間,并影響最終的實現(xiàn)效果。
如果 clk125 和 clk250 除了通過 clkcore_buf 后一模一樣的扇出外沒有驅(qū)動其它時序元件,我們要做的僅僅 是補齊時鐘關(guān)系的約束。
在很多情況下,除了共同的扇出,其中一個時鐘或兩個都還驅(qū)動其它的時序元件,此時建議的做法是在 clkcore_buf 的輸出端上創(chuàng)建兩個重疊的衍生鐘,并將其時鐘關(guān)系約束為-physically_exclusive表示不可能同時通過。這樣做可以最大化約束覆蓋率,也是 ISE 和 UCF 中無法做到的。
其他高級約束
時鐘的約束是 XDC 的基礎(chǔ),熟練掌握時鐘約束,也是 XDC 約束技巧的基礎(chǔ)。其它高級約束技巧,包括復(fù)雜的 CDC(Clock Domain Crossing)約束和接口時序(SDR、DDR、系統(tǒng)同步接口和源同步接口)約束等方面還有很多值得注意的地方。這一系列《XDC 約束技巧》文章還會繼續(xù)就上述所列方向分篇詳述,敬請關(guān)注作者的后續(xù)更新,以及 Xilinx 官方網(wǎng)站和中文論壇上的更多技術(shù)文章。
下一篇,將推出《XDC約束技巧之CDC篇》,歡迎閱讀。
審核編輯:湯梓紅
-
Xilinx
+關(guān)注
關(guān)注
71文章
2167瀏覽量
121430 -
時鐘
+關(guān)注
關(guān)注
10文章
1733瀏覽量
131485 -
約束
+關(guān)注
關(guān)注
0文章
82瀏覽量
12733 -
Vivado
+關(guān)注
關(guān)注
19文章
812瀏覽量
66539 -
xdc
+關(guān)注
關(guān)注
1文章
24瀏覽量
5928
原文標(biāo)題:XDC約束技巧之時鐘篇
文章出處:【微信號:FPGA算法工程師,微信公眾號:FPGA算法工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論