AXI协议

1.cache的读写

1.CPU读Cache时:

●若hit,则CPU直接从Cache中读取数据即可。

●若miss,有两种处理方式:

>Read through,即直接从内存中读取数据;

>Read allocate,先把数据读取到Cache中,再从Cache中读数据。

2.CPU写Cache时:

●若hit,有两种处理方式:

>Write through:把数据同时写到Cache和内存中;

>Write back:先把数据写到Cache中,再通过flush方式写入到内存中。

●若miss,有两种处理方式:

>Write allocate:先把要写的数据载入到Cache中,写Cache,然后再通过flush方式写入到内存中;

>No write allocate:直接把要写的数据写入到内存中。
 

2.AXI的事务属性

关于transaction 的及时可见:

对于write transaction,且是bufferable,可以在中间节点返回response,但是需要保持可见,什么叫做可见?即其他master事务发起的事务,在传输过程中能够看到该数据,即中间节点有一个地址比对的操作,若读地址和写地址相同,则可以直接在该节点读取相应的数据。

为什么同一个master需要发起多个ID的transaction?因为outstanding的能力,可以一次性发送多个事务请求,但是其中有些事务需要保持顺序,如何实现在发出多个事务后保证它们的顺序呢?使用transaction ID

为了提高总线数据传输带宽和利用率,AXI协议中masters可以outstanding传输,那么当多笔传输发生时,就需要保证每一笔都能按照预期的顺序来完成操作。AXI中当发生如下情况时,AXI必须做到保证先后顺序,即先发送的必须先到达目的地(device or memory),也先完成。

1、同时进行访问memory空间的多笔传输的地址(address)一样或有重叠(overlap);

2、访问同一个peripheral device空间时。

对于peripheral device空间必须全部保序,不管地址,是因为device空间是带有额外属性的,即对device空间的读写操作,可能会影响该空间其他地址的数据变化,因此需要严格保序,否则数据一致性难以保证。

AXI通过何种方式来告知各个component是否是需要保证的transactions呢?答:通过ID号,即相同的ID号需要做到保序。另外:保序只是针对同一个master来说,多个master之间传输的保序无法保证,可以通过软件来保证。

AXI保序要求所有相同方向且带有相同ID的transactions必须按顺序返回response,顺序就是他们发送的顺序。由于读通道和写通道是两个不同的方向,如果两个不同方向的transactions带有相同的ID需要保序,master必须接收到第一笔transaction的response信号后,才能发送第二笔transaction。如果不遵循这个约束,保序无法得到保证。

3.AXI中的通道

AXI总共有五个数据传输channel,其中两个channel用来读,三个channel用来写。每个channel都有流控信号(valid-ready),发送数据端就给valid,接收数据端给ready,读数据和写数据通道都包括一个 LAST 信号,用来指明一个事务传输的最后一个数据。AXI 写通道有三个,传输写地址的通道、传输写数据的通道、传输response的通道。

写地址通道信号

        所有的信号开头都是AW,代表Write的Address channel,传输地址信息和数据都是在 VALID 和 READY 同时为高时有效。

        AWSIZE表示数据传输位宽,AWLEN用来burst写传输的长度,AWBURST表示burst传输类型,AWLOCK信号在最后一章原子操作详细介绍。

        AWCACHE指示Cache是bufferable、cacheable、write-through或者write-back类型的。bit[0] Bufferable (B) bit、bit[1] Cacheable (C) bit、bit[2] Read Allocate (RA) bit、bit[3] Write Allocate (WA) bit。

        bufferable:只针对写操作,可以提升传输效率。即使slave没准备好接收数据,总线也可以返回OKAY给master,把master传给slave的数据存入buffer,待slave准备好了再将buffer的数据传给slave。Write through:CPU写Cache时,若命中,则把数据同时写入Cache和内存中;Write Back:CPU写Cache时,若命中, 先把数据写到Cache中,再通过flush方式写入内存。

       AWPROT是一个info类型的信号,用来指示当前传输的属性是一个数据传输还是指令传输、是普通模式还是特权模式。

由AxCache信号来指定,0-3bit分别代表Bufferable,Cacheable,Read Allocate,WriteAllocate。

注:

Cachable和bufferable

一个Master发出一个读写的request,中间要经过很多Buffer,最后才能送到memory。这些Buffer的添加是为了outstanding,timing,performance等。

