——————————————————————————————
版權聲明:
本文作者:烓圍瑋未。主要從事ISP/MIPI/SOC/車規(guī)芯片設計/SOC架構設計
首發(fā)于知乎專欄:芯片設計進階之路
微信公眾號:芯片設計進階之路(x_chip)
轉發(fā)必須授權,同時保留這段聲明,盜版必究!
——————————————————————————————
Narrow Burst (AXI 協(xié)議稱為Narrow Transfer)雖然在實際的設計中使用的比較少,但是它對系統(tǒng)總線的設計卻有比較大的影響,對應支持Narrow Burst的Master IP,系統(tǒng)一定要妥善的支持,否則就會導致功能不正確。所以對這個概念還是必須有非常準確的理解。下面我們總結一下Narrow Transfer。
AXI Burst[/ol]雖然ARM 把AMBA協(xié)議寫的很精簡,能不多說一個字就不浪費任何的單詞,而且能不畫圖說明的一定不給你畫圖解釋,但是協(xié)議的定義還是比較嚴謹和準確的。我們在理解概念的時候,還是以協(xié)議的原文為準,不懂就多讀幾次。
AXI通過AxBurst信號來區(qū)分,定義了三種burst類型,從AXI3~AXI5這個類型一直沒變過:
FIXED:這種突發(fā)類型用于對同一位置的重復訪問,例如加載或清空FIFO時。
在整個突發(fā)傳輸中,每個傳輸?shù)牡刂范枷嗤?li>同一個burst內(nèi)的每一個beats的byte lanes數(shù)目保持一致,但可以通過WSTRB選擇每個beat的哪些byteLane是有效bytes。
Burst長度最多可以等于16。
[/ol][/ol]注意:Fixed類型的burst基本只有一個應用場景,那就是FIFO的讀寫。另外,雖然AXI4增加了burst length的最大值,但是Fiexed的最大burst length并沒有增加,仍然是16.
INCR: 這種突發(fā)類型中,每個傳輸?shù)牡刂范际乔耙粋傳輸?shù)刂返脑隽俊?br />
增量值取決于事務的大小。例如,對于一個4字節(jié)大小的對齊起始地址,每次傳輸?shù)牡刂肥乔耙粋地址加4。
這種突發(fā)類型用于訪問DDR等。
[/ol][/ol]INCR類型的burst是最常見的burst。由于現(xiàn)代大部分SOC都是以DDR為中心的,所以很多master主要支持INCR類型的burst,其他的兩種可能都不支持。
這里重點強調(diào)一下:AXI的transcation之間是獨立的!
比如下這個讀傳輸,burst=4,INCR類型:
請問,第一個綠色的transcation和第二個藍色的transcation之間是什么關系?答案是:沒有關系!
AXI的一個transcation就是一個獨立的,完整的傳輸。Slave在接受到命令的時候,是不用依賴前一個或者后一個transcation信息就能完整處理當前transcation的所有操作。比如,你只發(fā)一個transcation,難道slave就不能接受嗎?
所以:burst類型以transcation為邊界的,也就是定義的是transcation內(nèi)部的規(guī)則。
那么這里為什么transcation1和transcation2看起來這么連續(xù),非常符合INCR連續(xù)遞增的特點呢?這是因為實際使用中,單個transcation并不能傳輸完Master需要的數(shù)據(jù),而Master需要的數(shù)據(jù)往往是一大塊連續(xù)的地址,所以幾個連續(xù)的transcation看起來地址是連續(xù)的,這和協(xié)議沒有任何關系。
比如下面這種傳輸是不是INCR? 仍然是的,只是實際使用這么發(fā)的比較少而已。
WRAP:這種突發(fā)類型與INCR類似,但如果達到了一個上限地址,地址會回繞到一個較低的地址。
最低地址是對齊到要傳輸數(shù)據(jù)的總大小的,即大小 * 長度。這個地址被稱為Wrap Boundary。
每次傳輸后,地址的增量與INCR突發(fā)相同。然而,如果這個增量后的地址是(包裝邊界 + (大小*長度)),那么地址會回繞到Wrap Boundary。
事務中的第一個傳輸可以使用高于Wrap Boundary的地址,但受到WRAP事務限制條件的約束。當?shù)谝粋地址高于Wrap Boundary時,地址會回繞。
起始地址必須與每個transfer的大小對齊。
Burst的長度必須是2、4、8或16個傳輸。
以下是一些限制條件:
WRAP事務的行為如下:
這種Burst類型用于緩存行訪問。
[/ol][/ol]WARP類型屬于三種里面最難理解的,首先是限制:起始地址必須與每個transfer的大小對齊。transfer大小就是數(shù)據(jù)位寬,比如32bit就是4byte,地址都是按照byte為最小單位的。所以WRAP類型的起始地址和AXI位寬的對應關系如下:
[/ol]AXI 位寬32bit -------------------------WRAP 起始地址對齊到4:0x0,0x4,0x8,0xc, 不能出現(xiàn)0x2,0x6這些;
AXI 位寬64bit -------------------------WRAP 起始地址對齊到8:0x0,0x8 不能出現(xiàn)0x2,0x4,0x6這些;
AXI 位寬128bit -----------------------WRAP 起始地址對齊到16:0x00,0x10,最低位不能出現(xiàn)非0地址;
AXI 位寬256bit -----------------------WRAP 起始地址對齊到32:0x00,0x20,0x20的倍數(shù);Burst長度不能是1, 只能是2,4,8,16其中一個。
[/ol]而WRAP burst的應用場景主要就是Cache line的訪問,所以一般都是帶cache的CPU和GPU等IP來使用,其他的IP很少用到。
當發(fā)生cache miss時,從memory讀回來的是整個cache line。如果不支持WRAP Burst那么就必須從cache line的起始地址開始讀數(shù)據(jù):
如上圖,CPU需要的數(shù)據(jù)是D06,但是CPU不支持WRAP Burst,所以必須從D00開始讀,那么如果CPU不支持亂序執(zhí)行,那么CPU就必須停止執(zhí)行,等D00~D05讀完,拿到D06后再繼續(xù)執(zhí)行。這樣對CPU的性能影響是非常大的。
如果支持WRAP Burst,就可以第一個訪問D06,CPU繼續(xù)執(zhí)行,不會影響CPU性能。
WRAP地址的上下界的計算大家可以去看一下協(xié)議,很多文章說明過,這里就不展開了。
Narrow Transfer[/ol]AXI 協(xié)議定義的Narrow Transfer如下:
也就是如果傳輸?shù)膖ransfer的實際有些的數(shù)據(jù)位寬小于實際的data channel的位寬,則為Narrow Transfer。在Narrow Transfer中,AXI總線的某些數(shù)據(jù)位寬不會被使用,因此需要通過寫使能信號(WSTRB)來指示哪些字節(jié)通道是有效的。
注意,只有寫通道有STRB信號,也就是Narrow Transfer只是會發(fā)生在寫通道。這也很好理解,讀數(shù)據(jù)是slave返回的, 使用STRB信號并不會帶來任何收益,需要的帶寬不會減少,而且還需要增加一個信號,更好的方式是把數(shù)據(jù)都讀回來,master需要用哪些自己來決定。
注意:WSTRB并不是Narrow transfer的充分必要條件,也就是說出現(xiàn)了WSTRB并不代表這個tranfer就是Narrow Transfer. 在非對齊的傳輸中,也會用到WSTRB,而且協(xié)議并沒有規(guī)定WSTRB是連續(xù)的。
協(xié)議規(guī)定的Narrow Tansfer分為兩種不同情況:
1.如果是INCR 或者 WRAP Burst,那么每個transfer(beat)使用不同的byteLane;
2.如果是FIXED Burst,那么每個transfer(beat)使用相同的byteLane;
如下圖中起始地址是0,INCR Burst Len=5, 總線寬度是32bit,transfer是8bit,傳輸情況如下:
那么這種情況下,AWSIZE是多少呢?
可以看到,SIZE表明的是每個傳輸中最大的byte數(shù),這里需要注意是最大。所以這里AWSIZE=0b00;
那么對于下面的BURST=2, 數(shù)據(jù)位寬是32bit的傳輸屬于Narrow transfer嗎?
顯然這里不符合每個transfer(beat)使用不同的byteLane的條件,所以不是Narrow Transfer。這種傳輸在實際的Master里面還是比較常見的。
另外這里的AWSIZE=0b010 (4byte per transfer)
所以協(xié)議雖然沒有明確說明,但是從協(xié)議的規(guī)定可以看到:
1.如果burst length =1,有WSTB就可以認為是Narrow transfer,也可以認為是非Narrow tranfer,對傳輸無影響,slave通過WSTB來解析數(shù)據(jù)就可以。
2.如果burst length >1,那么Narrow Transfer的burst的AWSIZE必須小于數(shù)據(jù)位寬能傳輸?shù)淖畲骲yte數(shù),也就是每個tranfer的數(shù)據(jù)量都必須小于數(shù)據(jù)通道的位寬才行,而且必須滿足每個transfer(beat)使用不同的byteLane。
后記技術很重要,技術背后的思想更重要!
技術背后的某些思想就是你解決以后問題的鑰匙。我的文章可能一篇中知識點不太多,但是力求讓你能深入理解,為你進階打下基礎。如果有一點點收獲,也算是我對中國芯片行業(yè)的一點點貢獻吧。
贈人玫瑰,手有余香。如果你有所收獲,麻煩花一秒時間幫我點個贊和在看吧,謝謝!
知乎專欄:芯片設計進階之路
微信公眾號:芯片設計進階之路 x_chip
—————————————————————————————— |