時序分析(1):時序約束原理(舊版、可能有錯)


一、時序原理

1.建立時間和保持時間

 

(1)建立時間Tsu:set up time,觸發器的時鍾上升沿到來以前,數據必須准備好的時間,如果建立時間不足,數據將不能在這個時鍾上升沿被穩定的打入觸發器。

(2)保持時間Th:hold time,觸發器的時鍾上升沿到來以后,數據被鎖存消化的時間。如果保持時間不足,數據將不能在這個時鍾上升沿被穩定的打入觸發器。

(3)建立/保持時間是D觸發器的一個固有屬性,是確定的、不變的。

(4)解決建立時間不足的方法是“減少延時”,而解決保持時間不足的方法是“增加延時”。

(5)FPGA所有時序問題,根本原因都是“建立時間和保持時間”的問題。

  現在來仔細分析一下:

信號

含義

信號

含義

clk

系統時鍾

Tclk

時鍾周期

clk_1

源寄存器對應時鍾

Tclk1

時鍾到源寄存器REG1的時間

clk_2

目的寄存器對應時鍾

Tclk2

時鍾到目的寄存器REG2的時間

data2_D

目的寄存器D端數據

Tskew

時鍾偏移時間:Tclk2 - Tclk1

data2_Q

目的寄存器Q端數據

Tco

數據在寄存器內部傳輸的時間

Tsu

建立時間

Tdata

數據的組合邏輯傳輸的時間

Th

保持時間

 

 

注: ①實際時序還涉及“啟動沿”、“鎖存沿、”“數據到達時間”、“數據需求時間”等概念,但是不方便繪圖了,而且上圖已經能夠粗略解釋建立時間和保持時間了。

    ②上圖Tco畫在寄存器REG2中,只是為了方便理解概念而已,實際上寄存器REG1也有Tco。

    ③上圖描繪的是極端情況,即:時鍾周期Tclk = 建立時間Tsu + 保持時間Th。

    ④去除時鍾偏移Tskew,可得最小時鍾周期Tclk(min) = Tco + Tdata + Tsu,這是最快時間,其倒數即為最高時鍾頻率。

    ⑤按照上圖時序,若要保證有時間富余,可得建立時間和保持時間的滿足公式:

 

2.電路的延時

(1)理論狀態

(2)實際狀態,中間有時間富余

 

3.關鍵路徑

(1)關鍵路徑:延時最長的路徑,決定了能跑到的最高頻率,A-EB-E都是關鍵路徑

(2)關鍵路徑是某個點到某個點之間的。

(3)思考:我一定要跑300M,怎么辦?

 

4.流水線設計

(1)設計時優化:舉例s = a * b * c * d,沒有增加硬件資源,但得到了優化

 

(2)繼續優化,形成流水線設計。(中間加了一個寄存器進行暫存)

 

(3)繼續優化,乘法器變成加法器。

舉例:設reg[3:0] a,reg[1:0] b,求f = a*b。

做法:乘法變加法,f = a*b = a*b[0] + {a,1’b0}*b[1]

(4)繼續優化,加法器分成門級電路等,不斷細分,時鍾頻率得到很大提高。

(5)優化舉例:

//原設計:
a <= A + B + C + D;
b <= a + E;
-----------------------
//優化設計1:
a_tmp1 <= A + B;
a_tmp2 <= C + D;
a      <= a_tmp1 + a_tmp2;
b      <= a + E;
-----------------------
//優化設計2,使用assign:
assign a_tmp1 = A + B;
assign a_tmp2 = C + D;
a <= a_tmp1 + a_tmp2;
b <= a + E;

 

5.通俗理解

某生產線分成4步驟並行工作,A2小時,B1小時,C3小時,D0.5小時。規定每隔3小時交接一次,要求到點前5分鍾交接,到點后10分鍾才能工作。那么:

(1)到點前5分鍾,類似於FPGA的建立時間。

(2)到點后10分鍾,類似於FPGA的保持時間。

(3)每隔3小時交接一次,類似於FPGA的時鍾周期。

(4)2小時、1小時等,類似於FPGA的路徑延時(Tco+Tdata)。

(5)C花費時間最長,類似於FPGA的關鍵路徑。

(6)為了優化,可以將C的1小時工作,交給D來做。

(7)該生產線實際上不能正常運轉。

 

二、quartus II分析時序

1.建立工程,進行編譯

2.打開時序分析窗口:Tools ---> TimeQuest Timing Analyzer

3.創建網表:Tasks窗口 ---> Netlist Setup ---> Create Timing Netlist

