一般來講,添加約束的原則為先附加全局約束,再補充局部約束,而且局部約束比較寬松。其目的是在可能的地方盡量放松約束,提高布線成功概率,減少ISE 布局布線時間。典型的全局約束包括周期約束和偏移約束。
在添加全局時序約束時,需要根據時鐘頻率劃分不同的時鐘域,添加各自的周期約束;然后對輸入輸出端口信號添加偏移約束,對片內邏輯添加附加約束。
1.周期約束
周期約束是附加在時鐘網路上的基本時序約束,以保證時鐘區域內所有同步組件的時序滿足要求。在分析時序時,周期約束能自動處理寄存器時鐘端的反相問題,如果相鄰的同步元件時鐘相位相反,則其延遲會被自動限制為周期約束值的一半,這其實相當于降低了時鐘周期約束的數值,所以在實際中一般不要同時使用時鐘信號的上升沿和下降沿。
硬件設計電路所能工作的最高頻率取決于芯片內部元件本身固有的建立保持時間,以及同步元件之間的邏輯和布線延遲。所以電路最高頻率由代碼和芯片兩部分共同決定,相同的程序,在速度等級高的芯片上能達到更高的最高工作頻率;同樣,在同一芯片內,經過速度優化的代碼具有更高的工作頻率,在實際中往往取二者的平衡。
在添加時鐘周期之前,需要對電路的期望時鐘周期有一個合理的估計,這樣才不會附加過松或過緊的周期約束,過松的約束不能達到性能要求,過緊的約束會增加布局布線的難度,實現的結果也不一定理想。常用的工程策略是:附加的時鐘周期約束的時長為期望值的90%,即約束的最高頻率是實際工作頻率的110% 左右。
附加時鐘周期約束的方法有兩個:一是簡易方法,二是推薦方法。簡易方式是直接將周期約束附加到寄存器時鐘網線上,其語法如下所示:
[ 約束信號] PERIOD = { 周期長度} {HIGH | LOW} [ 脈沖持續時間];
其中,[] 內的內容為可選項,{} 中的內容為必選項,“|”表示選擇項。[ 約束信號] 可為“Net net_name”或“TIMEGRP group_name”,前者表示周期約束作用到線網所驅動的同步元件上,后者表示約束到TIMEGRP所定義的信號分組上( 如觸發器、鎖存器以及RAM 等)。{ 周期長度} 為要求的時鐘周期,可選用ms、s、ns以及ps 等單位,默認值為ns,對單位不區分大小寫。{HIGH | LOW} 用于指定周期內第一個脈沖是高電平還是低電平。[ 脈沖持續時間] 用于指定第一個脈沖的持續時間,可選用ms、s、ns 以及ps 等單位,默認值為ns,如果缺省該項,則默認為50% 的占空比。如語句:
Net“ clk_100MHz” period = 10ns High 5ns;
指定了信號clk_100MHz 的周期為10ns,高電平持續的時間為5ns,該約束將被添加到信號clk_100MHz所驅動的元件上。
推薦方法常用于約束具有復雜派生關系的時鐘網絡,其基本語法為:
TIMESPEC“ TS_identifier” = PERIOD“ TNM_reference” {周期長度}
{HIGH | LOW} [ 脈沖持續時間];
其中,TIMESPEC 是一個基本時序相關約束,用于標志時序規范?!癟S_identifier”由關鍵字TS 和用戶定義的identifier 表示,二者共同構成一種時序規范,稱為TS 屬性定義,可在約束文件中任意引用,大大地豐富了派生時鐘的定義。在使用時,首先要定義時鐘分組,然后再添加相應的約束,如:
NET“ clk_50MHz” =“ syn_clk”;
TIMESPECT“ TS_syn_clk” = PERIOD“ syn_clk” 20 HIGN 10;
TIMESPEC 利用識別符定義派生時鐘的語法為:
TIMESPEC“ TS_identifier2” = PERIOD“ timegroup_name” “ TS_identifier1”
[* | /] 倍數因子 [+| -] phasevalue [ 單位]
其中,TS_identifier2 是要派生定義的時鐘,TS_identifier1 為已定義的時鐘,“倍數因子”用于給出二者周期的倍數關系,phasevalue 給出二者之間的相位關系。如:
定義系統時鐘clk_syn :
TIMESPEC“ clk_syn” = PERIOD“ clk” 5ns;
下面給出其反相時鐘clk_syn_180 以及2 分頻時鐘clk_syn_half :
TIMESPEC“ clk_syn_180” = PERIOD“ clk_180” clk_syn PHASE + 2.5ns;
TIMESPEC“ clk_syn_180” = PERIOD“ clk_half” clk_syn / 2;
2.偏移約束
偏移約束也是一類基本時序約束,規定了外部時鐘和數據輸入輸出引腳之間的相對時序關系,只能用于端口信號,不能應用于內部信號,包括OFFSET_IN_BEFORE,OFFSET_IN_AFTER,OFFSET_OUT_BEFORE,
OFFSET_OUT_ AFTER 等4 類基本約束。偏移約束的基本語法為:
OFFSET = [IN | OUT]“ offset_time” [units] {BEFORE | AFTER}“ clk_name”
[TIMEGRP“ group_name”];
其中[IN | OUT] 說明約束的是輸入還是輸出?!皁ffset_time”為數據和有效時鐘沿之間的時間差,{BEFORE
| AFTER} 表明該時間差是在有效時鐘之前還是之后,“clk_name”為有效時鐘的名字,[TIMEGRP “group_
name”] 是用戶添加的分組信號,在缺省時,默認為時鐘clk_name 所驅動的所有觸發器。偏移約束通知布局布線器輸入數據的到達時刻,從而可準確調整布局布線的過程,使約束信號建立時間滿足要求。
1)“OFFSET IN”偏移約束
“OFFSET IN ”偏移約束是輸入偏移約束,有OFFSET_IN_AFTER 和OFFSET_IN_BEFORE 兩種,前者定義了輸入數據在有效時鐘到達多長時間后可以到達芯片的輸入管腳,這樣可以得到芯片內部的延遲上限,從而對那些與輸入引腳相連的組合邏輯進行約束;后者定義數據比相應的有效時鐘沿提前多少時間到來,是與其相連的組合邏輯的最大延時,否則在時鐘沿到來時,數據不穩定,會發生采樣錯誤。輸入偏移的時序關系如圖5-10所示。
評論
查看更多