深入解析ACE:多核内存一致性管理的核心协议(2)
目录前言四、ACE一致性MOESI模型定义4.1 cache line的5种状态4.2 Snooped cache状态变化规则4.3 Initiating cache状态变化规则4.4 Initiating/Snooped cache状态变化举例五、ACE一致性传输具体传输流程5.1 NC一致性传输5.2 RS一致性传输5.3 WS一致性传输5.4 CM一致性传输5.5 MU一致性传输总结参考前言深入解析ACE多核内存一致性管理的核心协议(1)https://blog.csdn.net/weixin_55313207/article/details/161599707上篇概述了ACE基于AXI4的增强通道和一致性传输分类这一篇具体描述ARM一致性模型定义和一致性传输的具体流程。四、ACE一致性MOESI模型定义4.1 cache line的5种状态所有的一致性传输都基于ARM的cache一致性模型如下图所示。ARM A7的文档描述这是等效MOESI4.2 Snooped cache状态变化规则Snooped Master的cache在这5个状态之间的切换SPEC有如下规定比较重要的第3/4/6点。第3点规定Unique - Share在本身被Snooped的时候才能转变自己本身无法改变第4点指明本身是Share的时候也有可能是Unique状态第6点规定Dirty只能在一个cache之内其他Master必须是clean或者invalid结合第4点第6点意味着有3种组合ShareDirty Invalid ShareDirty ShareClean; UniqueDirty Invalid个人理解是DIRTY可以在多个cache之内只要数据相同就可以。ARM规定DIRTY独一性主要是为了减少数据传输量。SD SC相对于 SD SD当广播的时候(CleanUnique/CleanShare/CleanInvalidSnooped cache可以不返回数据节省带宽。另外ARM的SC实际上有可能是DIRTY数据比如 SD SC组合这一点相当令人混肴Unique状态下的UC或者UD则比较直观UC就是CLEAN, UD就是DIRTY。ARM SPEC还有以下规定反应在一致性模型中用红色箭头表示不可能的转变。这几点不难理解AC Snoop是读取或者invalidate snooped cache line不可能对Snooped cache有前3点转变。最后一点也可以这么理解如果还是保持在Unique状态只能是本身执行WriteClean,但是我们讨论的是ACE Master被外部Snoop的情况。invalid- validshare - uniqueclean - dirtyUD - UC4.3 Initiating cache状态变化规则这一部分详见ARM文档C4不章节原理和Snooped cache的状态变化类似略过4.4 Initiating/Snooped cache状态变化举例举一个简单例子建立状态转变的概念可以结合第5小节的描述来理解。SeqSnoop Transaction by Initiating Master初始状态 Core0初始状态 Core10---InvalidInvalid1Core0 ReadUniqueUniqueDirtyInvalid2-1Core1 ReadShare(CRRESP[3:2]2b11)ShareCleanShareDirty2-2Core1 ReadShare(CRRESP[3:2]2b10)ShareDirtyShareClean3Core0 ReadUnique based on 2-1UniqueDirtyInvalid五、ACE一致性传输具体传输流程一致性传输含义既它所包含的具体操作流程这是最重要的部分。它的命名规范隐含意义如下Clean意味着Interconnect要负责把命中cache line的脏数据写回MainMemoryUnique意味着清除所有Snooped cache的命中cache lineInvalid意味着清除命中cache lineWU(CRRESP[4]1)表示Snooped cache在Snoop之前的状态是Unique这个主要是告诉Interconnect不需要去snoop别的ACE master。SPEC规定这个位可以一直返回为0这样做的副作用是因此产生不必要的广播IS(CRRESP[3]1)表示Snooped cache在Snoop之后的状态是Share也可以认为Snooped cache还会保留cache line的内容如果IS1Initiating cache的初始态不可能是Unique因为Unique意味着不存在Snooped cache IS肯定是0Snooped cache的初始态如果是Unique它的结束态可以是Unique也可以是Share具体如下对于ReadOnce, UC可以保留在UC或者切到SCUD在PD1时切到SCPD0时保留在UD或者SD对于ReadShare/ReadClean/ReadNoneShareDirtyUnique必定切到Share对于CleanShareUC可以保留在UC或者切到SCUD一定切到SC对于ReadUnique/CleanUnique/MakeUnique/CleanInvalid/MakeInvalidIS必为0排除这5个传输对于WriteUnique/WriteLineUniqueIS必为0排除这2个传输对于WriteClean/WriteClean/Evict不涉及AC snoop排除这3个传输如果IS0Initiating cache的初始态如果是Share它的结束态必定是Unique但是需要排除WriteUnique/WriteLineUnque/ReadUnique/ClenUnique/MakeUnique/WriteClean/WriteBack/Evict这几种类型因为WriteUnique/WriteLineUnque的结束态必定是I或者SCReadUnique/ClenUnique/MakeUnique的结束态必定是UDWriteClean/WriteBack/Evict不涉及到AC SnoopSnooped cache的结束态必定是I不管它原先是任何状态PD(CRRESP[2])1表示Snooped cache在Snoop之前的状态是DIRTY(UD/SD)具体用法如下对于ReadOnce/ReadShare/ReadClean/ReadNoneShareDirtySnooped Master如果初始态是DIRTY它要通知Interconnect做脏数据写回操作可以选用(PD1 IS1)或者(PD1 IS0)IS1或者0决定不同的结束态如果不需要脏数据写回PD0 IS1对于ReadUnique/CleanUnique/CleanInvalidSnooped Master如果初始态是DIRTY它必须用PD1通知Interconnect做脏数据写回操作且IS必定为0对于CleanShareSnooped Master如果初始态是DIRTY它必须用(PD1 IS1)或者(PD1 IS0)通知Interconnect做脏数据写回操作IS1或者0决定不同的结束态对于MakeUnique/MakeInvalidInterconnect无需把脏数据写回对于WriteUniqueAC通道的传输是CleanInvalidInterconnect把脏数据和Initiating Master提供的部分行数据合并再写回对于WriteLineUnique, AC通道的传输是MakeInvalidInterconnect无需把脏数据写回Interconnect要做的操作是把Initiating Master提供的一整行数据写回对于WriteClean/WriteBack/Evict与AC Snoop无关ERR(CRRESP[1]1)表示Snooped cache报错比如ECC校验出错等异常情况DT(CRRESP[0]1)表示会有CDDATA既AC数据传输RRESP[3:2]和CRRESP[3:2]的含义一样RRESP[1:0]表示OKAY/EXOKAY/SLVERR/DECERR下面表格中假定CRRESP[1]/RRESP[1:0]都为0下面表格中的x表示既可以为0也可以为15.1 NC一致性传输TransactionTransaction StepsNoteReadOnce如果命中Snooped Master返回数据如果PD1, 则Interconnect还要把DIRTY数据写回MainMemoryIniatiating Master的RRESP4bx000如果不命中Interconnect从MainMemory读取数据Iniatiating Master的RRESP4b0000SPEC规定AR ReadOnce可以读取部分行数据Snooped Master有命中时返回数据是整个cache line但是ReadOnce可以是部分行所以Interconnect必须要截取部分行数据返回给Initiating Master如果PD1,Snooped cache的状态从从DIRTY变到SC或者I如果Initiating cache的初始态是I则结束态还是I即使返回的RRESP[3]为1WriteUniqueInterconnect用CleanInvalid移除其他所有Snooped Master的命中cache line如果Snooped cache有脏数据Snooped Master回传数据并由Interconnect把整行数据和Initiating Master的部分行数据进行合并最后写入MainMemory如果Snooped cache不命中或者CleanInterconnect只要把Initiating Master的部分行数据写入MainMemory如果Initiating cache的初始态是I结束态仍然保持在I不分配cache line如果Initiating cache的初始态是UC/SC则Inititiating cache在收到BRESP后要写入新值Initiating Master的初始状态只能是I/UC/SCInitiating Master的结束状态只能是I/SCWriteLineUniqueInterconnect用MakeInvalid移除其他所有Snooped Master的命中cache lineInitiating Master送整行数据写入MainMemory如果Initiating cache的初始态是I结束态仍然保持在I不分配cache line如果Initiating cache的初始态是SC则Inititiating cache在收到BRESP后也要写入新值Initiatiing Master的初始状态只能是I/UC/SCInitiating Master的新状态只能是I/SC5.2 RS一致性传输TransactionTransaction StepsNoteReadShare如果命中Snooped cache返回数据RRESP4bxx00RRESP[3:2]CRRESP[3:2]如果不命中Interconnect从MainMemory读取数据RRESP4b0000假如Snooped cache包含了Exclusive的读写地址Snooped cache line必须保留ReadClean如果命中Snooped cache返回数据如果PD1 DIRTY数据由Interconnect写回MainMemoryRRESP[3]IS; RRESP[2]固定为0如果不命中Interconnect要从MainMemory读取数据RRESP4b0000假如Snooped cache包含了Exclusive的读写地址Snooped cache line必须保留ReadNoneShareDirty如果命中Snooped cache返回数据如果PD1 IS1 DIRTY数据由Interconnect写回MainMemoryRRESP[3]IS; RRESP[2]PD ~IS(如果IS0PD决定是否脏数据如果IS1必定是Clean数据)如果不命中Interconnect要从MainMemory读取数据RRESP4b0000假如Snooped cache包含了Exclusive的读写地址Snooped cache line必须保留5.3 WS一致性传输TransactionTransaction StepsNoteReadUnique如果命中Snooped cache返回数据同时所有Snooped cache清除命中cache lineCRRESP[3]0; RRESP[3]0; RRESP[2]PD如果不命中Interconnect要从MainMemory读取数据RRESP4b0000Initiating Master把要写的数据(可以是部分行)和Interconnect返回数据合并写入新分配的cache line(原先状态是I)或者原先的cache lineInitiating cache初始态可以是I/UD/UC/SD/SCInitiating cache结束状态必定是UDCleanUnique如果命中Snooped cache返回数据同时所有Snooped cache清除命中cache line如果PD为1Interconnect要把数据写入MainMemory如果不命中Interconnect要从MainMemory读取数据无论是否命中RRESP4b0000Initiating Master如果原先是I则必须分配新的cache line同时必须是一整行数据写入新分配的cache lineInitiating Master如果原先有cache line则把要写的数据(可以是部分行)更新原先cache lineInitiating cache初始态可以是I/UD/UC/SD/SCInitiating cache结束状态必定是UDMakeUnique如果命中Snooped cache清除命中cache line无论是否命中RRESP4b0000Initiating Master分配cache line(原先状态是I)或者对原有cache line写入一整行数据Initiating cache初始状态可以是I/SC/SD/UD/UCInitiating cache结束状态必定是UDWriteUnique/WriteLineUnique和CleanUnique/MakeUnique相同点是它们都会清除Snooped cache和更新Initiating cache的数据但是WriteUnique/WriteLineUnique还会更新MainMemory既Initiating cache和MainMemory的值是一致的这就是为什么WriteUnique/WriteLineUnique的结束状态是SC的原因它是名副其实的Clean令人混肴的是ShareClean看过去UniqueClean更好一点这点没搞懂 : (5.4 CM一致性传输对比NC/CM的6种传输它们有个共同点支持Initiating cache初始态/结束态都是I。这个就是为什么这6种传输可以用在ACE-LITE接口。ACE-LITE的本质是自身cacheless永远处于I状态。TransactionTransaction StepsNoteCleanShare如果命中Snooped cache返回数据如果PD1Interconnect要把DIRTY数据写回MainMemory如果命中且是CLEAN不建议Snooped cache返回数据如果命中RRESP4bx000否则RRESP4b0000Initiating Master如果原先是I结束态仍然保持在IInitiating cache的初始态为I/SC/UCInitiating cache的结束态为I/SC/UCCleanInvalid如果命中Snooped cache返回数据如果PD1Interconnect要把DIRTY数据写回MainMemorySnooped cache清除命中cache line如果命中且是CLEAN不建议Snooped cache返回数据无论是否命中RRESP4b0000Initiating cache的初始态为IInitiating cache的结束态为IMakeInvalid如果命中Snooped cache清除命中cache line无论是否命中RRESP[3:0]4b0000Initiating cache的初始态为IInitiating cache的结束态为I5.5 MU一致性传输MU的特点是不需要Snoop其他cacheTransactionTransaction StepsNoteWriteCleanInitiating Master把cache line的DIRTY数据写回MainMemoryInitiating Master里的cache line继续保留sharable region: UD/SD - UC/SCnone-sharable region: UD/SD - UC不限制部分行写入(partial line update)可以是sharable region也可以是none-sharableInitiating Master初始态只能是UD/SDInitiating Master结束态只能是UC/SCWriteBackInitiating Master把cache line的DIRTY数据回写MainMemoryInitiating Master清除cache line不限制部分行写入(partial line update)可以是sharable domain也可以是none-sharable domainInitiating Master的初始态只能是UD/SDInitiating Master的结束态只能是IEvictInitiating Master清除cache line只能是sharable domainInitiating Master初始态只能是UC/SCInitiating Master的结束态只能是I这一篇写得有点匆忙有疏忽遗漏之处多多包涵 总结本文详细解析了ARM ACE一致性模型及其传输机制。首先介绍了cacheline的五种状态MOESI及其转换规则重点分析了Snooped cache的状态变化限制和特殊组合。随后阐述了ACE一致性传输流程包括NC、RS、WS、CM、MU五类传输的具体操作步骤和状态转换规则并指出ARM规范中容易混淆的概念如ShareClean实际有可能是Dirty数据。文章通过示例说明状态转换过程并强调Interconnect在数据一致性维护中的关键作用。参考AMBA AXI and ACE Protocal Specification(Version D)ARM Architecture Reference Manual(Version B)