4.創建時鍾信號

(1)Constraints ---> Creat Clock

(2)設置時間,周期,占空比時間

(3)Targets ---> List中找到時鍾信號,添加進來

(4)RUN

5.Tasks窗口---> Macros ---> Report All Summaries,可看到所有情況,標紅的為不滿足的。

6.Tasks窗口---> Macros ---> Report Top Failing Paths,會把所有不滿足的路徑報告出來。Slack就是我們要注意研究的,可以知道我們超過了多少時間。

7.保存:Constraints ---> Write SDC File...

8.可點擊Files ---> Open...打開剛剛保存的文件,查看里面代碼,能看到設置的時鍾,可直接對代碼進行更改來改變時鍾頻率。

9.讀取:Tasks窗口 ---> Netlist Setup ---> Constraints ---> Read SDC File...

10.弄完約束后,將Sdc文件添加進主頁面的Files里,再進行編譯,更新timequest網表重新分析。

11.如果哪個路徑是我們認定不需要分析的,是我們異步處理不關心的,則可以右鍵選擇 Set False Path (clocks) 這樣語句就會改變,重新編譯導表就OK了。

 

三、時序約束步驟

  具體時序約束操作有很多,如creat clocks、input delays、output delays、set timing exceptions等,具體內容太多,由於沒有真正做過這方面的項目,所以懂的不多,結合所學簡要寫一點。

  1 //----------------------------------------------------
  2 //-- Time Information
  3 //----------------------------------------------------
  4 
  5 1.時間精度設置,默認值為3
  6 
  7 //----------------------------------------------------
  8 //-- Create Clock
  9 //----------------------------------------------------
 10 
 11 1.輸入時鍾
 12     A.輸入管腳clk(P38)
 13         a.直接輸入,最常見
 14         b.經過時鍾管理單元(mmcm)
 15     B.差分時鍾(P36)
 16         a.N端和P端兩個口,只需要約束P端
 17     C.GT或恢復的時鍾(P39)
 18         a.進來時無時鍾,但因為ip核自行恢復了
 19 
 20 2.虛擬時鍾(P145)
 21     A.無[get_ports]所以稱為虛擬
 22     B.典型應用如復位信號
 23 
 24 //----------------------------------------------------
 25 //-- Create Generated Clock
 26 //----------------------------------------------------
 27 
 28 1.衍生時鍾(P36)
 29     A.工具自動推導無需約束但建議更改名稱
 30     B.Altera自動推導需寫上:derive_pll_clocks
 31 
 32 2.自分頻時鍾(P36)
 33     A.一般不建議自分頻
 34     B.自定義約束會覆蓋工具推導約束
 35 
 36 3.隨路時鍾
 37     A.調整好隨路時鍾相位就能不約束input或output
 38 
 39 //----------------------------------------------------
 40 //-- Set Clock Latency
 41 //----------------------------------------------------
 42 
 43 時鍾源(晶振)到觸發器時鍾輸入端的延時,分兩種
 44    A.時鍾源延遲(clock source latency)
 45    B.時鍾網絡的延遲( clock network latency)
 46 
 47 //----------------------------------------------------
 48 //-- Set Clock Uncertainty
 49 //----------------------------------------------------
 50 
 51 1.時鍾偏差,分兩種去相加:
 52     A.clock jitter
 53     B.clock skew
 54 2.可用derive_clock_uncertainty自行生成就不用自己算數
 55 
 56 //----------------------------------------------------
 57 //-- Set Input Delay
 58 //----------------------------------------------------
 59 
 60 1.參數說明
 61     A. min for hold analysis
 62     B. max for setup analysis
 63 
 64 2.System系統同步(P112)
 65     A.FPGA與Source Device共用時鍾,二者延時相同
 66     B.大部分情況僅僅用於SDR方式
 67         a.查數據手冊,套公式
 68             min = Tco(min) + Tdata(min)
 69             max = Tco(max) + Tdata(max)
 70         b.示波器測量,套公式
 71             min = DV_after
 72             max = Period - DV_before
 73 
 74 3.Source源同步(P114)
 75     A.時鍾和數據一起過來
 76     B.SDR
 77         a.查數據手冊,套公式
 78             min = Tco(min) + Tdata(min)
 79             max = Tco(max) + Tdata(max)
 80         b.示波器測量,套公式
 81             min = DV_after
 82             max = Period - DV_before
 83     C.DDR,一般只用示波器測量,分為rise和fall
 84         a.中心對齊
 85             1.rise(未標明的就是rise)
 86                 min = DV_after_re
 87                 max = 0.5*Period - DV_before_fe
 88             2.fall(添加-clock_fall-add_delay)
 89                 min = DV_after_fe
 90                 max = 0.5*Period - DV_before_re
 91         b.邊沿對齊(邊沿前取負數)
 92             1.rise(未標明者即為rise)
 93                 min = -skew_before_re
 94                 max =  skew_after_re
 95             2.fall(添加-clock_fall-add_delay)
 96                 min = -skew_before_fe
 97                 max =  skew_before_fe
 98 
 99 4.有數據無時鍾(P145)
