加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ARM技术学习2-ACE,CHI总线

(2022-03-13 18:11:06)
分类: IC设计
ACE 总线:
https://developer.arm.com/documentation/ihi0022/e/ACE-Protocol-Specification
AXI coherency extension
目前有几个版本: ACE5, ACE5-Lite, ACE5-LiteDVM, ACE5-LiteACP
ACE总线还是基于AXI的扩展来实现的。目的是为了做system level coherency,可以让多个系统模块共享memory的时候硬件而非软件来维持内部local cache的一致性。也就是
说如果master中都不存在local cache,都直接到main memory,那么就不存在coherency的问题。
Coherency的定义: 如果一个memory区域被多个componets进行了修改,修改的顺序是可以让所有的componenets都能观察到,那么这个memory region就是一致的。
也就是可观察性
Coherency protocol : MESI, ESI, MEI, MOESI
DVM: Distributed virtual memory
Cache line: 一个memory location的cache copy:A cache line is defined as a cached copy of a number of sequentially byte addressed memory locations
在有一致性要求的地方都可以使用ACE Bus, ACE来解决coherency的方法本质上就是允许master做cache的copy来维持数据一致性。
比如有2个master分别来修改一个memory地址,那么其余包含这个地址的master的local cache需要copy来更新,有几个更新就copy几次。
main memory可以不要求实时更新,也可能master写的是自己的local cache,但是其它的master如果local cache中包含了这个地址,那么也需要更新。
如果某一个地址只是在一个master的local cache中存在,可以不通知其它的master来更新;否则就需要使用transaction来通知。
cache的状态:可以是下面的组合: UD, SD, UC, SC,这是标志在cache line上的状态
valid, invalid:一条cache line是否在cache中
unique,shared:只在一个local cache中还是有多个local cache存在,注意到如果是shared状态也可能是只在一个cache中存在即实际是unique的。这点比较特殊
clean,dirty:如果是dirty表示已经修改过,因此必须确保它最终会更新main memory
比如有一个master A得到了一条cache line,而这条cache line原本只是在一个master B中存在,现在就必须通知这个master B把它的local cache的这条line的状态修改成shared。
因此ACE本质上就是定义了transaction来基于cache line的状态进行通知,通过这些transaction来让各个master中的local cache知道其它master中发生的事情,来修改自己的state。
本质上就是根据接收或者发送transaction来维护自己的local cache line的状态和通知其它的master的local cache来更新状态的协议。
Cache state的rule:
1. 一条line是unique的,那么就必须是只在一个local cache中存在
2. shared表示一条line在多个local cache中存在
3. 如果一个cache得到了一个line,就必须通知其它包含这条line的cache来更新状态,比如从unique更新到shared
4. 如果一个cache丢弃了一条line,可以不要求通知其它包含这条line的cache,这也意味这shared可能也可以是实际是unique的。
5. 如果一条cache line已经被更新了且和main memory中不一致了,就必须更新为dirty
6. dirty只能在一个cache line中存在,而不能同时在多个cache中存在。也就是说如果2个master分别修改一条line,那么第一个更新必须先更新到main memory才做第二个更新。
也就是拆开成2个来处理,而不能累积2个一次来处理。

ACE channel定义:是在AXI channel上做了signal的扩展和增加了几个snoop channel来实现的
1. read address channel: master发出
ardomain[1:0] : shareability domain,
arsnoop[3:0]: shareable read transaction的类型
arbar[1:0] : 是否当前transaction是read barrier
2. write address : master发出
awdomain[1:0]
awsnoop[2:0] : shareable write transaction类型
awbar[1:0]
awunique : 表示这个data可以被保存到一个unique cache state
3. Read response: interconnect发出
rresp[3:2] : interconnect信号
4. Snoop channel-3channel, 这是snoop master和interconnect之间的通信channel
Snoop address channel(AC) : interconnect发出,cache master的输入channel
snoop data channel(CD) : cache master的输出channel
snoop response channel (CR) : cache master的输出channel
5. acknowledge signaling
RACK
WACK

