蜡笔阿新的个人空间 https://blog.eetop.cn/1490288 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

转:ARM系列 -- AXI

已有 1299 次阅读| 2022-8-25 21:57 |个人分类:接口协议|系统分类:芯片设计

转自公众号:老秦谈芯

https://mp.weixin.qq.com/s/k8iY4gh4OjMpozR4wMQiyA


不管什么问题,都必然存在着答案。

-- 东野圭吾

有朋友后台留言,觉得ACE有点跳跃,希望讲一下AXI。

开始之前,先上图,看看AMBA的演进过程。目前最新版本是AXI5,5和4的差别不大,所以下文以3和4为主。

图片

AXI的全称是Advanced eXtensible Interface。在spec里面是这么自夸的

  • 用于高带宽和低延迟设计。
  • 提供高频操作,无需使用复杂电桥。
  • 协议满足各种组件的接口要求。
  • 适用于具有高初始访问延迟的内存控制器。
  • 提供了实现互连架构的灵活性。
  • 与AHB和APB接口向后兼容

AXI有五个独立的事务通道,分别是:

  • 读地址(Read Address,简称AR)
  • 读数据(Read Data,简称R)
  • 写地址(Write Address,简称AW)
  • 写数据(Write Data,简称W)
  • 写响应(Write response,简称B)

AXI的五个通道是单方向的,这样做的好处是可以对每个通道单独优化,而且当经过复杂的片上网络时,能够优化时序减少延迟。AXI支持突发(burst)传输,乱序(out of order)传输,极大地提高了数据吞吐能力,在满足高性能要求的同时,又减少了功耗。

对于读操作,主机(master)通过AR通道发送读事务地址,从设备(slave)通过R通道返回给主机所需要的数据,如下图:

图片

图1  AXI的读操作

对于写操作,主机通过AW通道发送写事务地址,并通过W通道把数据发送给从设备,而从设备接收到数据后,需要通过B通道返回一个响应给主机,整个过程结束。

图片

图2  AXI的写操作

读和写的不同之处,一是数据方向不一样,还有就是读事务不需要从设备再发响应了,想想为啥涅。

读和写的数据宽度可以是8, 16, 32, 64, 128, 256, 512, 1024 bits中的一种。

这里不得不提一下AMBA中广泛采用的VALID/READY握手机制。正是因为有了这个机制,发送方(Source)和接收方(Destination)才都有能力控制传输。

发送方通过职位VALID信号,来告诉接收方,自己已经将数据等信息准备好;而接收方通过置位READY信号,来告诉发送方,自己准备好了接收数据。只要有任何一方没准备好,传输就不能进行。

这里不要混淆了,发送方不总是主机,比如读数据通道上,发送方就是从设备,主机是接收方。

发送方的VALID信号和接收方的READY信号并不需要同时置位,可以发送方先准备好,也可以接收方先准备好。也就是说VALID可以早于READY,也可以晚于READY,也可以同时置位。对应的就是下面三种情况。

图片

图片

图片

但是,为了避免死锁等问题,对于VALID/READY信号还是有一定要求的。协议规定,发送方的VALID信号一旦置位就不能拉低,直到完成一次握手;而且,发送方不能根据接收方的READY信号来置位自己的VALID信号。简单说,就是发送方可以根据自己的需求随时发起传输,不能也不需要判断接收方是否空闲,同时发送方一旦发起传输,就不能随意中止。对于接收方,如果没有准备好接收就可以不置位READY,这样就可以反压发送方的传输了,而且接收方置位READY后,只要发送方没置位VALID,可以拉低READY。

时钟信号和复位信号作为全局信号,没啥好说的。AXI的五个通道的信号如下,先是写地址通道:

图片

写数据通道:

图片

写响应通道:

图片

读地址通道:

图片

读数据通道:

图片

从上述的信号列表我们可以看出来,每个通道都有自己的VALID/READY信号。这种VALID/READY握手机制在整个AMBA体系里面广泛采用,不管是做设计还是做验证的同学,一点要熟记。

图片

 今天内容不多,都是基础,下周来看看具体的信号都是什么含义吧。


常常是最后一把钥匙打开了门。

