在進行FPGA的設計時,經(jīng)常會需要在綜合、實現(xiàn)的階段添加約束,以便能夠控制綜合、實現(xiàn)過程,使設計滿足我們需要的運行速度、引腳位置等要求。通常的做法是設計編寫約束文件并導入到綜合實現(xiàn)工具,在進行FPGA/CPLD的綜合、實現(xiàn)過程中指導邏輯的映射和布局布線。下面主要總結(jié)一下Xilinx FPGA時序約束設計和分析。
一、周期約束
周期約束是Xilinx FPGA 時序約束中最常見的約束方式。它附加在時鐘網(wǎng)線上,時序分析工具會根據(jù)周期約束來檢查時鐘域內(nèi)所有同步元件的時序是否滿足需求。周期約束會自動的寄存器時鐘端的反相。如果相鄰的兩個元件的時鐘相位是相反的,那么它們之間的延遲將被默認的限制成周期約束的一半。
在進行周期約束之前,必須對電路的時鐘周期明了,這樣才不會出現(xiàn)約束過松或者過緊的現(xiàn)象。一般情況下,設計電路所能達到的最高運行頻率取決于同步元件本身的Setup Time 和 Hold Time,以及同步元件之間的邏輯和布線延遲。周期約束一般是使用下面的約束方法:
1、period_item PERIOD=period {HIGH|LOW} [high_or low_item]
其中,period_item可以是NET或TIMEGRP,分別代表時鐘線名稱net name或元件分組名稱group-name。用NET表示PERIOD約束作用到名為“net name”的時鐘網(wǎng)線所驅(qū)動的同步元件上,用TIMEGRP表示PERIOD約束作用到TIMEGRP所定義的分組(包括FFS、LATCH和 RAM等同步元件)上。period是目標時鐘周期,單位可以是ps、ns、μS和ms等。HIGH|LOW指出時鐘周期中的第1個脈沖是高電平還是低電平,high or low time為HIGH LOW指定的脈沖的持續(xù)時間,默認單位是ns。如果沒有該參數(shù),時鐘占空比 是50%。例如, NET SYS_CLK PERIOD=10 ns HIGH 4ns
2、NET“clock net name”TNM_NET=“timing group name”;
TIMESPEC“TSidentifier”=PERIOD “TNM reference”period {HIGH | LOW} [high or low item]INPUT_JITTER value;
很多時候為了能夠定義比較復雜的派生關系的時鐘周期,就要使用該方法。其中TIMESPEC在時序約束中作為一個標識符表示本約束為時序規(guī)范;TSidentifier包括字母TS和一個標識符identifier共同作為一個TS屬性;TNM reference指定了時序約束是附加在哪一個組上,一般情況下加在TNM_NET定義的分組上。HIGH | LOW 指的是時鐘的初始相位表明第一個時鐘是上升沿還是下降沿;high or low item 表示的是時鐘占空比,即就是high或者low的時間,默認為1:1, INPUT_JITTER 表示的是時鐘的抖動時間,時鐘會在這個時間范圍內(nèi)抖動,默認單元為ps。比如周期約束:
NET "ex_clk200m_p" TNM_NET = TNM_clk200_p;
TIMESPEC "TS_clk200_p" = PERIOD "TNM_clk200_p" 5.000 ns HIGH 50 %;
建立一個TNM_clk200_p的時序分組,包括時鐘網(wǎng)絡ex_clk200m_p驅(qū)動的所有同步元件,這些同步元件都將受到時序規(guī)范TS_clk200_p的約束。同步元件到同步元件有5ns的時間要求。占空比為1:1.
二、偏移約束
偏移約束包括OFFSET_IN_BEFORE、OFFSET_IN_AFTER、OFFSET_OUT_BEFORE和OFFSET_OUT_AFTER等4種約束。屬于基本的時序約束,它規(guī)定了外部時鐘和數(shù)據(jù)輸入輸出引腳之間的時序關系,只能用于與引腳相連接。其基本的語法為:
OFFSET = {IN | OUT} “offset_time” [units] {BEFORE | AFTER} “clk_name” [TIMEGRP “group_name”];
其中,[IN | OUT] 說明約束是輸入還是輸出,”offset_time”為FPGA引腳數(shù)據(jù)變化與有效時鐘之間的時間差,[BEFORE | AFTER]說明該時間差在有效時鐘沿的前面還是后面,”clk_name”時鐘名,[TIMEGRP “group_name”]定義約束的觸發(fā)器組,缺省時約束clk_name驅(qū)動的所有觸發(fā)器。
1、OFFSET_IN_BEFORE、OFFSET_IN_AFTER約束
OFFSET_IN_BEFORE和OFFSET_IN_AFTER都是輸入偏移約束。OFFSET_IN_BEFORE說明了輸入數(shù)據(jù)比有效時鐘沿提前多長時間準備好。于是芯片內(nèi)部與輸入引腳相連的,組合邏輯的延遲不能大于這個時間,否則會發(fā)生數(shù)據(jù)采樣錯誤。OFFSET_IN_AFTER是輸入數(shù)據(jù)在有效時間沿之后多久到達芯片的輸入引腳。
OFFSET_IN_BEFORE對芯片內(nèi)部的輸入邏輯的約束,約束如下:
NET data_in OFFSET = IN Time BEFORE CLK;
2、OFFSET_OUT_AFTER、OFFSET_OUT_BEFORE約束
這兩個都是輸出約束,OFFSET_OUT _AFTER規(guī)定了輸出數(shù)據(jù)在有效沿之后多久穩(wěn)定下來,芯片內(nèi)部的輸出延遲必須小于這個數(shù)值。OFFSET_OUT_BEFORE是指下一級芯片的輸入數(shù)據(jù)應該在有效時鐘沿之前多久準備好。從下一級的輸入端的延遲可以計算出當前設計輸出的數(shù)據(jù)必須在何時穩(wěn)定下來。其基本的語法規(guī)則為:“NET data_out” OFFSET=OUT
Time AFTER CLK“;
三、專門約束
附加約束的一般策略是首先附加整天約束,比如PERIOD、OFFSET等約束,然后對局部的電路進行約束。專門約束包括以下幾個:
1、FROM_TO約束
FROM_TO在兩個組之間定義的約束,對二者之間的邏輯和布線延遲進行控制,這兩個組可以是用戶自定義的,也可以預定義的,可以使用TNM_NET、TNM和TIMEGRP定義組。其語法如下:
TIMESPEC “TSname“ = FROM ”group1“ TO ”group2“ value ;
其中group1和group2分別是路徑的起點和終點,value為延遲時間,可以是具體的數(shù)值或者表達式。比如:TIMESPEC TS_CLK = PERIOD CLK 30ns; TIMESPEC T1_T3 = FROM T1 TO T3 60ns;
2、MAXDELAY約束
MAXDELAY約束定義了特定的網(wǎng)絡線的最大延遲,其語法如:
NET “net_name“ MAXDELAY = value units ;value 為延遲時間。
3、MAXSKEW約束
MAXSKEW是高級時序約束,通過MAXSKEW約束附加在某一網(wǎng)線上,可以約束該網(wǎng)線上的最大SKEW。MAXSKEW語法如下:
NET “net_name“ MAXSKEW = allowable_skew units;
比如,NET “Singal“ MAXSKEW = 3ns;
四、分組約束
在FPGA設計當中,往往包含大量的觸發(fā)器、寄存器和RAM等元件,為了方便附加約束需要把他們分成不同的組,然后根據(jù)需要對某些組分別約束。
1、TNM約束。
使用TNM約束可以選出一個構(gòu)成分組的元件,并且賦予一個名字,以便添加約束。如:{NET | INST | PIN} “object_name“ TNM= “identifier“;
其中object_name為NET、INST或PIN的名稱,identifier為分組名稱。
2、TNM_NEY約束
TNM_NET約束只加在網(wǎng)線上,其作用與TNM約束加在網(wǎng)線時基本相同,即把該網(wǎng)線所在路徑上的所有有效同步元件作為一組命名。不同之處在于TNM是加在引腳上的,而不是該網(wǎng)線所在路徑上的同步元件,也就是說TNM約束不能穿過IBUF,用TNM_NET約束就不出現(xiàn)這種情況。
NET “net_name“ TNM_NET = [predefined_group:] identifier;
TNM_NET只能用在網(wǎng)線上,否則會出現(xiàn)警告,或者同時該約束被忽略。
2、TIMEGRP約束
可以通過TIMEGRP約束使已有的分組約束構(gòu)成新的分組,已經(jīng)有的預定義和用TNM/TIMEGRP定義。使用TIMEGRP約束可以使多個分組合并組成一個新分組。
TIMEGRP “big_group1“ = ”small_group“ ”medium_group“
將”small_group“ ”medium_group“合并一個新分組big_group1。
五、簡單的避免時序違規(guī)和補救的方法
PERIOD 約束定義的是觸發(fā)器等同步元件的時鐘周期??墒褂脮r序分析器來驗證同步元件之間的所有路徑是否滿足設計的建立和保持時序要求。PERIOD 約束違例將以負的時序裕量顯示在在時序報告,并說明到底是建立時間還是保持時間要求出現(xiàn)違例。應找出兩個所分析的同步元件間一條較快路徑,如果是多周期路徑,應該采樣多周期約束,或至少是某種方法來確保數(shù)據(jù)在合適時間內(nèi)到達并保持足夠長的時間,以便時鐘脈沖邊沿能夠正確采樣。若布局布線軟件無法找到更快的路徑,則可從 FPGA Editor 工具中手動進行布線。不過一般不推薦使用手工布局布線。首先應該試試重構(gòu)電路來滿足時序要求。比如用寄存器打一拍,有點邏輯復制的意思,這樣可以增加了信號的延遲,但是卻可以使電路正確的采樣數(shù)據(jù)。
若外部信號值在時鐘脈沖邊沿之前發(fā)生變化,則需使用 DCM 或 PLL 延遲時鐘脈沖邊沿,這樣數(shù)據(jù)才能由新的延遲時鐘正確采樣。有一種替代方法,就是在輸入/ 輸出模塊中使用 IDELAY 元件,將數(shù)據(jù)移到時鐘有效的位置上。
一般情況下,提高電路的運行速度可以盡量減少時序違規(guī)的問題。具體總結(jié)如下:
1、通過設置Xilinx ISE軟件在“Implement Design“點擊右鍵,選擇”屬性“選擇”“Optimization Strategy”欄中選擇”speed“以及點擊右鍵選擇”Design Goals and Strategies“選擇”Timing performance“。
2、盡量使用Xilinx公司提高的專用資源,F(xiàn)PGA廠商都提高了一些專用的,比如進位鏈MUX、SRL等。
3、重新分配關鍵路徑
(1) 關鍵路徑在同一Module,這樣綜合時可以獲得最佳的時序效果。
(2) 對關鍵路徑近LOC約束,如果發(fā)現(xiàn)關鍵路徑相關的LUT距離太遠,可以使用floorplanner手工布線。
(3) 復制電路,減少關鍵路徑的扇出。當一個信號網(wǎng)絡所帶的負載越多的時候,他的路徑也會相應的增加,所以通過復制電路,可以有效的減少甚至消除時序違規(guī)的問題。
(4) 在關鍵路徑網(wǎng)絡上插入buffer減少扇出,提高速度,消除時序違規(guī)。
4、 進行特殊約束,通過設置Multi_Cycle_Path意義不大,因為它不會直接對關鍵路徑產(chǎn)生影響,這樣想法顯然不對,因為它可以對非關鍵路徑散開的作用,給關鍵路徑節(jié)約了空間,間接的達到壓縮關鍵路徑延遲的問題,有點“曲線救國“的味道。
5、 通過修改代碼減少邏輯級數(shù)和分割組合邏輯。
注:一般情況下,使用比較多的都是周期約束,專門約束只是針對部分器件可能需要,一般高端FPGA是不需要這個的。
-
FPGA
+關注
關注
1630文章
21799瀏覽量
606196 -
電路
+關注
關注
173文章
5973瀏覽量
173010 -
Xilinx
+關注
關注
71文章
2171瀏覽量
122191 -
布線
+關注
關注
9文章
778瀏覽量
84450 -
時序約束
+關注
關注
1文章
115瀏覽量
13462
原文標題:Xilinx FPGA的約束設計和時序分析總結(jié)
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
FPGA時序約束之衍生時鐘約束和時鐘分組約束
FPGA時序分析如何添加其他約束
FPGA的約束設計和時序分析
FPGA中的時序約束設計
![<b class='flag-5'>FPGA</b>中的<b class='flag-5'>時序</b><b class='flag-5'>約束</b>設計](https://file1.elecfans.com//web2/M00/A6/E9/wKgZomUMQTSAK-f9AABQURI8k0Q349.png)
正點原子FPGA靜態(tài)時序分析與時序約束教程
![正點原子<b class='flag-5'>FPGA</b>靜態(tài)<b class='flag-5'>時序</b><b class='flag-5'>分析</b>與<b class='flag-5'>時序</b><b class='flag-5'>約束</b>教程](https://file.elecfans.com/web1/M00/CE/CD/o4YBAF-rS5iABAFXAADn1A_7I2g634.png)
評論