AXDomain[1:0] : 支持4 level的shareability domain,其实是确定涉及到哪些master
non-shareable/inner shareable/ outer shareable/system
non-cacheable的access必须设置为system,cacheable的request不能使用system。
同AxCache的组合。

内存屏障: https://blog.51cto.com/u_13291771/2798372
https://codertw.com/程式語言/532474/
memory barrier的要求是,以barrier這條命令的resp訊號回來為界線(不考慮outstanding的話),保證它後面發的命令能看到前面發的命令的結果即可

ARBAR[1:0]
AWBAR[1:0] : 表示读写传输是否是barrier包括memory barrier,synchronization barrier,ignore barrier

ARSnoop[3:0]
AWSnoop[2:0] : master发出,表示transaction type: non-snooping, coherent, memory update, cache maintenance, barrier, DVM

ACE通信中的几个术语:
initiating master: 最早发出request的master
interconnect: 互联网络
snoop master: 其它的包含了这个request相关的cache line的cache master, snoop channel是每一个cache master都需要支持的,和interconnect直接进行交互
snoop是来实现coherency的关键。



场景:
1. master从shareable的地址load数据
master发出read request-> interconnect 需要通过snoop address channel来查询其它cache master中是否有这条cache line-> 这些cache master就是snoop master把response
甚至data发送给interconnect->如果有cache master提供了data,那么interconnect需要把这个data发送回最初的master
-> 如果没有cache master提供数据,那么interconnect需要发出一个read request到main memory中取数据回给initiating master
-> initating master发出RACK信号表示接收完成
可见和通常的AXI相比,ACE 给interconnect增加了很多的功能,可以作为home node来完成发起transaction的能力。coherency的功能大部分都是由interconnect来发起和处理,
甚至如果master和snooped cache都没有能力把dirty的cache line写回到main memory的时候,interconnect都需要能够来实现这个功能
2. master 写数据到shareable的地址
当一个master要更新了地址的数据(可能仍然在cache line中没有更新到main memory),那么就必须通知其它有这个cache line的master invalid掉这条cache line,在下一次这些master读
这条cache line的时候,这个new data才会传输给这些需要这个数据的master。
也就是不主动去更新其它的cache master中的数据,而只是invalid掉,在下一次需要到的时候才传输过去

3. master写cache line的部分数据partial
需要先read再更新




                          
                                         AMBA5 CHI architecture specification
https://developer.arm.com/documentation/ihi0050/latest
从CHI开始协议分层了,这是跟以往的总线协议不同的,针对SOC系统内的一致性处理,用于系统开发。
CHI协议是AMBA的第五代协议,可以说是ACE协议的进化版,将所有的信息传输采用包(packet)的形式来完成。但是从接口的角度看,CHI和ACE,AXI这些协议完全不一样了

对于一个完整的协议来说,有几个方面:
硬件组成和互连topo
通信协议定义


CHI : coherent hub interface
MESI
MOESI
MTE: ARM memory tagging extension
CHI可以认为是一个通信协议,也分成了三层:因为是数字世界,因此没有物理层。
link layer: 提供flow control,管理link channel。信息的粒度是flit(flow control units,最小的流控单元大小)
network layer: 对protocol来的message进行打包,确定source和dest nodeID,在网络上进行路由。信息的粒度是packet。通信的对象是endpoint之间
protocol layer: 最顶层的layer,信息的粒度是transaction(message),通信的对象是component之间
一个message可能由多个packet来组成,一个packet可以包含多个flit,一个packet的所有flit必须走相同的route路径。
phit:physical layer transer unit, 一个flit可以包含多个phit
DVM(Distributed Virtual Memory): 虚内存地址管理


CHI架构是和topology无关的,底层的topology可以是mesh, ring,crossbar等都是可以的。
crossbar:多输入多输出,适合node数目较少的设计
ring: latency线性增加
mesh:2D网络,适合大的node数目,但是wire非常多

