| Signal | source | Description |
| AxLOCK | Master | Lock type. This changes between AXI3 and AXI4. |
| AxCACHE | Master | Memory type.This changes between AXI3 and AXI4. |
| AxPROT | Master | Protection type. |
| AxQOS | Master | Quality of Service, QoS.Implemented only in AXI4 |
| AxREGION | Master | Region identifier. Permits a single physical interface on a slave to be used for multiple logical interfaces. Implemented only in AXI4. |
| AxUSER/XUSER | Master/Slave | User signal. Optional User-defined signal in the write data channel. |
| Supported only in AXI4 | ||
| xresp | Slave | This signal indicates the status of the write/read transaction |
| AxDOMAIN | Master | This signal indicates the shareability domain of a read/write transaction. 该信号属于ACE接口,容易被误解,所以这里提出来做对比 |
上表给出了AXI4的一些特殊信号,有些是之前AXI协议没有的。有些是和之前协议定义不一致的。下面会分节介绍。
1.1.1 原子操作(atomic access)
AxLOCK信号是和原子访问有关的信号。原子访问是在没有另一个请求者干扰的情况下执行的读-修改-写序列,或者说允许请求者修改内存的特定区域的数据,同时确保其他请求者的写入不会破坏数据。
AxLOCK在AXI3和AXI4中有不同的定义。AXI3中是2bit,AXI4是1bit。AXI3支持Locked和Exclusive操作,而AXI4只支持Exclusive操作。
对比上表可以发现AXI4只有Normal access和Exclusive access。
在互联网络中如果存在Locked的trans,那么互联网络必须阻止其他master的trans对locked地址的访问。另一方面master在发locked trans【包括读和写】时候,该master必须确认其他发出的trans都已经完成。
一个完整的locked trans序列最后必须以一个unlocked的trans结束,它们的AxID一致。等这个unlocked trans结束了,才认为一次locked完成。
所以根据上面的描述,locked trans对整个互联的性能是有影响的。
Exclusive access一定是包含了一读一写的过程。先Exclusive read,rresp返回OKay,说明slave不支持Exclusive操作,后续就不用发送Exclusive write了。如果返回ExOKay,则后续可以继续发送Exclusive write,在发送Ex read和Ex write中间,如果没有trans改写Ex trans对应地址空间的数据,那么bresp就返回Exokay,此时标志一次完整的Exclusive access成功完成。如果有其他trans改写了该地址,那么就返回Okay,标志着Exclusive access失败。
Exclusive 的一次read和write必须是相同AxID,AxADDR,AxBurst,Axsize,AxLen。slave要支持Exclusive就必须对Exclusive read覆盖的地址空间进行监控,所以需要额外的Monitor。
在Ex read之后,Monitor又检测到其他的Ex read,那么Monitor会放弃第一次的Ex addr而监测第二次的Ex addr。那么第一次AxID对应的Ex write再发过来只能是返回Okay,也就是第一次AxID对应的Ex access失败。
为了保证Ex trans能够到达具有Monitor的slave端,而不是中途被buff或cache存储,要求AxCACHE设置为non-buffer或者non-cacheable。
相比Locked access,Exclusive不会阻塞其他master的访问,对性能友好了。
可参考:
对于AXI4/3的Exclusive access来讲,虽然一定程度上改善了带宽利用率问题,但是还会有其他的问题,当master和slave距离较远,一次Ex read和Ex write的延迟就比较大。比如说Processor0需要将当前数据与较远的DDR或cache中Addr0的数据相加,然后再写入该地址Addr0,这个过程latency就比较大。同时其他master是不能访问Addr0的时间就比较长。
为了解决这个问题AXI5和CHI5都增加了原子事务【同时为了支持ArmV8的原子指令,反过来说V8原子指令也是为了提高指令执行性能】。原子事务允许将operation发送到data,从而允许operation在data所在位置附近进行执行。原子事务适用于data与要执行operation的agent距离很远的情况。具体怎么实现的我们在举例说明:
P0直接将当前操作数据data1和运算类型(比如说atomic_add)发送到addr0数据所在的地方,然后在addr0数据所在的地方把数据data0读取出来与发送过来的data1做运算,然后再写入addr0.
这个过程只有一次write data1的传输。降低了时延提高了性能。
需要注意的是,一次原子事务虽然只有一次write trans,但是包含了对addr0的一次读+一次写。
为了支持原子事务,AXI5又增加了不少信号,比如发送操作指令的AWATOP[5:0]。可参考:
另一方面需要addr0处具有完成operator的逻辑计算单元ALU。目前基本没见到在DDR侧有ALU单元的,原子事务一般实现在cache一致性互联网络中的HN节点。可参考:
AMBA CHI协议导论-CSDN博客 文章中第9章原子操作。
其中原子事务有以下4类,Atomic_store和Atomic_Load又有一些子分类,这里不在详述,可参考AXI5的spec。
| AWATOP[5:0] | 描述 |
| 0b000000 | 非原子操作 |
| 0b01exxx | AtomicStore |
| 0b10exxx | AtomicLoad |
| 0b110000 | AtomicSwap |
| 0b110001 | AtomicCompare |
AxCACHE信号描述了trans的以下属性:

