<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

常用時序約束介紹之基于ISE的UCF文件語法

電路和微電子考研 ? 來源:CSDN技術社區 ? 2022-12-28 15:18 ? 次閱讀

時序約束是我們對FPGA設計的要求和期望,例如,我們希望FPGA設計可以工作在多快的時鐘頻率下等等。因此,在時序分析工具開始對我們的FPGA設計進行時序分析前,我們必須為其提供相關的時序約束信息。在【時序分析的原理】章節中,我們介紹了很多原理性的東西,而在本章節,我們將為大家介紹在解決具體問題時該如何向時序分析工具表述清楚我們的意圖,從而啟動其強大的邏輯錐求解功能來得出我們所關心的時序分析報告。

當然了,時序分析工具的種類有很多,雖然它們所支持的時序約束語法不盡相同,但主體思想都是一致的。因此,本章節就以Xilinx集成開發環境ISE中自帶的時序分析工具為例,來為大家介紹一些UCF文件中常用的時序約束。(注意,時序分析環節僅僅是用來對FPGA設計的實現進行評估并給出相應的結果報告,它并不會對FPGA設計進行改變。但如果我們在使用諸如ISE、Quarters這樣的集成開發環境時,如果在映射環節還沒開始前就添加一些時序約束信息,則這些編譯器每完成一部分布局布線工作,便會調用相應時序分析工具進行一次時序分析,如果發現分析結果不符合要求,則會返回重來。像這樣,編譯器經過多次反復努力,力求達到時序約束中的要求,從而給我們一種“時序分析改變FPGA實現”的錯覺。因此,如果你想利用ISE做純粹的時序分析,請使用PCF文件,當然語法也會略有不同。)

時序環境約束

在【本篇->基本概念介紹->影響延遲的因素->三種工況】中,我們介紹過環境因素對時序分析的影響。在默認的情況下,ISE自帶的時序分析工具通常會采用最大工況來進行分析,不過我們也可以通過時序環境約束來定義自己想要的環境因素,例如:

TEMPERATURE = 85 C;

VOLTAGE = 0.95 V;

分組時序約束

在介紹描述具體情況的時序約束之前,讓我們先來簡單了解一下ISE所提供的一些基本分組時序約束語法,因為即使你的FPGA設計得再簡單,也總不可能一個元素接一個元素的去添加時序約束吧?如果能夠先建立分組,將有共性的元素劃分到一起,然后再統一添加時序約束,將會極大的簡化我們的工作量。

TNM

TNM是最基本的分組約束語法,其語法定義如下:

{NET|INST|PIN} "net_or_pin_or_inst_name" TNM = [predefined_group] identifier;

可見,TNM的定義起始關鍵字可以有三種——NET(網絡)、INST(實例)、PIN(端口),其中,NET關鍵字用來指明網絡分組,該分組約束會自動包含"net_or_pin_or_inst_name"名稱中指定的那個網絡名下0000000000000000000000000000000000000000000000游所連接的所有元素;INST關鍵字用來指明一個實例,為后續該分組的搜索限制了一個范圍;PIN指的是端口,指明具體某個原語的管腳。

predefined_group是一個可選的參數,不寫明的時候,該分組包含所有可包含的元素;若注明,則該分組只包含[predefined_group]類的元素。針對ISE軟件來說,預先定義好的分組大概有以下這些:

FFS:觸發器組;

RAMs:存儲器組;

LATCHES:鎖存器組;

PADS:焊盤組;

CPUS:處理器組;

HSIOS:高速IO組;

MULTS:乘法器組。

最后identifier指明了該分組的名稱,以供后續語法在調用該分組時使用。

TNM_NET

TNM_NET也是一個基本的分組約束語法,其語法定義如下:

{NET|INST} "net_name" TNM_NET = [predefined_group] identifier;

TNM_NET分組定義語法幾乎與TNM是一樣的,除了兩個區別:

1、TNM_NET只能根據網絡來定義分組;

2、TNM_NET指明的網絡名在選擇分組成員時,可以穿過IBUF、BUFG這樣的原語去往下游擴散,而TNM則不行。因此,通常用TNM_NET來為FPGA芯片的焊盤部分指定分組。

TIMEGRP

TIMEGRP是一個針對分組進行操作的語法關鍵字,我們可以利用該關鍵字對分組求并、求差或者指定時鐘邊沿,例如:

TIMEGRP “ffs123” = “ffs1” “ffs2” “ffs3”; #合并三個分組為一個分組

TIMEGRP “G1D2” = “G1” EXCEPT “G2”; #定義一個包含所有屬于"G1"但不屬于"G2"元素的分組

TIMEGRP “group1”=RISING FFS; #基于FFS分組定義一個敏感時鐘上升沿的分組