PoS: point of serialization,有序request, 这是network上的一个点,从不同的agents来的request到这个点的order会被确定。也就是变成有序的request。
PoC: point of Coherence, 访问一致性, 这是能保持一致性的点,在这个点上,所有的agents看到的memory的数据是做过一致性的,也就是保证一致。
PoP: point of persistence, 这是memory系统中的一个点,这是来做power off的保持的,也就是如果一个write request来了,但是正好power off,这个点会来负责恢复状态
requester: 发起request的component
completer: 响应request的component,可以是home node(HN)或者subordinate node(SN)
endpoint/subordinate: 最终响应request的component
Protocol credit/link layer credit: 信令,发送端只有得到credit后才能开始进行传输,也就是接收端一定能接。没有credit是不能开始传输的。
RN: Request node,产生协议transaction给互连,包含读和写, master
HN: home node,用于接收来自RN的协议transaction,完成相应的一致性操作并返回一个响应。通常是interconnect(ICN) 硬件作为HN
SN: subordinate Node,用于接收来自HN的请求,完成相应的操作并返回一个响应, slave
MN: misc node,用于接收来自RN的DVM操作,完成相应的操作并返回一个响应
RN->HN->SN, RN的request是通过HN来进行中转再发送给SN的。
snoopee: 这是一个能够接收snoop的RN,其实就是对transaction的过程进行监控的agent

Coherency: 所谓的一致性,本质上就是如果一个网络中有2个或者以上的node在写同一个地址的时候,需要能够让网络中所有的node都能观察到相同的order,这样每一个node都
能够来处理这个一致性。这种一致性可以用硬件的方式来保证,也可以用软件的方式来保证。
Regions of memory are coherent if writes to the same memory location by two components are observable in the same order by all components.
Coherency model: 通常是和cache相关的,如果整个系统都没有cache,那么大家都只能看到一个memory,那么就不存在一致性的问题。因为很多node本身具有local cache,
这样才会导致和main memory不一致,导致其它node和当前node看到的同一个地址有不同的值的情况。因此所有的coherency都是在cache line的粒度。
coherency protocol: 这个协议就是来保证每一个node的一致性,ensures that all Requesters observe the correct data value at any given address location。
协议基本的保证方式就是如果node观察到了自己的local cache中对应的地址有数据的更新,那么就应该去copy回来更新自己的cache line。这个观察到的点可能是在main memory上,也可能
是在某一个node更新到了自己的cache line中而没有及时更新到main memory的情况都需要处理(write back vs write through).
协议可以实现下面的能力:
让request能够知道当前的某一个memory location 是否只有自己的local cache中存在copy,还是其它的node的local cache也有cache line存在。
如果只有当前node中有一个cache line中存在copy,那么协议就不需要通知其它的node来更新;如果有多个,那么requester必须通知其它的node有数据改动。
cache的state model:
valid, invalid: cache line 的有效性
unique, shared : unique表示这个cache line只是在当前cache中,其它cache中没有;shared表示存在多个cache中。
clean, dirty : clean表示的是当前cache line和main memory是一致的,不用去更新main memory;dirty表示这个cache line已经被写过了,需要负责更新到main memory。
full, partial, empty: 表示一个cache line中有多少bytes是有效的,可以全部有效,可以部分有效,可以全部无效。
一条cache line是可以有上面多个状态的组合,比如UC : unique+clean, SC: shared + clean, SD:shared + dirty, UDP: unique + dirty + partial

component的类型:
RN :
RN-F : Fully coherent RN, 包括硬件coherent cache,支持协议支持的所有的transaction
RN-D: IO coherent RN with DVM support, 支持了协议的一个子集,可以接收DVM transaction
RN-I: IO coherent RN, 更小的子集支持
HN:
HN-F : Fully coherent HN
HN-I : Non-coherent HN
MN : Miscellaneous Node
SN:
SN-F : SN node for normal memory
SN-I: SN node for peripherals or normal memory

数据传输路径:request的顺序正好是下面的反方向,RN开始发出request
SN->HN->RN :使用HN来做数据中转
SN->RN : 不需要HN,而是直接传输


