系列文章目錄
FPGA時序約束(一)基本概念入門及簡單語法
前言
最近由于不懂時序約束,在高速信號采集上面吃了很多虧,不知道系統(tǒng)工作異常的原因是什么。記錄一下查到的資料,有些許自己的理解,可能有誤。(主要是小梅哥及《FPGA時序約束與分析(吳厚航)》)
Quartus時序約束
不進行時序約束的后果
在程序編譯之后,會出現(xiàn)時序約束標紅
如果不自己編寫時序約束文件,就會出現(xiàn)系統(tǒng)進行默認分配,這里如果沒有自己編寫sdc時序分析文件,quartus會自動分析潛在的時鐘,如下圖,在clock中查看
這個altera_reserved_tck是識別到JTAG 輸出作為時鐘。
可能我們的輸入是50M的時鐘,系統(tǒng)按照1000M時鐘進行了約束,但是你的FPGA內部寄存器和連線導致的延時,它不能滿足1000M的時鐘,所以就會標紅。一些簡單的程序,系統(tǒng)按照1000M去優(yōu)化是沒有問題的,但是復雜的程序就會出錯了,這里用1000M去優(yōu)化不是說明它按照最優(yōu)效果去約束嗎,答案是不是的,即使最簡單的系統(tǒng),如果不加入時序約束也是可能出問題的。參考:小梅哥FPGA時序分析筆記(三)時鐘約束真重要——事實說話
用欠約束和過約束來描述:
欠約束:約束設定的時序條件太低了,導致不滿足我們要求工作的要求。
過約束:約束的比實際要求高,但是FPGA是一個系統(tǒng)的設計,不是局部最優(yōu),所以局部過優(yōu)那么其他地方就會有比較差的地方。
(并不絕對,有時也需要適當?shù)倪^約束)
在TimeQusst Timing Analyzer下,slow 1200mv 85C model和slow 1200mv 0C Model以及Fast 1200mv 0C model里,quartus根據(jù)代碼程序,按照剛才的clock會進行分析。
Fmax表示當下條件下,該時鐘驅動的所有寄存器中,最壞路徑下能夠運行的最大頻率(小梅哥視頻里介紹)
-
Clocks:這一項是顯示當前的設計中有哪些時鐘信號
-
Slow 1200mV 85C Model:芯片內核供電電壓 1200mV,工作溫度85度情況下的慢慢速傳輸模型。
-
Slow 1200mV 0C Model:芯片內核供電電壓 1200mV,工作溫度0度情況下的慢速傳輸模型。
-
Fast 1200mV 0C Model:芯片內核供電電壓 1200mV,工作溫度0度情況下的快速傳輸模型。
這里介紹如何計算Fmax里面的值:
比如這里的sys_clk前面的slack是余量,這里我的時鐘是50Mhz,那么就是20ns一個周期,F(xiàn)max=1000/(20-14.667)Mhz=186.5Mhz。(單位都是ns)
這里的是To Node會因為From Node而變換,slack前面的標號1是最壞的路徑情況
和Fmax中給出的值一樣。
在TimeQuest time analysis里面也可也以看到:
Slack:建立或保持時間余量。
From Node:起點,源寄存器。
To Node: 終點,目標寄存器。
Launch Clock: 源寄存器發(fā)射數(shù)據(jù)的時鐘
Latch Clock: 目的寄存器接收數(shù)據(jù)的時鐘
Relationship:Launch Clock edge和 Latch Clock edge 的時間差。
(如果兩個時鐘非同一個信號,而是有一定相位關系的同源時鐘,則 Relationship不再是時鐘的周期值)
其他詳細介紹
當FPGA內部送出數(shù)據(jù)給外部器件的時,有兩個時鐘launch clock 與latch clock,前者負責將數(shù)據(jù)從內部寄存器中送出,后者要在setup 與hold都滿足的條件下,將數(shù)據(jù)鎖入外部寄存器。在這個過程中,就是要保證在時鐘到來時數(shù)據(jù)準備好,并讓時鐘有足夠的時間將數(shù)據(jù)打入外部寄存器中。
clock skew:時鐘偏斜,時鐘從源端口出發(fā),到達目的寄存和源寄存器的時間差值。(setup slack公式中一般是+clock skew)(如果 clock skew為正值,說明時鐘到達目的寄存器比源寄存器的時間要長,所以要加上)
分析數(shù)據(jù)到達時間:
Incr:器件延時增量
時鐘從T1輸入后,通過走線到IOIBUF(引腳緩沖),控制的比較好,沒有延時,到單元內部,產生了0.626ns的延時,之后再通過走線到全局時鐘樹…FF是D觸發(fā)器
data require path - data arrival path =slack
所以也有可能出現(xiàn)負數(shù)。(負數(shù)即該路徑時序失敗了)
(小梅哥視頻中根據(jù)最壞路徑報告中將組合邏輯修改成時序邏輯代碼,能夠提高Fmax,因為組合邏輯驅動到寄存器了)
還可以利用IP核ALTCLKCTRL將鋪銅IO分配到全局時鐘上,提高穩(wěn)定性
如何提高時鐘質量在:小梅哥全局時鐘
FPGA內部走線時間
這里的CLK到達REG1和REG2的時間是不確定的,不一定到達REG1比REG2的延時小
skew=Tclk2-Tclk1
時序約束的公式:Tclk1 + Tco + Tdata <= Tclk+Tclk2 -Tsu
(目的寄存器能正確接收源寄存器的值)
最后推導:
Slack = Tclk +Tskew -Tsu-Tco -Tdata;Slack >= 0;
Tclk1:時鐘信號從時鐘源端口出發(fā),到達源寄存器時鐘端口的時間。
Tco:時鐘上升沿到達寄存器時鐘端到數(shù)據(jù)輸出到寄存器α端口的時間。
Tdata:數(shù)據(jù)從源寄存器α端出發(fā),到達目的寄存器D端的時間。
Tclk:時鐘周期。
Tclk2:時鐘信號從時鐘源端口出發(fā),到達目的寄存器時鐘端口的時間。
Tsu:寄存器要求的其數(shù)據(jù)端口的值必須提前于時鐘上升沿達到其時鐘端口的時間值。
Tskew:時鐘從源端口出發(fā),到達目的寄存器和源寄存器時鐘端口的時間差值(Tclk2-Tclk1)。
Tclk+Tco+Tdata:數(shù)據(jù)到達時間
Tclk + Tclk2 - Tsu:數(shù)據(jù)需求時間
Slack :數(shù)據(jù)需求時間和數(shù)據(jù)到達時間的差值
在軟件中,Data_Delay=Tco+Tdate
Tsu為負值是合理的,或者說,是Altera Cyclone lVE這個系列的FPGA的寄存器時序模型的一個等效值
軟件中為了分析Slack的最小值:
Skew=Tclk2(按最快速度)-Tclk1(按最慢速度)+Clock Pessimism(Tclk1和Tclk2路徑有重合部分的時間)
在軟件中,Clock Uncertainty算在data require中,
slack=Talk +Tclk2 + Clock Pessimism + Clock Uncertainty - Tsu- Tclk1 - Data_Delay(Tco + Tdata)
IO約束方法
計算PCB板上電信號的傳輸時間,可以將電信號等效為光速,得到的電信號傳輸時間與長度關系的參數(shù)為5555mil/ns
1mil = 0.0254mm
5555mil/ns -> 141.097mm/ns
要看不同的模型:
白色背景線是PCB走線。
這里的Tdata=Tdata(Init)+Tdata(Pcb)(芯片和PCB總共的延時)
Tclk2=Tclk2(Init)+Tclk2(Pcb)
T(0)->(3) = Tclk1
T(3)->(4) = Tco
T(4)->(5) + T(5)->(6) = Tdata
T(4)->(5) = Tdata(Init)
T(5)->(6) = Tdata(Pcb)
T(5)->(6)
T(0)->(1) + T(1)->(7) = Tclk2
T(0)->(1) = Tclk2(Init)
T(1)->(7) = Tclk2(Pcb)
根據(jù)建立時間余量和保持時間余量分析:
- 建立時間余量
建立時間余量就是數(shù)據(jù)到達AD9767要滿足建立時間(提前到達)
對應的就是output delay max(繼續(xù)延時就導致數(shù)據(jù)來的太遲了)
Data Require Time(數(shù)據(jù)要求時間) = Tclk2 - Tsu(芯片數(shù)據(jù)建立時間) + Latch edge(接收沿) = Tclk2(Init) + Tclk2(Pcb) - Tsu + Latch edge(接收沿)
Data Arrival Time(數(shù)據(jù)到達時間) = Tclk1 + Tco + Tdata + Launch edge(發(fā)送沿) = Tclk1 + Tco + Tdata(Init) + Tdata(Pcb) + Launch edge(發(fā)送沿)
滿足Data Require Time - Data Arrival Time >= 0
Tclk2(Init) - Tclk1 -Tco - Tdata(Init) + Tclk >= -Tclk2(Pcb) + Tsu +Tdata(Pcb)
(右邊即output delay max,因為FPGA可以通過程序控制的是左邊的這些量) - 保持時間余量
保持時間余量就是數(shù)據(jù)到達AD9767要保持的時間(不能提前結束)
對應的就是output delay min(繼續(xù)縮短延時就導致數(shù)據(jù)提前結束)
Data Require Time(數(shù)據(jù)要求時間) = Tclk2 + Th(芯片數(shù)據(jù)保持時間) + Latch edge(接收沿) = Tclk2(Init) + Tclk2(Pcb) + Th + Latch edge(接收沿)
Data Arrival Time(數(shù)據(jù)到達時間) = Tclk1 + Tco + Tdata + Launch edge(發(fā)送沿) = Tclk1 + Tco + Tdata(Init) + Tdata(Pcb) + Launch edge(發(fā)送沿)
最后結果:
output delay max = Tdata(pcb) - Tclk2(pcb) + Tsu
Output delay min = Tdata(pcb) - Tclk2(pcb) - Th
如果,PCB板上的數(shù)據(jù)走線長度與時鐘走線長度一樣,即:(5)->(6) = (1)->(7)
那么,Tdata(pcb) = Tclk2(pcb)
output delay max = Tsu
Output delay min = -Th
時序約束方法
在上一篇文章已經簡單介紹了一些時序約束的語法,現(xiàn)在介紹如何利用quaruts編寫時序約束
- 熟悉了可以直接自己編寫SDC文件
- 用 TimeQuest Timing Analyzer Wizard 軟件按照向導的指引操作。
- 可以使用 TimeQuest Timing Analyzer 工具用圖形化界面添加約束。
TimeQuest Timing Analyzer 工具來對工程添加約束。
菜單欄依次點擊:Tools->TimeQuest Timing Analyzer 可以打開,也可以直接點擊工具欄里的 TimeQuest Timing Analyzer 圖標
創(chuàng)建網(wǎng)表
約束的對象就是網(wǎng)表,網(wǎng)表就是 Quartus 軟件經過編譯,布局布線后得到的實際電路信息,該電路信息就是對應下載到芯片中后實際在芯片中呈現(xiàn)的電路。直接雙擊 Create Timing Netlist 選項就可以創(chuàng)建網(wǎng)表。
讀取SDC文件
時序約束文件可以指導EDA軟件(Quartus)進行布局布線,還可以指導時序分析軟件(TimeQuest Timing Analyzer)對EDA軟件編譯得到的網(wǎng)表進行分析報告。
如果用戶沒有編寫,就是使用默認那個1000M約束的默認文件。
創(chuàng)建時鐘(Create Clock)
創(chuàng)建時鐘約束,就是為當前網(wǎng)表模型指定一個明確的時鐘信號。這樣時序分析軟件就能夠基于該時鐘參數(shù),對網(wǎng)表中的各信號進行分析了。
在這個界面篩選時鐘以及選擇時鐘本體
*號是通配符,一般 * xxx *這樣寫
例如:
將代碼中的 MISO信號重命名為dclkn進行約束,占空比為50%,周期是10ns。(上升沿和下降沿不填默認是50%占空比)
命令窗:
如果出現(xiàn):
約束被忽略了,因為系統(tǒng)默認約束過了那么就不能創(chuàng)建了,只能更改
注意:clock name不能改,改了還是會被忽略
寫入SDC文件
到這里就基本完成了,最后記得把SDC文件添加到工程里面就可以了
時序約束語法補充
上篇文章有一些簡單的介紹語法,這次又學習了一些比較詳細的,總共有13種約束命令。以下命令都可以在菜單的constraint里面找到,直接設置好參數(shù)讓軟件自動生成,當然也可以自己生成添加。(都是參考文章末尾的第二篇文章的,還有很多看不懂,慢慢加入東西吧)
-
Creat clock
約束外部進入FPGA的時鐘,其他IC產生的給FPGA的類時鐘信號 -
Creat generated clock
約束pLL(derive_pll_clocks)
約束FPGA輸出到外部的時鐘
時鐘多路復用器(clock muxes)
漣漪時鐘(ripple clocks),F(xiàn)PGA內部寄存器輸出的時鐘phase:是偏移多少度
offset:是偏移多少ns
例子:create_generated_clock -name 起名字 -source [get_ports {原時鐘}] [get_ports {生成的時鐘}] -
set_clock_latency
對輸入到FPGA的時鐘及類時鐘(其他芯片產生的時鐘給FPGA)
可以自己選擇延遲類型
late指最大時鐘延遲,early指最小時鐘延遲(第二篇參考文章里面有詳細解釋,沒太看懂) -
Set_clock_uncertainty
對時鐘出現(xiàn)的抖動進行約束,是一個時鐘到另一個時鐘的約束,用 derive_clock_uncertainty約束命令不需要確定uncertainy的時間, -
Set_clock_groups
把相關的時鐘分成一個組,與其它不相關的時鐘區(qū)分開。 timequest只對這組內的時鐘域進行分析,組間的時鐘路徑將不會分析。 -
set_input_delay
對外部IC輸入到FPGA管腳的約束,這個約束命令中的延遲信息需要告訴timequest。
外部IC到FPGA輸入管腳Din[3:0]的最大延時是4ns,最小延時是2ns,外部IC時鐘是ext1_clk。add delay選項用于說明有另外的外部寄存器連接到端口,通常用于對雙倍速率接口的約束。
-
set_output_delay
FPGA輸出到IC的延遲,與輸入延遲相似 -
set false path
不要分析某個路徑或某組路徑 -
set_multicycle_path
兩個寄存器間的數(shù)據(jù)傳輸在一個周期內沒法完成時,我們可以通過該約束命令來改變他的建立關系值和保持關系值讓其滿足時序要求。 -
set muximum delay和set minimum delay
一般建議不要用
補充
查看Ignored constraints也很重要,看看有沒有被忽略的約束
對于不需要約束的路徑可以在時序這里直接設置
參考文章
一、FPGA時序分析工具(TimeQuest)文章來源:http://www.zghlxwxcb.cn/news/detail-755731.html
二、timequest靜態(tài)時序分析學習筆記——命令約束文章來源地址http://www.zghlxwxcb.cn/news/detail-755731.html
到了這里,關于FPGA時序約束(二)利用Quartus18對Altera進行時序約束的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!