AXI总结

AXI总线学习整理

一、axi的定义以及特点

  • axi的定义:是一种面向高性能、高带宽、低延迟的片内总线。
  • 特点:
    • 单向通道体系结构,能够减少延时以及门数量;
    • 支持多主机多从机间的数据传输(通过仲裁实现)
    • AXI总线上具有相应的buffer,提供了outstanding传输的能力(一个MASTER发出一个读写的request,中间要经过很多buffer,最后才能送到memory)
    • 提供了低功耗接口

二、AXI的五个数据通道

包含写地址、写数据、写相应、读地址、读数据

1、写地址通道

写地址通道需要包含的信息有三类:

  • 第一类为事务信息
    :包含事务传输的突发大小、类型、长度,以及事务ID,事务ID主要用于乱序传输。
  • 第二类为数据信息
    :包含地址信息、握手信号
  • 第三类为控制信息
    :包含锁定类型、cahace类型、保护类型

2、写数据通道

写数据通道只包含数据信息:包括握手信号、数据、数据指示信号(last)、数据选通信号(作MASK用)、事务ID

3、写响应通道

写响应通道也只包含数据信息:即握手信号、数据信息(四种类型,指示传输是否成功)、以及事务ID

4、读地址通道

读地址通道需要包含三类信息:

  • 第一类为事务信息
    :包含突发传输大小、长度、类型(三种:固定,环绕,递增),以及事务ID
  • 第二类为数据信息
    :包含地址数据、握手信号
  • 第三类为控制信息
    :包含锁定类型、cachace类型、保护类型

5、读数据通道

读数据通道只包含数据信息:包括握手信号、数据、数据指示信号(last)、事务ID、读相应信号

三、时钟以及复位

  • 时钟:每个AXI组件都应该有自己的ACLK,主从接口输入输出不能有组合逻辑
  • 复位:主从接口必须拉低所有valid信号?

四、关于握手

  • 用于控制数据流速:若是上级valid过快,而ready信号跟不上,则会造成数据丢点。在数据流速上,最好通过ready去反压前级valid。
  • 流水线:valid从前往后传输,而ready从后往前传输,所以需要做数据预取操作,即当本次后级ready拉低后,需要将前面几级寄存器的数据更新,以保证下一次ready信号到来时马上输出数据,如下:
module pipline_ready_valid(
input clk,
input rst_n,
input [7:0] a1,
input [7:0] a2,
input [7:0] b1,
input [7:0] b2,
input ready_i,
input valid_i,
output  ready_o,
output valid_o,
output reg [17:0] result
    );

reg [15:0] temp1;
reg [15:0] temp2;

reg sync_rst_n;
reg rst_n_r1;

reg valid_r1;
reg  valid_r2;
wire ready_o_r2;
assign ready_o=ready_o_r2||~valid_r1;//组合逻辑进行传递?这一级最好采用时序逻辑进行传输
assign ready_o_r2=ready_i||~valid_r2;//流水线设计握手时,valid信号从前到后传递,ready信号从后往前传递


always @(posedge clk) begin
    rst_n_r1<=rst_n;
    sync_rst_n<=rst_n_r1;
end
//第一级流水设计,当本级ready信号拉高后将上一级的valid信号传输下来,并在握手后更新数据
always @(posedge clk) begin
    if(!sync_rst_n) begin
        valid_r1<=0;
    end
    else if(ready_o) begin//若是ready采用流水线设计,则容易造成下一级已经准备好,但是由于此级还在进行传递所以上级数据来后,会在第一级流水卡住
        valid_r1<=valid_i;//这里
    end
    else begin
        valid_r1<=valid_r1;
//是应该保持原有值还是将其拉低?
        //若是valid为高的情况下,ready信号没来的情况下,vallid还是持续为高,
        //valid本身为低的情况,有无ready保持原有还是直接拉低结果不影响
        //握手一次以后,下一级ready拉低,若此时刚完成握手,则valid后面一直拉高,等待下一次ready信号的拉高。
    end
end

always @(posedge clk) begin
    if(!sync_rst_n) begin
        temp1<=0;
        temp2<=0;
    end
    else if(valid_r1&&ready_o) begin
        temp1<=a1*b1;
        temp2<=a2*b2;
    end
    else begin
        temp1<=temp1;
        temp2<=temp2;
    end
end

//第二级流水设计,为本模块的最后一级流水,次级的ready信号应该受到下一个数据传输模块的影响
always @(posedge clk) begin
    if(!sync_rst_n) begin
        valid_r2<=0;
    end
    else if(ready_o_r2) begin
        valid_r2<=valid_r1;
    end
    else begin
        valid_r2<=valid_r2;
    end
end
always @(posedge clk) begin
    if(!sync_rst_n) begin
        result<=0;
    end
    else if(ready_o_r2&&valid_r2) begin
        result<=temp1+temp2;
    end
    else begin
        result<=result;
    end
end
assign valid_o=valid_r2;
endmodule

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xd5V3c39-1657698315602)(截图/握手.png)]