DMT: direct memory transfer, SN直接传输数据给RN
DCT: direct cache transfer, RN直接发数据给RN
DWT: direct write-data transfer, RN直接把write data写到SN中。

Channel的类型:CHI是基于channel的通信,这是和AXI是类似的
TX REQ channel: RN 发出,SN接收
TX WDAT channel: RN 发出, SN接收
TX SRSP channel: RN发出,没有接收?? snoop response
RX CRSP channel: SN发出,RN接收
RX RDAT channel: SN发出,RN接收
RX SNP channel: RN接收, 没有发出方??

Request channel field:
QoS:QoS的优先级,一共支持16个优先级,也就是说一个request是可以带上QoS信号了表示当前request的优先级。这是为了让request的node有能力通知end point来保证它的带宽需求、。
TgtID: target ID,也就是request的end point的ID
srcID: 发送request的node的ID
TxnID: transaction ID
LPID: logic processor ID,和srcID一起来确定request是哪一个logic processor产生的
ReturnNID: return node ID
ReturnTxnID: return transaction ID
stashNID: 暂存node ID
Opcode: 6bit, request opcode,描述transaction的类型等
Addr: 读写request要访问的memory地址
NS: non secure or secure
size: Data size, 3bit, 1~64B
MPAM: memory system performance resource partitioning and monitoring, 这是来有效的使用资源和能够监控资源的使用情况。
MPAM支持把资源划分成不同的partition,使用partition ID和 performance monitoring group。 一个request可以带上MPAM 信号来表示当前request是属于哪一个partition和这个partition
中的哪一个performance monitoring group。
MPAM的field一共11bit包括: perfMonGroup(1bit), PartID(9bits), MPAMNS(1bit). Receiver 可以支持不支持或者部分支持或者全部支持MPAM的所有bits,这个在能力协商的过程中就会告知。

tagOp,TagGroupID, traceTag:
MTE: memory tagging extension,这是用来检测在memory中的数据是否被正确使用的机制。基本的原理就是给每一个需要tagging的地址额外分配一个tag
目前支持的tag包括: allocation tag, physical address tag, 两个的差别在于: data + tag, address + tag
allocation tag: 这是在一个memory被分配作为特殊用途时,可以分配一个memory tag,这个memory tag和这个memory的data一起保存
physical address tag: 单一个memory地址后来被访问,requester使用这个memory的地址和这个地址对应的tag值,这个tag称为physcal tag
对于任何的tag检查访问,使用的都是physical tag而不是allocation tag。
memory tag给每一个16B的data提供一个4bit的tag

snoop request:

data packet field:
CBusy: completer busy
DBID: data buffer ID
TU: tag update

response packet field:

几个术语:
Issues : 一个transaction的第一个message
Sends: Requester发出的message
Sends a downstream: 中转node中转了从requester来的message
returns: 发给requester的message
provides: 对snoop的response的message

network layer:
SAM: System address map
NodeID: 每一个连接到interconnect port上的component都会被分配一个或者多个nodeID,但是一个nodeID只能被分配到一个port上。这样可以通过nodeID来找到
通信的各个组件。如何定义和分配nodeID不在CHI标准的范围内,可以由实现来自己设计

coherence protocol:
cache state: I(invalid), UC(unique clean), UCE(UC+empty), UD(Unique dirty), UDP(UD+Partial), SC(shared clean), SD(shared dirty)
empty cache line: 一个cache line中没有byte是valid的,这种cache有下面2个用途:
一个RN在发出写命令的时候去获取一个empty的cache line来写,这其实就是write allocated,这样不用写到main memory中,可以得到性能的提升。
request的类型:
ReadNoSnp: 读数据请求, read request by a erquest node to a non-snoopable address region
ReadNoSnpSep: 请求completer只发送data response, read request from a HN to SN
ReadOnce:
ReadOnceCleanInvalid
ReadOnceMakeInvalid: 对一个可以snoopable的地址发出请求,目的是获得这个地址的数据的copy
CHI

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有