Xilinx 的新一代設計套件Vivado中引入了全新的約束文件XDC,在很多規(guī)則和技巧上都跟上一代產品ISE中支持的UCF大不相同,給使用者帶來許多額外挑戰(zhàn)。Xilinx工具專家告訴你,其實用好XDC很容易,只需掌握幾點核心技巧,并且時刻牢記:XDC的語法其實就是Tcl語言。
XDC的優(yōu)勢
XDC是Xilinx Design Constraints的簡寫,但其基礎語法來源于業(yè)界統(tǒng)一的約束規(guī)范SDC(最早由Synopsys公司提出,故名Synopsys Design Constraints)。所以SDC、XDC跟Vivado Tcl的關系如下圖所示。
XDC的主要優(yōu)勢包括: 統(tǒng)一了前后端約束格式,便于管理; 可以像命令一樣實時錄入并執(zhí)行; 允許增量設置約束,加速調試效率; 覆蓋率高,可擴展性好,效率高; 業(yè)界統(tǒng)一,兼容性好,可移植性強; |
XDC在本質上就是Tcl語言,但其僅支持基本的Tcl語法如變量、列表和運算符等等,對其它復雜的循環(huán)以及文件I/O等語法可以通過在Vivado中source一個Tcl文件的方式來補充。(對Tcl話題感興趣的讀者可以參考作者的另一篇文章《Tcl在Vivado中的應用》)
XDC與UCF的最主要區(qū)別有兩點:
XDC可以像UCF一樣作為一個整體文件被工具讀入,也可以在實現(xiàn)過程中被當作一個個單獨的命令直接執(zhí)行。這就決定了XDC也具有Tcl命令的特點,即后面輸入的約束在有沖突的情況下會覆蓋之前輸入的約束(時序例外的優(yōu)先級會在下節(jié)詳述)。另外,不同于UCF是全部讀入再處理的方式,在XDC中,約束是讀一條執(zhí)行一條,所以先后順序很重要,例如要設置IO約束之前,相對應的clock一定要先創(chuàng)建好。
UCF是完全以FPGA的視角看問題,所以缺省認為所有的時鐘之間除非預先聲明是同步的,否則就視作異步而不做跨時鐘域時序分析;XDC則恰恰相反,ASIC世界的血緣背景決定了在其中,所有的時鐘缺省視作全同步,在沒有時序例外的情況下,工具會主動分析每一條跨時鐘域的路徑。
XDC的基本語法
XDC的基本語法可以分為時鐘約束、I/O約束以及時序例外約束三大類。根據Xilinx的UltraFast設計方法學中Baseline部分的建議(UG949中有詳細介紹),對一個設計進行約束的先后順序也可以依照這三類約束依次進行。本文對可以在幫助文檔中查到的基本XDC語法不做詳細解釋,會將重點放在使用方法和技巧上。
時鐘約束
時鐘約束必須最早創(chuàng)建,對7系列FPGA來說,端口進來的主時鐘以及GT的輸出RXCLK/TXCLK都必須由用戶使用create_clock自主創(chuàng)建。而衍生時鐘則分為以下兩類:
MMCM/PLL/BUFR的輸出時鐘都可以由Vivado自動推導,無需用戶創(chuàng)建。若用戶僅希望改變衍生鐘的名字,其余頻率等都由工具自動推導,則只需寫明三個option,其余不寫即可:create_generated_clock [-name arg] [-source args] [-master_clock arg]
工具不能自動推導出衍生鐘的情況,包括使用寄存器和組合邏輯搭建的分頻器等,必須由用戶使用create_generated_clock來創(chuàng)建。
I/O約束
在設計的初級階段,可以不加I/O約束,讓工具專注于滿足FPGA內部的時序要求。當時序要求基本滿足后,再加上I/O約束跑實現(xiàn)。XDC中的I/O約束有以下幾點需要注意:
不加任何I/O約束的端口時序要求被視作無窮大。
XDC中的set_input_delay / set_output_delay對應于UCF中OFFSET IN / OFFSET OUT,但視角相反。OFFSET IN / OFFSET OUT是從FPGA內部延時的角度來約束端口時序,set_input_delay / set_output_delay則是從系統(tǒng)角度來約束。
典型的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)先級的限制。一個總的原則就是針對同一條路徑,對約束目標描述越具體的優(yōu)先級越高。不同的時序例外約束以及同一約束中不同條件的優(yōu)先級如下所示:
舉例來說,依次執(zhí)行如下兩條XDC,盡管第二條最后執(zhí)行,但工具仍然認定第一條約束設定的15為clk1到clk2之間路徑的max delay值。
再比如,對圖示路徑依次進行如下四條時序例外約束,優(yōu)勝者將是第二條。但如果再加入最后一條約束,false path的優(yōu)先級最高,會取代之前所有的時序例外約束。
高效的時鐘約束
約束最終是為了設計服務,所以要用好XDC就需要深入理解電路結構和設計需求。接下來我們就以常見FPGA設計中的時鐘結構來舉例,詳細闡述XDC的約束技巧。
時序的零起點
用create_clock定義的主時鐘的起點即時序的“零起點”,在這之前的上游路徑延時都被工具自動忽略。所以主時鐘創(chuàng)建在哪個“點”很重要,以下圖所示結構來舉例,分別于FPGA輸入端口和BUFG輸出端口創(chuàng)建一個主時鐘,在時序報告中體現(xiàn)出的路徑延時完全不同,很明顯sysclk_bad的報告中缺少了之前一段的延時,時序報告不可信。
時鐘定義的先后順序
時鐘的定義也遵從XDC/Tcl的一般優(yōu)先級,即:在同一個點上,由用戶定義的時鐘會覆蓋工具自動推導的時鐘,且后定義的時鐘會覆蓋先定義的時鐘。若要二者并存,必須使用 -add 選項。
上述例子中BUFG的輸出端由用戶自定義了一個衍生鐘clkbufg,這個衍生鐘便會覆蓋此處原有的sysclk。此外,圖示BUFR工作在bypass模式,其輸出不會自動創(chuàng)建衍生鐘,但在BUFR的輸出端定義一個衍生鐘clkbufr,并使用-add 和 -master_clock 選項后,這一點上會存在sysclk和clkbufg兩個重疊的時鐘。如下的Tcl命令驗證了我們的推論。
同步時鐘和異步時鐘
不同于UCF約束,在XDC中,所有的時鐘都會被缺省認為是相關的,也就是說,網表中所有存在的時序路徑都會被Vivado分析。這也意味著FPGA設計人員必須通過約束告訴工具,哪些路徑是無需分析的,哪些時鐘域之間是異步的。
如上圖所示,兩個主時鐘ssclkin和sysclk由不同的端口進入FPGA,再經由不同的時鐘網絡傳遞,要將它們設成異步時鐘,可以使用如下約束:
其中,-include_generated_clocks 表示所有衍生鐘自動跟其主時鐘一組,從而與其它組的時鐘之間為異步關系。不加這個選項則僅僅將時鐘關系的約束應用在主時鐘層面。
重疊(單點多個)時鐘
重疊時鐘是指多個時鐘共享完全相同的時鐘傳輸網絡,例如兩個時鐘經過一個MUX選擇后輸出的時鐘,在有多種運行模式的設計中很常見。
如下圖所示,clk125和clk250是clkcore_buf的兩個輸入時鐘,不約束時鐘關系的情況下,Vivado會對圖示路徑做跨時鐘域(重疊時鐘之間)分析。這樣的時序報告即便沒有違例,也是不可信的,因為clk125和clk250不可能同時驅動這條路徑上的時序元件。這么做也會增加運行時間,并影響最終的實現(xiàn)效果。
如果clk125和clk250除了通過clkcore_buf后一模一樣的扇出外沒有驅動其它時序元件,我們要做的僅僅是補齊時鐘關系的約束。
在很多情況下,除了共同的扇出,其中一個時鐘或兩個都還驅動其它的時序元件,此時建議的做法是在clkcore_buf的輸出端上創(chuàng)建兩個重疊的衍生鐘,并將其時鐘關系約束為-physically_exclusive 表示不可能同時通過。這樣做可以最大化約束覆蓋率,也是ISE和UCF中無法做到的。
其它高級約束
時鐘的約束是XDC的基礎,熟練掌握時鐘約束,也是XDC約束技巧的基礎。其它高級約束技巧,包括復雜的CDC(Clock Domain Crossing)約束和接口時序(SDR、DDR、系統(tǒng)同步接口和源同步接口)約束等方面還有很多值得注意的地方。
-
Vivado
+關注
關注
19文章
832瀏覽量
68349 -
時鐘約束
+關注
關注
0文章
15瀏覽量
6108
發(fā)布評論請先 登錄
Vivado 實現(xiàn)
Vivado Design Suite 2014.4.1 現(xiàn)已推出!
Vivado 2017.1和Vivado 2016.4性能對比分析

Vivado獲取License的步驟教程

Tcl在Vivado中的基礎應用

xilinx Vivado工具使用技巧
關于Vivado 2019.1的Dashboard功能詳解

使用Vivado License Manager時Vivado的錯誤信息
【FPGA Vivado】基于 FPGA Vivado 的流水燈樣例設計

如何升級Vivado工程腳本
Vivado設計套件用戶:使用Vivado IDE的指南

評論