---
# System prepended metadata

title: AMBA AXI Protocol

---

AMBA AXI Protocol
===

## AXI Architecture

AXI 是 burst-based 的 protocol 其中有五個 channels

- Write Address Channel
- Write Data Channel
- Write Response Channel
- Read Address Channel
- Read Data Channel

## Read and Write Transactions

### Handshake Process

每個 channel 都有自己的 handshake 機制，handshake 都是用 VALID/READY 來完成一次的傳輸。

要傳輸資訊的一端不必等目的地是否有拉起 READY 就可以發送 VALID，但一旦發送 VALID 就必須等到目的地回 READY 才能結束 VALID。

VALID/READY handshake 機制可以有兩種做法:

- 等有來源發送 VALID 後目的地若可以接收才回 READY。如下圖所示，T1 發送 VALID，T2 收到 VALID 後才回 READY，T3 完成此次的傳輸

![](https://i.imgur.com/FguEzKw.png)

- 只要目的地可以接收資訊就一直拉著 READY。如下圖所示，T1 目的地可以接收資訊，T2 來源發送 VALID，T3 完成此次的傳輸

![](https://i.imgur.com/xjq12yA.png)

一般推薦用第二種方法，這樣可以在來源發送 VALID 的下一 cycle 就完成傳輸。

### 各 Channel Handshake Process 的訊號名稱

![](https://i.imgur.com/1fTuT4U.png)

### Channel 間的關係

- Write response 必須要在最後一筆 write data 傳輸後才能回
- Read data 必須要有 read address 傳輸後才能回
- channel handshake 必須遵守下面的關係，其中單箭頭代表後者跟前著的關係沒有誰先誰後，雙箭頭代表前者一定要先發生後者才能發生


![](https://i.imgur.com/5z7nEWK.png)

上圖代表 read address channel 可以是 VALID 先拉起或 READY 先拉起，但 read address channel handshake 的訊號都必須要在 read data channel VALID 拉起前先拉起 (這其實也就是要傳輸 read data 前一定要先完成 read address 的傳輸)，而 read data channel 的 VALID 跟 READY 誰先拉起都可以。這邊並沒有要求 read data channel 的 READY 跟 read address channel 的 handshake 訊號的關係。

![](https://i.imgur.com/UugSWWs.png)

上圖代表 write address channel 跟 write data channel 的 VALID 跟 READY 誰先拉起都可以，但這些訊號都必須在 write response channel 的 VALID 拉起前先拉起過 (這表示要有 write response 必須先完成 write address 跟 write data 的傳輸才行)，write response channel 的 VALID 跟 READY 誰先拉起都可以。

write data channel 另外需要注意的是 VALID 要看的是最後一筆 data 的 VALID。

另外，AXI3 的時候並沒有要求 write response channel 的 VALID 必須要在 write address channel handshake 完成之後，因為當時並沒有預期會有可能有 write response channel 拉起 VALID 但還沒有完成 write address 傳輸的情況。

## Transaction Structure

一次的 Transaction 包含三個部分: address、data read/write、response

### Address Structure

AXI 是 burst-based 的 protocol，傳送 address 時也會傳送 burst 相關的控制資訊，而接收端就需要去根據這些控制資訊來處理 address。

:::info
Write address channel 跟 read address channel 除了傳 address 也包含 burst 的控制資訊。
:::

#### Burst 的控制資訊

- ARLEN[7:0] / AWLEN[7:0]: read address 跟 write address 的 burst 長度。
我們下面舉 read 的例子，write 也可依此類推
ARLEN = 0 代表這次發送的 read address 只會回傳一筆 data
ARLEN = 2 代表這次發送的 read address 會回傳三筆 data

- ARSIZE[2:0] / AWSIZE[2:0]: 每一筆 read / write 傳輸的 data size

![](https://i.imgur.com/9IMD5Zm.png)

- ARBURST[1:0] / AWBURST[1:0]: burst type，有三種 FIXED、INCR、WRAP 
    - FIXED
        - burst 的每一筆傳輸都是相同的 address
        - 雖然 burst 的每一筆傳輸都是相同的 address，但 write 時可以指定不同的 write byte (WSTRB)
        - FIXED type 適合用重複在存取相同 address 的時候，例如存取 FIFO
    - INCR
        - burst 的每一筆傳輸的 address 都是前一筆 address 的累加，累加的值取決於 burst size 
    - WRAP
        - WRAP 跟 INCR 類似，差別在當 address 超過上限會繞回較低的 address
            - 當 address 的到達 wrapper boundary + burst size x burst length 就會繞回 wrapper boundary，wrapper boundary = int(start address / (burst size x burst length)) x burst size x burst length，int() 會無條件捨去小數位
        - WRAP burst 的 start address 必須要 align burst size
        - WRAP burst 只能是 2, 4, 8, 16

![](https://i.imgur.com/oFEoZQO.png)


Burst 的規則:
- Burst address 不能夠跨 4KB address boundary
- Burst 長度限制從 1 - 256
    - AXI3 只有 1 - 128
    - AXI4 只有 INCR type 才能是 1 - 256，其餘仍是 1 - 128
- WRAP type 的 burst 長度只能夠是 2, 4, 8, 16
- 一旦給了 burst 長度就一定要發完，不能提前結束

### Data Read and Write Structure

#### Write Strobes

write data channel 的 data bus 可以分成一條條的 byte lane，每條由 WSTRB (write strobes) 控制，若 data bus 為 n bytes 那 WSTRB 就需要 n bits，每個 bit 對應 data bus 第 n 個 byte 是否是 valid data。

WSTRB 在 WVALID 沒有拉起前是任何值都無所謂。

#### Narrow Transfers

write data channel 可以接受較大的 data bus 但指傳輸較小的 data size，要達到如此我們需知道 address 跟一些控制訊號，像是 burst size 之類來控制 WSTRB 來決定哪些 byte lane 需要使用。

以下圖為例，下圖為 data bus 為 32-bit，burst size 為 0 (也就是每次傳輸 8-bit data)，burst length 為 4 (也就是會傳輸 5 筆 data)，burst type 為 0 (也就是 INCR type) 的 data 傳輸範例
![](https://i.imgur.com/mI7WqDo.png)

#### Byte Invariance

AXI 使用的是 byte-invariant endianness，如此可以比較容易的處理 mixed-endian。byte-invariant endianness 不管 data 是 big-endian 或 little-endian 都是按照對應 address 的 byte 去存取。

#### Unaligned Transfers

AXI 支援沒有對齊的傳輸，舉例來說，有個 data packet 為 4-byte 但它的 start address 為 0x0002 並沒有對其 4-byte。

要做到 unaligned transfers 可以搭配 WSTRB 把不要存取的 byte 擋掉就行了。

以下圖為例，下圖為一個 data bus 為 64-bit 從 0x07 address 開始的 data size 為 32-bit 的傳輸。灰色部分為用 WRSTB 遮掉的部分，白色為每次 transfer valid 的 data。 
![](https://i.imgur.com/A1qaSDW.png)


### Read and Write Response Structure

AXI 在 read 跟 write 的 transactions 都有 response 訊號。Read transaction 的 response 訊號是在 read data channel (RRESP[1:0])，write transaction 的 response 訊號是在 write response channel (BRESP[1:0])。

有四種 response:
![](https://i.imgur.com/rnpc2N7.png)

- OKAY: normal access 成功時使用
- EXOKAY: exclusive access 成功時使用
- SLVERR: master 到 slaver 的傳輸成功，但 slaver 想要對 master 回覆錯誤時使用
- DECERR: master 要傳輸的 slaver 不存在時使用

對於 write transaction，一次 response 訊號回應所有 burst 的傳輸。而對於 read transaction，一次 response 訊號回應 burst 裡單一筆傳輸。

前面有提到 burst 傳輸無論如何都要把傳輸傳完，response 也是如此，即使其中有 error response 也要把剩餘的傳輸完成。