一、時序原理
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-E和B-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步驟並行工作,A要2小時,B要1小時,C要3小時,D要0.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教程
