AMBA AXI 协议规范
AHB 协议规范
引言
本前言描述了本规范中使用的内容组织和文档约定。
目标受众
该规范是为希望熟悉AMBA协议的硬件和软件工程师编写的,旨在设计与AXI协议兼容的系统和模块
使用本规范
本规范中的信息分为几个部分,如本节所述:
- A第1章 介绍 :介绍了本规格中使用的AXI协议架构和术语。
- A第2章 信号列表 :介绍了本规格中使用的AXI协议架构和术语。
- A第3章 传输 :提供有关AXI协议的基本操作的信息,例如读写事务、通道信号要求以及通道之间的关系。
- A第4章 事务 :包含有关AXI协议事务的信息,例如事务请求、事务响应、以及读写数据。
- A第5章 请求属性 :描述内存属性、内存类型、内存保护和多个区域接口。
- A第6章 事务ID和顺序 :描述事务ID信号、请求顺序、写数据和响应顺序 以及读数据顺序。
- A第7章 原子访问 :包含关于原子访问、单一和多副本原子性及独占访问的信息。
- A第8章 请求操作码 :提供有关操作码字段的信息,该字段描述请求的功能并指示如何由从机处理。
- A第9章 缓存 :描述了AXI协议中的缓存,包括I/O一致性、缓存可共享行以及使用特定事务管理缓存分配。
- A第10章 缓存维护 :提供有关使用缓存维护操作来控制缓存内容的信息,以确保数据的可见性。
- A第11章 额外请求限定 :描述AXI协议中的额外请求限定符,例如非安全访问ID(NSAID)基于Page的硬件属性(PBHA)和子系统ID。
- A第12章 其他写事务 :包含有关AXI协议中其他写事务的信息,例如WriteDeferrable和WriteZero。
- A第13章 系统监控、调试和用户扩展 :描述了AXI协议的系统调试、跟踪和监控功能,例如内存系统资源分区和监控(MPAM)、内存标记扩展(MTE)以及用户回环和用户定义信号。
- A第14章 未转换事务 :描述了AXI如何支持在系统内存管理单元(SMMU)上游组件中使用虚拟地址和转换缓存提示
- A第15章 分布式虚拟内存消息 :描述AXI如何支持分布式系统MMU使用分布式虚拟内存DVM消息来维护虚拟内存系统中的所有MMU。
- A第16章 唤醒信号 :描述可用于接口时钟或电源控制的唤醒信号。
- A第17章 接口和数据保护 :解释如何使用中毒信号和奇偶校验信号来保护数据或接口。
- 第1章 接口类 :对所有AMBA 5 AXI接口类的描述,包括信号和属性表。
- 第2章 id约束清单 :AXI协议中ID约束的总结。
- 第3章 版本 :本次规格与上一版本之间变化的详细信息。
约定
本节描述了本规格使用的约定:
排版
排版惯例是:
- italic(斜体):突出重要笔记,介绍特殊术语,并指示内部交叉引用和引用。
- bold(粗体):表示信号名称,并用于描述性列表中的术语(如果适用)。
- monospace(等宽):该字体用于汇编程序语法描述、伪代码和源代码示例。同时用于主要文本中的指令助记符,以及对出现在汇编程序语法描述、伪代码和源代码示例中的其他项目的引用。
- SMALL CAPITALS(小写大写字母):用于几个具有特定技术含义的术语。
时序图
在时序图中使用的组件在 图 1 中进行了说明。当变化发生时,会有明确的标签。请不要假设图中没有明确的时序信息
时序图有时将单比特信号同时显示为高和低,它们看起来与 图 1 显示的总线变化类似。 如果时序图以这种方式显示单比特信号,则其值不会影响附带的描述。
信号
下面是关于信号方面的约定:
- 信号电平:断言信号的水平取决于信号是高有效还是低有效,断言意味着
- HIGH:表示高电平有效。
- LOW:表示低电平有效。
- 小写n:出现在信号名的开始或结束都表示低电平有效。
- 小写x:信号名称的第二个字母表示读取和写入的统称。例如AxCACHE既指ARCACHE信号也指AWCACHE信号。
数字
数字通常以十进制书写。二进制数字以0b开头,十六进制数字以0x开头。 在这两种情况下,前缀和相关的值都以monospace字体书写。例如0xFFFF0000。 为了提高可读性,较长的数字可以在每四个字符之间加下划线分隔。 例如0xFFFF_0000_0000_0000,在解释数字的值时忽略任何下划线。
伪代码描述
本规范使用一种伪代码形式来提供对指定功能的精确描述。 该伪代码以等宽字体书写。伪代码语言在Arm®架构参考手册中描述,适用于A型架构。
额外阅读
本节列出了Arm和第三方的出版物。
查看Arm开发者网站http://developer.arm.com 以获取Arm文档的访问权限。
[1] AMBA® AXI and ACE Protocol Specification. (ARM IHI 0022 H.c).
[2] AMBA® AXI Protocol Specification. (ARM IHI 0022 J).
[3] Arm® Architecture Reference Manual for A-profile architecture. (ARM DDI 0487).
[4] Arm® Realm Management Extension (RME) System Architecture. (ARM DEN 0129).
[5] AMBA® 5 CHI Architecture Specification. (ARM IHI 0050).
[6] Arm® Architecture Reference Manual Supplement, Memory System Resource Partitioning and Monitoring (MPAM), for A-profile architecture. (ARM DDI 0598).
[7] Arm® System Memory Management Unit Architecture Specification, SMMU architecture version 3. (ARM IHI0070)
反馈
- 请通过填写 https://developer.arm.com/feedback/survey 上的表单,提交关于Arm产品文档的反馈意见。
- 有关Arm产品、架构和规格的技术反馈、问题或咨询,请在 https://support.developer.arm.com/my-cases/open-case/ 上提交支持请求。
Part A 规范
A第1章 介绍
本章介绍了AXI协议的架构和本规范中使用的术语。
它包含以下部分:
A1.1 关于AXI协议
AXI协议支持高性能、高频率的系统设计,用于主机与从机之间的通信。
AXI协议的特点包括:
- 适用于高带宽和低延迟的设计。
- 无需使用复杂的桥接器,提供高频率操作。
- 该协议满足广泛组件的接口要求。
- 适用于具有高首次访问延迟的内存控制器。
- 提供互联架构实施的灵活性。
- 向后兼容AHB和APB接口。
AXI协议的关键特性包括:
- 独立的地址/控制和数据阶段。
- 支持使用字节strobe的非对齐数据传输。
- 仅发出起始地址的基于突发的事务。
- 分开的写和读数据通道,可以提供低成本的直接内存访问(DMA)。
- 支持发出多个未完成的地址。
- 支持无序事务完成。
- 允许轻松添加寄存器阶段以提供时序闭合。
A1.2 AXI架构
AXI协议是基于事务的,定义了五个独立的通道:
- 写请求,其信号名称以AW开头。
- 写数据,其信号名称以W开头。
- 写响应,其信号名称以B开头。
- 读请求,其信号名称以AR开头。
- 读数据,其信号名称以R开头。
请求通道携带控制信息,描述要传输数据的性质。这个称为请求。
数据在主机和从机之间使用以下方式传输:
- 写数据通道将数据从主机传输到从机。在写事务中,从机使用写响应通道向主机发出表示完成传输的信号。
- 读数据通道将数据从从机传输到主机。
AXI协议:
- 允许在实际数据传输之前发出地址信息。
- 支持多个未决事务。
- 支持事务的乱序完成。
图 A1.1 展示了写事务如何使用写请求、写数据和写响应通道。
图 A1.2 展示了读取事务如何使用读取请求和读取数据通道。
A1.2.1 通道定义
每个独立的五个通道由一组信息信号以及VALID和READY信号组成, 提供双向握手机制。信息源使用VALID信号来表示通道上何时有有效的地址、数据或控制信息可用。 目的地使用READY信号来表示何时可以接受这些信息。 读数据通道和写数据通道还包括LAST信号,以指示在事务中最后一个数据项的传输。
A1.2.1.1 读写请求通道
存在单独的写请求和读请求通道。适当的请求通道携带一个事务所需的所有地址和控制信息。
A1.2.1.2 写数据通道
写数据通道将写数据从主机传输到从机,包括:
- 数据信号WDATA,可以为8、16、32、64、128、256、512或1024位宽。宽度使用DATA_WIDTH属性表示。
- 每8个数据位都有一个字节通道时钟信号,指示有效的数据字节。
写数据通道信息始终被视为缓存,这样主机可以在没有从机确认先前写操作的情况下执行写事务。
A1.2.1.3 写响应通道
从机使用写响应通道来响应写事务。 所有写事务都需要在写响应通道上进行完成信号传输。 如 图 A1.1所示,只有在完整事务中才会发出完成信号,而不是在事务中的每个数据传输中发出。
A1.2.1.4 读数据通道
读取数据通道携带从从机到主机的读取数据和读取响应信息,包括:
- 数据信号RDATA,其宽度可以是8、16、32、64、128、256、512或1024位。宽度通过DATA_WIDTH属性表示。
- 表示读取事务完成状态的读取响应信号。
A1.2.2 接口与互联
一个典型的系统由多个主机和从机组成,这些设备通过某种形式的连接相互连接,如 图 A1.3 所示
AXI协议为以下接口之间提供了单一的接口定义:
- 主机与互连之间
- 从机与互连之间
- 主机与从机之间
此接口定义支持许多不同的互连实现。
设备之间的互连相当于另一个具有对称的主机和从机端口的设备,实际的主机和从机通过这一互联可以连接在一起。
A1.2.2.1 典型系统拓扑
大多数系统使用三种互连拓扑之一:
- 共享请求和数据通道。
- 共享请求通道和多个数据通道。
- 多层次,具有多个请求和数据通道。
在大多数系统中,请求通道的带宽需求显著低于数据通道的带宽需求。 这种系统可以通过使用一个共享请求通道和多个数据通道来实现系统性能和互连复杂性之间的良好平衡,从而启用并行数据传输。
A1.2.3 寄存器切片
每个AXI通道仅以单一方向传输信息,并且架构不要求通道之间有任何固定关系。 这些特性意味着可以在任意通道的几乎任何位置插入寄存器切片,代价是增加一个周期的延迟。 这些特性使以下情况成为可能:
- 在延迟周期和最大操作频率之间进行权衡。
- 处理器与高性能内存之间的直接快速连接,同时使用简单的寄存器切片来隔离到性能要求较低外设的较长路径。
A1.3 术语
本节总结了本规范中使用的术语,这些术语在 C第1章 术语表 中或其他地方有定义。 在适当的情况下,本节中列出的术语链接到相应的术语表定义。
A1.3.1 AXI组件和拓扑
以下术语描述了AXI组件:
对于特定的AXI事务,上游 和 下游 指的是AXI拓扑中AXI组件的相对位置。
A1.3.2 AXI事务与传输
AXI传输是在AXI通道上一个周期内的通信。
AXI事务是AXI主机与AXI从机进行通信所需的传输集合。
例如,读事务由请求传输和一个或多个读数据传输组成。
A1.3.3 缓存与缓存操作
本规范没有定义任何缓存参考书中定义的标准缓存术语。
然而,缓存 和 缓存行 的词汇条目澄清了这些术语在本文档中的使用方式。
A1.3.4 时间描述
AXI规范使用了 及时 的解释。
A第2章 信号列表
本章列出了本规范中描述的所有信号。 有些通道和信号是可选的,因此并不包含在每个接口中。 每个信号名称包含一个超链接,指向定义该信号的章节。 奇偶校验信号不包含在本章中,但在 A17.2.3 校验检查信号 中列出。
信号根据通道和类别分组,如以下各节所述。
A2.1 写通道
写通道用于传输请求、数据和响应以进行写事务以及一些其他无数据事务。
A2.1.1 写请求通道
写请求通道传输使用写通道的事务所需的所有地址和控制信息。该通道上的信号前缀为AW。
表 A2.1 写请求通道信号
名字 | 位宽 | 信号源 | 描述 |
---|---|---|---|
AWVALID | 1 | 主机 | 有效 |
AWREADY | 1 | 从机 | 就绪 |
AWID | ID_W_WIDTH | 主机 | 事务ID |
AWADDR | ADDR_WIDTH | 主机 | 地址 |
AWREGION | 4 | 主机 | 区域ID |
AWLEN | 8 | 主机 | 长度 |
AWSIZE | 3 | 主机 | 大小 |
AWBURST | 2 | 主机 | 突发属性 |
AWLOCK | 1 | 主机 | 锁定 |
AWCACHE | 4 | 主机 | 缓存属性 |
AWPROT | 3 | 主机 | 访问属性 |
AWNSE | 1 | 主机 | RME的非安全扩展bit |
AWQOS | 4 | 主机 | Qos ID |
AWUSER | USER_REQ_WIDTH | 主机 | 用户写请求 |
AWDOMAIN | 2 | 主机 | 可共享域 |
AWSNOOP | AWSNOOP_WIDTH | 主机 | 操作码 |
AWSTASHNID | 11 | 主机 | Stash 节点 ID |
AWSTASHNIDEN | 1 | 主机 | Stash 节点 ID 使能 |
AWSTASHLPID | 5 | 主机 | Stash 逻辑处理器 ID |
AWSTASHLPIDEN | 1 | 主机 | Stash 逻辑处理器 ID 使能 |
AWTRACE | 1 | 主机 | 跟踪 |
AWLOOP | LOOP_W_WIDTH | 主机 | Loop信号 |
AWMMUVALID | 1 | 主机 | MMU有效 |
AWMMUSECSID | SECSID_WIDTH | 主机 | MMU安全流 ID |
AWMMUSID | SID_WIDTH | 主机 | MMU流ID |
AWMMUSSIDV | 1 | 主机 | MMU子流ID有效 |
AWMMUSSID | SSID_WIDTH | 主机 | MMU子流ID |
AWMMUATST | 1 | 主机 | 地址转换指示 |
AWMMUFLOW | 2 | 主机 | MMU flow type |
AWPBHA | 4 | 主机 | Page-based 硬件属性 |
AWNSAID | 4 | 主机 | 非安全访问 ID |
AWSUBSYSID | SUBSYSID_WIDTH | 主机 | 子系统 ID |
AWATOP | 6 | 主机 | 原子事务操作码 |
AWMPAM | MPAM_WIDTH | 主机 | MPAM 写请求 |
AWIDUNQ | 1 | 主机 | 唯一ID |
AWCMO | AWCMO_WIDTH | 主机 | CMO type |
AWTAGOP | 2 | 主机 | 内存标签 |
AWMECID | MECID_WIDTH | 主机 | 内存加密ID |
A2.1.2 写数据通道
写数据通道携带来自主机到从机的写数据和控制信息。该通道上的信号以W为前缀。
表 A2.2 写数据通道信号
名字 | 位宽 | 信号源 | 描述 |
---|---|---|---|
WVALID | 1 | 主机 | 有效 |
WREADY | 1 | 从机 | 就绪 |
WDATA | DATA_WIDTH | 主机 | 写数据 |
WSTRB | DATA_WIDTH / 8 | 主机 | strobes写 |
WTAG | ceil(DATA_WIDTH/128) x 4 | 主机 | 内存Tag |
WTAGUPDATE | ceil(DATA_WIDTH/128) | 主机 | 内存Tag更新 |
WLAST | 1 | 主机 | 最后写数据标志 |
WUSER | USER_DATA_WIDTH | 主机 | 用户写数据 |
WPOSION | ceil(DATA_WIDTH / 64) | 主机 | 中毒标志 |
WTRACE | 1 | 主机 | 跟踪 |
A写响应通道
写响应通道用于传递从从机到主机的响应,适用于使用写数据通道的事务。该通道上的信号以字母B为前缀。
表 A2.3 写响应通道信号
名字 | 位宽 | 信号源 | 描述 |
---|---|---|---|
BVALID | 1 | 从机 | 有效 |
BREADY | 1 | 主机 | 就绪 |
BID | ID_W_WIDTH | 从机 | 事务ID |
BIDUNQ | 1 | 从机 | 唯一ID |
BRESP | BRESP_WIDTH | 从机 | 写响应 |
BCOMP | 1 | 从机 | 完成标志 |
BPERSIST | 1 | 从机 | 持久响应 |
BTAGMATCH | 2 | 从机 | 内存标签匹配 |
BUSER | USER_RESP_WIDTH | 从机 | 用户写响应 |
BTRACE | 1 | 从机 | 跟踪 |
BLOOP | LOOP_W_WIDTH | 从机 | 回环 |
BBUSY | 2 | 从机 | 繁忙 |
A2.2 读通道
读通道用于传输读取事务、缓存维护操作和DVM完成消息的请求、数据和响应。
A2.2.1 读请求通道
读请求通道携带所有使用读取通道的事务所需的地址和控制信息。该通道上的信号以前缀AR开头。
表 A2.4 读请求信号
名字 | 位宽 | 信号源 | 描述 |
---|---|---|---|
ARVALID | 1 | 主机 | 有效 |
ARREADY | 1 | 从机 | 就绪 |
ARID | ID_R_WIDTH | 主机 | ID |
ARADDR | ADDR_WIDTH | 主机 | 地址 |
ARREGION | 4 | 主机 | 区域 |
ARLEN | 8 | 主机 | 长度 |
ARSIZE | 3 | 主机 | 大小 |
ARBURST | 2 | 主机 | 突发 |
ARLOCK | 1 | 主机 | 锁定 |
ARCACHE | 4 | 主机 | 缓存属性 |
ARPROT | 3 | 主机 | 访问属性 |
ARNSE | 1 | 主机 | RME的非安全扩展位 |
ARQOS | 4 | 主机 | QoS标志 |
ARUSER | USER_REQ_WIDTH | 主机 | 用户读请求 |
ARDOMAIN | 2 | 主机 | 共享域 |
ARSNOOP | ARSNOOP_WIDTH | 主机 | 操作码 |
ARTRACE | 1 | 主机 | 跟踪 |
ARLOOP | LOOP_R_WIDTH | 主机 | Loop |
ARMMUVALID | 1 | 主机 | MMU有效 |
ARMMUSECSID | SECSID_WIDTH | 主机 | MMU安全流ID |
ARMMUSID | SID_WIDTH | 主机 | MMU流ID |
ARMMUSSIDV | 1 | 主机 | MMU子流ID有效 |
ARMMUSSID | SSID_WIDTH | 主机 | MMU子流ID |
ARMMUATST | 1 | 主机 | 地址已转换 |
ARMMUFLOW | 2 | 主机 | MMU flow类型 |
ARPBHA | 4 | 主机 | Page-based硬件属性 |
ARNSAID | 4 | 主机 | 非安全访问ID |
ARSUBSYSID | SUBSYSID_WIDTH | 主机 | 子系统ID |
ARMPAM | MPAM_WIDTH | 主机 | 带请求的MPAM信息 |
ARCHUNKEN | 1 | 主机 | 分块使能 |
ARIDUNQ | 1 | 主机 | 唯一ID |
ARTAGOP | 2 | 主机 | 内存标签操作码 |
ARMECID | MECID_WIDTH | 主机 | 内存加密ID |
A2.2.2 读数据通道
读数据通道传输来自从机设备到管理器的读数据和响应。该通道上的信号以R为前缀。
名字 | 位宽 | 信号源 | 描述 |
---|---|---|---|
RVALID | 1 | 从机 | 有效 |
RREADY | 1 | 主机 | 就绪 |
RID | ID_R_WIDTH | 从机 | 事务ID |
RIDUNQ | 1 | 从机 | 唯一ID指示 |
RDATA | DATA_WIDTH | 从机 | 读取数据 |
RTAG | ceil(DATA_WIDTH/128)*4 | 从机 | 内存标签 |
RRESP | RRESP_WIDTH | 从机 | 读取响应 |
RLAST | 1 | 从机 | 最后读取标志 |
RUSER | USER_DATA_WIDTH + USER_RESP_WIDTH | 从机 | 用户的读取数据和响应 |
RPOSION | ceil(DATA_WIDTH / 64) | 从机 | 中毒标志 |
RTRACE | 1 | 从机 | 跟踪 |
RLOOP | LOOP_R_WIDTH | 从机 | 回环 |
RCHUNKV | 1 | 从机 | 分块有效 |
RCHUNKNUM | RCHUNKNUM_WIDTH | 从机 | 分块编号 |
RCHUNKSTRB | RCHUNKSTRB_WIDTH | 从机 | 分块 strobe |
RBUSY | 2 | 从机 | 繁忙 |
A2.3 侦听通道
在本规范中,旁路通道仅用于传输DVM消息。
A2.3.1 侦听请求通道
侦听请求通道携带DVM消息请求的地址和控制信息。该通道上的信号具有前缀AC。
表 A2.6 侦听请求通道
名字 | 位宽 | 信号源 | 描述 |
---|---|---|---|
ACVALID | 1 | 从机 | 有效 |
ACREADY | 1 | 主机 | 就绪 |
ACADDR | ADDR_WIDTH | 从机 | 地址 |
ACVMIDEXT | 4 | 从机 | VMID |
ACTRACE | 1 | 从机 | 跟踪 |
A2.3.2 侦听响应通道
侦听响应通道承载对DVM消息的响应。该通道上的信号具有前缀CR.
表 A2.7 侦听响应通道信号
名字 | 位宽 | 信号源 | 描述 |
---|---|---|---|
CRVALID | 1 | 主机 | 有效 |
CRREADY | 1 | 从机 | 就绪 |
CRTRACE | 1 | 主机 | 跟踪 |
A2.4 接口信号
接口级信号是非信道信号。每个接口最多可以有一组信号。
A2.4.1 时钟和复位信号
接口上的所有信号与全局时钟同步,并通过全局复位信号进行复位。
表 A2.8 时钟和复位信号
名字 | 位宽 | 信号源 | 描述 |
---|---|---|---|
ACLK | 1 | 时钟源 | 全局时钟 |
ARESETn | 1 | 复位源 | 全局复位 |
A2.4.2 唤醒信号
表 A2.9 唤醒信号
名字 | 位宽 | 信号源 | 描述 |
---|---|---|---|
AWAKEUP | 1 | 主机 | 读写通道唤醒。 |
ACWAKEUP | 1 | 从机 | 侦听通道唤醒。 |
A2.4.3 Qos接收信号
QoS接受信号可以被从机接口用于指示它接受的请求的最小QoS值。
表 A2.10 Qos接收信号
名字 | 位宽 | 信号源 | 描述 |
---|---|---|---|
VAWQOSACCEPT | 4 | 从机 | 写请求的Qos值 |
VARQOSACCEPT | 4 | 从机 | 读请求的Qos值 |
A2.4.4 连贯性连接信号
连贯性连接信号由主机使用,以控制其是否接收AC通道上的DVM消息。
表 A2.11 连贯性连接信号
名字 | 位宽 | 信号源 | 描述 |
---|---|---|---|
SYSCOREQ | 1 | 主机 | 连贯性连接请求 |
SYSCOACK | 1 | 从机 | 连贯性连接回应 |
A2.4.5 接口控制信号
接口控制信号是主机接口的静态输入,可用于配置接口行为。
表 A2.12 接口控制信号
名字 | 位宽 | 信号源 | 描述 |
---|---|---|---|
BROADCASTATOMIC | 1 | Tie-off | 控制输入用于原子事务 |
BROADCASTSHAREABLE | 1 | Tie-off | 控制输入用于可共享事务 |
BROADCASTCACHEMAINT | 1 | Tie-off | 控制输入用于维护操作 |
BROADCASTCMOPOPA | 1 | Tie-off | 控制输入用于 CleanInvalidPoPA CMO |
BROADCASTPERSIST | 1 | Tie-off | 控制输入用于 CleanSharedPersist and CleanSharedDeepPersist |
A第3章 传输
本章描述了AXI中使用的通道传输 它包含以下部分:
A3.1 时钟和复位
本节描述了实现AXI全局时钟和复位信号ACLK和ARESETn的要求。
A3.1.1 时钟
每个AXI接口都有一个单一的时钟信号ACLK。 所有输入信号在ACLK的上升沿被采样。 所有输出信号的变化只能在ACLK的上升沿之后发生。
在主机和从机之间,输入和输出信号之间必须没有组合路径。
A3.1.2 复位
AXI协议使用一个单一的低电平有效复位信号ARESETn。 复位信号可以异步地被断言,但去断言只能在ACLK上升沿同步进行。 在复位期间,以下接口要求适用:
- 主机必须将AWVALID、WVALID和ARVALID驱动为低。
- 从机必须将BVALID和RVALID驱动为低。
- 所有其他信号可以被驱动为任何值。
复位后,主机被允许开始将AWVALID、WVALID和ARVALID 驱动为高的最早时刻是在ARESETn高后的ACLK上升沿。
图 A3.1 显示了复位后AWVALID、WVALID和ARVALID 可以被驱动为高的最早时间点 b。
A3.2 通道握手
所有AXI通道使用相同的VALID/READY握手过程来传输地址、数据和控制信息。 这种双向流控制机制意味着主机和从机都可以控制信息在主机和从机之间移动的速率。 源生成VALID信号以指示地址、数据或控制信息可用。 目标生成READY信号以指示它可以接受信息。 仅当VALID和READY信号均为高电平时,传输才会发生。
在主机和从机之间,输入信号和输出信号之间必须没有组合路径。 图 A3.2 到 图 A3.4 展示了握手过程的示例。
源可以在READY被断言之前就断言VALID。
源在边缘1之后呈现信息,并如 图 A3.2 所示声明VALID信号。 目标在边缘2之后声明READY信号。 源必须保持其信息稳定,直到在边缘3时发生传输,此时该声明被识别。
源不能在断言VALID之前去等待READY被断言。
Note:也就是说源不能依靠等待READY被断言之后才断言VALID。
当VALID被断言时,它必须保持断言状态直到握手发生, 握手发生在VALID和READY同时被断言的上升时钟边缘。
在 图 A3.3 中,目标在边缘1之后断言READY,在地址、数据或控制信息有效之前。 这一确认表明它可以接受信息。源在边缘2之后提供信息并断言VALID,然后在边缘3时被识别时进行传输。 在这种情况下,传输发生在一个周期内。
允许目的在相应的READY断言之前等待VALID被断言。
如果READY被断言,它被允许VALID断言之前解除断言READY。 在 图 A3.4 中,源和目的地恰好都表示它们在边缘1之后可以传送地址、数据或控制信息。 在这种情况下,传输发生在VALID和READY同时被断言的上升时钟边缘。这意味着传输发生在边缘2。
个别AXI通道握手机制在 A3.4 通道关系 中描述。
Note:
- VALID不能等待READY,
- READY可以等待VALID。
A3.3 读写通道
这一部分描述了AXI写通道和读通道。通道如下:
对于使用 A15.3 dvm 消息 的接口,额外有两个通道:
A3.3.1 写请求通道(AW)
写请求通道的控制信号如 表 A3.1 所示。
表 A3.1 写请求通道控制信号
信号 | 位宽 | 信号源 | 描述 |
---|---|---|---|
AWVALID | 1 | 主机 | 写请求有效 |
AWREADY | 1 | 从机 | 写请求就绪 |
当主机驱动有效请求时,可以断言AWVALID信号。 当被断言时,AWVALID必须保持断言状态,直到从机在上升时钟边缘断言AWREADY。
AWREADY的默认状态可以是高或低。 建议将AWREADY的默认状态设置为高。 当AWREADY为高时,从机必须能够接受呈现给它的任何有效请求。
不建议将AWREADY默认设置为低,因为这会强制传输至少需要两个周期, 一个周期用于断言AWVALID,另一个周期用于断言AWREADY。
A3.3.2 写数据通道(W)
写数据通道的控制信号如 表 A3.2 所示。
表 A3.2 写数据通道控制信号
信号 | 位宽 | 信号源 | 描述 |
---|---|---|---|
WVALID | 1 | 主机 | 写数据有效 |
WREADY | 1 | 从机 | 写数据就绪 |
WLAST | 1 | 主机 | 写事务最后一个传输 |
在写事务期间,主机只能在其驱动有效写数据时断言WVALID信号。 当断言时,WVALID必须保持断言状态, 直到从机断言WREADY之后的上升时钟边缘。
WREADY的默认状态可以是高,但前提是从机始终能够在单个周期内接受写数据。
主机在驱动事务中的最后写传输时必须断言WLAST信号。
建议对于非活跃的字节通道,将WDATA驱动为零。
未使用WLAST的从机可以省略其接口中的输入。 属性WLAST_Present用于确定WLAST信号是否存在。
表 A3.3 WLAST_Present 属性
WLAST_Present | 默认值 | 描述 |
---|---|---|
True | Y | WLAST存在 |
False | WLAST不存在 |
A3.3.3 写响应通道(B)
写响应通道的控制信号如 表 A3.4 所示。
表 A3.4 写响应通道控制信号
信号 | 位宽 | 信号源 | 描述 |
---|---|---|---|
BVALID | 1 | 从机 | 写响应信号有效 |
BREADY | 1 | 主机 | 写响应信号就绪 |
从机只能在驱动有效写响应时断言BVALID信号。 当断言时,BVALID必须保持断言状态, 直到主机断言BREADY后的上升时钟边缘。
BREADYBREADY的默认状态可以是高电平,但是前提是主机必须始终能在一个周期内接受写响应。
A3.3.4 读请求通道(AR)
读取请求通道的控制信号如 表 A3.5 所示。
表 A3.5 读请求控制信号
信号 | 位宽 | 信号源 | 描述 |
---|---|---|---|
ARVALID | 1 | 主机 | 读请求有效 |
ARREADY | 1 | 从机 | 读请求就绪 |
主机只能在发出有效读请求时断言ARVALID信号。 一旦断言,ARVALID必须保持断言状态,直到从机在上升时钟边缘断言ARREADY信号。
ARREADY的默认状态可以是高或低。 建议将ARREADY的默认状态设置为高。 如果ARREADY为高,则从机必须能够接受任何呈现给它的有效读请求。
不建议将ARREADY设为低,因为这会使传输至少需要两个周期,一个用于将ARVALID置为有效, 另一个用于将ARREADY置为有效
A2.3.5 读数据通道(R)
读取数据通道的控制信号如 表 A3.6 所示
表 A3.6 读数据通道控制信号
信号 | 位宽 | 信号源 | 描述 |
---|---|---|---|
RVALID | 1 | 从机 | 读数据有效 |
RREADY | 1 | 主机 | 读数据就绪 |
RLAST | 1 | 从机 | 读事务中的最后一个传输 |
从机仅在驱动读取数据通道上的有效信号时才能断言RVALID信号。 当RVALID被断言时,它必须保持断言状态,直到主机断言ARREADY后的上升时钟边缘。 即使从机只有一个读取数据源,它也必须仅在响应请求时断言RVALID信号。
主机使用信号RREADY指示它接受数据。 RREADY的默认状态可以是高,但只有在主机能够在开始读取事务且立即接受读取数据时。
每当从机驱动事务中的最终读取传输时,必须断言RLAST信号。 建议对不活动的字节通道将RDATA驱动为零。
不使用RLAST的主机可以从其接口中省略该输入。属性RLAST_Present用于确定RLAST信号是否存在。
表 A3.7 RLAST_Present 属性
RLAST_Present | 默认值 | 描述 |
---|---|---|
True | Y | RLAST存在 |
False | RLAST不存在 |
A3.4 通道关系
AXI协议要求保持以下关系:
- 写响应必须始终跟随写事务中的最后一次写传输。
- 读数据和读响应必须始终跟随读请求。
- 通道握手必须符合 A3.5 通道握手依赖关系 定义。
- 当主机发出写请求时,必须能够提供该事务的所有写数据,而不依赖于该主机的其他事务。
- 当主机已发出写请求并提供所有写数据时,必须能够接受该事务的所有响应,而不依赖于该主机的其他事务。
- 当主机已发出读请求时,必须能够接受该事务的所有读数据,而不依赖于该主机的其他事务。
Note:主机可以依赖于使用相同ID的事务按顺序返回读数据,因此主机只需要足够的存储空间来存储具有不同ID的事务的读数据。
- 主机被允许在发出另一个事务请求之前等待一个事务完成。
- 从机被允许在接受或发出另一个事务的传输之前等待一个事务完成。
- 从机不能因带有前导写数据的事务而阻止接受无数据的写请求。
该协议未定义通道之间的其他关系。
缺乏关系意味着写数据可以在写请求之前出现在接口处。 如果写请求通道包含比写数据通道更多的寄存器级别,就会发生这种情况。 同样,写数据可能在与写请求相同的周期内出现。
当互连需要确定目标地址空间或从机空间时,必须重新对齐请求和写数据。 此重新对齐是为了确保写数据仅向被标记为有效的从机发送。
A3.5 通道握手依赖关系
通道之间存在写、读和侦听事务的依赖关系。这些在下面的章节中进行了描述,并包含依赖图,其中:
- 单箭头指向可以在箭头起始信号之前或之后被断言的信号。
- 双箭头指向必须在箭头起始信号断言之后才能被断言的信号。
A3.5.1 写事务依赖
对于写通道上的事务, 图 A3.5 显示了握手信号的依赖关系。规则如下:
- A3.5.1.1 主机在断言AWVALID或WVALID 之前不得等待从机断言AWREADY或WREADY。这适用于事务中的每个写数据传输。
- A3.5.1.2 从机可以在断言AWREADY之前等待AWVALID或WVALID, 或两者。
- A3.5.1.3 从机可以在AWVALID或WVALID, 或两者被断言之前断言AWREADY。
- A3.5.1.4 从机可以在断言WREADY之前等待AWVALID或WVALID, 或两者。
- A3.5.1.5 从机可以在AWVALID或WVALID, 或两者被断言之前断言WREADY。
- A3.5.1.6 从机必须在断言BVALID之前等待 AWVALID、AWREADY、WVALID和WREADY被断言。
- A3.5.1.7 从机还必须在断言BVALID之前等待WLAST被断言。 这是因为写响应BRESP必须在写事务的最后一次数据传输之后发送信号。
- A3.5.1.8 从机不得在断言BVALID之前等待主机断言BREADY。
- A3.5.1.9 主机可以在断言BREADY之前等待BVALID。
- A3.5.1.10 主机可以在BVALID被断言之前断言BREADY。
A3.5.2 读事务依赖
对于读取通道上的事务,图 A3.6 显示了握手信号的依赖关系。规则如下:
- A3.5.2.1 主机在断言ARVALID之前不得等待从机断言ARREADY。
- A3.5.2.2 从机可以在断言ARREADY之前等待ARVALID被断言。
- A3.5.2.3 从机可以在ARVALID被断言之前断言ARREADY。
- A3.5.2.4 从机必须等到ARVALID和ARREADY都被断言后, 才能断言RVALID以指示有效数据可用。
- A3.5.2.5 从机不得等待主机断言RREADY后再断言RVALID。
- A3.5.2.6 主机可以在断言RREADY之前等待RVALID被断言。
- A3.5.2.7 主机可以在RVALID被断言之前断言RREADY。
总结:
- 断言VALID不等断言READY:A3.5.1.1 写请求和写A3.5.1.8 写响应A3.5.2.1 读请求A3.2.2.5 读A3.6.3.1 侦听请求A3.6.3.5 侦听响应
- 断言READY可等断言VALID:A3.5.1.2 写请求和写A3.5.1.9 写响应A3.5.1.4 写请求和写A3.5.2.2 读请求A3.5.2.6 读A3.6.3.2 侦听请求A3.6.3.6 侦听响应
- 断言VALID和断言READY没有先后关系:A3.5.1.3 写请求和写A3.5.1.5 写请求和写A3.5.1.10 写响应A3.5.2.3 读请求A3.5.2.7 读A3.6.3.3 侦听请求A3.6.3.7 侦听响应
- 断言BVALID必须在写传输完成之后:A3.5.1.6 写响应在写请求和写之前A3.5.1.7 写响应在最后一笔写传输之前
- 断言RVALID必须在ARVALID和ARREADY断言之后:A3.5.2.4 读有效在读请求有效和就绪之前
- 断言CRVALID必须在ACVALID和ACREADY断言之后:A3.6.3.4 侦听响应有效在侦听请求有效和就绪之前
A3.6 侦听通道
DVM消息在互连和管理组件之间通过侦听通道传输。 当支持DVM消息时,会有一个侦听请求通道(AC)和一个侦听响应通道(CR)。
A3.6.1 侦听请求通道(AC)
侦听请求通道的控制信号如 表 A3.8 所示。
表 A3.8 侦听请求通道控制
信号 | 位宽 | 信号源 | 描述 |
---|---|---|---|
ACVALID | 1 | 从机 | 侦听请求有效。 |
ACREADY | 1 | 主机 | 侦听请求就绪。 |
从机只能在驱动有效地址和控制信息时断言ACVALID信号。 当ACVALID被断言时,它必须保持断言状态,直到主机断言ACREADY信号的上升时钟边缘。
ACREADY的默认状态可以是高或低。 建议将ACREADY的默认状态设置为高。 如果ACREADY为高,则主机必须能够接受任何呈现给它的有效请求。
不推荐将ACREADY的默认状态设置为低,因为这会迫使传输至少需要两个时钟周期, 一个用于断言ACVALID,另一个用于断言ACREADY。
A3.6.2 侦听响应信号(CR)
侦听响应通道的控制信号如 表 A3.9 所示。
表 A3.9 侦听响应信号
信号 | 位宽 | 信号源 | 描述 |
---|---|---|---|
CRVALID | 1 | 主机 | 侦听响应有效。 |
CRREADY | 1 | 从机 | 侦听响应就绪。 |
主机只有在它在侦听响应通道上驱动有效信号时才能断言CRVALIDCRVALID信号。 当CRVALID被断言时,必须保持断言状态,直到从机断言CRREADY后的时钟上升沿。
从机使用CRREADY信号表示它接受响应。 CRREADY的默认状态可以为高,但前提是从机能够在开始侦听事务时立即接受侦听响应。
A3.6.3 侦听事务依赖
对于侦听通道上的事务,图 A3.7 显示了握手信号依赖关系。规则如下:
- A3.6.3.1 从机在断言ACVALID之前不得等待主机断言ACREADY。
- A3.6.3.2 主机可以在断言ACREADY之前等待ACVALID被断言。
- A3.6.3.3 主机可以在ACVALID被断言之前断言ACREADY。
- A3.6.3.4 主机必须等待ACVALID和ACREADY都被断言后才能断言CRVALID,以表示有效响应可用。
- A3.6.3.5 主机不得等待从机断言CRREADY后再断言CRVALID。
- A3.6.3.6 从机可以在断言CRREADY之前等待CRVALID被断言。
- A3.6.3.7 从机可以在CRVALID被断言之前断言CRREADY。
A第4章 事务
AXI协议使用事务在主机和从机之间进行通信。 所有事务包括请求和响应。
写和读事务也包括一个或多个数据传输。
本章描述了事务请求、响应和数据传输。它包含以下几个部分
A4.1 事务请求
AXI主机通过向从机发出请求来启动事务。 请求包括事务属性和第一次数据传输的地址。 如果事务包含多个数据传输,从机必须计算后续传输的地址。
事务不得跨越4KB地址边界,这防止了事务跨越两个从机之间的边界。 这也限制了从机必须支持的地址增量数量。
A4.1.1 大小属性
size表示每次数据传输中的最大字节数.
对于读取事务,size表示每次读取数据传输中必须有效的数据字节数.
对于写入事务,size表示允许活动的数据字节通道数,WSTRB 指示在每次传输中哪些字节是有效的。
size不得超过接口的数据宽度,这由DATA_WIDTH属性确定。
如果size小于DATA_WIDTH,则在每次传输中使用字节通道的一个子集。
size通过写请求和读请求通道上的AWSIZE和ARSIZE信号进行传达, 在本规范中,AxSIZE表示AWSIZE和ARSIZE。
表 A4.1 AxSIZE信号
信号 | 位宽 | 默认值 | 描述 |
---|---|---|---|
AWSIZEARSIZE | 3 | DATA_WIDTH/8 | 一个事务中每次传输的最大字节数 |
size通过AxSIZE信号进行编码,如 表 A4.2 所示。
AxSIZE | 标签 | 含义 |
---|---|---|
0b000 | 1 | 每次传输最多1Byte |
0b001 | 2 | 每次传输最多2Byte |
0b010 | 4 | 每次传输最多4Byte |
0b011 | 8 | 每次传输最多8Byte |
0b100 | 16 | 每次传输最多16Byte |
0b101 | 32 | 每次传输最多32Byte |
0b110 | 64 | 每次传输最多64Byte |
0b111 | 128 | 每次传输最多128Byte |
如 表 A4.3 所示,属性 SIZE_Present 用于确定 AxSIZE 信号是否存在。
表 A4.3 SIZE_Present 属性
SIZE_Present | 默认 | 描述 |
---|---|---|
True | Y | AWSIZE和ARSIZE存在 |
False | AWSIZE和ARSIZE不存在 |
一个只发出全数据宽度请求的主机可以从其接口中省略AxSIZE输出。 相应的从机必须根据数据宽度将其AxSIZE输入连接起来。
A4.1.2 长度属性
Length属性定义了事务中的数据传输次数。
Size x Length是一个事务中可以传输的最大字节数。如果地址未对齐或存在未使能的WSTRB,实际传输的字节数可能低于Size x Length。
主机必须根据Length发出写数据传输的数量。
从机必须根据Length发出读数据传输的数量。
Length通过写请求和读请求通道上的AWLEN和ARLEN信号进行通信。
在本规范中AxLEN表示AWLEN和ARLEN,如 表 A4.4 所示。
表 A4.4 AxLEN信号
信号 | 位宽 | 默认值 | 描述 |
---|---|---|---|
AWLEN ARLEN | 8 | 0x00 | 事务的传输数量,Length=AxLEN+1 |
属性 LEN_Present 用于确定信号是否存在,表 A4.5 显示了 LEN_Present 的合法值。
表 A4.5 LEN_Present属性
LEN_Present | 默认 | 描述 |
---|---|---|
True | Y | AWLEN和 ARLEN存在 |
False | AWLEN和 ARLEN不存在 |
一个只发出长度为1请求的主机可以从其接口中省略AxLEN输出。 相应的从机必须将其AxLEN输入连接到0x00。以下规则适用于事务长度:
- 对于wrap突发,长度可以是2、4、8或16。
- 对于固定突发,长度可以达到16。
- 事务不得跨越4KB地址边界。
- 不支持事务的提前终止。
没有组件可以提前终止事务。 然而,为了减少写事务中的数据传输次数,主机可以通过取消所有WSTRB的有效状态来禁用进一步的写入。 在这种情况下,主机必须完成事务中的其余传输。 在读取事务中,主机可以丢弃读取数据,但必须完成事务中的所有传输。
A4.1.3 事务的最大传输byte
一个事务的最大字节数为4KB,事务不允许跨越4KB边界。 然而,许多主机生成的事务可能始终小于此值。
一个从机或互连可能会从这些信息中受益。例如,一个从机可借此优化一些解码逻辑。 一个在小于4KB粒度下进行条带化的互连如果知道事务不会跨越条带边界,可能能够避免突发拆分。
属性Max_Transaction_Bytes定义了一个事务的最大字节数,如 表 A4.6 所示。
表 A4.6 Max_Transaction_Bytes 属性
名字 | 值 | 默认值 | 描述 |
---|---|---|---|
Max_Transaction_Bytes | 64,128,256,512,1024048,4096 | 4096 | 一个主机发起的事务大小与长度之积不得超过最大传输字节数,且传输不得跨越最大传输字节数的边界。 一个从机只能接受大小与长度之积不超过最大传输字节数的传输。 |
在连接主机和从机时,表 A4.7 指示了兼容的 Max_Transaction_Bytes 组合。
表 A4.7 Max_Transaction_Bytes 互联
主机 < 从机 | 主机 == 从机 | 主机 > 从机 |
---|---|---|
兼容 | 兼容 | 不兼容 |
A4.1.4 突发属性
Burst属性描述了在事务中传输之间地址的递增方式。有三种不同的Burst类型:
固定(FIXED)此Burst类型用于对同一位置的重复访问,例如在加载或清空FIFO时。
- 在Burst中的每次传输的地址都相同。
- 有效的字节通道对于所有传输都是恒定的。然而,在这些字节通道内,实际的WSTRB有效的字节在每次传输中可能不同。
- Burst的长度可以达到16次传输。
- 固定Burst类型仅可与WriteNoSnoop或ReadNoSnoop操作码一起使用。 有关更多信息,请参见 A第8章 请求操作码 。
增量(INCR)对于此Burst类型,每次传输的地址是前一次传输地址的递增。 递增值取决于事务的大小。例如,对于对齐的起始地址,事务中每次传输的地址是前一个地址加4。此Burst类型用于对正常顺序内存的访问。
回环(WRAP)
- 此Burst类型类似于增量,除了在达到上限地址时地址会回环到较低的地址。适用以下限制:
- 起始地址必须与每次传输的大小对齐。
- Burst的长度必须为2、4、8或16次传输。
- 回环事务的行为是:
- 事务访问的最低地址是与要传输的数据总大小对齐的起始地址,即Size x Length。此地址被定义为回环边界。
- 每次传输后,地址的递增方式与增量Burst相同。然而,如果这个递增的地址是((回环边界) + (Size x Length)),则地址会回环到回环边界。
- 事务中的第一次传输可以使用高于回环边界的地址,前提是遵守适用于回环事务的限制。 当第一次地址高于回环边界时,地址会回环。此Burst类型用于缓存行访问。
- 此Burst类型类似于增量,除了在达到上限地址时地址会回环到较低的地址。适用以下限制:
通过AWBURST和ARBURST信号分别在写请求和读请求通道上传达Burst。 在本规范中,AxBURST指示AWBURST和ARBURST。
表 A4.8 AxBURST信号
信号 | 位宽 | 默认值 | 描述 |
---|---|---|---|
AWBURST ARBURST | 2 | 0b01(INCR) | 描述了事务中传输之间地址递增方式 |
Burst在AxBURST信号上进行编码如 表 A4.9 所示。
表 A4.9 AxBURST编码
AxBURST | 标签 | 含义 |
---|---|---|
0b00 | FIXED | 固定突发 |
0b01 | INCR | 增量突发 |
0b10 | WRAP | 回环突发 |
0b11 | 保留 | - |
属性BURST_Present用于确定AxBURST信号是否存在。 只发出类型为INCR的Burst请求的主机可以从其接口中省略AxBURST输出。 相应的从机必须将其AxBURST输入连接到0b01。
表 A4.10 BURST_Present属性
BURST_Present | 默认值 | 描述 |
---|---|---|
True | Y | AWBURST和ARBURST存在 |
False | AWBURST和ARBURST不存在 |
一种突发类型的固定不常用属性,并在 表 A4.11 中定义了属性Fixed_Burst_Disable以指示组件是否支持它。
表 A4.11 Fixed_Burst_Disable属性
Fixed_Burst_Disable | 默认值 | 描述 |
---|---|---|
True | 突发类型为FIXED的请求不支持由从机生成,也不由主机生成 | |
False | Y | 突发类型为FIXED的请求支持由从机生成,或主机生成 |
根据 Fixed_Burst_Disable 属性的值,表 A4.12 显示了主机和从机之间的兼容性。
表 A4.12 Fixed_Burst_Disable 兼容性
Fixed_Burst_Disable | 从机:False | 从机True |
---|---|---|
主机:False | 兼容 | 不兼容 |
主机:True | 兼容 | 兼容 |
A4.1.5 传输地址
本节提供了在事务中确定传输的地址和字节通道的方法。事务的起始地址通过AxADDR信号指示。
表 A4.13 AxADDR信号
信号 | 位宽 | 默认值 | 描述 |
---|---|---|---|
AWADDR ARADDR | ADDR_WIDTH | − | 事务第一次传输的地址 |
属性ADDR_WIDTH用于定义地址宽度。
表 A4.14 ADDR_WIDTH属性
属性名 | 值 | 默认值 | 描述 |
---|---|---|---|
ADDR_WIDTH | 1…64 | 32 | AWADDR、ARADDR、ACADDR的地址 |
该协议支持具有不同物理地址空间大小的组件之间的通信。
具有不同物理地址空间大小的组件必须按如下方式进行通信
- 物理地址空间较小的组件必须位于较大物理地址空间中的对齐窗口内。 通常,窗口位于较大物理地址空间的底部。 但是,物理地址空间较小的组件可以位于较大物理地址空间中的偏移窗口内。
- 外部事务必须将所需的额外高位添加到事务地址中。
- 内部事务必须做以下检查:
- 在地址窗口内的事务去掉高位地址位并被传递。
- 不具有所需高位地址位的事务被抑制。
Note:高位地址位通常携带了用于选择存储器或I/O设备特定区域的信息。在计算机系统中,地址被分为高位和低位,高位地址线用于选择更大的地址范围或特定的存储区域,而低位地址线用于具体单元或设备的寻址.
提供所需功能是互联的责任
A4.1.6 事务方程
该文中列出的方程用于确定事务中每次传输的地址和活动数据字节通道。方程使用以下变量:
- Start_Addr:由主机发出的起始地址。
- Data_Bytes:数据通道的宽度(以字节为单位)(DATA_WIDTH/8)。
- Aligned_Addr:起始地址的对齐地址。
- Address_N:事务中传输N的地址。事务中第一次传输N的值为1。
- Wrap_Boundary:wrap突发事务中的回环边界地址。
- Lower_Byte_Lane:传输中最低寻址字节的字节通道。
- Upper_Byte_Lane:传输中最高寻址字节的字节通道。
- INT(x):对x向下取整的整数值。
这些方程确定突发内传输的地址:Start_Addr = AxADDR
Aligned_Addr = INT(Start_Addr / Size)* Size
该方程确定突发中第一次传输的地址:Address_1 = Start_Addr
对于INCR突发和地址未回环的WRAP突发,该方程确定突发中首次传输后的任何传输地址:Address_N = Aligned_Addr + (N - 1)* Size
对于WRAP突发,Wrap_Boundary变量定义回环边界:Wrap_Boundary = INT(Start_Addr / (Size x Length))* Size x Length
对于WRAP突发,如果Address_N = Wrap_Boundary + Size x Length,则:
- 对于当前传输使用该方程:
Address_N = Wrap_Boundary
- 对于任何后续传输使用该方程:
Address_N = Start_Addr + ((N - 1)* Size)- (Size x Length)
这些方程确定突发中第一次传输使用的字节通道:Lower_Byte_Lane = Start_Addr - (INT(Start_Addr/Data_Bytes)* Data_Bytes)
Upper_Byte_Lane = Aligned_Addr + (Size-1)- (INT(Start_Addr/Data_Bytes)* Data_Bytes)
这些方程确定突发中第一次传输之后所有传输使用的字节通道:Lower_Byte_Lane = Address_N - (INT(Address_N / Data_Bytes)* Data_Bytes)
Upper_Byte_Lane = Lower_Byte_Lane + Size - 1
数据传输在:DATA((8 x Upper_Byte_Lane)+ 7: (8 x Lower_Byte_Lane))
事务容器描述在该事务中可以访问的所有字节,如果地址对齐且触发信号得到确认:Container_Size = Size x Length
对于INCR突发:Container_Lower = Aligned_Addr
Container_Upper = Aligned_Addr + Container_Size
对于WRAP突发:Container_Lower = Wrap_Boundary
Container_Upper = Wrap_Boundary + Container_Size
A4.1.7 传输描述的伪代码
// DataTransfer()
// IsWrite is TRUE for a write, and FALSE for a read
DataTransfer(Start_Addr, Size, Length, Data_Bytes, Burst, IsWrite)
addr = Start_Addr; // Variable for current address
Aligned_Addr = (INT(addr/Size) x Size);
aligned = (Aligned_Addr == addr); // Check whether addr aligned to Size
Container_Size = Size x Length;
if Burst == WRAP then
Lower_Wrap_Boundary = (INT(addr/Container_Size) x Container_Size);
// addr must be aligned for a wrapping burst
Upper_Wrap_Boundary = Lower_Wrap_Boundary + Container_Size;
for n = 1 to Length
Lower_Byte_Lane = addr - (INT(addr/Data_Bytes) x Data_Bytes);
if aligned then
Upper_Byte_Lane = Lower_Byte_Lane + Size - 1
else
Upper_Byte_Lane = Aligned_Addr + Size - 1 - (INT(addr/Data_Bytes) x Data_Bytes);
// Perform data transfer
if IsWrite then
dwrite(addr, Lower_Byte_Lane, Upper_Byte_Lane)
else
dread(addr, Lower_Byte_Lane, Upper_Byte_Lane);
// Increment address if necessary
if Burst != FIXED then
if aligned then
addr = addr + Size;
if Burst == WRAP then
if addr >= Upper_Wrap_Boundary then
addr = Lower_Wrap_Boundary;
else
addr = Aligned_Addr + Size;
aligned = TRUE; // All transfers after the first are aligned
return;
A4.1.8 常规事务
事务有许多突发、大小和长度的选项。 然而,一些接口和事务类型可能只使用这些选项的一个子集。 如果一个从机连接到一个仅使用事务选项子集的主机,它可以设计为简化型解码逻辑。
Regular属性被定义为识别符合以下标准的事务:
- 长度为1、2、4、8或16次传输。
- 如果长度大于1,则大小与数据通道宽度相同。
- 突发为INCR或WRAP,而不是FIXED。
- 对于INCR事务,地址与事务容器对齐。
- 对于WRAP事务,地址与大小对齐。
Regular_Transactions_Only属性用于定义一个主机是否仅发出常规类型的事务, 以及一个从机是否仅支持常规事务。
表 A4.15 Regular_Transaction_Only属性
Regular_Transactions_Only | 默认 | 描述 |
---|---|---|
True | 只有常规事务被支持 | |
False | Y | 所有合法AxBURST、AxSIZE、AxLEN的组合都支持 |
常规事务的互操作性规则见 A4.16
表 A4.16 Regular_Transactions_Only互操作性
Regular_Transactions_Only | 从机:False | 从机:True |
---|---|---|
主机:False | 兼容 | 不兼容 如果主机发布的事务不是常规的,那么可能会发生数据损坏或死锁 |
主机:True | 兼容 | 兼容 |
A4.2 读写数据
本节描述了AXI写入和读取数据通道上不同大小的传输,以及接口如何执行混合字节序和非对齐传输。
A4.2.1 write strobes
WSTRB信号携带写使能信号,指定写数据通道的哪些字节通道包含有效的信息。
表 A4.17 WSTRB信号
信号 | 位宽 | 默认值 | 描述 |
---|---|---|---|
WSTRB | WDATA_WIDTH/8 | 全1 | 表明写事务中每次传输WDATA的哪些字节有效 |
每8位写数据通道都对应一位的WSTRB,因此WSTRB[n]对应于WDATA[(8n)+7:(8n)]。
当WVALID为高电平时:
- 要写入的数据字节与WSTRB信号相应的bit被设为高电平。
- 在事务容器内部,可以有任意数量的WSTRB信号bit为高电平。 如果所有WSTRB信号bit都为低电平,则该传输不写入任何数据。
- 在事务容器外部,所有WSTRB信号bit必须为低电平。
当WVALID为低电平时,WSTRB信号可以取任何值, 但建议将其保持在低电平或保持在之前的值上。
建议在WSTRB信号为低电平时,WDATA的字节通道设为零。
属性WSTRB_Present用于指示接口上是否存在WSTRB信号。
表 A4.18 WSTRB_Present属性
WSTRB_Present | 默认 | 描述 |
---|---|---|
True | Y | WSTRB存在 |
False | WSTRB不存在 |
一个只在所有WSTRB信号bit都被激活时发出事务的主机可以省略其接口中的WSTRB输出。 相应的从机必须将其WSTRB输入固定为高电平。
A4.2.2 窄传输
当主机生成的传输比其数据通道窄时,地址和控制信息决定了传输使用的字节通道:
- 当突发模式为INCR或WRAP时,事务中的每个数据传输使用不同的字节通道。
- 当突发模式为FIXED时,事务中的每个数据传输使用相同的字节通道。
字节通道使用的两个示例显示在 图 A4.1 和 图 A4.2 中。 阴影单元表示未传输的字节。 在 图 A4.1 中:
- 事务有五个数据传输。
- 起始地址为0。
- 每个传输为8位。
- 传输在32位数据通道上进行。
- 突发类型为INC。
在 图 A4.2 中
- 该事务有三个数据传输。
- 起始地址是4。
- 每个传输为32位。
- 传输在64位数据通道上。
- 突发类型是INCR。
A4.2.3 字节不变性
为了在单一内存空间中访问混合字节序的数据结构,AXI协议使用了字节不变的字节序方案。
字节不变的字节序意味着在数据结构中的任何多字节元素:
- 元素使用相同的连续内存字节,与数据的字节序无关。
- 字节序决定了内存中这些字节的顺序,这意味着它决定了内存中的第一个字节是元素的最高有效字节(MSB)还是最低有效字节(LSB)。
- 任何字节传输到一个地址时,会将8位数据通过相同的数据通道线传输到相同的地址位置,无论它所属的较大数据元素的字节序如何。
只有一种传输宽度的组件必须将其字节通道连接到数据通道的适当字节通道。 支持多种传输宽度的组件可能需要更复杂的接口来转换不是自然字节不变的接口。
大多数小端组件可以直接连接到字节不变接口。 仅支持大端传输的组件需要一个转换函数以实现字节不变操作。
图 A4.3 和 图 A4.4 中的示例显示了一个32位数字0x0A0B0C0D, 存储在寄存器和内存中。
在 图 A4.3 中,有一个大端字节不变数据结构的示例,在该结构中:
- 数据的最高有效字节(MSB),即0x0A,存储在寄存器的最高有效字节位置。
- 数据的最高有效字节(MSB),存储在最低地址的内存位置。
- 其他数据字节按重要性递减顺序排列。
在 图 A4.4 中,有一个小端字节不变数据结构的示例在这个结构中:
- 数据的最低有效位(LSB),即0x0D,存储在寄存器的最低有效位位置。
- 数据的最低有效位(LSM),存储在地址最低的内存位置。
- 其他数据字节按重要性递增的顺序排列。
图 A4.3 和 图 A4.4 中的示例显示了 字节不变性确保大端和小端结构可以在单一内存空间中共存且不会出现损坏。
图 A4.5 中有一个需要字节不变访问的数据结构示例,在这个示例中标头字段使用小端排序而有效负载使用大端排序。
在这个示例结构中,Data items是一个两字节的小端元素,这意味着其最低地址是最低有效位。 字节不变量的使用确保了大端对负载的访问不会破坏小端元素。
A4.2.4 不对齐传输
AXI支持非对齐传输。 对于由超过1kB的数据传输组成的任何事务,初始访问的字节可能与自然地址边界不对齐。 例如开始于字节地址0x1002的32位数据包未对齐到自然32位地址边界,
主机可以:
- 使用低位地址线来表示非对齐的起始地址.
- 提供对齐地址并使用字节行strobes来表示非对齐的起始地址。
低位地址线上的信息必须与字节行strobes上的信息一致。
从机不需要基于主机提供的任何对齐信息采取特殊行动。
图 A4.6 显示了32位数据通道上对齐和非对齐32位事务的示例。 图中的每一行表示一次传输并且阴影单元表示未传输的字节。
在 图 A4.7 中,有一些在64位数据通道上对齐和未对齐的32位事务示例。 图中每一行代表一次传输,阴影单元格表示未传输的字节。
在 图 A4.8 中有一个在64位数据通道上对齐的32位回环事务的示例。 图中的每一行表示一个传输,阴影的单元格表示未传输的字节。
A4.3 事务响应
每个AXI事务都包括一个或多个由从机发送的响应传输,以指示事务的结果。
写通道上的事务有一个或多个写响应。
读通道上的事务有一个或多个读响应。
原子事务有写和读响应,请参见 A7.4 原子事务 。
A4.3.1 写响应
写响应通过写响应通道上的BRESP信号进行传输。 写通道上的所有事务都有一个完成响应,它指示事务的结果。 一些事务还有第二个写响应,例如指示持久性。 参见 A10.8.4 B通道上的PCMO响应 。
BRESP和BCOMP信号用于发送写响应。
表 A4.19 BRESP 和 BCOMP信号
信号名 | 位宽 | 默认值 | 描述 |
---|---|---|---|
BRESP | BRESP_WIDTH | 0b00(OKAY) | 写通道的事务响应 |
BCOMP | 1 | 0b1 | 断言为高,表明完成响应 |
BRESP_WIDTH属性在 表 A4.20 中有显示。
表 A4.20 BRESP_WIDTH属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
BRESP_WIDTH | 0,2,3 | 2 | BRESP的位宽。 如果是下列情况,则必须是3: Untranslated_Transactions = v2 Untranslated_Transactions =v3 WriteDeferrable_Transaction = True |
BRESP是一个可选信号。如果BRESP_WIDTH属性为0,则该信号不存在,并被假定为0b000(OKAY)。
只有在接口使用可以具有两个写响应的特性时,BCOMP才会出现,这些特性包括:
- 持久性的缓存维护,参见 A10.8 持久性CMOs 。
- 内存标签,参见 A13.2 内存标签扩展 。
如果BCOMP存在,则必须在写通道每个事务的响应传输中被断言。
BRESP编码见 表 A4.21 。
表 A4.21 BRESP编码
BRESP | 标签 | 含义 |
---|---|---|
0b00 | OKAY | 非独占写入:事务成功。如果事务包含写入数据,则更新的值是可观察的。 独占写入:更新位置失败 |
0n001 | EXOKAY | 独占写入:事务成功。只允许在独占写中使用。 |
0b010 | SLVERR | 存在于请求已到达终点但未成功完成。 位置可能未完全更新,通常在从机中存在问题时使用,例如尝试访问只读或已断电的功能。 |
0b011 | DECERR | 存在于请求尚未达到可以写入数据的阶段。 位置可能尚未完全更新。通常在地址解码为无效地址时使用 |
0b100 | DEFER | 写入未成功,因为此时无法提供服务。 位置未更新。此响应仅适用于可延迟写入事务(WriteDeferrable)。 |
0b101 | TRANSFAULT | 事务因转换错误而终止,该错误可能通过PRI请求来解决。 |
0b110 | RESERVED | - |
0b111 | UNSUPPORTED | 写入不成功,因为目标不支持该事务类型。位置未更新。此响应仅允许用于可延迟写入的事务(WriteDeferrable)。 |
A4.3.2 读响应
读取响应指示读取是否成功以及该传输中的数据是否有效。
读取响应通过读取数据通道上的RRESP信号传输,在事务中的每次读取数据传输都有一个读取响应。 响应值不要求在事务中的每次读取数据传输中都相同。
需要注意的是所有数据传输都应按长度指示始终完成而不考虑响应。 对于某些响应,该传输中的数据不要求有效。
RRESP信号的定义如表 表 A4.22 所示。
表 A4.22 RRESP信号
信号名 | 位宽 | 默认值 | 描述 |
---|---|---|---|
RRESP | RRESP_WIDTH | 0b00(OKAY) | 读通道的事务响应。 RVALID断言时RRESP必须有效。 |
RRESP_WIDTH属性在 表 A4.23 中显示。
表 A4.23 RRESP_WIDTH属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
RRESP_WIDTH | 0,2,3 | 2 | RRESP的位宽。 如果是下列情况,则必须是3: Prefetch_Transaction = True Untranslated_Transactions = v2 Untranslated_Transactions =v3 Shareable_Cache_Support = True |
RRESP是一个可选信号。 如果RRESP_WIDTH属性为0,则该信号不存在,并假定为0b000(OKAY)。 RRESP的编码如 表 A4.24 所示。
对于数据不要求有效的响应,主机可能仍会采样RDATA值,因此从机不应依赖响应来隐藏敏感数据。
表 A4.24 RRESP编码
RRESP | 标签 | 含义 |
---|---|---|
0b00 | OKAY | 非独占读取:事务成功。读取数据有效。 独占读取:从机不支持独占访问 |
0n001 | EXOKAY | 独占读取:事务成功。只允许在独占读中使用。 |
0b010 | SLVERR | 事务遇到了一个包含的错误,仅此位置受影响。 通常在从机中出现问题时使用,例如FIFO溢出、不支持的传输大小或尝试访问已断电的功能。 读取数据无效 |
0b011 | DECERR | 事务已遇到未包含的错误,其他位置可能会受到影响。 通常用于地址解码到无效地址。 读取数据无效 |
0b100 | PREFETCHED | 来自预取的读取值有效。 |
0b101 | TRANSFAULT | 事务因转换错误而终止,该错误可能通过PRI请求来解决。 |
0b110 | OKAYDIRTY | 读取数据有效且相对于内存中的值是脏的。 仅允许响应ReadShared请求 |
0b111 | RESERVED | - |
RRESP的值并不限制在每次传输中都相同。 当访问从机出现问题时,通常会使用 DECERR 响应。 且在这种情况下,DECERR 在每次读取数据的传输中都会一致地发出信号。
如果主机可以检查一次读取数据传输以确定是否发生了, DECERR 可能会有效。
Consistent_DECERR 属性用于定义从机在一个事务中是否一致地发出 DECERR 信号,如表 A4.25 所示。
表 A4.25 Consistent_DECERR 属性
Consistent_DECERR | 默认 | 描述 |
---|---|---|
True | DECERR信号在每个读取数据传输或每个缓存行数据中没有读取数据传输时发出。 比如,跨越缓存行边界的事务可以在一个缓存行的每个读取数据传输中收到DECERR响应,而在下一个缓存行中没有数据传输。 | |
False | Y | DECERR 可能在任意数量的读数据传输中被触发。 |
从机不使用DECERR响应的可以将Consistent_DECERR属性设置为真。
将Consistent_DECERR设置为真的主机可以检查一次数据传输以确定是否发生了DECERR。
当在AXI和CHI之间桥接时将此属性设置为真可以有用的,因为DECERR会转换为非数据错误。
在连接主机和从机时 表 A4.26 显示了兼容的Consistent_DECERR组合。
表 A4.26 Consistent_DECERR 互操作性
Consistent_DECERR | 从机:False | 从机:True |
---|---|---|
主机:False | 兼容 | 兼容 |
主机:True | 不兼容 主机可能会错过DECERR响应。 | 兼容 |
A4.3.3 从机繁忙标志
当提供响应时,从机可以使用繁忙标志来表明其当前的活动水平。 这些信息可以用来控制主机的发出速率或它产生的推测性事务的数量。
繁忙标志对于有共享资源的组件是有用的, 比如内存控制器或系统缓存。例如,繁忙指示可以表示:
- 共享队列的繁忙状态。
- 读取或写入请求队列的繁忙状态,取决于事务的方向。
- 当组件对资源的使用超过或少于其分配值。
如 表 A4.27 所示,Busy_Support属性用于定义接口是否包含繁忙标志信号。
表 A4.27 Busy_Support属性
BUSY_Support | 默认值 | 描述 |
---|---|---|
True | 从机繁忙支持 | |
False | Y | 从机繁忙不支持 |
当 Busy_Support 为 True 时,表 A28 以下信号将包含在接口上。
表 A28 繁忙标志信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
BBUSY RBUSY | 2 | 0b00 | 指示在事务响应中从机操作的当前状态,随着从机变得越来越忙 该值会增加 |
对于具有多个读取数据传输的事务,Busy必须有效,但每次传输可以有不同的值。
对于具有多个写入响应的事务,在BCOMP断言的响应中,Busy必须有效。 对于其他写入响应,Busy不适用时可以取任何值。
对于具有写入和读取响应的原子事务,BBUSY和RBUSY预计但不要求具有相同的值。
Busy标志值的具体使用方式是实现定义的,在 表 A4.29 中有展示了使用它的示例。 在这个示例中,如果从机无法生成动态繁忙标志,则默认值0b01是适当的。
表 A29 繁忙标志的使用例子
繁忙标志 | 含义 | 主机行为 |
---|---|---|
0b00 | 不繁忙 | 增加请求 |
0b01 | 稍微忙 | 无动作 |
0b10 | 有点忙 | 减少请求 |
0b11 | 特别忙 | 大幅度减少请求 |
A4.30 Busy_Support 互操作性
Busy_Support | 从机:False | 从机:True |
---|---|---|
主机:False | 兼容 | 兼容 繁忙输出不连接 |
主机:True | 兼容 繁忙输入连接到默认值 | 兼容 |
A第5章 请求属性
本章描述了请求属性以及下游组件如何对其进行处理。它包含以下部分:
A5.1 从机类型
从机被分类为内存从机或外设从机:
内存从机: 内存从机需要正确处理所有事务类型。
外设从机: 外设从机有一个 IMPLEMENTATION DEFINED 的访问方法。 通常访问方法在组件数据表中定义,该表描述了从机正确处理的事务类型。
任何不是 IMPLEMENTATION DEFINED 访问方法一部分的外设从机,其访问必须完成,并遵循协议。 然而,当这样的访问已被进行时,不要求外设从机继续正常操作。 只要求从机在协议合规的方式下继续完成进一步的事务。
A5.2 内存属性
本节描述了决定系统组件如缓存、缓冲区和内存控制器应如何处理请求的属性。 AWCACHE和ARCACHE信号指定了请求的内存属性。 它们控制:
- 事务如何在系统中进行。
- 任意系统级缓冲区和缓存如何处理事务。
在本规范中,术语AxCACHE统称为AWCACHE和ARCACHE信号。 表 A5.1 描述了AWCACHE和ARCACHE信号。
表 A5.1 AxCACHE信号
信号名 | 位宽 | 默认值 | 描述 |
---|---|---|---|
AWCACHE ARCACHE | 4 | 0x0 | 请求的内存属性控制事务在系统中的进展以及缓存和缓冲区如何处理该请求 |
属性CACHE_Present用于确定接口上是否存在AxCACHE信号。
表 A5.2 CACHE_Present属性
CACHE_Present | 默认值 | 描述 |
---|---|---|
True | Y | AWCACHE和ARCACHE存在 |
False | AWCACHE和ARCACHE不存在 |
AWCACHE位被编码为:
- [0] 可缓冲
- [1] 可修改
- [2] 其他分配
- [3] 分配
ARCACHE位被编码为:
- [0] 可缓冲
- [1] 可修改
- [2] 分配
- [3] 其他分配
请注意,分配和其他分配位在读请求和写请求中的位置不同。
A5.2.1 可缓冲-AxCACHE[0]
对于写入事务:
- 如果可缓冲位被解除断言,则写入响应表示数据已到达最终目的地。
- 如果可缓冲位被断言,则写入响应可以在满足可观察性要求时从中间点发送。
对于 ARCACHE[3:2] 被解除断言(不可缓存)且 ARCACHE[1] 被断言(可修改)的读取事务:
- 如果可缓冲位被解除断言,则读取的数据必须从最终目的地获取。
- 如果可缓冲位被断言,则读取的数据可以从最终目的地或从正在传输到最终目的地的写入中获取。
对于 ARCACHE[3:1] 的其他组合,可缓冲位无效。
A5.2.2 可修改-AxCACHE[1]
事务可以被修改。当AxCACHE[1]解除断言时,事务是不可修改的。 以下部分描述了不可修改和可修改事务的属性。
不可修改事务
不可将其拆分为多个事务或与其他事务合并。 在不可修改事务中,表 A5.3 中显示的参数不得更改。
表 A5.3 不可修改的参数
参数 | 信号 |
---|---|
地址属性 | AxADDR AxREGION |
大小属性 | AxSIZE |
长度属性 | AxLEN |
突发属性 | AxBURST |
保护属性 | AxPROT AxNSE |
AxCACHE属性只能修改以将事务从可缓冲转换为不可缓冲。对AxCACHE的其他更改是不允许的。
事务ID和QoS值可以被修改。
长度大于16的不可修改事务可以分割成多个事务。 每个生成的事务必须满足本小节中给出的要求,但不可避免的带来一些改变,
- 长度减少。
- 地址要做相应的调整。
AxLOCK断言指定的独占访问不可修改事务,可以修改大小AxSIZE和长度AxLEN, 前提是总访问的字节数保持不变。
存在一些情况,无法满足不可修改事务的要求。 例如,当缩小到宽度小于大小要求的数据时,事务必须被修改。
执行该操作的组件可以选择性地包括 IMPLEMENTATION DEFINED 的机制,以指示已发生修改。 这种机制可以帮助软件调试。
可修改事务
可修改事务可以通过以下方式进行修改:
- 事务可以被分解为多个事务。
- 多个事务可以合并为一个事务。
- 读取事务可以获取比所需更多的数据。
- 写入事务可以访问比所需更大的地址范围,使用WSTRB信号确保只有适当的位置被更新。
- 在每个生成的事务中,可以修改以下属性:
- 地址属性,AxADDR
- 大小属性,AxSIZE
- 长度属性,AxLEN
- 突发属性,AxBURST
以下内容不得更改:
- 独占访问指示符,AxLOCK
- 保护和安全属性,AxPROT和AxNSE。
AxCACHE可以修改,但任何修改必须确保不减少其他组件对事务的可见性, 既不能阻止事务传播到所需位置,也不能更改在缓存中查找事务的需求。 对内存属性的所有修改必须对同一地址范围内的所有事务保持一致。
事务ID和QoS值可以被修改。
不允许的事务修改包括:
- 导致访问与原始事务不同的4KB地址空间。
- 导致对单一拷贝原子性大小区域的单个访问被执行为多个访问。见 A7.1 单副本原子大小
A5.2.3 分配和其他分配-AxCACHE[3:2]
如果分配位被断言:
- 数据可能先前已被分配,因此必须在缓存中查找该行。
- 建议将数据分配到缓存中以供将来使用。
如果其他分配位被断言:
- 数据可能先前已被分配,因此必须在缓存中查找该行。
- 不建议对数据进行分配,因为预计不会再次访问。
如果分配和其他分配都未断言,则请求不需要在任何缓存中查找。
A5.3 内存类型
AxCACHE信号的组合指示了一种内存类型。 A5.4 显示了内存类型编码。 括号中的值是允许的但不是首选的,表中未显示的值是保留的。
表 A5.4 内存类型编码
ARCACHE[3:0] | AWCACHE[3:0] | Memory type |
---|---|---|
0b0000 | 0b0000 | A设备非缓冲 Device Non-bufferable |
0b0001 | 0b0001 | A设备可缓冲 Device Bufferable |
0b0010 | 0b0010 | A正常非缓存非缓冲 Normal Non-cacheable Non-bufferable |
0b0011 | 0b0011 | A正常非缓存可缓冲 Normal Non-cacheable Bufferable |
0b1010 | 0b0110 | A写直通不分配 Write-Through No-Allocate |
0b1110(0b0110) | 0b0110 | A写直通读分配 Write-Through Read-Allocate |
0b1010 | 0b1110(0b1010) | A写直通写分配 Write-Through Write-Allocate |
0b1110 | 0b1110 | A写直通读写分配 Write-Through Read and Write-Allocate |
0b1011 | 0b0111 | A写回不分配 Write-Back No-Allocate |
0b1111(0b0111) | 0b0111 | A写回读分配 Write-Back Read-Allocate |
0b1011 | 0b1111(0b1011) | A写回写分配 Write-Back Write-Allocate |
0b1111 | 0b1111 | A写回读写分配 Write-Back Read and Write-Allocate |
A5.3.1 内存类型需求
本节规定了各类内存的必要行为。
A设备非缓冲设备非缓冲内存的必要行为是:
- 写操作的响应必须从最终目的地获得。
- 读取的数据必须从最终目的地获得。
- 事务是不可修改的,请参见 a5.2.2 可修改-AxCACHE[1] 。
- 读取的数据不得预取。
- 写事务不得合并。
A设备可缓冲设备缓冲内存类型的必要行为是:
- 写操作的响应可以从中间点获得。
- 写事务必须在最终目的地及时可见。
- 读取的数据必须从最终目的地获得。
- 事务是不可修改的,请参见。
- 读取的数据不得预取。
- 写事务不得合并。
这两种设备内存类型都是不可修改的。在本规范中,设备内存和不可修改内存这两个术语是可以互换的。
对于读取事务,设备非缓冲和设备缓冲内存类型的必要行为没有区别。
A正常非缓存非缓冲正常非缓存非缓冲内存类型的必要行为是:
- 写操作的响应必须从最终目的地获得。
- 读取的数据必须从最终目的地获得。
- 事务是可修改的,请参见 a5.2.2 可修改-AxCACHE[1] 。
- 写事务可以合并。
A正常非缓存可缓冲正常非缓存缓冲内存类型的必要行为是:
- 写操作的响应可以从中间点获得。
- 写事务必须在最终目的地及时可见,具体定义见 c第1章 术语表 。 没有机制可以确定写事务何时在最终目的地可见。
- 读取的数据必须从以下任一来源获得:
- 最终目的地。
- 正在进行的写事务,目标是最终目的地。
- 如果从写事务获得读取数据:
- 必须从写的最新版本获得。
- 数据不得被缓存,用于服务于后续的读取。
- 事务是可修改的,请参见 a5.2.2 可修改-AxCACHE[1] 。
- 写事务可以合并。
对于正常非缓存可缓冲读取,数据可以从仍在进行中的写事务中获得,目标是最终目的地。 这些数据与同时传播到最终目的地的读取和写入事务无法区分。 以这种方式返回的读取数据并不表示写事务在最终目的地可见。
A写直通不分配写直通不分配内存类型的必要行为是:
- 写操作的响应可以从中间点获得。
- 写事务必须在最终目的地及时可见,具体定义见 C第1章 术语表 。 没有机制可以确定写事务何时在最终目的地可见。
- 读取数据可以从中间缓存副本获得。
- 事务是可修改的,请参见 a5.2.2 可修改-AxCACHE[1] 。
- 读取数据可以预取。
A写直通读分配写透读取分配内存类型的必要行为与写透不分配内存相同。出于性能原因:
- 建议分配读取事务。
- 不建议分配写事务。
A写直通写分配透写分配内存类型的必要行为与写透不分配内存相同。出于性能原因:
- 不建议分配读取事务。
- 建议分配写事务。
A写直通读写分配写直通读写分配内存类型的必要行为与写直通不分配内存相同。出于性能原因:
- 建议分配读取事务。
- 建议分配写事务。
A写回不分配写回不分配内存类型的必要行为是:
- 写操作的响应可以从中间点获得。
- 写事务不要求在最终目的地可见。
- 读取数据可以从中间缓存副本获得。
- 事务是可修改的,请参见 a5.2.2 可修改-AxCACHE[1] 。
- 读取数据可以预取。
- 写事务可以合并。
- 读取和写入事务需要进行缓存查找。
- 不分配属性是一个分配提示,即它是向内存系统推荐的,出于性能原因,这些事务不会被分配。然而,读取和写入事务的分配并不被禁止。
A写回读分配写回读取分配内存类型的必要行为与写回不分配内存相同。出于性能原因:
- 建议分配读取事务。
- 不建议分配写事务。
A写回写分配写回写分配内存类型的必要行为与写回不分配内存相同。出于性能原因:
- 不建议分配读取事务。
- 建议分配写事务。
A写回读写分配写回读写分配内存类型的必要行为与写回不分配内存相同。出于性能原因:
- 建议分配读取事务。
- 建议分配写事务。
A5.3.2 内存属性不匹配
多个访问同一内存区域的主机可以使用不匹配的内存属性。 但是,为了功能正确性,必须遵循以下规则:
- 访问同一区域内存的所有主机在任何层次结构中必须对该区域内存的缓存性有一致的视图。适用的规则是:
- 如果地址区域是不可缓存的,则所有主机必须使用AxCACHE[3:2]都未断言的事务。
- 如果地址区域是可缓存的,则所有主机必须使用AxCACHE[3:2]的任何一个断言的事务。
- 不同的主机可以使用不同的分配提示。
- 如果一个地址区域是正常的不可缓存,任何主机都可以使用设备内存事务访问它。
- 如果一个地址区域具有可缓冲属性,任何主机都可以使用不允许缓冲行为的事务访问它。例如,要求从最终目的地响应的事务不允许缓冲行为。
A5.3.3 改变内存属性
特定内存区域的属性可以从一种类型更改为另一种不兼容的类型。 例如,可以将属性从写直通缓存可用更改为普通不可缓存。 这一变化需要适当的过程来执行更改。
通常,执行以下过程:
- 所有主机停止访问该区域。
- 一个主机执行任何必要的缓存维护操作。
- 所有主机重新开始访问内存区域,使用新的属性。
A5.3.4 事务缓冲
写入对以下内存类型的访问不需要最终目的地的事务响应,但确实需要确保写入事务及时在最终目的地可见:
- 设备可缓冲。
- 普通非缓存可缓冲。
- 写直通。
对于写入事务,这三种内存类型要求相同的行为。
对于读取事务,所需行为如下:
- 对于设备可缓冲内存,读取的数据必须从最终目的地获得。
- 对于普通非缓存可缓冲内存,读取的数据必须从最终目的地获得,或者从正在前往其最终目的地的写入事务中获得。
- 对于写直通内存,读取的数据可以从中间缓存副本中获得。
除了确保写入事务及时向其最终目的地产生进展之外,中间缓冲区必须表现如下:
- 一个可以响应事务的中间缓冲区必须确保随着时间的推移,任何对普通非缓存可缓冲内存的读取事务都向其目的地传播。 这种传播意味着在转发读取事务时,尝试的转发不能无限期继续,且用于转发的数据不能无限期存在。 协议未定义任何确定用于转发读取事务的数据能够存在多久的机制。但是,在这样的机制中,读取数据的行为不能重置数据超时期限。如果没有这一要求,持续对同一位置的轮询可能会阻止保存在缓冲区中的读取的超时,从而阻止读取向其目的地的进展。
- 一个可以持有和合并写入事务的中间缓冲区必须确保事务不会无限期保留在其缓冲区中。 例如,合并写入事务不得重置确定写入何时向其最终目的地排出的机制。如果没有这一要求,持续向同一位置写入可能会阻止保存在缓冲区中的写入的超时,从而阻止写入向其目的地的进展。
有关对这些内存类型的读取访问所需行为的信息,请参见:
A5.3.5 设备内存实例
该规范支持设备非缓冲和设备缓冲内存类型的组合使用,以强制写入事务到达其最终目的地,并确保发起的主机知道事务何时对所有其他主机可见。
标记为设备缓冲的写入事务必须及时地到达其最终目的地。 然而,该事务的写入响应可以由一个中间缓冲区发出信号。 因此,发起的主机无法知道写入何时对所有其他主机可见。
如果主机发起了一个设备缓冲写入事务,或一系列写入事务,随后是一个设备非缓冲写入事务,并且所有事务使用相同的AXI ID, 则AXI排序要求强制所有设备缓冲写入事务在设备非缓冲事务给予响应之前到达最终目的地。 因此,设备非缓冲事务的响应表明所有事务对所有主机可见。
A5.4 协议错误
AXI协议定义了两类协议错误,软件协议错误和硬件协议错误。
A5.4.1 软件协议错误
软件协议错误发生在多个访问同一位置时,访问的共享性或缓存属性不匹配。 软件协议错误可能导致一致性丧失,并导致数据值损坏。 该协议要求系统在出现软件协议错误时不发生死锁,并且事务始终在系统中进行推进。
对一个4KB内存区域的访问导致的软件协议错误不得在另一个4KB内存区域造成数据损坏。 对于保存在正常内存中的位置,可以使用适当的软件屏障和缓存维护将内存位置恢复到定义状态。
在访问外设时,如果使用可修改事务(AxCACHE[1]被断言),则无法保证外设的正常操作。 唯一的要求是外设继续以遵循协议的方式响应事务。 将一个错误访问的外设恢复到已知工作状态所需的事件序列是实现定义的。
A5.4.2 硬件协议错误
硬件协议错误被定义为任何不是软件协议错误的协议错误。 硬件协议错误不需要支持。
如果发生硬件协议错误,则无法保证从错误中恢复。系统可能会崩溃、锁死或遭遇其他不可恢复的故障。
A5.5 内存保护和领域管理扩展
AXI提供可以用来保护内存免受意外事务的信号。
通过领域管理扩展(RME),内存保护也可以被扩展。 它提供基于硬件的隔离,允许执行上下文在不同的安全状态下运行并共享系统中的资源。
当使用RME时,它扩展了物理寻址和未转换事务的地址空间,影响缓存维护操作的运行并扩展了MPAM信号。 保护信号如 表 A5.5 所示
表 A5.5 保护信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWPORT ARPROT | 3 | − | 请求的访问属性可用于保护内存免受意外事务。 |
AWNSE ARNSE | 1 | 0b0 | 扩展的物理地址空间包含Root和Realm两种。 |
属性PROT_Present用于确定接口上是否存在AxPROT信号。 一个不使用保护属性的从机可以从其接口中省略AxPROT输入。
表 A5.6 PROT_Present属性
PROT_Present | 默认 | 描述 |
---|---|---|
True | Y | AWPROT和ARPROT 都存在 |
False | AWPROT和ARPROT 都不存在 |
当使用RME时,RME_Support属性被设置为True,并且AxNSE信号出现在一个接口上。
表 A5.7 RME_Support属性
RME_Support | 默认 | 描述 |
---|---|---|
True | RME支持。 所有RME信号都出现在接口上。 | |
False | Y | RME不支持。 所有RME讯号都不出现在接口上。 |
保护属性分为三个部分:
非特权与特权
AXI主机可能支持多于一个级别的操作特权,并且可以选择性地将这一特权概念扩展到内存访问。
AxPROT[0]将访问标记为非特权或特权:
- 0b0:非特权
- 0b1:特权
某些主机支持多个特权级别,请参阅所选处理器的文档以确定与AXI特权级别的映射。 AXI提供的唯一区分是特权和非特权访问之间的区分。
安全与非安全
如果AXI主机支持不同的安全操作状态,它可以将其扩展到内存访问中,使用安全属性。 具有不同安全属性的请求可以被视为占用不同的地址空间,因此同一地址可以根据安全属性解码到不同的位置。
- 0b0: 安全
- 0b1:非安全
AxPROT[1]和AxNSE信号用于定义安全属性,如 表 A5.8 所示。
表 A5.8 安全属性
AxNSE | AxPROT[1] | 安全属性 |
---|---|---|
0 | 0 | Secure |
0 | 1 | Non-secure |
1 | 0 | Root |
1 | 1 | Realm |
数据与指令
AxPROT[2]表示事务是指令访问或数据访问:
- 0b0: 数据访问
- 0b1: 指令访问
AXI协议将此指示定义为提示。在所有情况下它并不一定准确。 例如,当一个事务包含指令和数据项的混合时。建议在访问被确定为指令访问之前,主机将AxPROT[2]设置为LOW以指示数据访问。
A5.6 内存加密上下文
内存加密上下文(MEC)是对Arm域管理扩展(RME)的扩展,允许每个域拥有其独特的加密上下文。
MEC扩展将内存加密上下文分配给域物理地址空间内的所有内存访问。 所有内存事务都与一个MECID相关,该ID由安全状态、转换方案、转换表和MEC系统寄存器决定。 MECID被内存加密引擎用作加密上下文表(无论是密钥还是变更)的索引,这些上下文有助于外部内存加密。
使用MEC可以通过使每组域数据采用不同的加密方式来帮助保护内存中的域数据。 这意味着,能够访问物理内存设备并能够解密一组域数据的恶意主机,无法使用相同的解密方法来访问其他组域数据。 在加密点(PoE)之前,在组件之间移动的数据是明文形式。
R-EL2上的域管理软件控制MECID的策略和分配给域的信息。
请注意,MEC架构规范 [3] 详细说明了MECID值不匹配时的几种实现选项。 此MEC实现假设主机和缓存不执行任何MECID检查。
例如,如果与一个MECID相关的读取访问目标位置在缓存中有一个副本并且与不同的MECID相关,那么读取访问就会成功,好像MECID值没有不匹配一样。 这里不需要额外的保护,因为R-EL2上的域管理软件确保一个上下文无法访问属于不同上下文的位置,从而确保不会发生明文泄漏。
A5.6.1 MEC信号
MEC_Support属性确定接口是否支持内存加密上下文MEC。
表 A5.9 MEC_Support属性
MEC_Support | 默认 | 描述 |
---|---|---|
True | MEC支持。 AxMECID信号存在。 | |
False | Y | MEC不支持。 AxMECID信号不存在。 |
MEC是RME的扩展,因此如果RME_Support属性为False,则MEC_Support必须为False。
表 A5.10 中信号是支持MEC所必需的。
表 A5.10 MECID信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWMECID ARMECID | MECID_WIDTH | 全0 | RME内存加密上下文ID |
参数MECID_WIDTH定义了宽度。
表 A4.11 MECID_WIDTH属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
MECID_WIDTH | 0…16 | 0 | AxMECID的位宽。 |
以下规则适用于MECID_WIDTH属性:
- 如果MECID_WIDTH为0,则AWMECID和ARMECID不在接口上。
- 如果MEC_Support为False,则MECID_WIDTH必须为0。
- 如果MEC_Support为True,则MECID_WIDTH必须不为0。
Note:注意MECID的宽度并不表示组件使用了多少不同的值。通过使用更窄的内部宽度,可能可以减少MECID的存储需求。
如果两个组件之间的MECID位宽不同,可以进行零扩展或截去高位,具体取决于情况。 此调整仅在将公共MECID宽度设置为系统中任何MEC兼容组件支持的最小MECID宽度时,才能产生正确的MEC操作。
根据MEC_Support属性的值,主机和从机之间的兼容性如 表 A5.12 所示。
表 A5.12 MEC_Support兼容性
MEC_Support | 从机:False | 从机:True |
---|---|---|
主机:False | 兼容 | 兼容。 AxMECID输入连接为LOW |
从机:True | 兼容。 下游内存使用MEC未加密。 | 兼容 |
A5.6.2 MECID使用
MECID值范围是有界的,依赖于被访问的物理地址空间。
表 A5.13 在每个物理地址空间可能的MECID
AxNSE | AxPROT[1] | 物理地址空间 | MECID |
---|---|---|---|
0b0 | 0b0 | Secure | 必须为0 |
0b0 | 0b1 | Non-secure | 必须为0 |
0b1 | 0b0 | Root | 必须为0 |
0b1 | 0b1 | Realm | 任何值 |
MECID 不适用,并且对于以下请求操作码可以取任何值:
- CMO
- CleanInvalid
- MakeInvalid
- CleanShared
- CleanSharedPersist
- InvalidateHint
- StashTranslation
- UnstashTranslation
MECID 不适用,且对于以下请求操作码必须为 0:
- DVM Complete
传播事务并在其从机和主机上支持 MECID 的组件必须在适用请求中保留 MECID。 执行地址转换的组件可能会更改 MECID。
存储与 MECID 关联数据的高速缓存必须也存储 MECID,并在写回时与数据一同提供。
可以使用 CleanInvalidPoPA 操作来确保从加密点上游的所有缓存中清理并使缓存行失效。 有关 CleanInvalidPoPA 的更多信息,请参见 <a href="#a10.9 缓存维护和rme>A10.9 缓存维护和RME 。
A5.7 多区域接口
本节描述了在请求中使用区域ID的方式,以支持单个接口中具有多个地址区域的接口。
A5.7.1 区域ID信号
属性 REGION_Present 决定接口是否支持区域ID信号。
表 A5.14 REGION_Present属性
REGION_Present | 默认 | 描述 |
---|---|---|
True | Y | AWREGION和ARREGION存在 |
False | AWREGION和AWREGION不存在 |
指示区域的信号如 表 A5.15 所示。
表 A5.15 Region信号
名字 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWREGION ARREGION | 4 | 0x0 | 一个可以用于识别不同地址区域的4位区域ID |
A5.7.2 区域ID
4位区域ID可用于唯一指示最多16个不同的区域。 区域ID可以提供更高位地址位的解码。 区域ID在任何4K字节的地址空间内必须保持不变。
使用区域ID意味着从机上的单个物理接口可以提供多个逻辑接口,每个接口在系统地址映射中具有不同的位置。 使用区域ID意味着从机不必支持不同逻辑接口之间的地址解码。
本规范期望互连在对具有多个逻辑接口的单个从机执行地址解码功能时产生AxREGION信号。 如果从机在系统地址映射中只有一个物理接口,则互连必须使用默认的AxREGION值。
区域ID有几种使用模型,包括但不限于以下内容:
- 外设可以在地址映射中的不同位置具有其主要数据路径和控制寄存器,并通过单个接口访问,无需从机执行地址解码。
- 从机可以在不同的内存区域表现出不同的行为。例如,从机可能在一个区域提供读写访问,但在另一个区域只提供只读访问。
从机必须确保正确的协议信号和事务的正确顺序得到维护。 从机必须确保对两个请求不同区域的相同事务ID的响应按正确顺序提供。
从机还必须确保AxREGION任何值的正确协议信号。 如果从机实现的区域少于十六个,则从机必须确保对任何对不支持区域的访问提供正确的协议信号。
如何实现这一点是实现定义的。例如,从机可能通过以下方式确保此点:
- 对于任何访问不支持区域的事务提供错误响应。
- 在所有不支持区域之间对受支持区域进行别名,以确保对所有访问给出合规的协议响应。
AxREGION信号仅提供现有地址空间的地址解码,可以被从机用来消除地址解码功能的需要。信号不创建新的独立地址空间。
AxREGION必须仅出现在地址解码功能下游的接口上。
A5.8 Qos信号
AXI支持服务质量(Quality of Service)QoS方案通过以下特性:
A5.8.1 QoS 标志
AXI请求有一个可选的标志,可以用来区分不同的流量流,如 表 A5.16 所示。
表 A5.16 QoS信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWQOS ARQOS | 4 | 0x0 | QoS用于区分不同的流量流 |
QOS_Present属性用于定义接口是否包含AxQOS信号。
表 A5.17 QOS_Support属性
QOS_Present | 默认 | 描述 |
---|---|---|
True | Y | AWQOS和ARQOS存在 |
False | AWQOS和ARQOS不存在 |
该协议未指定QoS标志的具体使用方式。 建议将AxQOS用作关联写或读请求的优先级指示符,其中较高的值表示更高优先级的请求。
使用QoS标志
主机可以生成自己的AxQOS值,如果它可以生成多个流量流,可以为不同的流选择不同的QoS值。
支持QoS需要对正在使用的QoS方案有系统级的理解,以及所有参与组件之间的协作。 因此,建议主机组件包括一些可编程性,以可用于控制任何给定场景下使用的确切QoS值。
如果主机组件不支持可编程QoS方案,则可以使用表示其生成的事务相对优先级的QoS值。 这些值随后可以映射到适当的替代系统级QoS值。
该规范预期许多互连组件实现将支持可编程寄存器,这些寄存器可用于将QoS值分配给连接的主机。 这些值替代主机提供的编程或默认QoS值。
QoS的默认系统级实现是任何具有选择多个要处理的事务的组件首先选择具有更高QoS值的请求进行处理。 当没有其他AXI约束要求按特定顺序处理请求时,才会进行此选择。 这意味着AXI排序规则优先于QoS目的的排序。
A5.8.2 QoS 接受标志
表 A5.18 中显示的QoS接受指标是来自从机的输出信号,指示它接受的最低QoS值而不会产生延迟。 这些信号与ACLK同步,但与其他AXI通道无关。
表 A5.18 QoS接受信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
VAWQOSACCEPT | 4 | 0x0 | 来自从机的输出,指示其接受来自AW通道请求的QoS值。 |
VARQOSACCEPT | 4 | 0x0 | 来自从机的输出,指示其接受来自AR通道请求的QoS值。 |
QoS接受信号旨在用于具有不同资源的从机组件,以满足不同的QoS值,这通常适用于内存控制器。 当较低QoS值所需的资源正在使用时,从机可以表明它仅接受特定QoS值或更高的请求。
QoS接受信号可以作为主机的输入,该接口可能有多个不同的请求可供选择。 这允许主机仅发出有可能被接受的请求,从而避免接口的不必要阻塞。
通过防止可能停滞一段时间的请求被发出,接口仍然可用于发出可能在稍后时间抵达的更高优先级请求。
在本规范中,术语VAxQOSACCEPT统称为VAWQOSACCEPT和VARQOSACCEPT信号。 VAxQOSACCEPT信号的规则和建议如下:
- 任何QoS级别等于或高于VAxQOSACCEPT的请求将被从机接受。
- 任何QoS级别低于VAxQOSACCEPT的请求可能会被显著延迟。本规范未定义从机必须在何种时间段内接受等于或高于所指QoS级别的请求。 然而,预计对于给定的从机,接受事务所需的时钟周期数是确定性的最大值,这在考虑到实现方面(如时钟域交叉比率)后得出。
- 允许从机接受低于VAxQOSACCEPT信号所指示的QoS级别的请求,但预计该请求可能会遭受显著延迟。 虽然从机延迟优先级低于QoS接受级别的请求是可以接受的,但建议该事务不应无限期延迟。
优先级低的事务在接口发出的原因有几个,例如:
- QoS接受值的变化与组件适应该变化之间的延迟。
- 需要对此事务进行以避免阻塞较高优先级请求的头部。
- 由于饥饿预防的原因,要求对此事务进行。
表 A5.19 中显示的QoS_Accept属性用于定义接口是否包含QoS接受指示信号。
表 A5.19 QoS_Accept属性
Qos_Accept | 默认 | 描述 |
---|---|---|
True | 接口包含VAWQOSACCEPT和VARQOSACCEPT信号。 | |
False | Y | 接口不包含VAWQOSACCEPT和VARQOSACCEPT信号 |
A第6章 事务ID和顺序
本章描述了事务标志及其如何用于控制事务的顺序。 它包含以下部分:
A6.1 事务ID
AXI协议包含一个事务ID(AXI ID)。 主机可以使用AXI ID来识别必须按顺序返回的事务。
所有具有给定AXI ID值的事务必须保持有序,但对于不同ID值的事务没有排序限制。
单个物理端口可以通过作为多个逻辑端口来支持乱序事务,每个端口按顺序处理其事务。
通过使用AXI ID,主机可以发出事务而无需等待早期事务完成这可以提高系统性能, 因为它使事务的并行处理成为可能。
A6.1.1 事务ID信号
读写请求、读取数据和写入响应通道包括一个事务ID信号。
表 A6.1 ID信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWID BID | ID_W_WIDTH | 全0 | 用于写请求和响应排序的事务ID |
ARID RID | ID_R_WIDTH | 全0 | 用于读请求、响应和读数据排序的事务ID |
表 A6.2 中描述了ID宽度属性。
表 A6.2 ID位宽属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
ID_W_WIDTH | 0…32 | − | 写通道AWID、BID的位宽 |
ID_R_WIDTH | 0…32 | − | 读通道ARID、RID的位宽 |
如果宽度属性为零,则相关信号不存在。
一个不支持请求和响应重排序的主机,或者只有一个未完成事务的主机,可以从其接口中省略 ID 信号。 相应的从机必须将其 AxID 输入固定为低电平。
一个不重排序请求或响应的从机不需要使用 ID 值。 如果一个从机不包含 ID 信号,则不能连接到具有 ID 信号的主机。 因为主机要求从AWID和ARID对应BID和RID。
A6.2 唯一ID
唯一ID指示器是一个可选标志,指示在读或写地址通道上的请求是否使用了对于在途事务唯一的AXI ID。 在读和写响应通道上也有一个相应的信号,用于指示某个事务使用了唯一ID。
唯一ID指示器可以在AXI主机下游使用,以确定何时请求需要相对于该主机的其他请求进行排序。 那些不需要排序的请求可能在下游组件中不需要跟踪。
Unique_ID_Support属性用于指示接口是否支持唯一ID指示。
表 A6.3 Unique_ID_Support 属性
Unique_ID_Support | 默认 | 描述 |
---|---|---|
True | 唯一ID信号存在 | |
False | Y | 唯一ID信号不存在 |
当Unique_ID_Support为真时,以下信号包含在读取请求、读取数据、写入请求和写入响应通道中。
表 A6.4 唯一ID信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWIDUNQ BIDUNQ ARIDUNQ RIDUNQ | 1 | 0b0 | 如果断言为高。则本次传输ID是唯一的 |
以下规则适用于唯一 ID 指示符:
- 当AWIDUNQ被断言时,该主机不得有同一AWID值的未完成写入事务。
- 当AWIDUNQ被断言时,该主机不得发出与未完成写入事务具有相同AWID的写入请求。
- 如果请求的AWIDUNQ断言被解除, 则对应的BIDUNQ信号必须在单个传输响应中或在多传输响应的完成部分中被解除断言。
- 如果请求的AWIDUNQ被断言, 则对应的BIDUNQ信号必须在单个传输响应中或在多传输响应的完成部分中被断言。
- 当ARIDUNQ被断言时,该主机不得有同一ARID值的未完成读取事务。
- 当ARIDUNQ被断言时,该主机不得发出与未完成读取事务具有相同ARID的读取请求。
- 如果请求的ARIDUNQ被解除断言,则必须为该事务的所有响应传输解除相应的RIDUNQ信号断言。
- 如果请求的ARIDUNQ被断言,则必须为该事务的所有响应传输断言相应的RIDUNQ信号。
- 对于包含读取和写入响应的原子事务,还适用附加规则:
- 如果原子请求的AWIDUNQ被取消断言,则必须为该事务的所有响应传输解除相应的RIDUNQ信号断言。
- 如果原子请求的AWIDUNQ被断言,则必须为该事务的所有响应传输断言相应的RIDUNQ信号。
一个事务从AxVALID被断言的周期开始,直到最终响应传输被主机接受的周期结束。 如果接口包含BCOMP,则该事务在收到断言BCOMP的响应之前被视为未完成。
一个原子事务在写入和读取响应都被主机接受之前是未完成的,参见 A7.4 原子事务 。
某些事务类型规定如果存在,则需要断言AxIDUNQ。 如果没有指定,即使没有使用相同 ID 的未完成事务,断言AxIDUNQ是可选的。
A6.3 请求顺序
AXI请求排序模型是基于事务ID的使用,该ID在ARID或AWID上发出信号。
具有相同ID和目标的同一通道上的事务请求保证保持顺序。
具有相同ID的事务响应将以与请求发出相同的顺序返回。
排序模型不对以下情况提供任何排序保证:
- 来自不同主机的事务。
- 读和写事务。
- 具有不同ID的事务。
- 发送到不同外设区域的事务。
- 发送到不同内存位置的事务。
如果主机要求在没有排序保证的事务之间进行排序,则主机必须等到收到第一个事务的响应后再发出第二个事务。
A6.3.1 内存位置和外设区域
AMBA中的地址映射由内存位置和外设区域组成。
内存位置具有以下所有属性:
- 从内存位置读取一个字节返回该字节位置最后写入的值。
- 向内存位置的一个字节写入更新该位置的值为后续读取该位置获得的新值。
- 对内存位置的读取或写入对任何其他内存位置没有副作用。
- 每个位置都有内存观察保证。
- 内存位置的大小等于该组件的单拷贝原子性大小。
外设区域具有以下所有属性:
- 从外设区域中的一个地址读取并不一定返回最后写入该地址的值.
- 向外设区域中的一个字节地址写入并不一定将该地址的值更新为后续读取获得的新值.
- 访问外设区域内的一个地址可能对该区域内的其他地址产生副作用。
- 每个区域都有外设观察保证
- 外设区域的大小由实现定义,但必须包含在一个从机内。
- 一个事务可以针对一个或多个地址位置,这些位置由AxADDR和任何相关限定符如地址空间确定。
- 仅对同一内存位置或外设区域的访问之间提供排序保证。
- 针对外设区域的事务必须完全包含在该区域内。
- 跨越多个内存位置的事务具有多个排序保证。
A3.6.2 设备和正常请求
事务可以是设备类型或普通类型。
设备事务
一个读取或写入请求,其中AxCACHE[1]失效。
设备事务可用于访问外设区域或内存位置。
普通事务
一个读取或写入请求,其中AxCACHE[1]有效。
普通事务用于访问内存位置,且不应预期用于访问外围区域。
对外设区域的普通访问必须以符合协议的方式完成,但结果是IMPLEMENTATION DEFINED。
A3.6.3 观察和完成定义
对于对外设区域的访问,当设备读取或写入访问DRW1在DRW2到达从机之前时,设备读取或写入访问DRW2会观察到DRW1。
对于对内存位置的访问,以下所有条件均适用:
- 如果W2在W1之后生效,则写入W1会被写入W2观察到。
- 如果R1从写入W3返回数据,而W2在W3之后,则读取R1会被写入W2观察到。
- 如果R2从W1或写入W3返回数据,而W3在W1之后,则写入W1会被读取R2观察到。
读取R1或写入W1可以是设备类型或普通类型。
写入和读取完成的定义如下:
写入完成响应
在关联的BRESP握手被发出时的周期, 当BVALID,BREADY和BCOMP(如果存在)被断言。
读取完成响应
在最后一个关联的RDATA握手被发出时的周期,当RVALID,RLAST和RREADY被断言。
A6.3.4 主机顺序保证
有三种类型的排序模型保证:
- 在收到完成响应之前的可观察性保证。
- 完成响应中的可观察性保证。
- 响应排序保证。
在收到完成响应之前的可观察性保证
以下所有保证适用于使用相同 ID 的同一主机的事务:
- 设备写入 DW1 保证在目的地到达之前先于设备写入 DW2 到达,其中 DW2 在 DW1 之后发布,且针对相同的外设区域。
- 设备读取 DR1 保证在目的地到达之前先于设备读取 DR2 到达,其中 DR2 在 DR1 之后发布,且针对相同的外设区域。
- 写入 W1 保证被写入 W2 观察到,其中 W2 在 W1 之后发布,且针对相同的内存位置。
- 一个被读取 R2 观察到的写入 W1 保证被读取 R3 观察到,其中 R3 在 R2 之后发布,且针对相同的内存位置。
从完成响应中的可观察性保证
完成响应的保证如下:
- 对于读取请求,完成响应保证它对来自任何主机的后续读取或写入请求是可观察的。
- 对于不可缓冲的写入请求,完成响应保证它对来自任何主机的后续读取或写入请求是可观察的。
- 对于可缓冲的写入请求,完成响应可以从一个中间点发送。它并不保证写入在端点完成,但保证可观察性,这取决于请求的域:
- 不可共享:仅对发布主机可观察。
- 可共享:对共享域中的所有其他主机可观察。
- 系统:对所有其他主机可观察。
有关域的更多信息,请参阅 A9.3 缓存一致性和域 。
响应排序保证
事务响应具备以下所有排序保证:
- 读取 R1 保证在读取 R2 的响应之前收到响应,其中 R2 是在 R1 之后从同一主机发布且具有相同 ID 的请求。
- 写入 W1 保证在写入 W2 的响应之前收到响应,其中 W2 是在 W1 之后从同一主机发布且具有相同 ID 的请求。
A6.3.5 从机顺序需求
为了满足主机顺序的保障,从机也必须满足以下要求。
外设位置
- 对于外设位置,对外设位置事务的执行顺序是实现定义的。该执行顺序通常预期与到达顺序相匹配,但这并不是要求。
内存位置
- 写入 W1 必须在写入 W2 之前,W1 和 W2 是同一内存位置相同 ID 的访问,W2 的接收时间晚于 W1 的接收时间。
- 写入 W1 必须在写入 W2 之前,W1 和 W2 是同一内存位置的访问,W2 的接收时间晚于 W1 的完成响应。
- 写入 W1 必须在读取 R2 之前,W1 和 R2 是同一内存位置的访问,R2 的接收时间晚于 W1 的完成响应。
- 读取 R1 必须在写入 W2 之前,W1 和 W2 是同一内存位置的访问,W2 的接收时间晚于 R1 的完成响应。
响应排序要求
- 对读取 R1 的响应必须在对读取 R2 的响应之前返回,R2 是在 R1 之后接收的,相同 ID。
- 对写入 W1 的响应必须在对写入 W2 的响应之前返回,W2 是在 W1 之后接收的,相同 ID。
A3.6.6 互联顺序需求
互连组件具有以下属性:
- 在一个端口接收到请求,并在另一个端口发出或响应。
- 在一个端口接收到响应,并在另一个端口发出或处理。
当互连发出请求或响应时,必须遵循以下要求:
- 在发出读取 R2 请求之前,必须发出读取 R1 请求,其中 R2 是在 R1 之后接收的,具有相同的 ID,并且指向相同或重叠的位置。
- 在发出写入 W2 请求之前,必须发出写入 W1 请求,其中 W2 是在 W1 之后接收的,具有相同的 ID,并且指向相同或重叠的位置。
- 在发出设备读取 DR2 请求之前,必须发出设备读取 DR1 请求,其中 DR2 是在 DR1 之后接收的,具有相同的 ID,并且指向相同的外设区域。
- 在发出设备写入 DW2 请求之前,必须发出设备写入 DW1 请求,其中 DW2 是在 DW1 之后接收的,具有相同的 ID,并且指向相同的外设区域。
- 在发出读取 R2 响应之前,必须发出读取 R1 响应,其中 R2 是在 R1 之后接收的,具有相同的 ID。
- 在发出写入 W2 响应之前,必须发出写入 W1 响应,其中 W2 是在 W1 之后接收的,具有相同的 ID。
当互连作为从机工作时,也必须遵循从机要求。
与事务相关 AXI ID 值的任何操作必须确保原始 ID 值的顺序要求得以保持。
A3.6.7 终点之前响应
为了提高系统性能,中间组件可以对某些事务发出响应。这一操作被称为提前响应。 发出提前响应的中间组件必须确保满足可见性和排序保证。
提前读取响应
对于普通读取事务,如果中间组件的本地内存与对相同或重叠地址的所有早期写入保持同步,则可以用读取数据进行响应。 在这种情况下,请求不需要传播到中间组件之外。
中间组件必须遵守 ID 排序规则,这意味着只有在所有早期的相同 ID 读取已经有响应的情况下,才能发送读取响应。
提前写入响应
对于可缓冲写入事务(AWCACHE[0] 被置为有效),中间组件可以为没有下游观察者的事务发送提前写入响应。 如果中间组件发送提前写入响应,则可以存储数据的本地副本,但必须在丢弃该数据之前将事务向下游传播。
中间组件必须遵守 ID 排序规则,这意味着只有在所有早期的相同 ID 写入已经有响应的情况下,才能发送写入响应。
在发送提前写入响应后,该组件必须负责该事务的排序和可观察性,直到写入被传播到下游并收到写入响应。 在发送提前写入响应和收到下游响应的期间,该组件必须确保:
- 如果对普通事务给予了提前写入响应,则所有后续事务对相同或重叠内存位置的写入都是在已经给予提前响应的写入之后排序。
- 如果对设备事务给予了提前写入响应,则所有后续事务对相同外设区域的写入都是在已经给予提前响应的写入之后排序。
在对设备可缓冲事务给予提前写入响应时,预计中间组件将独立于其他事务传播写入事务。 中间组件无法等待另一个读取或写入到达,然后再传播之前的设备写入。
A3.6.8 不同内存类型之间的请求顺序
在可缓存请求与设备请求或非缓存普通请求之间没有排序要求。 设备请求与非缓存普通请求之间的排序要求取决于Device_Normal_Independence属性。
表 A6.5 Device_Normal_Independence属性
Device_Normal_Independence | 默认 | 描述 |
---|---|---|
True | 设备请求被允许超越或被具有相同ID并指向相同位置的正常非缓存请求超越 | |
False | Y | 设备和正常的非缓存请求具有相同的 ID,必须按发布顺序在同一位置被观察。 |
连接具有不同Device_Normal_Independence值的主机和从机接口的指导如 表 A6.6 所示。
表 A6.6 Device_Normal_Independence互联指导
Device_Normal_Independence | 从机: False | 从机: True |
---|---|---|
主机: False | 兼容 | 不兼容 从机可能无法满足主机的顺序要求。 |
主机: True | 兼容 从机可能会执行比主机更严格的顺序 | 兼容 |
A3.6.9 写入可观察顺序
为了提高与支持不同排序模型的接口协议兼容性, 从机可以为写事务提供更强的排序保证,这被称为有序写观察。
Ordered_Write_Observation 属性用于定义一个接口是否具有有序写观察。
表 A6.7 Ordered_Write_Observation 属性
Ordered_Write_Observation | 默认 | 描述 |
---|---|---|
True | 接口表现出有序可观察性。 | |
False | Y | 接口不表现出有序可观察性。 |
一个展示有序写观察的接口为写事务提供了保证,这些保证与目的地或地址无关:
- 写操作W1保证会被写操作W2观察到,其中W2是在W1之后由同一主机发出的,且具有相同的ID。
使用有序写观察时,主机可以在不等待写响应的情况下发出多个写请求,并且它们会按照发出顺序被观察。 这在使用Producer-Consumer排序模式时可以提高性能。
A6.4 互联使用事务id
当一个主机连接到互连时,互连会将附加bit附加到AWID和ARID, 这些位对于该主机端口是唯一的。这有两个效果:
- 主机不必知道其他主机使用的ID值,因为互连通过将主机编号附加到原始ID使每个主机使用的ID值唯一。
- 从机接口处的ID比主机接口处的ID更宽。
对于写响应,互连使用BID附加bit来确定写响应的目标主机器端口。 互连在将BID值传递给正确的主机端口之前会去掉这些BID的位。
对于读数据,互连使用RID的附加bit来确定读数据的目标主机端口。 互连在将RID值传递给正确的主机端口之前会去掉这些RID的位。
A6.5 写数据和响应顺序
从机必须确保写响应的BID值与其响应请求的AWID值匹配。
主机必须按照发出事务请求的顺序发出写数据。
一个将不同主机的写事务结合在一起的互连必须确保以请求顺序转发写数据。
不同事务的写数据传输不允许交错。
互连必须确保来自具有相同AWID值的事务序列的写响应在请求顺序中被主机接收。
A6.6 读数据顺序
从机必须确保任何返回数据的RID值与其响应请求的ARID值匹配。
互连接口必须确保来自同一ARID值的不同从机的一系列事务的读取数据按请求顺序被主机接收。
读取数据重排序深度是从机可能发送读取数据的最大接受请求数量。 按接收请求的顺序发送读取数据的从机具有一级读取数据重排深度。
读取数据重排序深度是一个静态值,可以由从机的设计者指定。
主机没有机制动态地确定从机的读取数据重排序深度。
A6.6.1 读数据交错
对于读取数据传输允许使用不同的ID值交织进行,这包括所有可以有多个读取数据传输的事务,包括原子事务。
如果确定附加的从机将交织不同事务的读取数据,一些AXI主机和互联组件可以更有效地设计。
Read_Interleaving_Disabled属性用于指示接口是否支持来自不同事务的读取数据传输交织。
表 A6.8 Read_Interleaving_Disabled
Read_Interleaving_Disabled | 默认 | 描述 |
---|---|---|
True | 主机无法接收交织的读取数据。 从机保证不会交织读取数据。 | |
False | Y | 主机能够接收交织的读取数据。 从机可能会将具有不同ARID值读取事务的数据交织。 |
对于某些接口,此属性可用作配置控制。对于其他接口,它是一个功能指示器。 所有发出具有不同ID的事务的主机必须被设计为接受交织数据。 作为一种优化,当附加的从机支持禁用交错时,主机可能使用配置选项来禁用交错。
A6.6.2读取数据分块
读取数据分块选项使从机能够使用128bit粒度重新排序事务中的读取数据。 起始地址可能用作决定首先发送哪个块的提示,但从机允许以任何顺序返回数据块。
属性Read_Data_Chunking用于指示接口是否支持以可重新排序的块形式返回读取数据。
表 A6.9 Read_Data_Chunking 属性
Read_Data_Chunking | 默认 | 描述 |
---|---|---|
True | 支持读取数据分块。 | |
False | Y | 不支持读取数据分块,相关的分块信号也不存在。 |
A6.6.2.1 读取数据分块信号
表 A6.10 读取数据分块信号
当支持读取数据分块时,在读取请求和数据通道中会添加如 表 A6.10 所示的信号。
表 A6.10 读取数据分块信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
ARCHUNKEN | 1 | 0b0 | 如果在读取请求中断言,从机可以以128bit块发送读取数据。 |
RCHUNKV | 1 | 0b0 | 断言为高表示RCHUNKNUM和RCHUNKSTRB是有效的。每个事务响应必须相同。 |
RCHUNKNUM | RCHUNKNUM_WIDTH | 全0 | 指示正在传输的块的编号。 块的编号根据事务的数据宽度和基地址从零开始递增。 |
RCHUNKSTRB | RCHUNKSTRB_WIDTH | 全1 | 指示了有效的读取数据块。 对于每次传输每个位对应128 bit数据,RCHUNKSTRB最低位对应RDATA最低128位。 |
属性RCHUNKNUM_WIDTH定义了RCHUNKNUM信号的宽度。
表 A6.11 RCHUNKNUM_WIDTH属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
RCHUNKNUM_WIDTH | 0,1,5,6,7,8 | 0 | RCHUNKNUM的位宽。 0:Read_Data_Chunking = False 0/1:DATA_WIDTH < 128 8:DATA_WIDTH = 128 7:DATA_WIDTH = 256 6:DATA_WIDTH = 512 5DATA_WIDTH=1024 |
RCHUNKSTRB_WIDTH属性定义RCHUNKSTRB信号的宽度.
表 A6.12 RCHUNKSTRB_WIDTH属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
RCHUNKSTRB_WIDTH | 0,1,2,4,8 | 0 | RCHUNKSTRB的位宽。 0:Read_Data_Chunking = False 0/1:DATA_WIDTH < 256 2:DATA_WIDTH = 256 4:DATA_WIDTH512256 8:DATA_WIDTH = 1024 |
具有较小DATA_WIDTH的接口可以包含RCHUNKNUM和RCHUNKSTRB信号, 宽度为1位,也可以从接口中省略它们。 当使用接口保护时,RCHUNKCHK信号涵盖这两个信号, 因此连接组件的RCHUNKNUM和RCHUNKSTRB必须具有相同的宽度。
建议在接口不需要时省略RCHUNKNUM和RCHUNKSTRB。
A6.2.2 读数据分块协议规则
在读取数据分块协议中,所有以下规则都适用:
- ARCHUNKEN 仅针对具有以下属性的事务:
- 大小等于数据通道宽度,或长度为一次传输。
- 大小为 128 位或更大。
- Addr 对齐到 16 字节。
- Burst 为 INCR 或 WRAP。
- 操作码为 ReadNoSnoop、ReadOnce、ReadOnceCleanInvalid 或 ReadOnceMakeInvalid。
- ID 值必须在飞行中是唯一的,这意味着:
- 只有在没有使用相同ARID值的未完成读取事务的情况下,才能断言ARCHUNKEN。
- 主机不得在读取通道上发出与具有断言ARCHUNKEN的未完成请求具有相同ARID的请求。
- 如果在接口上存在,则如果断言ARCHUNKEN,则必须断言ARIDUNQ。
- 如果解除断言ARCHUNKEN,则必须为事务的所有响应传输解除断言RCHUNKV。
- 如果断言ARCHUNKEN,则可以为事务的响应传输断言RCHUNKV。
- RCHUNKV 必须对事务的每个响应传输相同。
- 当断言RVALID和RCHUNKV时,RCHUNKNUM必须介于零和ARLEN之间。
- 当断言RVALID和RCHUNKV时,RCHUNKSTRB必须不为零。
- 当断言RVALID和RCHUNKV时,RLAST仅针对事务的最终响应传输断言, 与RCHUNKNUM和RCHUNKSTRB无关。
- 当断言RVALID且解除断言RCHUNKV时,RCHUNKNUM和RCHUNKSTRB可以取任何值。
传输的数据块数量必须与ARLEN和ARSIZE一致, 因此事务中传输的字节数无论是否启用分块都相同。
请注意,当使用读取数据分块时,事务可能比 ARLEN 指示的具有更多读取数据传输。
对于未对齐的事务,地址低于ARADDR的块不会传输,并且必须解除断言RCHUNKSTRB。
A6.6.2.3 互操作性
如果主机支持读数据分块,从机也支持分块,那么下游互联和从机可以减少其缓冲。 一种连接到具有混合分块支持组件的互联可以根据所附组件的能力驱动ARCHUNKEN和RCHUNKV。
当连接具有不同Read_Data_Chunking属性值的接口时,适用以下规则,如 表 A6.13 所示。
表 A6.13 Read_Data_Chunking互操作性
Read_Data_Chunking | 从机: False | 从机: True |
---|---|---|
主机: False | ARCHUNKEN不存在。 RCHUNKV 不存在。 RCHUNKNUM 不存在。 RCHUNKSTRB不存在。 读取数据以全数据的形式自然排序。 | 从机ARCHUNKEN 输入连接为LOW。 从机RCHUNKV输出不连接。 从机RCHUNKNUM输出不连接。 从机RCHUNKSTRB输出不连接。 读取数据以全数据的形式自然排序。 |
主机: True | 主机ARCHUNKEN输出不连接。 主机RCHUNKV 输入连接为LOW。 主机RCHUNKNUM 输入连接为任意值。 主机RCHUNKSTRB输入连接为任意值。 | 分块信号对应连接 读取数据被分块排序。 |
A6.6.2.4 分块实例
在这些示例中,图中的每一行表示一次传输,阴影单元格表示未传输的字节。
图 A6.1 显示了在256位宽的读数据通道上的一次事务,其中:
- 地址为0x00
- 长度为2次传输
- 尺寸为256位
- 突发为INCR
图 A6.2 在256位宽读数据通道上的一次事务,其中:
- 地址是0x10
- 长度是2次传输
- 尺寸是256位
- 突发是INCR
在一个128位宽的读数据通道上的事务,其中:
- 地址是0x10。
- 长度是4个传输。
- 尺寸是128位。
- 突发是WRAP。
- RCHUNKSTRB不存在。
从机使用起始地址作为提示,并首先发送0x10处的块。
A第7章 原子访问
本章描述了单副本和多副本的原子性以及如何执行独占访问和原子事务。
它包含以下部分:
A7.1 单副本原子大小
单副本原子性大小是一个事务原子更新的最小字节数。 AXI协议要求大小超过单副本原子性大小的事务以至少单副本原子性大小的块更新内存。
原子性并不定义数据更新的确切时刻。必须确保没有主机能够观察到原子数据的部分更新形式。 例如,在许多系统中,数据结构如链表由32位原子元素组成。 对这些元素之一的原子更新需要在同一时间更新整个32位值。 任何主机都不能观察到一次仅更新16位,然后再更新另外16位的情况。
更复杂的系统需要对更大原子元素的支持,特别是64位原子元素,以便主机能够使用基于这些更大原子元素的数据结构进行通信。
系统中支持的单副本原子性大小很重要,因为涉及某一通信的所有组件必须支持所需的原子元素大小。 如果两个主机通过互连和一个从机进行通信,则所有相关组件必须确保所需大小的事务被视为原子。
AXI协议不要求特定的单副本原子性大小,系统可以设计为支持不同的单副本原子性大小。
在AXI中,单副本原子组一词描述了一组可以在特定原子性下进行通信的组件。例如,图 A7.1 显示了这样一个系统,其中:
- CPU、DSP、DRAM控制器、DMA控制器、外设、SRAM内存和相关互连处于32位单副本原子组中。
- CPU、DSP、DRAM控制器和相关互连也处于64位单副本原子组中。
一个事务的原子性保证从来没有超过其起始地址的对齐程度。 例如,在一个64位单副本原子组中的事务,如果没有与8字节边界对齐,则没有任何64位单副本原子保证。
与事务相关的字节strobes不会影响单副本原子性大小。
A7.2 多副本原子写
如果满足下列情况,则一个系统被定义为多副本原子性:
- 所有代理观察到对同一位置的写入是按照相同的顺序进行的。
- 对一个代理可观察位置的写入,对于所有代理都是可观察的。
为了说明一个系统提供多副本原子性,定义了一个Multi_Copy_Atomicity属性。
表 A7.1 Multi_Copy_Atomicity 属性
Multi_Copy_Atomicity | 默认 | 描述 |
---|---|---|
True | 支持多副本原子性 | |
False | Y | 不支持多副本原子性 |
多副本原子性可以通过以下方式确保:
- 对于给定地址使用单一的序列化点(Point of Serialization - PoS),以便对同一位置的所有访问都被排序。 这必须确保在新值对任何代理可见之前,位置的所有一致缓存副本都失效。
- 避免使用在任何代理上游的转发缓冲区。这防止了某些代理在所有代理可见之前看到位置的缓冲写入。
要求该多副本原子性属性在本规范的第G期及之后为真。
A7.3 独占访问
独占访问机制可以提供信号量类型的操作,而无需在操作期间将连接专门分配给特定的主机。
AxLOCK信号用于指示独占访问, 而BRESP和RRESP信号分别指示独占访问写入或读取的成功或失败。
表 A7.2 AxLOCK 信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWLOCK ARLOCK | 1 | 0b0 | 断言为高表明需要进行独占访问。 |
Exclusive_Accesses属性用于定义主机是否能够发放独占访问权限或从机是否支持这些权限。
表 A7.3 Exclusive_Accesses 属性
Exclusive_Accesses | 默认 | 描述 |
---|---|---|
True | Y | 支持独占访问,AWLOCK和ARLOCK出现在接口上。 |
False | 不支持独占访问,AWLOCK和ARLOCK不出现在接口上。 |
表 A7.4 提供了在连接具有不同属性值的主机和从机组件时适用的指导。
表 A7.4 独占访问的互操作性
Exclusive_Accesses | 从机:False | 从机:False |
---|---|---|
主机:False | 兼容 | 兼容。 AWLOCK和ARLOCK接LOW。 |
主机:True | 不兼容。 独占访问只会失败,但是接口不会产生死锁。 | 兼容。 |
A7.3.1 独占访问序列
独占访问序列的机制是:
- 主机从一个地址发出独占读取请求。
- 在稍后的时间,主机尝试通过向同一地址发出独占写入请求来完成独占操作, 并且AWID与用于独占读取的ARID相匹配。
- 该独占写入访问被标记为:
- 成功,如果自独占读取访问以来没有其他主机写入该位置。在这种情况下,独占写入更新内存。
- 失败,如果自独占读取访问以来其他主机已向该位置写入。在这种情况下,内存位置不更新。
主机可能没有完成独占操作的写入部分。独占访问监控硬件仅监控每个事务ID的一个地址。 如果主机没有完成独占操作的写入部分,则该主机使用相同的事务ID进行的后续独占读取将改变监控的独占访问地址。
A7.3.2 从主机的角度进行独占访问
一个主机通过执行独占读取开始独占操作。 如果事务成功,从机返回EXOKAY响应,表示从机记录了需要监控的独占访问地址。
如果主机尝试对不支持独占访问的从机进行独占读取,从机返回OKAY响应,而不是EXOKAY响应。 在这种情况下,读取的数据是有效的,但位置并没有被独占性监控。
主机可以将OKAY响应视为错误条件,表示不支持独占访问。 建议主机不要执行此独占操作的写入部分。
在独占读取后,主机尝试对同一位置执行独占写入。 如果所寻址位置的内容自独占读取以来没有被更新,则独占写入操作成功。 从机返回EXOKAY响应,并更新内存位置。
如果所寻址位置的内容自独占读取以来已被更新,则独占写入尝试失败,从机返回OKAY响应,而不是EXOKAY响应。独占写入尝试不会更新内存位置。
主机可能无法完成独占操作的写入部分。 如果发生这种情况,从机继续监控该地址的独占访问,直到另一个独占读取开始新的独占访问序列。 主机在读取部分完成之前,不得开始独占访问序列的写入部分。
A7.3.3 独占访问限制
以下限制适用于独占访问:
- 独占访问的地址必须与事务中的字节总数对齐,即 Size 和 Length 的乘积。
- 在独占访问事务中传输的字节数必须是 2 的幂,即 1、2、4、8、16、32、64 或 128 字节。
- 独占事务中可以传输的最大字节数为 128。
- 独占访问的长度不得超过 16 次传输。
- 域不得是可共享的,请参见 A9.3.3 可共享域 。
- 操作码必须是 ReadNoSnoop 或 WriteNoSnoop。请参见 A第8章 请求操作码 。
- AWTAGOP 必须不匹配,请参见 A13.2 内存标签扩展 。
未遵守这些限制会导致UNPREDICTABLE的行为。
为了使独占序列成功,AxCACHE值必须适当,以确保读写请求到达独占访问监控器。
在独占操作期间需要监控的最小字节数是 Size 和 Length 的乘积。
从机可以监控更多的字节,最多可达 128,这是独占访问中的最大字节数。 然而,这可能导致成功的独占访问被指示为失败,因为相邻的字节被更新。 如果在独占序列中的读请求和写请求之间显示的任何信号在表 A7.5 中不同,则即使该位置未被其他代理更新,独占写入也可能失败。
表 A7.5 独占序列中应该保持不变的信号
AxID | AxADDR | AxREGION | AxSUBSYSID | AxDOMAIN |
---|---|---|---|---|
AxLEN | AxSIZE | AxBURST | AxLOCK | AxCACHE[1:0] |
AxPROT | AxNSE | AxSNOOP | AxMMUATST | AxMMUFLOW |
AxMMUVALID | AxMMUSECSID | AxMMUSID | AxMMUSSID | AxMMUSSIDV |
A7.3.4 从从机的角度进行独占访问
一个支持独占访问的从机必须具有监视硬件。 建议每个支持独占功能的主机ID都配有一个监视单元, 可以访问该从机。
当从机接收到独占读取请求时,它会记录任何独占读取操作的地址和ARID值。 然后它监视该位置,直到该位置发生写入,或直到另一个具有相同ARID值的独占读取将监视器重置为另一个地址。
如果从机能够成功处理独占读取,它会对每个读取数据传输回应EXOKAY。
如果从机无法处理独占读取,它会以不是EXOKAY的响应作出回应。 一个独占读取可以有多个响应传输。对于单个事务不允许同时出现OKAY和EXOKAY响应。
当从机接收到具有给定AWID值的独占写入时,监视器会检查该地址是否正在监视该AWID的独占访问。 如果是,这表明自独占读取访问以来,该位置没有发生写入,独占写入继续进行,并完成独占访问。 从机向主机返回EXOKAY响应,并更新指定的存储位置。
如果在独占写入时,该地址未使用相同的AWID值进行,这表示以下情况之一:
- 该位置自独占读取访问以来已被更新。
- 监视器已重置到另一个位置。
- 主机没有以与独占写入相同的属性发出独占读取。
在所有独占写入都不得更新指定位置的情况下,从机必须返回OKAY响应,而不是EXOKAY响应。
如果一个不支持独占访问的从机接收到独占写入,它会以OKAY响应作出回应,并更新该位置。
A7.4 原子事务
原子事务不仅仅执行单一访问,还有与事务相关联的操作。 原子事务允许将操作发送到数据上,从而使操作能够在更靠近数据位置的地方执行。 原子事务适用于数据与必须执行操作的代理相距较远的情况。
与使用独占访问相比,该方法减少了在系统中必须使数据对其他代理不可访问的时间。
A7.4.1 概述
在原子事务中,主机发送一个地址、控制信息和出站数据。从机发送入站数据(原子存储除外)和响应。 该规格支持四种形式的原子事务:
原子存储 - AtomicStore
- 主机发送一个带地址的单一数据值和要执行的原子操作。
- 从机使用发送的数据和位于地址位置的值作为操作数执行操作。 •-结果存储在地址位置。
- 提供一个没有数据的单一响应。
- 出站数据大小为1、2、4或8字节。
原子加载 - AtomicLoad
- 主机发送一个带地址的单一数据值和要执行的原子操作。
- 从机返回位于地址位置的原始数据值。
- 从机使用发送的数据和位于地址位置的值作为操作数执行操作。
- 结果存储在地址位置。
- 出站数据大小为1、2、4或8字节。
- 入站数据大小与出站数据大小相同。
原子交换 - AtomicSwap
- 主机发送一个带地址的单一数据值。
- 从机使用事务中提供的数据值交换地址位置的值。
- 从机返回位于地址位置的原始数据值。
- 出站数据大小为1、2、4或8字节。
- 入站数据大小与出站数据大小相同。
原子比较 - AtomicCompare
- 主机发送两个数据值,即比较值和交换值,至地址位置。比较值和交换值大小相等。
- 从机将地址位置的数据值与比较值进行检查:
- 如果值匹配,则将交换值写入地址位置。
- 如果值不匹配,则不将交换值写入地址位置。
- 从机返回位于地址位置的原始数据值。
- 出站数据大小为2、4、8、16或32字节。
- 入站数据大小为出站数据大小的一半,因为出站数据包含比较值和交换值,而入站数据仅具有原始数据值。
A7.4.2 原子事务操作
该规范支持八种不同的操作,可将 A7.6 所示的与AtomicStore和AtomicLoad事务一起使用。
A7.4.2 原子事务操作
操作 | 描述 |
---|---|
ADD | 内存中的值与发送的数据相加,结果存储在内存中。 |
CLR | 发送数据中的每个已设置位用于清除内存中对应的位。 |
EOR | 发送数据与内存中值的按位异或。 |
SET | 发送数据中的每个已设置位用于设置内存中对应的位。 |
SMAX | 存储在内存中的值是现有值和发送数据中的最大值。 该操作假定数据为带符号数。 |
SMIN | 存储在内存中的值是现有值和发送数据中的最小值。 该操作假定数据为带符号数。 |
UMAX | 存储在内存中的值是现有值和发送数据中的最大值。 该操作假定数据为无符号数。 |
UMIN | 存储在内存中的值是现有值和发送数据中的最小值。 该操作假定数据为无符号数。 |
A7.4.3 原子事务属性
原子事务的规则如下:
- AWLEN 和 AWSIZE 指定事务中写数据的字节数。 对于 AtomicCompare,字节数必须包括比较值和交换值。
- 如果 AWLEN 指示的事务长度大于 1,则 AWSIZE 必须是完整的数据通道宽度。
- 在 AWADDR 和 AWSIZE 指定的数据窗口之外的写 strobe必须被禁止。
- 数据窗口内的写 strobes必须被使能。
对于 AtomicStore、AtomicLoad 和 AtomicSwap
- 写数据为 1、2、4 或 8 字节,读数据分别为 1、2、4 或 8 字节。
- AWADDR 必须与总写数据大小对齐。
- AWBURST 必须为 INCR。
对于 AtomicCompare
- 写数据为 2、4、8、16 或 32 字节,读数据为 1、2、4、8 或 16 字节。
- AWADDR 必须与总写数据大小的一半对齐。
- 如果 AWADDR 指向事务的下半部分:
- 首先发送比较值。比较值位于单次传输事务的低字节中,或位于多次传输事务的第一次传输中。
- AWBURST 必须为 INCR。
- 如果 AWADDR 指向事务的上半部分:
- 首先发送交换值。交换值位于单次传输事务的低字节中,或位于多次传输事务的第一次传输中。
- AWBURST 必须为 WRAP。
- 对于 WRAP 类型的事务,通常规则有所放宽:
- 允许长度为 1。
- AWADDR 不需要与传输大小对齐。
具有 64 位数据通道的 AtomicCompare 事务示例如 图 A7.2 所示。
A7.4.4 原子事务使用ID
一个单一的AXI ID用于原子事务。 相同的AXI ID用于请求、写响应和读数据。 这个要求意味着主机只能使用可以在AWID和RID信号上进行信号传递的ID值。
原子事务不能使用与同时存在的非原子事务所使用的AXI ID值。 这条规则适用于AR或AW通道上的事务。 这条规则确保了原子事务和非原子事务之间没有排序约束。
如果一个事务在另一个事务发出之前已完全完成,原子事务和非原子事务可以使用相同的AXI ID值。
同时存在的多个原子事务不能使用相同的AXI ID值。
对于使用读数据通道的原子事务,如果接口包括唯一ID信号,则如果AWIDUNQ被确认,则必须确认RIDUNQ。 有关更多细节,请参见 A6.2 唯一ID 。
A7.4.5 原子事务的请求属性限制
对于原子事务,请求属性适用以下限制:
- AWCACHE 和 AWDOMAIN 可以是接口类型有效的任何组合。请参见 表 A9.1 。
- AWSNOOP 必须设置为全零。如果 AWSNOOP 有其他值,则 AWATOP 必须全为零。
- AWLOCK 必须不被声明为独占访问。
A7.4.6 原子事务信号
为了支持原子事务,AWATOP 应该被添加到一个接口中。
表 A7.7 id信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWATOP | 6 | 0x00 | 指示原子事务的类型和字节顺序。 |
表 A7.8 AWATOP编码
AWATOP[5:0] | 描述 |
---|---|
0b000000 | 非原子操作 |
0b01exxx | 原子存储 (AtomicStore) |
0b10exxx | 原子加载 (AtomicLoad) |
0b110000 | 原子交换 (AtomicSwap) |
0b110001 | 原子比较 (AtomicCompare) |
对于原子存储(AtomicStore)和原子加载(AtomicLoad)事务,AWATOP[3]表示原子操作所需的字节序:
- 当未断言时,此位表示操作为小端。
- 当断言时,此位表示操作为大端。
AWATOP[3]的值仅适用于算术操作,对于按位逻辑操作则被忽略。
对于原子存储(AtomicStore)和原子加载(AtomicLoad)事务, 表 A7.9 显示了低位AWATOP[2:0]信号上的操作编码。
表 A7.9 低位AWATOP[2:0]编码
AWATOP[2:0] | 操作 | 描述 |
---|---|---|
0b000 | ADD | 加法 |
0b001 | CLR | 位清零 |
0b010 | EOR | 异或 |
0b011 | SET | 位设定 |
0b100 | SMAX | 有符号最大值 |
0b101 | SMIN | 有符号最小值 |
0b110 | UMAX | 无符号最大值 |
0b111 | UMIN | 无符号最小值 |
A7.4.7 事务结构
对于AtomicLoad、AtomicSwap和AtomicCompare事务,事务结构如下:
- 请求在AW通道上发出。
- 相关的事务数据在W通道上发送。
- W通道上所需的写数据传输数量由AWLEN信号决定。
- 原子事务请求与原子事务写数据的相对时序未指定。
- 从机通过R通道返回原始数据值。
- 读取数据传输的数量由AWLEN和AWATOP信号决定。 对于AtomicCompare操作,如果AWLEN指示事务长度大于1,则读取数据传输的数量为AWLEN指定数量的一半。
- 允许从机在发送读取数据之前等待所有写数据。主机必须能够在未接收任何读取数据的情况下发送所有写数据。
- 允许从机在接受任何写数据之前发送所有读取数据。主机必须能够在未接受任何写数据的情况下接受所有读取数据。
- 在B通道上返回单个写响应。写响应必须由从机在接收到所有写数据传输并且原子事务的结果可观察后给出。
AtomicLoad、AtomicSwap和AtomicCompare事务涉及的传输如 图 A7.3 所示。
对于AtomicStore事务,事务结构如下:
- 请求在AW通道上发出。
- 相关的事务数据在W通道上发送。
- W通道上所需的写数据传输次数由AWLEN信号决定。
- Atomic事务请求和Atomic事务写数据的相对时序未指定。
- 在B通道上返回单个写响应。写响应必须由从机在收到所有写数据传输并且观察到原子事务的结果之后给出。
涉及AtomicStore事务的传输如 图 A7.4 所示。
A7.4.8 响应信号
写响应指示原子事务对所有必需的观察者可见。
包含读取响应的原子事务在接收到第一项读取数据时对所有必需的观察者可见。
主机被允许使用读取或写入响应作为事务对所有必需的观察者可见的指示。
与操作相关的错误概念是不存在的,例如溢出。一个操作对所有输入组合是完全指定的。
对于如原子比较等事务,当事务有多个结果时,不会提供事务结果的指示。 为了确定比较和交换指令是否已更新内存位置,必须检查作为事务一部分返回的原始数据值。
当事务达到不支持原子事务的组件时,可以对原子事务给出错误响应。
对于原子加载(AtomicLoad)、原子交换(AtomicSwap)和原子比较(AtomicCompare)事务:
- 从机必须发送正确数量的读取数据传输,即使写响应是DECERR或SLVERR。
- 主机可能会忽略写响应,仅使用随读取数据一起返回的响应。
A7.4.9 原子事务的依赖
对于AtomicLoad,AtomicSwap和AtomicCompare事务,图 A7.5 显示以下原子事务握手信号依赖关系:
- 主机在断言AWVALID或WVALID之前不应等待从机断言AWREADY或WREADY。
- 从机可以在断言AWREADY之前等待AWVALID或WVALID,或两者。
- 从机可以在AWVALID或WVALID,或者两者被断言之前断言AWREADY。
- 从机可以在断言WREADY之前等待AWVALID或WVALID,或两者。
- 从机可以在AWVALID或WVALID,或者两者被断言之前断言WREADY。
- 从机在断言BVALID之前必须等待AWVALID、AWREADY、WVALID和WREADY被断言。
- 从机还必须在断言BVALID之前等待WLAST被断言,因为写响应BRESP必须在写事务的最后一次数据传输后才发出信号。
- 从机在断言BVALID之前不应等待主机断言BREADY。
- 主机可以在断言BREADY之前等待BVALID。
- 主机可以在BVALID被断言之前断言BREADY。
- 从机必须在AWVALID和AWREADY都被断言之后才能断言RVALID,以指示有效数据可用。
- 从机在断言RVALID之前不应等待主机断言RREADY。
- 主机可以在断言RREADY之前等待RVALID被断言。
- 主机可以在RVALID被断言之前断言RREADY。
- 主机在断言WVALID之前不应等待从机断言RVALID。
- 从机可以在所有写数据传输之前等待WVALID被断言,然后再断言RVALID。
- 主机可以在RVALID被断言之前断言WVALID。
在 图 A7.5 所示的依赖性图中:
- 单头箭头指向可以在箭头起始信号之前或之后被断言的信号。
- 双头箭头指向必须在箭头起始信号被断言之后才能被断言的信号。
A7.4.10 原子事务的支持
Atomic_Transactions属性用于指示一个组件是否支持原子事务。
表 A7.10 Atomic_Transactions属性
Atomic_Transactions | 默认 | 描述 |
---|---|---|
True | 支持原子事务。 | |
False | Y | 不支持原子事务。 |
在某些实现中,这将是一个固定的接口属性,而其他实现可能支持在设计时设置该属性。
如果一个从机或互连组件声明它支持原子事务,那么它必须支持所有操作类型、大小和字节顺序。
主机支持
一个支持原子事务的主机组件还可以包括一个机制来抑制原子事务的生成,以确保在不支持原子事务的系统中的兼容性。
指定了一个可选的BROADCASTATOMIC引脚。当该存在并未被断言时,主机不会发出原子事务。
表 A7.11 BROADCASTATOMIC 绑定输入
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
BROADCASTATOMIC | 1 | 0b1 | 主机绑定输入,用于控制从接口发出的原子事务。 |
从机支持
从机支持原子事务是可选的。
如果从机仅支持特定内存类型或特定地址区域的原子事务,则从机必须对其不支持的原子事务给出适当的错误响应。
互连支持
互连支持原子事务是可选的。
如果互连不支持原子事务,则所有连接的主机必须配置为不生成原子事务。
在支持原子事务的互连中的任何点都可以支持原子事务,包括将原子事务向下传递到从机。
并非每个地址位置都要求支持原子事务。如果给定地址位置不支持原子事务,则可以对此事务给出适当的错误响应。详见 A4.3 事务响应 。
对于设备事务,原子事务必须传递给端点从机。如果从机被配置为指示其不支持原子事务,则互连必须对此事务给出错误响应。 不得将原子事务传递给不支持原子事务的组件。
对于可缓存事务,互连可以选择:
- 在互连内执行原子操作。此方法要求互连执行适当的读取、写入和侦听事务以完成操作。
- 如果适当的端点从机被配置为指示其支持原子操作,则互连可以将原子操作传递给从属。
A第8章 请求操作码
请求操作码指示请求的功能以及从机如何处理该请求。 本章总结了所有可用的操作码,并在表中提供了链接,以详细描述它们的工作原理。它包含以下部分:
A8.1 操作码信号
请求操作码通过AWSNOOP和ARSNOOP信号进行传达。
表 A8.1 AxSNOOP信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWSNOOP | AWSNOOP_WIDTH | 0x00 WriteNoSnoop/WriteUniquePtl/Atomic | 写通道的请求操作码 |
ARSNOOP | ARSNOOP_WIDTH | 0x0 ReadNoSnoop/ReadOnce | 读通道的请求操作码 |
WriteNoSnoop、WriteUniquePtl、ReadNoSnoop 和 ReadOnce 是默认的操作码,用于通用请求AxSNOOP。
宽度属性在 表 A8.2 被定义。
表 A8.2 AxSNOOP位宽属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
AWSNOOP_WIDTH | 0,4,5 | 4 | AWSNOOP位宽 |
ARSNOOP_WIDTH | 0,4 | 4 | ARSNOOP位宽 |
如果以下任何属性不为 False,则 AWSNOOP_WIDTH 必须为 5:
- WriteDeferrable_Transaction
- UnstashTranslation_Transaction
- InvalidateHint_Transaction
如果以下任何属性不为 False,则 AWSNOOP_WIDTH 必须为 4 或 5:
- Shareable_Cache_Support
- WriteNoSnoopFull_Transaction
- CMO_On_Write
- WriteZero_Transaction
- Cache_Stash_Transactions
- Untranslated_Transactions
- Prefetch_Transaction
如果以下任何属性不为 False,则 ARSNOOP_WIDTH 必须为 4:
- Shareable_Cache_Support
- DeAllocation_Transactions
- CMO_On_Read
- DVM_Message_Support
任何未由接口驱动的 AxSNOOP 位都假定为 LOW。
仅发出 WriteNoSnoop/WriteUniquePtl/Atomic 请求的主机可以将 AWSNOOP_WIDTH 设置为 0, 从而从其接口中省略 AWSNOOP 输出。连接的从机必须将其 AWSNOOP 输入连接为 LOW。
仅发出 ReadNoSnoop/ReadOnce 请求的主机器可以将 ARSNOOP_WIDTH 设置为 0,从而从其接口中省略 ARSNOOP 输出。 连接的从机必须将其 ARSNOOP 输入连接为 LOW。
A8.2 AWSNOOP编码
AWSNOOP的编码如 表 A8.3 所示。 一些操作码取决于请求的域。Enable列列出了决定主机是否被允许使用操作码以及从机是否支持的属性表达式。
未列出的AWSNOOP和AWDOMAIN组合是非法的。
表 A8.3 AWSNOOP编码
AWSNOOP | AWDOMAIN A[8-1] | Opcode | Enable | Description |
---|---|---|---|---|
0b00000 | NSH, SYS | WriteNoSnoop | - | 写入不可共享或系统位置。 |
0b00000 | SH | WriteUniquePtl | Shareable_Transactions | 写入共享位置。 |
0b00000 | NSH, SH, SYS | Atomic | Atomic_Transactions | 非0的AWATOP信号指示的原子事务. |
0b00001 | NSH | WriteNoSnoopFull | WriteNoSnoopFull_Transaction 或 Shareable_Cache_Support | 缓存行大小且常规的。 写入到不可共享位置。 |
0b00001 | SH | WriteUniqueFull | Shareable_Transactions | 写入到可共享位置。 |
0b00010 | - | RESERVED | - | - |
0b00011 | SH | WriteBackFull | Shareable_Transactions 和 Shareable_Cache_Support | 缓存行大小且常规的。 写入到可共享位置。 该行被保存在一致的缓存中并且是Dirty的。 |
0b00100 | - | RESERVED | - | - |
0b00101 | SH | WriteEvictFull | Shareable_Transactions和 Shareable_Cache_Support | 缓存行大小且常规的。 写入到可共享位置。 该行被保存在一致的缓存中并且是Clean的。 |
0b00110 | NSH, SH | CMO | CMO_On_Write | 一个无数据请求表示必须执行缓存维护操作。 具体操作编码在AWCMO信号上。 缓存行大小且常规的。 |
0b00111 | NSH, SH, SYS | WriteZero | WriteZero_Transaction | 缓存行大小且常规的。 每个字节的值都是0. |
0b01000 | SH | WriteUniquePtlStash | Shareable_Transactions 和Cache_Stash_Transactions | 缓存行大小或者更小的。 写入共享位置表明数据可被分配到缓存。 |
0b01001 | SH | WriteUniqueFullStash | Shareable_Transactions 和Cache_Stash_Transactions | 缓存行大小且常规的。 写入共享位置表明数据可被分配到缓存。 |
0b01010 | NSH, SH | WritePtlCMO | Write_Plus_CMO | 缓存行大小或者更小。 写入任何缓存副本的位置根据AWCMO信号必须是clean和/或使其失效。 |
0b01011 | NSH, SH | WriteFullCMO | Write_Plus_CMO | 缓存行大小且常规的。 写入任何缓存副本的位置根据AWCMO信号必须是clean和/或使其失效。 |
0b01100 | NSH, SH | StashOnceShared | Cache_Stash_Transactions | 缓存行大小且常规的。 一个无数据的请求,表示应该将一个缓存行获取到缓存中。其他副本的行不需要被失效。 |
0b01101 | NSH, SH | StashOnceUnique | Cache_Stash_Transactions | 缓存行大小且常规的。 一个无数据的请求,表示应该将一个缓存行获取到缓存中。其他副本的行需要被失效。 |
0b01110 | NSH, SH, SYS | StashTranslation | Untranslated_Transactions 和 Cache_Stash_Transactions | 一个无数据的请求,表示转换应该被缓存到MMU。 |
0b01111 | NSH, SH | Prefetch | Prefetch_Transaction | 缓存行大小且常规的。 无数据请求,这表明主机可能在稍后的时间读取指定的缓存行。 |
0b10000 | SYS | WriteDeferrable | WriteDeferrable_Transaction | 一个64字节的原子写,其中从机可以给出DEFER或UNSUPPORTED响应。 |
0b10001 | NSH, SH, SYS | UnstashTranslation | UnstashTranslation_Transaction | 一个无数据的请求,表示着一个转换不太可能再被使用。 |
0b10010 | NSH, SH | InvalidateHint | InvalidateHint_Transaction | 缓存行大小且常规的。 一个无数据的请求,它表明缓存行不再需要,可以使其失效。 允许进行回写,但不是必须的。 |
0b10011 to 0b11111 | - | RESERVED | - | - |
A[8-1] : NSH是不可共享的(0b00),SH是可共享的(0b01或0b10),SYS是系统(0b11)。
A8.3 ARSNOOP编码
ARSNOOP的编码如 表 A8.4 所示。 一些操作码取决于请求的域。Enable列列出了决定主机是否被允许使用该操作码,以及从机是否支持它的属性表达式。
未列出的ARSNOOP和ARDOMAIN组合是非法的。
表 A8.4 ARSNOOP编码
ARSNOOP | ARDOMAIN A[8-2] | Opcode | Enable | Description |
---|---|---|---|---|
0b0000 | NSH, SYS | ReadNoSnoop | - | 从不可共享或系统位置读取。 |
0b0000 | SH | ReadOnce | Shareable_Transactions | 从可共享位置读取并且主机不会缓存。 |
0b0001 | SH | ReadShared | Shareable_Transactions and Shareable_Cache_Support | 缓存行大小且常规的。 来自可共享位置的读取结果可能被保存在缓存中并且可以是Dirty的。 |
0b0010 | SH | ReadClean | Shareable_Transactions and Shareable_Cache_Support | 缓存行大小且常规的。 来自可共享位置的读取结果可能被保存在缓存中并且是Clean的。 |
0b0011 | - | RESERVED | - | - |
0b0100 | SH | ReadOnceCleanInvalid | Shareable_Transactions and DeAllocation_Transactions | 缓存行大小或更小的。 来自可共享位置的读取结果不会被保存在缓存中。 建议将缓存副本Clean且失效。 |
0b0101 | SH | ReadOnceMakeInvalid | Shareable_Transactions and DeAllocation_Transactions | 缓存行大小或更小的。 来自可共享位置的读取结果不会被保存在缓存中。 缓存副本建议是无写回的失效。 |
0b0110 | - | RESERVED | - | - |
0b0111 | - | RESERVED | - | - |
0b1000 | NSH, SH | CleanShared | CMO_On_Read | 缓存行大小且常规的。 请求清除所有缓存行的副本。 |
0b1001 | NSH, SH | CleanInvalid | CMO_On_Read | 缓存行大小且常规的。 请求清除并失效所有缓存行的副本。 |
0b1010 | NSH, SH | CleanSharedPersist | CMO_On_Read and Persist_CMO | 缓存行大小且常规的。 请求清除所有缓存行的副本 清理后的数据必须经过持久性点或深度持久性点。 |
0b1011 | - | RESERVED | - | - |
0b1100 | - | RESERVED | - | - |
0b1101 | NSH, SH | MakeInvalid | CMO_On_Read | 缓存行大小且常规的。 请求清除并失效所有缓存行的副本。Dirty数据不需要写入内存。 |
0b1110 | SH | DVM Complete | DVM_Message_Support | 表示DVM同步消息已完成。 |
0b1111 | - | RESERVED | - | - |
A[8-2] : NSH是不可共享的(0b00),SH是可共享的(0b01或0b10),SYS是系统(0b11)。
A第9章 缓存
本章节描述了AXI协议中的缓存。 它包含以下部分:
A9.1 缓存
在本规范中,术语缓存用于任何存储结构,包括缓存、缓冲区或其他中间存储元素。 数据可以在系统的各个点进行缓存。 示例拓扑如 图 A9.1 所示。 在这个例子中,有一个系统缓存,所有代理都可以看到,本地可共享缓存所有一致代理都可以看到,以及本地不可共享缓存仅对单个代理可见。
完全一致的代理使用硬件一致性和数据监听来保持其缓存的一致性。 这些通常使用AMBA CHI接口 A[5] 。
I/O一致的代理可以与完全一致的代理共享数据,但任何在它们本地缓存的数据必须手动维护以确保一致性。
非一致性代理必须手动维护与其他代理共享并在本地缓存的任何数据。
A9.2 缓存行大小
缓存行被定义为顺序字节地址内存位置的缓存副本,第一个地址与缓存行的总大小对齐。 采用缓存共享的系统必须具有相同的缓存行大小。 一些事务仅在整个缓存行上操作,必须是缓存行大小。
缓存行大小在设计时是固定的,并使用Cache_Line_Size属性定义。
表 A9.1 Cache_Line_Size属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
Cache_Line_Size | 16,32,64,128,256,512,1024,2048 | 64 | 缓存行大小以字节为单位。 |
对于任何传输缓存行大小化事务的接口,数据宽度必须足够宽,以便使用16次传输或更少来传送一个缓存行。
为了与AMBA CHI兼容,缓存行大小必须为64字节。
事务必须为缓存行大小化和常规的操作码见 表 A9.2 。 有关常规事务的更多信息,请参见 A4.1.8 常规事务 。
表 A9.2 缓存必须大小化和常规的操作码
读通道事务 | 写通道事务 |
---|---|
ReadShared | WriteNoSnoopFull |
ReadClean | WriteUniqueFull |
CleanShared | WriteBackFull |
CleanInvalid | WriteEvictFull |
MakeInvalid | CMO |
CleanSharedPersist | WriteZero |
WriteUniqueFullStash | |
WriteFullCMO | |
StashOnceShared | |
StashOnceUnique | |
Prefetch | |
InvalidateHint |
缓存行大小化,常规事务具有以下约束:
- Size x Length必须等于缓存行大小。
- Length可以是1、2、4、8或16。
- 如果Length大于1,Size必须等于数据通道宽度。
- 突发不得为FIXED。
- 如果突发为INCR,地址必须与缓存行大小对齐。
- 如果突发为WRAP,地址必须与Size对齐。
- 请求必须可修改,即AxCACHE[1]被断言。
- 请求不得为独占访问,即AxLOCK被取消断言。
- 具有写数据的事务必须在缓存行容器内断言所有字节strobes。
A9.3 缓存一致性和域
当多个主机共享数据时,这些主机的写入操作必须是一致的。 这意味着两个主机对同一地址位置的写入操作在所有参与主机中是可观察到的,并且顺序相同。
如果系统包含缓存,则必须采取措施确保缓存值不会过时。
在AMBA中,可以通过三种方式实现这一点:
- 使用非缓存事务。
- 通过手动缓存维护进行软件一致性。
- 通过侦听和自动缓存维护实现硬件一致性。
AXI通过为每个地址位置分配一个域来支持这些功能,这可以是系统(System)、不可共享(Non-shareable)或可共享(Shareable)。 必须对以下内容有一致的定义:
- 哪些地址位置属于每个域。
- 一个地址位置归属于哪个域。
A9.3.1 系统域
系统域中的地址位置必须对所有能够访问它们的主机者可见。 这是通过确保所有系统域请求都是不可缓存的,因此不会存储在任何本地缓存中来实现的。 使用系统域使一致性变得简单,但通常性能并不高。
对设备类型内存的请求需要使用系统域。
A9.3.2 非共享域
非共享域中的地址位置不需要对其他主机可见。 对非共享位置的事务无需触发硬件一致性机制以确保可见性。
如果非共享数据在主机之间共享,则必须发出称为缓存维护操作(CMO)的事务,以在读取数据之前清除和使数据在任何本地缓存中无效。 有关更多详细信息,请参见 A第10章 缓存维护 。
使用CMO进行数据共享称为软件一致性,如果主机之间的共享行为已知,这可以是一种有效的方法。 例如,如果有可预测的数据集由一个代理写入,然后由另一个代理读取。 这种方法的主要缺点是它依赖于软件的正确性。 软件中的一致性错误很容易出现,且难以调试。
为了避免一致性的丧失,在缓存非共享行时有一些规则:
- 不允许clean非共享数据的逐出和写回。这是为了避免clean行覆盖了由其他主机写入的下游缓存中的dirty行。
- 不允许在从一个缓存读取非共享行时将dirty数据传递到另一个缓存。该行必须作为clean行传递,写回该行的责任仍由下游缓存承担。 这避免了后续的写回操作覆盖来自其他主机的最新更新。
A9.3.3 可共享域
地址位于可共享域的位置必须对所有其他也将这些位置标记为可共享的主机可见。 具有可共享属性的请求必须侦听本地缓存并查询可能包含来自其他主机的可共享数据的缓存。
一个 AXI 组件可能需要支持可共享域的两个原因是:
- 实现 I/O 一致性。
- 支持可共享缓存行在上游和下游缓存之间的移动。
这些情况在 A9.4 IO一致性 和 A9.5 可共享缓存行 中进行了说明。
可共享域中的请求可以使用 INCR 或 WRAP 的突发类型,而不是 FIXED。
A9.3.4 域信号
域信号是可选的,如果接口没有域信号,则非缓存请求被认为在系统域内,而缓存请求被认为在非共享域内。
如果一个组件需要支持共享域,则必须包含域信号。
Shareable_Transactions 属性用于描述一个接口是否支持共享域,从而决定是否具有域信号。
表 A9.3 Shareable_Transactions属性
Shareable_Transactions | 默认 | 描述 |
---|---|---|
True | 可共享域支持。 AxDOMAIN 信号在接口上。 | |
False | Y | 可共享域支持。 AxDOMAIN 信号不在接口上。 |
当Shareable_Transactions为真时,以下信号会包含在接口中。
表 A9.5 AxDOMAIN信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWDOMAIN ARDOMAIN | 2 | 0b00:缓存请求 0b11:非缓存请求 | 请求的共享域特性。 |
Shareable_Transactions编码在AxDOMAIN信号中,如下所示
表 A9.5 AxDOMAIN编码
AxDOMAIN | Label | Meaning |
---|---|---|
0b00 | Non-shareable | Non-shareable domain |
0b01 | Shareable | Shareable domain |
0b10 | Shareable | Shareable domain |
0b11 | System | System domain |
在该规范的早期版本中,AxDOMAIN 值 0b01 和 0b10 分别表示内共享和外共享。 在本版本中,建议使用 0b10 来表示共享域。
连接具有不同 Shareable_Transactions 值的主机和从属接口的指导见表 表 A9.6 。
Shareable_Transactions | 从机:False | 从机:True |
---|---|---|
主机:False | 兼容 | 如果添加逻辑以从AxCACHE生成默认的AxDOMAIN值则兼容。 |
主机:True | 兼容 AxDOMAIN输出不连接。 | 兼容 |
A9.3.5 域一致性
地址位置可以标记为某一代理可共享而对另一代理不可共享。 为了避免一致性丧失,作为不可共享缓存的数据必须在被标记为可共享的代理访问之前通过CMO使其可见。
A9.3.6 域和内存类型
域和内存类型的组合决定了完成事务必须访问哪些缓存。
合法的内存类型和域的组合如 表 A9.7 所示。该表还指明了在处理请求时必须访问哪些缓存。
- (Peer)对等缓存是通过侦听请求访问的缓存,这需要像AMBA CHI这样的连贯协议。
- (Inline)内联缓存是请求在向内存进行时经过的缓存。
表 A9.7 内存类型和域的合法组合
Memory type | Domain | Caches accessed |
---|---|---|
Device (AxCACHE[3:1] == 0b000) | System | None |
Normal Non-cacheable(AxCACHE[3:1] == 0b001) | Non-shareable | None |
Normal Non-cacheable(AxCACHE[3:1] == 0b001) | Shareable Peer | caches |
Normal Non-cacheable(AxCACHE[3:1] == 0b001) | System (recommended) | None |
Normal Cacheable(AxCACHE[3:2] != 0b00) | Non-shareable | Inline caches |
Normal Cacheable(AxCACHE[3:2] != 0b00) | Shareable | Inline and peer cache |
Note:正常的非缓存共享是被允许但不被期望的。一些实现可能不会在对非缓存访问时查看对等缓存。
A9.4 IO一致性
一个I/O一致性主机可以通过一致性互连在可共享域中读取和写入数据,但它不能被侦听,因此不能缓存可共享数据。 AXI不支持数据侦听,因此一致性互连通常基于AMBA CHI协议 A[5] ,并使用AXI接口连接I/O一致性主机。
当 I/O 一致性主机发出可共享读请求时,一致性互连会通过观察适当的一致性缓存并检查其缓存中的可共享行来尝试找到数据。 如果找不到数据,则向内存发送请求。当数据返回时,不能由 I/O 一致性主机缓存,因为数据可能会变得过时。
当 I/O 一致性主机发出可共享写请求(WriteUniquePtl 或 WriteUniqueFull)时,一致性互连会向一致性缓存发出清除和失效请求,以确保没有本地副本。 然后将数据写入缓存或内存。对于部分缓存行写入,在一致性缓存中找到的任何dirty数据都可以与写入合并。 对于 I/O 一致性接口,Shareable_Cache_Support 属性必须为 False。
A9.5 可共享缓存行
一个基于AXI的缓存,可以在一个一致性的互连下游,选择存储可共享行以及不可共享缓存行。这具有以下优点:
- 可共享行的clean evictions可以被缓存,但必须不写回内存。
- 可共享行中的dirty数据可以被传递到上游的可共享缓存。
为此,需要额外的操作码和响应。如果缓存还存储不可共享域中的行,则缓存还必须跟踪哪些行是可共享的。 在这种情况下,一个有效的缓存行可以有四种状态:
- Clean
- Dirty
- Shareable-Clean
- Shareable-Dirty
关于哪些操作码可以命中哪些缓存行的规则如 表 A9.8 下所示。
Opcode | Domain | Clean | Dirty | Shareable-Clean | Shareable-Dirty |
---|---|---|---|---|---|
Read* | Non-shareable | Permitted to hit | Permitted to hit | Must not hit | Permitted to hit A[9-1] |
Read* | Shareable | Permitted to hit | Must hit | Permitted to hit | Must hit A[9-2] |
Write* | Non-shareable | Must hit | Must hit | Must not hit | Permitted to hit A[9-1] |
Write* | Shareable | Must hit | Must hit | Must hit | Must hit |
CleanShared* | Non-shareable | Permitted to hit | Must hit | Permitted to hit | Permitted to hit |
CleanShared* | Shareable | Permitted to hit | Must hit | Permitted to hit | Must hit |
CleanInvalid* / MakeInvalid | Non-shareable | Must hit | Must hit | Permitted to hit A[9-3] | Permitted to hit A[9-3] |
CleanInvalid* / MakeInvalid | Shareable | Must hit | Must hit | Must hit | Must hit |
InvalidateHint / Prefetch | Non-shareable | Permitted to hit | Permitted to hit | Permitted to hit | Permitted to hit |
InvalidateHint / Prefetch | Shareable | Permitted to hit | Permitted to hit | Permitted to hit | Permitted to hit |
StashOnce* | Non-shareable | Permitted to hit | Permitted to hit | Must not hit | Permitted to hit |
StashOnce* | Shareable | Permitted to hit | Permitted to hit | Permitted to hit | Permitted to hit |
星号(*)表示操作码的所有变体。
A[9-1] :该行不再标记为可共享。
A[9-2] :如果请求是 ReadShared,则可以在上游提供dirty数据。
A[9-3] :如果 RME_Support 为 True,则必须命中。
A9.5.1 支持完整缓存行读写的操作码
以下操作码可以用于读取和写入完整的缓存行数据。使用这些操作码的事务必须是缓存行大小且为常规类型。对于写入事务,所有写入strobes信号必须被激活。
ReadClean
从可共享位置读取完整的缓存行,其中数据很可能分配在上游缓存中,读取的数据必须是clean的。
如果Shareable_Cache_Support和Shareable_Transactions 两个属性都为真,则可以使用此操作码。
ReadShared
从可共享位置读取完整的缓存行,其中数据很可能分配在上游缓存中 读取的数据可以是clean的或dirty。如果数据是dirty的,该行必须在上游分配, 并且所有读取数据的传输响应必须是OKAYDIRTY而不是OKAY。
如果Shareable_Cache_Support和Shareable_Transactions两个属性都为真,则可以使用此操作码。
WriteNoSnoopFull
对完整缓存行的非共享写入,其中数据为dirty并且未在上游分配。
当上游缓存驱逐一个非共享dirty缓存行或流式写入缓存行大小的数据时,可以发出WriteNoSnoopFull事务。 如果下游缓存收到WriteNoSnoopFull请求,它可以分配该行,知道该行未在上游分配。
如果WriteNoSnoopFull事务或Shareable_Cache_Support属性为真,则可以使用此操作码。
表 A9.9 WriteNoSnoopFull_Transaction 属性
WriteNoSnoopFull_Transaction | 默认 | 描述 |
---|---|---|
True | WriteNoSnoopFull 支持 | |
False | Y | 除非Shareable_Cache_Support为True,否则WriteNoSnoopFull不支持。 |
WriteUniqueFull
一个可共享的完全缓存行的写入,其中数据是dirty的但未在上游分配。
该事务由I/O一致主机使用,以写入可能存储在一致性域内缓存中的缓存行。系统缓存可以将该行分配为可共享的dirty数据。
如果Shareable_Transactions属性为真,则可以使用此操作码。
WriteBackFull
当可共享的dirty缓存行从一致性缓存中驱逐时,可以使用WriteBackFull事务。 该事务使系统缓存能够将该行分配为可共享的dirty数据。
如果Shareable_Cache_Support和Shareable_Transactions属性均为真,则可以使用此操作码。
WriteEvictFull
当可共享的clean缓存行从一致性缓存中驱逐时,可以使用WriteEvictFull事务。该事务使系统缓存能够将该行分配为可共享的clean数据。
可共享的clean缓存行不得暴露给可共享域外的任何代理,因为该行可能在可共享域内的缓存中变得过时。 出于同样的原因,WriteEvictFull的数据显示不得更新内存。
如果Shareable_Cache_Support和Shareable_Transactions属性均为真,则可以使用此操作码。
A9.5.2 可共享内存支持的配置
Shareable_Cache_Support属性用于指示一个接口是否支持存储一致性缓存行所需的附加事务操作码。
表 A9.10 Shareable_Cache_Support 属性
Shareable_Cache_Support | 默认 | 描述 |
---|---|---|
True | 支持对可缓存行的附加操作码。 | |
False | Y | 不支持对可缓存行的附加操作码。 |
根据Shareable_Cache_Support属性的值,显示了主机和从机之间的兼容性。
表 A9.11 Shareable_Cache_Support 兼容性
Shareable_Cache_Support | 从机:False | 从机:True |
---|---|---|
主机:False | 兼容 | 兼容 |
主机:True | 不兼容。 必须使用替代操作码。 | 兼容 |
可共享请求也可以在重置时通过可选的主机输入信号BROADCASTSHAREABLE进行控制。
表 A9.13 BROADCASTSHAREABLE 信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
BROADCASTSHAREABLE | 1 | 0b1 | 主机绑定输入,用于控制从机发出的可共享事务。 |
当BROADCASTSHAREABLE存在且未激活时,所有事务在发送之前都转换为非共享等效项,如图所示
表 A9.13 替代操作码
Opcode | BROADCASTSHAREABLE is LOW |
---|---|
WriteUniquePtl | WriteNoSnoop |
WriteUniqueFull | WriteNoSnoop or WriteNoSnoopFull |
WriteBackFull | WriteNoSnoop or WriteNoSnoopFull |
WriteEvictFull | - (request must be dropped) |
CMO (Shareable) | CMO (Non-shareable) |
WriteUniquePtlStash | WriteNoSnoop |
WriteUniqueFullStash | WriteNoSnoop or WriteNoSnoopFull |
WritePtlCMO (Shareable) | WritePtlCMO (Non-shareable) |
StashOnceShared (Shareable) | StashOnceShared (Non-shareable) |
StashOnceUnique (Shareable) | StashOnceUnique (Non-shareable) |
Prefetch (Shareable) | Prefetch (Non-shareable) |
ReadOnce | ReadNoSnoop |
ReadShared | ReadNoSnoop |
ReadClean | ReadNoSnoop |
ReadOnceCleanInvalid | ReadNoSnoop |
ReadOnceMakeInvalid | ReadNoSnoop |
A9.6 预取事务
当一个主机有迹象表明可能需要某个地址的数据,但还不想承诺立即读取时,它可以向系统发送预取请求,以提前准备该位置进行读取。 这个请求可以导致数据分配到下游缓存或从片外内存中提取,随后主机才会发出实际的读取请求。
预取请求不需要与其他请求(如CMO)有顺序关系,因此不应使用预取来指示某一行可以被提取到受管或可见缓存中。
对读取请求的预取响应表明该事务命中了预取的数据。 主机可以将此作为启发式的一部分,以决定是否继续发出预取请求。
在AMBA CHI A[5] 中,预取请求的等价物是PrefetchTgt,可以与同一地址的连贯请求同时发出。 PrefetchTgt可以绕过任何连贯性检查,并使内存控制器预取数据,以防连贯请求在任何共享缓存中找不到该数据。 如果内存控制器使用AXI接口,则CHI PrefetchTgt请求可以转换为AXI预取请求。
A9.6.1 预取事务的规则
预取是一个无数据事务,其规则如下:
- 预取事务由AW通道上的请求和B通道上的单个响应传输组成,没有数据传输。
- 预取请求通过0b01111的AWSNOOP操作码进行信号传递。
- 预取请求必须是缓存行大小,并具有以下约束:
- 该事务是常规的,详见 A4.1.8 常规事务 。
- AWCACHE[1]被断言,即为正常事务。 – AWDOMAIN为Non-shareable或Shareable。
- AWLOCK未被断言,不为独占访问。
- ID值必须在事务中唯一,这意味着:
- 仅当没有使用相同AWID的未决写入事务时,才能发出预取请求。
- 主机不得对与未决的预取请求具有相同AWID的写通道发出请求。
- 如果接口上存在,预取事务必须确认AWIDUNQ。
- 主机可以选择是否在预取请求之后对同一地址发出非预取请求。
- 任一级的下级接口可以选择传播或响应预取请求。
- 允许以OKAY、DECERR、SLVERR或TRANSFAULT响应预取请求。无论下级是否对预取请求采取行动,均可发送OKAY响应。
Prefetch_Transaction 属性用于指示组件是否支持预取操作码,如 表 A9.14 所示。
表 A9.14 Prefetch_Transaction属性
Prefetch_Transaction | 默认 | 描述 |
---|---|---|
True | 支持预取 | |
False | Y | 不支持预取 |
A9.6.2 预取数据的响应
如果读取请求命中由于之前的预取请求而准备好的数据,从机可以返回预取响应。 这个响应可以被主机用来确定其预取请求的成功率。
预取响应有以下规则和建议:
- 预取响应使用RRESP编码0b100进行信号传递。
- 当Prefetch_Transaction为真时,RRESP_WIDTH必须为3,以便启用预取响应的信号传递。
- 预取表示读取的数据是有效的,并且来自于预取源。
- 预取可用于以下交易类型的响应:
- ReadNoSnoop
- ReadOnce
- ReadClean
- ReadShared
- ReadOnceCleanInvalid
- ReadOnceMakeInvalid
- 不能为独占读取发送预取响应。
- 建议在一个缓存行内使用预取响应进行所有数据传输或不进行数据传输。如果一个事务跨越多个缓存行,则每个访问的缓存行可以混合使用预取和其他响应。
- 只有在接口的Prefetch_Transaction属性为真时,才能发送预取响应。
- 即使主机没有向该位置发送预取请求,也可以向主机发送预取响应。例如,如果主机恰好读取了被另一个主机预取的数据。
A9.7 缓存存储
缓存存储使一个组件能够指示数据应放置在系统中的另一个缓存中。 这种技术可以确保数据靠近其使用点,从而潜在地提高整体系统的性能。 AXI协议支持带或不带存储目标ID的缓存存储请求。
缓存存储是一个提示。缓存或系统组件可以选择忽略请求的存储部分。
I/O一致的AXI主机可以请求数据存储在具有AMBA CHI接口 A[5] 的完全一致的主机中。
A9.7.1 暂存事务操作码
有四个 Opcodes 可用于暂存。
WriteUniquePtlStash
写入可共享位置,指示数据应分配到缓存中。可以写入缓存行中的任意数量的字节,包括所有字节或零字节。
WriteUniqueFullStash
将完整的缓存行数据写入可共享位置,指示数据应分配到缓存中。事务必须是缓存行大小且为常规事务。所有写入信号必须被断言。
StashOnceShared
一种无数据事务,指示应将缓存行提取到特定缓存中。其他行的副本不需要失效。
StashOnceUnique
一种无数据事务,指示应将缓存行提取到特定缓存中。建议失效所有其他副本。
StashOnceUnique 事务可能导致缓存行的缓存副本失效,必须注意确保此类事务不会干扰独占访问序列。
对于支持未转换事务特性的接口,还支持额外的存储事务。 StashTranslation 事务用于向系统内存管理单元(SMMU)指示应为随 StashTranslation 事务提供的地址获取转换。 请参见 A14.7 暂存转换操作码
A9.7.2 暂存信号
暂存请求在写请求通道上发送,并在写响应通道上有单一的响应传输。 与暂存事务一起写入的内容也包括写入数据。
暂存请求在域、大小和长度上有约束,如 表 A9.15 所示。缓存暂存事务不允许跨越缓存行边界。
表 A9.15 暂存请求的域、大小、长度约束
操作码 | AWSNOOP | 域 | 大小和长度 |
---|---|---|---|
WriteUniquePtlStash | 0b1000 | 可缓存 | 缓存大小或者更小 |
WriteUniqueFullStash | 0b1001 | 可缓存 | 缓存行大小以及常规 |
StashOnceShared | 0b1100 | 不可缓冲和可缓存 | 缓存行大小以及常规 |
StashOnceUnique | 0b1101 | 不可缓冲和可缓存 | 缓存行大小以及常规 |
以下约束也适用于所有暂存请求操作码:
- AWCACHE[1] 为0b1:可修改
- AWLOCK为0b0:非独占访问
- AWTAGOP为0b00:无效的
- AWATOP0b00000:非原子操作
A9.7.3 暂存请求域
暂存请求的域决定了将检查哪些缓存以获取缓存行以及如何获取和存储该行。
对可共享位置的暂存请求意味着该行可以存储在对等缓存或内联缓存中。 如果暂存请求导致缓存发出下游请求,则如果可能的话应该是可共享的。对存储的写入必须始终指向可共享位置。
对非共享位置的暂存请求意味着该行可以存储在内联缓存中。 如果暂存请求导致缓存发出下游请求,则必须是非共享的。 StashOnceShared 和 StashOnceUnique 操作码可以是可共享或非共享位置。
A9.7.4 暂存目标ID
一个暂存请求可以选择性地包含目标ID,以指示首选用于暂存数据的特定缓存。 该规格未定义该识别机制的具体细节。预计执行暂存操作的任何代理都知道用于特定暂存事务的ID。 该规格定义了两个识别级别:
- 节点 ID 用于识别缓存存储应发送到的物理接口。
- 逻辑处理器 ID 用于识别与该物理接口相关的功能单元。
例如,暂存事务可以指定一个处理器集群接口和该集群内的具体缓存。
用于指示存储目标的信号如 表 A9.16 所示。
表 A9.16 表明暂存目标的信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWSTASHNID | 11 | 全0 | 暂存操作目标的节点id。 |
AWSTASHNIDEN | 1 | 0b0 | 暂存操作目标节点id的使能。 |
AWSTASHLPID | 5 | 0x00 | 暂存操作目标的逻辑处理器id。 |
AWSTASHLPIDEN | 1 | 0b0 | 暂存操作目标的逻辑处理器id的使能。 |
节点ID和逻辑处理器ID信号在接口上是可选的,分别通过STASHNID_Present和STASHLPID_Present属性进行控制。
表 A9.17 STASHNID_Present 属性
STASHNID_Present | 默认 | 描述 |
---|---|---|
True | AWSTASHNID和AWSTASHNIDEN存在。 | |
False | Y | AWSTASHNID和AWSTASHNIDEN不存在。 |
STASHLPID_Present | 默认 | 描述 |
---|---|---|
True | AWSTASHLPID和AWSTASHLPIDEN存在。 | |
False | Y | AWSTASHLPID和AWSTASHLPIDEN不存在。 |
每个暂存目标ID都有一个使能信号,因此 NID 和 LPID 可以独立控制:
- 对于暂存事务,允许任何目标使能的组合。
- 对于非暂存事务,AWSTASHLPIDEN 和 AWSTASHNIDEN 必须为低。
- 当 AWSTASHNIDEN 为低时,AWSTASHNID 为无效且必须为零。
- 当 AWSTASHLPIDEN 为低时,AWSTASHLPID 为无效且必须为零。
- 发送一个指示不支持缓存暂存的暂存目标的暂存事务是被允许的,但不推荐。
对于无目标的 WriteUniquePtlStash 和 WriteUniqueFullStash 请求,建议如下:
- 如果互连可以确定在写入发生之前该行被单个缓存持有,则将缓存行暂存到该缓存。
- 如果在写入发生之前,该缓存行不被任何缓存持有,则将在共享系统缓存中暂存该缓存行。
对于无目标的 StashOnceShared 和 StashOnceUnique 请求:
- 如果互连可以确定缓存行不在任何缓存中,则建议在共享系统缓存中暂存该缓存行。
- 组件可以使用此功能将缓存行预取到下游缓存以供其自己使用。
A9.7.5 暂存事务的id
对于WriteUniquePtlStash和WriteUniqueFullStash事务,不存在对AXI ID值的使用限制。
StashOnceShared和StashOnceUnique可以称为StashOnce事务。 StashOnce事务不得使用与同时存在的非StashOnce事务相同的AXI ID值。 这条规则确保了StashOnce事务与其他事务之间不存在排序约束。 因此,丢弃StashOnce请求的组件可以在不检查ID排序要求的情况下立即响应。
允许StashOnce事务和非StashOnce事务使用相同的AXI ID值,前提是同一个ID值不能同时被StashOnce事务和非StashOnce事务使用。
可以有多个具有相同ID的未完成StashOnce事务。
可以有多个具有相同ID的未完成非StashOnce事务。
为StashOnce事务使用唯一的ID值确保在不支持这些事务时可以给出立即响应。
A9.7.6 暂存事务的支持
Cache_Stash_Transactions 属性用于指示接口是否支持缓存暂存,如 表 A9.19 所示。
表 A9.19 Cache_Stash_Transactions 属性
Cache_Stash_Transactions | 默认 | 描述 |
---|---|---|
True | 所有缓暂存的操作码都被支持。 可能有或者没有暂存目标。 | |
Basic | 仅支持 StashOnceShared 操作码。 不允许使用暂存目标。 STASHLPID_Present 和 STASHNID_Present 必须为False | |
False | Y | 缓存暂存不支持且相关信号被省略。 |
表 A9.20 Cache_Stash_Transactions 兼容性
Cache_Stash_Transactions | 从机:False | 从机:Basic | 从机:True |
---|---|---|---|
主机:False | 兼容 | 兼容 | 兼容 |
主机:Basic | 不兼容。 参考 表 A9.21 | 兼容 | 兼容 |
主机:True | 不兼容。 参考 表 A9.21 | 不兼容 | 兼容 |
如果主机向不支持的目标发出暂存请求,则可以在主机或互联上采取行动,如图 表 A9.21 所示。
Stash transaction | Action |
---|---|
WriteUniquePtlStash | 转换为 WriteUniquePtl. |
WriteUniqueFullStash | 转换为 to WriteUniqueFull. |
StashOnceShared | 不传输并且立刻给出响应. |
StashOnceUnique | 不传输并且立刻给出响应 |
A9.8 读取事务撤销分配
读取事务去分配可以用于当某个主机需要的数据不太可能被其他主机再次使用时。 缓存可以将此作为提示以驱逐该行并为其他数据提供资源。
DeAllocation_Transactions属性用于指示组成部分是否支持事务去分配,如 表 A9.22 所示。
发出事务去分配的组件与不支持它们的组件之间的互操作性可以通过将操作码转换为ReadOnce来实现。
表 A9.22 DeAllocation_Transactions属性
DeAllocation_Transactions | 默认 | 描述 |
---|---|---|
True | 支持事务去分配分配。 | |
False | Y | 不支持事务去分配分配。 |
A9.8.1 读取事务撤销分配配操作码
本规范定义了读取请求通道上的两种接触事务分配操作码:
ReadOnceCleanInvalid (ROCI)
该请求读取缓存行当前值的快照。建议,但不要求,任何缓存的缓存行副本被去分配。 如果存在缓存行的dirty拷贝,并且缓存行被接触分配,则该dirty拷贝必须写回主内存。
ReadOnceCleanInvalid 的信号使用 ARSNOOP 值为 0b0100。
ReadOnceMakeInvalid (ROMI)
该请求读取缓存行当前值的快照。建议,但不要求,任何缓存的缓存行副本被接触分配。 允许,但不要求,丢弃缓存行的dirty拷贝。缓存行的dirty拷贝不需要写回主内存。
ReadOnceMakeInvalid 的信号使用 ARSNOOP 值为 0b0101。
A9.8.2 读取事务撤销分配的规则和建议
去分配事务只能同时访问一个缓存行,并且不允许跨越缓存行边界。 大小必须是缓存行大小或更小。
对缓存行某部分的ROMI请求可能导致整个缓存行失效。 一些实现可能不支持小于缓存行的事务去分配行为,而是将此类事务转换为ReadOnce。
ROCI和ROMI仅支持共享域,因此如果DeAllocation_Transactions为True,则Shareable_Transactions属性必须为True。
对于ROMI事务,要求在返回事务的第一个读取数据项之前,必须确认缓存行的失效。 在这一点上,不要求缓存行的失效已完成。 然而,必须确保从此时开始的任何后续写事务不会被此事务使其失效。
以下考虑适用于去分配事务的使用:
- 在去分配事务被发往其他代理正用于独占访问的同一缓存行时需要谨慎。这是因为去分配可能导致独占序列失败。
- 除了与独占访问的交互,ROCI事务仅提供去分配缓存行的提示,对系统的正确性没有其他影响。
- 使用ROMI事务可能会导致dirty缓存行的丢失。此事务的使用必须严格限制在已知安全的情况下。
- 去分配事务不保证缓存行将被清除或失效,因此不能用于确保数据对所有观察者可见。
A9.9 无效指示
InvalidateHint事务是一种无数据的去分配提示。 当一个主机完成对一个数据集的处理,并且该数据可能在下游缓存中分配时,可以使用InvalidateHint请求。 InvalidateHint请求通知缓存,该行不再需要,可以被作废。允许但不要求对该行进行写回。
对于功能正确性,InvalidateHint并不是必需的。因此可以在系统中的任何时刻通过响应BRESP的OKAY来终止。
使用InvalidateHint事务时需要小心,以避免暴露先前被覆盖的值。这可以通过以下方式实现:
- 确保在擦洗写入后执行的干净操作可以确保写入已经传播到足够远的地方,以至于不会被Invalidate Hint事务删除。
- 确保InvalidateHint事务的使用限制在不包含敏感信息的地址范围内。
A9.9.1 无效指示信号
InvalidateHint是一种使用AW和B通道的数据无关事务。
以下约束适用于InvalidateHint请求:
- AWSNOOP为0b10010。
- 如果InvalidateHint_Transaction属性为True,则AWSNOOP必须为5b宽。
- AWDOMAIN可以是非共享的或共享的。
- AWBURST为INCR。
- AWSIZE和AWLEN必须是缓存行大小且为常规。
- AWCACHE为普通可缓存。
- AWID是传输中唯一的,这意味着:
- 仅在写通道上没有使用相同ID值的未完成事务时,才能发出InvalidateHint请求。
- 主机不得在写通道上发出与未完成的InvalidateHint事务相同ID的请求。
- 如果存在,AWIDUNQ必须在InvalidateHint请求中被断言。
- AWLOCK被解除断言,这不是独占访问。
- AWTAGOP为无效。
- AWATOP为非原子操作。
A9.9.2 无效指示支持
InvalidateHint_Transaction 属性用于指示接口是否支持 InvalidateHint 事务,如 表 A9.23 所示。
表 A9.23 InvalidateHint_Transaction属性
InvalidateHint_Transaction | 默认 | 描述 |
---|---|---|
True | 支持InvalidateHint事务。 | |
False | Y | 不支持InvalidateHint事务。 |
根据InvalidateHint_Transaction属性的值,主机和从机之间的兼容性如 表 A9.24 所示。
InvalidateHint_Transaction | 从机:False | 从机:True |
---|---|---|
主机:False | 兼容 | 兼容 |
主机:True | 不兼容。 一个对InvalidateHint响应为OKAY的适配器可以用来使其兼容。 | 兼容 |
A第10章 缓存维护
本章描述了软件缓存管理辅助下的缓存维护操作(CMOs)。它包含以下几个部分:
- A10.1 CMO
- A10.2 CMO动作
- A10.3 CMO请求属性
- A10.4 CMO传播
- A10.5 写通道的CMOs
- A10.6 cmo写
- A10.7 读通道的CMOs
- A10.8 CMOs持续
- A10.9 缓存维护和领域管理扩展
- A10.10 处理器缓存维护指令
A10.1 CMO
缓存维护操作是指示缓存清理和使缓存行失效的请求。 与分配和去分配提示不同,缓存必须执行针对其缓存行的缓存维护操作。
缓存维护操作可以通过读取或写入通道传输。
为了支持遗留组件,本规范将缓存维护操作通过读取通道传输纳入规定。 建议新设计通过写入通道传输缓存维护操作。
该规范支持以下缓存维护操作:
CleanShared(CS)
完成后,所有缓存的目标行副本被清理,并且任何相关的写入都可观察。
CleanSharedPersist(CSP)
完成后,所有缓存的目标行副本被清理,并且任何相关的写入都可观察并且已达到持久性点 (PoP)。 参见 A10.8CMOSs持续 。
CleanSharedDeepPersist(CSDP)
完成后,所有缓存的目标行副本被清理,并且任何相关的写入都可观察并且已达到深度持久性点 (PoDP)。 参见 A10.8CMOSs持续 。
CleanInvalid (CI)
完成后,所有缓存的目标行副本被失效,如果它们是dirty的,则已写入内存。任何相关的写入都可观察。
CleanInvalidPoPA (CIPA)
完成后,所有缓存的目标行副本被失效,并且任何dirty的缓存副本在物理别名点 (PoPA) 之前被写入。参见 A10.9 缓存维护和领域扩展 。
MakeInvalid (MI)
完成后,所有缓存的目标行副本被失效,并且任何dirty的缓存副本可能已被丢弃。
A10.2 CMO动作
当一个组件接收到CMO时,它必须执行以下操作:
- 如果该组件是一个缓存并且CMO是可缓存的,则必须查找该行。
- 如果该组件是一个一致性互连并且CMO是可共享的,则必须向任何可能拥有该行的缓存发送CMO监视:
- 对于无效CMO,Allocated。
- 对于清除CMO,Dirty。注意,需要使用像AMBA CHI这样的连贯协议来发送CMO监视请求。
- 对于清除CMO,写回在缓存或对等缓存中发现的任何dirty数据。建议对将跟随到同一行CMO内存的写入使用写穿透无分配。这确保该行将在任何下游缓存中被查找,但不会被分配。
- 等待所有监视和相关写操作收到响应。
- 如果CMO不需要传送到下游,组件可以对CMO发出响应。
- 如果CMO确实需要传送到下游,则必须发送CMO,并且必须在从下游接收到时传播返回的响应。
A10.3 CMO请求属性
以下规则适用于CMO事务:
- 请求必须是缓存行大小且为常规。有关更多细节,请参见 A4.1.8 常规事务
- 域可以是不可共享或可共享。
- 不允许使用系统域,这意味着CMO事务必须为正常而不是设备。
AxCACHE和AxDOMAIN属性指示哪些缓存必须对CMO进行操作,如表所示。
A10.1 CMO 适用性
AxCACHE | AxDOMAIN | CMO applies to |
---|---|---|
Device | System | N/A (not legal for CMOs) |
Non-cacheable | Non-shareable | No caches |
Non-cacheable | Shareable | Peer caches |
Cacheable | Non-shareable | In-line caches |
Cacheable | Shareable | Peer caches and in-line caches |
为了保持一致性,以下建议适用于CMO和非CMO:
- 如果一个位置对于非CMO事务是可缓存的,它应该对于CMO事务也是可缓存的。
- 如果一个位置在非CMO事务的可共享域内,它应该在CMO事务的可共享域内。
- 如果一个位置在非CMO事务的不可共享域内,它可以在CMO事务的不可共享域或可共享域内。
- 主机不应发出允许其分配行的读取请求,同时该行有未解决的CMO。
- 分配提示,如AxCACHE[3:2],并不要求在CMO和非CMO事务对同一缓存行时匹配。
A10.4 CMO传播
CMO在组件下游的传播依赖于系统拓扑。如果CMO是可缓存的,并且下游有一个可能已分配该行的缓存,并且该缓存下游还有一个观察者,则必须将CMO向下传播。 为控制CMO是否从主机接口传播定义了两种机制。
- 在设计时,使用属性CMO_On_Write或CMO_On_Read。
- 在运行时,使用可选的BROADCASTCACHEMAINT和BROADCASTSHAREABLE连接输入到主机接口。
表 A10.2 BROADCASTCACHEMAINT信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
BROADCASTCACHEMAINT | 1 | 0b1 | 主机捆绑输入,用于控制从机发放CMO。 |
当BROADCASTCACHEMAINT和BROADCASTSHAREABLE同时存在且未激活时:
- 不会发出CleanShared、CleanInvalid和MakeInvalid请求。
- WritePtlCMO被转换为WriteNoSnoop。
- WriteFullCMO被转换为WriteNoSnoop或WriteNoSnoopFul。
A10.5 写通道的CMOs
CMO_On_Write 属性用于指示接口是否支持写通道上的 CMO。
表 A10.3 CMO_On_Write 属性
CMO_On_Write | 默认 | 描述 |
---|---|---|
True | 在AW和B通道中支持CMOs | |
False | Y | 在AW和B通道中不支持CMOs。 它们要么在读取通道上被信号化,要么不被该接口使用 |
在正确的通道上,CMO可以作为独立操作发送,也可以与数据写入结合。 用于在AW通道上信号CMO请求的AWSNOOP编码如 表 A10.4 所示。 有关CMO操作的组合写入的更多信息,请参见 A10.6 CMO写
表 A10.4 AWSNOOP编码
AWSNOOP | 操作 | 使能属性 | 描述 |
---|---|---|---|
0b0110 | CMO | CMO_On_Write | Stand-alone CMO |
0b1010 | WritePtlCMO | Write_Plus_CMO | CMO结合一个小于或等于一个缓存行的写操作。 |
0b1011 | WriteFullCMO | Write_Plus_CMO | CMO结合了一个正好是一个缓存行的写入。 |
AWCMO信号指示请求的CMO类型,当CMO_On_Write为真时,它出现在AW通道上。
表 A10.5AWCMO信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWCMO | AWCMO_WIDTH | 0b000 CleanInvalid | 指示包含缓存维护操作写操作码的CMO类型. |
AWCMO的宽度由属性AWCMO_WIDTH决定。
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
AWCMO_WIDTH | 0,2,3 | 0 | AWCMO的位宽。 |
AWCMO_WIDTH的规则如下:
- 如果CMO_On_Write为False,则必须为0。这意味着AWCMO不在接口上。
- 如果CMO_On_Write为True且RME_Support为False,则必须为2。
- 如果CMO_On_Write为True且RME_Support为True,则必须为3。
AWCMO的编码如 表 A10.7 所示。 如果关联的使能属性为False,则无法使用该编码。
表 A10.7 AWCMO编码
AWCMO | Label | Enable property | Meaning |
---|---|---|---|
0b000 | CleanInvalid | - | Clean and invalidate |
0b001 | CleanShared | - | Clean only |
0b010 | CleanSharedPersist | Persist_CMO | Clean to the Point of Persistence |
0b011 | CleanSharedDeepPersist | Persist_CMO | Clean to the Point of Deep Persistence |
0b100 | CleanInvalidPOPA | RME_Support | Clean and invalidate to the Point of Physical Aliasing |
0b101 to 0b111 | RESERVED | - | - |
请注意,MakeInvalid 不支持写通道。
当 AWSNOOP 不是 CMO、WritePtlCMO 或 WriteFullCMO 时,AWCMO 必须为 0b000。
写通道上的 CMO 事务由 AW 通道上的请求和 B 通道上的响应组成。在 CMO 事务中,W 通道没有传输。
对 CMOs CleanInvalid 和 CleanShared 的写响应在 B 通道上包含单个响应传输。 这表示在指定域内所有缓存均为 Clean 和/或无效,任何相关写入都是可观察的。
Persist CMOs 描述在 A10.8 CMOs持续 中, POPA CMO 描述在 A10.9 缓存维护和领域管理扩展 中。
A10.6 CMO写
缓存维护操作通常与写入内存一起使用。例如:
- 从I/O代理的写入,必须对下游缓存的观察者可见。
- 写入持久内存,必须确保所有缓存行的副本都被清理到持久性的程度。
- 导致dirty数据写回的CMO,必须跟随CMO。
带有CMO的写入将写入与CMO相结合,以提高此类场景的效率。可以预见一些主机将原生生成带有CMO的写入。 在其他情况下,缓存或互连将在向下游传播之前将CMO与写入结合。
Write_Plus_CMO属性用于指示组件是否支持写入通道上的写入和CMO组合。
表 A10.8 Write_Plus_CMO属性
Write_Plus_CMO | 默认 | 描述 |
---|---|---|
True | 支持组合写入和缓存维护操作。 | |
False | Y | 不支持组合写入和缓存维护操作。 |
如果 Write_Plus_CMO 属性为真,则 CMO_On_Write 属性也必须为真。
当 Write_Plus_CMO 为真时,可以使用 WritePtlCMO 和 WriteFullCMO 操作码来指示带有 CMO 的写入。
带有 CMO 的写入可以使用 AWCMO 指示的任何 CMO 类型。
一些带有 CMO 的写入示例用法如 表 A7.10 所示。
表 A10.9 CMO写事务的例子
操作 | 主要使用 | 动作 |
---|---|---|
Shareable WritePtlCMO with CleanShared | I/O代理向可共享区域写入少于缓存行的数据时,该数据必须对缓存下游的观察者可见。 | 所有的内联缓存和对等缓存必须查找该行并写回任何dirty数据。 来自dirty缓存行的数据可以与部分写入合并,以形成一个带有CleanShared的WriteFullCMO,向下游传送。 |
Shareable WriteFullCMO with CleanSharedPersist | I/O 代理正在写入缓存行到一个可共享区域,其中数据必须到达持久性点。 | 一致的互连会向一致的同级缓存发出MakeInvalid 侦听。 在行内缓存中查找该行,更新或使任何副本失效。 如果下游存在持久性点,则必须传播写操作和CleanSharedPersist。 |
Non-shareable WriteFullCMO with CleanInvalid | 由缓存发出当一个CleanInvalid CMO 表示一Dirty线路并导致其写入内存。 | 所有行内缓存条目必须被清除和失效。 如果下游有观察者,必须传播写入和CleanInvalid。 |
A10.6.1 CMO写的属性
具有CMO的写操作具有以下属性约束:
- AWSNOOP为0b1010表示WritePtlCMO,0b1011表示WriteFullCMO。
- AWDOMAIN为非共享或共享。
- AWCACHE[1]被断言时,事务必须是可修改的。
- AWLOCK未断言,不是独占访问。
WriteFullCMO必须是缓存行大小且为常规,见 A4.1.8 常规事务
WritePtlCMO必须是缓存行大小或更小,并且不得跨越缓存行边界。相关的CMO适用于所寻址缓存行的整个内容,AWBURST不得为FIXED。
带有CMO的写操作的缓存维护部分始终被视为可缓存和共享,无论AWCACHE和AWDOMAIN如何。
A10.6.2 CMO写的传播
CMO写的传播遵循与CMO传播相同的规则。可以将带有CMO的写入分成单独的写入和CMO事务以进行下游传播。在这种情况下,或者:
- 写入首先发出,随后在与写入相同ID的写请求通道上发出CMO。
- 写入首先发出。当收到写入响应时,可以在写入或读取通道上发出CMO。
在拆分写入和CMO时,如果AWDOMAIN是可共享的,那么:
- WritePtlCMO变为WriteUniquePtl。
- WriteFullCMO变为WriteUniqueFull。
如果AWDOMAIN是非共享的,那么写入变为WriteNoSnoop或WriteNoSnoopFull。
CMO作为可缓存的发送。如果在可共享域中存在下游缓存,则CMO作为可共享的发送。
如果没有需要通过缓存维护管理的下游缓存,则事务的CMO部分可以被丢弃。 如果丢弃的CMO是CleanSharedPersist或CleanSharedDeepPersist, 则在写入响应上必须设置BCOMP和BPERSIST信号。 有关更多详细信息,请参见 A10.8 CMOs持续 。
A10.6.3 CMOs写响应
对带有CMO的写入的响应遵循与写通道上的CMO相同的规则。
带有CI或CS的写入有一个响应传输,表明写入和CMO都是可观察的 。
带有CSP或CSDP的写入有一个响应,表明写入是可观察的,还有一个响应表明写入已到达PoP / PoDP 。
与独立的CSP/CSDP一样,从机可以选择将两个响应合并为一个传输。
带有CMO的写入不允许使用MTE匹配操作码,因此与Persist和Match响应结合的写入响应不是必需的。
有关更多详细信息,请参见 A13.2 内存标签扩展
A10.6.4 cmo加写的实例流程
作为使用CMO写操作的流程示例,图 A10.1 展示了一个I/O一致性主机在AW通道上向CHI互连发出一个可共享的CleanShared请求。
- 由一致性互连生成的侦听表示一致性缓存中的dirty数据。
- 然后,互连发出一个Non-shareable WriteFullCMO和CleanShared。
- 系统缓存查找该行,覆盖任何现有的副本,并将写请求转发给内存。内存不需要接收CMO,因为其数据对所有代理都是可观察的。
- 当数据可观察时,内存控制器返回一个OKAY响应,该响应被传播回主机。
A10.7 读通道的CMOs
CMO_On_Read属性用于指示接口是否支持读取通道上的CMO。
表 A10.10 CMO_On_Read属性
CMO_On_Read | 默认 | 描述 |
---|---|---|
True | Y | CMO在AR和R渠道上获得支持。 |
False | CMO不支持AR和R通道。它们要么在写入通道上被信号传递,要么不被该接口使用。 |
CMO事务在读取通道上由AR通道的请求和R通道的单个传输响应组成。 响应指示CMO被观察到,并且所有缓存行已根据需要被清除和失效。
用于在AR通道上发出CMO请求的ARSNOOP编码如 表 A10.11 所示。
表 A10.11 ARSNOOP编码
ARSNOOP | Operation |
---|---|
0b1000 | CleanShared |
0b1001 | CleanInvalid |
0b1010 | CleanSharedPersist |
0b1101 | MakeInvalid |
A10.8 CMOs持续
缓存维护操作用于持久性,旨在提供清理缓存到持久性点或深度持久性点。 这些操作用于确保存储操作(可能被保持在dirty缓存行中)被向下迁移到持久内存。
Persist_CMO 属性用于指示一个组件是否支持持久性的缓存维护。
表 A10.12 Persist_CMO属性
Persist_CMO | 默认 | 描述 |
---|---|---|
True | 支持持久性CMOs | |
False | Y | 不支持持久性CMOs |
持久CMO可以通过读取或写入通道传输,具体取决于CMO_On_Write和CMO_On_Read属性。
如果CMO_On_Write和CMO_On_Read都为False,则Persist_CMO必须为False。
A10.8.1 持久性点(POP)和深度持久性(DP)
在具有非易失性内存的系统中,每个内存位置都有一个层级点,在该点上可以依赖数据在断电时保持持久性。这个点被称为持久性点(PoP)。
有些系统需要对数据的持久性提供多个级别的保证。例如,一些数据可能需要在断电和备用电池故障时得到保留的保证。 为了支持这样的要求,本规范还定义了深度持久性点(PoDP)。
系统可能在持久性点(PoP)和深度持久性点(PoDP)上有不同的点,或者它们可能是相同的。
A10.8.2 持久性CMO(PCMO)
该规范支持以下PCMO事务:
CleanSharedPersist 清洁共享持久化(CSP)
当此操作完成时,在指定域中针对该行的所有缓存副本都是清洁的,任何相关的写入都是可观察的,并已到达持久性点(PoP)。
CleanSharedDeepPersist 清洁共享深度持久化(CSDP)
当此操作完成时,在指定域中针对该行的所有缓存副本都是清洁的,任何相关的写入都是可观察的,并已到达深度持久性点(PoDP)。
当一个组件接收到PCMO时,它的处理方式与清洁共享事务相同。如果需要侦听,则使用CleanShared 侦听事务。
A10.8.3 PCMO传输
PCMOs在组件下游的传播取决于系统拓扑。PCMO必须在以下情况下向下游传播:
- 如果PCMO是可缓存的,并且有一个下游缓存可能已经分配了缓存行,并且该缓存下游有观察者。
- 如果下游有一个PoP。
- 如果PCMO是CleanSharedDeepPersist,并且组件下游有一个PoDP。
如果适用(1),但不适用(2)或(3),则CleanSharedPersist或CleanSharedDeepPersist可以在发送到下游之前更改为CleanShared。
如果PCMO被更改为CleanShared,则必须由执行转换的组件发送Persist响应。
PCMOs的传播可以通过在重置时使用可选的主机输入BROADCASTPERSIST来控制。
表 A10.13 BROADCASTPERSIST信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
BROADCASTPERSIST | 1 | 0b1 | 主机的关联系统输入,用于控制 CleanSharedPersist和CleanSharedDeepPersist CMO的发送。 |
当BROADCASTPERSIST存在且解除断言时,CleanSharedPersist和CleanSharedDeepPersist转换为CleanShared。 这适用于独立的CMO和使用CMO进行写操作。
Note:CleanShared的发行由BROADCASTSHAREABLE和BROADCASTCACHEMAINT信号控制。
A10.8.4 B通道的PCMOs
在使用写通道传输缓存维护操作时,支持CleanSharedPersist和CleanSharedDeepPersist。
AW通道上的PCMO请求
在写通道上,PCMO请求通过将AWSNOOP设置为CMO、WritePtlCMO或WriteFullCMO来发出信号。 请参见 表 A10.4 了解编码。
AWCMO信号随后指示CleanSharedPersist或CleanSharedDeepPersist,请参见表 表 A10.7 。
当Persist_CMO为False时,AWCMO不得指示CleanSharedPersist或CleanSharedDeepPersist。
B通道上的PCMO响应
AW通道上的CleanSharedPersist和CleanSharedDeepPersist事务有两个响应:完成响应和持久化响应。
拥有单独的响应使系统跟踪资源能够提前释放,以防将数据提交到PoP/PoDP需要很长时间。 完成响应和持久化响应可以以任何顺序发生,并且可以被其他事务的响应分开。
当CMO_On_Write和Persist_CMO都为True时,完成响应和持久化响应通过两个信号在写响应(B)通道中发出信号。
表 A10.14 PCMO的响应信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
BCOMP | 1 | 0b1 | 断言为高表示一个完成响应。 |
BPERSIST | 1 | 0b0 | 断言为高表示第一个持久响应。 |
完成响应表示所有缓存都是Clean的,任何相关的写入都是可观察的。它具有以下规则:
- BCOMP 被断言,BPERSIST 被解除断言。
- BID 被驱动为与 AWID 相同的值。
- 如果支持回环信号,则从 AWLOOP 驱动 BLOOP。
- 如果 AWIDUNQ 被断言,则在收到此响应时可以重用该 ID。
- BRESP 可以取任何对 PCMO 请求合法的值。
- 完成响应必须遵循正常的响应排序规则。
- 如果接口上存在 BCOMP,它必须在所有写通道的一个响应传输中被断言。
持久响应表示数据已经到达 PoP 或 PoDP。它具有以下规则:
- BCOMP 被解除断言,BPERSIST 被断言。
- BID 从 AWID 驱动。
- BIDUNQ 可以取任何值,不要求与 AWIDUNQ 具有相同的值。
- BLOOP 可以取任何值,不要求从 AWLOOP 驱动。
- BRESP 可以取任何对 PCMO 请求合法的值。
- 持久响应没有排序要求,可以超越或被其他响应传输超越。
- 如果接口上存在 BPERSIST,它必须在响应到 CSP 或 CSDP 的一次传输中被断言。 它必须对所有其他响应解除断言。
从机可以选择将两个响应合并为一个传输。适用以下规则:
- BCOMP 和 BPERSIST 都被断言。
- BID 从 AWID 驱动。
- 如果支持回环信号,则从 AWLOOP 驱动 BLOOP。
- BRESP 可以取任何对 PCMO 请求合法的值。
- 合并的响应必须遵循正常的响应排序规则。
- 如果 AWIDUNQ 被断言,则在收到此响应时可以重用该 ID。
主机可以计算返回的响应数量,其中 BPERSIST 被断言,使其能够确定何时没有未完成的持久操作。
写通道的PCMO示例
图 A10.2 显示了写通道上的 CleanSharedPersist 事务示例。
在此示例中,写入对于最后一级缓存中的所有其他代理都是可观察的,因此当请求在该点被危险化时,可以发送完成响应。 非易失性内存发送一个合并的完成和持久响应,因此缓存必须在向上游传播响应时解除断言 BCOMP。
A10.8.5 读通道上的PCMOs
如果使用读取通道来传输缓存维护操作,只有CleanSharedPersist事务是支持的。
CleanSharedDeepPersist只能在写通道上使用。通过将ARSNOOP设置为0b1010来发出CleanSharedPersist信号。
当Persist_CMO为False时,ARSNOOP不得指示CleanSharedPersist。
R通道上有一个单一的响应传输,表示请求已被观察,并且所有缓存行已清理到PoP。
A10.9 缓存维护和领域管理扩展
使用领域管理扩展(RME)时,缓存维护操作必须适用于与CMO具有相同地址和物理地址空间的所有行,而不考虑其他属性。 表 A10.15 说明了CMO在支持和不支持RME的情况下必须操作哪些缓存行。 有关更多信息,请参见 A5.5 内存保护和领域管理扩展 以及 A[4] 。
表 A10.15 CMO缓存行操作
Attribute | RME_Support is False | RME_Support is True |
---|---|---|
Address | Same cache line | Same cache line |
Physical Address Space | Same, using AxPROT[1] | Same, using {AxNSE,AxPROT[1]} |
Memory attributes | Any AxCACHE | Any AxCACHE |
Shareability Domain | Same Domain | Any Domain |
当受到 CleanInvalid 或 CleanShared CMO 的作用时 数据必须传播到一个所有使用与 CMO 相同物理地址空间的代理可观察到的点.
A10.9.1 CMO到POPA
RME定义了物理别名点(PoPA),这是一个系统中的点,在该点数据对于来自所有代理的访问都是可观察的,无论物理地址空间如何。
有一个名为CleanInvalidPoPA的CMO,它帮助将一个物理粒子的所有权从一个安全状态转移到另一个安全状态。
对CleanInvalidPoPA的响应表明所有缓存副本都被作废,任何dirty缓存副本在PoPA之后被写入。
CleanInvalidPoPA具有与其他CMO相同的规则,涉及操作的行和事务属性的限制。
当RME_Support为真时,AWCMO信号扩展为3b,以启用CleanInvalidPoPA的信号,编码为:
- 0b000:CleanInvalid
- 0b001:CleanShared
- 0b010:CleanSharedPersist
- 0b011:CleanSharedDeepPersist
- 0b100:CleanInvalidPoPA
CleanInvalidPoPA可以独立使用,也可以与写事务结合使用,因此可以与以下AWSNOOP值一起使用:
= 0b0110:CMO
= 0b1010:WritePtlCMO
= 0b1011:WriteFullCMO
CMO_On_Write属性必须为真才能使用CleanInvalidPoPA。
Write_Plus_CMO属性必须为真才能使用与CleanInvalidPoPA的写入。
使用内存加密上下文时,可以使用CleanInvalidPoPA。 CMO以确保在加密点上游的所有缓存中清理和失效数据。有关更多信息, 请参见 A5.6 内存加密上下文 。
A10.9.2 cmo到popa的传播
一个可选的输入信号 BROADCASTCMOPOPA 可用于在复位时控制 CleanInvalidPoPA 的传播。
表 A10.16 信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
BROADCASTCMOPOPA | 1 | 0b1 | 主机绑定输入,用于控制发放CleanInvalidPoPA CMO。 |
当BROADCASTCMOPOPA存在并且未断言时,CleanInvalidPoPA被转换为CleanInvalid。 这适用于独立的CMO和使用CMO的写入。
Note:CleanInvalid的发出是由BROADCASTSHAREABLE和BROADCASTCACHEMAINT信号控制的。
A10.10 处理器缓存维护指令
缓存维护协议要求缓存维护操作使用AxCACHE和AxDOMAIN信号来识别需要进行缓存维护操作的缓存。
对于具有缓存维护指令且要求在与AxCACHE和AxDOMAIN值定义的数量不同的缓存上操作的处理器, 事务的可缓存性和共享性必须调整以满足处理器的要求。
例如,如果执行缓存维护操作的处理器指令必须在具有设备内存属性的位置上操作于系统内的所有缓存, 则主机必须将缓存维护事务发布为普通缓存可用、可共享,因为这是缓存维护操作中最普遍的,且适用于所有所需缓存。
A10.10.1 软件缓存维护的不可预测行为
缓存维护可以用于可靠地在一致性主机组和非一致性代理之间传递共享内存数据结构。 这个过程必须遵循特定的顺序,以可靠地使数据结构在需要时可见。
当使用缓存维护使非一致性代理的写操作对一致性主机组可见时,会出现一段时间, 在这段时间内对数据结构的写入和读取会产生不可预测的结果,并可能导致一致性丧失。
观察正在被非一致性代理更新的缓存行在开始序列的清除事务和完成序列的失效事务之间的期间是不可预测的。 在此期间,允许观察到由非一致性代理更新的缓存行出现多次状态变化。
在一致域和非一致代理之间有五个通信阶段,如 图 A10.3 所示。这五个阶段的顺序是:
- 一致域被访问。在此阶段,一致域对适当的内存位置具有完全的读写访问权限。当一致域内所有所需的写入完成时,此阶段结束。
- 一致域被清理。在此阶段,对于所有正在进行软件缓存维护的地址位置,需要执行缓存清理操作。 一致域清理强制所有先前的写入对非一致代理可见。当所有必需的写入完成并因此可被非一致代理看到时,此阶段结束。
- 非一致代理被访问。在此阶段,非一致代理对定义的内存位置具有读写访问权限。当非一致代理的所有所需写入完成时,此阶段结束。
- 一致域被失效。在此阶段,对于所有正在进行软件缓存维护的地址位置,需要执行缓存失效操作。这一一致域失效阶段移除了所有定义位置的缓存副本, 确保一致域的任何后续访问可以观察到非一致代理的写入。当所有所需的失效操作完成时,此阶段结束。
- 一致域对定义的内存位置具有完全访问权限。
下表显示了一致域或非一致代理的访问何时被允许。其余访问可能会产生不可预知的结果,并可能导致一致性丧失。
表 A10.7 一致域或非一致代理的访问允许
Phase | Description | CoherentDomain-Read | CoherentDomainWrite | ExternalAgent-Read | ExternalAgentWrite |
---|---|---|---|---|---|
1 | Coherent domain access | Permitted | Permitted | – | – |
2 | Coherent domain clean | – | – | – | – |
3 | External agent access | – | – | Permitted | Permitted |
4 | Coherent domain invalidate | – | – | – | – |
5 | Coherent domain access | Permitted | Permitted | – | – |
A第11章 额外请求限定
本章描述了AXI协议的一些附加请求限定符。 它包含以下部分:
A11.1 非安全访问ID
为了支持受保护数据的存储和处理,可以添加一组信号,以便控制对特定非安全内存位置的访问。 这些信号在事务请求中提供非安全访问ID(NSAID)。可以检查NSAID以允许或拒绝对内存位置的访问。
NSAccess_Identifiers属性用于指示组件是否支持这些附加信号。
表 A11.1NSAccess_Identifiers属性
属性名 | 默认 | 描述 |
---|---|---|
True | 支持NSAID信号。 | |
False | Y | 不支持NSAID信号。 |
A11.1.1 NSAID信号
如果NSAccess_Identifiers属性为真,则以下信号将被添加到读写请求通道。
表 A11.2 AxNSAID信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWNSAID ARNSAID | 4 | 0x00 | 非安全访问ID,可以被检查以允许或拒绝访问某个内存位置。 |
一个4位NSAID值支持最多16个唯一ID。对于每个NSAID,定义了一组访问权限,确定内存中的位置如何被允许访问。访问权限可以是:
- 无访问
- 只读访问
- 只写访问
- 读/写访问
用于定义每个NSAID访问权限的机制是实现定义的。然而,这种机制通常是通过某种形式的内存保护单元(MPU)实现的。 以下规则和建议适用于NSAID值:
- 对安全、根或领域地址空间的请求必须使用NSAID值为零。
- 对非安全物理地址空间的请求可以使用任何NSAID值。
- 允许具有不同NSAID值的事务访问重叠的内存位置。
- 允许具有不同NSAID值的事务对给定内存位置具有任何组合的访问权限。
- 建议主机在访问未保护的数据时使用默认的NSAID值零,或者在他们没有分配的NSAID值时使用。
- 如果主机需要使用单一NSAID值,则允许NSAID信号绑定到固定值。
A11.1.2 缓存和非安全访问ID
在权限检查的上游进行缓存和系统一致性时,通过不同 NSAID 值之间传递数据的访问必须接受权限检查。 与 NSAID 使用和一致性相关的规则如下:
- 当代理缓存使用特定 NSAID 值获取的数据行时,必须确保对主存储器的任何后续写入或对 Snooping 的任何响应使用相同的 NSAID 值。 该规则确保主机不能将数据缓存行从一个保护区域移动到另一个。
- 对于具有给定 NSAID 值的读请求,如果使用 Snooping 来获取数据:
- 如果 Snooping 响应的 NSAID 值与读请求匹配,则可以直接提供数据。
- 如果 Snooping 响应的 NSAID 值与读请求不匹配,则必须首先使用通过 Snooping 响应获得的 NSAID 值将缓存行写入内存, 然后使用原始请求的 NSAID 值从内存中读取。写入和后续读取仅需达到权限检查的发生点。
- 如果使用内存保护,则不得使用使缓存副本失效的 Snooping 事务,例如 MakeInvalid。 所有这些 Snooping 事务必须被替换为还会将缓存行清理到主存储器的事务,例如 CleanInvalid。
- 作为 Snooping 结果发生的对主存储器的任何互连生成写入必须使用从 Snooping 响应中获得的 NSAID 值。
- 如果单个主机能够发出具有多个 NSAID 值的事务,则必须确保对缓存副本的内部访问使用最初获取缓存行所使用的 NSAID 值:
- 如果访问有相同地址但不同 NSAID 值的缓存行命中,则必须在使用适当的 NSAID 值重新获取缓存行之前清理并使缓存行失效。此过程确保执行保护检查。
- 如果可以保证主机永远不会以不同的 NSAID 值访问相同的缓存行,则不需要清理和失效操作。这一保证可以通过设计实现或通过使用适当的缓存维护操作来确保。
- 在更改 NSAID 值的访问权限时,必须执行适当的缓存维护。 主机在没有写入权限的情况下写入缓存行是允许的。使用相同 NSAID 值将更新的缓存行传递给其他主机也是允许的。 然而,不允许该更新传播到主存储器或使用不同 NSAID 值的访问。
A11.2 页面基础硬件属性
页面基础硬件属性(PBHA)是与转换表条目相关的4位描述符,可注释到事务请求中。 此规范描述了它们如何传输,但它们的使用由实现定义。 以下信号用于读取和写入请求通道以传输PBHA值。
表 A11.3 AxPBHA信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWPBHA ARPBHA | 4 | − | 一个与转换表条目相关的4b用户定义描述符,可以注释到事务请求上。 |
PBHA_Support属性用于指示接口是否支持PBHA。
表 A11.4 PBHA_Support属性
PBHA_Support | 默认 | 描述 |
---|---|---|
True | 支持PBHA。 | |
False | Y | 不支持PBHA。 |
A11.2.1 PBHA值
PBHA值可以在地址转换过程中添加到请求中,并在系统中传播,如果下游组件支持它们。
在MMU中,对同一Page和物理地址空间的所有事务可能具有相同的值,但PBHA值的准确性在传递过程中可能会降低。 PBHA值可能变得不准确的情况包括:
- 当一个互连组合来自不同源的事务时,有些可能附有PBHA值,而其他的可能取固定值。
- 在下游缓存中,PBHA值在所有情况下可能不会与数据一起缓存。
- 如果转换表中的PBHA值被更改,则正在进行的事务或缓存数据上的值可能变得不一致。可以使用适当的TLB失效或缓存维护操作来实现一致性。
该列表并不详尽,设计师应记录PBHA在其组件内可能变得不准确的情况。 希望使用PBHA的系统集成商必须考虑源和目标之间的每个组件,以确定目标的要求是否可以满足。
A11.3 子系统ID
子系统ID是一个可以添加到事务请求中的字段,用于指示它们源自哪个子系统。 子系统ID可以用来限定事务地址,并在共享内存或设备的系统部分之间提供隔离。
用于传输子系统ID的信号显示在 表 A11.5 中。
表 A11.5 AxSUBSYSID信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWSUBSYSIDARSUBSYSID | SUBSYSID_WIDTH | − | 子系统ID,指示请求源自哪个子系统。 |
SUBSYSID_WIDTH属性用于定义子系统ID信号的宽度和存在性。如果该属性为零,则信号不为存在。
表 A11.6 SUBSYSID_WIDTH属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
SUBSYSID_WIDTH | 0…8 | 0 | AxSUBSYSID信号的位宽。 |
A11.3.1 子系统id使用
该规范未定义子系统ID的使用情况。 示例实现包括:
- 一个或多个主机使用单个子系统ID,具有对共享内存或外设的共同访问权限。
- 一个互连,结合来自不同子系统主机的请求。在这种情况下,互连主机接口因此对不同请求使用不同的子系统ID。
- 将子系统ID用作防火墙或内存保护单元(MPU)中的查找,以出于安全或保护原因隔离子系统。
- 要求在一致域内的所有主机使用相同的子系统ID,以便在侦听过滤中使用。
- 使用子系统ID进行性能分析或监控。
- 一个通过某些接口而不是其他接口传播子系统ID的互连。
A第12章 其他写事务
本章描述了AXI协议中支持的其他写入事务。
它包含以下部分:
A12.1 写0事务
许多系统中的写操作,特别是来自中央处理器的操作,都是将数据设置为零。 例如,在初始化或分配内存时。这些零值写操作消耗了写数据带宽和互连功率,而采用无数据请求可以节省这些资源。
WriteZero事务用于将零值写入缓存行大小的数据位置。该事务包括写请求和写响应,但没有相关的写数据传输。 它在功能上等同于对同一位置进行常规写入,其中所有数据行都填充了零值。
WriteZero_Transaction属性用于指示一个接口是否支持WriteZero事务。
表 A12.1 WriteZero_Transaction属性
WriteZero_Transaction | 默认 | 描述 |
---|---|---|
True | 支持写0事务 | |
False | Y | 不支持写0事务 |
WriteZero事务的规则如下:
WriteZero请求表示由地址、大小和长度属性指示的位置的数据必须设置为零。
WriteZero事务由AW通道上的请求和B通道上的单个响应组成。
WriteZero事务为缓存行大小并且是常规的,参见 A4.1.8 常规事务
AWSNOOP必须为0b0111或0b00111。
AWLOCK必须为0b0,不能是专有访问。
AWTAGOP必须为无效。
AWID必须是唯一的,这意味着:
- 仅当没有使用相同AWID值的未完成写事务时,才能发出WriteZero事务。
- 主机不得在写通道上发出与未完成WriteZero事务相同的AWID的请求。
- 如果存在,AWIDUNQ必须在WriteZero事务中被断言。
AWDOMAIN可以取任何值。如果域是可共享的,则WriteZero作为WriteUniqueFull,数据为零。
发出WriteZero请求的主机不能连接到不支持WriteZero的从机。
A12.2 写延迟事务
在企业系统中,常常使用加速器,这些加速器通过芯片间连接使用64字节原子存储操作进行访问。 这些存储操作是在加速器内部的共享队列中执行的。 在某些情况下,由于队列已满,存储操作可能不会被接受,但如果稍后重试,可能会被接受。 这种类型的事务称为WriteDeferrable。
PCIe Gen5支持通过可延迟写入(Deferrable Memory Write,简称DMWr)事务进行可延迟写入。 这需要一个写入响应,因此DMWr是一个非发布写入。 预计AXI中的WriteDeferrable事务会转换为PCIe DMWr事务。
A12.2.1 写延迟事务支持
WriteDeferrable_Transaction属性用于指示接口是否支持WriteDeferrable事务。
表 A12.2 WriteDeferrable_Transaction属性
WriteDeferrable_Transaction | 默认 | 描述 |
---|---|---|
True | 支持写延迟事务。 | |
False | Y | 不支持写延迟事务。 |
发布WriteDeferrable请求的主机无法与不支持WriteDeferrable的从机连接。
A12.2.2 写延迟信号
当WriteDeferrable_Transaction属性为真时,AWSNOOP和BRESP必须足够宽以容纳额外的编码:
- AWSNOOP_WIDTH必须为5
- BRESP_WIDTH必须为3
一个WriteDeferrable事务由一个请求、64字节的写入数据和一个写入响应组成。
WriteDeferrable事务的规则是:
AWSNOOP为0b10000。
AWDOMAIN为0b11(系统可共享)。
AWCACHE为设备或正常非缓存。
长度和大小的合法组合为:
- 1 x 64字节
- 2 x 32字节
- 4 x 16字节
- 8 x 8字节
- 16 x 4字节
WSTRB的所有位必须在64字节容器内设置。
AWADDR对齐到64字节。
AWBURST为INCR。
AWLOCK为非断言,不是独占访问。
AWATOP为非原子事务。
AWTAGOP为无效。
对于所有事务,ID在传输中是唯一的,这意味着:
- 仅当写通道上没有具有相同ID值的未完成事务时,才能发出WriteDeferrable事务。
- 主机不得在与待处理WriteDeferrable事务具有相同ID的写通道上发出请求。
- 如果存在,AWIDUNQ必须在WriteDeferrable事务中断言。
WriteDeferrable事务必须被视为64字节原子,因此:
- 它仅针对具有64字节或更大单副本原子性大小的位置。
- 请求不得与其他事务拆分或合并。
A12.2.3 写延迟事务事务响应
下表显示了对WriteDeferrable请求的响应含义。
BRESP[2:0] | 响应 | 描述 |
---|---|---|
0b00 | OKAY | 该写操作被一个支持WriteDeferrable事务的从属机构接受并成功完成。 |
0b001 | EXOKAY | 在WriteDeferrable事务中不允许的响应。 |
0b010 | SLVERR | WriteDeferrable事务已经到达一个结束点但没有成功。 |
0b011 | DECERR | 尚未达到可以写入数据的阶段。 |
0b100 | DEFER | 写入未成功,因为此时无法进行服务,但如果稍后重新发送可能会成功。 位置未更新。此响应仅允许用于WriteDeferrable事务。 |
0b101 | TRANSFAULT | 写入被终止是因为转换错误,这可能通过PRI请求来解决。 |
0b110 | RESERVED | - |
0b111 | UNSUPPORTED | 写入未成功,因为目标不支持该事务类型。 位置未更新。此响应仅允许用于WriteDeferrable事务。 |
如果一个互连检测到一个WriteDeferrable正在针对一个不支持WriteDeferrable事务的从机,它必须不传播该请求。
在这种情况下,预期会发送一个UNSUPPORTED响应,但也允许SLVERR或DECERR。
一个能够识别WriteDeferrable但无法处理它的从机,其WriteDeferrable_Transaction属性为True,但预期会以UNSUPPORTED响应。
A第13章 系统监控、调试、和用户扩展
本章描述了用于系统监控和调试的AXI特性,还描述了如何向每个通道添加用户定义的扩展。 包含以下章节:
A13.1 内存系统资源分区和监控
内存系统资源分区和监控(MPAM)是一种用于对物理和虚拟机器的内存系统资源进行分区和监控的技术。 完整的MPAM架构在Armv8.4扩展中进行了描述 [6] 。
每个MPAM启用的主机在其请求中添加MPAM信息。MPAM信息通过系统传播到内存组件,在那里可以用来影响资源分配决策。 基于MPAM信息监控内存使用情况还可以实现性能调优和机器之间的精准占用。
A13.1.1 MPAM信号
MPAM_Support属性如 表 A13.1 所示,用于指示接口是否支持MPAM。
表 A13.1 MPAM_Support属性
MPAM_Support | 默认 | 描述 |
---|---|---|
MPAM_12_1 | 接口已启用MPAM,并包括AW和AR频道上的MPAM信号。PARTID的宽度为12,PMG为1 | |
MPAM_9_1 | 接口已启用MPAM,并包括AW和AR频道上的MPAM信号。PARTID的宽度为9,PMG为1 | |
False | Y | MPAM不受支持,该接口未启用MPAM,并且接口上没有MPAM信号。 |
表 A13.2 AxMPAM信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWMPAM ARMPAM | MPAM_WIDTH | − | 内存系统资源分区和监控(MPAM)请求信息 |
MPAM信息包含三个字段。位与字段的映射取决于接口是否支持RME。有关RME的更多信息,请参见 A5.5 内存保护和领域管理扩展
MPAM_WIDTH的值由MPAM_Support和RME_Support属性确定。当MPAM_Support为False时,MPAM_WIDTH必须为零。
A13.1.2 MPAM字段
MPAM字段在AxMPAM信号中编码,具体取决于MPAM_Support和RME_Support属性。
当MPAM_Support为MPAM_9_1且RME_Support为False时,MPAM_WIDTH必须为11,映射如 表 A13.3 所示。
表 A13.3 当RME_Support为False情况下的MPAM_9_1
字段 | 描述 | 位宽 | 映射 |
---|---|---|---|
MPAM_NS | 安全ID | 1 | AxMPAM[0] |
PARTID | 分区ID | 9 | AxMPAM[9:1] |
PMG | 性能监控组 | 1 | AxMPAM[10] |
当MPAM_Support为MPAM_9_1且RME_Support为真时,MPAM_WIDTH必须为12,并且映射如 表 A13.4 所示。
表 A13.4 当RME_Support为True情况下的MPAM_9_1
字段 | 描述 | 位宽 | 映射 |
---|---|---|---|
MPAM_SP | 物理地址空间ID | 2 | AxMPAM[1:0] |
PARTID | 分区ID | 9 | AxMPAM[10:2] |
PMG | 性能监控组 | 1 | AxMPAM[11] |
当MPAM_Support为MPAM_12_1且RME_Support为False时,MPAM_WIDTH必须为14,映射如 表 A13.5 所示。
表 A13.5 当RME_Support为False情况下的MPAM_12_1
字段 | 描述 | 位宽 | 映射 |
---|---|---|---|
MPAM_NS | 安全ID | 1 | AxMPAM[0] |
PARTID | 分区ID | 12 | AxMPAM[12:1] |
PMG | 性能监控组 | 1 | AxMPAM[13] |
当MPAM_Support为MPAM_12_1且RME_Support为真时,MPAM_WIDTH必须为14,并且映射如 表 A13.6 所示。
表 A13.6 当RME_Support为True情况下的MPAM_9_1
字段 | 描述 | 位宽 | 映射 |
---|---|---|---|
MPAM_SP | 物理地址空间ID | 2 | AxMPAM[1:0] |
PARTID | 分区ID | 12 | AxMPAM[12:2] |
PMG | 性能监控组 | 1 | AxMPAM[13] |
A13.1.3 MPAM 组件互联
MPAM技术的实施对主机、互连和从机产生影响。 如果在一个支持MPAM的系统中包含主机,但不支持MPAM信号,则系统必须添加MPAM信息。 默认情况下为实施定义,但其中一个选项是将请求的物理地址空间(AxNSE,AxPROT[1])复制到最低有效的MPAM位,并对高位进行零扩展。
主机
支持MPAM的主机组件在对应的AxVALID被断言时必须驱动MPAM信号。 所有事务类型使用的值为实施定义。预计但不要求主机在读请求和写请求中使用相同的值集。 主机可能不会使用接口上可以发出信号的所有PARTID或PMG值。
互连
MPAM具有全局范围。互连组件没有要求使MPAM唯一。当互连主机接口连接到支持MPAM的从机时,可以使用传播的值或实施定义的值。
从机
支持MPAM的从机可以使用MPAM信息进行内存分区和监控。MPAM信号在对应的AxVALID断言时被采样。
A13.2 内存标签扩展
内存标记扩展(MTE)提供了一种机制,用于检测内存安全违规。
当为特定用途分配内存区域时,会为其分配一个分配标记值。 当随后访问内存时,会提供一个物理标记值,该值对应于访问的物理地址。 如果物理标记与分配标记不匹配,就会生成警告。
分配标记存储在内存系统中,可以像数据一样缓存。每个标记为4位,并与16字节对齐的地址位置相关联。支持以下操作:
- 使用写事务更新分配标记值,无论是否更新相关的数据值。
- 读取与分配标记相关的数据。请求者可以对物理标记与分配标记进行检查。
- 向内存写入物理标记,以便与分配标记进行比较。结果在事务响应中指示。
当系统支持内存标记时,并不要求每个事务都使用内存标记。系统中的每个组件也不必支持内存标记。
内存标记扩展在Arm A架构v8.5及更高版本上得到支持,并在Arm® A架构参考手册中进行了描述 [3] 。
A13.2.1 MTE支持
MTE_Support属性用于指示接口对MTE的支持级别。 可以根据不同的用例使用不同的支持级别。
表 A13.7 MTE_Support属性
MTE_Support | 默认 | 描述 |
---|---|---|
Standard | 内存标记在接口上得到了全面支持,所有MTE信号均可用。 | |
Simplified | 内存标记被支持,除了MTE匹配操作。 不允许部分标签写入,因此当AWTAGOP更新时,事务容器内的所有对应于标签的WTAGUPDATE位必须被设定。 BTAGMATCH不存在。 BCOMP不是必需的。 | |
Basic | 内存标签在接口上以基本级别得到支持。允许有限的一组标签操作。 BTAGMATCH不存在。BCOMP不是必需的。 | |
False | Y | 内存标记在接口上不受支持,并且没有MTE信号存在。 |
请注意在数据宽度小于32位的接口上MTE_Support必须为False。
主机与从机之间的兼容性根据MTE_Support属性的值显示在 表 A13.8 。
表 A13.8 MTE_Support互联
MTE_Support | 从机:False | 从机:Basic | 从机:Simplified | 从机:Standard |
---|---|---|---|---|
主机:False | 兼容 | 兼容 | 兼容 | 兼容 |
主机:Basic | 协议兼容。 从机忽略AxTAGOP,因此写标签丢失,读标签保持静态。 | 兼容 | 兼容 | 兼容 |
主机:Simplified | 协议兼容。 从机忽略AxTAGOP,因此写标签丢失,读标签保持静态。 | 不兼容 | 兼容 | 兼容 |
主机:Standard | 不兼容 | 不兼容 | 不兼容 | 兼容 |
A13.2.2 MTE信号
支持MTE所需的信号如 表 A13.9 所示。
表 A13.9 MTE信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWTAGOP | 2 | 0b00 | 指示MTE标签是否与写入事务相关联. |
ARTAGOP | 2 | 0b00 | 指示MTE标签是否与读取事务相关联. |
WTAG RTAG | ceil(DATA_WIDTH/128)*4 | - | 与数据相关的内存标签。 每128位数据有一个4位标签,最少为4位。 与相关数据具有相同的有效性规则。建议将无效标签置为零。 |
WTAGUPDATE | ceil(DATA_WIDTH/128) | - | 指示在AWTAGOP更新时哪些标签必须写入内存,每4位标签有1位控制位。 |
BTAGMATCH | 2 | - | 指示写入事务中标签比较的结果。 |
BCOMP | 1 | 0b1 | 断言HIGH以指示完成响应。 |
A13.2.3 缓存标签
缓存的分配标签必须保持硬件一致性。一致性机制与数据的一致性机制相同。 适用的标签缓存状态包括:Invalid、Clean和Dirty。状态为Clean或Dirty的行是有效的。
数据缓存状态和标签缓存状态组合的约束条件:
- 只有在数据有效时,标签才能有效。
- 当数据有效时,标签可以无效。
- 当缓存行被驱逐且标签为Dirty时,允许将驱逐的Clean数据视为Dirty。
- 当Dirty标签从缓存中驱逐时,必须将其写回内存或以Dirty状态传递给另一个缓存。
- 当Clean标签从缓存驱逐时,可以将其发送到其他缓存或静默丢弃。
- 命中具有Valid标签的行的CMO适用于数据和标签。
- 当MakeInvalid或ROMI事务命中具有Dirty标签的行时,标签必须写回内存。
A13.2.4 传输标签
标签值通过WTAG信号进行传输,当AWTAGOP不是无效时。
标签值通过RTAG信号进行传输,当ARTAGOP不是无效时。
在传输标签时,除了基于事务类型的其他约束外,适用以下规则:
- 事务必须是缓存行大小或更小,并且不能跨越缓存行边界。
- AxBURST必须是INCR或WRAP,而不能是FIXED。
- 事务必须指向正常的写回内存,这意味着:
- CACHE_Present属性必须为真。
- AxCACHE[3:2]不是0b00。
- AxCACHE[1:0]是0b11。
- ID值必须在传输中唯一,这意味着:
- 只有当没有使用相同ARID值的未完成读事务时,才能发出带有标签的读操作Transfer或Fetch。
- 主机不得在读取通道上发出与未完成的带标签Transfer或Fetch的读操作相同ARID的请求。
- 如果存在,读操作Transfer或Fetch必须断言ARIDUNQ。
- 只有当没有使用相同AWID值的未完成写事务时,才能发出带有标签的写操作Transfer、Update或Match。
- 主机不得在写入通道上发出与未完成的带标签Transfer、Update或Match的写操作相同AWID的请求。
- 如果存在,写操作Transfer、Update或Match必须断言AWIDUNQ。
- 内存标签通过RTAG或WTAG进行传输,其中TAG[4n-1:4(n-1)]对应于DATA[128n-1:128(n-1)]。
- 对于宽度超过128位的数据,标签信号承载多个标签。标签根据所传输的数据驱动,最低有效的标签位用于传输最低有效的128位数据的标签。
- 对于使用读取数据分块的读事务,只有与有效块strobes相对应的标签需要有效。
- 对于多个传输地址相同标签的写事务,WTAG和WTAGUPDATE值必须对每个事务访问的4位标签保持一致。
A13.2.5 使用标签读
读取操作可以请求返回分配标签和数据,这由ARTAGOP的值来决定,如 表 A13.10 所示。
表 A13.10 ARTAGOP编码
ARTAGOP | 操作 | 含义 |
---|---|---|
0b00 | Invalid | 标签不需要与数据一起返回。对此请求的响应中,RTAG无效且必须为零。 |
0b01 | Transfer | 每次读取数据的传输必须具有有效的标签值。 对于每一个访问的16字节粒度都必须发送标签,即使地址未对齐至16字节。 |
0b10 | RESERVED | - |
0b11 | Fetch | 只需提取标签。不要求数据有效且不得被主机使用。 使用提取的事务必须是缓存行大小和常规的,对于每个访问的16字节粒度必须发送标签。 |
这里对可以与MTE标签传输一起使用的读取通道操作码有一些限制, 表 A13.11 显示了每个MTE_Support配置的合法操作码和标签操作的组合. 无效的标签操作编码对所有操作码都是合法的.
星号(*)表示操作码的所有变体。
表 A13.11 读传输中合法的标签操作
操作码 | Basic-Transfer | Basic-Fetch | Simplified-Transfer | Simplified-Fetch | Standard-Transfer | Standard-Fetch |
---|---|---|---|---|---|---|
ReadNoSnoop | Y | - | Y | Y | Y | Y |
ReadOnce | Y | - | Y | - | Y | - |
ReadShared | Y | - | Y | - | Y | - |
ReadClean | Y | - | Y | - | Y | - |
ReadOnceCleanInvalid | - | - | - | - | - | - |
ReadOnceMakeInvalid | - | - | - | - | - | - |
CleanInvalid* | - | - | - | - | - | - |
CleanShared* | - | - | - | - | - | - |
MakeInvalid | - | - | - | - | - | - |
DVM Complete | - | - | - | - | - | - |
A13.2.6 使用标签写
写入可以请求分配标签与数据一起写入,或者请求写入包括一个与内存中已经存储的分配标签进行比较的物理标签。 信号AWTAGOP指示要执行的标签操作。
表 A13.12 AWTAGOP编码
AWTAGOP | 操作 | 含义 |
---|---|---|
0b00 | Invalid | 标签无效;无需进行标签更新或检查。 WTAGUPDATE必须被取消。 WTAG必须为零。 |
0b01 | Transfer | 标签是Clean的。 不需要执行标签检查。 写入的完成者可以在分配数据时缓存标签。 WTAGUPDATE必须被解除断言。WTAG位在事务容器中的每个字节都必须有效。 |
0b10 | Update | 标签值已更新并处于Dirty状态;内存中的标签必须根据WTAGUPDATE进行更新。 WTAGUPDATE可以有任意数量的位被断言,包括没有。 在传输中仅部分寻址的标签WTAGUPDATE必须解除断言。 WriteFull操作码必须有所有相关的WTAGUPDATE位被断言。 对于每一个被断言的WTAGUPDATE位,WTAG必须是有效的。 |
0b11 | Match | 在写入过程中必须检查标签与从内存中获得的分配标签值是否匹配。必须对所有写入数据选通被激活的标签执行匹配操作。 即使匹配失败,也需要用数据更新内存。 必须解除断言WTAGUPDATE信号。 WTAG位对于由WSTRB启用的字节通道必须有效。 对于具有超过4位标签的接口,只对对应于活动字节通道的标签执行匹配操作。 |
对于带有标签更新的写入,WTAGUPDATE 指示必须写入哪些标签。它有以下规则:
- WTAGUPDATE[n] 对应于 WTAG[4n+3:4n]。
- 如果一个位被设置,则必须将相应的标签写入内存。
- 如果一个位被清除,则相应的标签无效。
- 事务容器外的 WTAGUPDATE 位必须被清除。
- 对于除更新之外的操作 WTAGUPDATE 必须被清除。
- 仅标签写入可以通过设置 WTAGUPDATE 和清除 WSTRB 来实现。
在MTE标签传输中,使用哪些写通道操作码是有限制的。 表 A13.3 显示了每种MTE_Support配置下操作码和TAGOP的合法组合。
对于所有操作码,TAGOP编码为无效是合法的。
星号(*)表示操作码的所有变体。
表 A13.3 写事务的合法标签操作码
操作码 | Basic-Transfer | Basic-Update | Basic-Match | Simplified-Transfer | Simplified-Update A[13-1] | Simplified-Match | Standard-Transfer | Standard-Update | Standard-Match |
---|---|---|---|---|---|---|---|---|---|
WriteNoSnoop | - | Y | - | - | Y | - | Y | Y | Y A[13-2] |
WriteUnique* | - | Y | - | - | Y | - | - | Y | - |
WriteNoSnoopFull | - | Y | - | Y | Y | - | Y | Y | Y |
WriteBackFull | - | Y | - | Y | Y | - | Y | Y | - |
WriteEvictFull | Y | - | - | Y | - | - | Y | - | - |
Atomic | - | - | - | - | - | - | - | - | Y |
CMO | - | - | - | - | - | - | - | - | - |
Write*CMO | - | - | - | Y A[13-3] | Y | - | Y A[13-3] | Y | - |
WriteZero | - | - | - | - | - | - | - | - | - |
WriteUnique*Stash | - | - | - | - | - | - | - | - | - |
StashOnce* | - | - | - | - | - | - | - | - | - |
StashTranslation | - | - | - | - | - | - | - | - | - |
Prefetch | - | - | - | Y | - | - | Y | - | - |
WriteDeferrable | - | - | - | - | - | - | - | - | - |
UnstashTranslation | - | - | - | - | - | - | - | - | - |
InvalidateHint | - | - | - | - | - | - | - | - | - |
A[13-1] :部分标签更新不受支持。
A[13-2] :不独占写入。
A[13-3] :域必须是非共享的。
写入带标签匹配操作的事务(AWTAGOP 为 0b11)有两个部分的响应:
- 完成响应,指示写入可以被观察到。
- 匹配响应,指示标签比较是通过还是失败。
两个部分的响应使得具有独立数据和标签存储部分的组件能够独立响应。
响应传输可以以任何顺序发送。这两个部分可以选择性地合并为一个单一的响应传输。
响应是通过 BCOMP 和 BTAGMATCH 进行信号传输的。 表 A13.14 显示了 BTAGMATCH 的编码。
表 A13.14 BTAGMATCH编码
BTAGMATCH | 操作 | 含义 |
---|---|---|
0b00 | None | 没有匹配结果,因为不是匹配事务。 |
0b01 | Separate | 比较结果在另一个响应中传输。 |
0b10 | Fail | 标签匹配失败。 |
0b11 | Pass | 标签匹配成功。 |
完成响应
完成响应表示写入是可观察的。它具有以下规则:
- 必须断言BCOMP。
- BTAGMATCH必须为0b01(匹配结果在单独的响应中)。
- BID必须与AWID具有相同的值。
- 如果支持Loop信号,则BLOOP必须与AWLOOP具有相同的值。
- BRESP可以取任何请求Opcode合法的值。
- 完成响应必须遵循正常的响应顺序规则。
- 当接收到该响应时,ID值可以重复使用。
匹配响应
匹配响应表示对写入的标签比较结果。
- 如果整个事务的每个传输的标签匹配,则响应为通过。
- 如果与活动写数据字节通道相关的任何标签与已有存储的标签不匹配,则响应为失败。
匹配响应具有以下规则:
- 必须取消断言BCOMP。
- BTAGMATCH必须为0b11(通过)或0b10(失败)。
- BID必须与AWID具有相同的值。
- BIDUNQ可以取任何值,不必与AWIDUNQ具有相同的值。
- BLOOP可以取任何值,不必与AWLOOP具有相同的值。
- BRESP可以取任何请求Opcode合法的值。
组合响应
从机可以选择将两个响应组合成一个传输。以下规则适用:
- 必须断言BCOMP。
- BTAGMATCH必须为0b11(通过)或0b10(失败)。
- BID必须与AWID具有相同的值。
- 如果支持Loop信号,则BLOOP必须与AWLOOP具有相同的值。
- BRESP可以取任何请求Opcode合法的值。
- 组合响应必须遵循正常的响应顺序规则。
- 当接收到该响应时,ID值可以重复使用。
匹配操作的可能响应如 表 A13.15 所示。
表 A13.15 匹配操作可能的响应
BTAGMATCH | BCOMP | 描述 |
---|---|---|
0b00 | 0b0 | 对带有标签匹配的请求作出回应不合法。 |
0b00 | 0b1 | 对带有标签匹配的请求作出回应不合法。 |
0b01 | 0b0 | 对带有标签匹配的请求作出回应不合法。 |
0b01 | 0b1 | 完成响应,分开响应的一部分。 |
0b10 | 0b0 | 匹配失败,分开响应的一部分。 |
0b10 | 0b1 | 匹配失败或者mte匹配不支持,合并响应。 |
0b11 | 0b0 | 匹配通过,分开响应的一部分。 |
0b11 | 0b1 | 匹配通过,合并响应的一部分。 |
A13.2.7 内存标签的互操作性
当对不支持内存标记的内存位置执行MTE操作时,结果数据必须与对该位置执行非MTE操作的结果相同。
- 对于传输或提取的读取,建议RTAG为零。
- 对于传输或更新的写入,数据必须正常写入,标签被丢弃。
- 对于匹配的写入,数据必须正常写入,并提供单个组合响应。 BTAGMATCH必须是0b10(失败) 。
从机在执行MTE操作时预计会给出OKAY响应,除非它对等效的非MTE操作会给出不同的响应。
A13.2.8 MTE和原子事务
原子事务可以对受内存标记保护的位置使用写匹配操作。
原子事务不能与Transfer或Update操作一起使用。
带匹配的原子比较事务可以是16字节或32字节。如果事务是32字节,则必须对与比较和交换字节相关联的标记位使用相同的标记值。
在原子事务中返回的读取数据没有有效的RTAG值,因此建议将RTAG设为零。
A13.2.9 MTE和预取事务
带有Transfer的AWTAGOP的预取事务表示,如果可能,数据应该带标签地进行预取。 预取事务没有写数据,因此在事务内不会发生标签Transfer操作。
A13.2.10 MTE和中毒
A17.1 使用中毒进行数据保护 讨论了与读写数据相关的Poison概念。 与分配标签没有直接关联的中毒信号。当写入带有中毒数据的标签时,存储的标签可能会被标记为中毒。
具体机制由实现定义。实现可能选择以下一种,但也可能有其他实现:
- 与数据相关的中毒导致标签被标记为中毒。根据与标签相关的中毒的粒度,可能无法使用清除与数据相关的中毒所用的相同技术来清除标签的中毒。
- 与数据相关的中毒不会导致标签被标记为中毒。这意味着损坏的标签可能随后在MTE匹配操作中使用,这可能会错误地失败。这种情况发生的频率应该显著低于数据损坏发生的频率。
- 可以根据使用的缓存或存储结构采用混合的方法。
A13.3 跟踪信号
可选的跟踪信号可以与每个通道关联,以支持系统的调试、跟踪和性能测量。
Trace_Signals属性用于指示一个组件是否支持跟踪信号。
表 A13.16 Trace_Signals属性
Trace_Signals | 默认 | 描述 |
---|---|---|
True | 所有通道支持跟踪信号。 | |
False | Y | 不支持跟踪信号。 |
与每个通道相关的追踪信号显示在 表 A13.17 中。
如果Trace_Signals属性为真,则必须为所有存在的通道提供适当的追踪信号。
表 A13.17 跟踪信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWTRACE | 1 | − | 写请求通道跟踪信号。 |
WTRACE | 1 | − | 写数据通道跟踪信号。 |
BTRACE | 1 | - | 写响应通道跟踪信号。 |
ARTRACE | 1 | - | 读请求通道跟踪信号。 |
RTRACE | 1 | - | 读数据通道跟踪信号。 |
Trace信号的确切使用在本规范中没有详细说明,但预计Trace信号的使用在系统中是协调的,并且在任何时候只会发生一次Trace信号的使用。 Trace信号的行为是实现定义的,但给出了以下建议:
- 主机可以在一个事务的地址上同时断言Trace信号,该事务应在系统中被跟踪。
- 组件在处理带有请求中Trace信号断言的事务时应提供带有Trace信号的响应。
- 传递事务的组件应保留请求和响应的Trace属性。
- 如果下游组件不支持Trace信号,则互连可以在适当的传输上断言Trace。
- 接收到带有断言AWTRACE信号请求的从机应在响应中同时断言BTRACE信号。
- 如果接口包含BCOMP,则对于BCOMP未断言的响应,BTRACE可以取任何值。
- WTRACE应通过互连组件传播。
- 接收到带有断言ARTRACE信的请求的从机应在每次读取响应的传输中同时断言RTRACE信号。
- 对于需要在读取通道上响应的原子事务,如果AWTRACE被断言,则应断言RTRACE信号。
A13.4 用户Loop信号
用户Loop信号允许发出请求的代理将与事务有关的信息存储在一个索引表中。 然后,事务响应可以使用快速表索引来获取所需信息,而不是要求使用事务ID进行更复杂的查找。
Loopback_Signals属性用于指示组件是否支持Loop信号。
表 A13.18 Loopback_Signals属性
Loopback_Signals | 默认 | 描述 |
---|---|---|
True | 支持Loop信号。 | |
False | Y | 不支持Loop信号。 |
与每个通道相关的Loop信号显示在 表 A13.19 中。
如果Loopback_Signals属性为真,则所有通道必须存在适当的Loop信号。
表 A13.19 Loop信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWLOOP BLOOP | LOOP_W_WIDTH | 全0 | 用户定义的值必须从写请求反映到响应传输中。 |
ARLOOP RLOOP | LOOP_R_WIDTH | 全0 | 用户定义的值必须从读请求反映到响应传输中。 |
表 A13.20 LOOP_W_WIDTH和LOOP_R_WIDTH属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
LOOP_W_WIDTH | 0…8 | − | 在写通道上的Loop信号宽度以位为单位,适用于AWLOOP和BLOOP |
LOOP_R_WIDTH | 0…8 | − | 在写通道上的Loop信号宽度以位为单位,适用于ARLOOP和RLOOP |
Loop宽度属性的规则是:
- 如果 LOOP_W_WIDTH 为 0,则 AWLOOP 和 BLOOP 不存在。
- 如果 LOOP_R_WIDTH 为 0,则 ARLOOP 和 RLOOP 不存在。
- 如果 Loopback_Signals 为 False,则 LOOP_R_WIDTH 和 LOOP_W_WIDTH 必须为 0。
使用规则是:
- BLOOP 的值必须与 AWLOOP 的值相同。
- 如果接口包含 BCOMP,则在 BCOMP 解除断言的响应中,BLOOP 可以取任何值。
- RLOOP 的值必须与所有读取数据传输中 ARLOOP 的值相同。
- 对于要求在读取通道上响应的原子事务,RLOOP 的值必须与 AWLOOP 上提供的值相同。 这意味着主机必须使用可以在 AWLOOP 和 RLOOP 上发出信号的回环值。
回环值不要求唯一。允许来自同一主机的多个未完成事务使用相同的值。
不要求在事务通过系统的过程中保留回环值。中间组件被允许存储其接收到的请求的回环值,并使用其自身的值处理下游传播的请求。 当该组件收到下游事务的响应时,它可以检索原始事务的回环值。
A13.5 用户定义信号
AXI接口可以包括一组用户定义的信号,称为用户信号。这些信号可以用于增强事务的信息,在有需求未被现有AMBA规范覆盖的情况下。 信息可以添加到:
- 事务请求
- 事务响应
- 事务中的每个读或写数据传输
一般来说,建议避免使用用户信号。AXI协议没有定义这些信号的功能,如果两个组件以不兼容的方式使用相同的用户信号,这可能会导致互操作性问题。
A13.5.1 配置
用户信号的存在和宽度由 表 A13.21 中的属性指定。
表 A13.21 用户信号属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
USER_REQ_WIDTH | 0…128 | 0 | 用户扩展请求的宽度以位为单位,适用于AWUSER和ARUSER。 |
USER_DATA_WIDTH | (0…DATA_WIDTH)/2 | 0 | 用户扩展数据的宽度以位为单位,适用于WUSER和RUSER。 |
USER_RESP_WIDTH | 0…16 | 0 | 用户扩展响应的宽度以位为单位,适用于BUSER和RUSER。 |
如果一个属性的值为零,则接口上不存在相关信号。
最大信号宽度仅供参考,用于为可配置接口设置合理的最大值。
A13.5.2 用户信号
可以添加到每个通道的用户信号显示在 表 A13.22 。
表 A13.22 用户信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWUSER ARUSER | USER_REQ_WIDTH | 全0 | 用户定义请求。 |
WUSER | USER_DATA_WIDTH | 全0 | 用户定义写数据。 |
BUSER | USER_RESP_WIDTH | 全0 | 用户定义写响应。 |
RUSER | USER_DATA_WIDTH + USER_RESP_WIDTH | 全0 | 用户定义读数据和响应 |
A13.5.3 用户考虑
用户信号的实现位置:
- 并不要求所有通道都支持用户信号。
- 关于用户信号的存在和宽度的设计决策是独立于请求、数据和响应通道做出的。
- 并不要求请求的用户信号上的值在响应的用户信号上反映出来。
为了帮助数据宽度和协议转换,建议:
- USER_DATA_WIDTH是数据通道宽度(以字节为单位)的整数倍。
- 用户响应位在每次读或写响应的传输中保持相同的值。
- RUSER的低位用于传输每个事务的响应信息。
- RUSER的高位用于传输每次传输读数据的信息。
A第14章 未转换事务
本章描述了AXI如何支持在系统内存管理单元(SMMU)上游的组件中使用虚拟地址和转换缓存提示。 它包含以下部分:
- A14.1 分布式虚拟内存介绍
- A14.2 未转换事务支持
- A14.3 未转换事务信号
- A14.4 转换ID
- A14.5 转换错误流程
- A14.6 未转换事务限制
- A14.7 暂存转换操作码
- A14.8 未暂存转换事务操作码
A14.1 分布式虚拟内存介绍
图 A14.1 中展示了一个使用分布式虚拟内存(DVM)的示例系统。
在 图 A14.1 中,系统内存管理单元(SMMU)将虚拟地址空间中的地址转换为物理地址空间中的地址。 虽然系统中的所有组件必须使用单一的物理地址空间,但SMMU组件使不同的管理组件能够在各自独立的虚拟地址或中间物理地址空间中操作。
在 图 A14.1 所示的虚拟内存系统中,典型的过程可能如下进行:
- 一个在虚拟地址(VA)空间中操作的管理组件发出一个使用VA的事务。
- SMMU接收VA进行物理地址(PA)转换:
- 如果SMMU最近执行过所请求的转换,则它可能会从其转换后备缓存(TLB)中获取该转换的缓存副本。
- 否则,SMMU必须执行转换表遍历,从内存中访问转换表以获取所需的VA到PA转换。
- SMMU使用PA为请求的组件发出事务。
在该过程的第2步中,所需的VA转换可能不存在。在这种情况下,转换表遍历会生成一个故障,必须通知维护转换表的代理。 为了使所需的访问能够进行,该代理必须提供所需的VA到PA转换。通常,它会使用所需的信息更新转换表。
维护转换表可能需要对在TLB中缓存的转换表条目进行更改。为防止使用这些条目,可以使用DVM消息发出TLB失效操作。
当转换表被更新,并且所需的TLB失效操作执行后,使用DVM同步事务以确保所有所需的事务都已完成。
关于维护SMMU所使用的DVM消息的详细信息可以在 A第15章 分布式虚拟内存消息
A14.2 未转换事务支持
AXI支持通过未转换事务扩展使用虚拟地址。未转换事务的规格随着时间的发展而变化,目前有三个不同版本。 建议使用虚拟内存的新设计使用规格的第3版。
Untranslated_Transactions属性用于指示接口支持的未转换事务的版本。
表 A14.1 Untranslated_Transactions属性
Untranslated_Transactions | 默认 | 描述 |
---|---|---|
v3 | 支持版本3 | |
v2 | 支持版本2 | |
v1 | 支持版本1 | |
True | 支持版本1 | |
False | Y | 未转换版本不支持 |
地址转换是将输入地址根据地址映射和存储器属性信息转换为输出地址的过程,这些信息保存在转换表中。 这个过程允许系统中的代理使用他们自己的虚拟地址空间,但确保所有事务的地址最终都被转换为整个系统的单一物理地址空间。
使用单一物理地址空间是硬件一致性正常操作所必需的,因此SMMU功能通常位于一致性互连之前。
本节中指定的附加信号提供了足够的信息,使SMMU能够确定特定事务所需的转换,并允许在同一接口上使用不同转换方案的不同事务。
未转换事务扩展中的所有信号都以AWMMU为前缀用于写事务,以ARMMU为前缀用于读事务。
在本规范中,AxMMU表示AWMMU或ARMMU。
A14.3 未转换事务信号
支持未转换事务的信号如 表 A14.2 所示。 每个信号将在以下部分中进行描述,包括决定它们是否存在的属性值。
表 A14.2 未转换事务信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWMMUSECSID ARMMUSECSID | SECSID_WIDTH | 0b00 Non-secure | 未转换事务的安全流ID。 |
AWMMUSID ARMMUSID | SID_WIDTH | 全0 | 未转换事务的流ID。 |
AWMMUSSIDV ARMMUSSIDV | 1 | 0b0 | 断言为高表明事务有一个有效的子流ID有效。 |
AWMMUSSID ARMMUSSID | SSID_WIDTH | 全0 | 未转换事务的子流ID。 |
AWMMUATST ARMMUATST | 1 | 0b0 | 表示事务已经经历了PCIe ATS转换。 |
AWMMUFLOW AWMMUFLOW | 2 | 0b00 Stall | 指示此事务转换故障管理的SMMU流程。 |
AWMMUVALID AWMMUVALID | 1 | 0b0 | MMU 限制信号。当未被使能时,事务地址是物理地址,并且不需要翻译。 |
当Untranslated_Transactions为v2或v3时,RRESP和BRESP扩展为3位,以容纳TRANSFAULT响应的信号。 有关编码,请参见 A4.3 事务响应 。
在 表 A14.3 中,有关未转换事务的不同版本,MMU信号的摘要如下:
- ‘Y’表示该信号是强制性的。
- ‘C’表示存在是可配置的。
- ‘-’表示该信号不得存在。
表 A14.3 不同版本的未转换事务信号
信号 | Version 1 | Version 2 | Version 3 |
---|---|---|---|
AxMMUSECSID | Y | Y | Y |
AxMMUSID | C | C | C |
AxMMUSSIDV | C | C | C |
AxMMUSSID | C | C | C |
AxMMUATST | C | - | - |
AxMMUFLOW | - | C | C |
AxMMUVALID | - | - | Y |
A14.4 转换ID
使用虚拟寻址的请求可以有最多三个在地址转换过程中使用的ID:
在构建系统的过程中,某个组件的流ID可能有一些由组件提供的ID位,以及一些与该组件绑定的ID位。 这固定了该组件可以使用的流ID命名空间中的值范围。通常,低位由组件提供,而高位则被绑定。
对于AxMMUSID或AxMMUSSID的任何额外ID字段位,必须在组件未提供或互连未硬编码的情况下设置为低电平。
A14.4.1 安全流ID(SECSID)
安全流ID用于指示请求的虚拟地址空间。
它通过AxMMUSECSID信号进行传输,表 A14.4 显示了编码方式。
表 A14.4 AxMMUSECSID信号
AxMMUSECSID | 标签 | 含义 |
---|---|---|
0b00 | Non-secure | 非安全地址空间 |
0b01 | Secure | 安全地址空间 |
0b10 | Realm | 领域地址空间 |
0b11 | RESERVED | - |
AxMMUSECSID的宽度由属性SECSID_WIDTH决定。
表 A14.5 SECSID_WIDTH属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
SECSID_WIDTH | 0,1,2 | 0 | AxMMUSECSID信号的位宽。 |
以下规则适用:
- 当 Untranslated_Transactions 为 False 时 SECSID_WIDTH 必须为 0, AxMMUSECSID 信号不存在。
- 当 Untranslated_Transactions 不为 False 且 RME_Support 为 False 时 SECSID_WIDTH 必须为 1,只能使用非安全和安全地址空间。
- 当 Untranslated_Transactions 不为 False 且 RME_Support 为 True 时 SECSID_WIDTH 必须为 2。
- 当 AxMMUSECSID 为非安全时, AxNSE/AxPROT 必须指示为非安全。
- 当 AxMMUSECSID 为安全时。 AxNSE/AxPROT 必须指示为非安全或安全。
- 当 AxMMUSECSID 为领域时, AxNSE/AxPROT 必须指示为非安全或领域。
A14.4.2 流ID
StreamID可用于将请求映射到MMU中的转换上下文。 每个地址空间使用不同的名称空间,因此它们可以具有相同的Stream Identifier值。
AxMMUSID的宽度由属性SID_WIDTH确定。
表 A14.6 SID_WIDTH属性
名字 | 值 | 默认 | 描述 |
---|---|---|---|
SID_WIDTH | 0…32 | 0 | StreamID 位宽,应用于AWMMUSID和ARMMUSID。 |
如果SID_WIDTH为0,则AxMMUSID信号不存在并使用默认值。
A14.4.3 子流ID
SubstreamID可以与具有相同StreamID的请求一起使用,以将不同的应用程序地址映射关联到不同的逻辑块。
SubstreamID有一个单独的使能信号AxMMUSSIDV,因此主机可以发出有或没有SubstreamID的请求。 AxMMUSSIDV未被激活时,AxMMUSSID必须为0。
Note:SubstreamID为0的流与没有有效子流的流不同(AxMMUSSIDV未被激活)。AxMMUSSID的宽度由属性SSID_WIDTH决定。
表 A14.7 SSID_WIDTH 属性
属性名 | 值 | 默认 | 描述 |
---|---|---|---|
SSID_WIDTH | 0…20 | 0 | 子流ID位宽适用于AWMMUSSID和ARMMUSSID |
当SSID_WIDTH为0时,接口上不存在AxMMUSSID和AxMMUSSIDV,并且没有有效的SubstreamID。
A14.4.4 PCIE考虑
当使用 Untranslated_Transactions 信号与PCIe Root Complex接口时,以下注意事项适用:
- AxMMUSECSID必须为非安全或领域。
- AxMMUSID对应于PCIe请求者ID。
- AxMMUSSID对应于PCIe PASID。
- 如果事务具有PASID前缀,则AxMMUSSIDV被断言,否则为非断言。
A14.5 转换错误流程
未转换的事务可以指示在SMMU遇到转换故障时可以使用哪个流。 如果没有指示任何流,则假定为Stall流。
属性MMUFLOW_Present用于指示是否支持其他SMMU流。
表 A14.8 MMUFLOW_Present 属性
MMUFLOW_Present | 默认 | 描述 |
---|---|---|
True | AxMMUFLOW</strong或AxMMUATST存在。 | |
False | Y | AxMMUFLOW</strong或AxMMUATST不存在。 |
如果Untranslated_Transactions为False,MMUFLOW_Present必须为False。
如果MMUFLOW_Present为True,则:
- 如果Untranslated_Transactions为True或v1,ARMMUATST和AWMMUATST在接口上存在。
- 如果Untranslated_Transactions为v2或v3,ARMMUFLOW和AWMMUFLOW在接口上存在。
规格的版本1对未转换事务支持Stall和ATST流,使用AxMMUATST信号。
- 当AxMMUATST被断言为LOW时,使用Stall流。
- 当AxMMUATST被断言为HIGH时,使用ATST流。
对于版本2及以上,使用AxMMUFLOW信号指示可以使用哪个流。
表 A14.9 AxMMUFLOW编码
AxMMUFLOW | 流类型 | 含义 |
---|---|---|
0b00 | Stall | The SMMU Stall flow can be used. |
0b01 | ATST | The SMMU ATST flow must be used. |
0b10 | NoStall | The SMMU NoStall flow must be used. |
0b11 | PRI | The SMMU PRI flow can be used. |
以下部分逐一描述每个流程。
A14.5.1 STALL流
当使用stall流时,软件可以配置SMMU在发生转换故障时采取以下操作之一:
- 用SLVERR响应终止事务。
- 用OKAY响应终止事务,数据为RAZ/WI。
- 暂停转换并通知软件转换已暂停。 软件可以指示SMMU终止事务或更新转换表并重试转换。主机并不知道暂停的情况。
这种流程使软件能够管理转换故障和需求分页,而主机并不知情。
然而,它有一些限制:
- 主机可能会看到非常长的事务延迟,这可能触发超时。
- 由于软件活动的依赖,暂停流可能会导致某些系统中的死锁。
例如,由于CPU向PCIe的外发事务与通过SMMU从PCIe来的内发事务之间的依赖,不建议与PCIe一起使用。
启用暂停流并不一定会在发生转换故障时导致暂停。只有在软件启用时才会发生暂停。软件通常不为PCIe端点启用暂停。
A14.5.2 ATST流
地址转换服务转换(ATST)流程表明该事务已经由ATS转换。 此流程仅由PCIe根端口使用。
当流程为ATST时,事务可能仍会根据SMMU的配置经历一些转换。有关更多信息,请参见Arm®系统内存管理单元架构规范 A[7] 。 如果发生转换错误,事务必须以SLVERR响应终止。 当流程为ATST时,适用以下约束:
- AxMMUSECSID必须是非安全或领域。
- 如果Untranslated_Transactions为真,且版本是v1或v2,则AxMMUSSIDV必须为低电平。
当Untranslated_Transactions为v3时,允许在AxMMUFLOW指示ATST时触发AxMMUSSIDV。 这是为了实现使用AxMMUSSID信号从PCIe事务传输PASID和其他属性。
A14.5.3 NOSTALL流
NoStall流用于无法被阻塞的主机。如果在使用此流时发生转换故障,子节点必须用SLVERR或OKAY响应终止事务,即使软件已将设备配置为在发生转换故障时被阻塞。
这个流推荐用于像PCIe根端口的主机,因为如果启用软件阻塞,可能会导致死锁。
A14.5.4 PRI流
PRI(Page Request Interface)流旨在与集成的PCIe终端使用。 主机使用PRI流使软件能够对转换故障作出响应,而不会导致死锁。
当流为PRI且发生转换故障时,事务将以TRANSFAULT响应终止。 然后,主机可以使用单独的机制请求释放Page,然后再重试该事务。 此机制通常为PCIe PRI。
当使用此流时,软件启用ATS,但硬件中不需要ATS功能。
如果由于无法通过PRI请求解决的原因,例如SMMU配置不正确,使用此流的事务仍可能会被SMMU以SLVERR终止。
以下规则适用于TRANSFAULT响应:
- TRANSFAULT通过将RRESP或BRESP设置为0b101来指示。 请参阅 A4.3 事务响应 以获取所有编码。
- TRANSFAULT响应仅允许用于使用PRI流的请求。
- 如果TRANSFAULT用于一个响应传输,则必须对该事务的所有响应传输均使用TRANSFAULT。
- 如果RRESP为TRANSFAULT,则该传输中的读取数据无效。
A14.6 未转换事务限制
当Untranslated_Transactions属性为v3时,会在读写请求通道中添加一个限定信号AxMMUVALID。
当AxMMUVALID被解除断言时,事务地址是物理地址,不需要翻译。 这使得主机能够发出转换和未转换事务的混合。
使用这些信号的规则如下:
- 当AxMMUVALID被断言时,以下信号受到限制:
- AxTAGOP必须为0b00(无效)
- 当AxMMUVALID被解除断言时,以下信号不适用,可以取任何值:
- AxMMUSECSID
- AxMMUSID
- AxMMUSSIDV
- AxMMUSSID
- AxMMUFLOW
A14.7 暂存转换操作码
StashTranslation 操作码是一个提示,表示 MMU 应该缓存处理给定地址所需的表项,以减少未来使用该表项的任何事务的延迟。
MMU 的要求取决于地址是虚拟地址还是物理地址,以及是否正在使用领域管理扩展(Realm Management Extension):
- 如果 AWMMUVALID 被断言,则 StashTranslation 请求具有虚拟地址,MMU 应该缓存相关的Page表项。
- 如果 AWMMUVALID 被解除断言,则 StashTranslation 请求具有物理地址,MMU 应该缓存相关的粒度保护表项。
如果 RME_Support 为 False,则 StashTranslation 请求必须将 AWMMUVALID 断言。
StashTranslation 操作码可以由主机使用,并由从机支持,如果满足以下属性条件:
- Untranslated_Transactions 为 v1、v2 或 v3。
- Untranslated_Transactions 为 True 且 Cache_Stash_Transactions 为 True。
StashTranslation 操作的规则是:
- StashTranslation 事务由 AW 通道上的请求和 B 通道上的单个响应传输组成。没有写数据传输。
- AWSNOOP 为 0b01110,以指示 StashTranslation,AWSNOOP_WIDTH 可以为 4 或 5。
- 不支持任何存储目标。如果存在,AWSTASHNID、AWSTASHNIDEN、AWSTASHLPID 和 AWSTASHLPIDEN 必须为 LOW。
- 允许任何合法的 AWCACHE 和 AWDOMAIN 值的组合。请参见 表 A9.7 。
- AWATOP 为 0b000000(非原子事务)。
- AWTAGOP 为 0b00(无效)。
- StashTranslation 请求不得使用与同时存在的非 StashTranslation 事务使用的相同 AXI ID 值。 这条规则确保 StashTranslation 事务与其他事务之间没有排序约束,因此不暂存转换的从机可以立即响应。
- OKAY 响应表示 StashTranslation 请求已被接受,而不是转换已被存储。该请求是一个提示,并不保证会被完成者处理。
A14.8 未暂存转换事务操作码
UnstashTranslation操作码是一个提示,表示与给定事务地址和StreamID对应的Page表或粒度表条目不太可能再次使用。
对MMU的要求取决于地址是虚拟地址还是物理地址,以及是否正在使用Realm管理扩展:
- 如果AWMMUVALID被置为真,则UnstashTranslation请求具有虚拟地址,MMU应该释放相关的Page表条目。
- 如果AWMMUVALID被置为假,则StashTranslation请求具有物理地址,MMU应该释放相关的粒度保护表条目。
如果RME_Support为假,UnstashTranslation请求必须将AWMMUVALID置为真。
UnstashTranslation_Transaction属性用于指示接口是否支持UnstashTranslation操作码。
表 A14.10UnstashTranslation_Transaction属性
UnstashTranslation_Transaction | 默认 | 描述 |
---|---|---|
True | 支持非暂存转换。 | |
False | Y | 不支持非暂存转换。 |
下表显示了根据UnstashTranslation_Transaction属性的值,主机和从机接口之间的兼容性。
UnstashTranslation_Transaction | 从机:False | 从机:True |
---|---|---|
主机:False | 兼容 | 兼容 |
主机:True | 不兼容 | 兼容 |
UnstashTranslation操作的规则是:
- UnstashTranslation事务由AW通道上的请求和B通道上的单个响应传输组成。没有写数据传输。
- AWSNOOP为0b10001以指示UnstashTranslation,AWSNOOP_WIDTH必须为5。
- 不支持任何stash目标。如果存在,AWSTASHNID、AWSTASHNIDEN、AWSTASHLPID和AWSTASHLPIDEN必须为LOW。
- 允许任何合法的AWCACHE和AWDOMAIN值的组合。见 表 A9.7 。
- AWATOP为0b000000(非原子事务)。
- AWTAGOP为0b00(无效)。
- AWID在传输中是唯一的,这意味着:
- 只有在写通道上没有使用相同ID值的未完成事务时,才能发出UnstashTranslation请求。
- 主机不得在写通道上发出与未完成UnstashTranslation事务具有相同ID的请求。
- 如果存在,AWIDUNQ必须在UnstashTranslation请求中被断言。
- OKAY响应表示UnstashTranslation请求已被接受,而不是指翻译已被释放。该请求是一个提示,并不保证由完成者执行。
A第15章 分布式虚拟内存消息
本章描述了AXI如何使用分布式虚拟内存DVM消息支持分布式系统MMU,以维护虚拟内存系统中的所有MMU。
它包含以下几个部分:
A15.1 DVM事务介绍
DVM事务是一个可选功能,用于传递支持虚拟内存系统维护的消息。有两种类型的DVM事务:DVM消息和DVM完成。
DVM消息支持以下操作:
- TLB失效
- 分支预测器失效
- 物理指令缓存失效
- 虚拟指令缓存失效
- 同步
- 提示
DVM消息请求从从机发送,通常是在互连上,发送到主机接口,使用侦听请求(AC)通道。
DVM消息响应从主机发送到从机,使用侦听响应(CR)通道。
DVM完成事务是在读取请求通道(AR)上对DVM同步(Sync)消息发出的,以指示所有所需操作和任何相关事务已完成。
A15.2 DVM消息支持
DVM_Message_Support 属性用于指示接口是否支持 DVM 消息。
表 A15.1 DVM_Message_Support属性
DVM_Message_Support | 默认 | 描述 |
---|---|---|
Receiver | 支持DVM消息和同步事务在AC/CR通道上从从机到主机。 支持DVM完成事务在AR/R通道上从主机支持到从机。 | |
False | Y | 不支持DVM完成传输。 |
Note:在本规范的先前版本中,DVM_Message_Support的双向选项已被弃用。
DVM Complete消息要求ARDOMAIN设置为Shareable。 因此,当DVM_Message_Support为Receiver时,Shareable_Transactions属性必须为True。
DVM消息是在Armv7架构中引入的,并在Armv8、Armv8.1、Armv8.4和Armv9.2架构中进行了扩展。发起和接收DVM消息的接口必须支持相同的架构版本。
以下属性定义了接口支持的版本:
- DVM_v8
- DVM_v8.1
- DVM_v8.4
- DVM_v9.2
每个属性可以取值:True或False。如果属性未声明,则被视为False。
在 表 A15.2 中指明了根据属性值支持哪些消息版本。支持特定版本DVM消息的组件还必须支持早期架构版本。
表 A15.2 DVM消息版本
DVM_v9.2 | DVM_v8.4 | DVM_v8.1 | DVM_v8 | Armv9.2 | Armv8.4 | Armv8.1 | Armv8 | Armv7 |
---|---|---|---|---|---|---|---|---|
True | True or False | True or False | True or False | Y | Y | Y | Y | Y |
False | True | True or False | True or False | - | Y | Y | Y | Y |
False | False | True | True or False | - | - | Y | Y | Y |
False | False | False | True | - | - | - | Y | Y |
False | False | False | False | - | - | - | - | Y |
A15.3 DVM消息
以下 DVM 消息受到协议支持:
- TLB 失效
- 分支预测器失效
- 物理指令缓存失效
- 虚拟指令缓存失效
- 同步
- 提示
DVM 事务仅在只读结构上操作,例如指令缓存、分支预测器和 TLB,因此只需要失效操作。 清除的概念不适用于只读结构。这意味着使更多条目无效在功能上是正确的,即使这不是DVM消息所要求的,虽然这些额外的失效可能会影响性能。
A15.3.1 DVM消息字段
DVM消息中的字段如 表 A15.3 所示。
表 A15.3 DVM消息字段
字段名 | 位宽 | 描述 |
---|---|---|
VA | 32-57 | 虚拟地址。 |
PA | 32-52 | 物理地址。 |
ASID | 8或16 | 地址空间ID。 |
ASIDV | 1 | 断言为HIGH,表示ASID字段有效; 断言为LOW,ASID字段必须为0。 |
VMID | 8或16 | 虚拟机ID。 |
VMIDV | 1 | 断言为HIGH,表示VMID字段有效; 断言为LOW,VMID字段必须为0。 |
DVMType | 3 | 0b000:TLB无效(TLBI)。 0b001:分支预测无效(BPI)。 0b010:物理指令缓存无效(PICI)。 0b011:虚拟指令缓存无效(VICV)。 0b100:同步(Sync) 0b101:Reserved。 0b110:提示(Hint)。 0b111:Reserved。 |
Exception | 2 | 表示事务的异常级别。 0b00:Hypervisor and all Guest OS。 0b01:EL3 A[15-1] 。0b10:Guest OS。 0b11:Hypervisor。 |
Security | 2 | 指示失效适用于哪个安全状态。见 表 A15.6 |
Leaf | 1 | 仅指示Leaf条目是否无效。 0b0:所有相关的转换都无效。 0b1只有Leaf条目无效。 |
Stage | 2 | 指示哪个阶段无效。 0b00:Armv7:失效的阶段根据失效的类型变化。 0b00:Armv8以及之后:阶段1和2失效。 0b01:阶段1失效。 0b10:阶段2失效。0b11:GPT A[15-2] 。 |
Num | 5 | 用于范围计算中的常数乘法因子。 所有二进制值都是有效的。 |
Scale | 2 | 用于地址范围指数计算的常量。 所有二进制值都是有效的。 |
TTL | 2 | 转换表级别(TTL)的提示,其中包括要使无效的地址。 详细信息见表 表 A15.4 和 表 A15.5 。 |
TG | 2 | 转换粒度 (TG)。对于按范围的 TLB 无效化,TG 表示粒度大小:0b00:Reserved。 0b01:4k。 0b10:16k。 0b11:64k。 对于非范围TLB失效,TG和TTL表示表级提示,参见 表 A15.5 |
VI | 16 | 虚拟索引,用于PICI消息。 |
VIV | 2 | 虚拟索引有效。 0b00:虚拟索引无效。 0b01:Reserved。 0b10:Reserved。 0b11:虚拟索引有效。 |
IS | 4 | GPT TLBI PA操作编码无效化的大小:0b000:4KB。 0b0001:16KB。 0b0010:64KB。 0b0011:2MB。 0b0100:32MB。 0b0101:512MB。 0b0110:1GB。 0b0111:16GB。 0b1000:64GB。 0b01001:512GB。 0b1010-0b1111:Reserved。 |
Addr | 消息是否包含地址。 0b0:没有地址信息。 0b1保护地址信息,而且是一个两部分的消息。 | |
Range | 断言为HIGH表示这是地址范围的第二部分。 | |
Completion | 断言为HIGH表示需要完成消息。 |
A[15-1] :Exception Level 3。EL3 是最高的特权级别,比 EL0(用户应用程序级别),EL1(操作系统内核级别),和 EL2(虚拟机管理程序级别)都要高。
A[15-2] :Granule Protection Tables。用于配置每个粒度关联的物理地址空间。
TLB Invalidate level hint
地址范围的TLB失效中,TTL字段表示哪一级转换表遍历持有要失效地址的Leaf条目。编码如 表 A15.4 。
表 A15.4 TLB失效指示的Leaf条目。
TTL | 含义 |
---|---|
0b00 | 没有Leaf被指示。 |
0b01 | Leaf位于转换表的第1级。 |
0b10 | Leaf位于转换表的第2级。 |
0b11 | Leaf位于转换表的低3级 |
对于非范围地址的TLB失效,TTL和TG字段指示转换表遍历的哪一级持有正在失效的地址的Leaf条目。编码如下
TG | TTL | 含义 |
---|---|---|
0b00 | 0b00 | 没有级别被指示。 |
0b00 | 0b01 | Reserved |
0b00 | 0b10 | Reserved |
0b00 | 0b11 | Reserved |
0b01 | 0b00 | 没有级别被指示。 |
0b01 | 0b01 | 失效的Leaf位于转换表的第1级。 |
0b01 | 0b10 | 失效的Leaf位于转换表的第2级。 |
0b01 | 0b11 | 失效的Leaf位于转换表的第3级。 |
0b10 | 0b00 | 没有级别被指示。 |
0b10 | 0b01 | 没有级别被指示。 |
0b10 | 0b10 | 失效的Leaf位于转换表的第2级。 |
0b10 | 0b11 | 失效的Leaf位于转换表的第3级。 |
0b11 | 0b00 | 没有级别被指示。 |
0b11 | 0b01 | 失效的Leaf位于转换表的第1级。 |
0b11 | 0b10 | 失效的Leaf位于转换表的第2级。 |
0b11 | 0b11 | 失效的Leaf位于转换表的第3级。 |
Security field
安全字段根据DVM类型的不同有不同的含义,如 表 A15.6 所示。
表 A15.6 对于每个DVM类型安全字段的编码
安全 | TLBI | BPI | PICI All | PICI by PA | VICI |
---|---|---|---|---|---|
0b00 | Realm | Secure No-secure | Root Realm Secure Non-secure | Root | Secure Non-secure |
0b01 | Non-secure address from a Secure context | 保留 | Realm Non-secure | Realm | 保留 |
0b10 | Secure | 保留 | Secure Non-secure | Secure | Secure |
0b11 | Non-secure | 保留 | Non-secure | Non-secure | Non-secure |
ASID 字段
ASID 字段包含一个 8 位或 16 位的地址空间 ID。
- Armv7 仅支持 8 位 ASID。
- Armv8 及以上版本支持 8 位和 16 位 ASID。
无法从 DVM 消息中确定消息使用的是 8 位还是 16 位 ASID。所有 8 位 ASID 消息都需要将 ASID[15:8] 位设置为零。
预计大多数系统将在整个系统中使用单一 ASID 大小,要么为 8 位 ASID,要么为 16 位 ASID。
在包含混合 8 位 ASID 和 16 位 ASID 组件的系统中,预计所有维护都由使用 16 位 ASID 的代理完成。这确保代理能够对 8 位 ASID 和 16 位 ASID 组件执行维护。
互操作性要求如下:
- 对于 8 位 ASID 代理向 16 位 ASID 代理发送消息,消息将显示为上 8 位设置为零的 16 位 ASID。
- 对于 16 位 ASID 代理向 8 位 VMID 代理发送消息:
- 如果上 8 位为零,则消息已正确接收。
- 如果上 8 位不为零,则会发生过度失效,因为 8 位 ASID 代理会忽略上 8 位。
VMID 字段
VMID 字段包含一个 8 位或 16 位的虚拟机 ID。
- Armv7 和 Armv8 仅支持 8 位 VMID。
- Armv8.1 及以上版本支持 8 位和 16 位 VMID。
无法从 DVM 消息中确定消息使用的是 8 位还是 16 位 VMID。所有 8 位 VMID 消息都需要将 VMID[15:8] 字段设置为零。
预计大多数系统将在整个系统中使用单一 VMID 大小,要么为 8 位 VMID,要么为 16 位 VMID。
在包含混合 8 位 VMID 和 16 位 VMID 组件的系统中,预计所有维护都由使用 16 位 VMID 的代理完成。这确保代理能够对 8 位 VMID 和 16 位 VMID 组件执行维护。
互操作性要求如下:
- 对于 8 位 VMID 代理向 16 位 VMID 代理发送消息,消息将显示为上 8 位设置为零的 16 位 VMID。
- 对于 16 位 VMID 代理向 8 位 VMID 代理发送消息:
- 如果上 8 位为零,则消息已正确接收。
- 如果上 8 位不为零,则会发生过度失效,因为 8 位 VMID 代理会忽略上 8 位。
当 Armv8.1 及以上版本得到支持时,ACVMIDEXT 被包含在 AC 通道上以传输 16 位 VMID 的上字节。详情请参见 A15.4 DVM消息传输 。
A15.3.2 转换表失效消息(TLBI)
这一部分详细介绍了TLB无效(TLBI)消息。
对于TLBI消息,一些字段具有固定值,如 表 A15.7 所示。
表 A15.7 固定字段值的TLBI消息
字段名 | 值 | 含义 |
---|---|---|
DVMtype | 0b000 | TLB无效操作码。 |
Completion | 0b0 | 不需要完成。 |
TLBI必须操作的条目取决于消息中的字段,所有支持的TLBI操作如 表 A15.8 所示。
Arm列指示支持该消息所需的最低Arm架构版本。
TLBI消息的字段到信号映射详细说明如 表 A15.20 。
Operation | Arm | Exception | Security | VMIDV | ASIDV | Leaf | Stage | Addr |
---|---|---|---|---|---|---|---|---|
EL3 TLBI all | v8 | 0b01 | 0b10 | 0b0 | 0b0 | 0b0 | 0b00 | 0b0 |
EL3 TLBI by VA | v8 | 0b01 | 0b10 | 0b0 | 0b0 | 0b0 | 0b00 | 0b1 |
EL3 TLBI by VA, Leaf only | v8 | 0b01 | 0b10 | 0b0 | 0b0 | 0b1 | 0b00 | 0b1 |
Secure Guest OS TLBI by Non-secure IPA | v8.4 | 0b10 | 0b01 | 0b1 | 0b0 | 0b0 | 0b10 | 0b1 |
Secure Guest OS TLBI by Non-secure IPA, Leaf only | v8.4 | 0b10 | 0b01 | 0b1 | 0b0 | 0b1 | 0b10 | 0b1 |
Secure TLBI all | v7 | 0b10 | 0b10 | 0b0 | 0b0 | 0b0 | 0b00 | 0b0 |
Secure TLBI by VA | v7 | 0b10 | 0b10 | 0b0 | 0b0 | 0b0 | 0b00 | 0b1 |
Secure TLBI by VA, Leaf only | v8 | 0b10 | 0b10 | 0b0 | 0b0 | 0b1 | 0b00 | 0b1 |
Secure TLBI by ASID | v7 | 0b10 | 0b10 | 0b0 | 0b1 | 0b0 | 0b00 | 0b0 |
Secure TLBI by ASID and VA | v7 | 0b10 | 0b10 | 0b0 | 0b1 | 0b0 | 0b00 | 0b1 |
Secure TLBI by ASID and VA, Leaf only | v8 | 0b10 | 0b10 | 0b0 | 0b1 | 0b1 | 0b00 | 0b1 |
Secure Guest OS TLBI all | v8.4 | 0b10 | 0b10 | 0b1 | 0b0 | 0b0 | 0b00 | 0b0 |
Secure Guest OS TLBI by VA | v8.4 | 0b10 | 0b10 | 0b1 | 0b0 | 0b0 | 0b00 | 0b1 |
Secure Guest OS TLBI all, Stage 1 only | v8.4 | 0b10 | 0b10 | 0b1 | 0b0 | 0b0 | 0b01 | 0b0 |
Secure Guest OS TLBI by Secure IPA | v8.4 | 0b10 | 0b10 | 0b1 | 0b0 | 0b0 | 0b10 | 0b1 |
Secure Guest OS TLBI by VA, Leaf only | v8.4 | 0b10 | 0b10 | 0b1 | 0b0 | 0b1 | 0b00 | 0b1 |
Secure Guest OS TLBI by Secure IPA,Leaf only | v8.4 | 0b10 | 0b10 | 0b1 | 0b0 | 0b1 | 0b10 | 0b1 |
Secure Guest OS TLBI by ASID | v8.4 | 0b10 | 0b10 | 0b1 | 0b1 | 0b0 | 0b00 | 0b0 |
Secure Guest OS TLBI by ASID and VA | v8.4 | 0b10 | 0b10 | 0b1 | 0b1 | 0b0 | 0b00 | 0b1 |
Secure Guest OS TLBI by ASID and VA,Leaf only | v8.4 | 0b10 | 0b10 | 0b1 | 0b1 | 0b1 | 0b00 | 0b1 |
All OS TLBI all | v7 | 0b10 | 0b11 | 0b0 | 0b0 | 0b0 | 0b00 | 0b0 |
Guest OS TLBI all, Stage 1 and 2 | v7 | 0b10 | 0b11 | 0b1 | 0b0 | 0b0 | 0b00 | 0b0 |
Guest OS TLBI by VA | v7 | 0b10 | 0b11 | 0b1 | 0b0 | 0b0 | 0b00 | 0b1 |
Guest OS TLBI all, Stage 1 only | v8 | 0b10 | 0b11 | 0b1 | 0b0 | 0b0 | 0b01 | 0b0 |
Guest OS TLBI by IPA | v8 | 0b10 | 0b11 | 0b1 | 0b0 | 0b0 | 0b10 | 0b1 |
Guest OS TLBI by VA, Leaf only | v8 | 0b10 | 0b11 | 0b1 | 0b0 | 0b1 | 0b00 | 0b1 |
Guest OS TLBI by IPA, Leaf only | v8 | 0b10 | 0b11 | 0b1 | 0b0 | 0b1 | 0b10 | 0b1 |
Guest OS TLBI by ASID | v7 | 0b10 | 0b11 | 0b1 | 0b1 | 0b0 | 0b00 | 0b0 |
Guest OS TLBI by ASID and VA | v7 | 0b10 | 0b11 | 0b1 | 0b1 | 0b0 | 0b00 | 0b1 |
Guest OS TLBI by ASID and VA, Leaf only | v8 | 0b10 | 0b11 | 0b1 | 0b1 | 0b1 | 0b00 | 0b1 |
Secure Hypervisor TLBI all | v8.4 | 0b11 | 0b10 | 0b0 | 0b0 | 0b0 | 0b00 | 0b0 |
Secure Hypervisor TLBI by VA | v8.4 | 0b11 | 0b10 | 0b0 | 0b0 | 0b0 | 0b00 | 0b1 |
Secure Hypervisor TLBI by VA, Leaf only | v8.4 | 0b11 | 0b10 | 0b0 | 0b0 | 0b1 | 0b00 | 0b1 |
Secure Hypervisor TLBI by ASID | v8.4 | 0b11 | 0b10 | 0b0 | 0b1 | 0b0 | 0b00 | 0b0 |
Secure Hypervisor TLBI by ASID and VA | v8.4 | 0b11 | 0b10 | 0b0 | 0b1 | 0b0 | 0b00 | 0b1 |
Secure Hypervisor TLBI by ASID and VA, Leaf only | v8.4 | 0b11 | 0b10 | 0b0 | 0b1 | 0b1 | 0b00 | 0b1 |
Hypervisor TLBI all | v7 | 0b11 | 0b11 | 0b0 | 0b0 | 0b0 | 0b00 | 0b0 |
Hypervisor TLBI by VA | v7 | 0b11 | 0b11 | 0b0 | 0b0 | 0b0 | 0b00 | 0b1 |
Hypervisor TLBI by VA, Leaf only | v8 | 0b11 | 0b11 | 0b0 | 0b0 | 0b1 | 0b00 | 0b1 |
Hypervisor TLBI by ASID | v8.1 | 0b11 | 0b11 | 0b0 | 0b1 | 0b0 | 0b00 | 0b0 |
Hypervisor TLBI by ASID and VA | v8.1 | 0b11 | 0b11 | 0b0 | 0b1 | 0b0 | 0b00 | 0b1 |
Hypervisor TLBI by ASID and VA, Leaf only | v8.1 | 0b11 | 0b11 | 0b0 | 0b1 | 0b1 | 0b00 | 0b1 |
Realm TLBI all | v9.2 | 0b10 | 0b00 | 0b0 | 0b0 | 0b0 | 0b00 | 0b0 |
Realm Guest OS TLBI all, Stage 1 only | v9.2 | 0b10 | 0b00 | 0b1 | 0b0 | 0b0 | 0b01 | 0b0 |
Realm Guest OS TLBI all, Stage 1 and 2 | v9.2 | 0b10 | 0b00 | 0b1 | 0b0 | 0b0 | 0b00 | 0b0 |
Realm Guest OS TLBI by VA | v9.2 | 0b10 | 0b00 | 0b1 | 0b0 | 0b0 | 0b00 | 0b1 |
Realm Guest OS TLBI by VA, Leaf only | v9.2 | 0b10 | 0b00 | 0b1 | 0b0 | 0b1 | 0b00 | 0b1 |
Realm Guest OS TLBI by ASID | v9.2 | 0b10 | 0b00 | 0b1 | 0b1 | 0b0 | 0b00 | 0b0 |
Realm Guest OS TLBI by ASID and VA | v9.2 | 0b10 | 0b00 | 0b1 | 0b1 | 0b0 | 0b00 | 0b1 |
Realm Guest OS TLBI by ASID and VA, Leaf only | v9.2 | 0b10 | 0b00 | 0b1 | 0b1 | 0b1 | 0b00 | 0b1 |
Realm Guest OS TLBI by IPA | v9.2 | 0b10 | 0b00 | 0b1 | 0b0 | 0b0 | 0b10 | 0b1 |
Realm Guest OS TLBI by IPA, Leaf only | v9.2 | 0b10 | 0b00 | 0b1 | 0b0 | 0b1 | 0b10 | 0b1 |
Realm Hypervisor TLBI all | v9.2 | 0b11 | 0b00 | 0b0 | 0b0 | 0b0 | 0b00 | 0b0 |
Realm Hypervisor TLBI by VA | v9.2 | 0b11 | 0b00 | 0b0 | 0b0 | 0b0 | 0b00 | 0b1 |
Realm Hypervisor TLBI by VA, Leaf only | v9.2 | 0b11 | 0b00 | 0b0 | 0b0 | 0b1 | 0b00 | 0b1 |
Realm Hypervisor TLBI by ASID | v9.2 | 0b11 | 0b00 | 0b0 | 0b1 | 0b0 | 0b00 | 0b0 |
Realm Hypervisor TLBI by ASID and VA | v9.2 | 0b11 | 0b00 | 0b0 | 0b1 | 0b0 | 0b00 | 0b1 |
Realm Hypervisor TLBI by ASID and VA, Leaf only | v9.2 | 0b11 | 0b00 | 0b0 | 0b1 | 0b1 | 0b00 | 0b1 |
GPT TLBI by PA | v9.2 | 0b01 | 0b10 | 0b0 | 0b0 | 0b0 | 0b11 | 0b1 |
GPT TLBI by PA, Leaf only | v9.2 | 0b01 | 0b10 | 0b0 | 0b0 | 0b1 | 0b11 | 0b1 |
GPT TLBI all | v9.2 | 0b01 | 0b10 | 0b0 | 0b0 | 0b0 | 0b11 | 0b0 |
TLB Invalidate by Range
当支持 Armv8.4 或更高版本时,如果 Range 字段为 0b1,则可以选择按 IPA 或 VA 进行 TLBI 操作。
如果出现以下情况,Range 字段必须为 0b0:
- 不支持 Armv8.4。
- 消息类型不是按 IPA 或 VA 进行的 TLB 无效。
当 Range 字段为 0b1 时,无效的地址范围按以下公式计算:
BaseAddr ≤ AddressRange < BaseAddr + ((Num + 1) × 2 (5×Scale+1) × TG)
其中:
- TG 是消息中提供的事务粒度。编码见 表 A15.3 。
- Scale 在消息中提供,可以取 0-3 之间的任何值。
- Num 在消息中提供,可以取 0-31 之间的任何值。
- BaseAddr 是基于 TG 的范围的基地址:
- 4K:BaseAddr 是 VA[MaxVA:12]。
- 16K:BaseAddr 是 VA[MaxVA:14],VA[13:12] 必须为零。
- 64K:BaseAddr 是 VA[MaxVA:16],VA[15:12] 必须为零。
按范围的 TLBI 是带有字段映射的两部分消息,如 表 A15.20 所述。
GPT TLB Invalidate
按 PA 操作的粒度保护表 (GPT) TLBI 执行基于范围的无效操作, 并使从 PA 开始的 TLB 条目在无效大小 (IS) 字段中指定的范围内无效。编码见表 表 A15.3 。
如果 PA 未与 IS 值对齐,则不需要使任何 TLB 条目无效。
IS 字段仅适用于 GPT 按 PA 操作的 TLBI。
使用设为 0b0 的 Range 字段,通过一部分消息发出 GPT TLBI 所有消息。
使用设为 0b1 的 Range 字段,通过两部分消息发出 GPT 按 PA 消息。
GPT TLBI 消息的字段信号映射见表 表 A15.20 。
A15.3.3 分支预测失效消息(BPI)
分支预测器无效 (BPI) 消息用于使分支预测器中的虚拟地址无效。
BPI 消息使用一部分或两部分消息进行信号传输,其字段信号映射详见 表 A15.21 。
BPI消息的固定字段值如 表 A15.9 所示
表 A15.9 固定字段值的BPI消息
字段名 | 值 | 描述 |
---|---|---|
DVMType | 0b001 | Branch Predictor Invalidate opcode |
Completion | 0b0 | Completion not required |
Range | 0b0 | Address is not a range |
VMIDV | 0b0 | VMID field not valid |
ASIDV | 0b0 | ASID field not valid |
Exception | 0b00 | Hypervisor and all Guest OS |
Security | 0b00 | Secure and Non-secure |
Leaf | 0b0 | Leaf information is N/A |
Stage | 0b00 | Stage information is N/A |
所有支持的BPI操作显示在 表 A15.10 中。
Arm栏表示支持该消息所需的最低Arm架构版本。
表 A15.10 BPI消息
操作 | Arm | Addr |
---|---|---|
BPI All | v7 | 0b0 |
BPI by VA | v7 | 0b1 |
A15.3.4 指令缓存无效(ICI)
指令缓存可以使用物理地址或虚拟地址来标记其包含的数据。一个系统可能包含这两种形式的缓存的混合体。
DVM协议包括使用物理地址的指令缓存失效操作和使用虚拟地址的操作。 接收DVM消息的组件必须支持这两种形式的消息,与所实现的指令缓存类型无关。
在接收到一种非缓存类型原生格式的消息时,可能需要进行过度失效。
Physical Instruction Cache Invalidate(PICI)
本节列出了DVM消息支持的物理指令缓存失效(PICI)操作。 此消息类型也用于虚拟索引物理标记(VIPT)的指令缓存。
使用一部分或两部分消息来发出PICI消息, 信号到字段的映射详见 表 A15.22 。 PICI消息的固定字段值显示在 表 A15.11 .
表 A15.11 固定字段值的PICI消息
字段名 | 值 | 含义 |
---|---|---|
DVMType | 0b010 | Physical Instruction Cache Invalidate opcode |
Completion | 0b0 | Completion not required |
Range | 0b0 | Address is not a range |
Exception | 0b00 | Hypervisor and all Guest OS |
Leaf | 0b0 | Leaf information is N/A |
Stage | 0b00 | Stage information is N/A |
所有支持的PICI操作见 表 A15.12 。
表 A15.12 PICI消息
Operation | Arm | Security | VIV | Addr |
---|---|---|---|---|
PICI all Root, Realm, Secure and Non-secure | v9.2 | 0b00 | 0b00 | 0b0 |
PICI by PA without Virtual Index, Root only | v9.2 | 0b00 | 0b00 | 0b1 |
PICI by PA with Virtual Index, Root only | v9.2 | 0b00 | 0b11 | 0b1 |
PICI all Realm and Non-secure | v9.2 | 0b01 | 0b00 | 0b0 |
PICI by PA without Virtual Index, Realm only | v9.2 | 0b01 | 0b00 | 0b1 |
PICI by PA with Virtual Index, Realm only | v9.2 | 0b01 | 0b11 | 0b1 |
PICI all Secure and Non-secure | v7 | 0b10 | 0b00 | 0b0 |
PICI by PA without Virtual Index, Secure only | v7 | 0b10 | 0b00 | 0b1 |
PICI by PA with Virtual Index, Secure only | v7 | 0b10 | 0b11 | 0b1 |
PICI all, Non-secure only | v7 | 0b11 | 0b00 | 0b0 |
PICI by PA without Virtual Index, Non-secure only | v7 | 0b11 | 0b00 | 0b1 |
PICI by PA with Virtual Index, Non-secure only | v7 | 0b11 | 0b11 | 0b1 |
当虚拟索引有效(VIV)字段为0b11时,VI[27:12]被用作物理地址的一部分。
Note:在本规范的以前版本中,具有0b10安全值的PICI被错误地标记为仅安全,而实际上它应该是安全和非安全的。
Virtual Instruction Cache Invalidate(VICI)
本节列出了DVM消息支持的虚拟指令缓存失效(VICI)操作。
VICI消息通过一部分或两部分消息进行信号传递,其字段到信号的映射详细信息见 表 A15.22 。
VICI消息的固定字段值如 表 A15.13 所示。
表 A15.13 固定字段值的VICI消息
字段名 | 值 | 含义 |
---|---|---|
DVMType | 0b011 | Virtual Instruction Cache Invalidate opcode |
Completion | 0b0 | Completion not required |
Range | 0b0 | Address is not a range |
Leaf | 0b0 | Leaf information is N/A |
Stage | 0b00 | Stage information is N/A |
所有支持的VICI操作如 表 A15.14 所示。
Arm列表示支持该消息所需的最低Arm架构版本。
表 A15.14 VICI消息
Operation | Arm | Exception | Security | VMIDV | ASIDV | Addr |
---|---|---|---|---|---|---|
Hypervisor and all Guest OS VICI all, Secure and Non-secure | v7 | 0b00 | 0b00 | 0b0 | 0b0 | 0b0 |
Hypervisor and all Guest OS VICI all, Non-secure only | v7 | 0b00 | 0b11 | 0b0 | 0b0 | 0b0 |
All Guest OS VICI by ASID and VA, Secure only | v7 | 0b10 | 0b10 | 0b0 | 0b1 | 0b1 |
All Guest OS VICI by VMID, Secure only | v8.4 | 0b10 | 0b10 | 0b1 | 0b0 | 0b0 |
All Guest OS VICI by ASID, VA and VMID, Secure only | v8.4 | 0b10 | 0b10 | 0b1 | 0b1 | 0b1 |
All Guest OS VICI by VMID, Non-secure only | v7 | 0b10 | 0b11 | 0b1 | 0b0 | 0b0 |
All Guest OS VICI by ASID, VA and VMID, Non-secure only | v7 | 0b10 | 0b11 | 0b1 | 0b1 | 0b1 |
Hypervisor VICI by VA, Non-secure only | v7 | 0b11 | 0b11 | 0b0 | 0b0 | 0b1 |
Hypervisor VICI by ASID and VA, Non-secure only | v8.1 | 0b11 | 0b11 | 0b0 | 0b1 | 0b1 |
A15.3.5 同步消息
同步(Sync)消息用于请求者需要知道所有先前的失效操作何时完成。 有关如何使用同步消息的更多信息,请参见 A15.5 DVM同步与完成 。
同步消息使用一部分消息进行信号传递,字段到信号的映射详见 表 A15.21 。同步消息的固定字段值如下所示
表 A15.15 固定字段值的同步消息
字段名 | 值 | 含义 |
---|---|---|
DVMType | 0b100 | Sync opcode |
Completion | 0b1 | Completion required |
ASIDV | 0b0 | No ASID information |
VMIDV | 0b0 | No VMID information |
Addr | 0b0 | No address information |
Range | 0b0 | No address range |
Exception | 0b00 | Exception information is N/A |
Security | 0b00 | Security information is N/A |
Leaf | 0b0 | Leaf information is N/A |
Stage | 0b00 | Stage information is N/A |
A15.3.6 提示消息
为未来提示消息预留了一个消息地址空间。
提示消息的固定字段值显示在 表 A15.16 。
表 A15.16 固定字段值的提示消息
字段名 | 值 | 含义 |
---|---|---|
DVMType | 0b110 | Hint opcode |
Completion | 0b0 | Completion not required |
A15.4 DVM消息传输
DVM 消息事务包括在侦听请求(AC)通道上的一个请求传输和在侦听响应(CR)通道上的一个响应。
每条消息可以有一到两个事务,第一条请求中的 Addr 字段指示是否需要另一个事务。
不包括地址的 DVM 消息通过一个事务发送。
包括地址的 DVM 消息通过两个事务发送。
通常使用互连来复制和分发给参与管理组件的 DVM 消息请求。 主机可以使用一致性连接信号在运行时选择接收消息,详见 A15.6 一致性连接信号 。
单部分和双部分消息的流程如 图 A15.1 所示。
以下规则适用于两部分的DVM消息
- 请求总是作为连续传输发送,中间没有其他消息请求。
- 发出两部分DVM消息的组件必须能够在不需要对消息的第一部分进行响应的情况下发出消息的第二部分。
A15.4.1 DVM消息信号
从从机到主机的侦听请求通道上传输一个DVM请求。 表 A15.17 显示了侦听请求通道的信号。
表 A15.17 侦听请求通道
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
ACVALID | 1 | − | 断言为高表明AC通道上的信号有效。 |
ACREADY | 1 | − | 断言为高表明AC通道可以接受传输。 |
ACADDR | ADDR_WIDTH | − | 用于DVM信息请求的地址。 |
ACVMIDEXT | 4 | − | 扩展以支持DVM消息中的16位VMID。 |
ACTRACE | 1 | − | 侦听请求通道上的跟踪信号。 |
对DVM请求的响应通过从主机到从机的侦听响应通道传输。 表 A15.18 显示了构成窥探响应通道的信号。
表 A15.18 侦听响应通道
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
CRVALID | 1 | − | 断言为高表明CR通道上的信号有效。 |
CRREADY | 1 | − | 断言为高表明CR通道接受一个传输。 |
CRTRACE | 1 | − | 侦听响应通道上的跟踪信号。 |
DVM响应表示请求已被接收,但不表示DVM消息的成功或失败。 AC或CR通道不支持重新排序,因此响应与AC请求发出的顺序相同。
ACTRACE和CRTRACE信号的作用与其他通道上的跟踪信号相同, 详见 A13.3 跟踪信号 。
Note:该规范的早期版本包含一个侦听响应指示器CRRESP,以指示错误响应。 由于使用不广泛,作为简化规范的一部分,现已弃用。
Rules for snoop channels
侦听通道信号的规则与其他通道相似:
- 只有在存在有效的地址和控制信息时,从机才应断言ACVALID。
- 当ACVALID被断言时,必须保持断言状态,直到主机断言ACREADY信号后的上升沿。
- CRVALID被断言以表示主机已确认DVM消息。
- 当CRVALID被断言时,必须保持断言状态,直到从机断言CRREADY信号后的上升沿。
侦听请求和响应通道之间的依赖关系规则列示如下,并在 图 A15.2 中进行了说明。
- 从机在断言ACVALID之前,不应等待主机断言ACREADY。
- 主机可以在断言ACREADY之前等待ACVALID断言。
- 主机可以在ACVALID断言之前断言ACREADY。
- 主机必须在ACVALID和ACREADY都被断言之前等待, 然后才断言CRVALID以表示有效响应可用。
- 主机不能等待从机断言CRREADY后才断言CRVALID。
- 从机可以在CRVALID被断言之前等待断言CRREADY。
- 从机可以在CRVALID被断言之前断言CRREADY。
A15.4.2 DVM消息的地址位宽
属性ADDR_WIDTH用于指定ARADDR、AWADDR和ACADDR的宽度。这将设置接口使用的物理地址宽度。
ACADDR信号也用于传输虚拟地址(VA), 因此所需的VA宽度也对ADDR_WIDTH设置了最小限制。 表 A15.19 显示了一些常见的VA宽度和所需的最小ADDR_WIDTH。
表 A15.19 常见的VA宽度和最小ADDR_WIDTH
VA位宽 | 最小的ADDR_WIDTH |
---|---|
32 | 32 |
41 | 40 |
49 | 44 |
53 | 48 |
57 | 48 |
VA宽度超过57位不被支持。
如果PA宽度超过VA宽度,则虚拟地址操作可能会在DVM消息中接收到额外的地址信息。 在这种情况下任何额外的地址信息必须被忽略并且操作必须仅使用支持的地址位。
如果一个组件支持比其PA宽度更大的VA宽度那么组件必须对额外的物理地址位采取适当的措施。 关于不匹配的地址宽度的更多细节请参见 A4.1.5 传输地址
A15.4.3 消息字段到信号的映射
DVM消息中的字段是使用ACADDR和ACVMIDEXT信号的比特传输的。
不同消息类型有不同的映射,如 表 A15.20 所示。 比特位置分配可能看起来不规则,但用于简化不同地址宽度实现之间的转换。
对于Hint消息,Completion(0b0)和DVMType(0b110)字段分别位于ACADDR[15]和ACADDR[14:12]。 其他映射是实现定义的。TLB Invalidate消息的映射如 表 A15.20 所示。
表 A15.20 TLB失效信息的字段映射
Signal | TLBI 1-part | TLBI 1st of 2-part | TLBI 2nd part by VA | TLBI 2nd part by range | GPT TLBI 1st part | GPT TLBI 2nd part |
---|---|---|---|---|---|---|
ACADDR[51] | 0b0 | 0b0 | 0b0 | 0b0 | 0b0 | PA[51] |
ACADDR[50] | 0b0 | 0b0 | 0b0 | 0b0 | 0b0 | PA[50] |
ACADDR[49] | 0b0 | 0b0 | 0b0 | 0b0 | 0b0 | PA[49] |
ACADDR[48] | 0b0 | 0b0 | 0b0 | 0b0 | 0b0 | PA[48] |
ACADDR[47] | 0b0 | VA[56] | VA[52] | VA[52] | 0b0 | PA[47] |
ACADDR[46] | 0b0 | VA[55] | VA[51] | VA[51] | 0b0 | PA[46] |
ACADDR[45] | 0b0 | VA[54] | VA[50] | VA[50] | 0b0 | PA[45] |
ACADDR[44] | 0b0 | VA[53] | VA[49] | VA[49] | 0b0 | PA[44] |
ACADDR[43] | VMID[15] | VA[48] | VA[44] | VA[44] | 0b0 | PA[43] |
ACADDR[42] | VMID[14] | VA[47] | VA[43] | VA[43] | 0b0 | PA[42] |
ACADDR[41] | VMID[13] | VA[46] | VA[42] | VA[42] | 0b0 | PA[41] |
ACADDR[40] | VMID[12] | VA[45] | VA[41] | VA[41] | 0b0 | PA[40] |
ACADDR[39] | ASID[15] | ASID[15] | VA[39] | VA[39] | 0b0 | PA[39] |
ACADDR[38] | ASID[14] | ASID[14] | VA[38] | VA[38] | 0b0 | PA[38] |
ACADDR[37] | ASID[13] | ASID[13] | VA[37] | VA[37] | 0b0 | PA[37] |
ACADDR[36] | ASID[12] | ASID[12] | VA[36] | VA[36] | 0b0 | PA[36] |
ACADDR[35] | ASID[11] | ASID[11] | VA[35] | VA[35] | 0b0 | PA[35] |
ACADDR[34] | ASID[10] | ASID[10] | VA[34] | VA[34] | 0b0 | PA[34] |
ACADDR[33] | ASID[9] | ASID[9] | VA[33] | VA[33] | 0b0 | PA[33] |
ACADDR[32] | ASID[8] | ASID[8] | VA[32] | VA[32] | 0b0 | PA[32] |
ACADDR[31] | VMID[7] | VMID[7] | VA[31] | VA[31] | 0b0 | PA[31] |
ACADDR[30] | VMID[6] | VMID[6] | VA[30] | VA[30] | 0b0 | PA[30] |
ACADDR[29] | VMID[5] | VMID[5] | VA[29] | VA[29] | 0b0 | PA[29] |
ACADDR[28] | VMID[4] | VMID[4] | VA[28] | VA[28] | 0b0 | PA[28] |
ACADDR[27] | VMID[3] | VMID[3] | VA[27] | VA[27] | 0b0 | PA[27] |
ACADDR[26] | VMID[2] | VMID[2] | VA[26] | VA[26] | 0b0 | PA[26] |
ACADDR[25] | VMID[1] | VMID[1] | VA[25] | VA[25] | 0b0 | PA[25] |
ACADDR[24] | VMID[0] | VMID[0] | VA[24] | VA[24] | 0b0 | PA[24] |
ACADDR[23] | ASID[7] | ASID[7] | VA[23] | VA[23] | 0b0 | PA[23] |
ACADDR[22] | ASID[6] | ASID[6] | VA[22] | VA[22] | 0b0 | PA[22] |
ACADDR[21] | ASID[5] | ASID[5] | VA[21] | VA[21] | 0b0 | PA[21] |
ACADDR[20] | ASID[4] | ASID[4] | VA[20] | VA[20] | 0b0 | PA[20] |
ACADDR[19] | ASID[3] | ASID[3] | VA[19] | VA[19] | 0b0 | PA[19] |
ACADDR[18] | ASID[2] | ASID[2] | VA[18] | VA[18] | 0b0 | PA[18] |
ACADDR[17] | ASID[1] | ASID[1] | VA[17] | VA[17] | 0b0 | PA[17] |
ACADDR[16] | ASID[0] | ASID[0] | VA[16] | VA[16] | 0b0 | PA[16] |
ACADDR[15] | 0b0(Completion) | 0b0(Completion) | VA[15] | VA[15] | 0b0(Completion) | PA[15] |
ACADDR[14] | 0b0(DVMType[2]) | 0b0(DVMType[2]) | VA[14] | VA[14] | 0b0(DVMType[2]) | PA[14] |
ACADDR[13] | 0b0(DVMType[1]) | 0b0(DVMType[1]) | VA[13] | VA[13] | 0b0(DVMType[1]) | PA[13] |
ACADDR[12] | 0b0(DVMType[0]) | 0b0(DVMType[0]) | VA[12] | VA[12] | 0b0(DVMType[0]) | PA[12] |
ACADDR[11] | Exception[1] | Exception[1] | TG[1] | TG[1] | Exception[1] | IS[3] |
ACADDR[10] | Exception[0] | Exception[0] | TG[0] | TG[0] | Exception[0] | IS[2] |
ACADDR[9] | Security[1] | Security[1] | TTL[1] | TTL[1] | Security[1] | IS[1] |
ACADDR[8] | Security[0] | Security[0] | TTL[0] | TTL[0] | Security[0] | IS[0] |
ACADDR[7] | 0b0 (Range) | Range | 0b0 | Scale[1] | Range | 0b0 |
ACADDR[6] | VMIDV | VMIDV | 0b0 | Scale[0] | 0b0(VMIDV) | 0b0 |
ACADDR[5] | ASIDV | ASIDV | 0b0 | Num[4] | 0b0 (ASIDV) | 0b0 |
ACADDR[4] | Leaf | Leaf | 0b0 | Num[3] | Leaf | 0b0 |
ACADDR[3] | Stage[1] | Stage[1] | VA[40] | VA[40] | Stage[1] | 0b0 |
ACADDR[2] | Stage[0] | Stage[0] | 0b0 | Num[2] | Stage[0] | 0b0 |
ACADDR[1] | 0b0 | 0b0 | 0b0 | Num[1] | 0b0 | 0b0 |
ACADDR[0] | 0b0 (Addr) | 0b1 (Addr) | 0b0 | Num[0] | Addr | 0b0 |
ACVMIDEXT[3] | VMID[11] | VMID[11] | VMID[15] | VMID[15] | 0b0 | 0b0 |
ACVMIDEXT[2] | VMID[10] | VMID[10] | VMID[14] | VMID[14] | 0b0 | 0b0 |
ACVMIDEXT[1] | VMID[9] | VMID[9] | VMID[13] | VMID[13] | 0b0 | 0b0 |
ACVMIDEXT[0] | VMID[8] | VMID[8] | VMID[12] | VMID[12] | 0b0 | 0b0 |
分支预测器无效和同步消息的映射如 表 A15.21 所示.
表 A15.21 BPI和Sync消息的字段映射
Signal | BPI all or Sync | BPI by VA 1st part | BPI by VA 2nd part |
---|---|---|---|
ACADDR[51] | 0b0 | 0b0 | 0b0 |
ACADDR[50] | 0b0 | 0b0 | 0b0 |
ACADDR[49] | 0b0 | 0b0 | 0b0 |
ACADDR[48] | 0b0 | 0b0 | 0b0 |
ACADDR[47] | 0b0 | VA[56] | VA[52] |
ACADDR[46] | 0b0 | VA[55] | VA[51] |
ACADDR[45] | 0b0 | VA[54] | VA[50] |
ACADDR[44] | 0b0 | VA[53] | VA[49] |
ACADDR[43] | 0b0 | VA[48] | VA[44] |
ACADDR[42] | 0b0 | VA[47] | VA[43] |
ACADDR[41] | 0b0 | VA[46] | VA[42] |
ACADDR[40] | 0b0 | VA[45] | VA[41] |
ACADDR[39] | 0b0 | 0b0 | VA[39] |
ACADDR[38] | 0b0 | 0b0 | VA[38] |
ACADDR[37] | 0b0 | 0b0 | VA[37] |
ACADDR[36] | 0b0 | 0b0 | VA[36] |
ACADDR[35] | 0b0 | 0b0 | VA[35] |
ACADDR[34] | 0b0 | 0b0 | VA[34] |
ACADDR[33] | 0b0 | 0b0 | VA[33] |
ACADDR[32] | 0b0 | 0b0 | VA[32] |
ACADDR[31] | 0b0 | 0b0 | VA[31] |
ACADDR[30] | 0b0 | 0b0 | VA[30] |
ACADDR[29] | 0b0 | 0b0 | VA[29] |
ACADDR[28] | 0b0 | 0b0 | VA[28] |
ACADDR[27] | 0b0 | 0b0 | VA[27] |
ACADDR[26] | 0b0 | 0b0 | VA[26] |
ACADDR[25] | 0b0 | 0b0 | VA[25] |
ACADDR[24] | 0b0 | 0b0 | VA[24] |
ACADDR[23] | 0b0 | 0b0 | VA[23] |
ACADDR[22] | 0b0 | 0b0 | VA[22] |
ACADDR[21] | 0b0 | 0b0 | VA[21] |
ACADDR[20] | 0b0 | 0b0 | VA[20] |
ACADDR[19] | 0b0 | 0b0 | VA[19] |
ACADDR[18] | 0b0 | 0b0 | VA[18] |
ACADDR[17] | 0b0 | 0b0 | VA[17] |
ACADDR[16] | 0b0 | 0b0 | VA[16] |
ACADDR[15] | Completion | 0b0 (Completion) | VA[15] |
ACADDR[14] | DVMType[2] | 0b0 (DVMType[2]) | VA[14] |
ACADDR[13] | DVMType[1] | 0b0 (DVMType[1]) | VA[13] |
ACADDR[12] | DVMType[0] | 0b1 (DVMType[0]) | VA[12] |
ACADDR[11] | 0b0 (Exception[1]) | 0b0 (Exception[1]) | VA[11] |
ACADDR[10] | 0b0 (Exception[0]) | 0b0 (Exception[0]) | VA[10] |
ACADDR[9] | 0b0 (Security[1]) | 0b0 (Security[1]) | VA[9] |
ACADDR[8] | 0b0 (Security[0]) | 0b0 (Security[0]) | VA[8] |
ACADDR[7] | 0b0 (Range) | 0b0 (Range) | VA[7] |
ACADDR[6] | 0b0 (VMIDV) | 0b0 (VMIDV) | VA[6] |
ACADDR[5] | 0b0 (ASIDV) | 0b0 (ASIDV) | VA[5] |
ACADDR[4] | 0b0 (Leaf) | 0b0 (Leaf) | VA[4] |
ACADDR[3] | 0b0 (Stage[1]) | 0b0 (Stage[1]) | VA[40] |
ACADDR[2] | 0b0 (Stage[0]) | 0b0 (Stage[0]) | 0b0 |
ACADDR[1] | 0b0 | 0b0 | 0b0 |
ACADDR[0] | 0b0 (Addr) | 0b1 (Addr) | 0b0 |
ACVMIDEXT[3] | 0b0 | 0b0 | 0b0 |
ACVMIDEXT[2] | 0b0 | 0b0 | 0b0 |
ACVMIDEXT[1] | 0b0 | 0b0 | 0b0 |
ACVMIDEXT[0] | 0b0 | 0b0 | 0b0 |
指令缓存失效消息的映射见 表 A15.22 。
表 A15.22 |VICI和PICI消息的字段映射
Signal | VICI all | VICI by VA 1st part | VICI by VA 2nd part | PICI 1st part | PICI 2nd part |
---|---|---|---|---|---|
ACADDR[51] | 0b0 | 0b0 | 0b0 | 0b0 | PA[51] |
ACADDR[50] | 0b0 | 0b0 | 0b0 | 0b0 | PA[50] |
ACADDR[49] | 0b0 | 0b0 | 0b0 | 0b0 | PA[49] |
ACADDR[48] | 0b0 | 0b0 | 0b0 | 0b0 | PA[48] |
ACADDR[47] | 0b0 | VA[56] | VA[52] | 0b0 | PA[47] |
ACADDR[46] | 0b0 | VA[55] | VA[51] | 0b0 | PA[46] |
ACADDR[45] | 0b0 | VA[54] | VA[50] | 0b0 | PA[45] |
ACADDR[44] | 0b0 | VA[53] | VA[49] | 0b0 | PA[44] |
ACADDR[43] | VMID[15] | VA[48] | VA[44] | 0b0 | PA[43] |
ACADDR[42] | VMID[14] | VA[47] | VA[43] | 0b0 | PA[42] |
ACADDR[41] | VMID[13] | VA[46] | VA[42] | 0b0 | PA[41] |
ACADDR[40] | VMID[12] | VA[45] | VA[41] | 0b0 | PA[40] |
ACADDR[39] | ASID[15] | ASID[15] | VA[39] | 0b0 | PA[39] |
ACADDR[38] | ASID[14] | ASID[14] | VA[38] | 0b0 | PA[38] |
ACADDR[37] | ASID[13] | ASID[13] | VA[37] | 0b0 | PA[37] |
ACADDR[36] | ASID[12] | ASID[12] | VA[36] | 0b0 | PA[36] |
ACADDR[35] | ASID[11] | ASID[11] | VA[35] | 0b0 | PA[35] |
ACADDR[34] | ASID[10] | ASID[10] | VA[34] | 0b0 | PA[34] |
ACADDR[33] | ASID[9] | ASID[9] | VA[33] | 0b0 | PA[33] |
ACADDR[32] | ASID[8] | ASID[8] | VA[32] | 0b0 | PA[32] |
ACADDR[31] | VMID[7] | VMID[7] | VA[31] | VI[27] | PA[31] |
ACADDR[30] | VMID[6] | VMID[6] | VA[30] | VI[26] | PA[30] |
ACADDR[29] | VMID[5] | VMID[5] | VA[29] | VI[25] | PA[29] |
ACADDR[28] | VMID[4] | VMID[4] | VA[28] | VI[24] | PA[28] |
ACADDR[27] | VMID[3] | VMID[3] | VA[27] | VI[23] | PA[27] |
ACADDR[26] | VMID[2] | VMID[2] | VA[26] | VI[22] | PA[26] |
ACADDR[25] | VMID[1] | VMID[1] | VA[25] | VI[21] | PA[25] |
ACADDR[24] | VMID[0] | VMID[0] | VA[24] | VI[20] | PA[24] |
ACADDR[23] | ASID[7] | ASID[7] | VA[23] | VI[19] | PA[23] |
ACADDR[22] | ASID[6] | ASID[6] | VA[22] | VI[18] | PA[22] |
ACADDR[21] | ASID[5] | ASID[5] | VA[21] | VI[17] | PA[21] |
ACADDR[20] | ASID[4] | ASID[4] | VA[20] | VI[16] | PA[20] |
ACADDR[19] | ASID[3] | ASID[3] | VA[19] | VI[15] | PA[19] |
ACADDR[18] | ASID[2] | ASID[2] | VA[18] | VI[14] | PA[18] |
ACADDR[17] | ASID[1] | ASID[1] | VA[17] | VI[13] | PA[17] |
ACADDR[16] | ASID[0] | ASID[0] | VA[16] | VI[12] | PA[16] |
ACADDR[15] | 0b0(Completion) | 0b0(Completion) | VA[15] | 0b0(Completion) | PA[15] |
ACADDR[14] | 0b0(DVMType[2]) | 0b0(DVMType[2]) | VA[14] | 0b0(DVMType[2]) | PA[14] |
ACADDR[13] | 0b1(DVMType[1]) | 0b1(DVMType[1]) | VA[13] | 0b1(DVMType[1]) | PA[13] |
ACADDR[12] | 0b1(DVMType[0]) | 0b1(DVMType[0]) | VA[12] | 0b0(DVMType[0]) | PA[12] |
ACADDR[11] | Exception[1] | Exception[1] | VA[11] | 0b0(Exception[1]) | PA[11] |
ACADDR[10] | Exception[0] | Exception[0] | VA[10] | 0b0(Exception[0]) | PA[10] |
ACADDR[9] | Security[1] | Security[1] | VA[9] | Security[1] | PA[9] |
ACADDR[8] | Security[0] | Security[0] | VA[8] | Security[0] | PA[8] |
ACADDR[7] | 0b0 (Range) | 0b0 (Range) | VA[7] | 0b0 (Range) | PA[7] |
ACADDR[6] | VMIDV | VMIDV | VA[6] | VIV[1] | PA[6] |
ACADDR[5] | ASIDV | ASIDV | VA[5] | VIV[0] | PA[5] |
ACADDR[4] | 0b0 (Leaf) | 0b0 (Leaf) | VA[4] | 0b0 | PA[4] |
ACADDR[3] | 0b0 (Stage[1]) | 0b0 (Stage[1]) | VA[40] | 0b0 | 0b0 |
ACADDR[2] | 0b0 (Stage[0]) | 0b0 (Stage[0]) | 0b0 | 0b0 | 0b0 |
ACADDR[1] | 0b0 | 0b0 | 0b0 | 0b0 | 0b0 |
ACADDR[0] | 0b0 (Addr) | 0b1 (Addr) | 0b0 | Addr | 0b0 |
ACVMIDEXT[3] | VMID[11] | VMID[11] | VMID[15] | 0b0 | 0b0 |
ACVMIDEXT[2] | VMID[10] | VMID[10] | VMID[14] | 0b0 | 0b0 |
ACVMIDEXT[1] | VMID[9] | VMID[9] | VMID[13] | 0b0 | 0b0 |
ACVMIDEXT[0] | VMID[8] | VMID[8] | VMID[12] | 0b0 | 0b0 |
A15.5 DVM同步与完成
DVM同步消息在请求者需要知道所有先前的无效操作何时完成时使用。
在组件接收到DVM同步消息并且所有之前的无效操作完成后,会发送DVM完成请求。 判定操作何时完成的规则如下:
- TLB无效
- 当主机不能再使用无效的转换且所有可能使用无效转换的先前事务都完成时,标记为完成。
- 分支预测器无效
- 当预测指令获取的缓存副本已被无效并且相关主机不能再访问时,标记为完成。无效的缓存副本可能来自任何虚拟地址或指定虚拟地址。
- 指令缓存无效
- 当缓存指令已被无效并且相关主机不能再访问时,标记为完成。
图 A15.3 展示了互连和一个接收主机之间的同步流程。
此过程为:
- 主机使用侦听响应(CR)通道确认收到DVM同步消息。此响应不能依赖于AR或AW通道上任何事务的前向进展。
- 主机必须在完成所有必要操作后,通过AR通道发出DVM完成请求。这必须在同一主机的侦听请求通道上完成关联的DVM同步握手之后进行。 即使主机持续接收到更多的DVM无效操作和更多的DVM同步消息,也必须及时发送DVM完成。
- 互连组件通过发出DVM完成的组件的读取数据(R)通道响应DVM完成请求。此响应中的读取数据无效。
一个DVM完成请求在AR通道上被发出,表 A15.23 展示了在其他AR通道信号存在时的限制条件。
表 A15.23 DVM 完成请求约束
Signal | Constraint |
---|---|
ARSNOOP | Must be 0b1110. |
ARADDR | Must be zero. |
ARID | 必须与读取通道上任何未完成的非 DVM 事务不同。 |
ARBURST | Must be INCR (0b01). |
ARLEN | Must be 1 transfer (0x00). |
ARSIZE | Must be equal to the data channel width. |
ARDOMAIN | Must be Shareable (0b01 or 0b10). |
ARCACHE | Must be Modifiable, Non-cacheable (0b0010). |
ARCHUNKEN | Must be 0b0. |
ARMMUVALID | Must be 0b0. |
ARMMUATST | Must be 0b0. |
ARMMUFLOW | Must be 0b00. |
ARTAGOP | Must be 0b00. |
ARLOCK | Must be 0b0. |
A15.6 一致性连接信号
DVM消息请求从从机传输到主机,这是与其他请求相反的方向。 空闲的主机可能会关闭电源,无法接受任何DVM请求。
可以使用一致性连接信号使主机控制是否接收DVM消息请求。
Coherency_Connection_Signals属性用于指示组件是否支持一致性连接信号。
表 A15.24 Coherency_Connection_Signals属性
Coherency_Connection_Signals | 默认 | 描述 |
---|---|---|
True | 支持一致性连接信号。 | |
False | Y | 不支持一致性连接信号。 |
当Coherency_Connection_Signals为真时,以下信号包括在接口上。
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
SYSCOREQ | 1 | − | 主机输出。 断言为高电平以请求在AC通道上接收DVM消息。 |
SYSCOACK | 1 | − | 从机输出。 断言为高电平以确认所附主机可能会在AC通道上接收DVM消息。 |
一致性连接信号没有默认值,因此连接的接口必须同时支持或不支持连贯连接信号。
一致性连接信号使用四相方案可以安全地跨越时钟域。
在进入无法处理DVM请求的低功耗状态之前通常会断开DVM消息。
A15.6.1 一致性连接握手
SYSCOREQ和SYSCOACK在ARESETn被断言时必须解除断言。 当不处于复位状态时,允许以下请求
- 主机通过将SYSCOREQ设为高电平请求接收DVM消息。互连通过将SYSCOACK设为高电平表示DVM消息已启用。
- 主机通过将SYSCOREQ设为低电平请求停止接收DVM消息。互连通过将SYSCOACK设为低电平表示DVM消息已禁用。
握手时序显示在 图 A15.4 。
连接信号遵循四相握手规则:
- 主机只能在SYSCOACK处于同一水平时更改SYSCOREQ。ack不变可以更改req。
- 从机只能在SYSCOREQ处于相反水平时更改SYSCOACK。req改变才能更改ack。
各状态下主机和从机的规则如 表 A15.26 。
状态 | SYSCOREQ | SYSCOACK | 规则 |
---|---|---|---|
Disable | 0 | 0 | 主机:- 不得获取和使用DVM管理的转换表数据来执行翻译。- 如果需要执行DVM管理的转换,则断言SYSCOREQ。从机:- 不得发出任何DVM消息请求。 - 不得发出任何DVM同步请求,这些假定立即完成。 |
Connect | 1 | 0 | 主机:- 不得获取和使用DVM管理的转换表数据进行转换。- 必须能够接收和响应DVM消息请求。- 在使用DVM管理的转换之前等待SYSCOACK被断言。从机:- 启用DVM消息到附加主机时断言SYSCOACK。 |
Enable | 1 | 1 | 主机:- 可以获取和使用DVM管理的转换表数据。- 必须能够接收和响应DVM消息请求。- 如果在使用DVM管理的转换表数据后希望进入低功耗状态,则取消SYSCOREQ。在此之前,任何使用先前获取数据的事务必须完成。从机: - 可以向附属的主机发送DVM消息。 |
Disconnect | 0 | 1 | 主机:- 不得获取或使用任何 DVM 管理的转换表数据。- 必须能够接收和响应 DVM 消息请求。- 在禁用 DVM 管理的逻辑之前等待 SYSCOACK 被解除断言。从机:- 必须等待所有未完成的 DVM 消息接收到响应后才能解除断言 SYSCOACK。- 不得发出任何新的 DVM 消息,- 如果第一部分已经发布,必须发布两部分 DVM 消息的第二部分。 |
如果互连发送了一条需要在AR通道上接收DVM完成消息的DVM同步消息,那么在接收到DVM完成请求之前互连被允许解除断言SYSCOACK。
即使DVM消息被禁用,主机也可以在AR通道上发送DVM完成请求。
一致性连接信号的转换可能依赖于AWAKEUP被断言,详情请参见 A16.2.1 AWAKEUP和一致性信号 。
A第16章 唤醒信号
本章介绍了AXI协议的唤醒信号。 内容包括以下部分:
A16.1 关于唤醒信号
唤醒信号是一个可选功能,可以用来指示与接口相关的活动。
表 A16.1 唤醒信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
AWAKEUP | 1 | - | 主机输出。 断言为高电平以指示在读写请求通道上可能有活动。 |
ACWAKEUP | 1 | - | 从机输出。 断言为高电平以指示在侦听请求通道上可能有活动。 |
信号可以路由到时钟控制器或类似组件,为连接的组件启用电源和时钟。
唤醒信号是同步的,并且必须适合在不同时钟域中异步采样。这要求唤醒信号无毛刺,这可以通过例如直接从寄存器生成或者从无毛刺的OR树生成来实现。
唤醒信号必须被断言以保证可以接受事务,但是一旦事务在进行中,唤醒信号的断言或解除断言是实现定义的。
建议但不要求当不需要进一步的事务时取消唤醒信号的断言。
Wakeup_Signals 属性用于指示组件是否包括唤醒信号。
表 A16.2 Wakeup_Signals属性
Wakeup_Signals | 默认 | 描述 |
---|---|---|
True | AWAKEUP 存在,如果AC通道存在,则 ACWAKEUP 也存在。 | |
False | Y | 没有唤醒信号存在。 |
A16.2 AWAKEUP信号规则和建议
AWAKEUP是一个来自主机的输出信号,在事务开始时被断言,表示有事务需要处理。 它有以下规则:
- 建议在断言ARVALID、AWVALID或WVALID之前至少一个周期断言AWAKEUP,以防止事务请求的接受被延迟。
- 允许在ARVALID、AWVALID或WVALID断言之前或之后的任何时间点断言AWAKEUP。
- 允许从机等待AWAKEUP被断言后再断言ARREADY、AWREADY或WREADY。
- 如果AWAKEUP在AWVALID断言且AWREADY未断言的周期内被断言,则AWAKEUP必须保持断言状态直到AWREADY被断言。
- 如果AWAKEUP在ARVALID断言且ARREADY未断言的周期内被断言,则AWAKEUP必须保持断言状态直到ARREADY被断言。
- 在ARVALID和ARREADY握手之后,或者在AWVALID和AWREADY握手之后,互连必须保持活跃状态直到事务完成。
- 在没有事务发生的情况下,允许断言AWAKEUP然后取消断言,但不推荐这样做。
AWAKEUP的断言与WVALID无关。但是,对于可以在AWVALID之前断言WVALID的组件, 至少在WVALID之前一个周期断言AWAKEUP可以防止接受一个新的事务被延迟。
如果从机有AWAKEUP输入但连接的主机没有AWAKEUP输出,则可以:
- 将AWAKEUP拉高,但这可能会阻止从机接口使用低功率状态。
- 从AxVALID和SYSCOREQ/ACK派生AWAKEUP。此方法使从机能够使用低功率状态,但在启用时钟时可能会引入延迟。
A16.2.1 awakeup信号和一致性连接信号
如果唤醒和一致性连接信号同时出现在接口上,有一些额外的考虑事项:
- 需要断言AWAKEUP信号以保证一致性连接信号的转换进程。
- 允许在SYSCOREQ断言之前或之后的任何时间断言AWAKEUP。 然而需要断言来保证SYSCOACK对应的断言。当AWAKEUP断言、SYSCOREQ断言, 而SYSCOACK未断言时,AWAKEUP必须保持断言直到SYSCOACK断言。
- 允许在SYSCOREQ解除断言之前或之后的任何时间断言AWAKEUP。 然而需要断言来保证SYSCOACK对应的解除断言。当AWAKEUP断言、SYSCOREQ解除断言, 而SYSCOACK断言时,AWAKEUP必须保持断言直到SYSCOACK解除断言。
参见 A15.6 一致性连接信号 以获取更多详细信息
A16.3 acwakeup信号规则和建议
ACWAKEUP是来自从机的输出信号,通常在互连上,并在DVM消息事务开始时被断言以指示有事务需要处理。 它有以下规则:
- 建议在ACVALID断言前至少一个周期断言ACWAKEUP,以防止延迟接受DVM请求。
- ACWAKEUP必须保持断言状态直到相关的ACVALID / ACREADY握手,以确保DVM事务的进展。
- 在ACVALID / ACREADY握手之后,主机必须保持活动状态直到DVM事务完成。
- 允许在ACVALID断言之前或之后的任何时候断言ACWAKEUP。
- 允许但不建议在没有断言ACVALID的情况下断言然后取消断言ACWAKEUP。
A第17章 接口和数据保护
本章规定了使用中毒和奇偶信号保护数据和接口的方案. 它包含以下部分:
A17.1 使用中毒进行数据保护
毒信号用于表明一组数据字节之前已被损坏。 传递毒信号与数据一起可以通知将来使用数据的任何人数据可能已损坏。
毒信号在每64位数据中以1位的颗粒度支持。
表 A17.1 毒信号
信号名 | 位宽 | 默认 | 描述 |
---|---|---|---|
WPOSION RPOSION | ceiling(DATA_WIDTH/64) | − | 断言为高,表明此次传输中的数据已损坏。 每64 bit数据有一bit毒信号。 |
配置Poison信号的存在使用Poison属性。
表 A17.2 Poison属性
Poison | 默认 | 描述 |
---|---|---|
True | 支持毒信号。 | |
False | Y | 不支持毒信号。 |
毒信号的有效性与相关数据的有效性相同。
毒信号与错误响应信号无关:
- 允许在没有毒违反的情况下发出错误信号。
- 允许发出毒违反信号而不发出错误响应信号。
64位粒度被定义为对齐到8字节边界的8字节地址范围。
当事务大小(由AxSIZE指示)小于64位时,允许毒位在每次数据传输上不同。 在这种情况下接收组件必须检查所有数据传输以确定64位粒度是否中毒。
毒位可以为传输中无效的数据通道设置。例如,在128位通道上的64位传输可以同时设置两个毒位。
关于毒与MTE标签的影响,见 A13.2.10 MTE和中毒
A17.2 对数据和接口信号使用校验保护
用于安全关键应用,必须检测并可能纠正片上系统(SoC)中个别导线上瞬态和功能错误。
系统组件中的错误可能会传播,并在连接的组件中引发多个错误。 错误检测和纠正(EDC)需要端到端操作,覆盖从源头到目的地的所有逻辑和导线。
实现端到端保护的一种方法是在组件中采用定制的EDC方案,并在组件之间实现简单的错误检测方案。 在这些组件之间没有逻辑,单比特错误不会传播成多比特错误。
本节描述了在组件之间的AMBA接口上检测单比特错误的奇偶校验方案。 如果多比特错误发生在不同的奇偶校验信号组中,可以被检测到。
图 A17.1 显示了可以在AMBA中使用奇偶校验的位置。
A17.2.1 校验保护的配置
接口上使用的保护方案由属性Check_Type定义。
表 A17.3 Check_Type属性
Check_Type | 默认 | 描述 |
---|---|---|
Odd_Parity_Byte_All | 所有信号均包括奇偶校验。每个奇偶校验信号一般覆盖多达8位。 然而如果配置需要。奇偶校验位可以覆盖超过8位。 | |
Odd_Parity_Byte_Data | 数据信号的奇数校验包括在名称以DATA结尾的数据信号中。 每个位的校验信号覆盖正好8个位。 | |
False | Y | 没有校验检查信号。 |
A17.2.2 错误检测行为
此规范对检测到奇偶校验错误时组件或系统的行为没有规定.
根据系统和受影响的信号,翻转的位可能具有广泛的影响, 它可能是无害的,造成性能问题,数据损坏,安全违规或死锁。
事务响应与奇偶校验错误检测无关。
当检测到错误时,接收方可以执行以下任何操作
- 终止或传递事务。终止可能符合或不符合协议。
- 更正奇偶校验信号或传递错误信号。
- 更新其内存或保持不变。该位置可能被标记为有毒。
- 通过其他方式发出错误响应,例如通过中断。
A17.2.3 校验检查信号
奇偶校验信号列在 表 A17.4 中。它们具有以下属性和规则:
使用奇校验。奇校验意味着校验信号被添加到接口上的信号组中并驱动,使该组中的高电平位数总是奇数。
覆盖数据和有效负载的奇偶校验信号被定义为在大多数情况下,每组不超过 8 位。此限制假设在生成每个位校验时,可用的最大逻辑级数为 3。
覆盖关键控制信号的奇偶校验信号,因为这些信号可能有较小的时间预算可用,被定义为单个奇校验位。 此单个奇校验位是原始关键控制信号的反转。
对于宽于 1 位的校验信号:
- 当校验信号覆盖多个信号时,按 表 A17.4 中列出的顺序级联信号计算奇偶校验,第一个信号列在 LSB。
- 校验位 [n] 对应有效载荷中的位 [(8n+7):8n],以下情况例外: x WTAGCHK[n] 是 {WTAGUPDATE[n], WTAG[4n+3:4n]} 的奇偶校验。 x RTAGCHK[n] 是 RTAG[4n+3:4n] 的奇偶校验。
- 如果有效负载不是整数字节,则校验信号的最高有效位覆盖的位数少于有效负载的最高有效部分中的 8 位。
校验信号与 ACLK 同步并且必须在校验使能列中的信号为高时每个周期正确驱动, 见 表 A17.4 。
无论这些位在传输中是否被主动使用,校验信号必须适当驱动与关联有效负载的所有位。 例如,当 WVALID 被断言时,即使某些字节通道未被使用, WDATACHK的所有位也必须被正确驱动。
如果接口上没有校验信号所覆盖的任何信号,则校验信号将从接口中省略。
以下规则适用于覆盖多个信号的 CHK 信号,其中一个或多个输入或输出丢失:
- 如果有一个丢失的信号输出,则假定该信号值为其默认值。
- 如果有一个没有对应输入的输出信号,则无法假定缺失输入取固定值。因此,CHK 信号不能可靠使用。
- 建议作为 CHK 组一部分的输入信号,或者全部存在或者全部不存在。
表 A17.4 校验检查信号
检查信号 | 覆盖信号 | 位宽 | 检查使能 |
---|---|---|---|
AWVALIDCHK | AWVALID | 1 | ARESETn |
AWREADYCHK | AWREADY | 1 | ARESETn |
AWIDCHK | AWID AWIDUNQ | ceil((ID_W_WIDTH + int(Unique_ID_Support))/8) | AWVALID |
AWADDRCHK | AWADDR | ceil(ADDR_WIDTH/8) | AWVALID |
AWLENCHK | AWLEN | 1 | AWVALID |
AWCTLCHK0 | AWSIZE AWBURST AWLOCK AWPROT AWNSE | 1 | AWVALID |
AWCTLCHK1 | AWREGION AWCACHE AWQOS | 1 | AWVALID |
AWCTLCHK2 | AWDOMAIN AWSNOOP | 1 | AWVALID |
AWCTLCHK3 | AWATOP AWCMO AWTAGOP | 1 | AWVALID |
AWUSERCHK | AWUSER | ceil(USER_REQ_WIDTH/8) | AWVALID |
AWSTASHNIDCHK | AWSTASHNID AWSTASHNIDEN | 1 | AWVALID |
AWSTASHLPIDCHK | AWSTASHLPID AWSTASHLPIDEN | 1 | AWVALID |
AWTRACECHK | AWTRACE | 1 | AWVALID |
AWLOOPCHK | AWLOOP | ceil(LOOP_W_WIDTH/8) | AWVALID |
AWMMUCHK | AWMMUATST AWMMUFLOW AWMMUSECSID AWMMUSSIDV AWMMUVALID | 1 | AWVALID |
AWMMUSIDCHK | AWMMUSID | ceil(SID_WIDTH/8) | AWVALID |
AWMMUSSIDCHK | AWMMUSSID | ceil(SSID_WIDTH/8) | AWVALID |
AWPBHACHK | AWPBHA | 1 | AWVALID |
AWNSAIDCHK | AWNSAID | 1 | AWVALID |
AWMPAMCHK | AWMPAM | 1 | AWVALID |
AWSUBSYSIDCHK | AWSUBSYSID | 1 | AWVALID |
AWMECIDCHK | AWMECID | ceil(MECID_WIDTH/8) | AWVALID |
WVALIDCHK | WVALID | 1 | ARESETn |
WREADYCHK | WREADY | 1 | ARESETn |
WDATACHK | WDATA | DATA_WIDTH/8 | WVALID |
WSTRBCHK | WSTRB | ceil(DATA_WIDTH/64) | WVALID |
WTAGCHK | WTAG WTAGUPDATE | ceil(DATA_WIDTH/128) | WVALID |
WLASTCHK | WLAST | 1 | WVALID |
WUSERCHK | WUSER | ceil(USER_DATA_WIDTH/8) | WVALID |
WPOISONCHK | WPOISON | ceil(DATA_WIDTH/512) | WVALID |
WTRACECHK | WTRACE | 1 | WVALID |
BVALIDCHK | BVALID | 1 | ARESETn |
BREADYCHK | BREADY | 1 | ARESETn |
BIDCHK | BID BIDUNQ | ceil((ID_W_WIDTH + int(Unique_ID_Support))/8) | BVALID |
BRESPCHK | BRESP BCOMP BPERSIST BTAGMATCH BBUSY | 1 | BVALID |
BUSERCHK | BUSER | ceil(USER_RESP_WIDTH/8) | BVALID |
BTRACECHK | BTRACE | 1 | BVALID |
BLOOPCHK | BLOOP | ceil(LOOP_W_WIDTH/8) | BVALID |
ARVALIDCHK | ARVALID | 1 | ARESETn |
ARREADYCHK | ARREADY | 1 | ARESETn |
ARIDCHK | ARID ARIDUNQ | ceil((ID_R_WIDTH + int(Unique_ID_Support))/8) | ARVALID |
ARADDRCHK | ARADDR | ceil(ADDR_WIDTH/8) | ARVALID |
ARLENCHK | ARLEN | 1 | ARVALID |
ARCTLCHK0 | ARSIZE ARBURST ARLOCK ARPROT ARNSE | 1 | ARVALID |
ARCTLCHK1 | ARREGION ARCACHE ARQOS | 1 | ARVALID |
ARCTLCHK2 | ARDOMAIN ARSNOOP | 1 | ARVALID |
ARCTLCHK3 | ARCHUNKEN ARTAGOP | 1 | ARVALID |
ARUSERCHK | ARUSER | ceil(USER_REQ_WIDTH/8) | ARVALID |
ARTRACECHK | ARTRACE | 1 | ARVALID |
ARLOOPCHK | ARLOOP | ceil(LOOP_R_WIDTH/8) | ARVALID |
ARMMUCHK | ARMMUATST ARMMUFLOW ARMMUSECSID ARMMUSSIDV ARMMUVALID | 1 | ARVALID |
ARMMUSIDCHK | ARMMUSID | ceil(SID_WIDTH/8) | ARVALID |
ARMMUSSIDCHK | ARMMUSSID | ceil(SSID_WIDTH/8) | ARVALID |
ARNSAIDCHK | ARNSAID | 1 | ARVALID |
ARMPAMCHK | ARMPAM | 1 | ARVALID |
ARPBHACHK | ARPBHA | 1 | ARVALID |
ARSUBSYSIDCHK | ARSUBSYSID | 1 | ARVALID |
ARMECIDCHK | ARMECID | ceil(MECID_WIDTH/8) | ARVALID |
RVALIDCHK | RVALID | 1 | ARESETn |
RREADYCHK | RREADY | 1 | ARESETn |
RIDCHK | RID RIDUNQ | ceil((ID_R_WIDTH + int(Unique_ID_Support))/8) | RVALID |
RDATACHK | RDATA | DATA_WIDTH/8 | RVALID |
RTAGCHK | RTAG | ceil(DATA_WIDTH/128) | RVALID |
RRESPCHK | RRESP RBUSY | 1 | RVALID |
RLASTCHK | RLAST | 1 | RVALID |
RCHUNKCHK | RCHUNKV RCHUNKNUM RCHUNKSTRB | 1 | RVALID |
RUSERCHK | RUSER | ceil((USER_DATA_WIDTH + USER_RESP_WIDTH)/8) | RVALID |
RPOISONCHK | RPOISON | ceil(DATA_WIDTH/512) | RVALID |
RTRACECHK | RTRACE | 1 | RVALID |
RLOOPCHK | RLOOP | ceil(LOOP_R_WIDTH/8) | RVALID |
ACVALIDCHK | ACVALID | 1 | ARESETn |
ACREADYCHK | ACREADY | 1 | ARESETn |
ACADDRCHK | ACADDR | ceil(ADDR_WIDTH/8) | ACVALID |
ACVMIDEXTCHK | ACVMIDEXT | 1 | ACVALID |
ACTRACECHK | ACTRACE | 1 | ACVALID |
CRVALIDCHK | CRVALID | 1 | ARESETn |
CRREADYCHK | CRREADY | 1 | ARESETn |
CRTRACECHK | CRTRACE | 1 | CRVALID |
VAWQOSACCEPTCHK | VAWQOSACCEPT | 1 | ARESETn |
VARQOSACCEPTCHK | VARQOSACCEPT | 1 | ARESETn |
AWAKEUPCHK | AWAKEUP | 1 | ARESETn |
ACWAKEUPCHK | ACWAKEUP | 1 | ARESETn |
SYSCOREQCHK | SYSCOREQ | 1 | None |
SYSCOACKCHK | SYSCOACK | 1 | None |
Part B 附录
B第1章 接口类
该文档中的规格部分基于属性描述了一个通用的全功能协议,其中一些特性是强制性的,另一些是可选的。 之前的规范版本为不同的使用案例定义了许多接口类。现在可以通过约束某些属性来描述这些接口类,以限制该接口上的功能和信号。
本章描述了以下接口类:
还有信号和属性表,每个接口类都有对应的列:
Note:ACE、ACE5、AXI3、AXI4 和 AXI4-Lite 接口类未在本规范中描述。有关这些接口的更多信息,请参见 A[1] .
B1.1 接口类清单
一个例子表明了不同接口类可能使用的地方,如 图 B1.1 所示。
Note:AXI5接口可以配置以满足所有用例。
B1.1.1 AXI5
AXI5接口类是一个没有属性约束的通用接口。 与本规范的H版相比,现在允许为AXI5接口启用以下属性:
- Shareable_Transactions
- CMO_On_Read
- CMO_On_Write
- Write_Plus_CMO
- WriteZero_Transaction
- Prefetch_Transaction
- Cache_Stash_Transactions
- DVM_Message_Support (Receiver only)
- DVM_v8, DVM_v8.1, DVM_v8.4, DVM_v9.2
- Coherency_Connection_Signals
- DeAllocation_Transactions
- Persist_CMO
B1.1.2 ACE5-Lite
如果AXI接口包含任何需要AxSNOOP信号的功能,之前是需要一个ACE5-Lite接口的。 根据这个版本的规范,建议在新设计中使用AXI5接口,因为它现在支持所有功能。
B1.1.3 ACE5-LiteDVM
如果需要发送或接收DVM消息,之前是需要一个ACE5-LiteDVM接口的。 在这个版本的规范中,推荐使用AXI5接口进行新设计,因为它现在支持所有功能。
ACE5-LiteDVM接口的最常见用例是系统MMU接收AC通道上的失效消息。 在AR通道上发出DVM消息主要由全互联CPU完成,因此不在本规范范围内。
Note:本规范中ACE5-LiteDVM的定义与Issue H A[1] 相比有一些差异。
在本规范中,不支持侦听数据传输和双向DVM消息 。 因此,早期版本中在ACE5-LiteDVM接口上描述的以下信号不再需要:
- ACSNOOP,所有AC通道上的请求可假定为DVM消息。
- ACPROT,不需要用于DVM消息。
- CRRESP,不需要用于DVM消息。
B1.1.4 ACE5-LiteACP
ACE5-LiteACP是ACE5-Lite的一个子集,旨在将加速器组件与处理器集群紧密耦合。 该接口针对一致性缓存行访问进行了优化,并且比ACE5-Lite接口复杂性更低。
为了减少复杂性,ACE5-LiteACP适用以下约束条件。
- 数据宽度必须是128b (DATA_WIDTH = 128)。
- 大小必须是128b (SIZE_Present = False)。
- 长度必须是1或4次传输。
- 突发模式必须是INCR(BURST_Present = False)。
- 存储类型必须是回写类型,即AxCACHE[1:0]是0b11且AxCACHE[3:2]不是0b00。
- 如 表 B1.4 所述,不允许某些其他可选功能.
B1.1.5 AXI5-Lite
AXI5Lite是AXI5的一个子集,其中所有事务只有一次数据传输。 它适用于当数据传输突发不利时与基于寄存器的组件和简单内存的通信。
使用AXI5Lite的关键功能是:
- 所有事务的突发长度为1。
- 支持的操作码是WriteNoSnoop和ReadNoSnoop。
- 当请求具有不同ID时允许响应重排序。
- 所有访问都被视为设备非缓存。
- 不支持独占访问。
B1.2 信号清单
在 表 B1.2 中,有一个列出了所有信号及其代码的清单,这些代码描述了每个接口类的存在要求。 存在列描述了用于指定信号存在的属性条件。
所使用代码的列表显示在 表 B1.1 。
表 B1.1 信号表的key
Code | Manager interfaces | Subordinate interfaces |
---|---|---|
Y | Mandatory | Mandatory |
YM | Mandatory | Optional |
YS | Optional | Mandatory |
O | Optional | Optional |
NS | Optional | Not present |
N | Not present | Not present |
表 B1.2 每个接口类的信号存在表
Signal | Presence | AXI5 | ACE5-Lite | ACE5-LiteDVM | ACE5-LiteACP | AXI5-Lite |
---|---|---|---|---|---|---|
ACLK | - | Y | Y | Y | Y | Y |
ARESETn | - | Y | Y | Y | Y | Y |
AWVALID | - | Y | Y | Y | Y | Y |
AWREADY | - | Y | Y | Y | Y | Y |
AWID | ID_W_WIDTH > 0 | YS | YS | YS | YS | YS |
AWADDR | - | Y | Y | Y | Y | Y |
AWREGION | REGION_Present | O | O | O | N | N |
AWLEN | LEN_Present | YS | YS | YS | YS | N |
AWSIZE | SIZE_Present | YS | YS | YS | N | O |
AWBURST | BURST_Present | YS | YS | YS | N | N |
AWLOCK | Exclusive_Accesses | O | O | O | N | N |
AWCACHE | CACHE_Present | O | O | O | O | N |
AWPROT | PROT_Present | YM | YM | YM | YM | YM |
AWNSE | RME_Support | O | O | O | N | N |
AWQOS | QOS_Present | O | O | O | N | N |
AWUSER | USER_REQ_WIDTH > 0 | O | O | O | O | O |
AWDOMAIN | Shareable_Transactions | O | Y | Y | Y | N |
AWSNOOP | AWSNOOP_WIDTH > 0 | O | YS | YS | YS | N |
AWSTASHNID | STASHNID_Present | O | O | O | O | N |
AWSTASHNIDEN | STASHNID_Present | O | O | O | O | N |
AWSTASHLPID | STASHLPID_Present | O | O | O | O | N |
AWSTASHLPIDEN | STASHLPID_Present | O | O | O | O | N |
AWTRACE | Trace_Signals | O | O | O | O | O |
AWLOOP | Loopback_Signals | O | O | O | N | N |
AWMMUVALID | Untranslated_Transactions == v3 | O | O | N | N | N |
AWMMUSECSID | SECSID_WIDTH > 0 | O | O | N | N | N |
AWMMUSID | SID_WIDTH > 0 | O | O | N | N | N |
AWMMUSSIDV | SSID_WIDTH > 0 | O | O | N | N | N |
AWMMUSSID | SSID_WIDTH > 0 | O | O | N | N | N |
AWMMUATST | MMUFLOW_Present and ((Untranslated_Transactions == v1) or (Untranslated_Transactions == True)) | O | O | N | N | N |
AWMMUFLOW | MMUFLOW_Present and ((Untranslated_Transactions == v2) or (Untranslated_Transactions == v3)) | O | O | N | N | N |
AWPBHA | PBHA_Support | O | O | O | N | N |
AWMECID | MEC_Support | O | O | O | N | N |
AWNSAID | NSAccess_Identifiers | O | O | O | N | N |
AWSUBSYSID | SUBSYSID_WIDTH > 0 | O | O | O | N | O |
AWATOP | Atomic_Transactions | O | O | O | N | N |
AWMPAM | MPAM_Support != False | O | O | O | O | N |
AWIDUNQ | Unique_ID_Support | O | O | O | O | O |
AWCMO | CMO_On_Write | O | O | O | N | N |
AWTAGOP | MTE_Support != False | O | O | O | N | N |
WVALID | - | Y | Y | Y | Y | Y |
WREADY | - | Y | Y | Y | Y | Y |
WDATA | - | Y | Y | Y | Y | Y |
WSTRB | WSTRB_Present | YS | YS | YS | YS | YS |
WTAG | MTE_Support != False | O | O | O | N | N |
WTAGUPDATE | MTE_Support != False | O | O | O | N | N |
WLAST | WLAST_Present | YM | YM | YM | YM | N |
WUSER | USER_DATA_WIDTH > 0 | O | O | O | O | O |
WPOISON | Poison | O | O | O | O | O |
WTRACE | Trace_Signals | O | O | O | O | O |
BVALID | - | Y | Y | Y | Y | Y |
BREADY | - | Y | Y | Y | Y | Y |
BID | ID_W_WIDTH > 0 | YS | YS | YS | YS | YS |
BIDUNQ | Unique_ID_Support | O | O | O | O | O |
BRESP | BRESP_WIDTH > 0 | O | O | O | O | O |
BCOMP | (Persist_CMO and CMO_On_Write) or MTE_Support == Standard | O | O | O | N | N |
BPERSIST | Persist_CMO and CMO_On_Write | O | O | O | N | N |
BTAGMATCH | MTE_Support == Standard | O | O | N | N | N |
BUSER | USER_RESP_WIDTH > 0 | O | O | O | O | O |
BTRACE | Trace_Signals | O | O | O | O | O |
BLOOP | Loopback_Signals | O | O | O | N | N |
BBUSY | Busy_Support | O | O | O | N | N |
ARVALID | - | Y | Y | Y | Y | Y |
ARREADY | - | Y | Y | Y | Y | Y |
ARID | ID_R_WIDTH > 0 | YS | YS | YS | YS | YS |
ARADDR | - | Y | Y | Y | Y | Y |
ARREGION | REGION_Present | O | O | O | N | N |
ARLEN | LEN_Present | YS | YS | YS | YS | N |
ARSIZE | SIZE_Present | YS | YS | YS | N O | |
ARBURST | BURST_Present | YS | YS | YS | N | N |
ARLOCK | Exclusive_Accesses | O | O | O | N | N |
ARCACHE | CACHE_Present | O | O | O | O | N |
ARPROT | PROT_Present | YM | YM | YM | YM | YM |
ARNSE | RME_Support | O | O | O | N | N |
ARQOS | QOS_Present | O | O | O | N | N |
ARUSER | USER_REQ_WIDTH > 0 | O | O | O | O | O |
ARDOMAIN | Shareable_Transactions | O | Y | Y | Y | N |
ARSNOOP | ARSNOOP_WIDTH > 0 | O | YS | YS | O | N |
ARTRACE | Trace_Signals | O | O | O | O | O |
ARLOOP | Loopback_Signals | O | O | O | N | N |
ARMMUVALID | Untranslated_Transactions == v3 | O | O | N | N | N |
ARMMUSECSID | SECSID_WIDTH > 0 | O | O | N | N | N |
ARMMUSID | SID_WIDTH > 0 | O | O | N | N | N |
ARMMUSSIDV | SSID_WIDTH > 0 | O | O | N | N | N |
ARMMUSSID | SSID_WIDTH > 0 | O | O | N | N | N |
ARMMUATST | MMUFLOW_Present and ((Untranslated_Transactions == v1) or (Untranslated_Transactions == True)) | O | O | N | N | N |
ARMMUFLOW | MMUFLOW_Present and ((Untranslated_Transactions == v2) or (Untranslated_Transactions == v3)) | O | O | N | N | N |
ARPBHA | PBHA_Support | O | O | O | N | N |
ARMECID | MEC_Support | O | O | O | N | N |
ARNSAID | NSAccess_Identifiers | O | O | O | N | N |
ARSUBSYSID | SUBSYSID_WIDTH > 0 | O | O | O | N | O |
ARMPAM | MPAM_Support != False | O | O | O | O | N |
ARCHUNKEN | Read_Data_Chunking | O | O | O | O | N |
ARIDUNQ | Unique_ID_Support | O | O | O | O | O |
ARTAGOP | MTE_Support != False | O | O | O | N | N |
RVALID | - | Y | Y | Y | Y | Y |
RREADY | - | Y | Y | Y | Y | Y |
RID | ID_R_WIDTH > 0 | YS | YS | YS | YS | YS |
RIDUNQ | Unique_ID_Support | O | O | O | O | O |
RDATA | - | Y | Y | Y | Y | Y |
RTAG | MTE_Support != False | O | O | O | N | N |
RRESP | RRESP_WIDTH > 0 | O | O | O | O | O |
RLAST | RLAST_Present | YS | YS | YS | YS | N |
RUSER | USER_DATA_WIDTH > 0 or USER_RESP_WIDTH > 0 | O | O | O | O | O |
RPOISON | Poison | O | O | O | O | O |
RTRACE | Trace_Signals | O | O | O | O | O |
RLOOP | Loopback_Signals | O | O | O | N | N |
RCHUNKV | Read_Data_Chunking | O | O | O | O | N |
RCHUNKNUM | RCHUNKNUM_WIDTH > 0 | O | O | O | O | N |
RCHUNKSTRB | RCHUNKSTRB_WIDTH > 0 | O | O | O | O | N |
RBUSY | Busy_Support | O | O | O | N | N |
ACVALID | DVM_Message_Support | O | N | Y | N | N |
ACREADY | DVM_Message_Support | O | N | Y | N | N |
ACADDR | DVM_Message_Support | O | N | Y | N | N |
ACVMIDEXT | DVM_Message_Support and (DVM_v8.1 or DVM_v8.4 or DVM_v9.2) | O | N | O | N | N |
ACTRACE | DVM_Message_Support and Trace_Signals | O | N | O | N | N |
CRVALID | DVM_Message_Support | O | N | Y | N | N |
CRREADY | DVM_Message_Support | O | N | Y | N | N |
CRTRACE | DVM_Message_Support and Trace_Signals | O | N | O | N | N |
AWAKEUP | Wakeup_Signals | O | O | O | O | O |
ACWAKEUP | Wakeup_Signals and DVM_Message_Support | O | N | O | N | N |
VARQOSACCEPT | QoS_Accept | O | O | O | N | N |
VAWQOSACCEPT | QoS_Accept | O | O | O | N | N |
SYSCOREQ | Coherency_Connection_Signals | O | N | O | N | N |
SYSCOACK | Coherency_Connection_Signals | O | N | O | N | N |
BROADCASTATOMIC | - | NS | NS | NS | N | N |
BROADCASTSHAREABLE | - | NS | NS | NS | NS | N |
BROADCASTCACHEMAINT | - | NS | NS | NS | N | N |
BROADCASTCMOPOPA | - | NS | NS | NS | N | N |
BROADCASTPERSIST | - | NS | NS | NS | N | N |
B1.3 校验检查信号清单
每种接口类型的奇偶校验信号如 表 B1.3 所示, 使用 表 B1.1 中定义的代码。奇偶校验信号在 A17.2.3 校验检查信号 中描述。
表 B1.3 每个接口类对应的交叉信号存在
Signal | AXI5 | ACE5-Lite | ACE5-LiteDVM | ACE5-LiteACP | AXI5-Lite |
---|---|---|---|---|---|
AWVALIDCHK | O | O | O | O | O |
AWREADYCHK | O | O | O | O | O |
AWIDCHK | O | O | O | O | O |
AWADDRCHK | O | O | O | O | O |
AWLENCHK | O | O | O | O | N |
AWCTLCHK0 | O | O | O | O | O |
AWCTLCHK1 | O | O | O | O | N |
AWCTLCHK2 | O | O | O | O | N |
AWCTLCHK3 | O | O | O | N | N |
AWUSERCHK | O | O | O | O | O |
AWSTASHNIDCHK | O | O | O | O | N |
AWSTASHLPIDCHK | O | O | O | O | N |
AWTRACECHK | O | O | O | O | O |
AWLOOPCHK | O | O | O | N | N |
AWMMUCHK | O | O | N | N | N |
AWMMUSIDCHK | O | O | N | N | N |
AWMMUSSIDCHK | O | O | N | N | N |
AWPBHACHK | O | O | O | N | N |
AWNSAIDCHK | O | O | O | N | N |
AWMPAMCHK | O | O | O | O | N |
AWSUBSYSIDCHK | O | O | O | N | O |
AWMECIDCHK | O | O | O | N | N |
WVALIDCHK | O | O | O | O | O |
WREADYCHK | O | O | O | O | O |
WDATACHK | O | O | O | O | O |
WSTRBCHK | O | O | O | O | O |
WTAGCHK | O | O | O | N | N |
WLASTCHK | O | O | O | O | N |
WUSERCHK | O | O | O | O | O |
WPOISONCHK | O | O | O | O | O |
WTRACECHK | O | O | O | O | O |
BVALIDCHK | O | O | O | O | O |
BREADYCHK | O | O | O | O | O |
BIDCHK | O | O | O | O | O |
BRESPCHK | O | O | O | O | O |
BUSERCHK | O | O | O | O | O |
BTRACECHK | O | O | O | O | O |
BLOOPCHK | O | O | O | N | N |
ARVALIDCHK | O | O | O | O | O |
ARREADYCHK | O | O | O | O | O |
ARIDCHK | O | O | O | O | O |
ARADDRCHK | O | O | O | O | O |
ARLENCHK | O | O | O | O | N |
ARCTLCHK0 | O | O | O | O | O |
ARCTLCHK1 | O | O | O | O | N |
ARCTLCHK2 | O | O | O | O | N |
ARCTLCHK3 | O | O | O | O | N |
ARUSERCHK | O | O | O | O | O |
ARTRACECHK | O | O | O | O | O |
ARLOOPCHK | O | O | O | N | N |
ARMMUCHK | O | O | N | N | N |
ARMMUSIDCHK | O | O | N | N | N |
ARMMUSSIDCHK | O | O | N | N | N |
ARNSAIDCHK | O | O | O | N | N |
ARMPAMCHK | O | O | O | O | N |
ARPBHACHK | O | O | O | N | N |
ARSUBSYSIDCHK | O | O | O | N | O |
ARMECIDCHK | O | O | O | N | N |
RVALIDCHK | O | O | O | O | O |
RREADYCHK | O | O | O | O | O |
RIDCHK | O | O | O | O | O |
RDATACHK | O | O | O | O | O |
RTAGCHK | O | O | O | N | N |
RRESPCHK | O | O | O | O | O |
RLASTCHK | O | O | O | O | N |
RCHUNKCHK | O | O | O | O | N |
RUSERCHK | O | O | O | O | O |
RPOISONCHK | O | O | O | O | O |
RTRACECHK | O | O | O | O | O |
RLOOPCHK | O | O | O | N | N |
ACVALIDCHK | O | N | O | N | N |
ACREADYCHK | O | N | O | N | N |
ACADDRCHK | O | N | O | N | N |
ACVMIDEXTCHK | O | N | O | N | N |
ACTRACECHK | O | N | O | N | N |
CRVALIDCHK | O | N | O | N | N |
CRREADYCHK | O | N | O | N | N |
CRTRACECHK | O | N | O | N | N |
VAWQOSACCEPTCHK | O | O | O | N | N |
VARQOSACCEPTCHK | O | O | O | N | N |
AWAKEUPCHK | O | O | O | O | O |
ACWAKEUPCHK | O | N | O | N | N |
SYSCOREQCHK | O | N | O | N | N |
SYSCOACKCHK | O | N | O | N | N |
B1.4 属性清单
所有属性的列表显示在 表 B1.4 中。
该表格显示了引入该属性的文档版本以及该属性的所有合法值。
每个接口类都有一列显示了该接口类的该属性的合法值。
破折号表示该属性值没有约束。
Note:对于用户信号和用户Loop信号,最大宽度值是建议而不是规则。 有关更多信息,请参见 A13.5 用户定义信号 和 A13.4 用户Loop信号 。
表 B1.4 接口属性约束
Property | Issue | Values | AXI5 | ACE5-Lite | ACE5-LiteDVM | ACE5-LiteACP | AXI5-Lite |
---|---|---|---|---|---|---|---|
ADDR_WIDTH | H | 1…64 | - | - | - | - | - |
ARSNOOP_WIDTH | J | 0, 4 | - | - | - | - | 0 |
Atomic_Transactions | F | True,False | - | - | - | False | False |
AWCMO_WIDTH | J | 0, 2, 3 | - | - | - | 0 | 0 |
AWSNOOP_WIDTH | J | 0, 4, 5 | - | - | - | - | 0 |
BRESP_WIDTH | J | 0, 2, 3 | - | - | - | - | - |
BURST_Present | J | True,False | - | - | - | False | False |
Busy_Support | J | True,False | - | - | - | False | False |
Cache_Line_Size | K | 16, 32, 64, 128, 256, 512, 1024, 2048 | - | - | - | 128 | - |
CACHE_Present | J | True,False | - | - | - | - | False |
Cache_Stash_Transactions | F | True, Basic,False | - | - | - | - | False |
Check_Type | F | Odd_Parity_Byte_All, Odd_Parity_Byte_Data,False | - | - | - | - | - |
CMO_On_Read | G | True,False | - | - | - | False | False |
CMO_On_Write | G | True,False | - | - | - | False | False |
Coherency_Connection_Signals | F | True,False | - | False | - | False | False |
Consistent_DECERR | H | True,False | - | - | - | - | True |
DATA_WIDTH | H | 8, 16, 32, 64, 128, 256, 512, 1024, 2048 | - | - | - | 128 | - |
DeAllocation_Transactions | F | True,False | - | - | - | False | False |
Device_Normal_Independence | K | True,False | - | - | - | - | - |
DVM_Message_Support | H | Receiver,False | - | False | Receiver | False | False |
DVM_v8 | E | True,False | - | False | - | False | False |
DVM_v8.1 | F | True,False | - | False | - | False | False |
DVM_v8.4 | H | True,False | - | False | - | False | False |
DVM_v9.2 | J | True,False | - | False | - | False | False |
Exclusive_Accesses | H | True,False | - | - | - | False | False |
Fixed_Burst_Disable | K | True,False | - | - | - | False | False |
ID_R_WIDTH | H | 0…32 | - | - | - | - | - |
ID_W_WIDTH | H | 0…32 | - | - | - | - | - |
InvalidateHint_Transaction | J | True,False | - | - | - | False | False |
LEN_Present | J | True,False | - | - | - | - | False |
LOOP_R_WIDTH | H | 0..8 | - | - | - | 0 | 0 |
LOOP_W_WIDTH | H | 0..8 | - | - | - | 0 | 0 |
Loopback_Signals | F | True,False | - | - | - | False | False |
Max_Transaction_Bytes | H | 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 | - | - | - | - | - |
MMUFLOW_Present | J | True,False | - | - | False | False | False |
MEC_Support | K | True,False | - | - | - | False | False |
MECID_WIDTH | K | 0..16 | - | - | - | 0 | 0 |
MPAM_Support | K | MPAM_9_1, MPAM_12_1,False | - | - | - | - | False |
MPAM_WIDTH | K | 0, 11, 12, 14, 15 | - | - | - | 0 | 0 |
MTE_Support | K | Standard, Simplified, Basic,False | - | - | Basic,False | False | False |
Multi_Copy_Atomicity | E | True,False | - | - | - | - | - |
NSAccess_Identifiers | F | True,False | - | - | - | False | False |
Ordered_Write_Observation | E | True,False | - | - | - | - | - |
PBHA_Support | J | True,False | - | - | - | False | False |
PROT_Present | J | True,False | - | - | - | - | - |
Persist_CMO | F | True,False | - | - | - | False | False |
Poison | F | True,False | - | - | - | - | - |
Prefetch_Transaction | H | True,False | - | - | - | False | False |
QoS_Accept | F | True,False | - | - | - | False | False |
QOS_Present | J | True,False | - | - | - | False | False |
RCHUNKNUM_WIDTH | J | 0, 1, 5, 6, 7, 8 | - | - | - | - | 0 |
RCHUNKSTRB_WIDTH | J | 0, 1, 2, 4, 8 | - | - | - | - | 0 |
Read_Data_Chunking | G | True,False | - | - | - | - | False |
Read_Interleaving_Disabled | G | True,False | - | - | - | - | False |
REGION_Present | J | True,False | - | - | - | False | False |
Regular_Transactions_Only | H | True,False | - | - | - | False | False |
RLAST_Present | J | True,False | - | - | - | - | False |
RME_Support | J | True,False | - | - | - | False | False |
RRESP_WIDTH | J | 0, 2, 3 | - | - | - | - | - |
SECSID_WIDTH | J | 0, 1, 2 | - | - | 0 | 0 | 0 |
Shareable_Cache_Support | J | True,False | - | - | False | False | False |
Shareable_Transactions | H | True,False | - | True | True | True | False |
SID_WIDTH | H | 0…32 | - | - | 0 | 0 | 0 |
SIZE_Present | J | True,False | - | - | - | False | - |
SSID_WIDTH | H | 0..20 | - | - | 0 | 0 | 0 |
STASHLPID_Present | J | True,False | - | - | - | - | False |
STASHNID_Present | J | True,False | - | - | - | - | False |
SUBSYSID_WIDTH | J | 0…8 | - | - | - | 0 | - |
Trace_Signals | F | True,False | - | - | - | - | - |
Unique_ID_Support | G | True,False | - | - | - | - | - |
UnstashTranslation_Transaction | J | True,False | - | - | False | False | False |
Untranslated_Transactions | F | v3, v2, v1, True,False | - | - | False | False | False |
USER_DATA_WIDTH | H | 0…DATA_WIDTH/2 | - | - | - | - | - |
USER_REQ_WIDTH | H | 0…128 | - | - | - | - | - |
USER_RESP_WIDTH | H | 0…16 | - | - | - | - | - |
WLAST_Present | J | True,False | - | - | - | - | False |
WSTRB_Present | J | True,False | - | - | - | - | - |
Wakeup_Signals | F | True,False | - | - | - | - | - |
Write_Plus_CMO | H | True,False | - | - | - | False | False |
WriteDeferrable_Transaction | J | True,False | - | - | - | False | False |
WriteZero_Transaction | H | True,False | - | - | - | False | False |
WriteNoSnoopFull_Transaction | K | True,False | - | - | - | False | False |
B第2章 ID约束清单
此文档规定了以下有关ID使用的限制:
- 在事务处理中必须使用唯一的ID:
- 原子事务
- 预取事务
- WriteZero事务
- WriteDeferrable事务
- InvalidateHint事务
- 启用了数据分块的读事务
- 传输MTE标签的事务
- UnstashTranslation事务
- 在事务处理中不得使用相同的ID:
- DVM完成和非DVM完成事务
- StashOnce和非StashOnce事务
- StashTranslation和非StashTranslation事务
- 必须使用相同的ID:
- 需要排序的多个未完成请求
- 独占访问对中的事务
B第3章 版本
本附录描述了本规范各个发行版本之间的技术变更。 它包含以下章节:
B3.1 H.c和J的区别
详见IHI0022K_amba_axi_protocol_spec.pdf B3.1节。
B3.2 J和K的区别
详见IHI0022K_amba_axi_protocol_spec.pdf B3.2节。
Part C 术语表
C第1章 术语表
对齐 - Aligned存储在按2的最高次幂除以其字节大小可被整除的地址上的数据项。 因此,对齐的半字、字和双字分别具有可被2、4和8整除的地址。 对齐访问是指访问的地址与每个元素的大小对齐的情况。
几乎同时 - At approximately the same time如果一个远程观察者无法确定两个事件的发生顺序,它们就被认为几乎同时发生。
障碍 - Barrier一种强迫其他操作按定义顺序执行的操作。
大端内存 - Big-endian memory意味着数据的最高有效字节(MSB)存储在最低地址的内存位置。
阻塞 - Blocking描述一种阻止后续操作继续进行,直到操作完成的操作。
分支预测 - Branch prediction是处理器选择未来执行路径进行预取的过程。 例如,在分支指令之后,处理器可以选择预测性地预取分支后的指令或分支目标处的指令。
字节 - Byte一个8位数据项。
缓存 - Cache缓存管理器中的任何缓存、缓冲区或其他存储结构,可以保存特定地址位置的数据值副本。
缓存命中 - Cache hit由于所访问的数据已经在缓存中,可以高速处理的内存访问。
缓存行 - Cache line缓存中的基本存储单元。其大小总是2的幂。缓存行必须对齐到缓存行的大小。
缓存未命中 - Cache miss由于所访问的数据不在缓存中,无法高速处理的内存访问。
向上取整 - ceil()一个返回不小于输入值的最小整数值的函数。
一致 - Coherent一组观察者对某个内存位置的数据访问是一致的, 是指该组观察者对该内存位置的访问与所有观察者对该内存位置的所有写入操作存在单一全局顺序一致。
组件 - Component至少具有一个AMBA接口的独立功能单元。组件可以作为主机、从机、外设和互连组件的总称。
已弃用 - Deprecated为向后兼容性在规范中存在的东西。尽可能应避免使用已弃用特性。这些特性可能在未来版本的规范中不存在。
下游 - DownstreamAXI事务在一个主机和一个或多个从机之间进行,并可以通过一个或多个中间组件。 在给定事务的任何中间组件,“下游"是指该组件与目标从机之间的部分,并包括目标从机。 “下游"和"上游"相对于整个事务定义,而不是相对于事务内的单个数据流。
下游缓存 - Downstream cache从发起主机的角度定义的下游缓存。对于一个主机,下游缓存是它使用基本AXI事务通道访问的缓存。发起主机可以在下游缓存中分配缓存行。
字节序 - Endianness系统内存映射的一个方面。
完全一致性 - Full coherency一个完全一致的主机可以与其他主机共享数据,并在其本地缓存中分配这些数据;它可以侦听并被侦听。
I/O一致性 - I/O coherency一个I/O一致的主机可以与其他主机共享数据,但不能在其本地缓存中分配这些数据;它可以侦听,但不能被侦听。
实现定义 - IMPLEMENTATION DEFINED意味着该行为不是由本规范定义的,但必须由各个实现进行定义和记录。
及时 - in a timely manner协议不能定义某件事必须发生的绝对时间。然而,在一个足够空闲的系统中,它将进展并完成,而不需要任何显性的操作。
发起主机 - Initiating Manager发起事务以启动一系列事件的主机。 当描述一系列事务时,“发起主机"这一术语将启动事件序列的主机与由于发起主机的行为而被访问的任何侦听主机区分开来。 发起主机是一个时间定义,适用于特定时间点,通常用于描述事件序列。 一个主机可以是一个事件序列的发起主机,而在另一个事件序列中是侦听主机。
互连组件 - Interconnect component具有多个AMBA接口的组件,将一个或多个主机连接到一个或多个从机。互连组件可以用于将以下各组合并在一起:
- 一组主机,使其显示为单个主机接口。
- 一组从机,使其显示为单个从机接口。
小端内存 - Little-endian memory意味着数据的最低有效字节(LSB)存储在最低地址的内存位置。
加载 - Load主机读取特定地址位置值的动作。 对于处理器,加载是执行特定指令的结果。加载是否导致主机发起读事务取决于访问的缓存行是否保存在本地缓存中。
本地缓存 - Local cache从发起主机角度定义的本地缓存。 内部缓存是主机内部的缓存。对本地缓存的任何访问均在主机内部执行。
主内存 - Main memory当不存在该位置的缓存副本时,此内存为保存地址位置数据值的内存。 对于任何位置,主存与该位置的缓存副本相比可能是过时的,但当不存在缓存副本时,主存会更新为最新的数据值。 在上下文明确的情况下,主存可以简称为内存。
主机 - Manager发起事务的代理。
主机组件 - Manager component发起事务的组件。单个组件可以同时作为主机组件和从机组件。 例如,当直接内存访问(DMA)组件发起事务移动数据时,它是主机组件, 而当其被编程时,它是从机组件。
内存加密上下文(MEC) - Memory Encryption Contexts (MEC)内存加密上下文是与内存区域相关联的加密配置,由MMU分配。 MEC是Arm领域管理扩展(RME)的扩展。RME系统架构要求领域、可信和根物理地址空间(PAS)被加密。 每个PAS使用的加密密钥或加密上下文在该PAS内是全局的。 例如,对于领域PAS,所有领域内存使用相同的加密上下文。 使用MEC这一概念得到扩展,特别是对于领域PAS,每个领域允许具有唯一的加密上下文。 这为RME已提供的隔离增加了额外的深入防御。MECID是与不同内存加密上下文相关联的ID。
内存管理单元(MMU) - Memory Management Unit (MMU)提供内存系统部分的详细控制,该部分提供地址转换。 大部分控制是使用保存在内存中的转换表进行的,这些表定义了物理内存映射中不同区域的属性。
内存从机组件 - Memory Subordinate component具有以下属性的内存从机组件或内存从机:
- 从内存从机读取一个字节返回最后写入到该字节位置的值。
- 写入一个字节位置更新该位置的值,以便后续读取获得新的值。
- 多次读取一个位置不会对任何其他字节位置产生副作用。
- 读取或写入一个字节位置不会对任何其他字节位置产生副作用。
观察者 - Observer处理器或其他主机组件,例如外围设备,可以生成从内存进行的读取或写入。
基于页的硬件属性(PBHA) - Page-based Hardware Attributes (PBHA)基于页的硬件属性(PBHA)是一种可选的实现定义特性。 它允许软件在转换表中设置最多4位,这些位然后随事务传播通过内存系统,并可以用于控制系统组件。 这些位的含义特定于系统设计。
对等缓存 - Peer cache从发起主机的角度定义的同行缓存。 对于该主机,对等缓存是使用侦听通道访问的缓存。 发起主机不能在对等缓存中分配缓存行。
外围从机组件 - Peripheral Subordinate component外围从机组件也称为外围从机。 外围从机通常具有在组件数据表中描述的实现定义的访问方法。 未定义为允许的任何访问可能导致外围从从机失效,但必须按协议正确完成以防止系统死锁。 在本规范的描述中,外围从机与外围、外围组件、外围设备和设备是同义词。
串行点 - Point of Serialization(Pos)串行化点。所有到给定地址的事务必须通过的点,并确定事务处理的顺序。
预取 - Prefetching预取是指从内存系统预测性地获取指令或数据。 特别是,指令预取是指在先行指令尚未完成执行的情况下,从内存中获取指令。 预取指令并不意味着指令必须执行。在本规范中,除非上下文明确表明,否则指令或数据获取都适用于预取。
读为零,写忽略 - RAZ/WI, Read-As-Zero, Writes Ignored硬件必须实现为读为零,写入时忽略。软件可以依赖该字段读取为全0,并且写入被忽略。 这种描述可以适用于读取为0的单个位,也可以适用于读取为全0的字段。
领域管理扩展(RME) - Realm Management Extensions (RME)领域管理扩展(RME)是Arm v9 A-profile架构的扩展。 RME是Arm机密计算架构(Arm CCA)的一个组件。 与Arm CCA的其他组件一起,RME支持在Arm PE上运行的动态、可验证和可信执行环境(领域)。 RME添加了两个额外的安全状态(Root和Realm)和两个物理地址空间(Root和Realm), 并提供基于硬件的隔离,允许执行上下文在不同的安全状态下运行并共享系统资源。
侦听过滤器 - Snoop filter能够精确追踪可能在主机中分配的缓存行的精确侦听过滤器。
被侦听的缓存 - Snooped cache一个硬件一致性的缓存,位于一个被侦听的主机上。 也就是说,它是一个接收侦听事务的硬件一致性缓存。 当描述的事件序列仅涉及缓存而不涉及任何关联主机行为或事件时,术语被侦听的缓存优于被侦听的主机被使用。
被侦听的主机 - Snooped Manager一个接收侦听事务的缓存主机。被侦听的主机是一个时间定义,适用于特定时间点,通常用于描述事件序列。 一个主机可能是某个事件序列的被侦听主机,而在另一个事件序列中是发起主机。
投机读取 - Speculative read一个事务,当主机可能不需要执行该事务,因为它已经在本地缓存中有了被访问的缓存行副本。 通常,主机在本地缓存查找并行中发起一个投机读取。这比先查找本地缓存,然后仅在未发现所需缓存行时发起读事务的延迟更低。
存储 - Store主机组件在特定地址位置更改保存的值的动作。 对于处理器,存储是执行特定指令的结果。 存储是否导致主机发起读或写事务取决于访问的缓存行是否保存在本地缓存中,如果在本地缓存中,则取决于其状态。
从机 - Subordinate接收并响应请求的代理。
从机组件 - Subordinate component接收事务并响应的组件。 单个组件可以同时作为从机组件和主机组件。 例如,当直接内存访问(DMA)组件被编程时,它是从机组件,而当其发起事务移动数据时,它是主机组件。
系统内存管理单元(SMMU) - System Memory Management Unit (SMMU)系统级MMU,即提供从一个地址空间到另一个地址空间的地址转换的系统组件。SMMU提供以下的一种或多种:
- 虚拟地址(VA)到物理地址(PA)转换。
- VA到中间物理地址(IPA)转换。
- IPA到PA转换。使用领域管理扩展(RME)时,SMMU还可以执行粒度保护检查。
事务 TransactionAXI主机发起AXI事务以与AXI从机通信。 通常,事务需要在主机和从机之间通过多个通道交换信息。所需的信息交换完整集合形成AXI事务。
转换后备缓冲区(TLB) - Translation Lookaside Buffer (TLB)一个包含转换表查找结果的内存结构。TLB有助于减少内存访问的平均成本。
转换表查找 - Translation table存储在内存中,定义从1KB到各种大小的内存区域属性的表。
转换表查找 - Translation table walk执行完整转换表查找的过程。
未对齐 - Unaligned未对齐访问是指访问的地址与其元素大小不对齐的访问。
未对齐内存访问 - Unaligned memory accesses是指未对齐或可能未对齐半字、字或双字的内存访问。
不可预测 - UNPREDICTABLE在 AMBA AXI 架构中,表示行为不可靠。 不可预测行为不得被记录或宣传为具有确定的效果。
上游 - UpstreamAXI 事务在主机和一个或多个从机之间进行操作,并且可以通过一个或多个中间组件。 在任何中间组件处,对于给定的事务,上游表示该组件与发起主机之间的部分,并包括发起主机。 下游和上游是相对于整个事务定义的,而不是相对于事务中各个数据流定义的。
回写缓存 - Write-Back cache一种缓存,当在存储访问中发生缓存命中时,数据仅写入缓存。 因此,缓存中的数据可能比主内存中的数据更新。当缓存行被清除或重新分配时,任何此类数据都会写回主内存。 回写缓存的另一个常用术语是写回缓存。
直写缓存 - Write-Through cache一种缓存,当在存储访问中发生缓存命中时,数据同时写入缓存和主内存。 这通常通过写缓冲区来完成,以避免降低处理器的速度。