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