FPGA設計之時序約束

在FPGA的設計當中,時序約束的重要性不言而喻。這也是要做好FPGA設計必須掌握的一門基本功。但是我發現,很多初學者甚至有一兩年設計經驗的已經入門的工程師(包括本尊..汗),並不重視這一基本技能。

歸根到底原因可能有以下幾個方面:1.沒有遇到問題,代碼寫完後編譯通過了,板測功能實現就OK啦。2.感覺有點無從下手,沒有很系統的資料,有些概念難以理解,公式又多,並且sdc文件裏面的相關約束語法比較陌生,所以乾脆先放下,等以後遇到問題再說。在這裏,我想說得是,出來混,早晚得還滴。首先,編寫完代碼,系統能跑起來只是完成設計中的一小部分,調試纔是花比較多的時間。有好幾次調試我都感覺我不是在調試板子,而是被板子調戲…….

正是因爲走過前面的這麼多坑,所以我下定決心,務必要拿下一這塊。然後網上各種查閱前輩的分享經驗,啃官網手冊,花了將近一個多月的時間,慢慢消化,轉化爲自己的知識點。然後纔有了這篇博客。

再開篇之前,我想聲明以下兩點:

1.時序約束重要。這話說得是時序很重要,好的時序是設計出來的,不是約束出來的。一個好的設計,良好的代碼習慣纔是最重要的。

2.高速信號。通常有人會說,我的時鐘才幾MHz,不用約束啦。我覺得這話有點不妥。高速信號通常來說可以分爲兩類,一種是高頻信號,另外一種是上升時間很快的信號。信號的帶寬與上升時間有個估算公式,即BW=0.35/上升時間,BW單位爲Hz,上升時間單位爲秒,所以就算頻率很低的數字信號也有可能是高速信號。

時序約束這一個知識點,我打算分成兩篇來介紹,第一篇介紹一下基本概念,先有個概念嘛,要不然後面都有點不知所云啦;第二篇是介紹常用的一些指令以及約束的流程。通過這兩篇博客把自己這段時間的收穫記錄下來,有理解不對的地方希望大家指正,要是能夠幫助到一些正在學習這塊的童鞋,那就更好啦。哈哈….

言歸正傳,下面正式進入正文:

時序約束基本概念:

啓動沿(launch)與鎖存沿(latch)

這對概念就比較簡單了,能用圖說話的就不用文字,一目瞭然。

 


圖1   Launch & Latch

Launch Edge (啓動沿): 前級寄存器發送數據對應的時鐘沿。

Latch Edge (鎖存沿):後級寄存器鎖存數據時對應的時鐘沿。

建立時間(setuptime)與保持時間(hold time)

setup time :數據要能夠被LatchEdge正確鎖存,必須要在Latch Edge 到達之前保持穩定,這個提前到達的最少時間量,就是建立時間。

Hold time : 數據要能夠被LatchEdge正確鎖存,除了在Latch Edge到達之前提前準備好以外,還必須在Latch Edge到達後,保持穩定一段時間。這段保持穩定的時間,就是Hold time。

數據要求時間(requiretime)與數據到達時間(arrival time)

所有的信號在傳輸過程中都會有一定的延時,這裏不展開詳細論述。

         數據到達時間(arrivaltime):


圖2   Arrive time

其中,Tclk1是指Launch Edge啓動後,時鐘到達REG1的延遲。Tco是指數據輸出延時,定義爲D觸發器的上升沿有效到D觸發器輸出端數據有效的時延,Tco是器件固有參數。Tdata是指數據從上級寄存器到達下一級寄存器的路徑延遲。

數據要求時間(require time):

數據要求時間有兩種,分別是建立時間與保持時間


圖3   Require time (setup)

數據要求時間(setup) = LatchEdge + Tclk2 – Tsu;其中,Tclk2是指時鐘到REG2的路徑延遲。


圖4   Require time (hold)

數據要求時間(hold) = LatchEdge + Tclk2 + Th;

  建立時間餘量(setupslack)與保持時間餘量(hold slack)

建立時間餘量(setup slack)


圖5   setup slack

從上圖我們可以知道:

setup slack =數據要求時間(setup)-數據到達時間(arrivaltime)

保持時間餘量(hold slack)


圖6   hold slack

hold slack =數據到達時間(arrivaltime) -數據要求時間(hold)

以上就是我覺得時序分析當中,務必要掌握的幾個基本概念。理解上述概念之後,下一篇博客將對時序分析的流程以及常用的一些指令作簡析。

:在分析數據要求時間(requiretime)與數據到達時間(arrival time)的時候,官網的手冊中還有幾種針對FPGA內部的不同計算公式。在這裏我也羅列出來,闡述一下自己對這幾對公式的理解。


圖7   FPGA內部的計算關係

至於在FPGA內部Data_Require_Time的計算當中,爲什麼要減掉Setup_Uncertainty。首先要搞清楚setup_uncertainty是什麼東西。我們覺得我們可以通過參照clock uncertainty來理解。clock uncertainty等於clock skew + jitter of clock source。clock skew是指理想的時鐘是完全同步的,也就是說所有寄存器的時鐘都同時到達,但實際上實現不了,clock skew是指同一時鐘域內不同寄存器時鐘最早到達和最遲到達的時間差。 jitter是指時鐘源的時基抖動。例如理想的PLL產生的時鐘源每個週期都相同,但實際上每個週期的上升沿會有一些偏差。這就是時鐘抖動。

由此看來,這個Setup_Uncertainty正如其名說,是個不確定量,爲了保險起見,當然要要求數據在鎖存時刻之前到達,以免不滿足建立時間。也可以這麼理解,在建立時間到來之前,要求數據再提前一些到達,這樣時序更加保險不過,在實際應用當中,我們在寫sdc約束文件的時候,只需約束到外部器件到FPGA管腳處這一層次即可,FPGA的內部時序關係,Timequest會根據所選的器件,自行約束。但是也要理解,因爲一旦內部時序違例需要修改邏輯的時候,這些分析要用上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章