約束
(一)約束的分類:
利用FPGA進行系統設計常用的約束主要分為3類。
(1)時序約束:主要用於規范設計的時序行為,表達設計者期望滿足的時序條件,知道綜合和布局布線階段的優化算法等。
(2)布局布線約束:主要用於指定芯片I/O引腳位置以及指導軟件在芯片特定的物理區域進行布局布線。
(3)其它約束:指目標芯片型號、接口位置、電氣特性等約束屬性。
(二)約束的主要作用
(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上規划各個模塊的實現區域,通過物理布局布線約束完成模塊化設計等。
(三)UCF約束文件的概念
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約束文件的概念
FPGA設計中的約束文件有3類:用戶設計文件(.UCF文件)、網表約束文件(.NCF文件)以及物理約束文件(.PCF文件),可以完成時序約束、管腳約束以及區域約束。3類約束文件的關系為:用戶在設計輸入階段編寫UCF文件,然后UCF文件和設計綜合后生成NCF文件,最后再經過實現后生成PCF 文件。
UCF文件是ASC 2碼文件,描述了邏輯設計的約束,可以用文本編輯器和Xilinx約束文件編輯器進行編輯。NCF約束文件的語法和UCF文件相同,二者的區別在於: UCF文件由用戶輸入,NCF文件由綜合工具自動生成,當二者發生沖突時,以UCF文件為准,這是因為UCF的優先級最高。PCF文件可以分為兩個部分:一部分是映射產生的物理約束,另一部分是用戶輸入的約束,同樣用戶約束輸入的優先級最高。一般情況下,用戶約束都應在UCF文件中完成,不建議直接修改 NCF文件和PCF文件。
(四)約束設計
4.1時序約束
時序約束分為周期約束、I/O時序約束、分組約束和專門約束
4.1.1周期約束
周期約束是一個基本時序和綜合約束,它附加在時鍾網絡上,時序分析工作根據周期約束檢查時鍾域內所有同步器件的時序是否滿足要求,它將檢查與同步時序約束端口相連接的所有路徑的延遲,但不會檢查PAD到寄存器路徑。。
周期約束的語法如下:
TIMESPEC“TS_identifier”=PERIOD “TNM_reference”period{High|low}[high_or_low_time]
說明:
(1)TIMESPEC是一個基本時序相關約束標識。TM_identifier包括字母TM和一個標識符identifier共同組成一個時序規范。
(2)參數period為要求的時鍾周期,可以使用ps、ns、us或者ms等單位,大小寫都可以,缺省單位為ns。
(3)“{}”為必選項,HIGH|LOW關鍵詞指出時鍾周期里的第一個脈沖是高電平還是低電平
(4)“[]”內為可選項,high_or_low_time為脈沖的延續時間,缺省單位是ns,默認占空比為50%。
(5)定義時鍾周期約束時,首先需要對待約束的時鍾網絡上附加一個TNM_NET約束,把由該時鍾驅動的所有同步器件定義為一個分組,然后使用TIMESPEC約束定義時鍾周期。
【例1】周期約束設計實例
NET “usr_clk” TNM_NET= “usr_clk_i”;
TIMESPEC “TS_usr_clk_i” = PERIOD “usr_clk_i” 5.0ns HIGH 50 %
第一條約束定義時鍾usr_clk驅動的所有同步器件為一個分組;
第二條約束定義其周期為5ns,即200MHZ,占空比為50%。
4.1.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”];
NOTE:
//OFFSET_IN_AFTER :輸入數據在有效始終到達多長時間后可以到達芯片的輸入引腳
//OFFSET_IN_BEFORE:數據比相應的有效時鍾沿提前多少時間到來
//OFFSET_OUT_AFTER:輸出數據在有效時鍾沿之后多長時間穩定下來
//OFFSET_OUT_BEFORE:下一個時鍾信號到來之前多長時間必須輸出數據
說明:
(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”;
約束定義TS_emif_data寄存器組與時鍾I_emif_clk的關系為時鍾有效后7ns輸出TS_emif_data寄存器的可靠數據。
4.1.3分組約束
分組約束是將一些具有相同時序要求的器件歸為一組,進行相同的時序約束。
分組約束的語法如下:
{NET|INST} “net_name” TNM_NET= [predefined_group] identifier;
{NET|INST|PIN}“net_or_pin_or_inst_name” TNM =[predefined_group] identifier;
INST、NET和PIN為信號,引腳等關鍵詞。
INST is an element such as a flip flop, register or pad in a design. NET is a signal path, a route between one point (such as a flip flop, register or pad) to another
TNM為分組約束關鍵詞
TNM_NET為分組約束關鍵詞,其作用於TNM加在網上是基本相同,即把該網線所在路徑上的所有有效同步元件作為命名組的一部分。
不同之處在於當TNM約束加在PAD NET 上時,TNM的值將被賦予PAD,而不是該網線所在的路徑上的同步元件,即TNM的約束不能穿過IBUF。而用TNM_NET約束就不會出現這種情況。
identifier為標識符
predefined_group為預先定義組標識符
4.1.4專門約束
約束文件設計的一般策略是首先設定整體約束,例如PERIOD、OFFSET等,然后對局部的電路附加專門約束,這些專門約束通常比整體約束寬松,通過在可能的地方盡量放松約束可以提高布局布線通過率,減小布局布線的時間。
FROM_TO約束
FROM_TO約束在兩個定義的組之間進行時序約束,對兩者之間的邏輯和布線延遲進行控制。
語法如下:TIMESPEC “TS_name”= FROM “group1” TO “group2” value;
其中value為延遲時間,可以使具體數值或表達式。
MAXDELAY約束
MAXDELAY約束定義了特定路徑上的最大延遲。
語法如下:NET “net_name” MAXDELAY = value units;
4.2.2布局布線約束
布局布線約束包括引腳約束與位置約束。
4.2.1引腳約束
約束FPGA輸入輸出引腳的具體位置。
引腳約束的語法如下:NET “net_name” LOC= “PIN”;
說明:
(1)NET,LOC引腳約束關鍵詞
(2)“net_name”為FPGA內部定義的輸入輸出信號名稱;
(3)“PIN”為FPGA實際引腳名稱。
【例3】引腳約束實例
NET “sys_rst_n” LOC= “J12”;
4.2.2位置約束
位置約束是通過約束語法將設計中的某些硬件結構約束到指定的位置。
(1)位置約束的語法如下:INST “instance_name” LOC=location;
對設計中的硬件約束到具體位置,可以約束的硬件結構包括:寄存器、IOB、LUT、BRAM、乘法器、PLL等。
(2)INST “instance_name” RLOC= location;
對設計中的硬件約束到相對位置, 可約束的硬件結構包括:寄存器、IOB、LUT、BRAM、乘法器、PLL等。必須與RLOC_ORIGIN配套使用。
(***)INST “instance_name” RLOC_ORIGIN =location;與RLOC對應,指定RLOC的起始位置約束,與RLOC配套使用。
(***)INST “instance_name“ HU_SET=value;高級屬性定義約束,定義獨立的組,與RLOC配套使用,以保持結構的完整性。
4.3其他約束
除了時序約束以及引腳和位置約束外,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,可以提高設計的信號完整性。
(五)電氣標准
LVDS: low vvoltage differential signal 低壓差分信號 HSTL: High Speed Transciever Logic 高速收發邏輯 SSTL: Stub Series Terminated Logic 短截線串聯終端邏輯。 這三種是不同的接口邏輯標准:
LVDS 常用在液晶屏的數據傳輸,我們的筆記本的屏幕,大度都用LVDS接口;HSTL 和SSTL 用在與外部存儲器 如DDR2 DDR SDRAM 接口
【LVDS】 1.LVDS有兩種 LVDS_25,LVDS_33(這兩種在做輸出時,相應BANK的VCCO 必須分別是2.5V和3.3V) 2.LVDS的輸入端,需要端接100歐姆的電阻(並在差分對之間),Spartan6支持內部端接,只需要在LVDS原語例化時將DIFF_TERM設置成TRUE.以前這是只能在Viretx系列上才能有的福利
【HSTL和SSTL】
1.HSTL:HSTL最主要的應用是可以用於高速存儲器讀可。傳統的慢速存儲器訪問時間阻礙了高速處理器的運算操作。在中頻區域(100MHz和180MHz之間),可供選擇基於單端信號的I/O結構有:HSTL、GTL/GTL+、SSTL和低壓TTL(LVTTL)。在180MHz以上的范圍,HSTL標准是唯一可用的單端I/O接口。利用HSTL的速度,快速I/O接口明顯地提高了整個系統的性能。HSTL是高速存儲器應用的I/O接口選擇,同時也很完美地提供了驅動多個內存模塊地址總線的能力。 HSTL到底用在什么地方,目前還不是很清楚 2.SSTL這個接觸過。DDR2的部分邏輯接口電平就是用的這種標准。 SSTL細分的話有:SSTL3(3.3V) SSTL2 (2.5V) SSTL18(1.8V) SSTL15(1.5V)
其中SSTL3 用於SDRAM, SSTL2 DDR 驅動,SSTL18 用在DDR2 ,SSTL15用在DDR3, SSTL 還會分等級 常用的是等級I 和等級II如 SSTL18_II
(六)其他
6.1通配符 在UCF文件中,通配符指的是“*”和“?”。“*”可以代表任何字符串以及空,“?”則代表一個字符。在編輯約束文件時,使用通配符可以快速選擇一組信號,當然這些信號都要包含部分共有的字符串。例如: NET "*CLK?" FAST; 將包含“CLK”字符並以一個字符結尾的所有信號,並提高了其速率。 在位置約束中,可以在行號和列號中使用通配符。例如: INST "/CLK_logic/*" LOC = CLB_r*c7; 把CLK_logic層次中所有的實例放在第7列的CLB中。 6.2定義設計層次 在UCF文件中,通過通配符*可以指定信號的設計層次。其語法規則為: * 遍歷所有層次 Level1/* 遍歷level1及以下層次中的模塊 Level1/*/ 遍歷level1種的模塊,但不遍歷更低層的模塊
6.3管腳和區域約束語法 LOC約束是FPGA設計中最基本的布局約束和綜合約束,能夠定義基本設計單元在FPGA芯片中的位置,可實現絕對定位、范圍定位以及區域定位。此外, LOC還能將一組基本單元約束在特定區域之中。LOC語句既可以書寫在約束文件中,也可以直接添加到設計文件中。換句話說,ISE中的FPGA底層工具編輯器(FPGA Editor)、布局規划器(Floorplanner)和引腳和區域約束編輯器的主要功能都可以通過LOC語句完成。
INST "instance_name " LOC = location; 其中“location”可以是FPGA芯片中任一或多個合法位置。如果為多個定位,需要用逗號“,”隔開,如下所示: LOC = location1,location2,...,locationx;
目前,還不支持將多個邏輯置於同一位置以及將多個邏輯至於多個位置上。需要說明的是,多位置約束並不是將設計定位到所有的位置上,而是在布局布線過程中,布局器任意挑選其中的一個作為最終的布局位置。 范圍定位的語法為: INST “instance_name” LOC=location:location [SOFT];
使用LOC完成端口定義時,其語法如下: NET "Top_Module_PORT" LOC = "Chip_Port"; 其中,“Top_Module_PORT”為用戶設計中頂層模塊的信號端口,“Chip_Port”為FPGA芯片的管腳名。
6.4 LOC屬性說明 LOC語句通過加載不同的屬性可以約束管腳位置、CLB、Slice、TBUF、塊RAM、硬核乘法器、全局時鍾、數字鎖相環(DLL)以及DCM模塊等資源,基本涵蓋了FPGA芯片中所有類型的資源。由此可見,LOC語句功能十分強大,表4-5列出了LOC的常用屬性。