深入解析ACE:多核内存一致性管理的核心协议(2)

目录

前言

四、ACE一致性MOESI模型定义

[4.1 cache line的5种状态](#4.1 cache line的5种状态)

[4.2 Snooped cache状态变化规则](#4.2 Snooped cache状态变化规则)

[4.3 Initiating cache状态变化规则](#4.3 Initiating cache状态变化规则)

[4.3 Initiating/Snooped cache状态变化举例](#4.3 Initiating/Snooped cache状态变化举例)

五、ACE一致性传输具体传输流程

[5.1 NC一致性传输](#5.1 NC一致性传输)

[5.2 RS一致性传输](#5.2 RS一致性传输)

[5.3 WS一致性传输](#5.3 WS一致性传输)

[5.4 CM一致性传输](#5.4 CM一致性传输)

[5.5 MU一致性传输](#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.3 Initiating/Snooped cache状态变化举例

举一个简单例子,建立状态转变的概念,可以结合第5小节的描述来理解。

|-----|----------------------------------------|-------------|------------|
| Seq | Snoop Transaction by Initiating Master | 初始状态 Core0 | 初始状态 Core1 |
| 0 | --- | Invalid | Invalid |
| 1 | Core0 ReadUnique | UniqueDirty | Invalid |
| 2-1 | Core1 ReadShare(CRRESP3:2==2'b11) | ShareClean | ShareDirty |
| 2-2 | Core1 ReadShare(CRRESP3: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 (CRRESP4=1),表示Snooped cache在Snoop之的状态是Unique,这个主要是告诉Interconnect不需要去snoop别的ACE master。SPEC规定这个位可以一直返回为0,这样做的副作用是因此产生不必要的广播;

IS (CRRESP3=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 (CRRESP2)=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 (CRRESP1=1),表示Snooped cache报错,比如ECC校验出错等异常情况;

DT(CRRESP0=1),表示会有CDDATA,既AC数据传输;

RRESP3:2和CRRESP3:2的含义一样;

RRESP1:0表示OKAY/EXOKAY/SLVERR/DECERR;

下面表格中假定CRRESP1/RRESP1:0都为0;

下面表格中的"x"表示既可以为0,也可以为1;

5.1 NC一致性传输

|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Transaction | Transaction Steps | Note |
| ReadOnce | * 如果命中,Snooped Master返回数据;如果PD=1, 则Interconnect还要把DIRTY数据写回MainMemory;Iniatiating Master的RRESP=4'bx 000 * 如果不命中,Interconnect从MainMemory读取数据;Iniatiating Master的RRESP=4'b0000 * SPEC规定AR ReadOnce可以读取部分行数据 | * Snooped Master有命中时,返回数据是整个cache line,但是ReadOnce可以是部分行,所以Interconnect必须要截取部分行数据返回给Initiating Master * 如果PD=1,Snooped cache的状态从从DIRTY变到SC或者I * 如果Initiating cache的初始态是I,则结束态还是I,即使返回的RRESP3为1 |
| WriteUnique | * Interconnect用CleanInvalid移除其他所有Snooped Master的命中cache line * 如果Snooped cache有脏数据,Snooped Master回传数据,并由Interconnect把整行数据和Initiating Master的部分行数据进行合并,最后写入MainMemory * 如果Snooped cache不命中,或者Clean,Interconnect只要把Initiating Master的部分行数据写入MainMemory * 如果Initiating cache的初始态是I,结束态仍然保持在I,不分配cache line * 如果Initiating cache的初始态是UC/SC,则Inititiating cache在收到BRESP后,要写入新值 | * Initiating Master的初始状态只能是I/UC/SC * Initiating Master的结束状态只能是I/SC |
| WriteLineUnique | * Interconnect用MakeInvalid移除其他所有Snooped Master的命中cache line * Initiating Master送整行数据写入MainMemory * 如果Initiating cache的初始态是I,结束态仍然保持在I,不分配cache line * 如果Initiating cache的初始态是SC,则Inititiating cache在收到BRESP后,也要写入新值 | * Initiatiing Master的初始状态只能是I/UC/SC * Initiating Master的新状态只能是I/SC |

5.2 RS一致性传输

|--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------|
| Transaction | Transaction Steps | Note |
| ReadShare | * 如果命中,Snooped cache返回数据,RRESP=4'bxx00,RRESP3:2=CRRESP3:2 * 如果不命中,Interconnect从MainMemory读取数据,RRESP=4'b0000 | * 假如Snooped cache包含了Exclusive的读写地址,Snooped cache line必须保留 |
| ReadClean | * 如果命中,Snooped cache返回数据;如果PD=1, DIRTY数据由Interconnect写回MainMemory;RRESP3=IS; RRESP2固定为0 * 如果不命中,Interconnect要从MainMemory读取数据,RRESP=4'b0000 | * 假如Snooped cache包含了Exclusive的读写地址,Snooped cache line必须保留 |
| ReadNoneShareDirty | * 如果命中,Snooped cache返回数据;如果PD=1 & IS=1, DIRTY数据由Interconnect写回MainMemory;RRESP3=IS; RRESP2=PD & ~IS(如果IS=0,PD决定是否脏数据;如果IS=1,必定是Clean数据) * 如果不命中,Interconnect要从MainMemory读取数据,RRESP=4'b0000 | * 假如Snooped cache包含了Exclusive的读写地址,Snooped cache line必须保留 |

5.3 WS一致性传输

|-------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------|
| Transaction | Transaction Steps | Note |
| ReadUnique | * 如果命中,Snooped cache返回数据,同时所有Snooped cache清除命中cache line;CRRESP3=0; RRESP3=0; RRESP2=PD * 如果不命中,Interconnect要从MainMemory读取数据;RRESP=4'b0000 * Initiating Master把要写的数据(可以是部分行)和Interconnect返回数据合并写入新分配的cache line(原先状态是I)或者原先的cache line | * Initiating cache初始态可以是I/UD/UC/SD/SC * Initiating cache结束状态必定是UD |
| CleanUnique | * 如果命中,Snooped cache返回数据,同时所有Snooped cache清除命中cache line;如果PD为1,Interconnect要把数据写入MainMemory; * 如果不命中,Interconnect要从MainMemory读取数据 * 无论是否命中,RRESP=4'b0000 * Initiating Master如果原先是I,则必须分配新的cache line,同时必须是一整行数据写入新分配的cache line * Initiating Master如果原先有cache line,则把要写的数据(可以是部分行)更新原先cache line | * Initiating cache初始态可以是I/UD/UC/SD/SC * Initiating cache结束状态必定是UD |
| MakeUnique | * 如果命中,Snooped cache清除命中cache line; * 无论是否命中,RRESP=4'b0000 * Initiating Master分配cache line(原先状态是I),或者对原有cache line,写入一整行数据, | * Initiating cache初始状态可以是I/SC/SD/UD/UC * Initiating cache结束状态必定是UD |

WriteUnique/WriteLineUnique和CleanUnique/MakeUnique相同点是它们都会清除Snooped cache和更新Initiating cache的数据,但是WriteUnique/WriteLineUnique还会更新MainMemory,既Initiating cache和MainMemory的值是一致的,这就是为什么WriteUnique/WriteLineUnique的结束状态是SC的原因,它是名副其实的Clean, 令人混肴的是ShareClean,看过去UniqueClean更好一点?这点没搞懂 : (

5.4 CM一致性传输

|--------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------|
| Transaction | Transaction Steps | Note |
| CleanShare | * 如果命中,Snooped cache返回数据;如果PD=1,Interconnect要把DIRTY数据写回MainMemory * 如果命中且是CLEAN,不建议Snooped cache返回数据 * 如果命中,RRESP=4'bx000;否则,RRESP=4'b0000 * Initiating Master如果原先是I,结束态仍然保持在I | * Initiating cache的初始态为I/SC/UC * Initiating cache的结束态为I/SC/UC |
| CleanInvalid | * 如果命中,Snooped cache返回数据;如果PD=1,Interconnect要把DIRTY数据写回MainMemory;Snooped cache清除命中cache line; * 如果命中且是CLEAN,不建议Snooped cache返回数据 * 无论是否命中,RRESP=4'b0000 | * Initiating cache的初始态为I * Initiating cache的结束态为I |
| MakeInvalid | * 如果命中,Snooped cache清除命中cache line * 无论是否命中,RRESP3:0=4'b0000 | * Initiating cache的初始态为I * Initiating cache的结束态为I |

5.5 MU一致性传输

MU不需要snoop其他cache,这就是为什么ACE-LITE也能支持MU。

|-------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------|
| Transaction | Transaction Steps | Note |
| WriteClean | * Initiating Master把cache line的DIRTY数据写回MainMemory * Initiating Master里的cache line继续保留 * sharable region: UD/SD -> UC/SC * none-sharable region: UD/SD -> UC * 不限制部分行写入(partial line update) | * 可以是sharable region也可以是none-sharable * Initiating Master初始态只能是UD/SD * Initiating Master结束态只能是UC/SC |
| WriteBack | * Initiating Master把cache line的DIRTY数据回写MainMemory * Initiating Master清除cache line * 不限制部分行写入(partial line update) | * 可以是sharable domain也可以是none-sharable domain * Initiating Master的初始态只能是UD/SD * Initiating Master的结束态只能是I |
| Evict | * Initiating Master清除cache line | * 只能是sharable domain * Initiating Master初始态只能是UC/SC * Initiating Master的结束态只能是I |

这一篇写得有点匆忙,有遗漏之处,多多抱歉 :)


总结

本文详细解析了ARM ACE一致性模型及其传输机制。首先介绍了cacheline的五种状态(MOESI)及其转换规则,重点分析了Snooped cache的状态变化限制和特殊组合。随后阐述了ACE一致性传输流程,包括NC、RS、WS、CM、MU五类传输的具体操作步骤和状态转换规则,并指出ARM规范中容易混淆的概念(如ShareClean实际有可能是Dirty数据)。文章通过示例说明状态转换过程,并强调Interconnect在数据一致性维护中的关键作用。

参考

  1. AMBA AXI and ACE Protocal Specification(Version D)
  2. ARM Architecture Reference Manual(Version B)