目录
1. EWA
2. Device
3. Cacheable
4. Allocate
5. 内存属性的传播
6. 事务属性组合
7. Memory Type
内存属性Memory Attributes (MemAttr) 包含Early Write Acknowledgment (EWA), Device, Cacheable, 以及Allocate。
1. EWA
EWA,Early Write Acknowledgment ,指示事务的写入完成响应是否必须来自事务的终点:
- EWA=1:允许来自互连中的中间点,例如Home节点。则该事务的写入完成响应可以来自中间点或来自端点。
- EWA=0:必须来自事务的最终目的地。
注意:如果不使用EWA属性,完成信号必须来自端点。
EWA断言要求如下:
可以取任意值:
- •可以在ReadNoSnp和ReadNoSnpSep事务中取任何值。
- •可以在WriteNoSnp事务中取任何值。
- •可以在CMO事务中取任何值。
- •可以在Atomic事务中取任何值。
必须置位:
- •必须在不是ReadNoSnp、ReadNoSnpSep或CMO事务的其它读、dataless事务中断言
- •必须在非WriteNoSnp事务的其它Write事务中断言。
不适用:
- •不适用于DVMOp或PCrdReturn事务中,设置为零。
- •不适用于PrefetchTgt事务,可取任何值。
2. Device
Device属性指示内存类型是Device还是Normal。
Device memory type
对于exhibit side-effects的位置必须使用Device memory type,连带效应(side-effectts),即对一个地址的数据的操作可能会影响到另一个地址中的数据值。允许对没有exhibit side-effects的位置使用Device memory type。
事务到 Device type memory location的要求如下:
- •读取事务不能读取超过请求的数据。
- •不允许从设备内存位置预取(Prefetching)。
- •读取必须从端点获得数据。不得在完成的中间点将同一地址的写入数据转发给读事务。(也就是说,地址A,有个写操作,你不得在中间点把写入的这个data转发给Read)
- •不允许将到不同位置的请求合并成一个请求,或将到同一位置的不同请求合并成一个请求。(Gathering属性?)
- •写入不能合并。
- •从中间点完成的对Device内存的写入必须使写入数据及时对端点可见。
对设备内存的访问必须使用以下类型,允许使用独占变体(exclusive variants):
- •对Device内存位置的读取访问必须使用ReadNoSnp。
- •对Device内存位置的写入访问必须使用WriteNoSnpFull或WriteNoSnpPtl。
- •CMO事务。
- •Atomic原子事务
- •PrefetchTgt预取事务不允许,MemAttr字段不适用可取任何值。
Normal memory type
Normal memory type适用于不会产生side-effects的内存位置。
对Normal内存的访问在预取或转发方面没有Device类型内存那些限制:
- •已断言EWA的读取事务可以从写入事务中获得读取数据,如果该写入事务已从中间点发送其完成,并且是同一地址。
- •写入可以合并。
任何Read、Dataless、Write、PrefetchTgt或Atomic事务类型都可以用于访问Normal内存位置。所使用的事务类型由要完成的内存操作和Snoopable属性决定。
3. Cacheable
Cacheable属性指示事务是否必须执行缓存查找:
- •当断言Cacheable时,事务必须执行缓存查找。
- •取消断言Cacheable时,事务必须访问最终目的地。
Cacheable值要求包括:
必须置位:
- •必须为ReadNoSnp和ReadNoSnpSep以外的任何读取事务断言。
- •必须为除CleanShared、CleanSharedPersist*、CleanInvalid、MakeInvalid之外的任何Dataless事务断言。
- •必须为除WriteNoSnpFull和WriteNoSnpPtl之外的任何Write事务断言。
不得置位:
- 不得为任何Device内存事务断言。
- WriteNoSnpDef事务不得断言
可取任意值:
- •对于发送到Normal memory 位置的ReadNoSnp、ReadNoSnpSep、WriteNoSnpFull和WriteNoSnpPtl事务,可以设为任何值。
- •对CleanShared、CleanSharedPersist*、CleanInvalid和MakeInvalid事务可以取任何值。
- •Atomic事务可以取任何值。
不适用:
- •不适用于DVMOp和PCrdReturn事务,必须设置为零。
- •不适用于PrefetchTgt事务,可以取任何值。
4. Allocate
Allocate属性是一个分配提示。它指示事务的建议分配策略:
- •如果断言了Allocate,出于性能原因,建议将事务分配到缓存中。但是,允许不分配事务。
- •如果取消断言Allocate,出于性能原因,建议不将事务分配到缓存中。但是,允许分配事务。
(那到底要不要allocate?最简单的实现方案就是allocate=1时就分配到cache,有没有其他更加符合性能的allocate条件?)
Allocate属性值要求为:
- •可以为断言了Cacheable属性的事务断言,除了 ReadOnceMakeInvalid。
- •必须为WriteEvictFull事务断言 (请求者可以将带有未断言Allocate位的WriteEvictFull转换为Evict事务。)
- •不得为Device内存事务断言。
- •对于 Normal Non-cacheable内存事务,不可以断言。
- •不适用于DVMOp、PCrdReturn和Evict事务,设置为零。
- •不适用于 PrefetchTgt事务中,可以取任何值。
-
5. 内存属性的传播
对于从HN到SN的请求(响应向HN发送的请求),必须保留Device, Cacheable, and Allocate这些 MemAttr bits。
此规则的唯一例外是当已知下游内存为“Normal”时,则“Device”字段值可以设置为0b0以指示“Normal”,从HN到SN的请求中的SnpAttr属性位值必须始终设置为0b0。当接收到的组合写入请求事务中的写入事务和CMO事务分离时,写入事务继承原始组合请求的MemAttr和SnpAttr值。分离的CMO事务SnpAttr和cacheable位必须设置为最普遍的,以便影响RN-F节点和下游缓存的所有缓存。
对于由于Prefetch或者系统cacheable踢出而在互连内部生成的ReadNoSnp或WriteNoSnp:
- •MemAttr的EWA、Cacheable和Allocate为设置为 0b1
- •“Device”字段值必须设置为0b0以表示“Normal”。
- •SnpAttr字段的值必须设置为0b0,表示Non-snoopable。
6. 事务属性组合
下表列出了MemAttr、SnpAttr和Order字段值的合法组合以及等效的ARM内存类型。
7. Memory Type
R / nR:(Reordering)
E / nE:(Early Write Acknowledgement)
G/ nG:(Gathering and non-Gathering attributes,即多笔命令能否合并成一条命令)。
由以上的R/E属性+Device组合起来得到下面的memory type:
Device nRnE
(这种地址需要保序,且不能支持EWA,即从中间节点返回写响应。)
Device nRnE内存类型的必需行为是:
- 写入响应必须从最终目的地获得。(nE)
- 读取的数据必须从最终目的地获得。(Device)
- 读取时不能提取超出要求的数据。(Device)
- 不能预取读取。(Device)
- 写入不应合并。(Device)
- 写入的地址范围不得大于原始事务的地址范围。(Device)
- 从同一来源到同一端点的所有读和写事务必须保持顺序。(nR)
Device nRE
(这种地址需要保序,但可以支持EWA,即从POS或POC点返回写响应就可以。)
Device nRE内存类型的必需行为与设备nRnE内存类型相同,但以下情况除外:
- 写响应可以从中间点获得。(E)
Device RE
(这种地址不需要保序,支持EWA。)
Device RE内存类型的必需行为与Device nRE内存类型相同,但以下情况除外:
- •从同一来源到同一端点的读和写事务无需保序。(R)
- •从同一来源到重叠地址的读和写事务必须保持顺序。(R)
Normal Non-cacheable Non-bufferable
- 写响应必须从最终目的地获得。
- 读取的数据必须从最终目的地获得。
- 可以合并写入。
- 从同一来源到重叠地址的读和写事务必须保持顺序。
Normal Non-cacheable Bufferable
- 写响应可以从中间点获得。
- 写入事务必须在最终目的地及时显示。
- 读取的数据必须来自:
——最终目的地。
——正在向其最终目的地推进的写事务。
如果从写事务中获得读取数据:
——必须从最新版本的写内容中获得。
——数据不得缓存,以便为稍后的读取提供服务。
- 可以合并写入
- 从同一来源到重叠地址的读和写事务必须保持顺序
Write-Back No-allocate
- 写响应可以从中间点获得。
- 写事务无需在最终目的地显示。
- 读取的数据可从中间缓存副本获得。
- 读数可以预取。
- 可以合并写入。
- 读取和写入事务需要高速缓存查找。
- 从同一来源到重叠地址的读和写事务必须保持顺序。
- no-allocation属性是一种分配提示,也就是对内存系统的一种建议,出于性能原因,不分配事务。
Write-Back Allocate
Write-Back Allocate内存类型的必需行为与Write-Back No-allocation Memory的必需行为相同。然而,在这种情况下,分配提示是对存储器系统的推荐,其出于性能原因,事务会被分配。
参考链接:
https://blog.csdn.net/wangwangmoon_light/article/details/126696121