-- 钱学森


前面说到AXI的五个通道是独立的,但通道间必须保持一定的约定关系:

  • 写回复必须在一次写事务的最后一个写数据之后

  • 读数据必须在接收到读地址信号之后

  • 通道间握手必须满足一定的依赖关系

前两条好理解,重点看一下第三条。之前讲过,为了避免死锁,协议规定发送方的VALID不能依赖接收方的READY;反过来,接收方的READY可以等待,也可以不等待发送方的VALID。当发生一次读传输时,读地址通道中,主机(master)是发送方,而从机(slave)是接收方;在读数据通道中,主机是接收方,从机是发送方,这时的依赖关系是:

  • 主机不可以等待从机置起ARREADY以后,来决定是否置起主机的ARVALID

  • 从机可以等待主机置起ARVALID之后置起ARREADY

  • 从机可以在主机置起ARVALID之前置起ARREADY

  • 从机必须等待主机置起ARVALID 和从机置起ARREADY 之后,才可以置起RVALID

  • 从机不可以等待主机置起RREADY,来决定是否置起从机的RVALID

  • 主机可以等待从机置起RVALID之后置起主机的RREADY

  • 主机可以在从机置起 RVALID 之前置起主机的RREADY

读传输的依赖关系也可以参考下图,其中,单头箭头表示其指向的信号可以在箭头起始信号置起之前或之后置起,也就是说被指向的信号不依赖起始信号;双箭头表示其指向的信号必须在箭头起始信号置起之后置起,也就是说被指向的信号必须依赖起始信号。

图片

对于写传输来说,在写地址和写数据通道上,主机是发送方,从机是接收方;在写响应通道,主机是接收方,从机是发送方,这时的依赖关系是:

  • 主机不可以等待从机的AWREADY和WREADY,来置起主机的AWVALID和WVALID

  • 从机可以等待主机置起AWVALID和WVALID之后置起从机的AWREADY

  • 从机可以在主机置起AWVALID和WVALID之前置起从机的AWREADY

  • 从机可以等待主机置起AWVALID和WVALID之后置起从机的WREADY

  • 从机可以在主机置起AWVALID和WVALID之前置起从机的WREADY

  • 从机必须在主机置起WVALID和WREADY之后,才可以置起BVALID,从机必须等待主机置起WLAST之后,才可以置起BVALID

  • 从机不可以等待主机置起BREADY之后再置起BVAILD

  • 主机可以等待从机置起BVALID之后置起BREADY

  • 主机可以在从机置起BVALID之前置起BREADY

图片

上面听起来有点像绕口令,其实记住一个大原则就好:发起方不能挑事,接收方有自主权。

在AXI4和AXI5中,写传输增加了额外的从机置起 BVALID 信号所需的依赖,从机必须等待AWVALID,AWREADY,WVALID和WREADY。比起AXI3,BVALID还要依赖于AWVALID和AWREADY。从机要等写地址和写数据都完成以后才可以返回写响应,这在道理上是对的。但是,一般而言,写数据会在写地址前完成。

图片

VALID/READY握手机制是AMBA中一个很重要的机制。正是因为有了这个机制,发送方和接收方都有能力控制传输。协议中花费了大量篇幅来描述VALID/READY。

今天事情有点多,就少写一点吧~~


没有伟大的意志力,就不可能有雄才大略。

-- 巴尔扎克

了解完通道握手的依赖关系,我们再看看传输事务的结构。首先看传输的地址结构。AXI协议是基于突发(burst)传输的。所谓突发传输,就是在一次事务中,连续地传输多个地址相邻的数据。一次突发传输中可以包含一至多次数据(Transfer)。每个 transfer 因为使用一个周期,又被称为一拍数据(Beat)。每个数据可以是多个Byte构成。

协议规定,每次突发传输的累计地址不能跨4KB边界。至于为啥是4KB而不是别的数值,这是最初操作系统的问题,以4KB为一个页(page),对于某些设备而言,跨了4KB边界可能就是另外一个设备了。

