對於coherency transaction load操作,data來源:
1) 可以從其他cache master的cache line拿到,
2) 由interconnect中的buffer直接返回,或者interconnect發出的ReadNoSnoop transaction返回數據。
對於coherency transaction store操作,要求master:
1) 該數據所在的cache line的狀態是unique;
2) 指定的transaction type,來保證第一點。
ACE所支持的coherency的協議是MOESI,也可以向下兼容MEI,MESI等,有的cpu處理器不支持SharedDirty(Owned),
Axaddr channel增加的信號:
AxBar[1:0], 01------Memory Barrier,對DMB指令的翻譯。
10-------Sync Barrier,對DSB指令的翻譯。
Axdomain[1:0],對於coherent trans,該信號,來指定snoop filter尋找cache copy的范圍;
inner-shareable一般是同一個cpu cluster之間的cache coherent查詢。
outer-shareable一般是所有的支持coherent的master,兩個cpu cluster之間的cache coherent查詢(如果只有一個outer-shareable domain)。
system,包括所有的master,但是對coherent的查詢,與outer-shareable相同。
對於barrier trans,該信號,來決定barrier trans,經過interconnect需要propagate的范圍,指定observer。
inner-shareable,表示該domain的所有master到interconnect的slave port都需要observe。
outer-shareable,表示所有cache-master到interconnect的slave port都需要observe。(如果只有一個outer-shareable domain)。
由於目前都是cpu cluster內一個interconnect,鎖哥cpu cluster之間還有一個interconnect。
所以inner-shareable是cluster內部的trans,outer-shareable包括所有的cache master。
Axsnoop[3:0],指定snoop trans的類型。
RESP channel增加的信號:
RRESP[2],PassDirty,表示需要initial master來寫入main memory,當前的master的cache line必須是Dirty state。
RRESP[3],IsShared,值為1,表示當前master的cache line的狀態必須是在Shared state。
值為0,表示當前master的cache line的狀態可以在unique state。
這兩bit,在所有的rdata beat中都必須保持相同。
針對unique類的操作和cache maintainance的操作,IsShared為0。
ReadUnique,CleanUnique,MakeUnique。CleanInvalid,MakeInvalid.
針對read類操作,unique類操作,cache maintainance的操作,PassDirty為0。
ReadOnce,ReadClean。CleanUnique,MakeUnique。CleanShared,CleanInvalid,MakeInvalid。
不是coherent類型的操作,NoSnoop,Barrier,DVM,這倆bit必須為0。
ReadClean,ReadNotSharedDirty,ReadShared,返回的PassDirty,Isshared,可以根據情況toggle。
Read Ack signal:在RLAST之后,由master發出,表示該筆coherency 操作已經結束。
Write Resp signal,沒有變化。
Write Ack signal:在Bvalid和Bready之后,由master發出。
1----coherency transaction:
coherency transaction可以分為幾個transaction group:
1) NoSnoop----------Write/Read
2) Coherent----------Write/Read
Read,分為兩大類,ReadOnce(No alloc),ReadShared / ReadClean / ReadNotSharedDirty(alloc)
Unique類的trans,ReadUnique(PE沒有該cache line,partial cache line store),CleanUnique(PE有該cache line,partial),
MakeUnique(full cache line)。
Write,WriteUnique(partial store),WriteLineUnique(full cache store)
3) cache mantenance--------Read,Clean類型的trans,CleanShared,CleanInvalid,MakeInvalid
cache clean,表示將dirty cache data寫入main memory;
cache invalid,表示將cache copy,invalid掉,之后的讀寫只能從main memory來拿數據。
4) Barrier-------------Write/Read,
5) Memory update-------Write,WriteClean(alloc),WriteBack(No alloc),WriteEvict,都是no snoop的trans。
對於read類型的snoop操作,主要是區分是否alloc,可以讀取何種類型的cache line來區分。
對於write類型的snoop操作,主要分為unique類型的trans和write coherent類型的trans。
1) unique類型的trans,只是將該master下的cache line state置為UniqueDirty,使之滿足store的條件。之后會通過memory update操作來更新memory。
ReadUnique,CleanUnique,MakeUnique,只是invalid其他master中的cache line。這個過程可以由cache master實現,也可以由interconnect來實現。
2) Write coherent類型的trans,相當於執行了CleanUnique以及WriteBack等操作。
WriteUnique = ReadUnique+writeBack。
各個操作過程中對initial master和其他cache master的影響。
memory update類型的前后cache state變化,WriteBack,state從Dirty-------Invalid;
WriteClean,state從Dirty--------Clean;
cache maintanance前后的cache state變化,CleanShared,initial master的state不變,其他master中的該cache變為invalid或者clean。
CleanInvalid,initial master的state不變,其他master中的該cache變為invalid。一般initial master的state也是invalid。
MakeInvalid,initial master的state不變,其他master中的該cache變為invalid。dirty不會更新main memory
Read類型的snoop trans,ReadClean,ReadNotShareDirty,ReadShared,initial master的state一般是invalid----UC/UD/SC等。
具體的state變化,主要看其他master的處理,interconnect的處理,以及interconnect返回給initial master的resp。
ReadOnce,initial master的state一般是invalid------invalid,一般是intiial master本身沒有cache,拿過來之后也不會alloc新的cache。
Unique類型的snoop trans, ReadUnique,initial state一般從Invalid------UC/UD,其他master的該cache line變為invalid、
CleanUnique,initial state一般從SC/SD------UC/UD,其他master的該cache line變為invalid、 這兩種unique,通常與partitial store配合使用。
MakeUnique,總是與full cache line store一起使用。兩個操作之后,initial state一般從Invalid/SC/CD------UD,其他master的該cache line變為invalid、
Write類型的snoop trans,WriteUnique,initial master的state從Invalid/UC/SC-----Invalid/SC/SC,其他cache master中的cache line的state變為invalid。
在收到transaction的resp之后,cache line中的值必須變為新的值。進行partitial的store。
WriteLineUnique,initial master的state從invalid/UC/SC------Invalid/SC/SC,其他cache master中的cache line的state變為invalid。
在收到transaction的resp之后,cache line中的值必須變為新的值,進行full cache line store。
no snoop的操作,WriteBack,UD/SD-------Invalid。
WriteClean,UD/SD---------UC/SC,這兩個操作都是在cache line已經dirty的情況下做的操作。
WriteEvict,UC/UD--------Invalid,只有在支持snoop filter的cache master中才支持。
ReadNoSnoop/WriteNoSnoop,表示更新一段non-shareable的main memory,cache state,可以是Invalid/UC/UD-------Invalid/UC/UD
2----snoop transaction:針對shareable-cacheable-memory屬性的memory訪問。
snoop transaction是指從interconnect到cache master的一組transaction的統稱:cache master包括(擁有cache或者支持做DVM的master)
address channel:
interconnect的輸出信號有:ACVALID,ACADDR,ACSNOOP,ACPROT。
cache master的輸出信號有:ACREADY。
address channel中並沒有size,length,id這些信號。因為snoop transaction的size與CDDATA size相同。
一個snoop的length必須是一個cache line的大小。最后一個beat的數據通過last來表征。
ACPROT[1]信號用來表征secure,non_secure world,cache coherent是區分secure與non_secure world。
ACSNOOP信號的值,從coherency transaction到snoop transaction也有約束:
1),首先不支持no-snoop的trans,如ReadNoSnoop,WriteNoSnoop,WriteBack,WriteClean,Evict,是不會進行snoop的。
2),WriteUnique,被映射為其他cache master的CleanInvalid。(推薦)
WriteLineUnique,被映射為其他cache master的MakeInvalid。(推薦)
MakeUnique,被映射為其他cache master的MakeInvalid。(推薦)
CleanUnique,被映射為其他cache master的CleanInvalid。(推薦)
3),像ReadOnce,WriteUnique的操作,interconnect需要內部將不是cache line size的操作進行轉換組裝。
snoop resp channel:
interconnect的輸出信號,CRREADY。
Master的輸出信號,CRRESP,CRVALID。
CRRESP,共有5bit:
[0]:是否傳輸data,一般的原則是
1:Read snoop trans,必須傳輸data,ReadOnce,ReadClean,ReadNotShareDirty,ReadShared,ReadUnique.
2:對於一些非read操作,如果cache 為dirty,傳輸data。cache state為clean時,可傳可不傳。
[1]:Error bit,表征當前cache master內部的cache line數據是錯誤的。
[2]:PassDirty bit,除了MakeInvalid,所有cache state為dirty的cache master都必須在resp中將該位置1。
表征,寫入main memory必須由interconnect或者RN cache master來完成。
ReadNotSharedDirty,ReadShared,ReadUnique,寫入main memory可以傳給RN cache master。
ReadClean,必須由interconnect來完成寫入main memory。
其他的snoop trans,可以implement defined。
[3]:is shared bit,表示RN cache master獲得一個cache line的copy。
[4]:is unique bit,表示cache line在snoop訪問之前的state是unique狀態。
snoop data channel:
interconnect的輸出信號,CDREADY。
cache master的輸出信號,CDVALID,CDDATA,CDLAST。
CDDATA不支持byte strobe的功能,只能由interconnect返回需要的正確的data個數。
snoop channel中的ready和valid的依賴關系與AXI中的相同。
arm建議的coherency transaction到snoop transaction的mapping 關系:
一個coherency transaction可以被mapping為多種snoop trans(如ReadUnique),但是還是建議,保留多種,這樣簡便
master處理。
3-----snoop transaction於coherency transaction之間的關系:
1) non-blocking,同一個master在自己的coherency trans和interconnect發過來的snoop trans之間的前后關系:
1, master必須完成所有的snoop trans,在AR channel的操作和AWchannel的WriteUnqiue,WriteLineUnique,之前。
2. 在完成port上的snoop trans之前,master可以在等待WriteNoSnoop,WriteBack,WriteClean,Evict等操作。
不能等aw channel的WriteUnique,WriteLineUnique完成。
總結起來,AR channel的trans可以等AC channel的trans,AC channel的trans可以等AW channel的trans(除了寫Unique)。
2) overlapping write,在一個shareable memory中,兩個master同時相同一個cache line進行store操作。
由interconnect來保證Write操作的sequence order。
WriteUnique,WriteLineUnique,一般都用在master是non-cache的情況下,如果用在cache master中,必須保證此時可以處理所有的snoop transaction。
而且,WriteBack,WriteClean,必須和WriteUnique,WriteLineUnique完全隔離開來,一組完成之后,另一組才可以開始執行。
WriteClean,WriteBack,過程中收到snoop trans,會掛住該snoop,直到自己的trans結束,snoop response必須PassDirty deassert,IsShared assert。
主要涉及的三個snoop transaction是ReadUnique,CleanInvalid,MakeInvalid。
當前發出snoop trans,但仍未完成的master稱為Master2,由interconnect發到Master2的snoop trans的發送者,稱為Master1。
Master2,發出ReadUnique,Master1經Interconnect發出的是三個中的任何一個:
在自己的snoop port收到snoop trans的Master2,必須先完成該snoop trans;自己有cache copy必須invalid。
之后interconnect將最新的data返回給Master2,Master2完成自己的partitial/full store。
Master2,發出MakeUnique,Master1經Interconnect發出的是三個中的任何一個:
在自己的snoop port收到snoop trans的Master2,必須先完成該snoop trans;自己有cache copy必須invalid。
之后interconnect將最新的data返回給Master2,Master2完成自己的partitial store。
Master2,發出CleanUnique,Master1經Interconnect發出的是三個中的任何一個:
在自己的snoop port收到snoop trans的Master2,必須先完成該snoop trans;自己有cache copy必須invalid。
之后interconnect返回resp(unique操作並沒有完成,因為Master2本身沒有alloc 該cache line),
Master2重新發送ReadUnique,之后Master2完成自己的full cache line store。
4------CCI的interconnect的幾部分主要工作:
1) sequenceing自己收到的coherency trans和snoop trans,
每個cache master可以發送多個outstanding req,並同時接受多個snoop transaction,其中對於
同一個cache line的順序由interconnect決定,arb method需要自己實現。
其中arm 規定的rule:
1. master發出coherent trans但是還沒有收到resp,此時收到針對該cache line的snoop trans的訪問,snoop trans規定為ordered first。
2. master發出coherent trans並且已經收到resp,之后在收到該line的snoop trans,coherent trans規定為ordered first。
對於同一個cache line,coherent trans必須等到ACK信號給出之后,interconnect才能發snoop trans。
snoop trans必須等到CRRESP信號給出之后,interconnect才能給coherent trans的resp。
2) 自己根據initial master的trans,發送snoop trans,並正確返回resp給initial master。
interconnect發出snoop trans,是根據自己內部的directory,加coherent trans的類型來定義自己發出的snoop trans類型和個數。
多個snoop trans之間一般是順序的。
1. ReadNoSnoop,WriteNoSnoop,WriteBack,WriteClean,Evict是不會讓interconnect發出snoop trans的。
2. ReadOnce,ReadClean,ReadNotSharedDirty,ReadShared對directory中有cache copy的master發送snoop trans。
(1) 有一個master的CRRESP返回CRRESP[4],wasunique,則所有master的snoop trans結束。
(2) 拿到一個cache copy。
(3) 所有的cache copy被遍歷。
3. Unique trans, cache maintance, Write trans對directory中有cache copy的master發送snoop trans。
(1) 有一個master返回CRRESP[4],wasunique,則所有master的snoop trans結束。
(2) 所有的cache copy被遍歷。
(3) 針對CleanShared trans,如果CRRESP[2]返回PassDirty,所有master的snoop trans結束。
針對Unique和cache maintance的trans,如果CRRESP返回PassDirty,interconnect對其他的cache master可以發送MakeInvalid snoop trans。
interconnect回給initial master的resp:
ARchannel的IsShared:
1. snoop trans的IsShared置位,一般給initial master的IsShared 置位。
2. 如果snoop trans的Data Transfer assert,一般給initial master的IsShared不會置位。
3. snoop trans的WasUnique被置位,1不滿足的情況下,IsShared不會置位。
ARchannel的PassDirty:
1. 置位的coherent trans,主要是ReadNotSharedDirty,ReadShared,ReadUNique。
如果snoop trans的CRRESP中的PassDirty置位,則需要interconnent更新main memory或者返回PassDirty給initial master。
3) interconnect跟main memory之間的讀寫:
Read:在Read coherent trans在shared cache master中沒有找到data的情況下,interconnect需要發出main memory read。
main memory read可以等所有的snoop trans完成之后在發出,也可以與snoop trans一起發出。
如果read trans在snoop trans沒完成之前就發出:
1. snoop trans給出data,main memory中的數據丟棄。
對同一地址cache line的read和WriteBack,WriteClean的coherent trans必須是有序的。
Write:interconnect必須保證所有的寫操作都是有序的,無論cache line是否重疊。通過返回PassDirty的順序來控制。
1. 對於partitial cache line write,如果snoop trans返回dirty data,需要interconnect進行merge。
2. 對於ReadOnce/Clean/Shared/NotSharedDirty CleanUnique/Shared/Invalid,需要interconnect自己進行main memory更新。
如果interconnect沒有收到PassDirty的CRRESP,一定不可以寫main memory。
arm建議interconnect盡量不進行write操作,盡量傳遞PassDirty。
4) interconnect還需要實現對不同cache line size的轉換。
5------cache maintenance trans的應用:
只有在所有outstanding trans都結束之后,才能發送cache maintenance trans,而且還有兩點state要求。
1. 對於CleanShared,CleanInvalid,在發出trans之前,該cache line的狀態必須是clean的,
如果dirty,必須先發WriteBack,WriteClean操作。在兩個操作之前,需要發Unique trans。
2. 對於CleanInvalid,MakeInvalid,在發出trans之前,該cache line的狀態必須是invalid的,
cache maintenance trans一般穿插在coherent domain和non-coherent agents access之間。
因為coherent與non-coherent的交織,可能導致cache中的新的數據,non-coherent的agent讀不到。
這樣的訪問的sequence:
non-coherent之前采用cache clean操作來更新main memory。
non-coherent之后采用cache invalid來使得之后的讀寫直接讀取main memory。
6------Barrier trans的應用:
Barrier主要針對domain之間的memory-base communicate,可以分為Read Barrier,Write Barrier。
1. 任何address channel中比Barrier先issue的trans,都稱為Before Barrier trans(比某個address channel的Barrier先issue就可以),
在Read Barrier,Write Barrier兩個resp之后issue的trans,都稱為After Barrier trans。
Barrier trans必須在兩個channel中都issue,沒有data傳輸,resp必須是0。
2. AxBar信號,一共兩bit,低位表示區分memory Barrier,Sync Barrier。
高位表示該trans是否受到Barrier trans的影響。
3. AxDomain信號,區分inner shareable domain,outer shareable domain。
一個system,一般包括domain boundariers和bi-section boundaries(不清楚不做介紹)。
domain boundary是domain中的所有master公用的一個downstream的interface。即同一個inner domain中訪問一個地址,多個master也只能用這一個interface。
domain boundary與interconnect能返回barrier resp有關:
memory barrier與non-system的Sync barrier,可以在domain boundary上或者更加downstrream的地方返回resp。
針對system的Sync barrier,必須等到end point才能返回resp。
4. Barrier trans的resp,由interconnect返回,與system中interconnect的位置有關,interconnect的實現方式有:
(1) interconnect block掉其他所有的trans,然后不斷向下發送Barrier trans,最后將所有barrier的resp merge在一起,
之后,返回給initial master barrier resp,並去掉所有的block。
(2) interconnect block掉所有的trans,並等待所有的trans,都返回resp之后,在給initial master返回Barrier resp,並移除block。
(3) interconnect block掉所有的與Barrier地址有重疊部分的trans,之后給initial master提供barrier resp
5. memory barrier,由dmb指令來實現,
memory sync barrier,由dsb指令來實現,
ARM中的ISB指令,並不直接映射到某一個bus trans中,只是將處理器流水線停掉,來保證之后的指令從cache或者memory中讀取。
6. 發送barrier的master需要保證,barrier的id與其他正常trans的id不同,這樣方便區分返回的resp。
Barrier trans發送出去,但是resp回來之前的trans,是不保證順序的,不受Barrier影響。這些trans都是當前domain之外的trans。
由於Barrier trans發出之后,之后的trans就會被interconnect block住,所以當Read,Write有前后的約束的時候,必須最后才發相應的barrier。
比如需要mmu進行table walk,那就不能在之前發Read barrier。否則總線會被鎖死。
對於有cache的master,如果load必須在barrier之后,則master不能發出coherent trans從Valid cache中讀取,必須等到barrier的resp。
如果store必須在barrier之后,則master不能發出coherent trans向Unique cache中寫入,必須等到barrier的resp
7------Exclusive trans的應用:
用來實現多核之間的同步,類似於軟件實現mutex和semaphore。
多核之間cache coherence可以保證一部分的多核同步,bus上根本不會出現exclude trans。
每個master內部實現一個local monitor來snoop其他master的exclude trans,保證一個core exclude load之后,另一個core不能exclude store。
但是在存在non-cached master時,bus上會出現exclusive trans。
通過interconnect上的PoS的monitor,來保證同一memory,對多個exclusive store trans的同步。
Exclusive的實現都是通過Exclusive sequence的形式來實現的,先進行LDREX指令,在執行STREX指令。
Exclusive Load,根據cache狀態來分:
Invalid,必須通過ReadClean,ReadShared,先拿到cache中的數據,不能使用ReadUnique,ReadNotSharedDirty,這樣會invalid掉其他的cache中的數據。
with ARLOCK asserted。
SharedClean,Unique state,master的exclusive load可以不需要。