STA(Static Timing Analysis,即靜態(tài)時(shí)序分析)在實(shí)際FPGA設(shè)計(jì)過程中的重要性是不言而喻的,其作用是:
1. 幫助分析和驗(yàn)證一個(gè)FPGA設(shè)計(jì)的時(shí)序是否符合要求;
2. 指導(dǎo)fitter(布線綜合器)布局布線出符合要求的結(jié)果;
簡單地說,靜態(tài)時(shí)序分析(STA)告訴我們電路的實(shí)際表現(xiàn)如何,而提供約束(SDC文件,即上面的要求)來告訴分析工具我們希望電路的表現(xiàn)應(yīng)該是怎樣。Quartus II自帶的STA工具TimeQuest TA在整個(gè)FPGA設(shè)計(jì)過程中的使用流程如下圖所示:
圖 1 TimeQuest TA使用流程
簡而言之,我們需要學(xué)會(huì):
A. 正確理解時(shí)序,看背景知識(shí)介紹
B. 正確編寫SDC文件,以及利用TimeQuest TA生成SDC約束命令,SDC介紹
C. 利用TimeQuest TA來查看和驗(yàn)證時(shí)序
一、 背景知識(shí)介紹:
1.1 啟動(dòng)沿(launch)和鎖存沿(latch):
圖 2 啟動(dòng)沿和鎖存沿
啟動(dòng)沿:數(shù)據(jù)被launch的時(shí)鐘邊沿;也就是說,每一個(gè)啟動(dòng)沿,一般都會(huì)產(chǎn)生一個(gè)新的數(shù)據(jù)!
鎖存沿:數(shù)據(jù)被latch的時(shí)鐘邊沿;也就是說,每一個(gè)鎖存沿,都會(huì)有一個(gè)新的數(shù)據(jù)被保存!
對于如上圖所示的級聯(lián)的寄存器電路而言(忽略上一級觸發(fā)器輸出到下一級觸發(fā)器輸入之間的邏輯關(guān)系),一般藍(lán)色的上升沿作為第一個(gè)觸發(fā)器的啟動(dòng)沿,而紅色的上升沿(一般都是緊跟著啟動(dòng)沿后的有效邊沿)。所以說:藍(lán)色的啟動(dòng)沿之后由REG1輸出有效數(shù)據(jù),并在紅色的邊沿被鎖存進(jìn)REG2并輸出到下級。
1.2 建立(setup)和保持(hold)時(shí)間
圖 3 建立和保持時(shí)間
上述的鎖存沿會(huì)將數(shù)據(jù)保存下來,但是必須要滿足一定的條件:
建立時(shí)間Tsu:在時(shí)鐘有效沿之前,數(shù)據(jù)必須保持穩(wěn)定的最小時(shí)間;
保持時(shí)間Th:在時(shí)鐘有效沿之后,數(shù)據(jù)必須保持穩(wěn)定的最小時(shí)間;
這就相當(dāng)于一個(gè)窗口時(shí)間,在有效邊沿的窗口時(shí)間內(nèi),數(shù)據(jù)必須保持穩(wěn)定;這里的時(shí)鐘信號時(shí)序和數(shù)據(jù)信號時(shí)序,都是寄存器實(shí)際感受到的時(shí)序;什么事實(shí)際感受到的,下面會(huì)繼續(xù)分析;
1.3 數(shù)據(jù)到達(dá)時(shí)間(DAT:data arrival time)
所有的信號在FPGA內(nèi)部傳播都會(huì)有延時(shí),包括時(shí)鐘信號、數(shù)據(jù)信號(實(shí)際上不該如此可以的區(qū)分這兩種信號,在一定條件下,這兩個(gè)信號可能可以相互轉(zhuǎn)換,這個(gè)是題外話了),也就是說,從信號的發(fā)出點(diǎn)到信號的接收點(diǎn),會(huì)存在一個(gè)延時(shí),這個(gè)延時(shí)可能是因?yàn)镕PGA內(nèi)部空間分布所致,也有可能是因?yàn)榻M合邏輯造成,這里不再深究;
圖 4 數(shù)據(jù)到達(dá)時(shí)間示意圖
正如上圖所示,在計(jì)算數(shù)據(jù)到達(dá)時(shí)間時(shí),一般都會(huì)存在3個(gè)延時(shí):
1. Tclk1:時(shí)鐘信號從起點(diǎn)(一般是PLL輸出或者時(shí)鐘輸入引腳)到達(dá)啟動(dòng)寄存器(或說啟動(dòng)觸發(fā)器)的相應(yīng)clk端口所耗的時(shí)間;假如CLK是由PLL發(fā)出的時(shí)鐘信號(稱之為源時(shí)鐘),這個(gè)信號經(jīng)過FPGA內(nèi)部的“連線”最終來到了REG1(啟動(dòng)觸發(fā)器)的clk端,所以此時(shí)在REG的clk1處也會(huì)有周期性的時(shí)鐘信號REG1.CLK(如圖所示);可以看到,此時(shí)的CLK(源時(shí)鐘)和REG1.CLK實(shí)際上有個(gè)(相位差)時(shí)間差,這個(gè)時(shí)間差就是Tclk1;
2. Tco:啟動(dòng)寄存器內(nèi)部延時(shí),是寄存器REG1感受到有效的上升沿后,到數(shù)據(jù)真正從從REG1的Q輸出之間延時(shí);請注意:上述所謂的有效的上升沿,就是REG1.CLK,而不是CLK;所以實(shí)際的有效數(shù)據(jù)輸出的時(shí)序如上圖的REG1.Q;
3. Tdata:數(shù)據(jù)從上級寄存器輸出Q(經(jīng)過所有其他組合邏輯以及FPGA內(nèi)部走線)到下級寄存器的數(shù)據(jù)輸入D之間的延時(shí);如圖所示,數(shù)據(jù)從從REG1的Q流向了REG2的D,所以REG2.D實(shí)際感受到的數(shù)據(jù)時(shí)序是REG2.D;
假如將上圖中的launch Edge作為時(shí)間0點(diǎn),將一些列的延時(shí)累加,所得結(jié)果稱之為數(shù)據(jù)到達(dá)時(shí)間,DAT:
DAT=啟動(dòng)沿+Tclk1+Tco+Tdata;
1.4 數(shù)據(jù)建立需要時(shí)間(DRTsu:data require time (setup))
圖 5 數(shù)據(jù)建立需要時(shí)間
分析方法同上,需要計(jì)算數(shù)據(jù)建立時(shí)間,也需要兩個(gè)延時(shí):
1. Tclk2,不同于上述的Tclk1,這個(gè)延時(shí)是時(shí)鐘從起點(diǎn)(一般是PLL或者時(shí)鐘輸入引腳)到鎖存觸發(fā)器之間的延時(shí);如上圖所示,REG2實(shí)際感受到的時(shí)鐘來自于其本身的clk引腳,而不是源時(shí)鐘CLK,他們之間存在一個(gè)延時(shí),即Tclk2;所以REG2實(shí)際感受到的時(shí)鐘,實(shí)際上是上圖的REG2.CLK;
2. Tsu:上面分析過了,每一個(gè)數(shù)據(jù)被鎖存都要滿足建立時(shí)間和保持時(shí)間,Tsu就是建立時(shí)間,也就是在REG2實(shí)際感受到Latch Edge時(shí),數(shù)據(jù)如果需要被正確鎖存,就必須提前Tsu的時(shí)間來到REG2的D;
綜合時(shí)鐘走線延時(shí)Tclk2以及Tsu,我們得到了數(shù)據(jù)建立時(shí)間DRTsu:
DRTsu=鎖存沿+Tclk2-Tsu。
也就是說在DRTsu時(shí)刻之前,數(shù)據(jù)必須已經(jīng)有效且穩(wěn)定
1.5 數(shù)據(jù)保持需要時(shí)間(DRTh:data require time (hold))
圖 6 數(shù)據(jù)保持需要時(shí)間
即DRTh=鎖存沿+Tclk2+Th;
也就是說,數(shù)據(jù)在DRTh時(shí)間之前必須保持住不變;
1.6 建立時(shí)間裕量(Setup Slack)
建立時(shí)間裕量指的是數(shù)據(jù)到達(dá)時(shí)間和數(shù)據(jù)建立需要時(shí)間之間的關(guān)系:
圖 7 建立時(shí)間裕量
如上圖所示,在0時(shí)刻(Launch edge),源時(shí)鐘CLK說,“啊,我要產(chǎn)生一個(gè)新的數(shù)據(jù)”,但是這個(gè)命令(啟動(dòng)沿)并沒有馬上傳達(dá)到REG1,而是有個(gè)延時(shí)Tclk1。所以在Tclk1時(shí)刻,REG1終于聽到了(感受到了有效的時(shí)鐘上升沿,就是啟動(dòng)沿)老大的命令,就開始準(zhǔn)備,他憋了一會(huì)兒,又延時(shí)了Tco,終于產(chǎn)生了數(shù)據(jù)(REG1.Q上有了valid data);這個(gè)有效數(shù)據(jù)也是慢吞吞的來到了他的終點(diǎn),又浪費(fèi)了Tdata。最終在Tclk1+Tco+Tdata時(shí)間后,REG2得到了這個(gè)數(shù)據(jù);別以為REG2得到這個(gè)數(shù)據(jù)就完事了,REG2也是個(gè)傲嬌的娃,怎么個(gè)傲嬌法,下面繼續(xù)分析;老大CLK在0時(shí)刻發(fā)送了啟動(dòng)沿之后,休息了一個(gè)時(shí)鐘周期,在Latch edge時(shí)突然想起來,剛才讓REG1發(fā)出的數(shù)據(jù),REG2要接受啊,不然就浪費(fèi)了,于是乎他又對REG2下達(dá)了命令,新數(shù)據(jù)要來了,準(zhǔn)備好接受!但是這個(gè)命令也不是馬上就到了REG2的耳中,而是經(jīng)過了Tclk2的時(shí)間。等到REG2接收到命令后(實(shí)際感受到了有效的Latch Edge),他就看看自己家門口沒有數(shù)據(jù)已經(jīng)來了(檢查REG2.D是否有數(shù)據(jù)),同時(shí)要看看這個(gè)數(shù)據(jù)是不是符合他的胃口的(滿足鎖存的條件),他要求數(shù)據(jù)必須在他接收到老大命令的時(shí)候已經(jīng)等了Tsu時(shí)間(數(shù)據(jù)建立時(shí)間),由要求這個(gè)數(shù)據(jù)在他家門口不能早退,必要再保持Th時(shí)間(數(shù)據(jù)保持),如果都滿足了,REG2就開心的接受了這個(gè)數(shù)據(jù),反之,他就會(huì)覺得,REG1準(zhǔn)備的數(shù)據(jù)太懶惰了(沒有提前Tsu時(shí)間到達(dá)),又或者性子太急(沒有多逗留th),一概不收!
所以這里涉及到兩個(gè)要求,第一個(gè)就是建立時(shí)間裕量:
正如上圖所示Setup Slack=DRTsu-DAT。
如果Setup Slack為正,則說明數(shù)據(jù)在規(guī)定的時(shí)間內(nèi)達(dá)到了目標(biāo)。反之,則認(rèn)為數(shù)據(jù)并沒有在規(guī)定的時(shí)間達(dá)到目標(biāo),此時(shí)REG2鎖存的數(shù)據(jù)很有可能是亞穩(wěn)態(tài);
1.7 保持時(shí)間裕量(hold slack)
圖 8保持時(shí)間裕量
如上所述,hold slack = DAT – DRTh
如果為正,則認(rèn)為數(shù)據(jù)在被鎖存的時(shí)候有足夠多的穩(wěn)定時(shí)間,是有效的。反之則認(rèn)為數(shù)據(jù)有誤或者數(shù)據(jù)可能是亞穩(wěn)態(tài);
小結(jié):
理解了上面的7個(gè)概念,就明白了:如果時(shí)鐘頻率過快或者數(shù)據(jù)延時(shí)太大,都會(huì)導(dǎo)致錯(cuò)誤的時(shí)序。在FPGA內(nèi)部寄存器到內(nèi)部寄存器之間,所有的延時(shí)都是建立在時(shí)序模型上的,如slow和fast,這些模型從兩個(gè)極端工作情況來分析FPGA能否正常工作;只要滿足這兩個(gè)工況,則FPGA在其他環(huán)境下都能滿足時(shí)序!
??
審核編輯:劉清
評論