五個獨立通道
AXI4 總線的一大特征是它有 5 個獨立的傳輸通道,這些通道都隻支援單向傳輸。作為類比,SPI 總線有 2 條傳輸通道:MISO, MOSI。SPI 輸入輸出的資料,大路朝天,各走一條;而作為對比, IIC 協定則隻有 SDA 一條通道,輸入輸出資料隻能在這一條通道上分時雙向傳輸。
單向傳輸的通道意味着通道兩端的終端節點是有身份差距的,好比水隻能從上遊流到下流。在 AXI 總線傳輸中,通道兩端分為 Master 主機與 Slave 從機,主機總是發起讀寫請求的一方,而我們五大通道的讀/寫定義就都是根據主機來定義的。
那麼五個通道都有誰呢:
- 讀位址 read address
- 讀資料 read data
- 寫位址 write address
- 寫資料 write data
- 寫回複 write response
5 個是不是很奇怪,你看讀/寫怎麼也得是個 2 的倍數不是,那為什麼不是 6 條,為什麼沒有讀響應?其實,讀響應借用了讀資料通道。至于為什麼沒有獨立的讀回複通道,我們之後再講。
五個獨立通道在讀寫操作中的角色
首先是寫操作,主機在寫位址通道上寫位址和控制資訊。
在寫位址操作結束之後,即主機確定從機已經獲得了此次傳輸的位址和控制資訊後,才開始在寫資料通道上寫資料。
從機在寫回複通道上,将此次寫傳輸的狀态回複給主機。
一般來說,寫資料都發生在寫位址操作之後,但也不是絕對的,在有些情況下,可以先寫資料。但是,所有情況下,寫回複必然是在寫資料之後,是對此次寫資料的狀态回複。
接下來看讀操作:
讀操作隻涉及兩個通道,首先主機在讀位址通道上寫入想要讀取的資料的位址以及控制資訊。
從機在接收到位址後,将該位址上的資料通過讀資料通道發送給主機。
有兩點值得注意:一是 AXI 總線支援突發傳輸,主機可以寫入起始位址以及突發傳輸的位元組數,從機将發送起始位址開始,突發傳輸個數的多個連續位址上的資料。
二是雖然名字為讀位址通道,但實際上仍由主機寫入位址,隻不過是寫入要讀取資料的位址。讀位址通道,這個名字确實有點歧義,主機讀操作位址通道表達得更貼切一些。
通道定義
五個通道有一些共同的定義:
每個通道都使用 VALID/READY 握手機制,詳情可見:
在讀資料以及寫資料兩條資料通道中,傳輸一次突發傳輸中的最後一個資料,必須要給出 LAST 信号,來辨別這是此次突發傳輸中的最後一個資料。如果缺少 LAST 信号會破壞 AXI 總線的工作狀态。
讀位址通道與寫位址通道:
在這兩條通道上傳輸位址和控制資訊,讀寫操作都擁有各自的位址通道。位址位寬一般限制為32位。
讀資料通道:
讀資料通道上包括從機發送給主機的讀資料以及讀操作完成狀态回複,具體的讀操作狀态回複情況會在之後讨論。資料的寬度可以是8,16,64,128,256,512 或者是 1024 比特。
寫資料通道:
寫資料的寬度和讀資料通道的資料位寬相同,寫通道有一點讀通道所不具有的特性是有 STROBE 信号,用于辨別寫資料中有效的傳輸位元組,即有些無效的資料,出于減少主機工作量的目的,或者在讀寫寬度不對稱時,被放到寫資料通道上和有效資料一起發送。而 STROBE 的信号的作用就是辨別出這些無用的資料,告知從機不需要接收無用資料。(Master:我太懶,以至于把所有信号都送過來了)
寫回複通道:
用于從機将寫完成情況回複給主機。所有的寫傳輸操作都需要在寫回複通道上接收此次寫傳輸操作的完成情況。值得注意的是寫回複是針對一次突發傳輸的,而不是針對每一次的寫資料操作的。(一次突發傳輸包括了多次寫操作)
那麼問題來了,為什麼隻有寫回複通道而沒有讀回複通道呢?
這個問題可以從資料流向看出來,主機在讀取資料時,資料在讀通道上傳輸,流向為從機到主機。而讀回複由從機向主機報告讀操作的情況,信号的資料流向也是從機到主機,是以讀回複可以合并在讀資料通道中。
但寫回複通道的資料流向就和寫資料相反。寫資料是從主機到從機,而寫回複為從機報告寫操作的完成情況,流向為從機到主機,無法合并到寫資料通道中,另一方面,寫回複又是不可或缺的,是以就有了一條獨立的寫回複通道。
通道上的信号們
全局信号
AXI 總線中有兩個全局信号:ACLK,全局的時鐘信号,所有的傳輸操作都發生在 ACLK 的上升沿。ARESETn,全局複位信号,低電平有效。在複位問題上,AXI 規定了一些細節,會在後續的文章中讨論。
寫位址通道
寫位址通道的信号可以分為 3 部分:經常用到的基礎信号,突發傳輸有關的信号以及和記憶體通路相關以及其他的在基礎階段不是很常用的信号。
基礎信号即 AWADDR:你想要寫入的位址,AWVALID 以及 AWREADY:所有通道都使用的握手信号。
突發傳輸指的是傳輸一次起始位址後,進行多次位址上連續的讀寫操作。突發傳輸有關的操作包括:AWLEN:突發傳輸的長度,即在一次突發傳輸中資料傳輸的個數。AWSIZE:每次突發傳輸中的資料傳輸的位寬。AWBURST:突發傳輸的類型。
其他信号包括和記憶體原子操作有關的 AWLOCK,AWCACHE,AWPROT 以及用于使用者自定義的 AWUSER 信号,都将在以後的文章涉及。(等我自己先用到再說)
讀位址通道
讀位址通道和寫位址通道的信号十分類似,就不再從 specification 中截圖以及介紹了。
寫資料通道
值得注意的是 AXI4 不再支援 WID 信号,這和 AXI4 的亂序機制有關,AXI4 規定所有資料通道的資料必須順序發送。
WDATA 與常見的握手信号不再贅述,WDATA 的可使用位寬可以見上文。WSTRB 信号用于标記傳輸資料中有效的位元組,每個 WSTRB 位對應一個位元組的位寬,比如資料位寬為 64 位,那麼 WSTRB 信号的位寬就是 1 個位元組,共 8 位。(感謝評論區糾正)
WLAST 辨別一次突發傳輸中最後一次資料傳輸,如果沒有正确的 WLAST 的信号,就會造成寫入位址的混亂,導緻從機無法正确接收寫資料,進而造成從機不再拉高 READY 信号的現象。
寫回複通道
與寫資料通道不同,寫回複通道支援 BID,即支援亂序的寫回複,關于亂序的問題,我們稍後再談。BRESP 回複上一次的寫狀态。
讀資料通道
讀資料通道與寫資料通道類似,差別有兩點:一,支援 RID 信号。二,因為讀回複資訊在讀資料通道上傳遞,是以內建了 RRESP 信号,用于傳回讀狀态,值得注意的是讀回複信号和讀資料一樣,發送方(source)為從機(slave)。