轉載於http://www.cnblogs.com/Oursbuzouxunchanglu/p/3957473.html
感謝博主分享的系列時序分析,
第一章 基本概念
1.1延遲因素
第一,FPGA芯片內部的一些固有延遲,包括建立時間Tsu、保持時間Th和數據存入寄存器到輸出管腳時間Tco,這些時間是由FPGA芯片決定的,不同的FPGA芯片這些延遲時間不一樣。(如圖1)
第二,路徑延遲,包括時鐘路徑延遲和數據路徑延遲,這兩種延遲都與設計的邏輯有關,而最主要的延遲還是數據延遲,所以好的代碼設計非常重要。(如圖1)
圖一 FPGA芯片內部
第三、外部延遲因素,即FPGA與外部IC進行數據交互的延遲因素,包括外部IC建立時間Tsu_ext、外部IC保持時間Th_ext、外部IC從時鐘到來到數據輸出到管腳的延遲Tco、外部數據延遲、時鐘到IC芯片的延遲、時鐘到FPGA芯片的延遲,這些延遲因素timequest都沒法自己知道,必須通過設計者弄清這些延遲是多少,然後通過約束命令告訴timequest才行。(如圖2)
圖2 FPGA與外部IC
1.2建立時間和保持時間、建立關係值和保持關係值
建立時間:指時鐘到達寄存器之前數據在輸入管腳達到穩定所需要的最小時間。
保持時間:指時鐘到達之後數據在輸入管腳保持穩定所需要的最小時間。
建立關係值:目的寄存器鎖存沿(latch clock)-源寄存器啓動沿(launch clock)。數據在第一個時鐘沿從源寄存器發出去,在第二個時鐘沿存入目的寄存器,建立關係值就是指這兩個時鐘的距離。
保持關係值:上一個latch clock - 源寄存器的當前launch clock。(如圖3)
圖3 建立關係值和保持關係值
1.3建立餘量和保持餘量
1.3.1建立餘量計算
圖 4
Data Arrival Path = Launch Edge + src_clk_dly + src_reg_uTco + data_delay
Data Required Path = Latch Edge + dst_clk_dly
由於還得滿足在latch clock到來之前數據在目的寄存器達到穩定所需要的最小時間Tsu,所以建立餘量公式如下:
Setup slack = Data Required Path - Data Arrival Path - Tsu
而在timequest分析裏面,它把延遲因素Tsu放在了Data Required Path裏面,所以Data Required Path公式可以這樣:
Data Required Path = Latch Edge + dst_clk_dly - Tsu
最終根據timequest得到的公式:
Setup slack = Data Required Path - Data Arrival Path(timequest_userGuide page 32)
現在我們看timequest是如何來分析setup slack:
圖5 建立餘量波形圖
通過圖5建立餘量波形圖我們可以知道setup relationship,data arrival time ,data required time,setup slack以及一些其它的延遲參數。
圖6 建立餘量波形數據路徑
然後我們通過data path分析中可以知道data arrival path和data required path的值,看最後一行,data arrival path的值是17.826ns,data required path的值是25.544ns,根據公式可以求得setup slack是7.718ns,當然我們添加約束命令後,這些計算都是timequest自己做的事,與設計者無關。
圖7
如圖7的第一行的slack的值,它剛好等於圖6 data required path的值e減data arrival path的值,在這裏我們可以看到每一條路徑的建立餘量,源寄存器和目的寄存器,啓動沿,鎖存沿,建立關係值,時鐘抖動和數據延遲。
1.3.2保持餘量計算
在說公式前先看timequest的具體分析報告
圖 8 保持餘量波形圖
注意看圖8launch clock和latch clock的位置,還有slack的值,然後再看圖9的data arrival path和data required path最後一行的值。
圖 9
通過這兩張圖可以知道:hold slack = data arrival path - data required path
Data Arrival Path = Launch Edge + src_clk_dly + src_reg_uTco + data_delay
Data Required Path = Latch Edge + dst_clk_dly + Th
但是這裏的latch clock 是目的寄存器的上一個鎖存沿。
hold slack = data arrival path - data required path
建立餘量與保持餘量的Data Arrival Path的計算是一樣的,不同的是建立餘量Data Required Path的Latch Edge是當前鎖存沿,而保持餘量data required path的Latch Edge是上一個鎖存沿。
1.3.3外部延遲計算
我們可以把FPGA芯片和板上IC芯片想象成兩個寄存器,不過timequest自己不知道他們之間的延遲,所以需要設計值通過約束命令來告訴它。
外部器件參數:Tsu_ext=外部器件的Tsu,Th_ext=外部器件的Th。
板上的數據延遲:
Max_fpga2ext=FPGA輸出到外部器件管腳的最大延遲;
Min_fpga2ext=FPGA輸出到外部器件管腳的最小延遲;
set_output_delay -max = Tsu_ext + Max_fpga2ext
set_output_delay -min = -Th_ext + Min_fpga2ext
對於輸入約束
外部器件參數:Tco_ext=外部器件的Tco,minTco_ext=外部器件最小的Tco。
板上的數據延遲:
Max_ext2fpga = 從外部器件輸出到FPGA管腳的最大延遲。
min_ext2fpga = 從外部器件輸出到FPGA管腳的最小延遲。
板上時鐘延遲:
Max_clk2fpga = 板上時鐘到FPGA的最大延遲
min_clk2fpga = 板上時鐘到FPGA的最小延遲
Max_clk2ext = 板上時鐘到外部器件的最大延遲
min_clk2ext = 板上時鐘到外部器件的最大延遲
set_input_delay -max = Tco_ext + Max_ext2fpg
set_input_delay -min = minTco_ext + min_ext2fpga
上面的公式沒有把時鐘skew考慮進去。考慮進去後的公式應該是這樣的:
對於輸出約束
set_output_delay -max = Tsu_ext + Max_fpga2ext - (min_clk2ext - Max_clk2fpga)
= Tsu_ext + Max_fpga2ext - (min_clk_skew)
即:最大輸出延遲 = 外部器件建立時間+FPGA到外部器件的最大延遲時間 - (最小板上時鐘到外部器件的延遲-最大板上時鐘到FPGA的延遲)=外部器件建立時間+FPGA到外部器件的延遲時間 - 最小時鐘偏移。
set_output_delay -min = -Th_ext + min_fpga2ext - (Max_clk2ext - min_clk2fpga)
= -Th_ext + min_fpga2ext - (Max_clk_skew)
即:最小輸出延遲 = 外部器件保持時間+FPGA到外部器件的最小延遲時間 - (板上時鐘到外部器件的最大延遲-板上時鐘到FPGA的最小延遲)=外部器件建立直接+FPGA到外部器件的延遲時間 - 最大時鐘偏移。
對於輸入約束:
set_input_delay -max = Tco_ext + Max_ext2fpg - (min_clk2fpga - Max_clk2ext)
= Tco_ext + Max_ext2fpg - (min_clk_skew)
即:最大輸入延遲 = 外部器件Tco + 外部器件到FPGA的最大延遲-最小時鐘偏移。
set_input_delay -min = minTco_ext + min_ext2fpga - (Max_clk2fpga - min_clk2ext)22
= minTco_ext + min_ext2fpga - (Max_clk_skew)
即:最小輸入延遲 = 最小外部器件Tco + 外部器件到到FPGA的最小延遲-最大時鐘偏移。
如下面框圖:
圖 10
注意:由於對於外部時鐘的延遲信息還可以通過set_clock_delay告訴FPGA,所以在做約束的時候不要重複用這兩種約束添加外部時鐘的延遲信息