100     A.設置虛擬時鍾,再用虛擬時鍾約束此信號
101     B.隨便設個both值即可
102 
103 //----------------------------------------------------
104 //-- Set Output Delay
105 //----------------------------------------------------
106 
107 1.參數說明
108     A.min for hold analysis
109     B.max for setup analysis
110 
111 2.System系統同步(P130)
112     min = Tdata(min) - Th
113     max = Tdata(max) + Tsu
114 
115 3.Source源同步(P131),與隨路時鍾搭配約束
116     A.兩種理論計算方法
117     B.SDR
118         a.Setup/Hold理論
119             min = Tdata(min) - Th
120             max = Tdata(max) + Tsu
121         b.Skew理論
122             min = before_re_skew
123             max = Period - afer_re_skew
124     C.DDR,一般只用示波器測量,分為rise和fall
125         a.中心對齊,用Set/Hold理論
126             1.rise(未標明的就是rise)
127                 min = -thd_r
128                 max =  tsu_r
129             2.fall(添加-clock_fall-add_delay)
130                 min = -thd_f
131                 max =  tsu_f
132         b.邊沿對齊,用skew理論
133             1.rise(未標明者即為rise)
134                 min = before_re_skew
135                 max = 0.5*period - after_fe_skew
136             2.fall(添加-clock_fall-add_delay)
137                 min = before_fe_skew
138                 max = 0.5*period - after_re_skew
139 
140 //----------------------------------------------------
141 //-- Set Clock Groups
142 //----------------------------------------------------
143 
144 不同時鍾之間也可以在這里約束
145 
146 //----------------------------------------------------
147 //-- Set False Path 
148 //----------------------------------------------------
149 
150 1.常量或偽常量(P172)
151 2.互斥路徑(P173)
152     A.例如雙向端口
153 3.異步時鍾(P174)
154     A.先處理再約束
155     B.打兩拍來同步信號和處理亞穩態
156     C.用異步fifo起到隔離時鍾
157 
158 //----------------------------------------------------
159 //-- Set Multicycle path
160 //----------------------------------------------------
161 
162 1.兩個寄存器間的數據傳輸在一個周期內沒法完成時,可以
163   通過本命令改變建立值和保持值讓其滿足時序要求。
164 2.不建議使用多周期路徑(P157-P164)
165 
166 //----------------------------------------------------
167 //-- Set Maximum Delay
168 //----------------------------------------------------
169 
170 純組合邏輯路徑,很少使用(P178)
171 
172 //----------------------------------------------------
173 //-- Set Minimum Delay
174 //----------------------------------------------------
175 
176 純組合邏輯路徑,很少使用(P178)
177 
178 //----------------------------------------------------
179 //-- Set Input Transition
180 //----------------------------------------------------
181 
182 很少用到

  上述是Altera中常用到的約束方法,實際上里面的每一點都有很大的學問。里面的頁數是一篇《timing》的文檔,這樣就不用記憶語句,直接查閱文檔就行了。

 

四、小技巧

//-- pll時鍾改名
//----------------------------------------------------
1.編譯工程,打開timing_quest,創建網表。
2.創建時鍾后生成sdc文件,打開sdc文件並在衍生時鍾處寫上
  derive_pll_clocks並保存,回到timing_quest重讀該sdc文
  件,發現pll時鍾已經自動約束好,但是名字很復雜。
3.退出timing_quest,打開sdc文件,將pll時鍾的名字改成需要
  的名字並保存。回到quartus ii進行編譯,打開timing_quest
  並更新網表,看到pll時鍾改名成功。

//-- 關於false path:
//----------------------------------------------------
1.異步時鍾之間一般要進行false path
2.false path前,必須確定已經進行了處理,如打拍或FIFO隔離。
3.不一定都是clock之間的false,有時node之間的就可以。
4.Set Clock Groups中也可以擔任跨時鍾域的時序約束。

 

參考資料:[1]明德揚FPGA教程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM