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