主要涉及到:
该信号在AXI3和AXI4协议中的bit位含义稍有改变。下面将分开来讲。
该信号 在AXI3中,4bit的AxCACHE编码如下:

bufferable:多用在write操作中,表示可以由一个中间节点来返回response信号。当AxCACHE[3:2]!=0时,用于区分write-back和write-through。
cacheable:在读操作中,表示可以prefetch一些数据或者多个读trans合并成一次读,在写操作中,表示可以将不同的write merged together。【这一段是翻译AXI3 spec原文】。下面给出了一些根据spec描述能想到的场景:
1.一个传输切分成了多个传输
2.多个传输合并成了一个传输
3.读传输多抓了一些数据存在Cache里
4.写传输激活了更大范围的地址空间
简单对第2,3个场景做个说明,其他的类似。
多个传输合并成了一个传输
先后发送了两个burst读传输操作,前一个是针对于32bit数据通路的低16位进行,后一个是针对于32bit数据通路的高16bit进行,其他的burst参数一致,假如我们设定了modifiable后,在outstanding传输机制中,我们更倾向于将其合并,将两个读操作进行合并为一个来进行,当然这里面涉及到很多的考量,比如说地址之间依赖关系,或者是什么情况下可以进行合并、等等等。但若是这些事情都被解决了,传输的合并势必会提高整个AXI协议的效率。
读传输多抓了一些数据存在Cache里
之前就一直在讨论Cache中应该放什么样的数据,什么样的数据价值更高,一个普遍的观点是,假如我们抓取了0x0000_1000这个地址的数据,那这个地址周边的数据如0x0000_0111这种的离得很近的地址最终被读取的可能型一定比地址离它远的高,因此我们可不可以把它周边的数据也同样放到离CPU更近的位置来提高效率?cacheable给出了这种操作的可能性。
Read Allocate (RA) :为1时表示,当前为read trans,当read miss的时候,需要read allocate。只对read trans有效,且只在cacheable=1时有效。
Write Allocate(WA):为1时表示,当前为write trans,当write miss的时候,需要write allocate。只对write trans有效,且只在cacheable=1时有效。
AxCACHE取值是对读写trans的属性的描述,但是trans的数据属性和memType及cache的操作有关,比如device mem是不支持cacheable的,那么axCACHE[3:1]===0.
AXI3的spec定义了如下关系:

其中AxCACHE[3:0] = 4'b0010时,对应的是cacheable,but do not allocate。既然是non-allocate,怎么是cacheable呢?
实际上这里的cacheable和mem 属性的cacheable并不相同【所以在AXI4中修改了bit[1]的名字为modifiable】,如1.2.1.1节描述,这里是指原始trans请求在传输过程中可以改变,比如merge和preFetch。
AxCACHE=4'b0010的时候,trans是不会到cache中查找对应数据的。
真正的需要去cache中查找都需要带write-back和write-through属性的。所以只要带上这两个属性的,后面至少有一种allocate属性。
那么write-back或write-through时,只有read allocate,写一定会miss吗?
答案是否定的,write-back或write-through时,还是首先查询cache,对应的cacheLine可以由之前的read allocate分配【为了区分这种allocate,在AXI4中定义了other allocate】。如果真的miss了,由于是write nonallocate的那就只能直接写到ddr中。
由1.2.1.2节AxCACHE=4'b0010来看,cacheable(modifiable)并不一定对数据进行真的缓存,而只是trans可以在传输过程被修改。
但是能够缓存数据的时候,cacheable(modifiable)肯定为1.
那么就可以这么理解,凡是有cache的,它是一定支持trans merge和预取的。但是支持trans merge和预取的可以不用cache,而使用其他逻辑来实现。
但是具体怎么脱离cache来实现,目前没有看到实际的例子。我能想到的还是像在AXI trans convert模块中做的那样。这样就引入一个问题,我们平常使用的AXI trans convert在设置AxCACHE的时候为啥是4'b0000?
常用的AXI trans convert模块可以做trans merge,trans拆分,AXI数据位宽转换,为对齐多读数据等操作,和cacheable(modifiable)的描述基本一致,那为啥在AXI trans convert时AxCACHE没有设置为4'b0010呢?
我想应该主要区别在于AXI trans convert的转换是一个双向的。举个例子,两个相邻地址的读trans,在AXI trans convert之后变成一个读trans,在返回一个burst的数据之后,经过AXI trans convert,又被拆分为了两个trans。如果不拆分, AXI trans convert的master侧看到trans就不匹配。-----这个理解不一定正确,cacheable的read merge之后,返回数据,不拆分为两个resp,原来的master怎么能知道被merge的trans数据返回了呢?
上面标红的两段还没有确切的答案,等待有实例后更新,或者有读者朋友可以补充吗?
和AXI3有两点区别:
关于第一条修改,只是属性命名修改,不影响实际的实现。对于第二条,区分了读写trans。
对于读trans,ArCACHE[3]就是other allocate。含义是读trans的cacheLine可以来自一下两个过程
对于read trans,ArCACHE[2]含义和AXI3一致,表示read allocate。
对于写trans,AwCACHE[2]就是other allocate。含义是写trans的cacheLine可以来自一下两个过程
对于write trans,ArCACHE[3]含义和AXI3一致,表示write allocate。
无论对于 write allocate,read allocate还是other allocate,都是属于cacheable,且一定对应着write-back或者write-through。所以此时无论读写都要首先在cache中查找数据,另外AxCACHE[1]一定为1.另外如果只有other allocate,读写在查找cache miss的时候,本次读或写是不会allocate的
只要是write-back或write-through,无论allocate情况如何,读写都要首先在cache中查找数据。
相比AXI3有了一些新的memType,如下:

小括号中的编码是为了和AXI3兼容,在AXI4中都支持。
AxCACHE[3:0]=4'b0010,这里面就变成了non-cacheable non-bufferable,但是可modifiable。和AXI3描述的do not allocate,cacheable(modifiable)一致。
其中ArCACHE[3:0]=4'b1010和AwCACHE[3:0]=4'b0110,被标记为write-through No-allocate,我觉得应该标记为write-through other-allocate更合适一点。如果完全no-allocate,那么不可能由hit的trans,只是miss的时候读写都不会去主动allocate。但是AXI4的spec中又写了,这个no-allocate并不是严格的miss就一定不allocate,这只是一个出于性能原因建议不去allocate。实际是可以在read miss时候read allocate,write miss时候来write allocate。Write-back No-allocate含义类似。

关于所有memType对对应的trans的要求,可参考AXI4 spec的A4.4.1 Memory type requirements章节内容。
该信号定义了访问权限,可以阻止非法访问。AXI3/4都是一样的用法。共有3bit:

AxPROT[0]:特权访问和非特权访问。ArmV8支持四个特权层次EL0~EL3,其中EL0是用户空间,EL1是OS空间,对应了不同的权限级别。如果说AxPROT[0]映射的是ArmV8的EL0为非特权空间,EL1以上的为特权空间,那么AxPROT[0]=0时,是无法访问EL1以上的空间的;AxPROT[0]=1的trans可以访问所有特权级别。因为AXI只有特权和非特权的区别,而处理器往往有多个特权级别,所以两者之间的映射是可以是多对一或一对多。
AxPROT[1]:安全和非安全访问,安全访问可以访问安全区域和非安全区域,非安全trans只能访问非安区域。安全和非安全区域由软件根据业务及场景进行定义。
AxPROT[2]:该位指示事务是指令访问还是数据访问,它并不在所有情况下都是准确的,例如,当事务包含指令和数据项的混合时。本规范建议主设备将AxPROT[2] 设置为低电平,以指示数据访问,除非该访问明确是指令访问。
AxQOS有4bit,协议上没有指定 QoS 标识符的确切用途。协议建议使用 AxQOS 作为相关写入或读取事务的优先级指示器。值越高表示事务优先级越高。具体用法要看片内互联的实现方案。
4 位区域标识符可用于唯一地标识最多 16 个不同的区域。区域标识符可以提供高阶地址位的解码。区域标识符在任何 4Kbyte 地址内必须保持不变。
比如说一个slave里面的一段地址空间又划分了不同的属性,某一段是只读的,某一段是可读写的,你可以用对Axaddr decode的方式对这些trans进行区分,也可以用AxREGION进行区分。
【虽然APB目前没有这个信号,但可以用APB slave来举例说明,比如一个subsys的有多个IP的配置地址空间,你可以用paddr的decode来区分,也可以用REGION来区分】
协议中提供的两种场景如下:

在AW/W/B/AR/R这五个通道上都可以有用户自定义信号,协议本身并没有规定这些信号的使用方法。设计者可以根据自己的需求,选择使用哪些通道的user信号,各通道可以有不同的bit位宽。
AxPROT在支持特权和安全等级时,只有两个等级,如果需要支持更多的划分,那么使用user信号就是不错的选择。
resp包含bresp和rresp两种,分别是写响应resp和读响应resp。2bit的resp信号含义如下:

OKAY 是大多数交易的响应,响应表示以下任一情况:
slave返回SLVERR的情况可以包含如下:
需要注意的是,无论是哪一种错误,传输的数据量一定要和命令通道一致。
这个实际是ACE信号,容易被混到AXI信号中,这里也做一个简单的说明。mem的属性中有inner shareability,outer shareability的区分。这个2bit的AxDomain用来表示该访问的地址空间属于哪一个shareability domain。
关于shareability domain可以参考:
的第1.1.2节mem的Shareability
| Signal | Source | Description |
| CSYSREQ | Clock controller | System exit low-power state request. This signal is a request from the system clock controller for the peripheral to exit from a low-power state. See Power-down or power-up handshake on page A9-107. |
| CSYSACK | Peripheral device | Exit low-power state acknowledgement. This signal is the acknowledgement from a peripheral to a system exit low-power state request. See Power-down or power-up handshake on page A9-107. |
| CACTIVE | Peripheral device | Clock active. This signal indicates that the peripheral requires its clock signal.See Peripheral clock required on page A9-107. |
AXI的低功耗信号用的比较少,原因在于现在的互联总线都使用NOC,很少见使用AXI-Fabric的。AXI只是作为接口信号,没有实际的组件。所以低功耗用的少。
可以阅读本人另外两篇文章: