文章目前大部分參考明德?lián)P時序約束,只是一個學(xué)習(xí)總結(jié),侵權(quán)刪
原文鏈接:FPGA時序約束分享04_output delay 約束
一、建立時間和保持時間是什么?
時序邏輯電路的基礎(chǔ)是觸發(fā)器FF:
建立時間:Setup Time,縮寫是 Tsu,即在時鐘上升沿之前數(shù)據(jù)必須穩(wěn)定的最短時間
保持時間:Hold Time,縮寫是 Th,即在時鐘上升沿之后數(shù)據(jù)必須穩(wěn)定的最短時間
亞穩(wěn)態(tài);semi-stable state,在數(shù)據(jù)的建立時間和保持時間中對信號進(jìn)行采樣,導(dǎo)致輸出無法預(yù)測的狀態(tài)。
建立時間和保持時間是觸發(fā)器的固定屬性,也就是說同一FPGA型號其所有的FF的建立時間和保持時間都是相同的。
關(guān)于FPGA對應(yīng)的建立時間和保持時間可以通過手冊來查詢,也可以用vivado做時序分析時查詢。
高級的FPGA芯片其建立時間和保持時間會比低級的FPGA芯片較小,這也是其能運(yùn)行頻率更高的原因。
二、時序分析分類
時序分析的目的就是檢查設(shè)計(jì)中所有的 D 觸發(fā)器的同步端口(數(shù)據(jù)輸入端口)的變化是否滿足建立時間要求 (Setup)和保持時間要求(Hold);檢查 D 觸發(fā)器的異步端口(異步復(fù)位端口)的變化是否滿足恢復(fù)時間要求(Recovery)和移除時間要求(Removal)。
動態(tài)時序分析:將布局布線生成的布線延遲信息反標(biāo)注到門級網(wǎng)表中進(jìn)行仿真,檢查是否存在時序違例。此時的仿真包括門延遲和布線延遲信息,能夠較好反應(yīng)芯片的實(shí)際工作情 況。因?yàn)椴豢赡墚a(chǎn)生完備的測試向量,覆蓋門級網(wǎng)表中的每一條路徑。因此在動態(tài)時序分析 中,無法暴露一些路徑上可能存在的時序問題。
靜態(tài)時序分析:遍歷提取出整個電路存在的所有時序路徑,計(jì)算信號的傳播延時,檢查建立和保持時間是否滿足時序要求,通過對最大路徑延時和最小路徑延時的分析,找出違背時序約束的錯誤。運(yùn)行速度很快、占用內(nèi)存較少,不僅可以全面的時序檢查,而且還可利用時序分析的結(jié)果來優(yōu)化設(shè)計(jì),因此靜態(tài)時序分析應(yīng)用多。
三、時鐘約束方法
主要分為四部分:時鐘約束、輸入延時約束、輸出延時約束、時序例外。
3.1 時鐘約束
時鐘約束有三種情況:輸入時鐘、PLL等衍生時鐘、自己分頻的時鐘。
- 輸入時鐘就是時鐘從FPGA管腳進(jìn)來的,可分為單端、差分、GT或恢復(fù)時鐘。
- 單端:普通低速晶振,單端信號
生成時鐘約束,名字叫SysClk(隨意命名)周期為10ns(單位默認(rèn)ns),在第0時刻上升,在第5時鐘下降(占空比),約束對象(get_ports)是代碼中的Clk信號。
如果Clk經(jīng)過了內(nèi)部的PLL或者M(jìn)MCM(時鐘管理單元),約束對象還是Clk
- 差分:高速晶振、LDVS接口
ALTER:接口信號只有一個,管腳定義有P和N
約束方法和單端一樣
XILINX:頂層接口中,差分時鐘有兩個接口信號P和N
只對P端約束:
create_clock -name SysClk -period 10 -waveform {0 5} [get_ports Clk_p]
- GT或恢復(fù)時鐘,使用了告訴的收發(fā)器,在高速收發(fā)器管腳中,是沒有時鐘的,時鐘已經(jīng)嵌入到數(shù)據(jù)里面,使用FPGA的GTX IP核接收數(shù)據(jù),并且從數(shù)據(jù)恢復(fù)出時鐘。這個恢復(fù)出來的時鐘就是此種情形。最常見的就是光纖接口。
使用GTX、GTY IP核來接受數(shù)據(jù)并且提取時鐘,就像圖中的GT模塊
這里注意約束對象的語法不同,不是通過get_ports,而是通過get_pins找到對象(ports是輸入管腳端口,這里是一個模塊的pins),/前面是模塊,后面是pins的名字,這里的名字不能是例化后的名字了,需要找到GT模塊的輸出時鐘名字
- 一般PLL時鐘由FPGA自行推導(dǎo),無需約束,但是實(shí)際中強(qiáng)烈建議約束
輸出時鐘是CLKOUT0。
一般這些在生成IP核的時候,就設(shè)置了輸入輸出的時鐘頻率,相位等信息。XILINX可以不用約束,但是ALTER需要添加命令:derive_pll_clocks(約束起的時鐘名看不到 -name后面那個),這種可能導(dǎo)致失效
所以還是自己添加約束:
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
對輸入管腳Clk約束,之后create_geneated_clock對MMCM產(chǎn)生的CLKOUT0約束,-source表明來源于MMCM/CLKIN,即MMCM的輸入管腳。通過-master_clock表明其主時鐘是clk_200。
- 不建議自己分頻時鐘,如果用到了,要記得約束
建議利用PLL的IP核來產(chǎ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
對輸入管腳CKP1的時鐘約束,周期定為5,名字為CLK1。
通過create_generated_clock(生成時鐘約束)產(chǎn)生二分頻后的時鐘約束,對象是REGA/Q,即D觸發(fā)器的輸出信號;然后要指示該時鐘來自于CKP1,通過-source來指定;最后還要說明頻率,通過-divide_by來說明幾分頻,-divide_by 2是表示二分頻,即CKP1時鐘的一半頻率。一定要通過-divide_by來指定頻率,因?yàn)楣ぞ邿o法從您的代碼中推導(dǎo)出頻率的。
強(qiáng)烈建議,分頻時鐘一定要約束,經(jīng)驗(yàn)之談,沒有約束的話,時鐘是不穩(wěn)定的,會產(chǎn)生莫名其妙的問題的,這方面我們已經(jīng)吃過虧的。
3.2 輸入延時約束
主要包括了系統(tǒng)同步、源同步和有數(shù)據(jù)無時鐘
FPGA接收到的數(shù)據(jù)(Din)是由上游器件產(chǎn)生的,理想情況下,輸入數(shù)據(jù)的變化應(yīng)該在時鐘的上升沿對齊,但是由于器件和傳輸延時
每次延時都是不確定的,相位差在不斷變化
所以需要把延時確定在最大和最小值之間,就是上面中間的灰色劃分區(qū)域,上圖就是FPGA接收的數(shù)據(jù)和時鐘
輸入延時(input delay)的定義:數(shù)據(jù)相對于時鐘的延時,即數(shù)據(jù)時間-時鐘上升沿時間。當(dāng)延時在時鐘右邊時,輸入延時是正的,當(dāng)延時變化點(diǎn)在時鐘上升沿左邊時,輸入延時是負(fù)的。
set_input_delay -clock <clock_name>
設(shè)置輸入延時約束,<clock_name> 時鐘名(之前已經(jīng)約束好的,可以是真實(shí)時鐘也可以是虛擬時鐘),是想要設(shè)定input約束的端口名,可以是一個或數(shù)個port(數(shù)據(jù)輸入端口)。
-max ,輸入的最大延時,用于建立時間setup的分析
-min ,輸入的最小延時,用于保持時間hold的分析
例如:
set_input_delay -clock [get_clocks clk0] -min 0.5 [get_ports Din[*]]
set_input_delay -clock [get_clocks clk0] -max 1.5[get_ports Din]*]]
上面約束了信號Din相對于時鐘域clk0,有最小延時0.5和最大延時1.5ns。(clk0是之前已近約束好的名字)
綜合工具發(fā)現(xiàn)不滿足條件的時候,就會自動調(diào)整內(nèi)部延時,例如增加一些BUF,或者增加線長等方式,使得信號最終到達(dá)D觸發(fā)器時,能夠滿足建立時間和保持時間的要求。所以需要知道輸入的延時才能調(diào)整。
參數(shù)來源:
這個延時時間通常在數(shù)據(jù)手冊會清楚地標(biāo)明輸出數(shù)據(jù)和時鐘的延時范圍,通常是寄存器延時TCKO等,走線延時需要根據(jù)長度計(jì)算,第二種就需要用示波器測量了,如眼圖模式測量
眼圖模式:
眼圖,是由于示波器的余暉作用,將掃描所得的每一個碼元波形重疊在一起,從而形成眼圖。
- 系統(tǒng)同步:整個電路板上FPGA以及上游器件都共用一個時鐘,并且相位嚴(yán)格相同。板級走線也要對齊。主要是所有器件一個時鐘,大部分也只是用在SDR。
時鐘到各個器件的延時是一樣的,這意味著設(shè)置輸入延時時,不需要考慮時鐘的延時,可以認(rèn)為時鐘延時是0,我們只需要考慮數(shù)據(jù)延時。
假設(shè)通過查閱數(shù)據(jù)手冊,得到TCKO最小是1ns,最大是2ns;通過計(jì)算布線長度,得到線延時最小是0.3ns,最大是0.4ns。由此可計(jì)算得到,輸入最小延時:最小的TCKO+最小的線延時,即1.3ns;輸入最大延時:最大的TCKO+最大的線延時,即2.4ns。
set_input_delay -clock sysclk -min 1.3 [get_ports Din]
set_input_delay -clock sysclk -max 2.4 [get_ports Din]
利用示波器看:
這里選A為時鐘的上升沿,我猜:因?yàn)橐烙?jì)延時,所以時鐘選已經(jīng)穩(wěn)定的時候,B和C是數(shù)據(jù)變化最近和最遠(yuǎn)的地方(或者因?yàn)锳是數(shù)據(jù)中心,此時離邊界最遠(yuǎn),估算的最保險?時鐘也不知道接進(jìn)示波器沒,采用中心對齊方式?應(yīng)該是中心對齊方式)
- 源同步:上游器件把數(shù)據(jù)和時鐘信號一起送到FPGA上:
- 2.1 SDR:SDR是指時鐘是單沿有效的方式,比如只用上升延采集數(shù)據(jù)。SDR約束的參數(shù),其獲取的方法有兩種:查看上游器件手冊(通過查看上游器的數(shù)據(jù)手冊,獲取參數(shù))以及通過示波器測量(通過示波器測量信號的相位差,獲取參數(shù))。
通過示波器觀察:(還是中心對齊方式)
A是時鐘上升沿處,B是眼圖的左側(cè),定義為DV(befre),C處是眼圖的右側(cè),定義為DV(altera)
這個最小延時應(yīng)該是AC之間吧,AB應(yīng)該就是負(fù)數(shù)了。
-
2.2 DDR:DDR是時鐘雙沿有效。也就說上升延和下降延都采集。例如說我們的DDR2、DDR3的時鐘,都是上下降沿一直采數(shù)據(jù)的;包括千兆網(wǎng)的RGMII接口,也是通過雙沿的方式。
-
中心對齊方式指時鐘邊沿始終在數(shù)據(jù)的中間,時鐘上升沿的左右兩邊,數(shù)據(jù)都是穩(wěn)定的。
-
邊沿對齊指時鐘和數(shù)據(jù)邊沿對齊的,在時鐘變化沿兩邊,其數(shù)據(jù)是不穩(wěn)定的。
下面介紹的是中心對齊
上升沿:
最小延時:B到A的時間,dv_are
最大延時:C到A,半個時鐘周期-dv_bfe。
下降沿:
最小延時:B到A的時間,dv_are
最大延時:C到A,根據(jù)周期性,上圖中的C和D是相同的點(diǎn)。
假設(shè):時鐘的頻率為:100M,即周期為10ns;
數(shù)據(jù)data的dv_bre:0.4ns
數(shù)據(jù)data的dv_are:0.6ns
數(shù)據(jù)data的dv_bfe:0.7ns
數(shù)據(jù)data的dv_afe:0.2ns
前兩個上升沿的約束,后面的下降沿的約束,使用-clock_fall表示下降沿;使用-add_delay表示與前面的約束一起生效。
set_input_delay -clock clk -max 4.3 [get_ports data]
set_input_delay -clock clk -min 0.6 [get_ports data]
set_input_delay -clock clk -max 4.6 [get_ports data] -clock_fall -add_delay
set_input_delay -clock clk -min 0.2 [get_ports data] -clock_fall -add_delay
邊沿對齊:
最小延時:B到A的時間
最大延時:C到A
輸入延時的定義,是“產(chǎn)生的數(shù)據(jù)”到“產(chǎn)生該數(shù)據(jù)的時鐘沿”的距離。Fall_data是由A產(chǎn)生的,B到C區(qū)域,都是Fall_Data的變化區(qū)域,所以應(yīng)該看的是B和C到A的距離 。這個時候,B在A的左邊,說明該值是負(fù)數(shù)。
時鐘的頻率為:100M,即周期為10ns;
數(shù)據(jù)data的skew_bre:0.6ns
數(shù)據(jù)data的skew_are:0.4ns
數(shù)據(jù)data的skew_bfe:0.3ns
數(shù)據(jù)data的skew_afe:0.7ns
set_input_delay -clock clk -max 0.4 [get_ports data]
set_input_delay -clock clk -min -0.6 [get_ports data]
set_input_delay -clock clk -max 0.7 [get_ports data] -clock_fall -add_delay
set_input_delay -clock clk -min -0.3 [get_ports data] -clock_fall -add_delay
- 有數(shù)據(jù)無時鐘:例如串口這種,根據(jù)波特率匹配采集數(shù)據(jù)。這就要做好同步化和處理好亞穩(wěn)態(tài)(參考之前的文章)
這里也要做時鐘約束,不是為了調(diào)整延時,是為了不產(chǎn)生警告,防止遺漏。
一般構(gòu)造一個虛擬時鐘,隨意頻率,同時輸入延時也是隨意設(shè)置的
create_clock -period 20 -name clk_50_virtua
set_input_delay -max 5.2 -clock clk_50_virtual [get_ports i_data]
3.3輸出延時約束
主要包括系統(tǒng)同步和源同步
- 系統(tǒng)同步:FPGA往下游器件發(fā)送數(shù)據(jù),這時候只傳送數(shù)據(jù)線就可以了。而時鐘跟FPGA共用一個的,不需要傳時鐘。
- 源同步:同上
3.4時序例外
一般用在clock與IO都約束后,還是不滿足時序要求的情況下。主要包括多周期路徑、不需要檢查的路徑和組合電路延時等三種情況。
- 多周期路徑:完成一個運(yùn)算需要超過1個時鐘周期的情形,多周期路徑在IC設(shè)計(jì)領(lǐng)域運(yùn)用較多,但在FPGA里應(yīng)用較少。
- 常量或偽常量信號、互斥路徑和異步時鐘不需要分析。常量一般不會變?;コ饴窂胶唵握J(rèn)為是雙向端口。異步時鐘一般會進(jìn)行同步化操作。
- 組合電路延時就是說我從這個管腳到另一個管腳之間,另一個管腳進(jìn)來,這個管腳出去中間沒有任何一個時鐘,這是組合電路給延時的一種情況。
四、時序約束語法補(bǔ)充
1.從所有輸入端口中去除時鐘clk:
[ remove_from_collection [ all_inptus ] [ get_ports clk ] ]
2.移除多個時鐘:
[remove_from_collection [all_inptus] [get_ports “clk1 clk2”]]
3.對除時鐘外的所有輸入端口設(shè)置約束:
set_input_delay 3.5 -clock clk -max [remove_from_collection [all_inputs] [get_ports clk]]
4.輸出延時:
set_output_delay -max 5 -clock clk [get_ports B]
5.時鐘不需要輸入延遲約束:
remove_input_delay [get ports clk]
6.對時鐘的偏移和抖動進(jìn)行建模,通常只約束建立時間:
建立時間的偏移:set_clock_uncertainty -setup 0.5 [get_clocks clk]
保持時間的偏移:set_clock_uncertainty -hold 0.5 [get_clocks clk]
上升沿和下降沿的偏移:set_clock_uncertainty -rise 0.2 -fall -0.5 [get_clocks clk]
7.約束最大的轉(zhuǎn)換時間(升轉(zhuǎn)換時間為電壓的20%上升至80%的時間,下降的轉(zhuǎn)換時間為電壓的80%下降至20%的時間):
set_clock_transition -max 0.2 [get_clocks clk]
8.時鐘延遲建模:
對時鐘源延時進(jìn)行約束:set_clock_latency -source 3 [get_clocks clk]
布局布線前對network latency的約束:set_clock_latency 3 [get_clocks clk]
在布局布線后可以計(jì)算實(shí)際的network latency,使用該命令代替上述命令:set_propagated_clock 2 [get_clocks clk]文章來源:http://www.zghlxwxcb.cn/news/detail-778612.html
參考鏈接:DC(三)——時鐘約束文章來源地址http://www.zghlxwxcb.cn/news/detail-778612.html
到了這里,關(guān)于FPGA時序約束(一)基本概念入門及簡單語法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!