目录
前言
四、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的文档描述这是等效MOESI
4.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/CleanInvalid),Snooped 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-> valid
- share -> unique
- clean -> dirty
- UD -> UC
4.3 Initiating cache状态变化规则
这一部分详见ARM文档C4不章节,原理和Snooped cache的状态变化类似,略过
4.4 Initiating/Snooped cache状态变化举例
举一个简单例子,建立状态转变的概念,可以结合第5小节的描述来理解。
| Seq | Snoop Transaction by Initiating Master | 初始状态 Core0 | 初始状态 Core1 |
| 0 | --- | Invalid | Invalid |
| 1 | Core0 ReadUnique | UniqueDirty | Invalid |
| 2-1 | Core1 ReadShare(CRRESP[3:2]==2'b11) | ShareClean | ShareDirty |
| 2-2 | Core1 ReadShare(CRRESP[3:2]==2'b10) | ShareDirty | ShareClean |
| 3 | Core0 ReadUnique based on 2-1 | UniqueDirty | Invalid |
五、ACE一致性传输具体传输流程
一致性传输含义,既它所包含的具体操作流程,这是最重要的部分。
它的命名规范隐含意义如下:
- Clean,意味着Interconnect要负责把命中cache line的脏数据写回MainMemory
- Unique,意味着清除所有Snooped cache的命中cache line
- Invalid,意味着清除命中cache line
WU(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的内容;
如果IS=1:
- Initiating cache的初始态不可能是Unique,因为Unique意味着不存在Snooped cache, IS肯定是0
- Snooped cache的初始态如果是Unique,它的结束态可以是Unique,也可以是Share,具体如下
- 对于ReadOnce, UC可以保留在UC或者切到SC;UD在PD=1时切到SC,PD=0时保留在UD或者SD
- 对于ReadShare/ReadClean/ReadNoneShareDirty,Unique必定切到Share
- 对于CleanShare,UC可以保留在UC或者切到SC;UD一定切到SC
- 对于ReadUnique/CleanUnique/MakeUnique/CleanInvalid/MakeInvalid,IS必为0,排除这5个传输
- 对于WriteUnique/WriteLineUnique,IS必为0,排除这2个传输
- 对于WriteClean/WriteClean/Evict,不涉及AC snoop,排除这3个传输
如果IS=0:
- Initiating cache的初始态如果是Share,它的结束态必定是Unique,但是需要排除WriteUnique/WriteLineUnque/ReadUnique/ClenUnique/MakeUnique/WriteClean/WriteBack/Evict这几种类型,因为WriteUnique/WriteLineUnque的结束态必定是I或者SC;ReadUnique/ClenUnique/MakeUnique的结束态必定是UD;WriteClean/WriteBack/Evict不涉及到AC Snoop
- Snooped cache的结束态必定是I,不管它原先是任何状态
PD(CRRESP[2])=1,表示Snooped cache在Snoop之前的状态是DIRTY(UD/SD),具体用法如下:
- 对于ReadOnce/ReadShare/ReadClean/ReadNoneShareDirty,Snooped Master如果初始态是DIRTY,它要通知Interconnect做脏数据写回操作,可以选用(PD=1 & IS=1)或者(PD=1 & IS=0),IS=1或者0,决定不同的结束态;如果不需要脏数据写回,PD=0 & IS=1;
- 对于ReadUnique/CleanUnique/CleanInvalid,Snooped Master如果初始态是DIRTY,它必须用PD=1通知Interconnect做脏数据写回操作,且IS必定为0
- 对于CleanShare,Snooped Master如果初始态是DIRTY,它必须用(PD=1 & IS=1)或者(PD=1 & IS=0)通知Interconnect做脏数据写回操作,IS=1或者0,决定不同的结束态;
- 对于MakeUnique/MakeInvalid,Interconnect无需把脏数据写回
- 对于WriteUnique,AC通道的传输是CleanInvalid,Interconnect把脏数据和Initiating Master提供的部分行数据合并再写回
- 对于WriteLineUnique, AC通道的传输是MakeInvalid,Interconnect无需把脏数据写回,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,也可以为1;
5.1 NC一致性传输
| Transaction | Transaction Steps | Note |
| ReadOnce |
|
|
| WriteUnique |
|
|
| WriteLineUnique |
|
|
5.2 RS一致性传输
| Transaction | Transaction Steps | Note |
| ReadShare |
|
|
| ReadClean |
|
|
| ReadNoneShareDirty |
|
|
5.3 WS一致性传输
| Transaction | Transaction Steps | Note |
| ReadUnique |
|
|
| CleanUnique |
|
|
| MakeUnique |
|
|
WriteUnique/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状态。
| Transaction | Transaction Steps | Note |
| CleanShare |
|
|
| CleanInvalid |
|
|
| MakeInvalid |
|
|
5.5 MU一致性传输
MU的特点是不需要Snoop其他cache
| Transaction | Transaction Steps | Note |
| WriteClean |
|
|
| WriteBack |
|
|
| Evict |
|
|
这一篇写得有点匆忙,有疏忽遗漏之处,多多包涵 :)
总结
本文详细解析了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)