FPGA設(shè)計中的約束文件有3類:用戶設(shè)計文件(.UCF文件)、網(wǎng)表約束文件(.NCF文件)以及物理約束文件(.PCF文件),可以完成時序約束、管腳約束以及區(qū)域約束。3類約束文件的關(guān)系為:用戶在設(shè)計輸入階段編寫UCF文件,然后UCF文件和設(shè)計綜合后生成NCF文件,最后再經(jīng)過實現(xiàn)后生成PCF 文件。UCF文件是ASC 2碼文件,描述了邏輯設(shè)計的約束,可以用文本編輯器和Xilinx約束文件編輯器進(jìn)行編輯。NCF約束文件的語法和UCF文件相同,二者的區(qū)別在于: UCF文件由用戶輸入,NCF文件由綜合工具自動生成,當(dāng)二者發(fā)生沖突時,以UCF文件為準(zhǔn),這是因為UCF的優(yōu)先級最高。PCF文件可以分為兩個部分:一部分是映射產(chǎn)生的物理約束,另一部分是用戶輸入的約束,同樣用戶約束輸入的優(yōu)先級最高。一般情況下,用戶約束都應(yīng)在UCF文件中完成,不建議直接修改 NCF文件和PCF文件。
約束文件的后綴是.ucf,所以一般也被稱為UCF文件。創(chuàng)建約束文件有兩種方法,一種是通過新建方式,另一種則是利用過程管理器來完成。
第一種方法:新建一個源文件,在代碼類型中選取“Implementation Constrains File”,在“File Name”中輸入約束文件的名稱。單擊“Next”按鍵進(jìn)入模塊選擇對話框,選擇要約束的模塊,然后單擊“Next”進(jìn)入下一頁,再單擊“Finish” 按鍵完成約束文件的創(chuàng)建。
第二種方法:在工程管理區(qū)中,將“Source for”設(shè)置為“Synthesis/Implementation”。“Constrains Editor”是一個專用的約束文件編輯器,雙擊過程管理區(qū)中“User Constrains”下的“Create Timing Constrains”就可以打開“Constrains Editor”。
需要注意的是,UCF文件是大小敏感的,端口名稱必須和源代碼中的名字一致,且端口名字不能和關(guān)鍵字一樣。但是關(guān)鍵字NET是不區(qū)分大小寫的。
UCF文件的語法說明:
1.語法
UCF文件的語法為:
{NET|INST|PIN} "signal_name" Attribute;
其中,“signal_name”是指所約束對象的名字,包含了對象所在層次的描述;“Attribute”為約束的具體描述;語句必須以分號“;”結(jié)束??梢杂谩?”或“”添加注釋。需要注意的是:UCF文件是大小寫敏感的,信號名必須和設(shè)計中保持大小寫一致,但約束的關(guān)鍵字可以是大寫、小寫甚至大小寫混合。例如:
NET "CLK" LOC = P30;
“CLK”就是所約束信號名,LOC = P30;是約束具體的含義,將CLK信號分配到FPGA的P30管腳上。
對于所有的約束文件,使用與約束關(guān)鍵字或設(shè)計環(huán)境保留字相同的信號名會產(chǎn)生錯誤信息,除非將其用" "括起來,因此在輸入約束文件時,最好用" "將所有的信號名括起來。2.通配符
在UCF文件中,通配符指的是“*”和“?”?!?”可以代表任何字符串以及空,“?”則代表一個字符。在編輯約束文件時,使用通配符可以快速選擇一組信號,當(dāng)然這些信號都要包含部分共有的字符串。例如:
NET "*CLK?" FAST;
將包含“CLK”字符并以一個字符結(jié)尾的所有信號,并提高了其速率。
在位置約束中,可以在行號和列號中使用通配符。例如:
INST "/CLK_logic 遍歷level1種的模塊,但不遍歷更低層的模塊管腳和區(qū)域約束語法(也可以通過Floorplanner約束)
LOC約束是FPGA設(shè)計中最基本的布局約束和綜合約束,能夠定義基本設(shè)計單元在FPGA芯片中的位置,可實現(xiàn)絕對定位、范圍定位以及區(qū)域定位。此外, LOC還能將一組基本單元約束在特定區(qū)域之中。LOC語句既可以書寫在約束文件中,也可以直接添加到設(shè)計文件中。換句話說,ISE中的FPGA底層工具編輯器(FPGA Editor)、布局規(guī)劃器(Floorplanner)和引腳和區(qū)域約束編輯器的主要功能都可以通過LOC語句完成。
LOC語句語法
INST "instance_name " LOC = location;
其中“l(fā)ocation”可以是FPGA芯片中任一或多個合法位置。如果為多個定位,需要用逗號“,”隔開,如下所示:
LOC = location1,location2,...,locationx;
目前,還不支持將多個邏輯置于同一位置以及將多個邏輯至于多個位置上。需要說明的是,多位置約束并不是將設(shè)計定位到所有的位置上,而是在布局布線過程中,布局器任意挑選其中的一個作為最終的布局位置。范圍定位的語法為:
INST “instance_name” LOC=location:location [SOFT];
表 常用的LOC定位語句
常用的LOC定位語句
使用LOC完成端口定義時,其語法如下:
NET "Top_Module_PORT" LOC = "Chip_Port";
其中,“Top_Module_PORT”為用戶設(shè)計中頂層模塊的信號端口,“Chip_Port”為FPGA芯片的管腳名。
LOC語句中是存在優(yōu)先級的,當(dāng)同時指定LOC端口和其端口連線時,對其連線約束的優(yōu)先級是最高的。
2.LOC屬性說明
LOC語句通過加載不同的屬性可以約束管腳位置、CLB、Slice、TBUF、塊RAM、硬核乘法器、全局時鐘、數(shù)字鎖相環(huán)(DLL)以及DCM模塊等資源,基本涵蓋了FPGA芯片中所有類型的資源。由此可見,LOC語句功能十分強大,下表出了LOC的常用屬性。
時序約束的語法
時序約束的語法(也可通過constraint editor約束)
UCF文件中時序約束的語法
約束UCF文件,從Constrains Editor直接輸入是最方便、最直接的添加約束的方法了。以下是幾種常用的語法:
1)周期約束
PERIOD約束是一個基本時序和綜合約束,它附加在時鐘網(wǎng)線上,時序分析工具根據(jù)PERIOD約束檢查時鐘域內(nèi)所有同步元件的時序是否滿足要求,它將檢查與同步時序約束端口相連接的所有路徑的延遲,但是不會檢查PAD到寄存器的路徑。
附加時鐘周期約束的首選方法(Preferred Method)語法如下:
TIMESPEC “TS_identifier” = PERIOD “TNM_reference” period {HIGH|LOW} [high_or_low_time]
其中“[]”內(nèi)為可選項,“{}”為必選項,參數(shù)period為要求的時鐘周期,可以使用ps、ns、us或者ms等單位,大小寫都可以,缺省單位為ns。 HIGH|LOW關(guān)鍵詞指出時鐘周期里的第一個脈沖是高電平還是低電平,而high_or_low_time為脈沖的延續(xù)時間,缺省單位也是ns,如果不提供該項,則缺省占空比為50%。
TIMESPEC是一個基本時序相關(guān)約束標(biāo)識,表示本約束為時序規(guī)范。TSidentifier包括字母TS和一個標(biāo)識符identifier(為ASCII碼字符串)共同組成一個時序規(guī)范。
例如定義時鐘周期約束時,首先在時鐘網(wǎng)線clk上附加一個TNM_NET約束,把clk驅(qū)動的所有同步元件定義為一個名為sys_clk的分組,然后使用TIMESPEC約束定義時鐘周期。
NET “clk” TNM_NET=”sys_clk”; #定義clk驅(qū)動的所有同步元件為sys_clk的分組
TIMESPEC “TS_sys_clk”= PERIOD “sys_clk” 50 HIGH 30; #定義可引用的時序規(guī)范TS_sys_clk,
#這個規(guī)范規(guī)定sys_clk組的時鐘情況
而定義派生時鐘的語法如下:
TIMESPEC “TSidentifier_2”=PERIOD “timegroup_name” “TSidentifier_1” [*or/] factor PHASE [+|-] phase_value [units]; #定義第二個時序規(guī)范TSidentifier_2,其內(nèi)容是名為timegroup_name的分組是第
#一個時序規(guī)范TSidentifier_1派生的
其中TSidentifier_2為要定義的派生時鐘,TSidentifier_1為已經(jīng)定義的時鐘,factor指出兩者周期的輩數(shù)關(guān)系,是一個浮點數(shù)。phase_value指出兩者之間的相位關(guān)系,為浮點數(shù)。例如:
定義主時鐘clk0:
TIMESPEC “TS01” = PERIOD “clk0” 10.0 ns;
定義派生時鐘clk180,其相位與主時鐘相差180°:
TIMESPEC “TS02” = PERIOD “clk180” TS01 PHASE + 5.0 ns;
定義派生時鐘clk180_2,其周期為主時鐘的1/2,并延遲2.5ns:
TIMESPEC “TS03” = PERIOD “clk180_2” TS01 /2 PHASE + 2.5 ns;
2)偏移約束
偏移約束規(guī)定了外部時鐘和數(shù)據(jù)輸入輸出引腳之間的時序關(guān)系,只用于與PAD相連的(端口)信號,不能用于內(nèi)部信號。使用該約束可以為綜合實現(xiàn)工具指出輸入數(shù)據(jù)到達(dá)的時刻,或者輸出數(shù)據(jù)穩(wěn)定的時刻,從而在綜合實現(xiàn)中調(diào)整布局布線過程,使正在開發(fā)的FPGA/CPLD的輸入建立時間以及下一級電路的輸入建立時間滿足要求。
基本語法如下:
OFFSET = {IN|OUT} “offset_time” [units] {BEFORE|AFTER} “clk_name” [TIMEGRP “group_name”];
其中{IN|OUT}說明約束的是輸入還是輸出,offset_time為FPGA引腳數(shù)據(jù)變化與有效時鐘沿之間的時間差,BEFORE|AFTER說明該時間差在有效時鐘沿的前面還是后面,TIMEGRP “group_name”定義了約束的觸發(fā)器組,缺省時約束該時鐘驅(qū)動的所有觸發(fā)器。
3)分組約束
使用TNM(Timing Name)約束可以選出構(gòu)成一個分組的元件,并賦予一個名字,以便給它們附加約束。TNM_NET(timing name for nets)約束只加在網(wǎng)線上,其作用與TNM加在網(wǎng)上時基本相同,即把該網(wǎng)線所在路徑上的所有有效同步元件作為命名組的一部分。不同之處在于當(dāng)TNM約束加在PAD NET上時,TNM的值將被賦予PAD,而不是該網(wǎng)線所在的路徑上的同步元件,即TNM約束不能穿過IBUF。而用TNM_NET約束就不會出現(xiàn)這種情況。
4)專門約束
附加約束的一般策略是首先附加整體約束,例如PERIOD、OFFSET等,然后對局部的電路附加專門約束,這些專門約束通常比整體約束寬松,通過在可能的地方盡量放松約束可以提高布線通過率,減小布局布線的時間。
FROM_TO約束在兩個組之間定義時序約束,對兩者之間的邏輯和布線延遲進(jìn)行控制,這兩個組可以是用戶定義的,也可以是與定義的。用戶可以使用TNM_NET、TNM和TIMEGRP定義組,而與定義組主要包括FFS、LATCHES、PADS和RAMS等。語法如下:
TIMESPEC “TSname” = FROM “group1” TO “group2” value;
評論