深入AXI4總線-[三]傳輸事務結構


知乎用戶ljgibbs授權轉發

本系列我想深入探尋 AXI4 總線。不過事情總是這樣,不能我說想深入就深入。當前我對 AXI總線的理解尚談不上深入。但我希望通過一系列文章,讓讀者能和我一起深入探尋 AXI4。

聲明1:部分時序圖以及部分語句來自 ARM AMBA 官方手冊

(有的時候感覺手冊寫得太好了,忍不住就直接翻譯了。。)

聲明2:AXI 總線是 ARM 公司的知識產權

備注

Burst-based 的 AXI 協議

Burst,單詞本身有爆炸、釋放之意,可引申為突發之意。

那么在數據傳輸的范疇中,就使用 burst 來表示一種傳輸模式:在一段時間中,連續地傳輸多個(地址相鄰的)數據。此時可譯為突發傳輸或者猝發傳輸。

在手冊的術語表中,與 AXI 傳輸相關的有三個概念,分別是 transfer(beat)、burst、transaction。用一句話串聯就是:

在 AXI 傳輸事務(Transaction)中,數據以突發傳輸(Burst)的形式組織。一次突發傳輸中可以包含一至多個數據(Transfer)。每個 transfer 因為使用一個周期,又被稱為一拍數據(Beat)。

再展開一層,兩個 AXI 組件為了傳輸一組數據而進行的所有交互稱為 AXI Transaction,AXI 傳輸事務,包括所有 5 個通道上的交互。

AXI 是一個 burst-based 協議,AXI 傳輸事務中的數據傳輸以 burst 形式組織,稱為 AXI Burst。每個傳輸事務包括一至多個 Burst。每個 Burst 中傳輸一至多個數據,每個數據傳輸稱為 AXI Transfer。我們 通過深入AXI4總線(一)了解到,雙方握手信號就緒后,每個周期完成一次數據傳輸,因此 AXI Transfer 又被稱為 AXI beat,一拍數據。不嚴謹地說

AXI Transaction =M*AXI Burst ,M >= 1

AXI Burst = N * AXI Transfer(AXI beat) ,N >= 1

所以本章我們就將跟着協議手冊,從地址、數據以及回復總線上的傳輸事務結構,來了解 AXI 的整體傳輸事務結構

傳輸事務結構(Transaction structure)

讀寫地址結構

在整個傳輸事務過程中,主機首先將接下來 burst 傳輸的控制信息以及數據首個字節的地址傳輸給從機,這個地址被稱為起始地址。在本次 burst 后續傳輸期間,從機將根據控制信息計算后續數據的地址。

控制信息以及起始地址在讀/寫地址通道(AWC/ARC)傳輸。

注意:單次 burst 傳輸中的數據,其地址不能跨越 4KB 邊界。

關於這點在筆者參考的一個來源這樣表示,目前筆者覺得看上去很有道理:

協議中之所以規定一個burst不能跨越4K邊界是為了避免一筆burst交易訪問兩個slave(每個slave的地址空間是4K/1K對齊的)

4K對齊最大原因是系統中定義一個page大小是4K,而所謂的4K邊界是指低12bit為0的地址。

詳情轉至參考來源:

關於axi協議里面burst的4k問題_KeepFighting!-CSDN博客blog.csdn.net

地址通道中傳輸的控制信息中包括三項突發傳輸相關的信號(AR/AW 均一致,下圖為以 AR 為例):

(1)突發傳輸長度 (burst length),指一次突發傳輸中包含的數據傳輸(transfer)數量,在協議中使用 AxLen 信號控制。

在 AXI4 中,INCR 類型最大支持長度為 256,其他類型最大長度為 16。而 AXI3 中這一數字無論何種模式均為 16。因此 AXI4 中 AxLen 信號位寬為 8bit,AXI3 中的 AxLen 則僅需要 4bit。

當然突發長度至少為 1,不然也就沒有傳輸發生了。

協議中的 AxLen 信號從零開始表示,實際的長度值為 AxLen + 1。

突發傳輸長度在不同的模式(burst type ,將在后文中討論)下有一些限制,包括:

  • 對於 WRAP 模式,突發傳輸長度僅能為2,4,8,16
  • 在一次突發傳輸中,地址不能跨越一個 4KB 分區
  • 一次突發傳輸不能在完成所有數據傳輸前提前結束(early termination)

協議中多次強調,通信雙方都不能在傳輸事務的所有 Transfer 完成前提前結束。哪怕發生錯誤,也得含淚走完整個傳輸事務的流程。

但是主機也有辦法減少傳輸的數據。在寫傳輸事務中,發送方可以通過置低所有的寫有效位,使寫數據無效。在讀傳輸事務中,主機可以直接丟棄讀取到的數據。

