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

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

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

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