ARLEN用于读地址通道的突发长度,AWLEN用于写地址通道的突发长度。下文中AxLEN指ARLEN或AWLEN, x指代R或者W,对于其它信号也类似,以后不再赘述。在AXI3中,对于所有的突发类型,都支持1-16的突发传输。AXI4中,INCR类型支持1-256突发传输,其它类型依然是1-16。所以对于AXI3来说,AxLEN信号是4bit宽度;而在AXI4中,AxLEN是8bit宽度。一次突发传输的长度是AxLEN+1,因此,最小长度就是1了(毕竟0的话没有任何意义)。

AxSIZE信号指示突发传输中的数据位宽。数据位宽不能超过数据总线本身的位宽,而当数据总线位宽大于突发传输的位宽时,将根据协议的相关规定,将数据在部分数据线上传输。

图片

突发传输有以下几种类型:

  • FIXED,所有数据都使用起始地址。该模式适合对某个固定地址进行多次数据更新,比如读写一个 fifo 时,读写地址就是固定的。
  • INCR,后续数据的地址在初始地址的基础上进行递增,递增幅度与传输宽度相同。适合对于RAM 等通过地址映射(mapped memory)的存储介质进行读写操作。
  • WRAP,首先根据起始地址得到绕回边界地址与最高地址。当前地址小于最高地址时,WRAP 与 INCR 类型完全相同,地址递增。但到递增后的地址到达最高地址后,地址直接回到绕回边界地址,再进行递增,就这样循环往复。最高地址由绕回边界地址计算得到。这种传输类型适用于对缓存行(cache line)的操作。

突发传输类型是通过AxBURST信号来指示的,具体参考下图:

图片

好了,到这里,我们知道了每次突发的起始地址是主机发出的。AxLEN用于指示要传输多少次数据(beat);AxSIZE用于指示每个数据有多少Byte;AxBURST用于指示突发类型,除去首次传输的地址,下次传输的地址可以根据AxBURST和首地址计算得出。

协议中规定,通信双方都不能在传输事务的所有 Transfer 完成前提前结束。哪怕发生错误,也要走完整个传输事务的流程。但是主机有办法减少传输的数据。在写传输事务中,发送方可以通过置低所有写有效位的方式,使得写数据无效。在读传输事务中,主机可以直接丢弃读取到的数据。

分析完传输的地址结构,再来看看读写数据的结构。主要是涉及窄传输(Narrow transfers),非对齐传输(unaligned transfer)和混合大小端(mixed-endian)传输等话题。

WSTRB信号用于指示WDATA中的哪些数据byte是有效的。WSTRB[n] 对应的是WDATA[8n+7:8n],也就是:当 WSTRB[n] 为 1 时,WDATA[8n+7:8n]有效。

当主机发起的传输位宽小于总线宽度时,就是一次窄传输。如果是INCR或者WRAP类型,可以每拍(beat)使用不同的字节位置(byte lane),如果是FIXED类型就不可以了。协议中给出了两个例子,我们看一个就好了,如下图:

不要失去信心,只要坚持不懈,就终会有成果的。

-- 钱学森

 

来看看事务属性(Transaction Attributes),主要是对cache,buffer和memory controller的规定。按照协议,从机分为存储从机(memory slave)和外设从机(peripheral slave)。存储从机要能够正确执行所有的事务,外设从机处理事务的能力取决于具体实现。

AXI协议用AxCACHE来控制事务属性。如果不清楚cache基本知识,可以翻前面的文章,《CPU设计之Cache -- 基础》。简单了解一下。在AXI3中,AxCACHE信号的含义如下图:

图片

从上图可以看出,AxCACHE信号的4bit有各自的含义,比如AxCACHE[1]就是表示该事务是不是cacheable的。

在AXI4中,AxCACHE[1]指示是否modifiable。Non-modifiable的事务不可以拆分或合并。对于Non-modifiable的事务,下列参数不可以改变。

图片

AXI4中的Read-Allocate和Write-Allocate与AXI3中的也略有不同。

根据AxCACHE的不同,存储类型分为下图中的几种:

图片

对于Device Non-bufferable,协议规定:

  • 写响应必须从最终目的地获得
  • 读数据必须从最终目的地获取
  • 事务可以改变
  • 读操作不得预取。不能合并写操作
  • 从同一ID到同一从机的所有不可修改读写事务(AxCACHE[1]=0)必须保持秩序(ordered)

对于Device Bufferable,协议规定:

  • 写响应可从中间节点获得
  • 写事务必须最终目的地及时可见
  • 读数据必须从最终目的地获取
  • 事务不可修改
  • 读操作不得预取。不能合并写操作
  • 从同一ID到同一从机的所有不可修改读写事务(AxCACHE[1]=0)必须保持秩序(ordered)

对于Normal Non-cacheable Non-bufferable,协议规定:

  • 写响应必须从最终目的地获得
  • 读数据必须从最终目的地获取
  • 事务可以改变
  • 写操作可以合并
  • 同一ID到重叠地址的读写事务必须保持有序

对于Normal Non-cacheable Bufferable,协议规定:

  • 写响应可从中间节点获得
  • 写事务必须最终目的地及时可见
  • 读数据必须从最终目的地或者正在进行到其最终目的地的写事务获得
  • 事务可以改变
  • 写操作可以合并
  • 同一ID到重叠地址的读写事务必须保持有序

对于Write-Through No-Allocate,协议规定:

  • 写响应可从中间点获得
  • 写入事务必须最终目的地及时可见
  • 读取数据可从中间缓存副本获取
  • 事务可修改
  • 读取可以预取
  • 写入可以合并
  • 读和写事务需要缓存查找
  • 从同一ID到重叠地址的读写事务必须保持有序
  • 出于性能原因,建议内存系统不要分配这些事务

对于Write-Through Read-Allocate,除了满足Write-Through No-Allocate的要求,协议规定:

  • 推荐读事务分配
  • 不推荐写事务分配

对于Write-Through Write-Allocate,除了满足Write-Through No-Allocate的要求,协议规定:

  • 不推荐读事务分配
  • 推荐写事务分配

对于Write-Through Read and Write-Allocate,除了满足Write-Through No-Allocate的要求,协议规定:

  • 推荐读事务分配
  • 推荐写事务分配

对于Write-Back No-Allocate,协议规定:

  • 写响应可从中间点获得
  • 写事务不需要在最终目的地可见
  • 读取数据可从中间缓存副本获取
  • 事务可修改
  • 读取可以预取
  • 写入可以合并
  • 读和写事务需要缓存查找
  • 从同一ID到重叠地址的读写事务必须保持有序
  • 出于性能原因,建议内存系统不要分配这些事务 

对于Write-Back Read-Allocate,除了满足Write-Back No-Allocate的要求,协议规定:

  • 推荐读事务分配
  • 不推荐写事务分配

对于Write-Back Write-Allocate,除了满足Write-Back No-Allocate的要求,协议规定:

  • 不推荐读事务分配
  • 推荐写事务分配 

对于Write-Back Read and Write-Allocate,除了满足Write-Back No-Allocate的要求,协议规定:

  • 推荐读事务分配
  • 推荐写事务分配

为了阻止非法事务越权访问,AXI 协议设计了访问控制信号 AxPROT。读/写事务的 AxPROT 信号位宽均为3bit,其具体含义如下表:

 忍耐是痛的,但是它的结果是甜蜜的。

-- 卢梭 
 

今天先来看一下传输标识(transaction identifier)的概念,主要是ID信号。

图片

开始之前先讲几个概念,首先是outstanding(想不好怎么翻译,有的人译为超前)传输。如果没有outstanding能力,或者说outstanding=1时,主机的读操作顺序是:读地址命令->等待读数据返回->读地址命令->等待读数据返回->…如此往复。主机的写操作行为是:写地址->写数据->等待写响应返回->写地址->写数据->等待写响应返回->…如此往复。每一次新的传输要等上一次传输结束,总线的利用率不高。而如果outstanding能力为N>1的话,则读操作时,可以连续发N个读地址命令,在这期间如果读数据没有返回,则需要等待读数据返回,如果有读数据返回,则返回了几个,那么仍然可以接着发几个。也就是说,“在路上” 的读命令(或者读数据)最多可以是N。对于写操作,可以连续发出N组写地址(写数据)命令,这期间如果写响应没有返回,则必须等待写响应返回才能接着发写地址(写数据)命令,如果有写响应返回,则返回了几个,那么仍然可以接着发几组。也就是说,“在路上” 的写响应最多可以是N。

