上篇文章主要介绍了 AMBA以及AXI协议的基本内容,本文接续前文,继续介绍AXI协议的 原子访问、传输行为和事务顺序等。
AXI 总线协议学习笔记(2)https://blog.csdn.net/qq_43045275/article/details/128824643
原子访问是对存储区域的一系列访问的术语。当管理器希望对特定内存区域执行一系列访问时,使用原子访问,同时确保该区域中的原始数据不会被其他管理器的写入损坏。该序列通常是读取、修改和写入序列。
有两种类型的原子访问:
•锁定当管理者执行带有锁定访问的事务序列时,访问
从任何其他管理器到同一下属都被拒绝。
•独占当管理者成功执行具有独占访问的事务序列时,其他管理者可以访问下级,但不能访问正在访问的内存区域。
锁定的事务只能用于旧设备。AXI4不支持锁定事务,但AXI3实现必须支持锁定事务。
在管理器可以启动锁定的事务序列之前,必须确保没有其他事务等待完成。
设置了AxLOCK信号的事务表示锁定的事务。锁定的事务序列迫使互连拒绝任何其他管理器对下级的访问。
锁定序列必须始终以未设置AxLOCK信号的最终事务完成。最后一个事务仍包含在锁定序列中,但有效地移除了锁定,以允许其他管理者访问下级事务。
由于锁定访问需要互连来防止在锁定序列进行时发生任何其他事务,因此它们对互连性能有重要影响。
下图显示了使用两个管理器M0和M1的AXI锁定访问操作示例:
在管理员可以启动一个锁定的事务序列之前,管理员必须确保没有其他事务等待完成。
当M0使用事务的锁定信号来指示它是锁定的事务时,互连使用仲裁器来确保只有M0可以访问目标下属。互连阻止来自M1的任何访问,直到来自M0的未锁定事务完成。
下图显示了锁定访问如何处理一系列事务:
本示例中的步骤如下:
1.管理器M0启动读取、修改和写入序列。第一个事务READ断言了LOCK信号,表示它启动了一个锁定的事务。
2.互连锁定任何其他事务。从这一点起,管理者M1无权访问下属。
3.序列中的最后一个事务WRITE没有断言LOCK信号。此事务指示锁定序列的结束。互连解除了锁定,其他管理者现在可以访问下属。
在AXI 4中,独占访问比锁定访问更有效地执行原子操作。这是因为独占访问更加有效地使用互连带宽。
在独占访问序列中,其他管理器可以同时访问下级,但只有一个管理器可以访问相同的内存范围。
用于独占访问的机制可以提供信号量类型的操作,而不需要总线在操作期间保持专用于特定管理器。这意味着总线访问延迟和最大可实现带宽不受影响。
独占访问可以由多个数据传输组成,但所有事务必须具有相同的地址通道属性。
下级需要硬件独占访问监视器来记录独占序列的事务信息,以便它知道正在访问的存储器范围和执行访问的管理器的身份。
如果在独占序列完成之前没有其他管理器访问受监视的范围,则访问是原子的。
下属对其他管理者的访问开放,从而提高了系统带宽利用的整体公平性。
独占访问的基本机制由您必须实现的独占访问监视器控制。
下图显示了管理器M0从地址执行独占读取的示例:
独占访问监视器硬件的响应如下:
•EXOKAY:读取值,事务ID存储在专用访问监视器硬件中。
•OK:值已读取,但不支持独占访问,管理器应将此响应视为独占操作的错误。
稍后,如果在独占读取期间接收到EXOKAY,M0尝试通过对同一地址执行独占写入来完成独占序列。独占写入使用与独占读取相同的事务ID。
独占访问监视器硬件的响应如下:
•EXOKAY:自独占读取访问以来,没有其他管理器写入该位置,因此写入成功。在这种情况下,独占写入会更新内存。
•OK(正常):另一个管理器(例如M1)自独占读取访问后已写入该位置,因此写入失败。在这种情况下,不会更新内存位置。
一些下属需要额外的逻辑来支持独占访问。独占访问监视硬件只监视每个事务ID的一个地址。应该实现它,以便它可以监视可以看到的每个可能的独占ID。
本节描述了两个成功的独占访问序列的示例,这两个序列都通过了。
下图显示了一个包含一个管理器及其AXI管理器接口和一个下属的系统:
从属接口包括独占访问监控硬件,该硬件可以保存为每个事务访问的ID和地址。
下表描述了示例序列中的不同事务。表中的所有事务都是独占访问:
上表所示的事务顺序如下:
1.第一个事务是管理器,它从地址0xA000执行ID为0的读独占事务。独占访问监控硬件将此事务的ID和地址保存在其表中,而从属设备则用读取的数据0x1进行响应。由于该从属服务器正确支持独占访问,因此独占访问监视硬件将以EXOKAY响应进行响应。
2.接下来,管理器从地址0xB000执行ID为1的新的读独占事务。同样,独占访问监控硬件将这个新事务的详细信息保存在表中,并且下级用读取的数据0x2进行响应。由于该从属设备正确支持独占访问,独占访问监视硬件再次以EXOKAY响应进行响应。此时,在我们的示例中,有两个单独的互斥序列正在进行。
3.管理器完成其操作后,执行ID为0的写独占事务,地址为0xA000。独占访问监控硬件检查表中此事务的详细信息,并且由于ID为0、地址为0xA000的现有记录,因此使用EXOKAY响应响应管理器。这意味着没有其他管理器访问过这个存储位置,并且下级用它接收到的新值来更新它,
在该示例中为0x3。独占访问监视硬件从其表中删除该事务的ID和地址,因为该地址位置的独占访问序列现在已完成。
4.最后,管理器执行一个ID为1的新的写独占事务,地址为0xB000。独占访问监控硬件在其表中检查此事务的详细信息。看到ID为1、地址为0xB000的现有记录,它再次以EXOKAY响应响应管理器。这意味着没有其他管理器访问过这个内存位置,并且下属使用接收到的新值更新它,在我们的示例中,新值为0x4。同样,独占访问监视硬件从其表中删除该事务的ID和地址,因为该地址位置的独占访问序列现在已完成。
本节描述了两个独占访问序列的示例,其中第一个成功,第二个失败。
下图显示了一个包含一个管理器及其AXI管理器接口和一个下属的系统:
从属接口包括独占访问监控硬件,该硬件可以保存为每个事务访问的ID和地址。
下表描述了示例序列中的不同事务。表中的所有事务都是独占访问:
上表所示的事务顺序如下:
1.第一个事务是管理器从地址0xA000执行ID为0的读独占事务。独占访问监控硬件将此事务的ID和地址保存在其表中,而从属设备则用读取的数据0x1进行响应。由于该从属服务器正确支持独占访问,因此独占访问监视硬件将以EXOKAY响应进行响应。
2.稍后,管理器从与第一个事务相同的地址0xA000执行ID为1的新的读独占事务。独占访问监控硬件将此新事务的详细信息保存在表中,而从属事务则以读取的数据0x1进行响应。同样,由于该从属设备正确支持独占访问,因此独占访问监视硬件以EXOKAY响应进行响应。此时,在我们的示例中,我们对同一内存位置有两个不同的正在进行的互斥序列。
3.管理器完成其操作后,执行ID为0的独占写入事务,地址为0xA000。独占访问监控硬件在其表中检查此事务的详细信息,并看到ID为0、地址为0xA000的记录,以EXOKAY响应管理器。这意味着没有其他管理器更新过这个内存位置,下属可以使用接收到的新值来更新它,在我们的示例中是0x3。由于地址位置0xA000的内容已被修改,独占访问监视硬件从其表中删除与该位置地址匹配的所有条目。
4.最后,管理器再次向地址0xA000执行ID为1的新的写独占事务。独占访问监控硬件在其表中检查此事务的详细信息。未找到任何地址为0xA000的记录,它将以OKAY响应进行响应。OKAY(正常)响应意味着已经在更新数据的该存储器位置上执行了先前的写入操作。在这种情况下,下属无法使用新值0x4更新内存位置。这种情况是独占访问失败。在这种情况下,管理器必须重新启动完全独占访问序列,从独占读取开始,然后再次独占写入。
此示例演示了独占访问如何实现非阻塞行为。与LOCK访问相比,正是这种行为提供了更大的系统吞吐量。
本节将分析一些读写事务的示例序列,以帮助您理解不同AXI通道之间的关系。本节还介绍了管理事务的一些规则,以及转移ID如何支持无序事务。
我们还将研究:
•未对齐的传输,以及它们如何帮助优化带宽利用率
•big endian和little endian编码之间的差异,以及一些简单的示例
•与AXI接口相关的主要参数。这些参数在实现互连时非常有用
简单事务的示例有助于解释不同AXI通道之间的关系。
下图显示了AXI3或AXI4接口的五个通道上的几个有效事务的时间表示:
本例中的不同事务如下:
1.事务A,它是包含四个传输的写事务。管理器首先将地址A放在AW信道上,然后很快将四个数据传输序列放在W信道上,以AL结尾,L代表最后一个。一旦所有四个数据传输完成,下属将在通道上做出响应。
2.当事务A发生时,管理器还使用读取通道执行读取事务C,其中包含两个传输。因为当事务完成时,这是来自不同通道上下级的读取响应。相反,来自下属的响应与数据同时包含在R通道中。
3.一旦事务C完成,管理器使用读取地址通道AR向下级发送新的读取地址D。在这种情况下,下属的反应不是立即的。这由D和D0之间的空时隙表示。这样的延误可能会发生。下属没有义务立即回答。例如,下属可能正忙于执行另一个操作,或者可能需要时间来检索数据。最终,从属设备在R信道上通过四个顺序传输D0到DL进行响应。
4.最后,当读事务D正在进行时,管理器使用写地址通道AW向下级发送新地址B以进行写操作。管理器将数据B0放在W通道上,同时将相应的地址B放在AW通道上。在本例中,数据传输B0和BL之间存在延迟,在响应B之前存在另一个延迟。只有当下属向管理器发送响应时,事务才完成。所有这些示例都是有效的事务。
下图显示了不同但仍然有效的时间线中相同的读写事务序列:
在本例中,管理器在完成事务A之前启动事务B。
管理器使用写入地址通道AW,在完成W通道上事务a的数据传输之前,通过向下级传输新地址B来启动新事务。
当事务A的所有数据都已完成时,事务B的数据将传输给下级。管理器在开始传输事务B的数据之前,不会等待事务a的B通道上的响应。
同时,管理器使用“读取地址”通道依次传送下级的读取地址C和D。从属服务器按顺序响应两个读取请求。
此示例显示了在不同通道上发生的读取和写入事务的不同有效组合。这表明AXI协议的灵活性以及优化互连性能的可能性。
AXI协议为每个信道定义了ID信号总线。用ID标记每个事务,可以按顺序完成事务。这意味着到更快内存区域的事务可以完成,而无需等待到较慢内存区域的较早事务。使用传输ID可以实现高性能互连,最大化数据吞吐量和系统效率。此功能还可以提高系统性能,因为它减少了事务延迟的影响。
ID信号总线如下:
• AWID
• WID
• BID
• ARID
• RID
AXI协议通过使每个接口充当多个有序接口来支持无序事务。根据AXI协议规范,必须对具有给定ID的所有事务进行排序。但是,对具有不同ID的事务的排序没有限制。
使用传输ID时,请遵循以下规则:
•所有事务都必须有ID。
•事务中的所有转账必须具有相同的ID。
•管理器可以支持多个线程的多个ID。
•下属通常需要可配置的ID宽度。
您还应该记住ID信号的这两个重要AXI参数:
•写入ID宽度,即用于AWID、WID和BID总线的位数
•读取ID宽度,即用于ARID和RID总线的位数
写事务有三种AXI排序规则。
规则如下:
•W通道上的写入数据必须遵循与AW通道上的地址传输相同的顺序。下图说明了此规则:
在本例中,管理器发布地址A,然后发布地址B,因此数据必须在B0之前以A0开头。
在AXI3中允许在W通道上交织具有不同ID的写入数据,但在AXI4和更高版本中不推荐。
•具有不同ID的事务可以按任何顺序完成。下图说明了此规则:
在本例中,事务B在事务A之前完成,即使事务A首先开始。
•经理可以有多个具有相同ID的未完成事务,但必须按顺序执行并按顺序完成。下图说明了此规则:
在本例中,事务B具有与其他事务不同的ID,因此它可以在任何时候完成。然而,事务A和C具有相同的ID,因此它们必须按照发出的顺序完成:首先是A,然后是C。
读取事务有三种排序规则。
规则如下:
•R通道上不同ID的读取数据没有排序限制。这意味着下属可以按任何顺序发送。下图显示了一个示例,其中事务B在A之前得到服务,即使事务A的地址是先收到的:
•R通道上不同ID的读取数据可以交错,RID值区分数据所涉及的事务。下图显示了事务A和B的R数据交错的示例:
•对于具有相同ID的事务,必须按照请求的顺序返回R通道上的读取数据。下图显示了事务A和C具有相同RID值0的示例:
因为事务A是在事务C之前请求的,所以下级必须在C的数据值之前返回A的所有四个R数据值。
读和写通道彼此之间没有排序规则。这意味着它们可以按任何顺序完成。因此,如果管理者需要为特定的读写顺序排序,那么管理者必须确保在发出新的事务之前,明确等待事务完成,从而遵守事务顺序。
下图显示了一个示例,其中管理器需要从地址对写-读-写事务序列进行特定排序:
操作顺序如下:
1.管理器启动第一个写入事务。
2.管理器通过等待写入响应通道上的信号来确保下属已完成写入事务。
3.管理器启动读取事务。
4.管理器等待读取数据通道上的最终响应。
5.管理器开始第二个事务。
AXI协议支持具有未对齐起始地址的事务,该地址仅影响事务中的第一次传输。在事务中的第一次传输之后,所有其他传输都将对齐。
AXI协议还支持使用选通信号的未对齐传输。有关详细信息,请参阅写入数据选通。
未对齐传输是指AxADDR值不必与事务宽度对齐。例如,以字节地址0x1002开始的32位数据包没有与自然的32位地址边界对齐,因为0x1002不能完全被0x20整除。
以下示例显示了从未对齐地址0x01开始的5拍32位传输:
如果事务与0x00的起始地址对齐,结果将是一个宽度为4字节的五拍脉冲串,最大数据传输量为20字节。但是,我们有一个未对齐的起始地址0x1。这减少了传输的总数据量,但这并不意味着最终的未对齐传输完成突发并构成卷。在本例中,第一次传输从地址0x01开始,包含三个字节。突发中的所有后续传输都与总线宽度对齐,每个传输由四个字节组成。
以下示例显示了从地址0x03开始的五拍16位大小的事务:
如果事务与0x00的起始地址对齐,结果将是宽度为两字节的五拍脉冲串,最大数据传输量为10字节。在本例中,第一次传输从未对齐的地址0x03开始,并包含一个字节。突发中的所有后续传输都与总线宽度对齐,每个传输由两个字节组成。
AXI协议不要求下属基于来自管理器的任何对齐信息采取特殊行动。
AXI协议通过使用Big endian-8(BE-8)模式支持同一内存空间中的混合端序结构。与小端模式相比,BE-8模式使用相同的字节通道,但字节顺序相反。
使用BE-32的混合端结构比使用BE-8的混合端更复杂,因为字节通道与小端模式不同。
以下示例显示了同一个四字节字的小端和大端表示:
对于小端模式下的四字节字,最高有效字节使用最高有效字节通道,即字节通道3。在BE-8模式中,最高有效字节使用最低有效字节通道,即字节通道0。
以下示例显示了同一双字节字的小端和大端表示:
对于小端模式下的两个字节的半字,最高有效字节使用字节通道1,最低有效字节则使用字节通道0。同样,在大端字节BE-8模式中,两个字节使用的通道被切换。最高有效字节使用字节通道0,最低有效字节
使用字节通道1。
最后,对于单个字节,小端和大端模式没有区别,如下例所示:
在这两种情况下,字节都使用字节通道0。
在支持BE-8的Arm核心等可配置端序组件中,字节的重新排序应该在内部执行,这样就不必在互连级别执行任何操作。
另一方面,连接到AXI互连(本质上是BE-8)的定制设备已经具有正确的字节顺序。AXI协议中的BE-8简化了对动态端序切换的支持。
本节指南重点介绍了配置AXI写入和读取通道的一些最重要的属性。
写接口属性包括以下内容:
•写发布功能:表示管理器接口可以生成的最大活动写事务数
•写入交错功能(仅限AXI3):管理器接口能够传输数据的活动写入事务数。
•写接受能力(仅限AXI3):表示从属接口可以接受的最大活动写事务数
•写入交错深度属性:表示从属接口可以从中接收数据的活动写入事务数
读取接口属性包括以下内容:
•读取发布功能属性:表示管理器接口可以生成的活动读取事务的最大数量
•读取接受能力:下级接口可以接受的最大活动读取事务数
•读取数据重新排序深度:从最早的事务开始,下级接口可以传输数据的活动读取事务数