数据预取:即当前寄存器valid无效时会将ready拉高,下一次valid来时将本次数据进行传递,然后valid处于无效状态。

  • 通道间握手的依赖关系:valid—>ready
  • 写数据传输控制流[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RXBOXI6Y-1657698315604)(截图/写数据流控制.png)]需要注意一下几点逻辑关系:
    • 1、BVALID到AWALID为什么需要添加ACTIVE和START两个中间环节?START利于外部控制,ACTIVE利用告知外部传输状态。且在外部控制过多的情况下利于时序优化。
    • 2、数据传输的顺序一定地址---->数据---->响应---->地址
    • 3、若下级数据传输不过来,可以通过ready信号对start信号进行反压,导致awalid信号不产生,从而不传输awaddr数据。
    • 4、当只有地址信息握手成功后,从机才会将wready信号拉高导致数据握手成功。
    • 5、数据在主机握手成功后,开始向从机传输,从机接收到数据后,返回响应信息,响应信息在主机握手成功后表次本次传输完成。
  • 读数据传输控制流:通过指示信号(rlast)指示本次传输是否完成。

五、关于事务

对于事务的理解:对于每一次传输,都可以称为一次事务,且每个事务都有自己的ID,一般情况一个主机的传输事务ID不变。相同主机发起的传输,事务ID可以相同也可以不相同,多个主机的事务ID可以相同也可以不相同。
事务ID的作用:主要起标识作用,使得写响应与写地址能够对上,用于顺序传输和乱序传输。
OUTSTANDING传输:总线上可能同时有多个传输事务,但是由于握手或者相应的buffer会浪费掉一些时序,若是等到之前传输事务完全完成,则会浪费掉部分传输带宽。所以支持同时传输多个事务,事务传输数量由握手以及线路传输的延时决定。

六、关于互联仲裁

6.1 仲裁设计方案

对于多主机多从机的情况,由于多个主机同时申请访问一个从机,这时候就需要进行仲裁以便于将其中一个主机的访问信息传递给从机。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R6j5llTr-1657698315605)(截图/仲裁设计.png)]
总体设计为主机发送信息带有ID,根据ID进行DECODER,DECODER的目的是将各主机传输过来的数据分流到所需要传送从机的fifo中,若该fifo非空则发出传输数据请求,Arbiter根据设定的仲裁规则,反馈给该fifo一个信号,该信号作为fifo的读使能标志,将fifo中的地址数据或者数据取出,送到从机中,从机再作出相应的响应。

注意!单个主机没有仲裁、单个从机不需要DECODER

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qfs0H8C6-1657698315605)(截图/仲裁时序.png)]
上图为仲裁理想时序,有两个需要注意的地方:

  • 仲裁必定会造成时序延时,延时的长短与仲裁的方式有关,由于采用流水线设计,这种延时理论上并不会造成带宽的浪费。假设突发长度为1,outstanding传输能力为1,那么仲裁造成的延时会造成带宽的浪费,因为数据从发出到从机接收并返回响应,这个过程当中是主机是不能传输第二次数据的(其中有些流水线上的工人处于没有活干的状态),所以延时必定造成数据带宽的浪费。
  • 利用outstanding传输和burst传输,能够对仲裁能够大大减少由于仲裁、握手、buffer造成的带宽浪费,流水线最大的优势就是速度快,但是每一级流水线都必须得处于工作状态。

6.2 仲裁的几种机制:

  • 固定优先级仲裁:
    将req的补码与本身进行按位与操作,得到一个独热码,这个独热码核源码最低位为1的位进行对应。
  • 轮询仲裁机制:
    其原理为将请求的第一次按照低位优先的方式进行,这时掩码信号MASK每位都为1,若第一次GRANT成功后,对应位为1,将GRANT信号取反然后与MASK按位与得到新的MASK,将新的MASK与REQ进行按位与,然后将按位与过后的MASK_REQ进行固定优先级得到这一轮的GRANT,得到后将其取反后与MASK按位与,继续新一轮的仲裁轮询。这种算法的缺点是需要将所有主机的请求处理一遍过后,才会新的一轮请求运算。假设某个主机的请求频率很快,而某个主机的请求频率较慢,那么对于快的那一类将会造成数据的堵塞。
    REQ---->MASK_REQ---->GRANT---->MASK&REQ---->MASK_REQ
    MASK_REQ=MASK&REQ;
    GRANT=MASK_REQ&(~(MASK_REQ-1));
    MASK!=0
    MASK=MASK&~MASK_REQ;
    MASK=0
    MASK复位;
  • 加权仲裁:为了解决每个主机访问量需求的不同,需要对不同主机仲裁访问量进行加权,需求量大的权重大,需求量小的权重小。具体工作方式为,当某主机的权值为20时,设定一个计数器,计数器初值为0,每GRANT一次,计数器值加1。当计数器值为20时,表示该主机本轮GRANT已经完成,需要对MASK的值进行更改,并根据REQ得到新的MASK_REQ,便于其它主机进行访问。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yLEgVQ0X-1657698315606)(截图/权值仲裁.png)]
    方式为,当某主机的权值为20时,设定一个计数器,计数器初值为0,每GRANT一次,计数器值加1。当计数器值为20时,表示该主机本轮GRANT已经完成,需要对MASK的值进行更改,并根据REQ得到新的MASK_REQ,便于其它主机进行访问。
    [外链图片转存中…(img-yLEgVQ0X-1657698315606)]

版权声明:本文为BigerRookie原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。