深入理解AXI協(xié)議中Atomic傳輸
掃描二維碼
隨時(shí)隨地手機(jī)看文章
最近在工作中發(fā)現(xiàn),雖然從使用AXI到現(xiàn)在已經(jīng)十幾年了,但是對(duì)有些概念的理解還是不太深入,比如Atomic 傳輸和Narrow burst。下面總結(jié)一下Atomic 傳輸。
Atomic 傳輸
AXI協(xié)議中的Atomic傳輸是一種用于實(shí)現(xiàn)在多核處理器系統(tǒng)中對(duì)內(nèi)存進(jìn)行原子操作的機(jī)制。
-
原子操作
原子操作(Atomic Operation)是指在多任務(wù)或多線程環(huán)境中,一個(gè)操作或者一系列操作作為一個(gè)不可分割的單元執(zhí)行,要么完全執(zhí)行,要么完全不執(zhí)行,不存在中間狀態(tài)。這種操作對(duì)于保證數(shù)據(jù)一致性、實(shí)現(xiàn)同步機(jī)制以及防止競(jìng)爭(zhēng)條件(Race Condition)非常重要。
在計(jì)算機(jī)科學(xué)中,原子操作通常有以下幾個(gè)方面的特點(diǎn):
-
不可分割性:原子操作在執(zhí)行過程中不會(huì)被任何其他任務(wù)或線程中斷。
-
一致性:原子操作保證了在并發(fā)環(huán)境中對(duì)共享數(shù)據(jù)的訪問是一致的,不會(huì)出現(xiàn)不一致的中間狀態(tài)。
-
順序性:在多線程環(huán)境中,原子操作的執(zhí)行順序?qū)τ谒芯€程都是可見的,即在一個(gè)線程中觀察到的操作順序與在其他線程中觀察到的順序是一致的。
原子操作的常見類型包括:
-
原子比較并交換(Compare-and-Swap, CAS):這是一種常用的原子操作,它比較內(nèi)存中的值與預(yù)期值,如果相同則更新為新值。
-
原子交換(Swap):將內(nèi)存位置的值與提供的值交換。
-
原子添加(Add):將一個(gè)值添加到內(nèi)存位置的現(xiàn)有值。
-
原子或/與/異或(Logical Operations):對(duì)內(nèi)存位置的值執(zhí)行邏輯操作。
在硬件層面,許多處理器提供了對(duì)原子操作的支持,例如通過特定的CPU指令來實(shí)現(xiàn)。在軟件層面,編程語言和庫(kù)通常提供了原子操作的抽象,使得程序員可以在不直接依賴硬件特性的情況下實(shí)現(xiàn)線程安全的操作。
在多核處理器系統(tǒng)中,原子操作對(duì)于實(shí)現(xiàn)鎖和其他同步機(jī)制至關(guān)重要,因?yàn)樗鼈兛梢杂脕韺?shí)現(xiàn)對(duì)共享資源的安全訪問。例如,原子操作可以用來實(shí)現(xiàn)互斥鎖(Mutex),在多線程程序中同步對(duì)共享數(shù)據(jù)的訪問。
雖然軟件層面也能實(shí)現(xiàn)原子操作,但是隨著異構(gòu)多核系統(tǒng)越來越復(fù)雜,純軟件的支持代價(jià)太大甚至不能實(shí)現(xiàn),所以都需要硬件層面從CPU到總線整個(gè)系統(tǒng)的支持。
-
AXI3的原子操作
在AXI3協(xié)議中,原子操作主要有兩種類型:Exclusive(獨(dú)占)和Locked(鎖定)。
AXI3中的原子操作通過AxLOCK信號(hào)來實(shí)現(xiàn)。當(dāng)AxLOCK信號(hào)被置位時(shí),表示正在進(jìn)行原子操作。如果AxLOCK為'b10,表示Locked訪問;如果為'b01,則表示Exclusive訪問。
Locked訪問則是一種較老的機(jī)制,它在AXI3中使用,但對(duì)總線性能影響較大,因?yàn)樗鼤?huì)鎖定整個(gè)從設(shè)備,阻止其他主設(shè)備在鎖定期間對(duì)其的訪問。Locked訪問在AXI4中被舍棄,因?yàn)檫@種模式會(huì)阻塞整個(gè)總線,影響性能。
Exclusive訪問允許多個(gè)主設(shè)備同時(shí)訪問不同的從設(shè)備地址,但不允許其他主設(shè)備訪問已被標(biāo)記為獨(dú)占的特定地址。這種機(jī)制不會(huì)阻塞整個(gè)總線,而是通過Monitor來記錄獨(dú)占訪問的地址,從而確保原子性。
實(shí)際的SOC中,很少有使用Locked的訪問,這個(gè)對(duì)系統(tǒng)影響太大。我們了解一下就可以,實(shí)際基本不會(huì)使用。如果你設(shè)計(jì)了一個(gè)IP必須支持locked訪問,估計(jì)都不會(huì)有公司愿意買。
-
AXI4的原子操作
在AXI4中,為了提高性能和減少對(duì)總線性能的影響,只有Exclusive訪問被保留,而Locked訪問模式被舍棄。
Exclusive訪問通過AxLOCK信號(hào)和響應(yīng)信號(hào)(RRESP和BRESP)來實(shí)現(xiàn),其中EXOKAY表示獨(dú)占訪問成功,而OKAY則表示獨(dú)占訪問失敗。
注意:這里EXOKAY才表示獨(dú)占訪問成功!
AXI3和AXI4對(duì)比如下:
AXI3的AxLOCK有2個(gè)bit,AXI4只有一個(gè)bit。
AXI4中這個(gè)信號(hào)名只是為了延續(xù),其實(shí)有一定的誤導(dǎo)性,AxLOCK并沒有LOCK的功能。
-
AXI5的原子操作
到了AXI5協(xié)議,引入了更多類型的原子操作,包括Atomic Store、Atomic Load、Atomic Swap和Atomic Compare。這些操作允許在數(shù)據(jù)所在的位置上執(zhí)行操作,而不需要將數(shù)據(jù)移動(dòng)到發(fā)起操作的代理處。這種機(jī)制減少了系統(tǒng)中其他代理無法訪問數(shù)據(jù)的時(shí)間,提高了效率。AXI5中的原子操作通過新增的AWATOP信號(hào)來標(biāo)識(shí)原子操作的類型和具體的操作類型。
在AXI5協(xié)議中,Atomic傳輸?shù)玫搅嗽鰪?qiáng),支持更多的原子操作類型,包括原子存儲(chǔ)(Atomic store)、原子加載(Atomic load)、原子交換(Atomic swap)和原子比較(Atomic compare)。這些操作允許處理器在不鎖定總線的情況下,對(duì)內(nèi)存中的數(shù)據(jù)執(zhí)行原子級(jí)別的讀寫操作。
-
Atomic store:發(fā)送單個(gè)數(shù)據(jù)值與地址和要執(zhí)行的原子操作,目標(biāo)執(zhí)行使用發(fā)送的數(shù)據(jù)和地址位置的值作為操作數(shù)的操作,并將結(jié)果存儲(chǔ)在地址位置,通過B通道返回單個(gè)響應(yīng)而不帶數(shù)據(jù)。
-
Atomic load:發(fā)送單個(gè)數(shù)據(jù)值與地址和要執(zhí)行的原子操作,返回原始數(shù)據(jù)值,目標(biāo)執(zhí)行使用發(fā)送的數(shù)據(jù)和地址位置的值作為操作數(shù)的操作,并將結(jié)果存儲(chǔ)在地址位置,通過R通道返回訪問地址空間的原始數(shù)據(jù)。
-
Atomic swap:發(fā)送單個(gè)數(shù)據(jù)值與地址,不需要原子操作,目標(biāo)交換地址位置的值與提供的值,返回原始數(shù)據(jù)值,通過B通道返回單個(gè)響應(yīng)而不帶數(shù)據(jù)。
-
Atomic compare:發(fā)送兩個(gè)數(shù)據(jù)值,比較值和交換值,到地址位置,比較地址位置的數(shù)據(jù)值與比較值,如果匹配則寫入交換值,否則不寫入,返回原始數(shù)據(jù)值,通過B通道返回單個(gè)響應(yīng)而不帶數(shù)據(jù)。
在AXI4和AXI5協(xié)議中,原子操作通過AW和W通道發(fā)送請(qǐng)求,并通過B和R通道返回響應(yīng)。AW通道在AXI4的基礎(chǔ)上增加了AWATOP[5:0]信號(hào),用于標(biāo)識(shí)原子操作的類型和具體的操作類型;W通道傳遞原始的操作數(shù)。Atomic store和atomic load操作都需要通過AW和W通道發(fā)送地址、長(zhǎng)度、原子類型和操作,都需要從內(nèi)存讀取地址位置的原始數(shù)據(jù),都需要進(jìn)行ALU運(yùn)算,然后將新值存回地址位置。兩者的主要區(qū)別在于原子操作完成后的響應(yīng)和數(shù)據(jù)返回:atomic store通過B通道返回一個(gè)原子響應(yīng);而atomic load通過R通道返回訪問地址空間的原始數(shù)據(jù)。
總結(jié)一下:
-
AXI3 協(xié)議中的原子操作主要是通過Exclusive和Locked訪問來實(shí)現(xiàn)的,Locked訪問在后續(xù)被放棄,可以只做了解。
-
AXI4和AXI5都只支持Exclusive,這個(gè)是AXI協(xié)議支持原子操作的重點(diǎn);
-
AXI5引入了更多類型的原子操作,增加了AWATOP[5:0]信號(hào),但是AXI5 協(xié)議在現(xiàn)實(shí)中用的比較少,還是AXI4比較常見,可以只做了解,具體使用的時(shí)候去查協(xié)議對(duì)照就行,不用花太多時(shí)間。
-
舉例說明
下面是兩個(gè)成功的獨(dú)占訪問序列的例子,這兩個(gè)訪問序列都PASS了。
下圖展示了一個(gè)包含管理器及其AXI管理器接口和從屬設(shè)備的系統(tǒng):
從屬接口包括可以為每個(gè)事務(wù)保存ID和訪問地址的獨(dú)占訪問監(jiān)控硬件。
下表描述了示例序列中的不同事務(wù)。表中的所有事務(wù)都是獨(dú)占訪問:
表格中顯示的事務(wù)序列按如下方式進(jìn)行:
-
第一筆傳輸是管理器從地址0xA000進(jìn)行帶有ID 0的獨(dú)占讀取事務(wù)。獨(dú)占訪問監(jiān)控硬件在其表中保存了此事務(wù)的ID和地址,從屬設(shè)備以讀取數(shù)據(jù)0x1作為響應(yīng)。由于這個(gè)從屬設(shè)備支持獨(dú)占訪問,獨(dú)占訪問監(jiān)控硬件以EXOKAY響應(yīng)作為回應(yīng)。
-
第二筆傳輸管理器從地址0xB000執(zhí)行帶有ID 1的新的獨(dú)占讀取事務(wù)。同樣,獨(dú)占訪問監(jiān)控硬件在表中保存了這個(gè)新事務(wù)的詳細(xì)信息,從屬設(shè)備以讀取數(shù)據(jù)0x2作為響應(yīng)。由于這個(gè)從屬設(shè)備支持獨(dú)占訪問,獨(dú)占訪問監(jiān)控硬件再次以EXOKAY響應(yīng)作為回應(yīng)。此時(shí),有兩筆獨(dú)立的獨(dú)占序列正在進(jìn)行。
-
第三筆傳輸管理器對(duì)地址0xA000執(zhí)行帶有ID 0的獨(dú)占寫入事務(wù)。獨(dú)占訪問監(jiān)控硬件在表中檢查此事務(wù)的詳細(xì)信息,并且由于存在帶有ID 0和地址0xA000的現(xiàn)有記錄,以EXOKAY響應(yīng)回復(fù)管理器。這意味著沒有其他管理器訪問過這個(gè)內(nèi)存位置,從屬設(shè)備用它接收到的新值更新它,在這個(gè)例子中是0x3。獨(dú)占訪問監(jiān)控硬件從其表中移除了這個(gè)事務(wù)的ID和地址,因?yàn)閷?duì)該地址位置的獨(dú)占訪問序列現(xiàn)在已完成。
-
第四筆傳輸管理器對(duì)地址0xB000執(zhí)行帶有ID 1的新的獨(dú)占寫入事務(wù)。獨(dú)占訪問監(jiān)控硬件在表中檢查此事務(wù)的詳細(xì)信息??吹酱嬖趲в蠭D 1和地址0xB000的現(xiàn)有記錄,它再次以EXOKAY響應(yīng)回復(fù)管理器。這意味著沒有其他管理器訪問過這個(gè)內(nèi)存位置,從屬設(shè)備用它接收到的新值更新它,在我們的示例中是0x4。同樣,獨(dú)占訪問監(jiān)控硬件從其表中移除了這個(gè)事務(wù)的ID和地址,因?yàn)閷?duì)該地址位置的獨(dú)占訪問序列現(xiàn)在已完成。
下面是一個(gè)成功的獨(dú)占訪問序列和一個(gè)失敗的獨(dú)占訪問序列的例子。
下圖包含管理器及其AXI管理器接口和從屬設(shè)備的系統(tǒng),兩個(gè)獨(dú)占訪問序列,第一個(gè)成功,第二個(gè)失敗。
從屬接口包括可以為每個(gè)事務(wù)保存訪問的ID和地址的獨(dú)占訪問監(jiān)控硬件。下表描述了示例序列中的不同事務(wù)。表中的所有事務(wù)都是獨(dú)占訪問:
表格中顯示的事務(wù)序列按如下方式進(jìn)行:
-
第一筆傳輸是管理器地址0xA000進(jìn)行帶有ID 0的獨(dú)占讀取事務(wù)。獨(dú)占訪問監(jiān)控硬件在其表中保存了此事務(wù)的ID和地址,從屬設(shè)備以讀取數(shù)據(jù)0x1作為響應(yīng)。由于這個(gè)從屬設(shè)備正確支持獨(dú)占訪問,獨(dú)占訪問監(jiān)控硬件以EXOKAY響應(yīng)作為回應(yīng)。
-
第二筆傳輸管理器從與第一筆交易相同的地址0xA000執(zhí)行了帶有ID 1的新獨(dú)占讀取事務(wù)。獨(dú)占訪問監(jiān)控硬件在表中保存了這個(gè)新事務(wù)的詳細(xì)信息,從屬設(shè)備以讀取數(shù)據(jù)0x1作為響應(yīng)。同樣,因?yàn)檫@個(gè)從屬設(shè)備正確支持獨(dú)占訪問,獨(dú)占訪問監(jiān)控硬件再次以EXOKAY響應(yīng)作為回應(yīng)。在我們的示例中,此刻我們有兩個(gè)針對(duì)相同內(nèi)存位置的不同進(jìn)行中的獨(dú)占序列。
-
第三筆傳輸管理器對(duì)地址0xA000執(zhí)行了帶有ID 0的獨(dú)占寫入事務(wù)。獨(dú)占訪問監(jiān)控硬件檢查表中此事務(wù)的詳細(xì)信息,并看到有記錄顯示ID 0和地址0xA000,于是以EXOKAY響應(yīng)回復(fù)管理器。這意味著沒有其他管理器更新過這個(gè)內(nèi)存位置,從屬設(shè)備可以用接收到的新值更新它,在我們的例子中是0x3。因?yàn)榈刂肺恢?xA000的內(nèi)容已被修改,獨(dú)占訪問監(jiān)控硬件從其表中移除了所有匹配該位置地址的條目。
-
第四筆傳輸管理器再次對(duì)地址0xA000執(zhí)行了帶有ID 1的新獨(dú)占寫入事務(wù)。獨(dú)占訪問監(jiān)控硬件檢查表中此事務(wù)的詳細(xì)信息。沒有找到任何帶有地址0xA000的記錄,它以O(shè)KAY響應(yīng)作為回應(yīng)。OKAY響應(yīng)意味著之前在這個(gè)內(nèi)存位置上執(zhí)行了寫入操作,該操作更新了數(shù)據(jù)。在這種情況下,從屬設(shè)備無法用新值0x4更新內(nèi)存位置。這種情況是獨(dú)占訪問失敗。在這種情況下,管理器必須重新啟動(dòng)完整的獨(dú)占訪問序列,從獨(dú)占讀取開始,然后再執(zhí)行獨(dú)占寫入。
這兩個(gè)例子展示了獨(dú)占訪問如何實(shí)現(xiàn)非阻塞行為。由于LOCK訪問基本不用,這里就不舉例說明了。
總的來說,AXI協(xié)議中的Atomic傳輸是一種重要的機(jī)制,它允許在多核系統(tǒng)中安全地執(zhí)行對(duì)共享內(nèi)存的原子操作,從而保證了數(shù)據(jù)的一致性和系統(tǒng)的穩(wěn)定性。而ARM更新AXI協(xié)議也主要是為了它的CPU服務(wù)的,在其他非cpu核心的ip中碰到Atomic傳輸?shù)母怕时容^小,但是對(duì)整個(gè)SOC系統(tǒng)來說,Atomic傳輸還是必須掌握的知識(shí)。
當(dāng)然大家現(xiàn)在都知道,RSIC-V才是未來,那么RSIC-V是怎么支持原子操作的呢?
-
RISC-V的原子操作
RISC-V通過指令的A擴(kuò)展(Atomic Extensions)來實(shí)現(xiàn)原子操作指令。RISC-V 的 A 擴(kuò)展提供了兩種指令集來實(shí)現(xiàn)原子操作:一種是 LR/SC(Load-Reserved/Store-Conditional)指令對(duì),另一種是 AMO(Atomic Memory Operations)指令。
下面簡(jiǎn)要介紹這兩種指令集:
-
LR/SC(Load-Reserved/Store-Conditional)指令對(duì):
-
Load-Reserved (LR):這條指令用于加載一個(gè)內(nèi)存地址的值,并且“保留”這個(gè)地址,意味著在之后的一段時(shí)間內(nèi),其他處理器對(duì)這個(gè)地址的訪問將會(huì)被阻塞,直到與之配對(duì)的Store-Conditional (SC) 指令執(zhí)行。這為執(zhí)行原子操作提供了一種機(jī)制。
-
Store-Conditional (SC):這條指令嘗試將一個(gè)新值存儲(chǔ)到之前由Load-Reserved保留的內(nèi)存地址中。如果自從執(zhí)行Load-Reserved以來,沒有其他處理器對(duì)這個(gè)地址進(jìn)行了寫入,那么Store-Conditional會(huì)成功更新內(nèi)存并返回成功信號(hào);如果有其他處理器進(jìn)行了寫入,它會(huì)失敗并返回失敗信號(hào),此時(shí)通常需要重試整個(gè)操作。
-
AMO(Atomic Memory Operations)指令:
-
RISC-V的AMO指令集提供了一組豐富的原子操作,包括加法、減法、邏輯操作(AND、OR、XOR)以及比較和交換(CAS)等。這些操作直接在內(nèi)存上執(zhí)行,不需要使用Load-Reserved和Store-Conditional指令。
-
AMO指令包括:AMOSWAP(原子交換)、AMOADD(原子加法)、AMOAND(原子AND)、AMOOR(原子OR)、AMOXOR(原子XOR)、AMOMAX(原子最大值)、AMOMIN(原子最小值)、AMOMAXU(原子無符號(hào)最大值)、AMOMINU(原子無符號(hào)最小值)等。
-
這些指令通常用于實(shí)現(xiàn)無鎖數(shù)據(jù)結(jié)構(gòu)和同步原語,因?yàn)樗鼈兇_保了在多處理器系統(tǒng)中對(duì)共享數(shù)據(jù)的安全訪問。
這兩種指令集各有優(yōu)勢(shì)和適用場(chǎng)景。LR/SC提供了一種靈活的原子操作機(jī)制,適合實(shí)現(xiàn)復(fù)雜的同步原語,如鎖和條件變量。而AMO指令集則提供了更直接、更高效的原子操作,適合實(shí)現(xiàn)簡(jiǎn)單的原子更新和無鎖編程。在實(shí)際應(yīng)用中,開發(fā)者可以根據(jù)具體需求選擇合適的原子指令集。