(2)突發傳輸寬度(burst size),指傳輸中的數據位寬,具體地,是每周期傳輸數據的字節數量,在協議中使用 AXSIZE 信號控制。

自然地,突發傳輸數據寬度不能超過數據總線本身的位寬。而當數據總線位寬大於突發傳輸寬度時,將根據協議的相關規定,將數據在部分數據線上傳輸。

突發傳輸寬度信號 AXSIZE 位寬為 3bit,表示為:

傳輸寬度 = 2 ^ AXSIZE

(3)突發傳輸類型(AxBURST),類型共有 3 種,分別為 FIXED,INCR 以及 WRAP。使用 2 位二進制表示。

FIXED 類型中, burst 中所有數據都使用起始地址。該模式適合對某個固定地址進行多次數據更新,比如讀寫一個 fifo 時,讀寫地址就是固定的。

INCR 類型最為常用,后續數據的地址在初始地址的基礎上進行遞增,遞增幅度與傳輸寬度相同。適合對於 RAM 等通過地址映射(mapped memory)的存儲介質進行讀寫操作。

WRAP 類型比較特殊,首先根據起始地址得到繞回邊界地址(wrap boundary)與最高地址。當前地址小於最高地址時,WRAP 與 INCR 類型完全相同,地址遞增。但到遞增后的地址到達最高地址后,地址直接回到繞回邊界地址,再進行遞增,就這樣循環往復。最高地址由繞回邊界地址計算得到:wrap boundary + (N_bytes x burst_len)

根據協議手冊上表示,WRAP 適合對 cache 的訪問,不過目前筆者在這方面的經驗還不多,后續有機會再討論。

地址計算參考

手冊在章節 A3 詳細給出了不同的突發傳輸模式下的地址計算公式與偽代碼,有相關需求的讀者可以參看這一部分。

讀寫數據結構

在 AXI 數據傳輸過程中,主要涉及到窄位寬數據傳輸(Narrow Transfer)、非對齊傳輸(Unaligned Transfer)以及混合大小端傳輸(mix-endianness)等問題。

(1)Narrow Transfer

當本次傳輸中數據位寬小於通道本身的數據位寬時,稱為窄位寬數據傳輸,或者直接翻譯成 窄傳輸

在窄位寬寫傳輸中,主機需要告知從機數據通道中哪些字節是有效的,需要使用到寫數據通道中的 WSTRB 信號。WSTRB 信號中的單個 bit 置起,表示對應位置上的字節有效,對應關系為:

WSTRB[n] 對應 WDATA[8n+7:8n],也就是:當 WSTRB[n] 為 1 時,WDATA[8n+7:8n]有效。

WSTRB 信號比特位寬等於數據通道位寬的字節數量,比如 32bit 位寬的數據通道,對應 WSTRB 信號位寬為 4bit。

對應於下圖的情況中,灰色的部分代表數據無效,第一次的傳輸中低地址第一字節有效,其他數據無效的 ,WSTRB 信號為 0x01,WSTRB [0] 為 1,即 WDATA[7:0] 有效。

我們接着上圖繼續說,上圖中的窄位寬傳輸有以下幾個特點:

  • burst 傳輸長度為 5
  • burst 傳輸位寬為 8bit
  • 起始地址為 0x0
  • 數據總線位寬為 32bit
  • 突發類型為 INCR

從圖中我們發現,在每次數據傳輸中使用的數據總線字節位置(byte line)不同,盡管數據以字節為單位,分為多個周期傳輸,但是數據的位置仍與其地址對應。D[7:0]將寫入起始地址 0x0,故位於最低字節。D[15:8] 將寫入地址 0x1,故位於次低字節。

個人理解該設計的意義在於,當主機是因為從機或者其他客觀條件限制,需要進行窄傳輸時,可以一次性將數據放置於數據總線上,只需在每次傳輸期間改變 WSTRB 信號即可。以上圖為例,主機將 D[31:0] 防置於總線,在接下來的四個周期中,僅需對 WSTRB 進行移位,即可依次完成 4 個字節的傳輸。

該結構有利於 memory 類型的從機進行寫入處理,這里設想一種實現方式,結合下圖講解,在 64bit 位寬的總線上進行 32bit 位寬傳輸,起始地址為 0x4 。此時假設存儲介質位寬與總線位寬一致,為 64 bit。

在 transfer 1st 中,從機獲取整個總線上的 64bit 數據存儲至存儲介質中,比如 DDR,並利用 wstrb 作為 mask 信號屏蔽無效的低 32 bit(比如 DDR 的 DQM 信號)。這時候存儲介質的寫入地址為 0x0,但實際只從地址 0x4 開始寫入了 32bit 數據。在后續的 transfer 繼續按以上模式工作。

窄傳輸中通過主機來調整有效數據的字節位置,以及給出字節有效信號 WSTRB,能夠使從機無需進行數據重組等工作。

