基本概念
建立時(shí)間和保持時(shí)間是FPGA時(shí)序約束中兩個(gè)最基本的概念,同樣在芯片電路時(shí)序分析中也存在。
電路中的建立時(shí)間和保持時(shí)間其實(shí)跟生活中的紅綠燈很像,建立時(shí)間是指在綠燈(clk的上升沿)亮起之前行人或者車(chē)輛(data數(shù)據(jù))在路口提前等待的時(shí)間(只允許綠燈亮起的一剎那在路口的車(chē)輛才允許通行),而保持時(shí)間,則是綠燈亮起后必須保持的時(shí)間,這樣行人或者數(shù)據(jù)才能夠通過(guò)這個(gè)十字路口,否則hold時(shí)間就不滿(mǎn)足。
同時(shí),紅綠燈默認(rèn)都是周期性的(clk也是周期性的),車(chē)輛不允許在兩個(gè)相鄰的紅綠燈之間通過(guò)的時(shí)間超過(guò)一個(gè)clk的周期(組合邏輯時(shí)延不能過(guò)大)。
建立時(shí)間(Tsu) :是指在時(shí)鐘沿到來(lái)之前數(shù)據(jù)從不穩(wěn)定到穩(wěn)定所需的時(shí)間,如果建立的時(shí)間不滿(mǎn)足要求,在時(shí)鐘上升沿,寄存器將不能正確采到數(shù)據(jù)值。如下圖(左)所示:
保持時(shí)間(Th) :是指在時(shí)鐘上升沿后數(shù)據(jù)保持穩(wěn)定的時(shí)間,如果保持時(shí)間不滿(mǎn)足要求那么數(shù)據(jù)同樣也不能被正確采集到。保持時(shí)間示意圖如下圖(右)所示:
如圖1.3,這是一個(gè)FPGA輸入數(shù)據(jù)的模型,輸入端口到第一個(gè)寄存器之間的路徑需要進(jìn)行時(shí)序約束。
一般我們需要告知FPGA輸入輸出接口的最大最小延遲,使EDA工具在進(jìn)行布局布線(xiàn)時(shí)能夠盡可能的優(yōu)化輸入端口到第一級(jí)寄存器之間的延遲,使FPGA中時(shí)鐘的上升沿能夠正確采集到輸入的數(shù)據(jù)。
在sdc約束中,輸入延時(shí)是從上游器件發(fā)出數(shù)據(jù)到FPGA輸入端口的延時(shí)時(shí)間。如圖,1.4所示,輸入接口時(shí)序清楚反應(yīng)了FPGA在接收數(shù)據(jù)時(shí)應(yīng)滿(mǎn)足的建立和保持時(shí)間要求。
說(shuō)明:
OSC :系統(tǒng)時(shí)鐘
ASSP.CLk :外部器件寄存器的時(shí)鐘
ASSP.Q :外部器件數(shù)據(jù)輸出
FPGA.D :FPGA數(shù)據(jù)輸入
FPGA.CLK :FPGA內(nèi)部寄存器的時(shí)鐘
Tclk1 :系統(tǒng)時(shí)鐘到外部器件之間的延時(shí)
Tclk2 :系統(tǒng)時(shí)鐘到FPGA之間的延時(shí)
Tco :數(shù)據(jù)經(jīng)過(guò)外部器件寄存器輸出后相對(duì)于ASSP.CLK的偏移
Tpcb :數(shù)據(jù)在pcb電路板上的延時(shí)
FTsu :FPGA上寄存器的建立時(shí)間要求
FTh :FPGA上寄存器的保持時(shí)間要求
setup slack :建立時(shí)間余量,必須大于等于0才能滿(mǎn)足建立時(shí)間的時(shí)序要求
hold slack :保持時(shí)間余量,必須大于等于0才能滿(mǎn)足保持時(shí)間的時(shí)序要求
T: 系統(tǒng)時(shí)鐘頻率
c. 輸出延時(shí)即為FPGA輸出數(shù)據(jù)后到達(dá)外部器件的延時(shí)時(shí)間。如1.7所示,為FPGA和外部器件接口時(shí)序圖。
系統(tǒng)同步和源同步接口
系統(tǒng)同步中數(shù)據(jù)發(fā)送器和數(shù)據(jù)接收器在同一時(shí)鐘源下同步工作,發(fā)送器和接收器之間只傳遞數(shù)據(jù),數(shù)據(jù)的時(shí)序關(guān)系以系統(tǒng)時(shí)鐘作為參考。
所謂源同步接口是指發(fā)送器和接收器之間傳送數(shù)據(jù)時(shí)同時(shí)傳一個(gè)和數(shù)據(jù)保持特定相位關(guān)系的時(shí)鐘,接收器就可以根據(jù)這個(gè)時(shí)鐘的相位來(lái)準(zhǔn)確采集相應(yīng)的數(shù)據(jù)。如圖所示,分別是系統(tǒng)同步和源同步接口示例圖。
在系統(tǒng)同步接口中,系統(tǒng)時(shí)鐘到發(fā)送器和接收器之間的時(shí)延很難確定,所以接收器比較難確定時(shí)鐘和數(shù)據(jù)之間的相位關(guān)系,采集到的數(shù)據(jù)很難保證正確。
所以系統(tǒng)時(shí)鐘只適用于低速時(shí)鐘低速數(shù)據(jù)的收發(fā)。而源同步接口的好處就在于可以以較高的頻率高速收發(fā)數(shù)據(jù),數(shù)據(jù)和時(shí)鐘由發(fā)送器同步給出,在電路板上數(shù)據(jù)和時(shí)鐘布線(xiàn)等長(zhǎng),時(shí)延相等,接收器接收到的數(shù)據(jù)和時(shí)鐘的相位關(guān)系基本保持不變。
所以對(duì)于源同步接口的時(shí)序約束也較為簡(jiǎn)單,我們只需要告訴FPGA上游芯片發(fā)送端口數(shù)據(jù)和時(shí)鐘的相對(duì)關(guān)系,F(xiàn)PGA布局布線(xiàn)時(shí)就會(huì)調(diào)整時(shí)鐘和數(shù)據(jù)的布線(xiàn)長(zhǎng)度,使接收數(shù)據(jù)時(shí)滿(mǎn)足時(shí)序要求。
GMII的數(shù)據(jù)收發(fā)就是一個(gè)典型的源同步接口。MAC接收數(shù)據(jù)的時(shí)鐘Rx_clk和數(shù)據(jù)Rxd由上游PHY同步給出;MAC發(fā)送數(shù)據(jù)時(shí)發(fā)送時(shí)鐘Gtx_clk和數(shù)據(jù)Txd也是同步給到PHY,所以我們對(duì)于GMII接口的時(shí)序約束就可以按照源同步接口的方法。
SOC系統(tǒng)的時(shí)序接口及約束
若系統(tǒng)外部PHY芯片的型號(hào)是RTL8211EG,其芯片手冊(cè)中給出了PHY接口處的時(shí)序,如圖所示:
RTL8211EG芯片GMII接口時(shí)序關(guān)系
對(duì)于輸入時(shí)鐘的約束
時(shí)鐘輸入接口約束
GMII接口的Rx_clk時(shí)鐘是125MHZ,頻率較高。這時(shí)由外部器件進(jìn)入FPGA內(nèi)部的時(shí)鐘可能不穩(wěn)定,采集Rxd數(shù)據(jù)時(shí)會(huì)有影響,這時(shí)我們應(yīng)先對(duì)輸入的時(shí)鐘進(jìn)行約束。
如果不加PLL,即直接時(shí)鐘模式,一般不改變時(shí)鐘特性直接進(jìn)行數(shù)據(jù)采集,這通常適用于低速輸入且中心對(duì)齊的單速率源同步接口;如果在輸入端加一個(gè)PLL,即采用PLL時(shí)鐘模式,PLL可對(duì)時(shí)鐘與數(shù)據(jù)的關(guān)系進(jìn)行精確調(diào)整,適用于高速輸入的中心對(duì)齊和邊沿對(duì)齊的源同步接口。因此,使用PLL時(shí)鐘對(duì)調(diào)整FPGA的接口時(shí)序有很大幫助。
由圖1.4中輸入時(shí)序接口可以看出Tco即為時(shí)鐘上升沿與數(shù)據(jù)的偏移,則RTL8211EG中MAC接收端口Tco(max) =T-tR/2-tGSUT=8-0.5-2.5=5ns,最小Tco(min)=tGHTT+ tR/2=1ns,
故相對(duì)于Rx_clk的輸入最大最小延時(shí)
input delay max = Tco(max) =5ns
input delay min = Tco(min) =1ns
以上的約束的輸入延時(shí)是相對(duì)于輸入時(shí)鐘Rx_clk的約束,在sdc約束中我們還可以設(shè)置一個(gè)虛擬時(shí)鐘(可以假設(shè)是上游器件寄存器的驅(qū)動(dòng)時(shí)鐘,用于計(jì)算源器件的啟動(dòng)沿),源同步接口輸入數(shù)據(jù)以這個(gè)虛擬時(shí)鐘為參考輸入FPGA,所以當(dāng)我們聲明輸入延時(shí)時(shí)就可以以這個(gè)虛擬時(shí)鐘作為啟動(dòng)時(shí)鐘。使用虛擬時(shí)鐘約束輸入延時(shí)的好處是可以是約束更加方便、更加精確。
輸入約束的時(shí)延值可以理解為有效數(shù)據(jù)沿相對(duì)于時(shí)鐘的偏移,如果時(shí)延值為正說(shuō)明數(shù)據(jù)相對(duì)于時(shí)鐘向后偏移,時(shí)延為負(fù)說(shuō)明數(shù)據(jù)相對(duì)于時(shí)鐘向前偏移。根據(jù)上面描述輸入數(shù)據(jù)相對(duì)于輸入時(shí)鐘Rx_clk的最大最小延時(shí)分別為1ns和5ns,下面我們計(jì)算輸入數(shù)據(jù)相對(duì)于虛擬時(shí)鐘vir_clk的延時(shí)值。
取Rx_clk的上升下降時(shí)間分別為0、4ns(周期8ns),取數(shù)據(jù)時(shí)延Tco的平均值3ns為vir_clk相對(duì)于Rx_clk的偏移,即vir_clk的上升下降時(shí)間分別為3、7ns。
根據(jù)下圖所示,當(dāng)Tco取1ns時(shí),Rxd有效時(shí)相對(duì)于Rx_clk上升沿偏移1ns,相對(duì)于vir_clk上升沿偏移-2ns;當(dāng)Tco取5ns時(shí),Rxd有效時(shí)相對(duì)于Rx_clk上升沿偏移5ns,相對(duì)于vir_clk偏移2ns。
Tco取最小值時(shí)Rxd相對(duì)于vir_clk關(guān)系圖
Tco取最大值時(shí)Rxd相對(duì)于vir_clk關(guān)系圖
根據(jù)上述描述,我們以虛擬時(shí)鐘vir_clk為參考時(shí)鐘,約束如下:
sdc中的輸入延時(shí)約束
當(dāng)然,我們也可以用Rx_clk作為參考來(lái)約束輸入延時(shí),但是quartus在布局布線(xiàn)時(shí),以輸入時(shí)鐘為參考的約束不夠精確,有時(shí)仍會(huì)出現(xiàn)時(shí)序錯(cuò)誤。
對(duì)于GMII發(fā)送數(shù)據(jù)約束時(shí),由于發(fā)送時(shí)鐘和發(fā)送數(shù)據(jù)布線(xiàn)時(shí)延可忽略,故FPGA發(fā)送端口和PHY接收端口數(shù)據(jù)時(shí)鐘相位關(guān)系相似。結(jié)合圖1.4中發(fā)送接口時(shí)序和RTL8211EG的圖表可以看出:
FTco(max)+tGSUR+tR/2=Tclk,F(xiàn)Tco(min)=tGHTR+ tR/2
故有
output delay max=Tclk- FTco(max)=tGSUR+tR/2=2.5ns
output delay min=- FTco(min)= -(tGHTR+tR/2)=-0.5ns
SDR接口輸出約束含義
所以,在sdc中我們?nèi)缦录s束輸出接口:
在上面的輸出約束中,我們可以理解為:
根據(jù)outputdelay中max/-min的定義,源同步接口中輸出最大最小延時(shí)為輸出時(shí)鐘上升沿到達(dá)之前最大與最小的數(shù)據(jù)有效窗口。如圖所示,用于建立時(shí)間分析的set output delay –max的值為正數(shù)2.5ns,表示數(shù)據(jù)窗口在Gtx_clk上升沿之前2.5ns時(shí)間內(nèi)有效,
而用于保持時(shí)間分析的 -min之后跟著負(fù)數(shù)-0.5ns,表示數(shù)據(jù)在Gtx_clk上升沿之后0.5ns內(nèi)有效,即相對(duì)于Gtx_clk輸出數(shù)據(jù)有效窗口為-0.5ns到2.5ns,這個(gè)范圍大于等于PHY芯片手冊(cè)中給出的Txd相對(duì)于Gtx_clk的窗口范圍時(shí),才能滿(mǎn)足PHY芯片采集Txd時(shí)的時(shí)序要求。
Quartus的邏輯分區(qū)約束
既然是FPGA和外部接口的時(shí)序問(wèn)題,也就是輸入輸出的寄存Rxd/Txd的寄存器到外部器件寄存器的時(shí)序問(wèn)題。
GMII接收數(shù)據(jù)路徑分析
Tpcb是外部PCB板上數(shù)據(jù)的延時(shí),Tdata_i是數(shù)據(jù)的輸入延時(shí),Gmii_rx_interface相當(dāng)于Rxd進(jìn)入FPGA后的第一個(gè)寄存器模塊(可以專(zhuān)門(mén)寫(xiě)一個(gè)接口模塊,將Rxd數(shù)據(jù)打一拍,用于接收數(shù)據(jù))。
如果Gmii_rx_interface距離接口Rxd較遠(yuǎn),Tdata_i的路徑較長(zhǎng),布局布線(xiàn)時(shí)Rxd的八根線(xiàn)時(shí)延相差可能就比較大,所以我們應(yīng)讓這個(gè)模塊放在距離Rxd接口較近的地方。
Quartus軟件中有一個(gè)LogicLock(物理分區(qū))功能,把Gmii_rx_interface模塊建立成一個(gè)LogicLock分區(qū)但并不對(duì)分區(qū)位置和大小進(jìn)行固定,然后重新編譯工程。
布局布線(xiàn)后就可以在chipplaner工具中看到這個(gè)分區(qū)的位置,如下圖所示(放大可以看清),Gmii_rx_interface模塊距離Rxd接口位置很遠(yuǎn),布局布線(xiàn)時(shí),輸入信號(hào)要繞很長(zhǎng)一段距離才會(huì)到達(dá)輸入的寄存器,資源占用很多時(shí),Rxd的8根數(shù)據(jù)線(xiàn)長(zhǎng)度不一,很容易造成時(shí)序問(wèn)題。
未固定分區(qū)位置時(shí)布局布線(xiàn)結(jié)果
把Gmii_rx_interface模塊分區(qū)移動(dòng)到Rxd接口附近進(jìn)行固定然后重新編譯工程,布局布線(xiàn)后該邏輯分區(qū)就會(huì)在Rxd接口附近,從而保證輸入數(shù)據(jù)接口進(jìn)入FPGA的第一個(gè)寄存器的時(shí)延在一定范圍內(nèi),保證時(shí)序要求。
采用LogicLock后,GMII寄存器接口位置
內(nèi)部寄存器到寄存器時(shí)序問(wèn)題
寄存器到寄存器之間建立和保持時(shí)間時(shí)序要求
在FPGA的設(shè)計(jì)中除了應(yīng)該考慮到輸入輸出接口的時(shí)序,還應(yīng)該考慮到內(nèi)部寄存器到寄存器的時(shí)序問(wèn)題。內(nèi)部寄存器之間同樣要滿(mǎn)足建立和保持時(shí)間要求,如上圖所示
其中Tdata為組合邏輯在電路中的延時(shí)。
建立時(shí)間余量=T+Tclk2-Tclk1-Tco-Tdata-Tsu>=0
保持時(shí)間余量=Tclk1+Tco+Tdata-Tclk2-Th>=0
通常在FPGA中忽略時(shí)鐘的skew(偏移),即有Tclk2-Tclk1=0
則
建立時(shí)間余量=T-Tco-Tdata-Tsu>=0
保持時(shí)間余量=Tco+Tdata -Th>=0
為了使FPGA設(shè)計(jì)的電路正常,就必須滿(mǎn)足以上的建立和保持時(shí)間要求,根據(jù)建立時(shí)間余量公式可知
T>=Tco+Tdata+Tsu
F=1/T
在FPGA中Tco、Tsu等的數(shù)值由所使用FPGA的特性決定,所以時(shí)序電路之間的組合電路延時(shí)決定了整個(gè)電路的速度,即決定了整個(gè)電路的最大工作時(shí)鐘頻率。
若FPGA工作頻率為130MHZ,如果在做設(shè)計(jì)時(shí),組合邏輯的過(guò)于復(fù)雜,寄存器到寄存器之間的延時(shí)Tdata過(guò)大,如果系統(tǒng)仍工作在130MHZ的頻率下就有可能出現(xiàn)時(shí)序問(wèn)題。所以在設(shè)計(jì)時(shí)我們應(yīng)盡可能減小組合邏輯的復(fù)雜度,以提高工作頻率。下面討論提高系統(tǒng)工作頻率的方法。
a. 通過(guò)減小Tdata值來(lái)提高頻率
在quartus的sdc約束中有關(guān)于寄存器到寄存器之間組合邏輯時(shí)延的約束,通過(guò)設(shè)置從REG1到REG2之間組合邏輯延時(shí)的最大最小值,來(lái)約束FPGA的布局布線(xiàn),從而來(lái)提高系統(tǒng)的工作頻率。
但這種方法通常只能提高5%左右的工作頻率,不能過(guò)多的限制組合邏輯的時(shí)延,否則不利于EDA工具的布局布線(xiàn)。
b. 采用流水線(xiàn)設(shè)計(jì)來(lái)提高頻率
流水線(xiàn)分割組合邏輯
通過(guò)約束減小組合邏輯延時(shí)的方法并不能夠十分有效的提高系統(tǒng)的工作頻率,所以在設(shè)計(jì)時(shí)我們應(yīng)盡量減少大規(guī)模組合邏輯的使用。
如圖所示,采用流水線(xiàn)的設(shè)計(jì)思想,將兩個(gè)寄存器之間的組合邏輯拆分成兩級(jí)組合邏輯,從而減小組合邏輯的復(fù)雜度。采用流水線(xiàn)技術(shù)可以很好地提高系統(tǒng)運(yùn)行時(shí)鐘的工作頻率。
假設(shè)原來(lái)路徑延時(shí)為t,加入兩級(jí)流水線(xiàn)并且假設(shè)路徑切割均勻,則路徑延時(shí)減少到約t/3,從而系統(tǒng)的工作頻率提高到原來(lái)3倍左右。
如上圖所示,在我們做FPGA設(shè)計(jì)過(guò)程中,原來(lái)的judge_result是一個(gè)很大的組合邏輯,信號(hào)產(chǎn)生的路徑時(shí)延很大,很難滿(mǎn)足時(shí)序要求,在FPGA編譯完做驗(yàn)證時(shí),出現(xiàn)if條件不正確的情況,狀態(tài)機(jī)不能正確跳轉(zhuǎn)。
修改:將if中復(fù)雜的組合邏輯信號(hào)在時(shí)鐘的上升沿,賦值給中間變量寄存器judge_result和judge_result_en,這樣在做if判斷時(shí)就不用判斷原來(lái)的復(fù)雜組合邏輯值,只需判斷judge_result和judge_result_en的值。即采用流水線(xiàn)分割的方法把原來(lái)十分復(fù)雜的組合邏輯分成兩部分,這樣FPGA在編譯后就不會(huì)出現(xiàn)時(shí)序錯(cuò)誤的情況。
實(shí)例:使用vivado進(jìn)行簡(jiǎn)單的時(shí)鐘約束
之所以要進(jìn)行時(shí)鐘約束是因?yàn)椋寒?dāng)時(shí)鐘進(jìn)入了FPGA器件,通過(guò)時(shí)鐘樹(shù)傳遞時(shí),時(shí)鐘邊沿會(huì)有延時(shí),通常稱(chēng)作時(shí)鐘網(wǎng)絡(luò)延遲;噪聲或硬件表現(xiàn)會(huì)導(dǎo)致時(shí)鐘隨時(shí)可能發(fā)生變化,通常稱(chēng)作時(shí)鐘不確定性,包括時(shí)鐘抖動(dòng)、相位錯(cuò)位等等。
增加時(shí)鐘約束可以一定程度上減少時(shí)鐘延時(shí)帶來(lái)的問(wèn)題,比如大位寬數(shù)據(jù)(128位)從ram中讀出時(shí)由于路徑延時(shí)導(dǎo)致數(shù)據(jù)錯(cuò)誤的問(wèn)題。
這里介紹一下簡(jiǎn)單進(jìn)行時(shí)鐘約束的辦法(以vivado2018.2為例):
第一步:對(duì)工程進(jìn)行綜合,綜合之后點(diǎn)擊“Edit Timing Constraints”
第二步,打開(kāi)之后看到如下界面:
第三步,雙擊create clock,打開(kāi)如下界面:
第四步,一般會(huì)點(diǎn)擊sourcesobjects 旁邊的這個(gè)按鈕來(lái)選擇你要約束的時(shí)鐘:
點(diǎn)擊之后彈出如下界面:
第五步,輸入你要約束的時(shí)鐘,然后進(jìn)行查找,找到之后按照如下添加到右側(cè)框內(nèi),然后點(diǎn)擊set:
第六步,然后set之后會(huì)返回到這個(gè)界面,你需要在這個(gè)界面輸入時(shí)鐘名,不然會(huì)生成一個(gè)虛擬時(shí)鐘:
第七步,然后到這個(gè)界面,按照?qǐng)D片進(jìn)行操作:
一般來(lái)說(shuō)要點(diǎn)擊add clock,然后按crtl+s保存你設(shè)置的時(shí)鐘約束,之后再點(diǎn)擊apply(或者直接點(diǎn)擊apply)。
然后你打開(kāi)你的xdc文件,會(huì)發(fā)現(xiàn)已經(jīng)有了這么一個(gè)約束了,然后再重新綜合和實(shí)現(xiàn)就好了。
create_clock -period 8.000-name clkb -waveform {0.000 4.000} -add [get_nets{u_TTE_switch_top/U_ET_switch_plane_top/U_fp_and_sch_0/u_schedule_top/u_bus_ram/clkau_TTE_switch_top/U_ET_switch_plane_top/U_fp_and_sch_0/u_schedule_top/u_bus_ram/clkb}]
create_clock -period 8.000-name clk_gtx_125m -waveform {0.000 4.000} -add [get_netsinst_sgmii_if/clk_gtx_125m]
全文完。
來(lái)源:本文轉(zhuǎn)載自網(wǎng)絡(luò)交換FPGA公眾號(hào)
-
FPGA
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
602984 -
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120230 -
時(shí)序分析
+關(guān)注
關(guān)注
2文章
127瀏覽量
22565 -
時(shí)序約束
+關(guān)注
關(guān)注
1文章
115瀏覽量
13416
原文標(biāo)題:FPGA中的時(shí)序約束--從原理到實(shí)例
文章出處:【微信號(hào):FPGA研究院,微信公眾號(hào):FPGA研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論