ACE和CHI协议都支持MTE特性,不过ACE协议里只有ACE5-Lite,ACE5-LiteDVM (Basic only)和AXI5支持MTE,因此其实ACE里无法保证多master之间allocation tag的一致性。只有CHI协议的MTE规范才支持allocation tag的一致性。不过我们这次只讲当tag operation为match的情况下,ACE和CHI的行为。
1. ACE writes with tags and Tag operation is Match
ACE中,当write操作带有logical tag,且AWTAGOP=0b11(Match)时,写操作携带logical tag与allocation tag之间的比较是打算放在下游slave去做。顺便提下logical tag可以理解是request携带的钥匙,allocation tag可以理解是这个address的锁,只有钥匙和锁检查匹配上,address才可以正确的访问。如果不匹配上,通常会报fault给Core,具体是sync还是async的fault,取决于Arm architecture里SCTLR.TCF/TCF0寄存器域段。
从ACE里看到支持tag match operation的write transactions有WriteNoSnoop和Atomic transaction。ACE slave收到tag match operation的request后,需要返回两部分响应:
- Completion response:用于指示这笔write request已经是可见的。
- Match response:用于指示logical tag和allocation tag比较是否成功。
这两部分响应使得具有独立data和tag存储的组件能够独立返回响应,也可以将这两部分合成1个响应。另外这两部分响应可以按任意顺序返回的。
如果comp resp和match resp分两次返回
Completion response
Completion response指示当前write操作对其它Master是可见的,且要遵循以下几点规则:
- BCOMP域段必须为1;
- BTAGMATCH域段必须为0b01,表示Match operation的结构在match response里;
- BID必须和AWID一致;
- 如果支持loopback指示,那么BLOOP域段必须和AWLOOP域段的值一致;
- BRESP域段可以有OKAY, EXOKAY, SLVERR和DECERR;
- Completion响应必须遵循正常的response保序规则;
- 当收到这个响应后,ID值就可以被后续transaction重用了;
Match response
Match response用于指示这笔write操作的tag比较成功与否,如果该笔transaction里所有data transfer上的WTAG都和memory里存的allocation tag匹配上了,那么response是pass。如果transaction里有任何1笔data transfer的WTAG与memory里存的allocation tag不一致,那么response是fail。
Match response必须遵循以下规则:
- BCOMP域段必须为0;
- BTAGMATCH域段必须是0b11 (Pass)或0b10 (Fail);
- BID和AWID的值必须一样;
- BLOOP域段可以是任意值,不需要和AWLOOP域段的值一样;
- BRESP域段可以有OKAY, SLVERR或DECERR;
- Match response没有任何保序要求,它可以超前或被超前其它任何response响应的;
如果comp resp和match resp一块返回
slave可以根据情况将comp resp和match resp打包到一起,并一块返回给master。这样需要遵循以下规则:
- BCOMP域段必须为1;
- BTAGMATCH域段必须是0b11 (Pass)和0b10 (Fail);
- BID和AWID的值必须一致;
- 如果支持loopback指示,那么BLOOP域段必须和AWLOOP域段的值一致;
- BRESP域段可以有OKAY, EXOKAY, SLVERR和DECERR;
- Completion响应必须遵循正常的response保序规则;
- 当收到这个响应后,ID值就可以被后续transaction重用了;
其实我们看下BCOMP和BTAGMATCH这两个域段的定义:
我们就可以总结出对于write with tag match operation来说,可能的response有:
另外一点要注意的是,只要没有返回response错误,那么即使tagmatch表示fail了,write data也仍然会写到slave的memory里去。
2. CHI writes with tags and Tag operation is Match
在CHI中,当write和atomic transaction操作携带的TagOp值为Match,下游Completer必须返回Tag match operation的结果,这个结果是通过TagMatch response传递的。不管Tag match结果如何,write和atomic transaction都必须正常处理。且就算WriteData被canceled或Tag Match没有执行,也要返回TagMatch response,否则就破坏了CHI协议了。总得来说,下游Completer不仅要返回comp响应,也要根据Tag Match operation的结果,返回TagMatch响应。
在TagMatch response的Resp域段里携带了Tag Match是否成功,它的值根据:
- 如果不支持MTE,那么必须是Fail;
- 如果支持MTE,但Tag Match没有被执行,返回Pass。例如Exclusive write fail且Tag match还没有被执行。
- 如果支持MTE,且Tag Match执行了,要返回精确的执行结果状态。
CHI write操作伴随着tagOp为Match操作时,如果下游slave不支持,那么下游slave可以不等待writedata就返回tagmatch failed信息。如果支持的话,一定要等writedata里的tagOp,因为req和write data channel的TagOp不一致的话,要用write data channel的。
ACE和CHI都支持让下游Completer进行Tag match operation,并返回结果。其中ACE的comp resp和match resp可以分开,也可以一起返回。但是CHI里comp resp和match resp必须分开返回的。CHI里对其的解释是“使用单独的TagMatch响应会增加write和atomic transaction的复杂度和额外消息的开销,但优点是它提供了足够准确的响应机制,且使用单独的TagMatch响应不会导致Comp响应的延迟发送”。