深入AXI4總線-[四]傳輸事務屬性(draft)


知乎用戶ljgibbs授權轉發

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

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

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

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

備注

事務類型與屬性

AXI 協議中定義了一組信號表示讀寫傳輸事務的類型,分別為 ARCACHE 以及 AWCACHE,合稱為 AXCACHE。兩者控制了

  • 傳輸事務在整個系統中如何進行(How a transaction progresses through the system)
  • 系統緩存對傳輸事務的操作(How any system-level caches handle the transaction)

AXI 協議中存在兩類主機:存儲從機(Memory Slave)與外設從機(Peripheral Slave)。

我們協議中傳輸事務屬性主要是為存儲從機准備的禮物,存儲從機必須支持所有的事務屬性信號。

而對於外設從機,支持哪些屬性信號,就看着辦了,協議只有一個要求:外設從機必須完成整個傳輸事務,哪怕存在其不支持的某個事務屬性信號。

外設從機對於屬性信號的支持以及相應的訪問方式(method of access)由具體實現決定(IMPLEMENTATION DEFINED),一般設計者會將支持的方式列於該從機的規格書中,從機也只對所支持訪問方式進行正確響應。

極端情況下,從機接收到一個不支持的訪問方式,然后 GG (比如崩潰)了,這是可以的。但是一定一定要完成這次的傳輸事務后再 GG,以防止整個系統死鎖。

