学习CHI有一段时间了,如今回过头来,再读协议,一些问题做个记录。如果有错误的地方,欢迎指正。如果有其他的问题,也欢迎留言讨论。
spec: IHI0050F_amba_chi_architecture_spec
【持续更新ing】
目录
1. 怎么理解CHI协议分层?
2. CHI怎么没有burst概念?
3. snoop flit怎么没有tgtID?
4. 怎么理解SAM?跟flit中的tgtID什么关系?
5. 怎么理解order保序?
6. 为什么Read Transaction中只有MakeReadUnique可以回Comp?
7. 怎么理解cache stashing?
参考链接:
1. 怎么理解CHI协议分层?
我们再来回顾一下CHI的分层,协议层(protocol)、网络层(network)和链路层(link)。具体描述参见下表:
相比于AMBA之前的总线,CHI为什么要做协议分层?
之前的AHB/AXI,其实是把协议层链路层糅合到一起,所以没有分层的概念,从链路上的信号基本就能知道所要作的操作是什么。但是抽象出来看的话,在一个系统中,每个参与者(组件)都有各自需要关注的内容。比如,Master(CPU)主要关注读写操作,需要描述内存属性、size大小、安全性,也就是协议层;而中间的互联组件(ICN)则不关注所做的操作是什么,只关注从哪里来到哪里去,以及怎么去传输,也就是网络层和链路层;
所以协议分层,可以在不同的层次做不同的事情。同样的,我们看待问题也要考虑是站在哪个层级。
2. CHI怎么没有burst概念?
AXI中的burst传输,就是只需要给定起始地址和burst大小,读/写 burst大小的数据。
那么CHI呢,是一致性总线协议,DAT通道是基于half/full cacheline大小传输的,即burst大小是一个cacheline。然后再根据size/BE确定具体的data。
3. snoop flit怎么没有tgtID?
snoop是HNF发给RN的,没有tgtID,怎么知道是发给哪个RN?协议中snoop flit没有tgtID,为什么?但是在实现的时候肯定还是要有的,可能是加到flit,也可能是其他什么形式?
4. 怎么理解SAM?跟flit中的tgtID什么关系?
SAM:System Address Map,就是通过地址addr得到tgtID。 具体实现可自定义。
系统中,请求者必须具有系统地址映射 (SAM) 才能确定请求的目标 ID。
SAM 的范围可能很简单,只需为所有传出请求提供固定的节点 ID 值即可。
SAM 必须提供整个地址空间的完整解码。
建议将任何与物理组件不对应的地址发送到可以提供适当错误响应的代理。
RN SAM : 映射物理地址到HN的Node ID;
HN SAM : 映射物理地址到SN的Node ID;
那么,问题来了,为什么可以通过地址得到target ID ?
在一个系统中,内存被划分为很多部分,A部分连接在SN1上,由HN1管理;B部分连接在SN2上,由HN2管理,.....(具体实现时,可能不是这种简单的映射关系,一般都是hash把地址打散)
这样,如果是到RN到地址A范围的请求,就会根据RN SAM映射成HN1的tgtID。
而这个tgtID就会填充到flit中,这样在网络上传输时就会转发到正确的目的地。
5. 怎么理解order保序?
6. 为什么Read Transaction中只有MakeReadUnique可以回Comp?
注意上述Read transactions structure中【6.MakeReadUnique Only】
理论上来说,Read transactions必须要带回数据,也就是CompData,或者RespSepData + DataSepResp;为什么MakeReadUnique可以只回复Comp ?
我们再看MakeReadUnique定义:
以及RN发起MakeReadUnique的初始状态:
可以知道,RN发起MakeReadUnique时,本身是有S态数据的,如果在返回的时候,HN知道它还保留有数据,没有在这个过程中被无效掉,就无需再返回data,只是返回comp就好。
7. 怎么理解cache stashing?
cache stashing是为了将数据搬到特定cache中存放,比如接下来RN1可能使用data1,那么就把data1缓存到RN1中,以提高性能。
同prefetch一样,stash操作也只是一种hint。可以选择接受或不接受。区别是prefetch是RN自己发出,自己预取;而stash则是其他RN发出,“stash”到stashNID的RN。
HN在将stash通知到RN后,RN可以:
- 接受,使用datapull机制来获取cacheline;
- 接受,不使用datapull,另外发起Read获取数据
- 忽略。
所以,datapull机制就是通过snoop响应来暗示读请求的一种方式,不需要单独的读请求来获取数据。
下面是一个stash事务的flow:
未完待续
参考链接:
Arm AMBA协议集及应用场景详解 - 极术社区 - 连接开发者与智能计算生态
What is AMBA, and why use it?--YouTube