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