TIMEGRP “group2”=FALLING FFS; #基于FFS分組定義一個敏感時鐘下降沿的分組

注意,對ISE的時序分析工具來說,在時序約束信息中,對分組名或信號名等名稱使不使用雙引號都是ok的。另外,UCF文件中的注釋符號為“#”。

常用時序約束

對于FPGA設計來說,常用的時序約束基本上可以被劃分為四種類型,分別介紹如下:

周期約束

周期約束又叫時鐘約束,主要用于給時鐘信號指明相關約束,使用關鍵字PERIOD,其基本語法定義如下:

TIMESPEC "TS_name" = PERIOD "TNM_name"{HIGH|LOW} [high_or_low_time] [INPUT_JITTER value];

其中,TIMESPEC "TS_name"為該周期約束定義了一個標示符,可供其他地方調用。

"TNM_name"指明該周期約束所覆蓋的時序分組。

指明了該周期約束的時鐘周期數值。

{HIGH|LOW}指明了對應時鐘信號在0時刻是以高電平(或上升沿)開始還是以低電平(或下降沿)開始的。

[high_or_low_time]是針對{HIGH|LOW}來說的,指明時鐘信號起始電平的持續時間,類似占空比的概念,因此也可以用百分數來表示,意思是起始電平占整個周期的比例。

[INPUT_JITTER value]則指明了對應時鐘信號存在一定的輸入jitter。

輸入時鐘周期約束

要對一個被輸入時鐘所驅動時鐘域進行時序分析,需要先定義一個需要被分析的分組,然后再使用TIMESPEC語法指定并命名一個周期約束,例如:

NET “clk50MHz” TNM_NET = “clkIn”;

TIMESPEC “TS_clkIn” = PERIOD “clkIn” 20.0 ns HIGH 50%;

上例中的第一句分組約束,將所有clk50MHz端口網絡所連接的元素全部加入到clkIn分組中。而第二句話則指明該時鐘域的時鐘信息,表示定義了一個名為TS_clkIn的周期約束,其內容為針對clkIN時序分組,添加了一個周期為20ns、起始電平為高電平、占空比為50%的周期約束。

當然了,除了使用百分比來指電平占空比參數外,還可直接標明電平持續時間,例如,上例第二句話又可改寫為:

TIMESPEC “TS_clkIn” = PERIOD “clkIn” 20.0 ns HIGH 10.0 ns;

若該時鐘域的時鐘信號還存在著2ns的jitter,則上例第二句話又可改寫為:

TIMESPEC “TS_clkIn” = PERIOD “clkIn” 20 ns HIGH 50% INPUT_JITTER 2 ns;

內部時鐘周期約束

內部時鐘周期約束和輸入時鐘周期約束沒有什么本質的不同,都是將周期約束加入到對應的時鐘網絡上,不過有一點需要特別注意:

輸入時鐘周期約束針對的是輸入時鐘信號,該時鐘信號是通過FPGA的一個輸入管腳引入FPGA內部的,如果我們將該管腳和FPGA頂層實體的輸入端口clk綁定,那么無論是綜合前后、布局布線前后,使用clk這個名稱都能找到對應的時鐘網絡,因為關于這個時鐘輸入端口實在是沒有什么好優化和改名的。

但是,若你要約束一個內部的時鐘信號,若該信號在HDL文件中的名稱為clk25MHz,若你定義了如下分組約束:

NET “clk25MHz” TNM_NET = “innerClk”;

則時序分析工具在進行分析的時候幾乎會百分之百的報告說找不到這個名稱叫做clk25MHz的網絡,因為它幾乎肯定會被優化或改名掉。針對此類情況,通常有三種解決方案:

1、使用ISE自帶時序分析工具的時序約束創建工具創建該時鐘的約束。通常,ISE會分析出其內部具有哪幾個時鐘信號,并會給出每一個時鐘信號的源頭網絡名稱,你可以據此名稱推測出該網絡是不是你HDL代碼中類似clk25MHz名稱對應的時鐘網絡,然后使用該網絡名稱創建分組約束。

2、在綜合的時候使用綜合約束中的keep語法,讓clk25MHz這個網絡名稱不被優化掉。