協議也不要求從機支持復活機制。(continued correct operation is not required

系統級緩存

注意:AXI 協議緩存相關機制是針對處理器的系統級緩存的一種實現。

所謂系統級緩存(system level cache)區別於處理器內部的緩存,系統級緩存提高整個系統訪問外部存儲的速度。當系統級緩存連接在處理器核與外部存儲之間時,可以被看做處理器核外部的 L2 緩存,如下圖所示

處理器核、系統緩存以及外部存儲控制器通過 AXI 總線接口互聯。L1 緩存位於處理器核內部。當處理器訪問外部存儲中的數據,在 L1 緩存中缺失時,向外部緩存發起傳輸事務。傳輸事務在通過系統緩存時,如果該事務命中緩存表項,即可直接得到結果,避免訪問外部存儲帶來的缺失代價。

這里的 system cache 概念與拓撲見參考文獻[1],來自 Xilinx system cache IP 手冊

存儲相關屬性信號

存儲相關信號主要涉及到緩存(cache)的相關知識,本節的敘述已經假定讀者了解存儲,尤其是緩存相關的基礎知識,比如以下幾點。

什么是緩存?為什么緩存能夠加速存儲的讀寫?

然后是經典的緩存四問,來自閱讀材料(C):

  • 數據應該緩存至哪個位置?(塊的防置)
  • 如何找到對應的緩存塊?(塊的識別)
  • 在缺失時,應該替換哪個塊?(塊的替換)
  • 在寫入時會發生什么?(寫入策略)

如果你不能很好地答上這些問題,不慌,筆者有一個三步閱讀套餐給你。

(A)很棒的知乎科普讀物,建議基本讀完所有文字

高速緩存與一致

(B)教科書,推薦《計算機組成與設計 硬件/軟件接口》(第五版)第五章

(C)經典書籍,《計算機體系結構 量化研究方法》(第五版)附錄B

其實讀完(A),我們就接着往下看吧,畢竟這不是與緩存緊密相關的 ACE 協議(ACE 后面再學習),不建議啥也不讀就往下看。

AXI4 的存儲屬性信號以 AXI3 作為基礎,並做了一些改進。協議先敘述的 AXI3,再討論 AXI4 的改進。那么本文則直接討論 AXI4 了。

AxCACHE 信號共有 4 比特,每個比特代表不同的含義。首先是 AxCACHE[0] 信號,代表 Bufferable。

Bufferable

當 AxCACHE[0] 置高時,表示該傳輸事務在傳輸至目的地的途中,可以被 interconnect 或者任意的 AXI 組件緩存,延遲若干個周期。一般應用於寫傳輸事務。

協議上言盡於此,本文根據 cache 機制展開引申。

值得注意的是,筆者為此問題在網上沖浪了很久,並沒有一個針對 AXI Bufferable 本身的明確解釋,這里的描述可能不一定完全正確。

CPU 在特定的寫入策略下,本來在寫傳輸事務中需要寫入至主存儲(main memory)的數據,可以先緩存於 cache 中,等待被替換時再真正寫入主存儲。

因此 CPU 在寫入 cache 后就認為寫操作完成。寫事務原先的目的地是主存儲,比如外部 DDR,理論上應該由 DDR 控制器在 “真的” 寫入數據到 DDR 后,向 CPU 發出寫回復信號,表示寫傳輸事務完成。但是現在數據寫入 cache后,即向 CPU 發出了寫回復信號結束了本次寫回復。

當 AxCACHE[0] 置低時,這種特性即不被允許,那什么情況下不允許緩存?參考文獻[2]中的網頁中舉了一個例子,當 CPU 使用 DMA 將數據傳輸至 IO 設備時,數據首先被寫入 DMA 在內存中開辟的緩沖區。此時 CPU 需要掌握什么時候數據“真的”被完全寫入緩沖區,因為需要確保數據存入后,再啟動 DMA 傳輸。

我們接着引申,假設數據已經被緩存在中間組件中了,如果相鄰的緩存事務中的數據正好要被寫入相鄰的地址(換句話說在一個 cache line 中),那么如果能把不同數據聚合起來,這樣一來豈不是能減少寫入數據的次數,減少對總線的占用?這就涉及到 AxCACHE[1] Modifiable 信號

Modifiable

當 AxCACHE[1] 置高時,表示傳輸過程中,該寫傳輸事務的傳輸特性可以改變

協議列舉了一些傳輸事務改變的情形:

  • 單個傳輸事務可以被分解為多個傳輸事務
  • 同理,多個傳輸事務也可被聚合為一個(上節描述的現象)
  • 讀傳輸事務中,可以預取相鄰地址上的讀數據,要求目的地址返回比主機需求更多的數據
  • 寫傳輸事務中,可以訪問比需求地址跨度更大的區域,其中使用 WSTRB 信號防止更新不相關的數據

上述幾種情況中,幾項信號可以發生改變(Modify):

  • 傳輸地址 AxADDR
  • 突發傳輸位寬與長度 AxSIZE AxLEN
  • 突發傳輸類型 AxBURST

此外,AxID、AxQOS 等信號也是可以改變的,AxID 的改變常見於 interconnect 的輸出。

AxCACHE 信號本身也是可以改變的,但有一些特別的限制。對於存儲屬性信號的修改必須保證傳輸事務對於 AXI 組件的可見性不減小,不能改變傳輸事務本身的傳播路徑,也不能改變事務對於緩存的查找需求。此外,對於傳輸事務存儲屬性的修改需要作用於整個地址范圍中的事務。

協議規定 AxLOCK、AxPROT 信號是不可改變的。此外兩種情況下,傳輸事務的信號不能改變:

  • 自然地,如果修改后的傳輸事務地址超出了原地址的 4K 邊界,那么這種修改是不被允許的
  • 第二種情況與原子操作有關,具體可以參見手冊。

當 AxCACHE[1] 置低時,表示傳輸過程中,該寫傳輸事務的傳輸特性不可以改變

下圖中的信號不可改變,此外比如 ID 和 QoS 信號還是可以改變的。比如前者在多機通信場景中,通過 interconnect 后會改變,與其存儲屬性無關。

AxCACHE 信號可以改變,但只能從 bufferable 修改為 non-bufferable。

cache-allocate

對於讀寫事務,AxCACHE 中的高 2 比特,用於表示本次傳輸事務所訪問地址中的數據是否可能在緩存中, 2 比特分別表示:

對於讀事務 2 比特分別表示:

  • allocate
  • 當前地址的數據可能因為前期的訪問,已經分派空間並緩存於 cache 中
  • other allocate
  • 當前地址的數據可緩存於 cache 中,是因為其他主機事務而分派空間緩存,或者是本機其他類型的事務而緩存。(對於讀事務來說,就是先前的寫事務,反之亦然)

當 2 比特為 2'b00 時,表示 CPU 指示該傳輸事務無需至 cache 中查找,必須直接從主存儲中讀取或者寫入主存儲。

當 2 比特不為 2'b00 時,先前的讀寫事務可能已經將該地址緩存與 cache 中,所以該傳輸事務必須首先在 cache 中查找,缺失的情況下再訪問主存儲。

這里說可能是因為,盡管 CPU 根據指令順序認為該數據已緩沖,但由於指令亂序、數據實際未就緒等原因,實際的存儲情況可能與 CPU 記錄的情況不同,由緩存控制器具體判斷。

我們具體地分別來看下讀寫事務中的 AxCACHE[3:0] 信號,首先是寫事務

AWCACHE[3] 信號置高表示本主機先前的寫事務可能已經將該位置上的數據緩沖於 cache,首先在 cache 中查找對應表項。當 AWCACHE[3] 信號置低,但 AWCACHE[2] 置高時,該位置上的數據可能因為其他主機的操作、或者本機的讀事務緩存於 cache 中,同樣需要首先查找 cache。

對於讀事務來說,字段的含義與寫事務對應,將讀寫事務交換即可。同時注意 Allocate 和 Other Allocate 比特的位置交換。

存儲類型

總的來說 AxCACHE[3:0] 主要作用在於給不同存儲類型(Memory type)編碼,前文只是在解釋各個比特位對應的含義。換句話說,可以根據傳輸事務的具體存儲類型,做出相應操作。

存儲類型可以划分為四種情況,我們依次來看。除了上表列出的情況,AxCACHE 剩余可能的數值均留作備用。

(1)Device 訪問

在訪問 Device 時,AxCACHE[3:1] = 3'b000,傳輸事務在中間節點不能被修改。具體地說,不能預讀數據(Prefetch read)和匯聚寫數據(Merge write)。這是因為在訪問非存儲外設時,讀寫的是寄存器值,預取數據是沒有必要的。而將不同的寫事務聚集則容易造成預期之外的問題,比如會導致相鄰寄存器操作的先后順序無法滿足。

根據 AxCACHE[0] 決定 device 訪問是否可以被中間節點緩存,決定 bufferable 性質。

(2)Normal Non-cacheable 訪問

Normal 訪問指正常地訪問存儲介質,而不會查找緩存,AxCACHE[3:1] = 3'b001。Normal 非緩存訪問中,中間組件可以對傳輸事務信息進行修改,支持寫事務聚合。

根據 AxCACHE[0] 決定 normal 訪問是否可以被中間節點緩存,決定 bufferable 性質。

(3)Wirte-through 訪問

write-through 指緩存的寫入策略為直寫,即數據寫入緩存的同時,也寫入主存儲中。此時 AxCache[1:0] = 2'b10,即中間組件可以修改傳輸事務,實現寫聚合與讀預取。AxCache[0]置低,每個寫事務最終必須寫入目的地址。

此類訪問啟用緩存,讀數據可以來自緩存,並且每次讀寫操作都需要查找緩存,尋找匹配表項。

根據 AxCache[3:2] 不同,從圖中得到共有 4 種情況,分別代表不同的分派提示,比如 No-allocate 代表建議不要為該事務分派緩存空間。Read-allocate 代表建議為讀事務分派緩存,但不建議為寫事務分派緩存。不過這都只是代表處理器從性能出發給出的建議,由緩存控制器視情況執行。

(4)Write-back 訪問

Write-back 指緩存的寫入策略為寫回,數據僅寫入緩存,修改的緩存只在被替換時寫入主存儲。

AxCache[1:0] = 2'b10,即中間組件可以修改傳輸事務,並且進行緩存。

與 Wirte-through 訪問相比,區別在於由於寫回策略中並不是每次寫事務后都需要更新主緩存,因此無需將每個寫事務傳輸至其本來的目的地(即主存儲)。(Write transactions are not required)

訪問權限控制

為了阻止惡意程序越權訪問的關鍵外設,AXI 協議設計了訪問控制信號 AxPROT,配合其他安全機制,限定不同應用的訪問權限。

讀寫事務的 AxPROT 信號位寬均為 3 比特,其含義如下圖所示

AxPORT 信號本身不存在任何機制,僅傳遞了權限以及安全訪問信息,相關機制由 AXI 組件實現,比如 ARM TrustZone 等。


免責聲明!

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



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