時(shí)序分析的基本步驟:
一個(gè)合理的時(shí)序約束可以分為以下步驟:
時(shí)序約束整體的思路與之前我說的方法基本一致。整體的思路如下:
先是約束時(shí)鐘,讓軟件先解決內(nèi)部時(shí)序問題;(在這一步驟中可以適當(dāng)加入時(shí)序例外,以便時(shí)序通過)
然后再加入IO的延遲約束;
最后針對(duì)沒有過的時(shí)序,添加時(shí)序例外。
在《vivado使用誤區(qū)與進(jìn)階》中,提到了一種叫 UltraFAST 的設(shè)計(jì)方法。針對(duì)下圖中所說的根據(jù)迭代結(jié)果添加必要的例外約束(步驟1),為什么是添加必要的呢?是因?yàn)殡m然是跨時(shí)鐘域,但是有時(shí)候就算不約束,時(shí)序也能過。當(dāng)碰到時(shí)序不過的時(shí)候,現(xiàn)階段可以去針對(duì)該部分路徑進(jìn)行時(shí)序例外約束,以便后續(xù)繼續(xù)分析。需要注意的是,就算沒有報(bào)時(shí)序?yàn)槔F(xiàn)階段也一定要去留意那些跨時(shí)鐘的路徑(通過clock_interaction),確認(rèn)代碼有沒有做相應(yīng)的跨時(shí)鐘域處理。針對(duì)跨時(shí)鐘域的代碼處理后面會(huì)提到。
定義時(shí)鐘約束
時(shí)鐘主要可以分為主時(shí)鐘以及衍生時(shí)鐘。
創(chuàng)建主時(shí)鐘。典型的主時(shí)鐘根包括有以下幾種情況:輸入端口、千兆位收發(fā)器輸出引腳以及某些硬件原語輸出管腳。
約束實(shí)例 :
create_clock -name SysClk -period 10 -waveform {0 5} [get_ports sysclk]
GT 收發(fā)器輸入引腳,例如已恢復(fù)的時(shí)鐘,
約束實(shí)例 :
create_clock -name txclk -period 6.667 [get_pin gt0/TXOUTCLK]
創(chuàng)建生成時(shí)鐘。
自動(dòng)衍生時(shí)鐘
大部分生成時(shí)鐘都由 Vivado 設(shè)計(jì)套件時(shí)序引擎自動(dòng)衍生獲得,該引擎可識(shí)別時(shí)鐘修改模塊 (CMB)及其對(duì)主時(shí)鐘所執(zhí)行的變換。賽靈思 7 系列器件中,CMB 是 :
? MMCM*/ PLL*
? BUFR
? PHASER*
如果 Vivado 設(shè)計(jì)套件時(shí)序引擎所選擇的自動(dòng)衍生時(shí)鐘名稱并不合適,您可以使用 create_generated_clock 命令強(qiáng)行定義自己的名稱,此時(shí)無需指定波形轉(zhuǎn)換。該約束應(yīng)剛好位于約束文件中定義主時(shí)鐘的約束之后。例如,由 MMCM 實(shí)例生成的時(shí)鐘的默認(rèn)名稱是 net0,您可以添加如下約束強(qiáng)制將其設(shè)定為自己的名稱(例如fftClk):
create_generated_clock -name fftClk [get_pins mmcm_i/CLKOUT0]
生成時(shí)鐘源自另一個(gè)現(xiàn)有時(shí)鐘(主時(shí)鐘)。通常用來描述由邏輯模塊在主時(shí)鐘上執(zhí)行的波形變換。由于生成時(shí)鐘的定義取決于主時(shí)鐘特性,因此必須首先定義主時(shí)鐘。要明確定義生成時(shí)鐘,必須使用 create_generated_clock 命令。
create_generated_clock -name GC1 -source [get_pins gen_clk_reg/C] -divide_by 2 [get_
pins gen_clk_reg/Q]
跨時(shí)終域處理
跨時(shí)鐘域處理,主要是為了避免亞穩(wěn)態(tài)的傳播(注意亞穩(wěn)態(tài)不能消除,但是可以采用一定的方式,降低其傳播的風(fēng)險(xiǎn))。觸發(fā)器進(jìn)入亞穩(wěn)態(tài)的時(shí)間可以用參數(shù)MTBF(Mean Time Between Failures)來描述,MTBF即觸發(fā)器采樣失敗的時(shí)間間隔,表示為:
例如針對(duì)單bit數(shù)據(jù)的跨時(shí)鐘域處理,是為了讓MTBF增大,使得進(jìn)入一個(gè)可接受范圍。
*跟大家探討一個(gè)問題,為什么打兩拍就可以降低亞穩(wěn)態(tài)的傳播呢?
我想到的一個(gè)場景如下:
信號(hào)a,經(jīng)過跨時(shí)鐘處理后變成了a’;這樣就可以確保在時(shí)序滿足的前提下,同一個(gè)時(shí)鐘域中的1、2、3模塊接收到的a’的值是一致的,如果不做跨時(shí)鐘域處理,由于布局布線的延遲不一樣,不能確保到達(dá)1、2、3模塊的值是一致的,從而導(dǎo)致邏輯混亂,引起系統(tǒng)的不穩(wěn)定現(xiàn)象。
IO的延遲約束
輸入延遲
外部器件發(fā)送數(shù)據(jù)到FPGA系統(tǒng)模型如下圖所示。對(duì)FPGA的IO口進(jìn)行輸入最大最小延時(shí)約束是為了讓FPGA設(shè)計(jì)工具能夠盡可能的優(yōu)化從輸入端口到第一級(jí)寄存器之間的路徑延遲,使其能夠保證系統(tǒng)時(shí)鐘可靠的采到從外部芯片到FPGA的信號(hào)。
輸入延時(shí)即為從外部器件發(fā)出數(shù)據(jù)到FPGA輸入端口的延時(shí)時(shí)間。其中包括時(shí)鐘源到FPGA延時(shí)和到外部器件延時(shí)之差、經(jīng)過外部器件的數(shù)據(jù)發(fā)送Tco,再加上PCB板上的走線延時(shí)。如下圖所示,為外部器件和FPGA接口時(shí)序。
最大輸入延時(shí)(input delay max)為當(dāng)從數(shù)據(jù)發(fā)送時(shí)鐘沿(lanuch edge)經(jīng)過最大外部器件時(shí)鐘偏斜(Tclk1),最大的器件數(shù)據(jù)輸出延時(shí)(Tco),再加上最大的PCB走線延時(shí)(Tpcb),減去最小的FPGA時(shí)鐘偏移(FTsu)的情況下還能保證時(shí)序滿足的延時(shí)。這樣才能保證FPGA的建立時(shí)間,準(zhǔn)確采集到本次數(shù)據(jù)值,即為setup slack必須為正,計(jì)算公式如下式所示:
Setup slack =(Tclk + Tclk2(min))–(Tclk1(max) +Tco(max) +Tpcb(max) +FTsu)≥0 (1)
最小輸入延時(shí)(input delay min)為當(dāng)從數(shù)據(jù)發(fā)送時(shí)鐘沿(lanuch edge)經(jīng)過最小外部器件時(shí)鐘偏斜(Tclk1),最小器件數(shù)據(jù)輸出延時(shí)(Tco),再加上最小PCB走線延時(shí)(Tpcb),此時(shí)的時(shí)間總延時(shí)值一定要大于FPGA的最大時(shí)鐘延時(shí)和建立時(shí)間之和,這樣才能不破壞FPGA上一次數(shù)據(jù)的保持時(shí)間,即為hold slack必須為正,計(jì)算公式如下式所示:
Hold slack = (Tclk1(min) + Tco(min) + Tpcb(min))–(FTh + Tclk2(max))≥ 0 (2)
我們很容易就可以從公式(1)和(2),推到出(3)
Tclk – Ftsu ≥Tclk1 - Tclk2 + Tco + Tpcb ≥ FTh (3)
在公式(3)中,我們發(fā)現(xiàn)Tclk 、Ftsu以及FTh,對(duì)于工具來說是已知的,而Tclk1 - Tclk2 + Tco + Tpcb正是我們需要告知綜合工具的延遲量。
從我們推到出的公式,我們可以得到
Input_delay_max = Tclk – Ftsu; Input_delay_min = FTh ;
輸出延遲
FPGA輸出數(shù)據(jù)給外部器件模型如下圖所示。對(duì)FPGA的IO口進(jìn)行輸出最大最小延時(shí)約束是為了讓FPGA設(shè)計(jì)工具能夠盡可能的優(yōu)化從第一級(jí)寄存器到輸出端口之間的路徑延遲,使其能夠保證讓外部器件能準(zhǔn)確的采集到FPGA的輸出數(shù)據(jù)。
輸出延時(shí)即為從FPGA輸出數(shù)據(jù)后到達(dá)外部器件的延時(shí)時(shí)間。其中包括時(shí)鐘源到FPGA延時(shí)和到外部器件延時(shí)之差、PCB板上的走線延時(shí)以及外部器件的數(shù)據(jù)建立和保持時(shí)間。如所示,為FPGA和外部器件接口時(shí)序圖。
最大輸出延時(shí)(output delay max)為當(dāng)從FPGA數(shù)據(jù)發(fā)出后經(jīng)過最大的PCB延時(shí)、最小的FPGA和器件時(shí)鐘偏斜,再加上外部器件的建立時(shí)間。約束最大輸出延時(shí),是為了約束IO口輸出,從而使外部器件的數(shù)據(jù)建立時(shí)間,即為setup slack必須為正,計(jì)算公式如下式所示:
Setup slack =(Tclk + Tclk2(min))–(Tclk1(max) +FTco(max) +Tpcb(max) +Tsu)≥0 (4)
最小輸出延時(shí)(output delay min)為當(dāng)從FPGA數(shù)據(jù)發(fā)出后經(jīng)過最小的PCB延時(shí)、最大的FPGA和器件時(shí)鐘偏斜,再減去外部器件的建立時(shí)間。約束最小輸出延時(shí),是為了約束IO口輸出,從而使IO口輸出有個(gè)最小延時(shí)值,防止輸出過快,破壞了外部器件上一個(gè)時(shí)鐘的數(shù)據(jù)保持時(shí)間,導(dǎo)致hlod slack為負(fù)值,不能正確的鎖存到數(shù)據(jù),最小輸出延時(shí)的推導(dǎo)計(jì)算公式如下式所示:
Hold slack = (Tclk1(min) + FTco(min) + Tpcb(min))–(Th + Tclk2(max))≥ 0 (5)
我們很容易就可以從公式(4)和(5),發(fā)現(xiàn)這兩條公式與前面推導(dǎo)輸入延遲如出一轍。只不過現(xiàn)在FPGA變成了輸出器件,而Tsu、Th是下游器件的參數(shù),綜合工具并不知情,需要我們告訴他。除了FTco以外,其他參數(shù)都需要我們告訴工具。
由公式(4)我們可以推導(dǎo)出:
FTco(max) + Tpcb(max) –(Tclk2(min) – Tclk1(max)+Tsu ≤Tclk
那么output delay max = Tpcb(max) –(Tclk2(min) – Tclk1(max)+Tsu
同理我們由公式(5)可以推導(dǎo)出:
FTco(min) + Tpcb(min) – (Tclk2(max) – Tclk1(min))– Th ≥ 0
那么output delay min = Tpcb(min) – (Tclk2(max) – Tclk1(min))– Th
時(shí)鐘為例的一些處理方法
下面是我收集到的一些針對(duì)時(shí)序?yàn)槔某R?guī)處理辦法,也記錄下來與大家分享一下:
下面介紹主要面對(duì)的兩個(gè)時(shí)序問題的處理技巧。
1)setup time 建立時(shí)間問題
建立時(shí)間是工程設(shè)計(jì)中最常遇到的問題了。一般說來,導(dǎo)致建立時(shí)間違例主要有兩個(gè)原因:邏輯級(jí)數(shù)太大或者扇出太大。
打開Report Timing Summary界面查看路徑延遲信息。
Levels指的是邏輯級(jí)數(shù)logic level,一個(gè)logic level的延遲對(duì)應(yīng)的是一個(gè)LUT和一個(gè)Net的延遲,對(duì)于不同的器件,不同頻率的設(shè)計(jì)能容納的logic level是不同的。假設(shè)7系列的-2速度等級(jí)250MHz的設(shè)計(jì),電路設(shè)計(jì)的大部分levels最好不要超過8,否則會(huì)造成時(shí)序收斂困難。
Logic level太大的處理方法就是重定時(shí)(Retiming)了,典型的重定時(shí)方法就是流水線,將過于冗長的組合邏輯增加寄存器進(jìn)行打拍。
High Fanout指的是扇出,同樣和器件、設(shè)計(jì)頻率等有關(guān),如下圖所示:
降低扇出最好不要在綜合設(shè)置中指定,過低的扇出限制會(huì)造成設(shè)計(jì)堵塞反而不利于時(shí)序收斂,最好的方法是根據(jù)設(shè)計(jì)中時(shí)序最差路徑的扇出進(jìn)行針對(duì)性的優(yōu)化。如果是寄存器的輸出扇出很大,可以使用max_fanout屬性標(biāo)記寄存器聲明,也可以手動(dòng)復(fù)制寄存器,具體可參考:https://blog.csdn.net/shshine/article/details/52451997
如果不是關(guān)鍵時(shí)序路徑,而且高扇出網(wǎng)絡(luò)直接連接到觸發(fā)器,對(duì)扇出超過25K的net插入BUFG:
set_property CLOCK_BUFFER_TYPE BUFG [get_nets netName]
當(dāng)然,也可以在后期Implementation的物理優(yōu)化設(shè)置中優(yōu)化扇出。
2)hold time 保持時(shí)間問題
在實(shí)踐中,我發(fā)現(xiàn)保持時(shí)間問題的問題往往是異步處理的問題。
對(duì)于一個(gè)信號(hào)的跨時(shí)鐘域問題,一般使用雙寄存器法(對(duì)于慢采快的結(jié)繩法這里不討論)。為了降低MTBF(Mean Time Between Failures,平均無障礙時(shí)間),這兩個(gè)寄存器最好位于同一個(gè)slice中。可以使用tcl語言指定,如:
set_property ASYNC_REG TRUE [get_cells [list sync0_reg sync1_reg]]
也可以直接在代碼中指定:
(* ASYNC_REG = "TRUE" *) (* keep = "true" *)reg sync0_reg, sysnc1_reg;
也可以參考代碼模板使用XPM模板進(jìn)行處理。
**注意:
在發(fā)現(xiàn)同一個(gè)時(shí)鐘域中,時(shí)序還不滿足要求,那應(yīng)該怎么處理呢?
(這時(shí)候只能在修改代碼方向努力了,回到Chipplanner中,分析關(guān)鍵路徑,看布線后的路徑是否過長,導(dǎo)致影響時(shí)序。還是由于高扇出導(dǎo)致時(shí)序?yàn)槔a槍?duì)不同的原因,修改代碼。比如說,路徑過長,通常檢測是否代碼中嵌套的if語句級(jí)數(shù)太多?(可以嘗試case語句替代),又或者if的判斷中有表達(dá)式(if(a>b)之類的,看能否用電平替代,if(en)等,)對(duì)于有些邏輯融合起來一個(gè)大的模塊,看能否將大的邏輯塊劃分為若干個(gè)小邏輯塊實(shí)現(xiàn)。
針對(duì)高扇出問題,上述已提到相應(yīng)的處理方式。
寫到最后想說的是,調(diào)時(shí)序是一個(gè)比較難啃的活,有時(shí)候你增加了約束可能時(shí)序還會(huì)變的更差了,所以說一個(gè)良好的代碼風(fēng)格很重要。假如上述的方法都已經(jīng)試過了,時(shí)序還是很難滿足,可能器件已經(jīng)快到達(dá)極限了,尤其是資源占用率比較高的時(shí)候。這時(shí)候只能降低時(shí)鐘或者替換更高性能的器件啦。
原文標(biāo)題:FPGA學(xué)習(xí)-時(shí)序分析vivado篇
文章出處:【微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
收發(fā)器
+關(guān)注
關(guān)注
10文章
3454瀏覽量
106248 -
軟件
+關(guān)注
關(guān)注
69文章
5013瀏覽量
88081 -
時(shí)序分析
+關(guān)注
關(guān)注
2文章
127瀏覽量
22617
原文標(biāo)題:FPGA學(xué)習(xí)-時(shí)序分析vivado篇
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論