FPGA的設(shè)計(jì)中,一個(gè)前級(jí)模塊A向下游模塊B發(fā)送數(shù)據(jù),如下圖所示,當(dāng)下游模塊B不能及時(shí)處理數(shù)據(jù)時(shí),希望前級(jí)模塊A停止發(fā)送數(shù)據(jù),這個(gè)時(shí)候模塊B會(huì)通過(guò)一個(gè)反壓信號(hào)給到模塊A,告訴模塊A,不要再給我發(fā)數(shù)據(jù)了。這就是一種最常見(jiàn),也是用得最普遍的一種發(fā)壓場(chǎng)景。
那究竟要如何設(shè)計(jì)反壓呢?看似簡(jiǎn)單,其實(shí)也不簡(jiǎn)單,處理不好的話對(duì)系統(tǒng)的穩(wěn)定性和性能會(huì)帶來(lái)一定的影響。本文介紹幾種常見(jiàn)的反壓方式,并給出他們的一些優(yōu)缺點(diǎn)。
立即反壓
所謂立即反壓,就是指下游模塊給出反壓后,前級(jí)模塊立即停止發(fā)包,如下圖所示:
一共有7個(gè)數(shù)據(jù),但是真正能被下游模塊接收的數(shù)據(jù)只有6個(gè),其中數(shù)據(jù)E在發(fā)送的時(shí)候因?yàn)閞eady無(wú)效,所以不能被接收。如果對(duì)axi_stream接口比較了解的話,可以看出,這就是axi_stream接口,只有在valid和ready同時(shí)有效的時(shí)候的數(shù)據(jù)才能被接收。
它的優(yōu)點(diǎn)就是能立即反壓,尤其是下游模塊沒(méi)有緩存的時(shí)候。另外就是這種接口是標(biāo)準(zhǔn)接口,和外部模塊對(duì)接的時(shí)候不會(huì)有歧義。缺點(diǎn)就是因?yàn)樾枰⒓捶磯海M合邏輯處理比較簡(jiǎn)單,如果用時(shí)序邏輯,控制起來(lái)不是很方便。
將滿(mǎn)反壓
如果下游接收模塊有緩存,一般是fifo或者ram。當(dāng)緩存快要滿(mǎn)的時(shí)候,會(huì)給前級(jí)模塊反壓,這就是將滿(mǎn)反壓。如下圖所示:
這種反壓的特點(diǎn)就是下游模塊給出反壓信號(hào)后,前級(jí)模塊還可以繼續(xù)寫(xiě)入一些數(shù)據(jù),一般不超過(guò)5拍。上圖中,雖然afull = 1了,但是前級(jí)模塊還會(huì)繼續(xù)寫(xiě)入2個(gè)數(shù)據(jù),數(shù)據(jù)F和數(shù)據(jù)G。同時(shí)下游模塊也要控制好緩存的水限,在給出反壓信號(hào)后還要預(yù)留一定的緩存空間,具體多少,需要和前級(jí)模塊配合好,筆者的經(jīng)驗(yàn),一般預(yù)留8個(gè)以上。
如下圖所示緩存的深度為128,當(dāng)數(shù)據(jù)寫(xiě)滿(mǎn)100以后給出反壓,此時(shí)緩存還可以寫(xiě)入28個(gè)數(shù)據(jù),該緩存的水限就為100。
這種將滿(mǎn)反壓的優(yōu)點(diǎn)就是處理非常方便,只要下游模塊不反壓,就可以不停地寫(xiě)入數(shù)據(jù),控制非常方便,另外下游模塊緩存的深度和前級(jí)模塊無(wú)關(guān),一般用于項(xiàng)目?jī)?nèi)部模塊之間。至于缺點(diǎn),如果一定要找一個(gè)缺點(diǎn),那就是下游模塊必須有緩存,而立即反壓可以不需要。
另外,對(duì)于緩存,到底是用ram還是用fifo,應(yīng)該根據(jù)場(chǎng)景來(lái)確定,通常情況下用fifo可以滿(mǎn)足大部分的應(yīng)用場(chǎng)景。
整包反壓
上述將滿(mǎn)反壓,如果反壓頻繁的話,會(huì)給前級(jí)模塊的處理帶來(lái)一點(diǎn)點(diǎn)的復(fù)雜度,為了簡(jiǎn)化這種反壓帶來(lái)的影響,還有一種叫整包反壓。和將滿(mǎn)反壓相比,就是下游模塊給出反壓信號(hào)后,前級(jí)模塊會(huì)把當(dāng)前的數(shù)據(jù)報(bào)文全部發(fā)送給下游模塊,如下圖所示:
當(dāng)數(shù)據(jù)在傳輸?shù)倪^(guò)程中,如果下游模塊給出反壓使得afull = 1,前級(jí)模塊會(huì)繼續(xù)發(fā)送報(bào)文,直到報(bào)文的eop為止。這種場(chǎng)景下,首先需要約定報(bào)文的最大長(zhǎng)度,假定為MAX_LEN,那么對(duì)下游的緩存就會(huì)有要求,其容量至少為MAX_LEN,考慮到流水性能,其容量要為2*MAX_LEN,同時(shí)水限的設(shè)置要保證反壓后的空間至少能存放一個(gè)報(bào)文。
這種方案的優(yōu)點(diǎn)是控制簡(jiǎn)單,只要開(kāi)始發(fā)送的時(shí)候不反壓,就可以把當(dāng)前的報(bào)文全部發(fā)送完。缺點(diǎn)就是當(dāng)約定的MAX_LEN比較大時(shí),需要較多的緩存開(kāi)銷(xiāo)。
小結(jié)
反壓是FPGA設(shè)計(jì)中的一個(gè)最基本且重要的話題,在實(shí)際應(yīng)用中,模塊與模塊之間的反壓要做好“逐級(jí)反壓”,當(dāng)反壓點(diǎn)與緩存較遠(yuǎn)的時(shí)候,尤其要考慮在途的數(shù)據(jù),反壓后的空間要能緩存住在途數(shù)據(jù)。除了上述的幾種方案外,請(qǐng)求應(yīng)答接口某種意義上也是一種反壓的設(shè)計(jì),只是性能較低罷了,一般不建議采用。
-
FPGA
+關(guān)注
關(guān)注
1625文章
21620瀏覽量
601241 -
模塊
+關(guān)注
關(guān)注
7文章
2655瀏覽量
47293 -
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
428瀏覽量
26465
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論