時序約束技巧

2021-03-14 04:17:41 字數 5734 閱讀 1109

一般來講,新增約束的原則為先附加全域性約束,再補充區域性約束,而且區域性約束比較寬鬆。其目的是在可能的地方盡量放鬆約束,提高佈線成功概率,減少ise 布局佈線時間。典型的全域性約束包括週期約束和偏移約束。

在新增全域性時序約束時,需要根據時鐘頻率劃分不同的時鐘域,新增各自的週期約束;然後對輸入輸出埠訊號新增偏移約束,對片內邏輯新增附加約束。

1.週期約束

週期約束是附加在時鐘網路上的基本時序約束,以保證時鐘區域內所有同步元件的時序滿足要求。在分析時序時,週期約束能自動處理暫存器時鐘端的反相問題,如果相鄰的同步元件時鐘相位相反,則其延遲會被自動限制為週期約束值的一半,這其實相當於降低了時鐘週期約束的數值,所以在實際中一般不要同時使用時鐘訊號的上公升沿和下降沿。

硬體設計電路所能工作的最高頻率取決於晶元內部元件本身固有的建立保持時間,以及同步元件之間的邏輯和佈線延遲。所以電路最高頻率由**和晶元兩部分共同決定,相同的程式,在速度等級高的晶元上能達到更高的最高工作頻率;同樣,在同一晶元內,經過速度優化的**具有更高的工作頻率,在實際中往往取二者的平衡。

在新增時鐘週期之前,需要對電路的期望時鐘週期有乙個合理的估計,這樣才不會附加過鬆或過緊的週期約束,過鬆的約束不能達到效能要求,過緊的約束會增加布局佈線的難度,實現的結果也不一定理想。常用的工程策略是:附加的時鐘週期約束的時長為期望值的90%,即約束的最高頻率是實際工作頻率的110% 左右。

附加時鐘週期約束的方法有兩個:一是簡易方法,二是推薦方法。簡易方式是直接將週期約束附加到暫存器時鐘網線上,其語法如下所示:

[ 約束訊號] period = [ 脈衝持續時間];

其中, 內的內容為可選項,{} 中的內容為必選項,「|」表示選擇項。[ 約束訊號] 可為「*** ***_name」或「timegrp group_name」,前者表示週期約束作用到線網所驅動的同步元件上,後者表示約束到timegrp所定義的訊號分組上( 如觸發器、鎖存器以及ram 等)。 為要求的時鐘週期,可選用ms、s、ns以及ps 等單位,預設值為ns,對單位不區分大小寫。

用於指定週期內第乙個脈衝是高電平還是低電平。[ 脈衝持續時間] 用於指定第乙個脈衝的持續時間,可選用ms、s、ns 以及ps 等單位,預設值為ns,如果預設該項,則預設為50% 的占空比。如語句:

***「 clk_100mhz」 period = 10ns high 5ns;

指定了訊號clk_100mhz 的週期為10ns,高電平持續的時間為5ns,該約束將被新增到訊號clk_100mhz

所驅動的元件上。

推薦方法常用於約束具有複雜派生關係的時鐘網路,其基本語法為:

timespec「 ts_identifier」 = period「 tnm_reference」

[ 脈衝持續時間];

其中,timespec 是乙個基本時序相關約束,用於標誌時序規範。「ts_identifier」由關鍵字ts 和使用者定義的identifier 表示,二者共同構成一種時序規範,稱為ts 屬性定義,可在約束檔案中任意引用,大大地豐富了派生時鐘的定義。在使用時,首先要定義時鐘分組,然後再新增相應的約束,如:

***「 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] 「 clk_name」

[timegrp「 group_name」];

其中[in | out] 說明約束的是輸入還是輸出。「offset_time」為資料和有效時鐘沿之間的時間差, 表明該時間差是在有效時鐘之前還是之後,「clk_name」為有效時鐘的名字,[timegrp 「group_

name」] 是使用者新增的分組訊號,在預設時,預設為時鐘clk_name 所驅動的所有觸發器。偏移約束通知布局佈線器輸入資料的到達時刻,從而可準確調整布局佈線的過程,使約束訊號建立時間滿足要求。

1)「offset in」偏移約束

「offset in 」偏移約束是輸入偏移約束,有offset_in_after 和offset_in_before 兩種,前者定義了輸入資料在有效時鐘到達多長時間後可以到達晶元的輸入管腳,這樣可以得到晶元內部的延遲上限,從而對那些與輸入引腳相連的組合邏輯進行約束;後者定義資料比相應的有效時鐘沿提前多少時間到來,是與其相連的組合邏輯的最大延時,否則在時鐘沿到來時,資料不穩定,會發生取樣錯誤。輸入偏移的時序關係如圖5-10所示。

data_in

tin_after tin_before

tpclk_sys

圖5-10 輸入偏移的時序關係

例如:***「 data_in」 offset = in 10.0 before「 clk_50mhz」;

表明在時鐘訊號clk_50mhz 上公升沿到達前的10ns 內,輸入訊號data_in 必須到達資料輸入管腳。

***「 data_in」 offset = in 10.0 after「 clk_50mhz」;

表明在時鐘訊號clk_50mhz 上公升沿到達後的10ns 內,輸入訊號data_in 必須到達資料輸入管腳。

2)「offset out」偏移約束

「offset out」偏移約束是輸出偏移約束,有offset_out_after 和offset_out_before 兩種,前者定義了輸出資料在有效時鐘沿之後多長時間穩定下來,是晶元內部輸出延時的上限;後者定義了在下乙個時鐘訊號到來之前多長時間必須輸出資料,是下一級邏輯建立時間的上限。輸出偏移的時序關係如圖5.3.

11 所示。

q_out

tout_before tout_after

tpclk_sys

圖5-11 輸出偏移的時序關係

例如:***「 data_out」 offset = out 10.0 before「 clk_50mhz」;

表明在時鐘訊號clk_50mhz 上公升沿到達前的10ns 內,輸出訊號data_out 訊號必須離開資料輸出管腳。

***「 data_out」 offset = out 10.0 after「 clk_50mhz」;

表明在時鐘訊號clk_50mhz 上公升沿到達後的10ns 內,輸出訊號data_out 訊號必須一直保持在資料輸

出管腳上。

3.分組約束

分組約束可有效管理大量的觸發器、暫存器和儲存器單元,將其分為不同的組,每組附加各自的約束,在大型設計中有著廣泛的應用。

1)tnm/tnm_*** 約束

tnm/tnm_*** 約束用於選出可構成乙個分組的元件,並對其重新命名,然後整體新增約束。除了ibufg和bufg 外,所有的fpga 內部元件都可以用tnm 來命名,其語法規則為:

「 ob_name」 tnm =「 new_name」;

其中「ob_name」為***、inst 以及pin 的名稱,new_name 為分組的名稱。例如:

48.fpga開發全攻略—工程師創新設計寶典上冊基礎篇

inst ff1 tnm = my_ff1;

nist ff2 tnm = my_ff1;

將例項ff1 與ff2 新增到新分組my_ff1 中。

此外,tnm 語法也支援萬用字元「?」和「*」,提高了在大規模設計中新增分組約束的效率。

當tnm 約束附加**網上時,則該路徑上所有的同步元件都會被新增到分組中,但不會穿過ibufg 元件;

當tnm 約束附加到巨集或原語的管腳上,則被該引腳驅動的所有同步元件會被新增到新分組中;當tnm 約束附

加到原語或巨集上,則將原語或巨集新增到新的分組中。

tnm_*** 約束專門用來完成網線的分組,與tnm 不同的是,tnm 可以穿越ibufg/bufg。因此,如果把tnm 約束新增到埠上,則只能定義該埠;而要是把tnm_*** 新增到埠上,則可穿越bufg,受該埠驅動的所有元件都將被新增到分組中。

2)timegrp 約束

timegrp 用於分組合併和拆分,將多個分組形成乙個新的分組。其合併分組的語法為:

timegrp「 new_group」 =「 old_group1」 「 old_group2」 … ;

其中,new_group 為新建的分組,而old_group1 和old_group2 以及…為要合併的已有分組。

拆分分組的語法為:

timegrp「 new_group」 =「 old_group1」 except「 old_group2」;

其中old_group2 是old_group1 的子集,new_group 為old_group1 中除去old_group2 之外所有的部分。

3)tpsync 約束

tpsync 用於將那些不是管腳和同步元件的元件定義成同步元件,以便可以利用任意點來作為時序規範的

終點和起點。其相應的語法為:

「 ob_name」 tpsync=「 new_part」;

將tpsync 約束附加在網線上,則該網線的驅動源為同步點;附加在同步元件的輸出管腳上,則同步元件

中驅動該管腳的源為同步點;附加在同步元件上,則輸出管腳為同步點;附加在同步元件的輸入管腳上,則該

引腳被定義成同步點。

4)tpthru 約束

tpthru 用於定義乙個或一組路徑上的關鍵點,可使使用者定義出任意期望的路徑。其相應的語法為:

「 ob_name」 tpthru =「 new_name」;

例如,在圖5-12 所示場景中,從a1 到a2 有兩條路徑,其中邏輯1 的延遲很大,需要提取出來完成特定的約束:

邏輯1邏輯2

d od o

a1 to a2_1

a1 to a2_2

a1a2

圖5-12 tpthru約束示例場景

inst「 a1」 tnm =「 s」;

inst「 a2」 tnm =「 e」;

***「 a1toa2_1」 tpthru =「 m」;

timespec「 **e」 = from「 s」 thru「 m」 to「 b」 10;

其中第三句指令利用tpthru 定義了中間點「m」,然後第4 句在此基礎上定義了通過m 點的整條路徑,從兩條平行的路徑中挑出了期望路徑。

4.區域性約束

區域性約束包括from_to 約束、最大延時約束、最大偏移約束、虛假路徑、系統時鐘抖動約束、多週期路徑和多時鐘域約束等。在實際開發中,正如本章前沿所述,時序是設計出來,而不是靠約束自動得到的,因此這裡不再對區域性約束作過多討論。

SPI時序圖詳解

spi介面有四種不同的資料傳輸時序,取決於cpol和cphl這兩位的組合。圖1中表現了這四種時序,時序與cpol cphl的關係也可以從圖中看出。圖1cpol是用來決定sck時鐘訊號空閒時的電平,cpol 0,空閒電平為低電平,cpol 1時,空閒電平為高電平。cpha是用來決定取樣時刻的,cpha...

TFT介面時序說明

先來看tft介面的訊號線,我們以16bit為例,訊號線共5組20根 vd 23 19 vd 15 10 vd 7 3 分別對應r g b分色資訊,乙個16bit的組合代表了乙個象素的資訊。vclk 資料傳輸時鐘,在資料有效的情況下 vm 每個週期傳輸乙個象素的資訊。hsync 行同步訊號,持續若干個...

監督約束機

一 紀委監察審計部是經濟執行的監督部門,負責組織 實施 協調 管理實業公司的經濟執行監督工作,指導所屬單位開展監督活動,業務受上級主管部門 行業協會指導和專項委員會的指導。向紀委書記 總經理匯報工作。二 所屬單位的紀檢監察部門對本單位經濟執行工作實行全過程跟蹤監督,通過日常跟蹤 監察和開展專案履行監...