Edit → language templates :
打開即可查看基本語法。
一、xilinx中的約束文件
1、約束的分類
利用FPGA進行系統設計常用的約束主要分為3類。
(1)時序約束:主要用於規范設計的時序行為,表達設計者期望滿足的時序條件,知道綜合和布局布線階段的優化算法等。
(2)布局布線約束:主要用於指定芯片I/O引腳位置以及指導軟件在芯片特定的物理區域進行布局布線。
(3)其它約束:指目標芯片型號、接口位置、電氣特性等約束屬性。
2、約束的主要作用
(1)提高設計的工作效率
對很多數字電路設計來說,提高工作頻率是非常重要的,因為高的工作頻率意味着高效的電路處理能力,通過附加約束可以控制邏輯的綜合、映射、布局和布線,以減少邏輯和布線的延遲,從而提高工作效率。
(2)獲得正確的時序分析報告
幾乎所有的FPGA設計平台都包含靜態時序分析工具,利用這類工具可以獲得映射或者是布局布線后的時序分析報告,從而對設計的性能做出評估。靜態時序分析工具以約束作為判斷時序是否滿足設計要求的標准,因此要求設計者正確輸入約束,以便靜態時序分析工具輸出正確的時序分析報告。
(3)指定FPGA引腳位置與電氣標准
FPGA的可編程性使電路板設計加工和FPGA設計可以同時進行,而不必等FPGA引腳位置的完全確定,從而節約了系統開發時間。電路板加工完成后,設計者要根據電路板的走線對FPGA加上引腳位置約束,以保證FPGA與電路板正確連接。另外通過約束還可以指定I/O引腳所支持的接口標准和其他電氣特性。為了滿足日新月異的通信發展,Xilinx新型FPGA可以通過I/O引腳約束設置支持,諸如AGP、BLVDS、CTT、GTL、GTLP、HSTL、LDT、LVCMOS、LVDCI、LVDS、LVPECL、LVDSEXT、LVTTL、PCI、PCIX、SSTL、ULVDS等豐富的I/O接口標准。
(4)利於模塊化設計
通過區域約束還能在FPGA上規划各個模塊的實現區域,通過物理布局布線約束完成模塊化設計等。
3、UCF約束文件
ISE 通過綜合工具XST對設計進行約束,XST的綜合約束文件時XCF文件,而在布局布線階段,最重要的約束文件是用戶約束文件UCF(user constraint file),兩者有着千絲萬縷的聯系,UCF幾乎支持XCF的所有約束語言和命令。通常在使用XST綜合流程時,僅僅通過綜合屬性設置來設置全局的綜合策略與參數,細化的約束是通過實現階段的約束文件UCF完成的。因此,UCF文件時約束文件的核心,通過編譯UCF文件可以實現時序、布局布線約束以及其他約束的絕大部分功能。
二、約束設計實例
A-時序約束
時序約束分為周期約束、I/O時序約束、分組約束和專門約束
1、周期約束
周期約束是一個基本時序和綜合約束,它附加在時鍾網絡上,時序分析工作根據周期約束檢查時鍾域內所有同步器件的時序是否滿足要求,它將檢查與同步時序約束端口相連接的所有路徑的延遲,但不會檢查PAD到寄存器路徑。
周期約束的語法如下:
TIMESPEC “TS_identifier”=PERIOD “TNM_reference” period {High|low}[high_or_low_time]
說明:
(1) TIMESPEC是一個基本時序相關約束標識
(2) TM_identifier包括字母TM和一個標識符identifier共同組成一個時序規范。
(3) 參數period為要求的時鍾周期,可以使用ps、ns、us或者ms等單位,大小寫都可以,缺省單位為ns
(4) “{}”為必選項,HIGH|LOW關鍵詞指出時鍾周期里的第一個脈沖是高電平還是低電平
(5) “[]”內為可選項,high_or_low_time為脈沖的延續時間,缺省單位是ns,默認占空比為50%
(6) 定義時鍾周期約束時,首先需要對待約束的時鍾網絡上附加一個TNM_NET約束,把由該時鍾驅動的所有同步器件定義為一個分組,然后使用TIMESPEC約束定義時鍾周期。
【例1】 周期約束設計實例
NET “usr_clk” TNM_NET= “usr_clk”;
TIMESPEC “TS_usr_clk” = PERIOD “usr_clk” 5.0ns
例1中第一條約束定義時鍾usr_clk驅動的所有同步器件為一個分組;第二條約束定義其周期為5ns,即200MHZ
2、I/O時序約束
I/O時序約束定義了時鍾和I/O接口之間的時序關系,只用於與I/O接口相連的信號,不能用於內部信號。
I/O時序約束可以約束輸入數據、輸出數據相對於時鍾的時序關系,從而在綜合實現中調整布局布線,是正在開發的FPGA的輸入建立時間、輸出保持時間保持系統要求。
I/O時序約束的語法如下:
OFFSET=IN “offset_time” [units] BEFORE “clk_name” [TIMEGRP “group_name”];
OFFSET=OUT “offset_time” [units] AFTER “clk_name” [TIMEGRP “grout_name”];
說明:
(1)OFFSET、IN、BEFORE是I/O時序約束輸入建立時間標識,具體含義為:輸入數據與時鍾的時序關系滿足offset_time定義的時間
(2)OFFSET、OUT、AFTER是I/O時序約束輸出保持時間標識,具體含義為:輸出數據與時鍾的時序關系滿足offset_time定義的時間
(3)”offset_time”是約束要求的時間
(4)”clk_name”為參考時鍾
(5)[TIMEGRP “grout_name”]為約束的寄存器組。
【例2】I/O時序約束
INST “io_emif_data<0>” TNM=TS_emif_data;
INST “io_emif_data<1>” TNM=TS_emif_data;
INST “io_emif_data<2>” TNM=TS_emif_data;
INST “io_emif_data<3>” TNM=TS_emif_data;
INST “io_emif_data<4>” TNM=TS_emif_data;
INST “io_emif_data<5>” TNM=TS_emif_data;
INST “io_emif_data<6>” TNM=TS_emif_data;
INST “io_emif_data<7>” TNM=TS_emif_data;
NET “IO_emif_clk” TNM_NET= I_emif_clk;
TIMEGRP “TS_emif_data” OFFSET = OUT 7ns AFTER “I_emif_clk”;
例2表示,約束定義TS_emif_data寄存器組與時鍾I_emif_clk的關系為時鍾有效后7ns輸出TS_emif_data寄存器的可靠數據。
3、分組約束
分組約束是將一些具有相同時序要求的器件歸為一組,進行相同的時序約束。
分組約束的語法如下:
{NET|INST} “net_name” TNM_NET= [predefined_group] identifier;
{NET|INST|PIN} “net_or_pin_or_inst_name” TNM = [predefined_group] identifier;
(1) INST、NET和PIN為信號,引腳等關鍵詞。
(2) TNM為分組約束關鍵詞
(3) TNM_NET為分組約束關鍵詞,其作用於TNM加在網上是基本相同,即把該網線所在路徑上的所有有效同步元件作為命名組的一部分。不同之處在於當TNM約束加在PAD NET 上時,TNM的值將被賦予PAD,而不是該網線所在的路徑上的同步元件,即TNM的約束不能穿過IBUF。而用TNM_NET約束就不會出現這種情況。
(4) identifier為標識符
(5) predefined_group為預先定義組標識符
分組約束的例子參見【例2】
4、專門約束
約束文件設計的一般策略是首先設定整體約束,例如PERIOD、OFFSET等,然后對局部的電路附加專門約束,這些專門約束通常比整體約束寬松,通過在可能的地方盡量放松約束可以提高布局布線通過率,減小布局布線的時間。
(1) FROM_TO約束
FROM_TO約束在兩個定義的組之間進行時序約束,對兩者之間的邏輯和布線延遲進行控制。
語法如下:TIMESPEC “TS_name”= FROM “group1” TO “group2” value;
其中value為延遲時間,可以使具體數值或表達式。
(2) MAXDELAY約束
MAXDELAY約束定義了特定路徑上的最大延遲。
語法如下:
NET “net_name” MAXDELAY = value units;
B-布局布線約束
布局布線約束包括引腳約束與位置約束
1、引腳約束
約束FPGA輸入輸出引腳的具體位置。
引腳約束的語法如下:
NET “net_name” LOC= “PIN”;
說明:
(1) NET,LOC引腳約束關鍵詞
(2) “net_name”為FPGA內部定義的輸入輸出信號名稱;
(3) “PIN”為FPGA實際引腳名稱。
【例3】 引腳約束實例
NET “sys_rst_n” LOC= “J12”;
2、位置約束
位置約束是通過約束語法將設計中的某些硬件結構約束到指定的位置。
位置約束的語法如下。
(1) INST “instance_name” LOC=location;
對設計中的硬件約束到具體位置,可以約束的硬件結構包括:寄存器、IOB、LUT、BRAM、乘法器、PLL等。
(2) INST “instance_name” RLOC= location;
對設計中的硬件約束到相對位置, 可約束的硬件結構包括:寄存器、IOB、LUT、BRAM、乘法器、PLL等。必須與RLOC_ORIGIN配套使用。
(3) INST “instance_name” RLOC_ORIGIN =location;
與RLOC對應,指定RLOC的起始位置約束,與RLOC配套使用。
(4) INST “instance_name“ HU_SET=value;
高級屬性定義約束,定義獨立的組,與RLOC配套使用,以保持結構的完整性。
【例4】 位置約束設計實例1
INST “u_receive_serdes/gtp_dual_i” LOC = GTP_DUAL_X0Y0;
INST “u_idelayctrl” LOC=IDELAYCTRL_X2Y1;
INST “u_en_dqs_ff” LOC=SLICE_X0Y51;
INST “u_iddr_dq_ce” LOC=”ILOGIC_X0Y102;
例4的4個約束分別約束了GTP模塊、IDELAYCTRL、SLICE以及ILOGIC.
【例5】 位置約束實例2
INST “delay_inout_u/in1” RLOC_ORIGIN=X00Y60;
INST”delay_inout_u/in1” RLOC=X0Y0;
INST”delay_inout_u/in2” RLOC=X0Y1;
INST”delay_inout_u/*” HU_SET=MA;
例5利用了RLOC_ORIGIN以及RLOC和HU_SET定義了一個相對位置約束。其中*為通配符,指”delay_inout_u/”內所有元件具有的屬性。
C-其他約束
除了時序約束以及引腳和位置約束外,Xilinx公司還提供了其他一些約束,例如:
(1) PULLDOWN約束
NET “pad_net_name” PULLDOWN
說明:下拉約束,輸出低電平,以避免在無驅動時三態門的輸出懸空。
(2) PULLUP約束
NET “pad_net_name” PULLUP
說明:上拉約束,輸出高電平,以避免在無驅動時三態門的輸出懸空。
(3) IOSTANDARD
NET “pad_net_name” IOSTANDARD = iostandard_name
說明:輸入輸出引腳電平約束
(4) DRIVE
INST “instance_name” DRIVE= {2|4|6|8|12|16|24};
說明:輸出電流能力約束,可選為2mA, 4mA, 6mA, 8mA, 12mA, 16mA, 24mA電流輸出,默認值為12mA輸出。
(5) SLEW
NET “FAST_OUT” SLEW=”FAST”
說明:輸出斜率控制,可選為FAST以及SLOW,可以提高設計的信號完整性。
1-普通的I/O只約束管腳和電壓
NET “端口名稱” LOC = 引腳編號 | IOSTANDARD = “電壓”;
例如時鍾管腳:
又
從而可以寫成: