FPGA設計中關于時序約束
關于FPGA設計中,時序約束的定義的總結說明
1.全局時序約束
1.1 PERIOD約束
用于約束同一時間域中同步邏輯單元之間的時序關系,PERIOD約束會自動處理寄存器時鐘端的反相問題,即,如果相鄰同步元件時鐘相位取反,那么它們之間的延時將被默認PERIOD約束值的一半。
NET “net_name” PERIOD = period {HIGH|LOW} [high_or_low_time];
最小時鐘周期的計算: Tclk = Tcko + Tnet +Tlogic + Tsetup - Tclk_skew; 其中,Tcko為從時鐘輸入到DFF輸出端的時鐘輸出時間,Tnet為網線延時,Tlogic為同步元件之間的組合邏輯延時,Tsetup為同步元件的建立時間。
1.2 OFFSET約束
用于約束數據的建立時間和保持時間,主要是輸入PAD到同步單元和同步單元到輸出PAD的時序關系
OFFSET_IN_BEFORE用于定義輸入數據比有效時鐘沿提前多長時間準備好,其芯片內部與輸入引腳相連的組合邏輯的延時不能大于該時間,否則,輸入的數據就達不到要求的建立時間。
OFFSET_IN_AFTER用于定義輸入數據在有效時鐘沿后多長時間到達芯片的輸入引腳,其作用和BEFORE是一樣的,不過BEFORE的時鐘沿是AFTER的下一個沿,如果一起定義的話。
上述約束用于設定在數據輸入時,保證有效時鐘沿到來時,數據已經達到穩(wěn)定。
OFFSET_OUT_AFTER用于定義了輸出數據在有效時鐘沿之后多長時間之內保持穩(wěn)定,其實是定義了輸出的最大的數據保持時間,芯片內部的輸出延時必須小于這個值。
OFFSET_OUT_BEFORE用于定義在下一個時鐘信號到來之前的某個時間,必須輸出數據,以供下一級器件使用。
這些約束用于對設計輸出端的數據輸出進行約束,以滿足下一級器件的建立時間的要求,保證下一級的采樣數據是穩(wěn)定可靠的。
2.特定約束
2.1 FROM_TO約束
用于定義兩個邏輯組之間的時序約束,以及對兩者之間的邏輯和布線延時進行控制,這兩個邏輯組的定義可以是預定義也可以是用戶自己定義。
通常用于約束多周期路徑(Multi-Cycle),時鐘無關的數據路徑,False路徑等。對于組合邏輯和慢速信號邏輯的約束經常使用。
所謂多周期路徑:主要的形式為,寄存器采用同一個時鐘驅動,但是有些寄存器需要用使能信號來進行控制,由于使能信號的頻率較低,所以,在這個路徑的傳輸過程中,存在著多個時鐘周期進行傳輸的情況。
對于這種情況,約束要比全局約束松,可以先進行時鐘周期約束,再對這個路徑進行松綁約束,用FROM-TO。
所謂多時鐘域:主要的形式是寄存器的兩個時鐘完全獨立的,可以先對每個時鐘所驅動的寄存器或分組進行周期約束,然后在對兩個寄存器(分組)進行FROM-TO約束。
2.2 最大延時約束MAXDELAY
用于定義特定網絡上的最大延時,只能定義到網絡上。
2.3 最大偏移約束MAXSKEW
SKEW用于定義同一點驅動的時鐘信號經過路徑傳播之后,到達兩個或多個終點的時間差,這個約束用于定義特定的網線上的偏移不大于某個時間。
2.4 TIG/False路徑約束
用于對不需要約束的路徑(即與約束無關的路徑)進行說明。推薦用這個約束來減少設計中受約束路徑的數量。
對于靜態(tài)時序分析中無法達到要求的情況,即slack為負值的情況,找到關鍵路徑,主要的原因可能是,關鍵路徑本身是一條TIG路徑或是多周期路徑,應該通過修改約束來改進這個問題。如果不是這樣,當延遲值在目標延遲的20%的范圍內,使用synplify 的-improve命令來重新綜合優(yōu)化設計,當超出20%,則需要重新修改設計,比如流水線,FSM或資源共享等方法。
2.5 SYSTEM_JITTER系統時鐘抖動約束
用于定義設計中的系統時鐘抖動的最大值。
3. 分組約束
3.1 TNM和TNM_NET約束
TNM和TNMNET約束都是用于用戶定義新的時序約束分組。兩者的不同是TNM進行分組不可以穿越IBUF和BUFG,而TNM_NET則可以,也就是說,如果用TNM定義一個PADS分組,只能對這個PAD進行約束,而如果使用TNM_NET約束,則會把IBUFG后面的連接網絡都加入到這個約束中來。
TNM_NET約束只能用于網線上,否則被忽略。
{NET|INST|PIN} "object_name(signals_name)" TNM/TNM_NET = predefined_group or "identifier(net_name)";
3.2 TIMEGRP約束
用于使已有的分組合并,構成新的分組,或用排除的方法構成新的分組。已有的分組包括預定義的分組和用戶自己定義產生的分組。
TIMEGRP "newgrp_name" = "grp_name1" "grp_name2";
TIMEGRP "newgrp_name" = "grp_name1" EXCEPT "grp_name2";
定義受時鐘沿控制的觸發(fā)器分組,如RISING或FALLING沿觸發(fā)的分組。
TIMEGRP "newgrp_name" = RISING/FALLING "grp_name1";
定義受門控信號控制的鎖存器分組,如TRANSLO或TRANSHI的電平控制的分組
TIMEGRP "newgrp_name" = TRANSLO/TRANSHI "grp_name1";
3.3 TPTHRU約束
用于定義一個或一組中間點,以便在其它時序約束定義中來進行標識,我認為有點象電路圖中的網絡命名。如下
INST FF1 TNM = "start";
INST FF2 TNM = "endpt";
NET “mynet” TPTHRU= “ABC”;
TIMESPEC “TS_path" = FROM "start" THRU "ABC" TO "endpt" 30;
4.TIMESPEC
TIMESPEC是關于時序約束定義的一個基本時序相關約束,它在時序規(guī)范中作為標識符,表示本約束為時序規(guī)范。
TIMESPEC ”TSidentifier“ = XXXXX XXXXX XXXXXXX
TSidentifier作為時序規(guī)范,成為TS屬性定義。
PERIOD約束,FROM-TO約束等都需要使用這個格式。