还有一个概念是乱序(out of order)传输。如果不支持乱序,那么返回的读数据必须按照读事务的顺序返回。如果是一次突发传输,返回数据中间不能插入其它的读事务数据。如果中间允许插入其它事务的数据,就是支持交织。

换种说法,outsatanding是对地址而言,一次突发还没结束,就可以发送下一个地址。而乱序和交织则是相对于传输事务,out-of-order说的是发送transaction和接收的cmd之间的顺序没有关系,如先接到A的cmd,再接到B的cmd,则可以先发B的数据,再发A的数据;交织指的是A的数据和B的数据可以交错,如A0->B0->A1->B1->B2->B3。

如果SoC中是多主机多从机的结构,支持上述的传输特性无疑会极大的提高总线互连的利用率,主机可以对不同地址或从机进行连续访问,而从机返回数据的先后可以不按照主机的发出事务顺序。当然,这也对设计提出了挑战。

一般从机的数据准备时间不由主机控制,数据就绪顺序与事务到达顺序不一致是可能的。因此需要相应的机制来标识数据所属的事务。而这,就是通过ID信号来实现的。

首先从读事务的 ARID 来看,主机为发出的读事务设定 ARID。

对于给定ID值的所有事务都必须保持有序,但对具有不同ID值的事务的顺序没有限制。单个物理端口支持乱序(out of order)事务,这样看起来有多个逻辑端口,每个逻辑端口按顺序处理其事务。通过使用AXI ID,主机可以无需等待前一个事务完成,就可以发出下一个事务。这可以提高系统性能,因为它支持事务的并行处理。

对于读数据排序,从机要保证RID的值与对应的ARID值匹配。互连必须确保从具有相同ARID值的事务序列中读取的数据以不同的从机为目标,由主机按其发出地址的顺序接收。从设备的读取数据重新排序深度(read data reordering depth)由从设备自己决定,不受主设备影响。

对于写数据排序,主设备必须保证写数据与发出的事务地址顺序相同。互连必须保证不同主设备的写数据与事务地址同序。也就是说,主设备保证自己的写事务顺序,互连保证不同主设备的顺序。

AXI3支持不同ID的写数据交织(interleaving)。但是,Write interleaving增加了系统总线设计的复杂度,而且很容易造成死,所以AXI4中不支持了。

这就有了一个新的概念,排序模型(ordering model)。相同ID和目的地的事务请求必须保证顺序;返回的相同ID的事务响应要与请求顺序相同。Ordering model不保证下列间的顺序:

  • 不同主机的事务
  • 读和写事务
  • 不同ID的事务
  • 到不同外设区域(peripheral regions)的事务
  • 到不同存储空间(memory location)的事务 

AXI4中除去那些重要的信号,还有一些可选信号,也可称为边带(sideband)信号。接下来简单过一下。首先是AxQOS,AXI4通过这些信号支持QOS(Quality of Service),AWQOS和ARQOS都是4bit的信号。协议里面并没有规定具体的用法,只是建议用AxQOS信号作为区分优先级使用,数值越大表示优先级越高。看到这,我们大概也明白了什么是QOS了,说白了,就是在资源有限的情况下,尽可能的保证高优先级的模块或组件获得足够的资源,比如内存带宽。举个例子就好理解了,比如去银行办业务,VIP客户的需求会被优先处理,普通客户都在拿号排队,VIP客户去了可以直接加塞儿。所以,所谓的服务质量就是优先级排队,看人下菜碟儿,哈哈。回到我们的芯片设计,还是以内存带宽为例,对于手机SoC或通用的图像GPU而言,显示接口模块显然需要稍高一些的优先级,否则打游戏时显示图像不流畅会极大的影响用户体验。不同的SoC中拥有的系统资源各不相同,需求也各不相同。对于SoC来说,QOS是一个系统问题,所以AXI协议中没有规定具体的实施,这要依赖于系统架构设计。也正是因为这样,协议规定AXI的事务排序优先于QOS排序。

