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