Buffer有两种类型:一种FIFO结构,仅仅就是保存发送Request给下一级或者返回Response给上一级。还有一种Buffer,在接受了上一级的Request之后立刻给上一级回response,告诉上一级这个操作已经做完了,而实际上这个操作并没有发到下一级Buffer,更没有被送到memory。有的人可能就问,write的时候这样可以,read的时候则无法这么做。其实read一样有bufferable,如果此处buffer的write data channel有此read需要的数据,就可以直接返回,而不用去访问memory,如果没有,则要把Request发到下一级。
总之,所以的访问都要经过这些buffer,是否bufferable在于何时由谁回response,在于是否要把request送到最终的memory。

Cacheable:
Interconnect其实只是一个路由的功能,内部有buffer,但并没有cache。而是在这个访问从Master发起request到送到最终的memory这个过程中,可能会经过一些cache,cacheable代表了是不是要去这个cache中查找自己需要的数据。要不要更新cache。
你说的利用cache来提高性能,有些操作是要求绝对non-cacheable的,比如device 内部寄存器的访问,这些都是MMR(memory mapped register 存储器映射寄存器)。只能使用non-cachable。

AXI 五个channel所有的信号,可以是Master-Interconnect,也可以是Interconnect-Slave,也可以直接是Master-Slave。

其他具体看这篇

AMBA协议-AXI协议详解(读写时序、Outstanding、乱序传输、原子操作)_不吃葱的酸菜鱼的博客-优快云博客

4.outstanding 

outstanding能力为N=0或1:

读操作:读地址命令->等待读数据返回->读地址命令->等待读数据返回->读地址命令->等待读数据返回。。。。。
写操作:写地址命令->写数据->等待写响应返回->写地址命令->写数据->等待写响应返回。。。。。(如果支持out-of-order,对于AXI3,写命令和写数据不一定有先后顺序且ID顺序不一定相同,AXI4因为已经没有WID信号,所以写数据的顺序要和写地址的顺序一样)

而如果outstanding能力为N>1的话,则:
读操作:可以连续发N个读地址命令,这期间如果读数据没有返回,则需要需要等待读数据返回,如果有读数据返回,则返回了几个,那么仍然可以接着发几个。也就是说,“在路上” 的读命令(或者读数据)最多可以是N。多说一点,可以看出,如果数据返回得比较慢,那么IP需要等待,效率就会比较低,因此,为了提高效率,有必要提高outstanding能力,以弥补”路上“(总线)引入的延时。但是也不能无限制地发,有可能会引起总线拥塞,把其他IP给堵住。
写操作:可以连续发出N组写地址(写数据)命令,这期间如果写响应没有返回,则必须等待写响应返回才能接着发写地址(写数据)命令,如果有写响应返回,则返回了几个,那么仍然可以接着发几组。也就是说,“在路上” 的写响应最多可以是N。

做项目的时候read的outstanding为8,write的outstanding为8,io的outstanding为1,因此只有cachable区间的时候访问,最大到8;而再加上uncachable区间,最大outstanding为9.
 

AXI VIP的outstanding设置

AXI VIP的port_configuration有三个outstanding的配置参数:

rand int num_outstanding_xact       = -1;
rand int num_read_outstanding_xact  = 8;
rand int num_write_outstanding_xact = 8;

当num_outstanding_xact == -1时,num_outstanding_xact将不起作用,需要单独设置num_read_outstanding_xact和num_write_outstanding_xact,相当于读写通道各自有一个FIFO。读通道的outstanding能力取决于num_read_outstanding_xact,写通道的outstanding能力取决于num_write_outstanding_xact。

当num_outstanding_xact != -1时,num_read_outstanding_xact和num_write_outstanding_xact将不起作用,相当于读写通道共用一个FIFO。读写通道的outstanding之和由num_outstanding_xact决定。

默认支持的最大outstanding数是128,如果超过128,注意修改宏SVT_AXI_MAX_NUM_OUTSTANDING_XACT
另外,max_num_outstanding_xacts_check_enable参数可以检查master或slave的outstanding是否超过上述配置的值
原文链接:https://blog.youkuaiyun.com/inthesunxkz/article/details/121858339

5.out of order 和interleave乱序和间插

乱序和间插是两个完全不同的概念。笼统的说,乱序指的是burst这个粒度,而间插指的是beat这个粒度。

简单说了,乱序是salve返回master请求的out of order特性,但这个slave可以是广义上的,一般总线会完成这个功能;

而间插(interleave)是指写数据,或是读返回数据,按找不同ID交织出现。比如:ID0 ID1 ID0 ID1…。乱序和间插都有深度,一般乱序深度比间插大的多。上面那个例子就是间插深度为2的情况。

6.exclusive 和lock

当对同一个地址进行读写操作时,在BUS上会看到在读写通道里面分别有对XX地址的读写操作,但读到和写入的数据是不同的。BUS上有很多master,都有可能对同一个地址进行类似操作,比如 master1 和 master2 都要对地址A数据进行读后写修改,原本计划的顺序是master1读后写,接着master2读后写。结果因为传输问题,master1读了地址A数据没写回,此时master2读了地址A数据后再进行修改写入,然后master1再写,这时候显然出现了读数据错误,master2应该读取的是master1修改的数据,但在这里却直接读取了。

        ID扩展:一笔数据从master传输到slave再由slave返回的全过程可以如下描述:数据从master在发出的时候会给总线一个ID,当这笔数据传送到总线上后,总线会对ID进行扩展,扩展内容用来标志cmd由哪个master发出,接着再把扩展后的ID回给slave。送到slave之后,slave回response信号给总线时,总线也可以根据扩展的ID,将slave返回的response路由到正确的master上。

        而针对多master访问总线问题,AXI 引入了一个原子操作,希望对地址A进行读后写的操作都是由同一个master操作的,中间不会由别的master介入,这样在多线程的时候就不会出现访存冲突的问题。AXI总线针对原子操作定义了两种Access。


原文链接:https://blog.youkuaiyun.com/qq_57502075/article/details/130470954

1. 首先,Lock在amba2.0中就有涉及,意思是,某个master 可以通过Lock 总线来实现独占。只有当该master完成传输后才释放出总线。这样的话,总线的效率会降低。 2. 相比Lock,AXI 中引入了exclusive操作,不需要将bus锁定给某个master。而是通过TAG ID以及slave 返回的response来判断当前的传输是否成功。过程如下:
1)mst 首先向slave的某个地址位置发起一个exclusive读操作。slave中的monitor会纪录下该mst的 ARID和 要访问的地址位置(返回EXOKEY)。
2)mst向同一地址区域发起一exclusive写操作。slave同样要记录该操作的mst的 AWID 和 要访问的地址位置。如果AWID==ARID && 该地址内容没有改变(没有 其他的mst访问过),这个写操作就是成功的。该地址就会更新,同时slv会返回EXOKEY. 否则,slv会返回OKEY.
由此看来,对于exclusive操作,总线其实允许其他mst同时来请求总线。比如,当其他mst要同时通过总线访问其他的slv时,上述2)就不满足,所以总线就不会被锁定

exclusive 和 lock_exclusive lock_fgupupup的博客-优快云博客

### 解决 SVT AXI VIP 中 awvalid 信号无变化的问题 当遇到 SVT AXI VIP 的 `awvalid` 信号无法正常工作的情况时,可能的原因涉及配置参数设置不当、环境搭建不完善或其他硬件描述语言(HDL)层面的因素。 #### 配置参数检查 确保所有必要的宏定义已经按照需求进行了合理的设定。对于长时间延迟和高压力测试场景下的配置尤为重要[^2]: ```verilog `define SVT_AXI_MAX_ADDR_DELAY 20000 ``` 此宏控制地址通道的最大延迟时间,在调试过程中可以适当调整该值来观察是否能改善 `awvalid` 行为。 #### 环境初始化验证 确认用于创建 VIP 实例的命令正确执行并生成了预期的结果文件。通过运行简单的 demo 来初步检验环境的有效性有助于排除因安装或集成错误引起的问题[^4]: ```bash dw_vip_setup -e xxx -p xxx ``` 之后应当仔细审查日志输出以及利用波形查看器如 Verdi 进行深入分析。 #### 协议一致性审核 考虑到 AXI VIP 可以充当协议检查工具的角色,任何违反 AMBA AXI 规范的行为都可能导致通信异常。因此建议核查 master 和 slave 组件之间的交互逻辑是否遵循标准流程[^1]。 #### Slave Agent 功能模块评估 如果问题依旧存在,则需进一步探究 svt_axi_slave_agent 下各个子组件的工作状态,特别是负责处理写请求路径上的 driver 和 sequencer 是否按预期运作[^3]。 针对上述情况的具体解决方案如下所示: - **增加诊断信息**:修改源码加入更多关于 `awvalid` 转变时机的日志打印语句以便追踪其动态; - **简化测试用例**:构建最基础的功能测试向量集,逐步引入复杂度直至重现故障现象为止; - **对比官方文档说明**:参照 UG 或 HTML 形式的用户指南核对当前使用的 API 函数调用方式是否存在偏差。 最后提醒一点,由于不同版本之间可能存在差异,务必保证所依赖的技术资料是最新的稳定发行版。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值