【干貨知識】深入理解AMBA總線協(xié)議(AXI總結(jié)篇)
掃描二維碼
隨時隨地手機看文章
AXI總線已經(jīng)是AMBA總線中最常見,使用最頻繁的總線,并且沒有之一。
可以說AXI總線已經(jīng)成為了片上總線中最重要的協(xié)議,本篇文章打算花一些篇幅,幫大家總結(jié)一下AXI總線的學習重點、學習難點,以幫助大家更好更快的掌握AXI總線。
一、什么是總線(Bus)
1.1、什么是片上總線
要理解AXI總線,首先要理解什么是總線。大家剛接觸總線的時候千萬不要糾結(jié)于具體的概念,可以簡單的理解成幾根線按照規(guī)定的方式通信即可。
-
對于芯片設計而言,可以簡單的理解,總線就是一組通信規(guī)范,允許系統(tǒng)中不同組件之間進行傳輸。
-
AMBA總線,包括AXI屬于片上總線(On-chip Bus),它用于芯片內(nèi)部中各個模塊之間的通信。
總線可以簡單的分為設備之間的總線和片上總線。其中設備之間的總線有時候也可以叫做傳輸接口,比如最常見的UART串口,硬盤的PCIE、SATA接口。顯示器的HDMI接口,電腦的USB、Type-C接口等。這些傳輸接口往往更注重設備的電氣特性、穩(wěn)定性。這是另外一套大的話題,后面可以單獨開個專題講一些常見的傳輸接口。
而另外一種總線就是我們今天要聊的話題,片上總線。所謂片上總線。顧名思義,就是同一個芯片上(一般指SoC系統(tǒng)),各個模塊(IP核)之間的數(shù)據(jù)通信方式。比如大家都設計好了自己的模塊,要集成在一個芯片上。如果都能滿足類似的通信方式或者接口,那集成起來就非常的方便,其實片上總線的規(guī)范制定也是考慮到可擴展性。一般片上總線要滿足以下的標準:
-
對頻率和數(shù)據(jù)吞吐量有較高的要求
-
擴展性強,能夠很方便擴展更多模塊
-
常見的片上總線有Wishbone(部分MIPS芯片使用)、Avalon(Altera芯片會使用)、Tilelink(UCB用在其RISC-V項目中)、AMBA(絕大多數(shù)SoC會使用)。
1.2、總線中常見的名詞和組件
接下來我們談談總線中常見的組件。以下說的這些概念和機制對任何常見的片上總線都是成立的。
首先是Master和Slave。前面已經(jīng)說到了,總線是用來進行數(shù)據(jù)傳輸用的,那么既然是數(shù)據(jù)傳輸,必然有發(fā)起方和接收方。一般我們稱之為Master和Slave。

對于命令而言,是由Master發(fā)給Slave,而數(shù)據(jù)可以是雙向傳輸?shù)?。比如可以是Master寫給Slave,也可以是Slave返回數(shù)據(jù)給Master,甚至還可以是兩者都有。Master和Slave的區(qū)分關鍵在于命令(這次傳輸)是誰發(fā)起的。
除了Master和Slave,總線中一般還包括哪些組件呢?比如有多個Slave的時候,那么自然要確定你的命令是發(fā)給哪個Slave的,這個時候我們就需要地址譯碼器。而當Slave返回數(shù)據(jù)的時候,Master需要知道是哪個Slave回的數(shù)據(jù),因此還需要MUX選擇器。

如果我們有多個Master的時候,就需要仲裁器來選擇到底是哪個Master可以發(fā)起某次通信,上述的這一套仲裁譯碼等機制,可以組合在一起,構(gòu)成片上互聯(lián)(Interconnect)。所謂的互聯(lián),可以理解為把所有模塊的通信集成在一起。基于互聯(lián)系統(tǒng)可以完成Master對Slave的訪問而不用在乎互聯(lián)的內(nèi)部實現(xiàn)細節(jié)(對于IP設計者而言)。
1.3、什么是AMBA總線
AMBA全稱Advanced Microcontroller Bus Architecture。即高級微控制總線架構(gòu)。首先高級是針對那個年代而言的,其實也沒有多高級。然后是Microcontroller,微控制器,可以知道它最初是用在微控制器上,實際上就是ARM自己的處理器上。然后Bus Architecture,即總線架構(gòu)。
-
AMBA協(xié)議是一個公開標準的片上芯片互聯(lián)協(xié)議。(AMBA沒有版權費,大家都可以使用,協(xié)議都是公開的)
-
提供接口標準使IP可以服用(IP reuse,加速設計和集成)
-
移動領域和物聯(lián)網(wǎng)領域使用最廣泛的片上總線,沒有之一(桌面領域我不清楚)
然后我們看一下AMBA的發(fā)展歷史,對于大家來說,學習APB、AHB和AXI就行。我相信如果大家已經(jīng)學習到ACE和CHI了,也不用看我這篇文章了。而最最重要的就是AXI。

