時(shí)序約束是我們對(duì)FPGA設(shè)計(jì)的要求和期望,例如,我們希望FPGA設(shè)計(jì)可以工作在多快的時(shí)鐘頻率下等等。因此,在時(shí)序分析工具開始對(duì)我們的FPGA設(shè)計(jì)進(jìn)行時(shí)序分析前,我們必須為其提供相關(guān)的時(shí)序約束信息。在【時(shí)序分析的原理】章節(jié)中,我們介紹了很多原理性的東西,而在本章節(jié),我們將為大家介紹在解決具體問題時(shí)該如何向時(shí)序分析工具表述清楚我們的意圖,從而啟動(dòng)其強(qiáng)大的邏輯錐求解功能來得出我們所關(guān)心的時(shí)序分析報(bào)告。
當(dāng)然了,時(shí)序分析工具的種類有很多,雖然它們所支持的時(shí)序約束語法不盡相同,但主體思想都是一致的。因此,本章節(jié)就以Xilinx集成開發(fā)環(huán)境ISE中自帶的時(shí)序分析工具為例,來為大家介紹一些UCF文件中常用的時(shí)序約束。(注意,時(shí)序分析環(huán)節(jié)僅僅是用來對(duì)FPGA設(shè)計(jì)的實(shí)現(xiàn)進(jìn)行評(píng)估并給出相應(yīng)的結(jié)果報(bào)告,它并不會(huì)對(duì)FPGA設(shè)計(jì)進(jìn)行改變。但如果我們?cè)谑褂弥T如ISE、Quarters這樣的集成開發(fā)環(huán)境時(shí),如果在映射環(huán)節(jié)還沒開始前就添加一些時(shí)序約束信息,則這些編譯器每完成一部分布局布線工作,便會(huì)調(diào)用相應(yīng)時(shí)序分析工具進(jìn)行一次時(shí)序分析,如果發(fā)現(xiàn)分析結(jié)果不符合要求,則會(huì)返回重來。像這樣,編譯器經(jīng)過多次反復(fù)努力,力求達(dá)到時(shí)序約束中的要求,從而給我們一種“時(shí)序分析改變FPGA實(shí)現(xiàn)”的錯(cuò)覺。因此,如果你想利用ISE做純粹的時(shí)序分析,請(qǐng)使用PCF文件,當(dāng)然語法也會(huì)略有不同。)
時(shí)序環(huán)境約束
在【本篇->基本概念介紹->影響延遲的因素->三種工況】中,我們介紹過環(huán)境因素對(duì)時(shí)序分析的影響。在默認(rèn)的情況下,ISE自帶的時(shí)序分析工具通常會(huì)采用最大工況來進(jìn)行分析,不過我們也可以通過時(shí)序環(huán)境約束來定義自己想要的環(huán)境因素,例如:
TEMPERATURE = 85 C;
VOLTAGE = 0.95 V;
分組時(shí)序約束
在介紹描述具體情況的時(shí)序約束之前,讓我們先來簡(jiǎn)單了解一下ISE所提供的一些基本分組時(shí)序約束語法,因?yàn)榧词鼓愕腇PGA設(shè)計(jì)得再簡(jiǎn)單,也總不可能一個(gè)元素接一個(gè)元素的去添加時(shí)序約束吧?如果能夠先建立分組,將有共性的元素劃分到一起,然后再統(tǒng)一添加時(shí)序約束,將會(huì)極大的簡(jiǎn)化我們的工作量。
TNM
TNM是最基本的分組約束語法,其語法定義如下:
{NET|INST|PIN} "net_or_pin_or_inst_name" TNM = [predefined_group] identifier;
可見,TNM的定義起始關(guān)鍵字可以有三種——NET(網(wǎng)絡(luò))、INST(實(shí)例)、PIN(端口),其中,NET關(guān)鍵字用來指明網(wǎng)絡(luò)分組,該分組約束會(huì)自動(dòng)包含"net_or_pin_or_inst_name"名稱中指定的那個(gè)網(wǎng)絡(luò)名下0000000000000000000000000000000000000000000000游所連接的所有元素;INST關(guān)鍵字用來指明一個(gè)實(shí)例,為后續(xù)該分組的搜索限制了一個(gè)范圍;PIN指的是端口,指明具體某個(gè)原語的管腳。
predefined_group是一個(gè)可選的參數(shù),不寫明的時(shí)候,該分組包含所有可包含的元素;若注明,則該分組只包含[predefined_group]類的元素。針對(duì)ISE軟件來說,預(yù)先定義好的分組大概有以下這些:
FFS:觸發(fā)器組;
RAMs:存儲(chǔ)器組;
LATCHES:鎖存器組;
PADS:焊盤組;
HSIOS:高速IO組;
MULTS:乘法器組。
最后identifier指明了該分組的名稱,以供后續(xù)語法在調(diào)用該分組時(shí)使用。
TNM_NET
TNM_NET也是一個(gè)基本的分組約束語法,其語法定義如下:
{NET|INST} "net_name" TNM_NET = [predefined_group] identifier;
TNM_NET分組定義語法幾乎與TNM是一樣的,除了兩個(gè)區(qū)別:
1、TNM_NET只能根據(jù)網(wǎng)絡(luò)來定義分組;
2、TNM_NET指明的網(wǎng)絡(luò)名在選擇分組成員時(shí),可以穿過IBUF、BUFG這樣的原語去往下游擴(kuò)散,而TNM則不行。因此,通常用TNM_NET來為FPGA芯片的焊盤部分指定分組。
TIMEGRP
TIMEGRP是一個(gè)針對(duì)分組進(jìn)行操作的語法關(guān)鍵字,我們可以利用該關(guān)鍵字對(duì)分組求并、求差或者指定時(shí)鐘邊沿,例如:
TIMEGRP “ffs123” = “ffs1” “ffs2” “ffs3”; #合并三個(gè)分組為一個(gè)分組
TIMEGRP “G1D2” = “G1” EXCEPT “G2”; #定義一個(gè)包含所有屬于"G1"但不屬于"G2"元素的分組
TIMEGRP “group1”=RISING FFS; #基于FFS分組定義一個(gè)敏感時(shí)鐘上升沿的分組
TIMEGRP “group2”=FALLING FFS; #基于FFS分組定義一個(gè)敏感時(shí)鐘下降沿的分組
注意,對(duì)ISE的時(shí)序分析工具來說,在時(shí)序約束信息中,對(duì)分組名或信號(hào)名等名稱使不使用雙引號(hào)都是ok的。另外,UCF文件中的注釋符號(hào)為“#”。
常用時(shí)序約束
對(duì)于FPGA設(shè)計(jì)來說,常用的時(shí)序約束基本上可以被劃分為四種類型,分別介紹如下:
周期約束
周期約束又叫時(shí)鐘約束,主要用于給時(shí)鐘信號(hào)指明相關(guān)約束,使用關(guān)鍵字PERIOD,其基本語法定義如下:
TIMESPEC "TS_name" = PERIOD "TNM_name"{HIGH|LOW} [high_or_low_time] [INPUT_JITTER value];
其中,TIMESPEC "TS_name"為該周期約束定義了一個(gè)標(biāo)示符,可供其他地方調(diào)用。
"TNM_name"指明該周期約束所覆蓋的時(shí)序分組。
指明了該周期約束的時(shí)鐘周期數(shù)值。
{HIGH|LOW}指明了對(duì)應(yīng)時(shí)鐘信號(hào)在0時(shí)刻是以高電平(或上升沿)開始還是以低電平(或下降沿)開始的。
[high_or_low_time]是針對(duì){HIGH|LOW}來說的,指明時(shí)鐘信號(hào)起始電平的持續(xù)時(shí)間,類似占空比的概念,因此也可以用百分?jǐn)?shù)來表示,意思是起始電平占整個(gè)周期的比例。
[INPUT_JITTER value]則指明了對(duì)應(yīng)時(shí)鐘信號(hào)存在一定的輸入jitter。
輸入時(shí)鐘周期約束
要對(duì)一個(gè)被輸入時(shí)鐘所驅(qū)動(dòng)時(shí)鐘域進(jìn)行時(shí)序分析,需要先定義一個(gè)需要被分析的分組,然后再使用TIMESPEC語法指定并命名一個(gè)周期約束,例如:
NET “clk50MHz” TNM_NET = “clkIn”;
TIMESPEC “TS_clkIn” = PERIOD “clkIn” 20.0 ns HIGH 50%;
上例中的第一句分組約束,將所有clk50MHz端口網(wǎng)絡(luò)所連接的元素全部加入到clkIn分組中。而第二句話則指明該時(shí)鐘域的時(shí)鐘信息,表示定義了一個(gè)名為TS_clkIn的周期約束,其內(nèi)容為針對(duì)clkIN時(shí)序分組,添加了一個(gè)周期為20ns、起始電平為高電平、占空比為50%的周期約束。
當(dāng)然了,除了使用百分比來指電平占空比參數(shù)外,還可直接標(biāo)明電平持續(xù)時(shí)間,例如,上例第二句話又可改寫為:
TIMESPEC “TS_clkIn” = PERIOD “clkIn” 20.0 ns HIGH 10.0 ns;
若該時(shí)鐘域的時(shí)鐘信號(hào)還存在著2ns的jitter,則上例第二句話又可改寫為:
TIMESPEC “TS_clkIn” = PERIOD “clkIn” 20 ns HIGH 50% INPUT_JITTER 2 ns;
內(nèi)部時(shí)鐘周期約束
內(nèi)部時(shí)鐘周期約束和輸入時(shí)鐘周期約束沒有什么本質(zhì)的不同,都是將周期約束加入到對(duì)應(yīng)的時(shí)鐘網(wǎng)絡(luò)上,不過有一點(diǎn)需要特別注意:
輸入時(shí)鐘周期約束針對(duì)的是輸入時(shí)鐘信號(hào),該時(shí)鐘信號(hào)是通過FPGA的一個(gè)輸入管腳引入FPGA內(nèi)部的,如果我們將該管腳和FPGA頂層實(shí)體的輸入端口clk綁定,那么無論是綜合前后、布局布線前后,使用clk這個(gè)名稱都能找到對(duì)應(yīng)的時(shí)鐘網(wǎng)絡(luò),因?yàn)殛P(guān)于這個(gè)時(shí)鐘輸入端口實(shí)在是沒有什么好優(yōu)化和改名的。
但是,若你要約束一個(gè)內(nèi)部的時(shí)鐘信號(hào),若該信號(hào)在HDL文件中的名稱為clk25MHz,若你定義了如下分組約束:
NET “clk25MHz” TNM_NET = “innerClk”;
則時(shí)序分析工具在進(jìn)行分析的時(shí)候幾乎會(huì)百分之百的報(bào)告說找不到這個(gè)名稱叫做clk25MHz的網(wǎng)絡(luò),因?yàn)樗鼛缀蹩隙〞?huì)被優(yōu)化或改名掉。針對(duì)此類情況,通常有三種解決方案:
1、使用ISE自帶時(shí)序分析工具的時(shí)序約束創(chuàng)建工具創(chuàng)建該時(shí)鐘的約束。通常,ISE會(huì)分析出其內(nèi)部具有哪幾個(gè)時(shí)鐘信號(hào),并會(huì)給出每一個(gè)時(shí)鐘信號(hào)的源頭網(wǎng)絡(luò)名稱,你可以據(jù)此名稱推測(cè)出該網(wǎng)絡(luò)是不是你HDL代碼中類似clk25MHz名稱對(duì)應(yīng)的時(shí)鐘網(wǎng)絡(luò),然后使用該網(wǎng)絡(luò)名稱創(chuàng)建分組約束。
2、在綜合的時(shí)候使用綜合約束中的keep語法,讓clk25MHz這個(gè)網(wǎng)絡(luò)名稱不被優(yōu)化掉。
3、查看綜合、轉(zhuǎn)換環(huán)節(jié)后的FPGA設(shè)計(jì)網(wǎng)表文件,找到clk25MHz可能對(duì)應(yīng)的那個(gè)網(wǎng)絡(luò)名稱,然后使用該網(wǎng)絡(luò)名稱創(chuàng)建分組約束。(閱讀網(wǎng)表的過程可能會(huì)很痛苦?。?/p>
當(dāng)然了,對(duì)于一個(gè)驗(yàn)證團(tuán)隊(duì)來說,對(duì)于內(nèi)部時(shí)鐘來說,要想添加純時(shí)序分析所使用的約束的話,恐怕只有采用方案3了。
關(guān)聯(lián)時(shí)鐘周期約束
關(guān)聯(lián)時(shí)鐘周期約束主要用來應(yīng)付兩種情況:一、如果兩個(gè)時(shí)鐘域之間有信息傳遞,且我們想要對(duì)此進(jìn)行時(shí)序分析;二、一個(gè)時(shí)鐘信號(hào)本身就是由另一個(gè)時(shí)鐘信號(hào)生成的,兩者之間具有很強(qiáng)的相關(guān)性。
例如,對(duì)于一個(gè)DCM模塊來說,其輸入來自一個(gè)叫做clk50MHz的管腳,我們對(duì)該時(shí)鐘網(wǎng)絡(luò)進(jìn)行周期約束如下:
NET “clk50MHz” TNM_NET = “clkIn”;
TIMESPEC “TS_clkIn” = PERIOD " clkIn" 20 ns HIGH 50%;
如果它有一個(gè)同相2倍頻的輸出時(shí)鐘,對(duì)應(yīng)網(wǎng)絡(luò)名稱叫做clk2x,則對(duì)此輸出時(shí)鐘所驅(qū)動(dòng)的網(wǎng)絡(luò),我們可以定義時(shí)序約束如下:
NET “clk2x” TNM_NET = DCM2xOut;
TIMESPEC TS_DCM2xOut = PERIOD “DCM2xOut” TS_clkIn / 2 HIGH 50%;
而對(duì)于該DCM的相移180度的2倍頻輸出時(shí)鐘,若其對(duì)應(yīng)網(wǎng)絡(luò)名稱叫做clk2x180,則對(duì)此輸出時(shí)鐘所驅(qū)動(dòng)的網(wǎng)絡(luò),我們可以定義時(shí)序約束如下:
NET " clk2x180" TNM_NET = DCM2x180Out;
TIMESPEC TS_DCM2x180Out = PERIOD “DCM2x180Out” TS_clkIn / 2 PHASE 5 ns HIGH 50%;
差分時(shí)鐘周期約束
如果輸入時(shí)鐘信號(hào)是差分的,那么你只需要給差分中的一個(gè)端口加上周期約束即可。為了好理解起見,你應(yīng)該對(duì)差分的p端網(wǎng)絡(luò)添加一個(gè)和差分時(shí)鐘相同的周期約束。
輸入約束
輸入約束主要針對(duì)同步輸入接口,亦或是針對(duì)虛擬出來的同步輸入接口,通過使用“OFFSET = IN”關(guān)鍵字,來描述輸入數(shù)據(jù)與時(shí)鐘之間的關(guān)系。其基本語法定義如下:
[{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”]可以為該輸入約束指明一個(gè)網(wǎng)絡(luò)或者一個(gè)分組(注意,這里的網(wǎng)絡(luò)必須是連接到pad的網(wǎng)絡(luò),分組也必須是IO block相關(guān)的分組),若省略不寫,則該約束的作用范圍是全局的(應(yīng)用于所有跟時(shí)鐘"clk_name"相關(guān)的輸入端口)。
是一個(gè)相對(duì)于所依賴時(shí)鐘初始邊沿的數(shù)據(jù)到來偏移量。當(dāng)然了,具體該時(shí)鐘的初始邊沿是上升沿還是下降沿,則要追朔到該時(shí)鐘相關(guān)的周期約束上,通過該周期約束的使用的是HIGH、LOW關(guān)鍵字中的哪一個(gè)來判斷。
[VALID ]給出了數(shù)據(jù)信號(hào)的穩(wěn)定周期,即在的基礎(chǔ)上,保持穩(wěn)定時(shí)間為。
{BEFORE|AFTER}則指出了該條約束中描述的有效數(shù)據(jù)是應(yīng)該被當(dāng)前時(shí)鐘事件所采集還是應(yīng)該被后續(xù)時(shí)鐘事件所采集的。如果使用了BEFORE關(guān)鍵字,則表示數(shù)據(jù)有效開始是以要采集它的時(shí)鐘事件為基礎(chǔ),給出一個(gè)提前量的;如果使用了AFTER關(guān)鍵字,則表示數(shù)據(jù)有效開始是以前一個(gè)時(shí)鐘事件為基礎(chǔ),給出一個(gè)滯后量的。當(dāng)然了,本身也可以是負(fù)值,而具體使用哪一個(gè)關(guān)鍵字,完全看個(gè)人的描述習(xí)慣,它們之間沒有任何本質(zhì)的不同。
"clk_name"指明了該輸入約束是相對(duì)于哪一個(gè)時(shí)鐘事件的初始邊沿來說的。
[TIMEGRP “group_name”]為該約束指明了一個(gè)需要分析的內(nèi)部分組,省略不寫則表示所有跟當(dāng)前時(shí)鐘采集有關(guān)的元素。
{HIGH|LOW}則用來改寫"clk_name"的初始邊沿的,它可以改變周期約束對(duì)"clk_name"相關(guān)初始邊沿的設(shè)定,HIGH、LOW分別表示的是將時(shí)鐘上升沿、下降沿設(shè)定為0時(shí)刻的初始邊沿。
SDR輸入約束
SDR的概念請(qǐng)回顧【程序設(shè)計(jì)篇->編程思路->關(guān)于外接接口的編程思路->按時(shí)鐘特性分類->同步接口->SDR】小節(jié)。
既然是同步接口,那么我們必須首先為同步時(shí)鐘定義一個(gè)周期約束,例如:
NET “clk” TNM_NET = clk50MHz;
TIMESPEC TS_clk = PERIOD “clk50MHz” 20 ns HIGH 50%;
那么,下面就可以基于該時(shí)鐘來使用“OFFSET = IN”語法表明該SDR接口在輸入的時(shí)候數(shù)據(jù)與時(shí)鐘之間的關(guān)系。例如:
OFFSET = IN 10 ns VALID 20 ns BEFORE clk;
由于本條語句沒有指名具體的輸入端口,因此它的作用是全局的,即所有跟clk時(shí)鐘采集相關(guān)的輸入端口。但是,若不同的數(shù)據(jù)端口與時(shí)鐘之間的關(guān)系有所不同的話,則需要單獨(dú)為每一個(gè)輸入端口指明輸入約束,例如:
NET “dIn<0>” OFFSET = IN 20 ns VALID 20 ns BEFORE “clk”;
NET “dIn<1>” OFFSET = IN 10 ns VALID 20 ns BEFORE “clk”;
如果有多個(gè)輸入端口和時(shí)鐘信號(hào)具有同樣的關(guān)系,則可使用分組的形式去定義輸入約束,例如:
NET “dIn<0>” TNM = dInG;
NET “dIn<1>” TNM = dInG;
TIMEGRP “dInG” OFFSET = IN 20 ns VALID 20 ns BEFORE “clk”;
DDR輸入約束
DDR的概念請(qǐng)回顧【程序設(shè)計(jì)篇->編程思路->關(guān)于外接接口的編程思路->按時(shí)鐘特性分類->同步接口->DDR】小節(jié)。
類似的,既然是同步接口,那么我們必須首先為同步時(shí)鐘定義一個(gè)周期約束,例如:
NET “clk” TNM_NET = clk50MHz;
TIMESPEC TS_clk = PERIOD “clk50MHz” 20 ns HIGH 50%;
那么,下面就是一種基于該時(shí)鐘來使用“OFFSET = IN”語法表明該DDR接口在輸入的時(shí)候數(shù)據(jù)與時(shí)鐘之間關(guān)系的方法,例如:
OFFSET = IN 5 ns VALID 10 ns BEFORE “clk” RISING;
OFFSET = IN 5 ns VALID 10 ns BEFORE “clk” FALLING;
這兩行語法說明兩個(gè)時(shí)鐘邊沿都分別對(duì)應(yīng)其所需要采樣數(shù)據(jù)的中間。注意,上例中多了兩個(gè)關(guān)鍵字RISING和FALLING,它們不光可以用來指明offset time為5ns,到底是相對(duì)于時(shí)鐘網(wǎng)絡(luò)clk的上升沿來說還是下降沿來說,更重要的是,它們可以指明,該條輸入約束的作用范圍——RISING代表分析所有在上升沿被采樣的輸入分組,F(xiàn)ALLING代表分析所有在下降沿被采樣的輸入分組。正因?yàn)槿绱?,雖然這兩條語句針對(duì)的輸入端口都是一樣的,但是它們并沒有被互相覆蓋。例如,如果我們想當(dāng)然的將RISING、FALLING關(guān)鍵字替換為HIGH、LOW關(guān)鍵字如下:
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
則,由于上述兩條語句針對(duì)的都是一樣的分組(所有跟clk相關(guān)的輸入元素),因此誰寫在前面誰就會(huì)被后面的語句覆蓋掉。
也正是因?yàn)镽ISING和FALLING這樣的一個(gè)分組特性,所以如果在SDR接口中,內(nèi)部邏輯本身是上升沿敏感的,但如果你用FALLING來指明數(shù)據(jù)、時(shí)鐘之間的位置關(guān)系,時(shí)序分析工具將會(huì)告訴你0條路徑、0個(gè)端口等等被分析。此時(shí),如果你執(zhí)意要以下降沿來作為參考邊沿的話,請(qǐng)使用LOW關(guān)鍵字。
為DDR接口添加時(shí)序約束的另一種方法是使用內(nèi)部分組,例如,為了實(shí)現(xiàn)與第一種方法相同的約束,可以先定義兩個(gè)分組分別對(duì)應(yīng)上升沿敏感的元素和下降沿敏感的元素,然后分別為其指明輸入約束,描述如下:
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;
為了進(jìn)一步明確OFFSET語法中前后兩個(gè)TIMEGRP用意的不同,下面給出如果要對(duì)一個(gè)兩位寬的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的概念請(qǐng)回顧【程序設(shè)計(jì)篇->編程思路->關(guān)于外接接口的編程思路->按時(shí)鐘特性分類->同步接口->MDR】小節(jié)。
類似的,既然是同步接口,那么我們必須首先為同步時(shí)鐘定義一個(gè)周期約束,例如:
NET “clk” TNM_NET = clk50MHz;
TIMESPEC TS_clk = PERIOD “clk50MHz” 20 ns HIGH 50%;
由于MDR在實(shí)際接收時(shí),往往還是通過SDR或者DDR的模式去進(jìn)行數(shù)據(jù)接收,因此,如果實(shí)際采用的是SDR模式,則我們只需要采樣對(duì)一個(gè)數(shù)據(jù)即可連續(xù)采集對(duì)所有的數(shù)據(jù);而如果實(shí)際采用的是DDR模式,則我們只需要采樣對(duì)連續(xù)兩個(gè)數(shù)據(jù)即可連續(xù)采集對(duì)所有的數(shù)據(jù)。
那么,接下來以時(shí)鐘數(shù)據(jù)比為1:4,數(shù)據(jù)變化沿對(duì)齊時(shí)鐘變化沿的MDR為例,看看該如何應(yīng)對(duì)其輸入約束的描述:
首先,來看看SDR模式實(shí)現(xiàn)MDR采樣。如果內(nèi)部使用DCM(或者PLL),生成一個(gè)4倍頻、同相的時(shí)鐘信號(hào),網(wǎng)絡(luò)名為clk4x,則我們應(yīng)該首先添加關(guān)于該生成時(shí)鐘的周期約束如下:
NET “clk4x” TNM_NET = DCM4xOut;
TIMESPEC TS_ DCM4xOut = PERIOD “DCM4xOut” TS_clk / 4 HIGH 50%;
那么,由于clk4x與clk是相關(guān)時(shí)鐘,所以時(shí)序分析工具會(huì)自動(dòng)分析其跨時(shí)鐘域的問題,故只需要基于clk給出一個(gè)數(shù)據(jù)采樣的輸入約束如下即可:
OFFSET = IN 5 ns VALID 5 ns BEFORE clk;
事實(shí)上,由于UCF文件是在布局布線前添加給ISE的,因此ISE會(huì)在編譯的時(shí)候自動(dòng)為DCM或PLL的輸出生成關(guān)聯(lián)周期約束,所以關(guān)于clk4x的周期約束可省略。
接下來,再看看DDR模式實(shí)現(xiàn)MDR采樣。此時(shí),由于具體完成采樣的時(shí)鐘并不是clk,所以不能采用【DDR輸入約束】小節(jié)中的方法一。但若要采用方法二,必須建立關(guān)于具體采樣時(shí)鐘的兩個(gè)邊沿分組。因此,先為DCM的輸出pin腳添加關(guān)聯(lián)時(shí)鐘約束如下:
PIN “instance_name/DCM_ADV_INST.CLK2X” TNM_NET = clk100MHz;
TIMESPEC TS_clk100MHz = PERIOD “clk100MHz” TS_clk / 2 HIGH 50%;
然后才能定義DDR采樣時(shí)鐘的兩個(gè)分組如下:
TIMEGRP “Clk2x_Rising” = RISING “clk100MHz”;
TIMEGRP “Clk2x_Falling” = FALLING “clk100MHz”;
最后,基于clk信號(hào)描述連續(xù)的兩個(gè)采樣并關(guān)聯(lián)到上述兩個(gè)分組中即可:
OFFSET = IN 5 ns VALID 5 ns BEFORE clk TIMEGRP Clk2x_Rising;
OFFSET = IN -5 ns VALID 5 ns BEFORE clk TIMEGRP Clk2x_Falling;
事實(shí)上,由于UCF文件是在布局布線前添加給ISE的,因此ISE會(huì)在編譯的時(shí)候自動(dòng)為DCM或PLL的輸出生成關(guān)聯(lián)周期約束,所以下面這句話可省略:
TIMESPEC TS_clk100MHz = PERIOD “clk100MHz” TS_clk / 2 HIGH 50%;
差分輸入約束
如果接口的輸入數(shù)據(jù)是差分形式的,那么你需要在創(chuàng)建輸入分組的時(shí)候把它們都加進(jìn)去,然后一起添加輸入約束即可。
組間約束
組間約束通過使用“FROM……TO”關(guān)鍵字,來對(duì)兩時(shí)序分組之間的延遲給出限制描述。其基本語法定義如下:
TIMESPEC “TS_name”=FROM “group1” TO “group2” [DATAPATHONLY];
其中,
TIMESPEC "TS_name"為該路徑約束定義了一個(gè)標(biāo)示符,可供其他地方調(diào)用。
group1為路徑起始端組。
group2 為路徑目的端組。
指明組間延遲的最大允許范圍。你無須指明最小允許范圍,因?yàn)闀r(shí)序分析工具會(huì)自動(dòng)為你報(bào)出起始端組和目的端組之間的最大、最小時(shí)間差。
[DATAPATHONLY]是可選參數(shù),給出則表示當(dāng)前組間約束將不考慮時(shí)鐘skew、相位差等影響,而只考慮組間的數(shù)據(jù)路徑延遲。
焊盤到焊盤路徑約束
當(dāng)FPGA設(shè)計(jì)中有不可拆解的純組合邏輯接口時(shí),就存在從芯片焊盤到焊盤的時(shí)序路徑,此時(shí),焊盤到焊盤的路徑約束就會(huì)生效??梢灾苯邮褂妙A(yù)定義組PADS來對(duì)所有焊盤到焊盤的路徑進(jìn)行時(shí)序約束,描述如下:
TIMESPEC “TS_P2P” = FROM “PADS” TO “PADS” 20 ns;
此時(shí),DATAPATHONLY關(guān)鍵字有沒有都無所謂,因?yàn)楹副P到焊盤本身就是純數(shù)據(jù)路徑延遲。如果要對(duì)不同的焊盤之間添加不同的焊盤到焊盤的路徑約束,則需要先創(chuàng)建自定義的起始焊盤組和目的焊盤組,然后再添加約束,例如:
TIMEGRP “dInG” = PADS(“a” “b”);
TIMEGRP “dOutG” = PADS(“c”);
TIMESPEC “TS_AB2C” = FROM “dInG” TO “dOutG” 20 ns;
多周期路徑約束
在周期性約束的作用下,時(shí)序分析工具會(huì)認(rèn)為該時(shí)鐘域內(nèi)寄存器的輸出在每個(gè)時(shí)鐘事件的到來都會(huì)發(fā)生變化,因此,理想情況下每個(gè)寄存器的保持時(shí)間均為一個(gè)時(shí)鐘周期??捎袝r(shí)候,F(xiàn)PGA設(shè)計(jì)的功能特征決定前級(jí)寄存器需要經(jīng)歷很多個(gè)時(shí)鐘周期后才會(huì)發(fā)生一次變化,這樣一來,如果僅僅對(duì)該時(shí)鐘域添加周期約束,顯然對(duì)這部分電路是過約束了。如果這部分電路的邏輯比較簡(jiǎn)單,過約束并不會(huì)帶來什么大問題;但如果這部分電路的邏輯比較復(fù)雜,過約束很可能會(huì)導(dǎo)致時(shí)序分析的時(shí)候不通過。因此,為了能夠正確的對(duì)這部分邏輯添加時(shí)序約束,需要要使用多周期路徑約束,例如如下描述:
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;
在時(shí)序約束里,通常更為具體的約束比更為廣泛的約束優(yōu)先級(jí)要高,因此,雖然上例在最開始已經(jīng)給所有clk50MHz分組添加了周期約束,但后續(xù)的多周期路徑約束將b1、b2之間的周期約束改為2倍的多周期路徑約束。
跨時(shí)鐘域路徑約束
如果兩個(gè)時(shí)鐘之間并不相關(guān),默認(rèn)情況下,時(shí)序分析工具是不會(huì)對(duì)這種跨時(shí)鐘域情況進(jìn)行分析的。但當(dāng)它們之間又確實(shí)有著信息傳遞,而你又關(guān)心其間的一些時(shí)間延遲時(shí),可以使用跨時(shí)鐘域路徑約束。例如如下描述:
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;
上例中的兩條周期約束描述可省略,寫明只是為了說明這兩個(gè)時(shí)鐘確實(shí)是無關(guān)的。如果只關(guān)心兩個(gè)時(shí)鐘域之間的數(shù)據(jù)路徑延遲的話,可以將上例中的跨時(shí)鐘域路徑約束改為:
TIMESPEC TS_CCR = FROM clkA1 TO clkA2 10 ns DATAPATHONLY;
這樣時(shí)序分析工具在分析的時(shí)候就不會(huì)考慮時(shí)鐘skew等因素了,即便clk1、clk2是相關(guān)時(shí)鐘。
跨時(shí)鐘域忽略約束
如果兩個(gè)時(shí)鐘之間確實(shí)是相關(guān)的,例如DCM或者PLL的多個(gè)輸出和它們的輸入、一個(gè)時(shí)鐘信號(hào)的上升沿和下降沿等,但我們又不希望時(shí)序分析工具對(duì)它們之間進(jìn)行跨時(shí)鐘域分析,此時(shí)可以使用跨時(shí)鐘域忽略約束。例如如下描述:
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關(guān)鍵字,可以讓時(shí)序分析工具不去分析從clkA1到clkA2的組間延遲。如果希望也不要分析從clkA2到clkA1的組間延遲,則還需要再添加一句描述如下:
TIMESPEC TS_FastPath = FROM clkA2 TO clkA1 TIG;
如果只是希望對(duì)兩個(gè)時(shí)鐘域之間的某一部分信號(hào)傳遞進(jìn)行忽略,則可以先定義分組,然后再使用跨時(shí)鐘域忽略約束。承接上例,如果希望忽略clk1時(shí)鐘域中的aLock到clk2時(shí)鐘域中c之間的跨時(shí)鐘域分析,可描述如下:
INST “aLock” TNM = ta;
INST “c” TNM = tc;
TIMESPEC TS_FastPath = FROM ta TO tc TIG;
路徑中間點(diǎn)約束
有時(shí)候,你關(guān)心的可能不僅僅是兩個(gè)時(shí)序分組之間的全部路徑延遲中的最大、最小情況,而是關(guān)心通過某一個(gè)中繼點(diǎn)或組的兩個(gè)時(shí)序分組之間的路徑延遲中的最大、最小情況。此時(shí),可以使用THRU關(guān)鍵字指明該中繼分組。例如如下描述:
NET “a_3_IBUF” TPTHRU = “ta”;
TIMESPEC “TS_P2P” = FROM “PADS” THRU “ta” TO “PADS” 20 ns;
上例只分析那些焊盤到焊盤之間經(jīng)過ta分組的路徑延遲情況。
輸出約束
輸出約束主要針對(duì)輸出接口,通過使用“OFFSET = OUT”關(guān)鍵字,實(shí)現(xiàn)對(duì)輸出接口的一些基本時(shí)序要求描述,它的基本語法定義如下:
[{TIMEGRP|NET} “iobgroup_or_padnet_name”] OFFSET = OUT[units] {BEFORE|AFTER} “clk_name” [TIMEGRP “group_name”] {HIGH|LOW};
其中,
[{TIMEGRP|NET} “iobgroup_or_padnet_name”]可以為該輸出約束指明一個(gè)網(wǎng)絡(luò)或者一個(gè)分組(注意,這里的網(wǎng)絡(luò)必須是連接到pad的網(wǎng)絡(luò),分組也必須是IO block相關(guān)的分組),若省略不寫,則該約束的作用范圍是全局的(應(yīng)用于所有被時(shí)鐘"clk_name"相關(guān)的輸出端口)。
"clk_name"指明了該輸出約束是相對(duì)于哪一個(gè)時(shí)鐘事件的初始邊沿來說的,注意,"clk_name"是一個(gè)輸入時(shí)鐘的名稱,而不是輸出時(shí)鐘的名稱,更確切的說,它是該約束所針對(duì)輸出端口在FPGA內(nèi)部所連接寄存器的驅(qū)動(dòng)時(shí)鐘。
{BEFORE|AFTER} 、[TIMEGRP “group_name”]、{HIGH|LOW}與輸入約束解釋相同。
可見,ISE的輸出約束不太智能,通過使用“OFFSET = OUT”關(guān)鍵字,只能描述輸出端口相對(duì)于其輸出寄存器驅(qū)動(dòng)時(shí)鐘之間的時(shí)間延遲是否能夠滿足一些基本要求,因此對(duì)于同步輸出接口,ISE自帶的時(shí)序分析工具不能直接給出分析結(jié)果。下面就來介紹一下該如何利用時(shí)序分析工具間接得到同步輸出端口的時(shí)序報(bào)告。
直接同步輸出約束
直接同步輸出對(duì)應(yīng)于【本篇->時(shí)序分析的原理->其他常見邏輯情形的應(yīng)對(duì)方法->純輸出接口->純同步輸出接口】小節(jié)中描述的情況??梢?,對(duì)于此類接口,ISE只能采用該小節(jié)中介紹的第三點(diǎn)方法來進(jìn)行應(yīng)對(duì)。即首先通過功能仿真獲得clk與D信號(hào)在理想情況下的關(guān)系,然后再分別獲取clk、D信號(hào)實(shí)際輸出時(shí)的最大、最小延遲,然后人工計(jì)算得出針對(duì)該同步輸出接口的時(shí)序分析結(jié)果。
如果內(nèi)部時(shí)鐘的周期約束如下:
NET “innerClk” TNM_NET = innerClk;
TIMESPEC TS_innerClk = PERIOD “innerClk” 20 ns HIGH 50%;
則,對(duì)于該同步輸出接口,我們需要先定義針對(duì)數(shù)據(jù)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”;
然后,再參考【組間約束中->焊盤到焊盤路徑約束】小節(jié)中的方法,對(duì)innerClk與clk之間進(jìn)行約束,類似如下:
TIMEGRP “gClkIn” = PADS(“innerClk”);
TIMEGRP “gClkOut” = PADS(“clk”);
TIMESPEC “TS_C2C” = FROM “gClkIn” TO “gClkOut” 20 ns;
這樣,時(shí)序分析工具會(huì)報(bào)出D、clk相對(duì)于0時(shí)刻innerClk邊沿的最大、最小延遲,最后結(jié)合功能仿真的情況即可人工得出該直接同步輸出接口的時(shí)序分析報(bào)告。
間接同步輸出約束
間接同步輸出對(duì)應(yīng)于【本篇->時(shí)序分析的原理->其他常見邏輯情形的應(yīng)對(duì)方法->純輸出接口->異步生成同步輸出】小節(jié)中描述的情況。
間接同步輸出與直接同步輸出的應(yīng)對(duì)方法類似,唯一的不同就在于輸出時(shí)鐘clk相對(duì)于innerClk來說也是一個(gè)數(shù)據(jù)。因此,只需要將【直接同步輸出約束】小節(jié)中,關(guān)于innerClk與clk之間的組間約束改為輸出約束即可。類似如下:
NET “clk” TNM = gCout;
TIMEGRP “gCout” OFFSET = OUT 20 ns AFTER “innerClk”;
這樣,時(shí)序分析工具會(huì)報(bào)出D、clk相對(duì)于0時(shí)刻innerClk邊沿的最大、最小延遲,最后結(jié)合功能仿真的情況即可人工得出該間接同步輸出接口的時(shí)序分析報(bào)告。
差分輸出約束
如果接口的輸出數(shù)據(jù)是差分形式的,那么你需要在創(chuàng)建輸出分組的時(shí)候把它們都加進(jìn)去,然后一起添加輸出約束即可。
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
602977 -
時(shí)序分析
+關(guān)注
關(guān)注
2文章
127瀏覽量
22565 -
ISE
+關(guān)注
關(guān)注
1文章
100瀏覽量
36522 -
時(shí)序約束
+關(guān)注
關(guān)注
1文章
115瀏覽量
13416 -
UCF
+關(guān)注
關(guān)注
0文章
9瀏覽量
9630
原文標(biāo)題:【科普】常用時(shí)序約束介紹之基于ISE的UCF文件語法
文章出處:【微信號(hào):feifeijiehaha,微信公眾號(hào):電路和微電子考研】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論