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