另外一组信号是AWREGION和ARREGION,4bit宽度,用于支持多区域接口(multiple region interface)。AxREGION用于唯一标识多个不同的区域,提供高阶地址位的解码。区域标识符(region identifier)必须在任何4K字节的地址空间内保持不变。使用AxREGION意味着从机上的单个物理接口可以提供多个逻辑接口,每个接口在系统地址映射中具有不同的位置。从机不必支持不同逻辑接口之间的地址解码。

AXI4也提供了一组称为USER的用户自定义信号,对应5个通道,分别是AWUSER,ARUSER,WUSER,RUSER,BUSER。同样的,协议没有规定这些信号的具体用法,甚至都没规定这些信号的宽度。而且协议也不要求同时实现5个通道的USER信号。可以看出,USER信号的存在感很弱。在一些SoC设计中,可以利用USER信号来传输一些边带信息。要注意的是,如果是不同厂家的IP,在集成时千万要看好了USER信号的具体用法,很有可能不兼容,不能直连。



AXI主机可能支持多个级别的操作权限,并将此权限概念扩展到内存访问。AxPROT[0]将访问标识为非特权或特权。AXI主机可能支持安全和非安全操作状态,并扩展了这一概念到内存访问的安全性。AxPROT[1]将访问标识为安全或不安全。AxPROT[2]指示是数据还是指令访问,但是并非在所有情况下都是准确的,例如,事务包含指令和数据项的混合。协议建议主机将AxPROT[2]设置为低,以指示数据访问,除非确认该访问是指令访问。

看到现在,是不是有种想吐的感觉?哈哈哈。正常现象,每次看跟memory相关的内容都很痛苦。肯定有少翻译不到位的地方,请大家包涵了。

 
未完,待续】

  • 突发长度是5
  • 起始地址0
  • 每次传输8bit
  • 数据总线宽度32bit
  • 突发类型是INCR

图中灰色表示该byte无效,我们可以看到,每次传输的有效字节位置是不同的。在窄传输中,主机可以调整有效数据的字节位置,以及给出字节有效信号 WSTRB,能够使从机无需进行数据重组等工作。

AXI中还有一个问题是大小端问题,之前的文章讲过什么是大端和小端。其根本不同就是高字节数据存在低地址位还是高地址位。AXI协议定义了一种字节顺序不变端序(byte-invariant endianness)方案。

  • 无论大端或小端模式,每个数据结构存储空间的分配方式是相同的
  • 该数据结构按照其大端或小端模式决定字节存储的地址顺序
  • 在传输过程中不考虑数据结构的大小端,按照字节原先存储的顺序,原样传输并存放至对端

AXI 协议支持地址非对齐的传输,允许突发传输的首字节地址,即起始地址与突发传输位宽不对齐。比如,总线位宽为 32bit,也就是4byte,这时要保证对齐,起始地址的最低两位必须是2‘b00。如果起始地址为 0x1002,则产生了非对齐现象。

主机可以使用低阶地址行表示未对齐的起始地址,然后提供一个对齐的地址,并使用字节通道选通信号通知未对齐的起始地址。下面是协议中给出的例子: 

图片

看完了数据结构。就剩下读写响应结构了。读写响应信号分别是RRESP/BRESP,各2bit,总共4种状态:

  • OKAY ,常规访问成功
  • EXOKAY,独占(exclusive)访问成功
  • SLVERR,从机错误,从机接收到了访问请求,但因为种种原因向主机返回了一个错误状态
  • DECERR,解码错误,一般由互连(interconnect)组件产生,表示主机发送的传输事务地址无效,无法将传输事务发送给某个从机。

【未完,待续】

有朋友提出希望讲一下AXI的原子访问(Atomic Accesses)。其实这部分我在前面特意没提及,一是个人感觉这块牵扯的基本概念太多,而且晦涩难懂,二是工作中真需要用到的机会也不多。今天简单介绍一下,有不对的地方请大家指教。

何为“原子性”?在这里,“原子性”指的是内存访问的一个特征,也称为原子访问,该内存访问操作要么执行完,要么不被执行,不存在执行一半被打断的可能。也就是该内存访问操作像原子一样不可切割。

为此,ARMv8-A(注意,不是AXI)中定义了两种原子性:单拷贝原子性(single-copy atomicity)和多拷贝原子性(multi-copy atomicity),此处不展开太多了,以后有机会单独写一篇与大家讨论。

AXI4中引入了一个概念,单拷贝原子大小(single-copy atomicity size)。这个术语定义事务原子更新的最小字节数。AXI4协议要求大于单拷贝原子大小的事务必须更新至少为单拷贝原子大小的内存块。

更复杂的系统需要支持更大的原子元素,特别是64bit,这样主机就可以使用基于这些更大原子元素的数据结构进行通信。系统中支持的单拷贝原子性大小非常重要,因为给定通信中涉及的所有组件都必须支持所需的原子元素大小。AXI4协议本身不需要特定的单拷贝原子大小,系统可以设计为支持不同的单拷贝原子大小。AXI的spec里面给了下图一个例子:图中的处理器,DSP,DRAM控制器,DMA,SRAM,互连和外设都是32bit的single-copy atomicity size;同时处理器,DSP,DRAM控制器和相关的互连部分也是64bit的single-copy atomicity size。

图片


为了支持原子访问,AXI中定义了两种操作:排他访问(exclusive access),和锁定访问(locked access)。

排他访问机制可以提供信号量类型的操作,而不需要在操作期间保留总线给特定主机。也就是说信号量类型的操作不会影响总线访问延迟或最大可实现带宽。主机通过AxLOCK信号选择独占访问,RRESP和BRESP信号分别表示独占访问读写的成功或失败。从机需要额外的逻辑来支持独占访问。

排他访问的基本机制是:

  1. 主机对一个地址执行排他读取。
  2. 在稍后的某个时间,主机试图通过执行排他写入来完成独占操作到相同的地址,并且具有与用于排他读取的地址匹配的AWID。
  3. 此排他写入访问被标记为:
    Ø  如果在排他读访问之后没有其他主机写入该位置,则标记为成功。在这种情况下,排他写入更新内存。
    Ø  如果另一个主机在排他读取访问后已写入该位置,则标记为失败。在这种情况下,内存位置不会更新。

主机通过执行排他读取来启动排他操作。如果事务成功,从机返回EXOKAY响应,指示从机记录了要监视的地址以进行排他访问。如果主设备尝试从不支持排他访问的从设备进行排他读取,则从机将返回OKAY,不是EXOKAY。

不支持独占访问的从机可以忽略AxLOCK信号。但是必须能够对正常访问和排他访问返回OKAY响应。

与排他访问相对的是锁定访问。当主机使用AxLOCK信号来指示事务是锁定的事务时,互连必须确保只有该主机可以访问目标从属区域,直到来自同一主机的未锁定事务完成。互连中的仲裁器必须执行此限制。在主机启动读或写事务的锁定序列之前,它必须确保没有其他事务等待完成。任何带有AxLOCK的表示已锁定事务的事务都会强制互连锁定后续的事务。因此,锁定的序列必须由一个没有AxLOCK指示锁定事务终结。这就要求最后一个事务包含在锁定的序列中,并有效地移除锁定。完成锁定序列时,在发出最终解锁事务之前,主机必须确保所有先前锁定的事务都已完成。然后,它必须确保最终解锁事务在开始任何进一步的事务之前已经完成。主机必须确保锁定序列中的所有事务都具有相同的AxID值。

可以看出,锁定访问需要在一段时刻内独占互连,因此会极大影响互连的性能。在AXI4中已经取消对锁定访问的支持。

AXI3支持locked access,AxLOCK信号为2bit。

图片


AXI4中考虑到大多数组件并不需要锁定的事务,而且锁定事务对于互连设计和QoS带来挑战,因此取消了对locked access的支持,AxLOCK信号为1bit。

图片



点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 1

    关注
  • 5

    粉丝
  • 1

    好友
  • 9

    获赞
  • 25

    评论
  • 6299

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-2 01:56 , Processed in 0.019535 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部