二、AXI總線的學習路線
大家有了總線的基本概念以后,便可以開始學習AXI總線,以下是我推薦的AXI總線的學習路線。
2.1、第一階段:帶著問題去看源文檔
學習AXI總線之前,首先我們要知道為什么會出現(xiàn)AXI總線,即它設計之初是為了解決什么問題的,沒有AXI總線會怎么樣?
AXI總線是ARM公司在其第三代AMBA中推出的,稱之為AXI3.0,有時候也可以叫做AXI1.0。其設計的目的是針對高性能、高時鐘頻率的系統(tǒng)設計,用于在這些場景替代AHB協(xié)議的。針對這一特點,我們可以思考一下,為什么AXI的性能就高了?為什么AXI可以跑到較高的時鐘頻率?
帶著這一問題去看協(xié)議,就可以明白AXI提高性能最主要的因素是因為,AXI是讀寫通道分離的,其作為全雙工的協(xié)議,自然比AHB這樣的半雙工協(xié)議快,此外AXI是基于握手機制的,并且通道之間的握手沒有1T cycle delay的要求。因此這么多復雜的東西不需要一個時鐘周期就全部算完,可以插入寄存器邏輯,自然可以提高主頻。
類似的點還有很多,我?guī)痛蠹铱偨Y(jié)了一下,大家可以先帶著這些問題去思考,然后去看AXI協(xié)議,知道這些信號設計的目的是什么,即使協(xié)議看不太明白,也不至于不清楚為什么要有這個東西。這種感覺就像之前學數(shù)學課,即使你看不太明白推導,但也不至于完全不清楚為什么要有這個東西。
-
如何提升主頻以及保證數(shù)據(jù)安全?->AXI的握手機制
-
數(shù)據(jù)不是順序回來的怎么辦、想多發(fā)幾個命令出去怎么辦?->AXI的Out of Order、Outstanding、ID機制
-
現(xiàn)代多核處理器中的數(shù)據(jù)一致性如何保證?->AXI的原子訪問機制和Response相關信號
-
非對齊訪問如何實現(xiàn)?->AXI支持非對齊訪問
-
現(xiàn)代處理器中往往有Cache和Buffer,AXI怎么支持?->AXI的Cache信號
-
現(xiàn)代處理器往往有特權訪問、安全訪問等機制,AXI如何支持?->AXI的PROT信號
大家?guī)е@些問題,然后去看文檔,邊看邊思考。理解AXI為什么要設計這些信號,先不用在意實現(xiàn)細節(jié),具體哪些比特代表啥,先知道有這么一回事就行。并且邊看邊補充一些計算機組成原理和操作系統(tǒng)相關的知識,這是第一階段。
2.2、第二階段:自己動手設計簡單的AXI IP模塊
在完成第一階段以后,基本都會對AXI協(xié)議有個初步的了解,但畢竟紙上得來終覺淺,絕知此事要躬行。完成AXI協(xié)議的了解以后,應該自己動手去設計具有AXI接口的Master和Slave。
不一定要特別復雜。這里建議可以從最簡單的AXI-lite開始,設計一個AXI-lite的從機,然后可以通過AXI-lite給它配置相應的寄存器。配置寄存器這一部分可以在TB里面完成。
然后可以設計一個相對復雜點的AXI-full的Slave,比如AXI2RAM模塊,該模塊可以支持突發(fā)乃至Outstanding,甚至可以支持亂序,完成該模塊以后工作中再遇到AXI-Slave設計,至少心里不會虛,并且面試基本可以應付大部分問題了。
最后可以再設計一個AXI Master,從主機和從機兩個不同的維度深刻理解AXI協(xié)議的通信機制,這個主機同樣的也可以支持Outstanding乃至亂序。這里建議設計一個AXI DMA,非常的鍛煉人。
上述的這些模塊設計可以去網(wǎng)上如github找些開源的AXI IP,參考別人的設計理念,然后再自己動手做,畢竟能一次自己做出來,基本上是不可能的。
2.3、第三階段:學習AXI接口驗證以及AXI互聯(lián)IP
首先說AXI接口驗證,其實工作中大家寫完了AXI的IP,并不知道是否符合AXI的通信要求,很多公司可能會用VIP,能給各種AXI的激勵,然后大家根據(jù)自己IP的結(jié)果判斷設計的是否合理。大家可以想一想這個VIP到底是怎么設計的,如果讓你來設計,你會怎么做。
然后是AXI互聯(lián)IP,前面已經(jīng)說過什么是互聯(lián)了,由于總線互聯(lián)非常復雜并且非常重要。實際上大多數(shù)公司會采用買總線互聯(lián)IP的方式。大家可以自己動手設計一個簡單的互聯(lián)IP,讓自己設計的Master和Slave掛在上面,然后看能否建立通信,如果沒問題的話,可以進一步的學習如何使用第三方IP,比如典型的NIC400。