注意:協議未規定窄傳輸中從機的具體實現,這里舉了一個設想的例子,后續需要結合窄傳輸的用途再研究考證

在讀傳輸中,從機的操作邏輯與寫傳輸中的主機相同,但是從機沒有類似 WSTRB 的信號。所以需要主機根據突發傳輸寬度與總線位寬,計算當前總線中有效數據所在字節位置,讀取數據。

協議規定在 INCR 和 WRAP 模式中每次使用的 byte line 必須不同,即數據位置與地址對應。而在 FIXED 模式中,整個傳輸過程使用相同的 byte line(地址反正 FIXED 不會變)。

(2)Unaligned Transfer

AXI 協議支持地址非對齊的傳輸,允許突發傳輸的首字節地址,即起始地址與突發傳輸位寬不對齊。舉個例子,總線位寬為 32bit 時,如果起始地址為 0x1002 ,則產生了非對齊現象。與 32bit 位寬總線對齊的地址需要能被 4 整除,即 ADDR[1:0] = 2'b0。

注意:此處對齊與否應該取決於突發傳輸的寬度,而不是總線位寬。

傳輸不對齊怎么辦,在線等,挺急的。

對於非對齊傳輸,主機會進行兩項操作:

  • 即使起始地址非對齊,也保證所有傳輸是對齊
  • 在首個 transfer 中增加填充數據,將首次傳輸填充至對齊,填充數據使用 WSTRB 信號標記為無效

我們通過幾個例子來說明主機具體的工作:

例子1

起始地址為 0x1,非對齊,但主機通過添加一字節的填充數據將 transfer 1st 的實際地址調整為對齊的 0x0,並用 WSTRB 信號為 4'b1110 標識出最低字節上無效的填充數據。

在讀傳輸中,從機也按照同樣的原則,在讀數據中填充無效數據實現對齊,由主機自行分離。

再舉一個例子,例子2

我們驚訝地發現這個例子是窄傳輸+非對齊傳輸,但問題不大,我們根據之前的經驗來看下。首先起始地址為不對齊的 0x07 ,所以首先將首個傳輸填充至與突發傳輸位寬 32 bit 對齊:

0x07 mod 4(byte) = 3 byte

至此非對齊的問題就已經解決了。接下問題就簡化為窄傳輸。圖 7 中 32bit 數據在 64bit 總線上傳輸,根據我們上一節的分析(見圖5),在 transfer 1st 中 再填充 4 個字節。后續的 transfer 中則遵從窄傳輸的原則即可。

(3)Byte Invarience

我們來討論數據傳輸結構三個問題中的最后一個:混合的大小端模式。首先我們知道內存中有 2 種大小端模式,就像甜咸兩黨一樣,爭論的是宇宙的終極奧義問題:

數據的高字節是存在低地址中還是存在高地址中。

大端認為:高字節(MSB)應該存在低地址,而小端認為低字節(LSB)才應該存在低地址

那么為了能夠使大小端模式在存儲中共存,AXI 協議設計了一種字節順序恆定(Byte-invariant)的大小端傳輸方案。對於存儲中包括多個字節的數據結構(單字節自然不存在大小端問題):

  • 無論大小端模式,每個數據結構存儲空間的分配方式是相同的
  • 該數據結構按照其大小端模式決定字節存儲的地址順序
  • 在傳輸過程中不考慮數據結構的大小端,按照字節原先存儲的順序,原樣傳輸並存放至對端

該模式的意義在傳輸雙方均不對數據結構的大小端進行解析轉換,而嚴格按照字節的存儲順序進行傳輸並轉存,防止大小端共存產生數據覆蓋

這個知識點將在涉及到具體問題時,再深入討論。

讀寫回復結構

讀寫傳輸事務(Transaction)都存在 2bit 位寬的回復信號 RRESP/BRESP,分別存在 4 種回復情況,分別為

  • OKAY ,常規訪問成功

  • EXOKAY,獨占訪問成功

  • SLVERR,從機錯誤,盡管從機接收到了訪問請求,但因為種種原因向主機返回了一個錯誤狀態,AXI 傳輸事務的回復由應用具體決定,可能包括以下錯誤場景:

    • FIFO 或者緩沖區溢出
    • 主機發起了不支持的傳輸位寬
    • 嘗試向讀保護的地址寫入數據
    • 超時
  • DECERR,解碼錯誤,一般由 interconnect 組件產生,表示主機發送的傳輸事務地址無效,無法將傳輸事務發送給某個從機。

注意:在寫傳輸事務中,單個寫回復針對的是整個 burst,而不是 burst 中單個 transfer。但是在讀傳輸事務中,從機可以為突發傳輸中每一個讀傳輸數據產生不同的讀回復信號。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM