什么是FPGA?
FPGA
Field Programmable Gate Array
現場 可編程 門 陣列
FPGA(Field Programmable Gate Array)是在PAL、GAL等可編程器件的基礎上進一步發展的產物。它是作為專用集成電路(ASIC)領域中的一種半定制電路而出現的,既解決了定制電路的不足,又克服了原有可編程器件門電路數有限的缺點。from Baidu
FPGA的三要素
-
- 可編程邏輯功能塊(logical element),Cell——單元
- 查找表(組合),D觸發器(時序),進位鏈
-
- 片內互聯線(interconnect),IC——內部連線
- 連線線段和開關
-
- 輸入輸出塊
- 可編程輸入輸出完成芯片 內部邏輯與外部管腳之間的接口,圍繞在邏輯單元陣列四周,可編程輸入輸出塊的功能和性能從一定程度上也決定了該器件的市場定位
- 輸出寄存器,輸入寄存器,輸出使能寄存器,輸入延遲鏈,輸出延遲鏈,上拉電阻
為什么進行時序仿真
在我們進行工程實現時,通常需要測試我們設計能夠正常工作的時鍾頻率,首先約束是針對時鍾的
我們關注的是我們這個系統能跑多少兆,能跑多快,也就是系統的最高運行頻率
分析和約束是相輔相成的,先有約束,軟件才能根據約束進行分析
在設計流程是講到有兩種手段驗證設計是否達到要求,其一是后仿真;其二是靜態時序分析
時鍾約束作用
- 指導編譯軟件對設計進行必要的優化,以使編譯結果能夠滿足設計需求(比如clk要運行在125M,就創建這個時鍾的約束並約束頻率為125M,那么軟件看到這個約束之后,就會去優化這個時鍾驅動的所有寄存器相關的布局布線,使這些寄存器之間的數據傳輸在125M的時候依舊不出錯)
- 為了做時序分析軟件分析傳輸路徑時的參考,靜態時序分析
什么是時序分析?
時序分析的目的
- 時序分析的目的就是通過分析FPGA設計中各個寄存器之間的數據和時鍾傳輸路徑,來分析數據延遲和時鍾延遲之間的關系,一個設計完善的系統,必然能夠保證整個系統中所有的寄存器都能夠正確的寄存數據
- 數據和時鍾傳輸路徑是由EDA軟件,針對特定器件布局布線得到的
最高的時鍾頻率?
這個需要時序分析軟件來告知
- 時序分析一定是基於器件(集體到某一個特定信號的特定速度登記)
- 時序分析一定是基於邏輯設計在該特定器件上經過布局布線之后的網表(該網表包含了設計中每一個邏輯具體在該器件的什么資源上實現,而且還包括該資源在器件內的具體位置,還包括信號從每個節點傳輸到下一個節點的具體延遲時間)。時序分析不是在對代碼進行分析,而是在對真是的門級傳輸路徑進行分析
什么是時序約束?
時序約束的目的
- 告知EDA軟件,該設計需要達到怎樣的時序指標,然后EDA軟件會根據時序約束的各個參數,盡力優化布局布線,以達到該約束的指標
- 協助EDA軟件進行分析設計的時序路徑,以產生相應的時序報告
一些必要的推導過程
時序圖:https://images.cnblogs.com/cnblogs_com/HLhello/1651533/o_200220141352時序分析圖.jpg
器件原理圖https://images.cnblogs.com/cnblogs_com/HLhello/1651533/o_200220141409%E6%97%B6%E5%BA%8F%E5%88%86%E6%9E%90.jpg
要使得目的寄存器能夠正確的接收源寄存器發送過來的數據就要求
- tclk1 + tco + tdata <= tclk + tclk2 -tsu===>數據實際到達的時間 <= 數據需求時間
目的寄存器若能夠正確接收到源寄存器發送過來的數據那么,參考下面的兩個式子,考慮最終目的是要分析slack最小的路徑,也就是要減小tskew
- slack =(tclk + tskew - tsu - tco - tdata)>=0,這個式子中的變量是Tskew,其他都是在硬件以及布局布線確定后的定值(slack建立時間余量)
- tskew = (tclk2 - tclk1 + clock_pessimism )
- Tclk1 <= (軟件計算值)2.631ns(分析計算tclk1的時候,會認為時鍾從源端出發按照最慢的速度到達源寄存器的時鍾端口)
- Tclk2 <= (軟件計算值)2.534ns(分析計算tclk2的時候,會認為時鍾從源端口出發按照最快的速度到達目的寄存器時鍾端口)
- 這就引出一個矛盾:時鍾在傳輸過程中,到達目的寄存器和源寄存器是中間有一段路徑時重合的,這就是說tclk1按照慢速來算,tclk2 按照快速來算,對於重合部分,在實際中不可能又快又慢,這就要是說在算tclk1的時候有點悲觀,將這個時間算大了,這時候需要加入一個補償量也就是clock pessimism
- 理論上來說時鍾是精確的,但實際上時鍾是不可能精確的,存在一定的時鍾抖動,這是后會存在一個值叫做 clock uncertainly 該值會被算入 data require time
- slack = tclk + tclk2 + clock_pessimism + clock _uncertainly - tsu - tclk1 - tco - tdata
- 6.878 = 10+ 2.534+ 0.15 -0.02 +0.021-2.631 -3.041(例程)
怎么做?
工作平台
- Quartus II 13.0以及其內置工具 Time Quesrt Analyser(TTA).
分析時序步驟
綜合===>
在不同工作模式下===>
Worst-caseTimingPaths===>
setup clk===>選擇一條分析的路徑,如果路徑slack都為正,仍想查看這條路徑的時序信息,此時可以手動設置
選擇分析的路徑===>
report timing===>可以進行分析
手動報告路徑:
- TTA軟件下 custom reports===》reporting timing 設置觀察路徑的起始寄存器與目的寄存器然后就可以查看
步驟
- 打開TTA工具,在Task中進行以下步驟
- 創建一個網表 create Timing Netlist
- 讀取sdc文件
- 查看報告,加入約束
- constraints---->create clock(創建時鍾約束)
- 創建名字,周期,以及占空比(默認50%)
- 在TTA中每執行一個操作之后,都需要特別留意console窗口中的報告,要觀察操作是否生效
- 所有約束操作完成后需要執行寫sdc文件的操作,這個文件會生成包含所有約束的sdc文件
上述操作執行完成后FMAX= 198.88MHz,相較於之前的242.42MHz,該設計可以運行的最高頻率變低了,這是因為EDA軟件在進行布局布線時會以時序約束的時鍾頻率為指標,在完成布局布線時會自動的向這個目標看齊,如果不能達到,那么會出現slack為負的情況,如果時序約束合理,那么slack為正,在看齊目標時,Fmax表示在當前的設計(網表文件)中,該設計運行的最高頻率,所以約束不同,布局布線的情況不同,Fmax也就不同。
使用sdc文件建立約束
sdc文件的作用,編輯器用來優化設計
create clock (約束):創建時鍾約束
create_clock -name {clk} -period 20.000 -waveform { 0.000 10.000 } [get_ports {clk}]
創建一個名為clk的時鍾約束,這個時鍾的周期是20ns,波形是0ns時上升沿,10ns時下降沿,該時鍾衣服在具體的物理節點名為clk的端口上
create_generated_clock -name {pll|altpll_component|auto_generated|pll1|clk[1]} -source [get_pins {pll|altpll_component|auto_generated|pll1|inclk[0]}] -duty_cycle 50.000 -multiply_by 2 -phase -90.000 -master_clock {clk} [get_pins {pll|altpll_component|auto_generated|pll1|clk[1]}]
創建一個名為clk[1]的生成時鍾,這個時鍾 的生成源為inclk[0] ,占空比為50%將源時鍾信號乘以2,並且移動-90度的相位,母時鍾為clk,高生成的時鍾信號衣服的具體物理節點為pll的clk1 端口
每個豎杠表示一個層級
如果工程沒有添加任何約束文件,或者約束文件中沒有任何有效的內容,軟件會自動分析並加入軟件自動分析出來的時鍾信號並加入合理的約束
一旦工程中加入有效的sdc文件中軟件就一切以sdc文件中的約束為准,不再自動分析和加入其它信號的約束
使用assignments下的TimeQuest Timing Analyzer wizard創建時鍾約束(創建時信號名不必與管腳名相同)
在settings中設置TTA所用的sdc,將不用的sdc文件刪除
一個工程中如果添加了多個sdc文件且同時生效的話,軟件會一次按照這兩個文件中的內容進行約束和報告,如果對某一個節點在多個約束文件中都添加了約束信息,則后執行的約束內容會覆蓋掉先執行的約束內容
根據工具向導建立約束——TimeQuest Timing Analyzer Wizard
- clk name創建一個新的時鍾--》給時鍾一個代號
- clk pin指定其在文件中的引腳--》
- period周期為20ns--》
- rising上升沿的時間--》
- falling下降沿的時間--》
- 這就是創建時鍾約束的過程,將時鍾的基本信息在軟件中設置
查看時序報告
clocks
- TTA下的clocks的報告說的是當前工程中各個時鍾信號的屬性,這些是軟件自動分析出來的工程中的一些時鍾屬性的信號,如果某個被認為是時鍾的信號沒相關的頻率周期的定義,軟件就會自動將其按照1000MHz的頻率來進行分析
- 時鍾類型
- base基礎時鍾
- generate生成時鍾
- 模型中是1GHz(這個是軟件報告的設計中的時鍾信號的約束頻率),這是應為如果用戶沒有對時鍾信號加約束,軟件就會自動對分析出的時鍾信號加入約束,這個約束會按照最大的可能來約束,也就是設置時鍾頻率為1000MHz
芯片的工作溫度,工作模式
- 分析系統觀察指標
- 分析建立時間余量的時候,主要觀察85C慢速模型下的報告
- 分析保持時間余量的時候,主要觀察0C快速模型下的報告
- slow 1200mV 85C model
- Fmax summary 242.42MHz 這個就是改設計能夠運行的最大時鍾頻率
- 針對的是某時鍾域的Fmax——由clk這個時鍾驅動的所有寄存器里面,最壞路徑能夠運行的最低時鍾頻率
- 改設計實際運行在50MHz的時鍾頻率,開發板上使用的是50MHz的時鍾競爭
- 但軟件認如果沒加時序約束的設計默認輸入的時鍾頻率為1000MHz
- 軟件計算最高時鍾頻率的時候,是根據最壞路徑的建立時間余量來計算的
- worst case Timing paths
- Fmax summary 242.42MHz 這個就是改設計能夠運行的最大時鍾頻率
- slow 1200mV 0C model
- fast 1200mV 85C model
一些關鍵名詞
Tclk
- 時鍾周期
Tclk1
- 時鍾信號到達寄存器1的時間
Tclk2
- 時鍾信號到達寄存器2的時間
Tdata
- 數據從源寄存器Q端出發到達目的寄存器D端的時間
Tco
- 輸出時間,時鍾上升沿到達D觸發器 到 數據輸出到Q端的延遲
Tsu
- 建立時間,目的寄存器特性決定,在時鍾信號上升沿到達其時鍾接口時,其數據輸入端(D)的數據必須提前Nns穩定下來,否則就無法保證數據正確存儲。寄存器要求的,其數據端口的值必須提前於時鍾上升沿達到其時鍾端口的時間值
Slack
- 數據需求時間和數據到達時間的差值,如果為正值,則表明數據能被目的寄存器正確接收,如果是負值,則表明數據不能被目的寄存器正確接收
From Node
- 起點源寄存器
To Node
- 目標寄存器
Launch Clock
- 源寄存器發射數據的時鍾
Latch Clock
- 目的寄存器接收數據的時鍾
Relationship
- relationship 如果兩個時鍾是同一個信號 launch clock edge 和 latch clock edge的時間差(如果兩個時鍾非同一個信號,而是有一定相位關系的同源時鍾,則relation不在是時鍾的周期值)
Clock Skew
- 時鍾偏斜,同一時鍾從不同路徑到達每個觸發器的時間差
Data Delay
- 在TTA軟件中將tco和數據傳輸路徑延遲Tdata 合並成為data delay
時序分析基本模型
-
module ( clk, a, b, c ); input clk; input a; input b; output c; reg a_reg; reg b_reg; wire c_wire; always@(posedge clk)begin a_reg <= a; b_reg <= b; end assign c_wire = a_reg & c_reg; always@(posedge clk ) c <= c_wire ; endmodule //思考上述代碼的電路圖 //兩個D觸發器一個與門一個輸出的D觸發器 //思考時序圖