3、查看綜合、轉換環節后的FPGA設計網表文件,找到clk25MHz可能對應的那個網絡名稱,然后使用該網絡名稱創建分組約束。(閱讀網表的過程可能會很痛苦?。?/p>

當然了,對于一個驗證團隊來說,對于內部時鐘來說,要想添加純時序分析所使用的約束的話,恐怕只有采用方案3了。

關聯時鐘周期約束

關聯時鐘周期約束主要用來應付兩種情況:一、如果兩個時鐘域之間有信息傳遞,且我們想要對此進行時序分析;二、一個時鐘信號本身就是由另一個時鐘信號生成的,兩者之間具有很強的相關性。

例如,對于一個DCM模塊來說,其輸入來自一個叫做clk50MHz的管腳,我們對該時鐘網絡進行周期約束如下:

NET “clk50MHz” TNM_NET = “clkIn”;

TIMESPEC “TS_clkIn” = PERIOD " clkIn" 20 ns HIGH 50%;

如果它有一個同相2倍頻的輸出時鐘,對應網絡名稱叫做clk2x,則對此輸出時鐘所驅動的網絡,我們可以定義時序約束如下:

NET “clk2x” TNM_NET = DCM2xOut;

TIMESPEC TS_DCM2xOut = PERIOD “DCM2xOut” TS_clkIn / 2 HIGH 50%;

而對于該DCM的相移180度的2倍頻輸出時鐘,若其對應網絡名稱叫做clk2x180,則對此輸出時鐘所驅動的網絡,我們可以定義時序約束如下:

NET " clk2x180" TNM_NET = DCM2x180Out;

TIMESPEC TS_DCM2x180Out = PERIOD “DCM2x180Out” TS_clkIn / 2 PHASE 5 ns HIGH 50%;

差分時鐘周期約束

如果輸入時鐘信號是差分的,那么你只需要給差分中的一個端口加上周期約束即可。為了好理解起見,你應該對差分的p端網絡添加一個和差分時鐘相同的周期約束。

輸入約束

輸入約束主要針對同步輸入接口,亦或是針對虛擬出來的同步輸入接口,通過使用“OFFSET = IN”關鍵字,來描述輸入數據與時鐘之間的關系。其基本語法定義如下:

[{TIMEGRP|NET} "iobgroup_or_padnet_name"] OFFSET = IN[units] [VALID] {BEFORE|AFTER} "clk_name" [TIMEGRP "group_name"] {HIGH|LOW};

其中,[{TIMEGRP|NET} “iobgroup_or_padnet_name”]可以為該輸入約束指明一個網絡或者一個分組(注意,這里的網絡必須是連接到pad的網絡,分組也必須是IO block相關的分組),若省略不寫,則該約束的作用范圍是全局的(應用于所有跟時鐘"clk_name"相關的輸入端口)。

是一個相對于所依賴時鐘初始邊沿的數據到來偏移量。當然了,具體該時鐘的初始邊沿是上升沿還是下降沿,則要追朔到該時鐘相關的周期約束上,通過該周期約束的使用的是HIGH、LOW關鍵字中的哪一個來判斷。

[VALID ]給出了數據信號的穩定周期,即在的基礎上,保持穩定時間為。

{BEFORE|AFTER}則指出了該條約束中描述的有效數據是應該被當前時鐘事件所采集還是應該被后續時鐘事件所采集的。如果使用了BEFORE關鍵字,則表示數據有效開始是以要采集它的時鐘事件為基礎,給出一個提前量的;如果使用了AFTER關鍵字,則表示數據有效開始是以前一個時鐘事件為基礎,給出一個滯后量的。當然了,本身也可以是負值,而具體使用哪一個關鍵字,完全看個人的描述習慣,它們之間沒有任何本質的不同。

"clk_name"指明了該輸入約束是相對于哪一個時鐘事件的初始邊沿來說的。

[TIMEGRP “group_name”]為該約束指明了一個需要分析的內部分組,省略不寫則表示所有跟當前時鐘采集有關的元素。

{HIGH|LOW}則用來改寫"clk_name"的初始邊沿的,它可以改變周期約束對"clk_name"相關初始邊沿的設定,HIGH、LOW分別表示的是將時鐘上升沿、下降沿設定為0時刻的初始邊沿。

SDR輸入約束

SDR的概念請回顧【程序設計篇->編程思路->關于外接接口的編程思路->按時鐘特性分類->同步接口->SDR】小節。

既然是同步接口,那么我們必須首先為同步時鐘定義一個周期約束,例如:

NET “clk” TNM_NET = clk50MHz;

TIMESPEC TS_clk = PERIOD “clk50MHz” 20 ns HIGH 50%;

那么,下面就可以基于該時鐘來使用“OFFSET = IN”語法表明該SDR接口在輸入的時候數據與時鐘之間的關系。例如:

OFFSET = IN 10 ns VALID 20 ns BEFORE clk;

由于本條語句沒有指名具體的輸入端口,因此它的作用是全局的,即所有跟clk時鐘采集相關的輸入端口。但是,若不同的數據端口與時鐘之間的關系有所不同的話,則需要單獨為每一個輸入端口指明輸入約束,例如:

NET “dIn<0>” OFFSET = IN 20 ns VALID 20 ns BEFORE “clk”;

NET “dIn<1>” OFFSET = IN 10 ns VALID 20 ns BEFORE “clk”;

如果有多個輸入端口和時鐘信號具有同樣的關系,則可使用分組的形式去定義輸入約束,例如:

NET “dIn<0>” TNM = dInG;

NET “dIn<1>” TNM = dInG;

TIMEGRP “dInG” OFFSET = IN 20 ns VALID 20 ns BEFORE “clk”;

DDR輸入約束

DDR的概念請回顧【程序設計篇->編程思路->關于外接接口的編程思路->按時鐘特性分類->同步接口->DDR】小節。

類似的,既然是同步接口,那么我們必須首先為同步時鐘定義一個周期約束,例如:

NET “clk” TNM_NET = clk50MHz;

TIMESPEC TS_clk = PERIOD “clk50MHz” 20 ns HIGH 50%;

那么,下面就是一種基于該時鐘來使用“OFFSET = IN”語法表明該DDR接口在輸入的時候數據與時鐘之間關系的方法,例如:

OFFSET = IN 5 ns VALID 10 ns BEFORE “clk” RISING;

OFFSET = IN 5 ns VALID 10 ns BEFORE “clk” FALLING;

這兩行語法說明兩個時鐘邊沿都分別對應其所需要采樣數據的中間。注意,上例中多了兩個關鍵字RISING和FALLING,它們不光可以用來指明offset time為5ns,到底是相對于時鐘網絡clk的上升沿來說還是下降沿來說,更重要的是,它們可以指明,該條輸入約束的作用范圍——RISING代表分析所有在上升沿被采樣的輸入分組,FALLING代表分析所有在下降沿被采樣的輸入分組。正因為如此,雖然這兩條語句針對的輸入端口都是一樣的,但是它們并沒有被互相覆蓋。例如,如果我們想當然的將RISING、FALLING關鍵字替換為HIGH、LOW關鍵字如下:

OFFSET = IN 5 ns VALID 10 ns BEFORE “clk” HIGH; #Wrong for DDR

OFFSET = IN 5 ns VALID 10 ns BEFORE “clk” LOW; #Wrong for DDR

則,由于上述兩條語句針對的都是一樣的分組(所有跟clk相關的輸入元素),因此誰寫在前面誰就會被后面的語句覆蓋掉。

也正是因為RISING和FALLING這樣的一個分組特性,所以如果在SDR接口中,內部邏輯本身是上升沿敏感的,但如果你用FALLING來指明數據、時鐘之間的位置關系,時序分析工具將會告訴你0條路徑、0個端口等等被分析。此時,如果你執意要以下降沿來作為參考邊沿的話,請使用LOW關鍵字。

為DDR接口添加時序約束的另一種方法是使用內部分組,例如,為了實現與第一種方法相同的約束,可以先定義兩個分組分別對應上升沿敏感的元素和下降沿敏感的元素,然后分別為其指明輸入約束,描述如下:

TIMEGRP “ClkIn_Rising” = RISING “clk50MHz”;

TIMEGRP “ClkIn_Falling” = FALLING “clk50MHz”;

OFFSET = IN 5 ns VALID 10 ns BEFORE clk TIMEGRP ClkIn_Rising;

OFFSET = IN -5 ns VALID 10 ns BEFORE clk TIMEGRP ClkIn_Falling;

為了進一步明確OFFSET語法中前后兩個TIMEGRP用意的不同,下面給出如果要對一個兩位寬的dIn輸入端口添加DDR約束的例子:

NET “dIn<0>” TNM = dInG;

NET “dIn<1>” TNM = dInG;

TIMEGRP “ClkIn_Rising” = RISING “clk50MHz”;

TIMEGRP “ClkIn_Falling” = FALLING “clk50MHz”;

TIMEGRP “dInG” OFFSET = IN 5 ns VALID 10 ns BEFORE clk TIMEGRP ClkIn_Rising;

TIMEGRP “dInG” OFFSET = IN -5 ns VALID 10 ns BEFORE clk TIMEGRP ClkIn_Falling;

MDR輸入約束

MDR的概念請回顧【程序設計篇->編程思路->關于外接接口的編程思路->按時鐘特性分類->同步接口->MDR】小節。

類似的,既然是同步接口,那么我們必須首先為同步時鐘定義一個周期約束,例如:

NET “clk” TNM_NET = clk50MHz;

TIMESPEC TS_clk = PERIOD “clk50MHz” 20 ns HIGH 50%;

由于MDR在實際接收時,往往還是通過SDR或者DDR的模式去進行數據接收,因此,如果實際采用的是SDR模式,則我們只需要采樣對一個數據即可連續采集對所有的數據;而如果實際采用的是DDR模式,則我們只需要采樣對連續兩個數據即可連續采集對所有的數據。

那么,接下來以時鐘數據比為1:4,數據變化沿對齊時鐘變化沿的MDR為例,看看該如何應對其輸入約束的描述:

首先,來看看SDR模式實現MDR采樣。如果內部使用DCM(或者PLL),生成一個4倍頻、同相的時鐘信號,網絡名為clk4x,則我們應該首先添加關于該生成時鐘的周期約束如下:

NET “clk4x” TNM_NET = DCM4xOut;

TIMESPEC TS_ DCM4xOut = PERIOD “DCM4xOut” TS_clk / 4 HIGH 50%;

那么,由于clk4x與clk是相關時鐘,所以時序分析工具會自動分析其跨時鐘域的問題,故只需要基于clk給出一個數據采樣的輸入約束如下即可:

OFFSET = IN 5 ns VALID 5 ns BEFORE clk;

事實上,由于UCF文件是在布局布線前添加給ISE的,因此ISE會在編譯的時候自動為DCM或PLL的輸出生成關聯周期約束,所以關于clk4x的周期約束可省略。

接下來,再看看DDR模式實現MDR采樣。此時,由于具體完成采樣的時鐘并不是clk,所以不能采用【DDR輸入約束】小節中的方法一。但若要采用方法二,必須建立關于具體采樣時鐘的兩個邊沿分組。因此,先為DCM的輸出pin腳添加關聯時鐘約束如下:

PIN “instance_name/DCM_ADV_INST.CLK2X” TNM_NET = clk100MHz;

TIMESPEC TS_clk100MHz = PERIOD “clk100MHz” TS_clk / 2 HIGH 50%;

然后才能定義DDR采樣時鐘的兩個分組如下:

TIMEGRP “Clk2x_Rising” = RISING “clk100MHz”;

TIMEGRP “Clk2x_Falling” = FALLING “clk100MHz”;

最后,基于clk信號描述連續的兩個采樣并關聯到上述兩個分組中即可:

OFFSET = IN 5 ns VALID 5 ns BEFORE clk TIMEGRP Clk2x_Rising;

OFFSET = IN -5 ns VALID 5 ns BEFORE clk TIMEGRP Clk2x_Falling;

事實上,由于UCF文件是在布局布線前添加給ISE的,因此ISE會在編譯的時候自動為DCM或PLL的輸出生成關聯周期約束,所以下面這句話可省略:

TIMESPEC TS_clk100MHz = PERIOD “clk100MHz” TS_clk / 2 HIGH 50%;

差分輸入約束

如果接口的輸入數據是差分形式的,那么你需要在創建輸入分組的時候把它們都加進去,然后一起添加輸入約束即可。

組間約束

組間約束通過使用“FROM……TO”關鍵字,來對兩時序分組之間的延遲給出限制描述。其基本語法定義如下:

TIMESPEC “TS_name”=FROM “group1” TO “group2” [DATAPATHONLY];

其中,

TIMESPEC "TS_name"為該路徑約束定義了一個標示符,可供其他地方調用。

group1為路徑起始端組。

group2 為路徑目的端組。

指明組間延遲的最大允許范圍。你無須指明最小允許范圍,因為時序分析工具會自動為你報出起始端組和目的端組之間的最大、最小時間差。

[DATAPATHONLY]是可選參數,給出則表示當前組間約束將不考慮時鐘skew、相位差等影響,而只考慮組間的數據路徑延遲。

焊盤到焊盤路徑約束

當FPGA設計中有不可拆解的純組合邏輯接口時,就存在從芯片焊盤到焊盤的時序路徑,此時,焊盤到焊盤的路徑約束就會生效??梢灾苯邮褂妙A定義組PADS來對所有焊盤到焊盤的路徑進行時序約束,描述如下:

TIMESPEC “TS_P2P” = FROM “PADS” TO “PADS” 20 ns;

此時,DATAPATHONLY關鍵字有沒有都無所謂,因為焊盤到焊盤本身就是純數據路徑延遲。如果要對不同的焊盤之間添加不同的焊盤到焊盤的路徑約束,則需要先創建自定義的起始焊盤組和目的焊盤組,然后再添加約束,例如:

TIMEGRP “dInG” = PADS(“a” “b”);

TIMEGRP “dOutG” = PADS(“c”);

TIMESPEC “TS_AB2C” = FROM “dInG” TO “dOutG” 20 ns;

多周期路徑約束

在周期性約束的作用下,時序分析工具會認為該時鐘域內寄存器的輸出在每個時鐘事件的到來都會發生變化,因此,理想情況下每個寄存器的保持時間均為一個時鐘周期??捎袝r候,FPGA設計的功能特征決定前級寄存器需要經歷很多個時鐘周期后才會發生一次變化,這樣一來,如果僅僅對該時鐘域添加周期約束,顯然對這部分電路是過約束了。如果這部分電路的邏輯比較簡單,過約束并不會帶來什么大問題;但如果這部分電路的邏輯比較復雜,過約束很可能會導致時序分析的時候不通過。因此,為了能夠正確的對這部分邏輯添加時序約束,需要要使用多周期路徑約束,例如如下描述:

NET “clk” TNM_NET = clk50MHz;

TIMESPEC TS_clk50MHz = PERIOD “clk50MHz” 20 ns HIGH 50%;

INST "b1" TNM = gb1;

INST "b2" TNM = gb2;

TIMESPEC TS_MultiPath = FROM gb1 TO gb2 TS_clk50MHz * 2;

在時序約束里,通常更為具體的約束比更為廣泛的約束優先級要高,因此,雖然上例在最開始已經給所有clk50MHz分組添加了周期約束,但后續的多周期路徑約束將b1、b2之間的周期約束改為2倍的多周期路徑約束。

跨時鐘域路徑約束

如果兩個時鐘之間并不相關,默認情況下,時序分析工具是不會對這種跨時鐘域情況進行分析的。但當它們之間又確實有著信息傳遞,而你又關心其間的一些時間延遲時,可以使用跨時鐘域路徑約束。例如如下描述:

NET “clk1” TNM_NET = clkA1;

TIMESPEC TS_clkA1 = PERIOD “clkA1” 20 ns HIGH 50%;

NET “clk2” TNM_NET = clkA2;

TIMESPEC TS_clkA2 = PERIOD “clkA2” 15 ns HIGH 50%;

TIMESPEC TS_CCR = FROM clkA1 TO clkA2 10 ns;

上例中的兩條周期約束描述可省略,寫明只是為了說明這兩個時鐘確實是無關的。如果只關心兩個時鐘域之間的數據路徑延遲的話,可以將上例中的跨時鐘域路徑約束改為:

TIMESPEC TS_CCR = FROM clkA1 TO clkA2 10 ns DATAPATHONLY;

這樣時序分析工具在分析的時候就不會考慮時鐘skew等因素了,即便clk1、clk2是相關時鐘。

跨時鐘域忽略約束

如果兩個時鐘之間確實是相關的,例如DCM或者PLL的多個輸出和它們的輸入、一個時鐘信號的上升沿和下降沿等,但我們又不希望時序分析工具對它們之間進行跨時鐘域分析,此時可以使用跨時鐘域忽略約束。例如如下描述:

NET “clk1” TNM_NET = clkA1;

TIMESPEC TS_clkA1 = PERIOD “clkA1” 20 ns HIGH 50%;

NET “clk2” TNM_NET = clkA2;

TIMESPEC TS_clkA2 = PERIOD “clkA2” TS_clkA1/2 HIGH 50%;

TIMESPEC TS_FastPath = FROM clkA1 TO clkA2 TIG;

上例中,通過在組間約束中使用TIG關鍵字,可以讓時序分析工具不去分析從clkA1到clkA2的組間延遲。如果希望也不要分析從clkA2到clkA1的組間延遲,則還需要再添加一句描述如下:

TIMESPEC TS_FastPath = FROM clkA2 TO clkA1 TIG;

如果只是希望對兩個時鐘域之間的某一部分信號傳遞進行忽略,則可以先定義分組,然后再使用跨時鐘域忽略約束。承接上例,如果希望忽略clk1時鐘域中的aLock到clk2時鐘域中c之間的跨時鐘域分析,可描述如下:

INST “aLock” TNM = ta;

INST “c” TNM = tc;

TIMESPEC TS_FastPath = FROM ta TO tc TIG;

路徑中間點約束

有時候,你關心的可能不僅僅是兩個時序分組之間的全部路徑延遲中的最大、最小情況,而是關心通過某一個中繼點或組的兩個時序分組之間的路徑延遲中的最大、最小情況。此時,可以使用THRU關鍵字指明該中繼分組。例如如下描述:

NET “a_3_IBUF” TPTHRU = “ta”;

TIMESPEC “TS_P2P” = FROM “PADS” THRU “ta” TO “PADS” 20 ns;

上例只分析那些焊盤到焊盤之間經過ta分組的路徑延遲情況。

輸出約束

輸出約束主要針對輸出接口,通過使用“OFFSET = OUT”關鍵字,實現對輸出接口的一些基本時序要求描述,它的基本語法定義如下:

[{TIMEGRP|NET} “iobgroup_or_padnet_name”] OFFSET = OUT[units] {BEFORE|AFTER} “clk_name” [TIMEGRP “group_name”] {HIGH|LOW};

其中,

[{TIMEGRP|NET} “iobgroup_or_padnet_name”]可以為該輸出約束指明一個網絡或者一個分組(注意,這里的網絡必須是連接到pad的網絡,分組也必須是IO block相關的分組),若省略不寫,則該約束的作用范圍是全局的(應用于所有被時鐘"clk_name"相關的輸出端口)。

"clk_name"指明了該輸出約束是相對于哪一個時鐘事件的初始邊沿來說的,注意,"clk_name"是一個輸入時鐘的名稱,而不是輸出時鐘的名稱,更確切的說,它是該約束所針對輸出端口在FPGA內部所連接寄存器的驅動時鐘。

{BEFORE|AFTER} 、[TIMEGRP “group_name”]、{HIGH|LOW}與輸入約束解釋相同。

可見,ISE的輸出約束不太智能,通過使用“OFFSET = OUT”關鍵字,只能描述輸出端口相對于其輸出寄存器驅動時鐘之間的時間延遲是否能夠滿足一些基本要求,因此對于同步輸出接口,ISE自帶的時序分析工具不能直接給出分析結果。下面就來介紹一下該如何利用時序分析工具間接得到同步輸出端口的時序報告。

直接同步輸出約束

直接同步輸出對應于【本篇->時序分析的原理->其他常見邏輯情形的應對方法->純輸出接口->純同步輸出接口】小節中描述的情況??梢?,對于此類接口,ISE只能采用該小節中介紹的第三點方法來進行應對。即首先通過功能仿真獲得clk與D信號在理想情況下的關系,然后再分別獲取clk、D信號實際輸出時的最大、最小延遲,然后人工計算得出針對該同步輸出接口的時序分析結果。

如果內部時鐘的周期約束如下:

NET “innerClk” TNM_NET = innerClk;

TIMESPEC TS_innerClk = PERIOD “innerClk” 20 ns HIGH 50%;

則,對于該同步輸出接口,我們需要先定義針對數據D的輸出約束,類似如下:

NET “D<0>” TNM = gDout;

NET “D<1>” TNM = gDout;

NET “D<2>” TNM = gDout;

NET “D<3>” TNM = gDout;

NET “D<4>” TNM = gDout;

NET “D<5>” TNM = gDout;

NET “D<6>” TNM = gDout;

NET “D<7>” TNM = gDout;

TIMEGRP “gDout” OFFSET = OUT 20 ns AFTER “innerClk”;

然后,再參考【組間約束中->焊盤到焊盤路徑約束】小節中的方法,對innerClk與clk之間進行約束,類似如下:

TIMEGRP “gClkIn” = PADS(“innerClk”);

TIMEGRP “gClkOut” = PADS(“clk”);

TIMESPEC “TS_C2C” = FROM “gClkIn” TO “gClkOut” 20 ns;

這樣,時序分析工具會報出D、clk相對于0時刻innerClk邊沿的最大、最小延遲,最后結合功能仿真的情況即可人工得出該直接同步輸出接口的時序分析報告。

間接同步輸出約束

間接同步輸出對應于【本篇->時序分析的原理->其他常見邏輯情形的應對方法->純輸出接口->異步生成同步輸出】小節中描述的情況。

間接同步輸出與直接同步輸出的應對方法類似,唯一的不同就在于輸出時鐘clk相對于innerClk來說也是一個數據。因此,只需要將【直接同步輸出約束】小節中,關于innerClk與clk之間的組間約束改為輸出約束即可。類似如下:

NET “clk” TNM = gCout;

TIMEGRP “gCout” OFFSET = OUT 20 ns AFTER “innerClk”;

這樣,時序分析工具會報出D、clk相對于0時刻innerClk邊沿的最大、最小延遲,最后結合功能仿真的情況即可人工得出該間接同步輸出接口的時序分析報告。

差分輸出約束

如果接口的輸出數據是差分形式的,那么你需要在創建輸出分組的時候把它們都加進去,然后一起添加輸出約束即可。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1610

    文章

    21374

    瀏覽量

    595031
  • 時序分析
    +關注

    關注

    2

    文章

    126

    瀏覽量

    22500
  • ISE
    ISE
    +關注

    關注

    1

    文章

    100

    瀏覽量

    36034
  • 時序約束
    +關注

    關注

    1

    文章

    113

    瀏覽量

    13366
  • UCF
    UCF
    +關注

    關注

    0

    文章

    9

    瀏覽量

    9580

原文標題:【科普】常用時序約束介紹之基于ISE的UCF文件語法

文章出處:【微信號:feifeijiehaha,微信公眾號:電路和微電子考研】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FPGA時序約束之偽路徑和多周期路徑

    前面幾篇FPGA時序約束進階篇,介紹常用主時鐘約束、衍生時鐘約束、時鐘分組
    發表于 06-12 17:33 ?1183次閱讀

    Xilinx FPGA編程技巧常用時序約束詳解

    今天給大俠帶來Xilinx FPGA編程技巧常用時序約束詳解,話不多說,上貨。 基本的約束方法為了保證成功的設計,所有路徑的時序要求
    發表于 04-12 17:39

    Xilinx FPGA編程技巧常用時序約束詳解

    今天給大俠帶來Xilinx FPGA編程技巧常用時序約束詳解,話不多說,上貨。 基本的約束方法 為了保證成功的設計,所有路徑的時序要求
    發表于 05-06 15:51

    請教ISE ucf約束文件錯誤

    Xilinx ISE Design Suite 12.3器件是XC5VLX220管腳約束文件這句話出錯:NET "cina[0]"LOC = "G17"
    發表于 09-23 09:53

    【FPGA學習】如何使用 ISE 編寫約束文件

    原理圖實現的頂層模塊為例),如圖 3-55 所示。單擊 Next 按鈕,再單擊Finish 按鈕就完成了約束文件的創建。(2)對約束文件進行編輯。I
    發表于 09-29 09:18

    UCF中的時序約束在組合設計中被忽略了?

    xc6slx75-3fgg676設備中實現順利(23%切片利用率)但是我不能在UCF文件中使用FROM ... TO約束來優化組合pad-to-pad傳播。 UCF看起來像這樣:NET
    發表于 10-10 11:03

    怎么通過時序約束來改進UCF

    大家好,我想通過添加時序約束(OFFSET IN&amp; OFFSET OUT)來改進我的UCF。實際上在我的TOP級模塊中有雙向總線。我如何能夠將數據總線的約束類型設置為“inou
    發表于 04-15 10:24

    ISE時序約束

    ISE時序約束:What effects do timing constraints have on your project?• The implementation tools do
    發表于 01-11 08:54 ?87次下載

    時序約束時序分析 ppt教程

    時序約束時序分析 ppt教程 本章概要:時序約束時序分析基礎
    發表于 05-17 16:08 ?0次下載

    Xilinx FPGA編程技巧常用時序約束介紹

    Xilinx FPGA編程技巧常用時序約束介紹,具體的跟隨小編一起來了解一下。
    的頭像 發表于 07-14 07:18 ?4253次閱讀
    Xilinx FPGA編程技巧<b class='flag-5'>常用時序</b><b class='flag-5'>約束</b><b class='flag-5'>介紹</b>

    賽靈思(Xilinx)FPGA用戶約束文件的分類和語法說明

    FPGA設計中的約束文件有3類:用戶設計文件(.UCF文件)、網表約束
    發表于 02-11 06:33 ?1494次閱讀

    ISE約束導入vivado總共分幾步

    最近有些朋友在ISE中做的V7項目需要切換到vivado來,但導入代碼后,導入約束時,發現vivado不再支持UCF文件,如果手抄UCF
    發表于 03-24 13:54 ?8631次閱讀
    <b class='flag-5'>ISE</b><b class='flag-5'>約束</b>導入vivado總共分幾步

    具體介紹ISE中通過編輯UCF文件來對FPGA設計進行約束

    本文主要通過一個實例具體介紹ISE中通過編輯UCF文件來對FPGA設計進行約束,主要涉及到的約束
    發表于 11-24 19:59 ?2846次閱讀
    具體<b class='flag-5'>介紹</b><b class='flag-5'>ISE</b>中通過編輯<b class='flag-5'>UCF</b><b class='flag-5'>文件</b>來對FPGA設計進行<b class='flag-5'>約束</b>

    通過一個實例具體介紹ISE中通過編輯UCF文件來對FPGA設計進行約束

    摘要:本文主要通過一個實例具體介紹ISE中通過編輯UCF文件來對FPGA設計進行約束,主要涉及到的約束
    發表于 11-25 01:27 ?4913次閱讀
    通過一個實例具體<b class='flag-5'>介紹</b><b class='flag-5'>ISE</b>中通過編輯<b class='flag-5'>UCF</b><b class='flag-5'>文件</b>來對FPGA設計進行<b class='flag-5'>約束</b>

    FPGA約束的詳細介紹

    設計能否滿足時序。主要涉及到xilinx vivado xdc約束語法,給出對應的ISE ucf 語法
    發表于 06-25 09:14 ?6487次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>