第一章 FPGA時(shí)序約束分享02_時(shí)鐘約束
作者:潘文明
上一篇《FPGA時(shí)序約束分享01_約束四大步驟》一文中,介紹了時(shí)序約束的四大步驟。
?
? ?上圖是四大步驟,并且每個(gè)步驟都分別展開(kāi)了各種情況,后續(xù)可以參考對(duì)照,分別添加時(shí)序約束。本文講述上圖中的第1點(diǎn):時(shí)鐘約束。
? ?時(shí)鐘約束分三種情況:輸入時(shí)鐘、PLL等衍生時(shí)鐘以及自己分頻的時(shí)鐘。而其中輸入時(shí)鐘又可再分三種,第一種是輸入管腳是CLK的,第二種是差分時(shí)鐘,最后一種是GT或?恢復(fù)的一個(gè)時(shí)鐘。下面分別展開(kāi)描述。
?
第1節(jié) 輸入時(shí)鐘
?
? ?輸入時(shí)鐘根據(jù)管腳情況,有三種三種,第一種是輸入管腳是CLK的,第二種是差分時(shí)鐘,最后一種是GT或?恢復(fù)的一個(gè)時(shí)鐘。
?
? 1.1 輸入管腳CLK
? ? 時(shí)鐘直接從管腳輸入,如上圖所示。這種是最常見(jiàn)的一個(gè)情況,包括明德?lián)P的MP603、MP801學(xué)習(xí)板,其時(shí)鐘都是由外部的晶振產(chǎn)生,然后直接輸入管腳進(jìn)來(lái)的,這種情況的生成時(shí)鐘約束是最簡(jiǎn)單的,其格式如下:
? ?create_clock -name SysClk -period 10 -waveform {0 5} [get_ports Clk]
? ?create_clock是生成約束約束命令。
? ?name后面表示給這個(gè)時(shí)鐘命名,這里命名為SysClk,您可以命為其他您所想要的名字,即使跟代碼中的時(shí)鐘名不同,都是可以的。
? ?period后面表示約定該時(shí)鐘的周期,默認(rèn)單位為納秒。
? ?waveform后面表示該時(shí)鐘在一個(gè)周期內(nèi)的上升沿和下降沿時(shí)間點(diǎn)。{0 5}表示時(shí)鐘在第0時(shí)刻上升,在第5時(shí)鐘下降。通過(guò)這個(gè),設(shè)置了時(shí)鐘的占空比。
? ?get_ports這里指定了約束的對(duì)象,即對(duì)應(yīng)代碼中的哪個(gè)信號(hào),get_ports Clk,表示這個(gè)時(shí)鐘就是代碼或上圖中的Clk。
? 這個(gè)時(shí)鐘約束是最常用的,只要參照這種格式生成晚就可以了。
?
?
? ?假設(shè)說(shuō)該時(shí)鐘輸入后經(jīng)過(guò)了一個(gè)內(nèi)部的PLL或者M(jìn)MCM(時(shí)鐘管理單元)后,再作為工作時(shí)鐘,此種情況下,仍然是要對(duì)Clk約束,其約束方法跟前面是一樣的。注意,這里說(shuō)的是約束上面的時(shí)鐘Clk,而不是MMCM的輸出時(shí)鐘。
?
1.2 差分時(shí)鐘
差分時(shí)鐘是指通過(guò)管腳的P端和N端共同進(jìn)來(lái)的,通常應(yīng)該到高頻或者精度 很高的場(chǎng)合,例如明德?lián)P的MP802、MP5620,以及各種核心板,基本上外面都有差分晶振,有差分時(shí)鐘的輸入。
如果是差分時(shí)鐘,又是如何約束呢?
注意下,差分信號(hào)在芯片上,肯定是占用了兩個(gè)管腳位置,但在代碼中不一定。在XILINX的頂層接口代碼中,差分時(shí)鐘會(huì)對(duì)應(yīng)兩個(gè)接口信號(hào),分別 P端和N端;而對(duì)于ALTERA,頂層接口信號(hào)只有一個(gè),不用區(qū)分出P端和N端,在管腳定義時(shí),再來(lái)區(qū)分出P和N。
對(duì)于ALTERA的差分時(shí)鐘約束,其與單端輸入約束方法完全一樣。
對(duì)于XILINX的差分時(shí)鐘約束,只需要約束P端就可以了,即:
create_clock -name SysClk -period 10 -waveform {0 5} [get_ports Clk_p]
?
1.3 GT或恢復(fù)的時(shí)鐘
?
?
第三種是GT或恢復(fù)的時(shí)鐘,即使用了高速收發(fā)器的情形,最常見(jiàn)的就是光纖接口了。
在高速收發(fā)器管腳中,是沒(méi)有時(shí)鐘的,時(shí)鐘已經(jīng)嵌入到數(shù)據(jù)里面。接收的時(shí)候,我們使用高速收發(fā)器如GTX、GTY IP核接收數(shù)據(jù),并且從數(shù)據(jù)時(shí)提取出時(shí)鐘。這個(gè)恢復(fù)出來(lái)的時(shí)鐘就是此種情形,例如上圖中的GT模塊,就是FPGA內(nèi)部使用的一個(gè)IP核,其輸出了時(shí)鐘TXCLK。
在這種情況下,我們需要約束這個(gè)恢復(fù)出來(lái)的時(shí)鐘。按前面方式,同樣也是使用create_clock,定義時(shí)鐘周期、占空比等,但約束對(duì)象需要注意一下,不是通過(guò)get_ports,而是通過(guò)get_pins找到對(duì)象,該對(duì)象是恢復(fù)出的時(shí)鐘,如上圖中的GT/TXOUTCLK,即:
? ? create_clock -name txClk -period 6.667-waveform {0 5} [get_pins GT/TXOUTCLK]
? ?上面產(chǎn)生了一個(gè)名為txClk的約束,其對(duì)象為GT/TXOUTCLK,周期為6.667,即133M。
? ?對(duì)于get_ports和get_pins的區(qū)別,可以簡(jiǎn)單認(rèn)為,get_ports是FPGA頂層的接口,該接口是要連到FPGA芯片管腳上的;get_pins是模塊內(nèi)的輸出管腳。如果大家不清楚是用哪個(gè),可以使用工具,工具會(huì)提醒您怎么找出這個(gè)信號(hào)來(lái)的。
? ?注意上面找到的是GT/TXOUTCLK,而不是圖中的TXCLK。這是因?yàn)門XCLK是例化的信號(hào),有時(shí)候是找不出來(lái)的。這個(gè)時(shí)候,需要設(shè)計(jì)者找到GT模塊,再仔細(xì)辨識(shí)出時(shí)鐘信號(hào)是哪個(gè),非??简?yàn)設(shè)計(jì)師的經(jīng)驗(yàn)。
?
第2節(jié) PLL等衍生時(shí)鐘
?
? ?上圖是時(shí)鐘Clk經(jīng)過(guò)內(nèi)部的MMCM時(shí)鐘管理單元,該時(shí)鐘管理單元在此基礎(chǔ)上倍頻或者分頻等,產(chǎn)生輸出時(shí)鐘CLKOUT0,該時(shí)鐘用于驅(qū)動(dòng)REGA和REGB。在前面的介紹里,我們知道需要對(duì)Clk進(jìn)行約束,使用的是create_clock命令。那么上圖中的CLKOUT0要不要約束呢?
? ?對(duì)于PLL和MMCM,一般VIVIDAO、ISE和QUARTUS工具是可以推導(dǎo)出該時(shí)鐘約束的,因?yàn)槲覀冊(cè)谏蒊P核的時(shí)候,已經(jīng)設(shè)置了該時(shí)鐘的輸入和輸出 時(shí)鐘頻率、相位等信息,通過(guò)這些信息,工具就可以推導(dǎo)出時(shí)鐘約束。
? ?因此,對(duì)于XILINX可以不用約束PLL和MMCM產(chǎn)生的時(shí)鐘;對(duì)于ALTERA,也可以自動(dòng)推導(dǎo)的,但需要添加如下命令,才會(huì)自動(dòng)推導(dǎo):
derive_pll_clocks
? ?雖然工具可以自動(dòng)推導(dǎo)PLL和MMCM產(chǎn)生的時(shí)鐘約束,但是其約束時(shí)鐘名是不受設(shè)計(jì)師控制或預(yù)見(jiàn)的。這會(huì)帶來(lái)什么問(wèn)題呢?
? ?我們產(chǎn)生時(shí)鐘約束后,通常還會(huì)在基于此時(shí)鐘產(chǎn)生其他約束,例如下面是input delay的約束:
set_input_delay -clock sysclk -max 4 [get_ports ain]
? ?上面是input delay的約束,對(duì)象是ain,但注意看,-clock后面的sysclk是時(shí)鐘約束產(chǎn)生的時(shí)鐘名(注意是約束名,不是代碼中的時(shí)鐘信號(hào)),這說(shuō)明input delay約束時(shí),是依賴時(shí)鐘約束名的。
? ?如果由工具自動(dòng)推導(dǎo)PLL和MMCM產(chǎn)生時(shí)鐘約束,那么名字就不知道,或者雖然知道了,但可能稍微改下代碼名稱又變了。這樣會(huì)導(dǎo)致依賴于此名字的其他約束,會(huì)存在失效而不知道的風(fēng)險(xiǎn)。
? ?因此,明德?lián)P建議對(duì)PLL和MMCM產(chǎn)生時(shí)鐘添加約束,確定時(shí)鐘名。
?
例如上面的電路,添加如下約束
create_clcok –name clk_200 –period 5 [get_ports Clk]
create_generated_clock ?-name my_clk [get_pins MMCM/CLKOUT0] \
????????????????????????????????????????????????????????????????????????????????????-source [get_pins MMCM/CLKIN]\
?????????????????????????????????????????????????? ??????????????????????????????? -master_clock clk_200
首先通過(guò)create_clock命令對(duì)輸入管腳Clk約束,周期為5,命名為Clk_200。然后通過(guò)create_geneated_clock對(duì)MMCM產(chǎn)生的CLKOUT0約束,命名為my_clk;約束對(duì)象為MMCM/CLKOUT0;通過(guò)-source表明來(lái)源于MMCM/CLKIN,即MMCM的輸入管腳;通過(guò)-master_clock表明其主時(shí)鐘是clk_200。
通過(guò)上面方法,就可以確定MMCM的時(shí)鐘名,已經(jīng)固定為my_clk,不會(huì)再變了。前面提及的input delay約束,就會(huì)變?yōu)槿缦拢?/span>
set_input_delay -clock my_clk -max 4 [get_ports ain]
?
第3節(jié) 自己分頻的時(shí)鐘
?
?
第三種就是自己分頻的時(shí)鐘。如上圖所示,CLK1經(jīng)過(guò)一個(gè)D觸發(fā)器,通過(guò)該觸發(fā)器二分頻產(chǎn)生了時(shí)鐘CLK2。
首先說(shuō)明,明德?lián)P不推薦使用此方法來(lái)產(chǎn)生時(shí)鐘,我們建議全部使用PLL等來(lái)產(chǎn)生時(shí)鐘。如果確實(shí)要用到分頻時(shí)鐘時(shí),那就要記得做時(shí)鐘約束。這種情況下要怎么進(jìn)行約束呢?下面是推薦的約束方法。
?
?
?
create_clcok –name CLK1 –period 5 [get_ports CKP1]
create_generated_clock ?-name CLK2 [get_pins REGA/Q] \
???????????????????????????????????????-source [get_ports CKP1] –divide_by 2
?
首先通過(guò)create_clock產(chǎn)生對(duì)管腳CKP1的時(shí)鐘約束,周期定為5,名字為CLK1。
然后通過(guò)create_generated_clock產(chǎn)生二分頻后的時(shí)鐘約束,對(duì)象是REGA/Q,即D觸發(fā)器的輸出信號(hào);然后要指示該時(shí)鐘來(lái)自于CKP1,通過(guò)-source來(lái)指定;最后還要說(shuō)明頻率,通過(guò)-divide_by來(lái)說(shuō)明幾分頻,-divide_by 2是表示二分頻,即CKP1時(shí)鐘的一半頻率。
注意的是,一定要通過(guò)-divide_by來(lái)指定頻率,因?yàn)楣ぞ邿o(wú)法從您的代碼中推導(dǎo)出頻率的。
強(qiáng)烈建議,分頻時(shí)鐘一定要約束,經(jīng)驗(yàn)之談,沒(méi)有約束的話,時(shí)鐘是不穩(wěn)定的,會(huì)產(chǎn)生莫名其妙的問(wèn)題的,這方面我們已經(jīng)吃過(guò)虧的。
?
第4節(jié) 總結(jié)與建議
好了,我們?cè)谶@里再總結(jié)一下。
首先,本文將時(shí)鐘約束分了好幾種情況,制成了一個(gè)表。您可以根據(jù)實(shí)際情況,對(duì)照步驟表,從而制定自己需要在我約束。
其次,注意一下約束的優(yōu)先級(jí)。
自定義約束覆蓋工具推導(dǎo)的約束。前面講過(guò),有些約束工具是可以推導(dǎo)出來(lái)的。如果自己又定義了該對(duì)象的約束,那么這個(gè)約束將覆蓋工具推導(dǎo)出來(lái)的約束,即定義的約束有效,推導(dǎo)出來(lái)的約束無(wú)效。
后定義的約束覆蓋先定義的約束。例如,在開(kāi)始的時(shí)候定義了一個(gè)對(duì)CLK的約束,定義為100M,后面又有一個(gè)對(duì)CLK的約束,定義為200M,那么以哪個(gè)為準(zhǔn)呢?那就以后面的為準(zhǔn),約束為200M。
但有時(shí)候需要對(duì)多個(gè)約束同時(shí)有效,即多個(gè)約束共存,那么可以在約束后面加上-add,以此表明不要覆蓋前面約束,而是共同有效。
?
下一篇文章,我們將具體探討“input delays約束”的內(nèi)容,講解各種情況下的時(shí)序約束方法。需要更多更詳細(xì)的資料,可以找作者了解。
審核編輯:湯梓紅
評(píng)論
查看更多