目录
- 1. 功能描述
- 2. 架构
-
- 2.1. axi_bus_matrix_4x4
- 2.2. decoder
- 2.3. axi_round_robin_arbiter
- 3. 逻辑设计
- 4. 测试
-
- 4.1. axi_round_robin_arbiter
-
- solo测试
- 3v1写测试
- 3v1读测试
- 4.2. axi_bus_matrix_4x4
-
- 4v1写测试
- 4v4写测试
1. 功能描述
当多个AXI master与多个AXI slave通信时,可以使用一个基于AHB协议的bus matrix实现互联。
例如
2. 架构
对于AXI来说,多个AXI Master需要多个AXI Slave通信,可以通过一个BUS MATRIX实现互联,架构如下图所示
可见AXI_Bus_Matrix与AHB_Bus_Matrix结构相似,都需要decoder解码以判断Master要与哪个Slave通信,回传R通道读数据和B通道写响应。
同时还需要arbiter,面对多个Master同时访问同一个Slave仲裁器。
2.1. axi_bus_matrix_4x4
接口如下
Group | Channel | Signal | Direction | Width(bits) | Description |
---|---|---|---|---|---|
ACLK | input | 1 | 时钟 | ||
ARSTn | input | 1 | 低效复位 | ||
MST_IOx | AW | AWID_mstx | input | AWID_WIDTH | AW通道ID宽度 |
AWADDR_mstx | input | AWADDR_WIDTH 2 | burst第一个写事务WDATA的地址,高2bit是为了片选axi slave | ||
AWLEN_mstx | input | 8 | 该数值 1.意思是这次写事务。WDATA个数 | ||
AWSIZE_mstx | input | 3 | WDATA中有效byte大小 | ||
AWBURST_mstx | input | 2 | burst传输类型 | ||
AWVALID_mstx | input | 1 | AW所有控制信息都是有效的 | ||
AWREADY_mstx | output | 1 | AW准备接收所有控制信息 | ||
W | WDATA_mstx | input | WDATA_WIDTH | 写数据 | |
WLAST_mstx | input | 1 | 最后一个写数据的事务 | ||
WVALID_mstx | input | 1 | W所有数据信息通道都有效有效 | ||
WREADY_mstx | output | 1 | W准备接收通道所有数据信息 | ||
AR | ARID_mstx | input | ARID_WIDTH | 读事务ID | |
ARADDR_mstx | input | ARADDR_WIDTH 2 | burst阅读事务第一个阅读传输地址,高2bit是为了片选axi slave | ||
ARLEN_mstx | input | 8 | 该数值 1意味着这次读事务。RDATA个数 | ||
ARSIZE_mstx | input | 3 | RDATA中有效byte大小 | ||
ARBURST_mstx | input | 2 | burst传输类型 | ||
ARVALID_mstx | input | 1 | AR所有所有控制信息都有效有效 | ||
ARREADY_mstx | output | 1 | AR准备接收通道所有控制信息 | ||
R | RID_mstx | output | RID_WIDTH | 读事务ID | |
RDATA_mstx | output | RDATA_WIDTH | 读数据 | ||
RRESP_mstx | output | 2 | 阅读反馈表示阅读传输的状态 | ||
RLAST_mstx | output | 1 | 读取事务中最后一个读取数据 | ||
RVALID_mstx | output | 1 | R通道所有数据信息有效 | ||
RREADY_mstx | input | 1 | R准备接收通道所有数据信息 | ||
B | BID_mstx | output | BID_WIDTH | 写事务ID | |
BRESP_mstx | output | 2 | 写响应 | ||
BVALID_mstx | output | 1 | B通道所有写反馈信息有效 | ||
BREADY_mstx | input | 1 | B通道所有写反馈信息准备接收 |
Group | Channel | Signal | Direction | Width(bits) | Description |
---|---|---|---|---|---|
ACLK | input | 1 | 时钟 | ||
ARSTn | input | 1 | 复位,低有效 | ||
SLV_IOx | AW | AWID_slvx | output | AWID_WIDTH+2 | AW通道ID宽度,高2bit用于标记Master |
AWADDR_slvx | output | AWADDR_WIDTH | burst写事务第一个WDATA的地址 | ||
AWLEN_slvx | output | 8 | 该数值+1就表示此次写事务的WDATA个数 | ||
AWSIZE_slvx | output | 3 | WDATA中有效byte大小 | ||
AWBURST_slvx | output | 2 | burst传输类型 | ||
AWVALID_slvx | output | 1 | AW所有控制信息有效 | ||
AWREADY_slvx | input | 1 | AW所有控制信息准备接收 | ||
W | WDATA_slvx | output | WDATA_WIDTH | 写数据 | |
WLAST_slvx | output | 1 | 写事务中的最后一个写数据 | ||
WVALID_slvx | output | 1 | W通道所有数据信息有效 | ||
WREADY_slvx | input | 1 | W通道所有数据信息准备接收 | ||
AR | ARID_slvx | output | ARID_WIDTH+2 | 读事务ID,高2bit用于标记Master | |
ARADDR_slvx | output | ARADDR_WIDTH | burst读事务第一个读传输地址 | ||
ARLEN_slvx | output | 8 | 该数值+1就表示此次读事务的RDATA个数 | ||
ARSIZE_slvx | output | 3 | RDATA中有效byte大小 | ||
ARBURST_slvx | output | 2 | burst传输类型 | ||
ARVALID_slvx | output | 1 | AR通道所有控制信息有效 | ||
ARREADY_slvx | input | 1 | AR通道所有控制信息准备接收 | ||
R | RID_slvx | input | RID_WIDTH+2 | 读事务ID,高2bit用于标记Master | |
RDATA_slvx | input | RDATA_WIDTH | 读数据 | ||
RRESP_slvx | input | 2 | 读反馈,表明读传输的状态 | ||
RLAST_slvx | input | 1 | 读事务中的最后一个读数据 | ||
RVALID_slvx | input | 1 | R通道所有数据信息有效 | ||
RREADY_slvx | output | 1 | R通道所有数据信息准备接收 | ||
B | BID_slvx | input | BID_WIDTH+2 | 写事务ID,高2bit用于标记Master | |
BRESP_slvx | input | 2 | 写响应 | ||
BVALID_slvx | input | 1 | B通道所有写反馈信息有效 | ||
BREADY_slvx | output | 1 | B通道所有写反馈信息准备接收 |
Parameter | Units | Description |
---|---|---|
AWID_WIDTH | bit | AW通道ID宽度 |
AWADDR_WIDTH | bit | AW通道地址宽度 |
WDATA_WIDTH | bit | W通道数据宽度 |
ARID_WIDTH | bit | AR通道ID宽度 |
ARADDR_WIDTH | bit | AR通道地址宽度 |
RID_WIDTH | bit | R通道ID宽度 |
RDATA_WIDTH | bit | R通道数据宽度 |
BID_WIDTH | bit | B通道ID宽度 |
2.2. decoder
解码器的作用根据awaddr的高2bit或araddr的高2bit来片选访问的axi slave,那么如何表示片选到这个slave呢?
这里给出的思路是,AW、W和AR通道的控制信息实体或数据实体直接连接到每一个arbiter上,decoder只需通过valid信号表明片选。即
而R、B通道则需要片选结果将相应的控制信息、数据信息输入给AXI Master
Channel | Signal | Direction | Width(bits) | Description |
---|---|---|---|---|
ACLK | input | 1 | 时钟 | |
ARSTn | input | 1 | 复位,低有效 | |
AW | AWSEL | input | 2 | 即AWADDR的高2bit,用于片选 axi slave |
AWVALID | input | 1 | AW所有控制信息有效 | |
AWREADY | output | 1 | AW所有控制信息准备接收 | |
AWVALID_slv | output | 4 | 输出给axi slave的awvalid | |
AWREADY_slv | input | 4 | 输出给axi slave的awready | |
W | WVALID | input | 1 | W通道所有数据信息有效 |
WREADY | output | 1 | W通道所有数据信息准备接收 | |
WVALID_slv | input | 4 | 输入给axi slave的wvalid | |
WREADY_slv | output | 4 | 输入给axi slave的wready | |
AR | ARSEL | input | 2 | 为araddr的高2bit |
ARVALID | input | 1 | AR通道所有控制信息有效 | |
ARREADY | output | 1 | AR通道所有控制信息准备接收 | |
ARVALID_slv | input | 4 | 输入给axi slave的arvalid | |
ARREADY_slv | output | 4 | 输入给axi slave的arready | |
R | RID | output | RID_WIDTH | axi slave发来的R通道ID |
RDATA | output | RDATA_WIDTH | axi slave发来的R通道读数据 | |
RRESP | output | 2 | axi slave发来的R通道反馈信息 | |
RLAST | output | 1 | axi slave发来的R通道最后一个数据有效 | |
RVALID | output | 1 | R通道所有数据信息有效 | |
RREADY | input | 1 | R通道所有数据信息准备接收 | |
RID_slv | input | RID_WIDTH×4 | axi slave发来的R通道ID | |
RDATA_slv | input | RDATA_WIDTH×4 | axi slave发来的R通道读数据 | |
RRESP_slv | input | 2×4 | axi slave发来的R通道反馈信息 | |
RLAST_slv | input | 1×4 | axi slave发来的R通道最后一个数据有效 | |
RVALID_slv | input | 4 | axi slave发来的R通道有效标志 | |
RREADY_slv | output | 4 | 向axi slave输入的R通道准备标志 | |
B | BID | output | BID_WIDTH | axi slave发来的B通道ID |
BRESP | output | 2 | axi slave发来的B通道反馈信息 | |
BVALID | output | 1 | B通道所有写反馈信息有效 | |
BREADY | input | 1 | B通道所有写反馈信息准备接收 | |
BID_slv | input | BID_WIDTH×4 | axi slave发来的B通道ID | |
BRESP_slv | input | 2×4 | axi slave发来的B通道反馈信息 | |
BVALID_slv | input | 4 | axi slave发来的B通道信息有效 | |
BREADY_slv | output | 4 | 输入给axi slave的B通道准备 |
Parameter | Units | Description |
---|---|---|
RID_WIDTH | bit | AXI R通道的ID位宽 |
RDATA_WIDTH | bit | AXI R通道的读数据位宽 |
BID_WIDTH | bit | AXI B通道的ID位宽 |
2.3. axi_round_robin_arbiter
此处的arbiter与decoder功能类似的,只不过arbiter的片选不是axi slave控制,而是根据轮询算法控制
对于B、R通道的控制信息和数据信息直接连接在每一个decoder上,arbiter只需控制valid和ready即可表示仲裁。
而AW、W和AR通道则需要根据仲裁结果片选相应的信号输出给AXI Slave
Channel | Signal | Direction | Width(bits) | Description |
---|---|---|---|---|
ACLK | input | 1 | 时钟 | |
ARSTn | input | 1×4 | 复位,低有效 | |
AW | AWID_mst | input | (AWID_WIDTH+2)×4 | 写事务ID,高2bit用于标记Master |
AWADDR_mst | input | AWADDR_WIDTH×4 | burst写事务第一个WDATA的地址 | |
AWLEN_mst | input | 8×4 | 该数值+1就表示此次写事务的WDATA个数 | |
AWSIZE_mst | input | 3×4 | WDATA中有效byte大小 | |
AWBURST_mst | input | 2×4 | burst传输类型 | |
AWVALID_mst | input | 1×4 | 各axi master输入的awvalid | |
AWREADY_mst | output | 1×4 | 输出给各axi master的awready | |
AWID | output | AWID_WIDTH | 写事务ID | |
AWADDR | output | AWADDR_WIDTH | burst写事务第一个WDATA的地址 | |
AWLEN | output | 8 | 该数值+1就表示此次写事务的WDATA个数 | |
AWSIZE | output | 3 | WDATA中有效byte大小 | |
AWBURST | output | 2 | burst传输类型 | |
AWVALID | output | 1 | 输入给axi slave的awvalid | |
AWREADY | input | 1 | 输入给axi slave的awready |
Channel | Signal | Direction | Width(bits) | Description |
---|---|---|---|---|
W | WDATA_mst | input | WDATA_WIDTH×4 | 写数据 |
WLAST_mst | input | 1×4 | 写事务中的最后一个写数据 | |
WVALID_mst | input | 1×4 | 各axi master输入的wvalid | |
WREADY_mst | output | 1×4 | 输入给各axi master的wready | |
WDATA | output | WDATA_WIDTH | 写数据 | |
WLAST | output | 1 | 写事务中的最后一个写数据 | |
WVALID | output | 1 | W通道所有数据信息有效 | |
WREADY | input | 1 | W通道所有数据信息准备接收 |
Channel | Signal | Direction | Width(bits) | Description |
---|---|---|---|---|
AR | ARID_mst | input | (ARID_WIDTH+2)×4 | 读事务ID,高2bit用于标记Master |
ARADDR_mst | input | ARADDR_WIDTH×4 | burst读事务第一个读传输地址 | |
ARLEN_mst | input | 8×4 | 该数值+1就表示此次读事务的RDATA个数 | |
ARSIZE_mst | input | 3×4 | RDATA中有效byte大小 | |
ARBURST_mst | input | 2×4 | burst传输类型 | |
ARVALID_mst | input | 1×4 | AR通道所有控制信息有效 | |
ARREADY_mst | output | 1×4 | AR通道所有控制信息准备接收 | |
ARADDR | output | ARADDR_WIDTH | burst读事务第一个读传输地址 | |
ARLEN | output | 8 | 该数值+1就表示此次读事务的RDATA个数 | |
ARSIZE | output | 3 | RDATA中有效byte大小 | |
ARBURST | output | 2 | burst传输类型 | |
ARVALID | output | 1 | 给axi slave输入的arvalid | |
ARREADY | input | 1 | 输入给axi slave的arready |
Channel | Signal | Direction | Width(bits) | Description |
---|---|---|---|---|
R | RSEL | input | 2 | RID的高2bit,用于片选axi master |
RVALID | input | 1 | R通道所有数据信息有效 | |
RREADY | output | 1 | R通道所有数据信息准备接收 | |
RVALID_mst | output | 4 | 输入给各axi master发来的R通道有效标志 | |
RREADY_mst | input | 4 | 各axi master输出的R通道准备标志 |
Channel | Signal | Direction | Width(bits) | Description |
---|---|---|---|---|
B | BSEL | input | 2 | BID的高2bit,用于片选axi master |
BVALID | input | 1 | B通道所有写反馈信息有效 | |
BREADY | output | 1 | B通道所有写反馈信息准备接收 | |
BVALID_mst | output | 4 | 输入给各axi master发来的B通道信息有效 | |
BREADY_mst | input | 4 | 给axi master输出的B通道准备 |
Parameter | Units | Description |
---|---|---|
AWID_WIDTH | bit | AXI AW通道的ID位宽 |
AWADDR_WIDTH | bit | AXI AW通道的地址位宽 |
WDATA_WIDTH | bit | AXI W通道的数据位宽 |
ARID_WIDTH | bit | AXI AR通道的ID位宽 |
ARADDR_WIDTH | bit | AXI AR通道的地址位宽 |
3. 逻辑设计
AXI_Bus_Matrix_4x4 设计 - 逻辑设计部分
4. 测试
由于decoder完成的就是片选功能,因此不作单独测试
4.1. axi_round_robin_arbiter
solo测试
主要用于AXI协议的solo测试,只有一个axi master和axi slave进行通信,先写再读
先上transcript,可见读写握手均成功
然后是各通道的波形,这里只展示master这一端
●
可见当握手成功后,优先级发生了改变
●
从grant FIFO中读出grant就开始握手,当握手完成后,就开始读新的grant。构成了AW CHANNEL和W CHANNEL的流水
●
注意此处bid_mst表示的是4个axi master 的输入bid拼接,即axi slave将bid和bresp直连到每一个axi master了
●
这个与AW通道逻辑类似
●
这个与B CHANNEL类似
3v1写测试
主要用于对多个AXI MASTER仲裁功能的测试,即令索引为0、2、3的AXI Master同时请求写时,仲裁调度功能能够如期实现。
先上transcript
与AXI Master 0握手成功: 与AXI Master 2握手成功: 与AXI Master 3握手成功:
然后是各通道的波形:
●
如下图所示, 初始时最高优先级是Master0,故先让它完成AW 通道握手。之后最高优先级为Master1,但是Master1的awvalid为0,所以grant赋予了Master2,等到AXI Slave的awready为高时就与AXI Master2握手。
最终与AXI Master3握手(图中未画出)完成测试
注意此处设定是AXI Slave完成AW通道握手之后awready拉低,等到B通道握手完成后awready拉高。实际应用中则不是这样,而是在AXI Slave中加入一个FIFO缓存AW通道控制信号,并且将FIFO的full取非后作为awready信号。
●
如图所示,从FIFO中读出grant为4’b0001之后,开始与AXI Master0握手,当wlast[0]为高时表示握手成功,继续读新的grant
●
这个就是纯粹的片选
3v1读测试
用于对多个AXI MASTER仲裁功能的测试,即令索引为0、1、3的AXI Master同时请求读时,仲裁调度功能能够如期实现。
此处略去波形图
4.2. axi_bus_matrix_4x4
4v1写测试
多个AXI MASTER仲裁功能的测试,即令索引为0、1、2、3的AXI Master同时请求写时,总线矩阵能否如期写入
设定的测试用例如下
AXI Master 0:
awid = 8'd0,
awaddr = 8'h00,
awlen = 8'd4,
awsize = 3'd2,
awburst = 2'd2,
wdata = 32'd0,32'd1,...,32'd3
AXI Master 1:
awid = 8'd10,
awaddr = 8'h10,
awlen = 8'd5,
awsize = 3'd2,
awburst = 2'd2,
wdata = 32'd4,32'd5,...,32'd8
AXI Master 2:
awid = 8'd20,
awaddr = 8'h20,
awlen = 8'd6,
awsize = 3'd2,
awburst = 2'd2,
wdata = 32'd9,32'd10,...,32'd14
AXI Master 3:
awid = 8'd30,
awaddr = 8'h30,
awlen = 8'd7,
awsize = 3'd2,
awburst = 2'd2,
wdata = 32'd15,32'd16,...,32'd21
测试transcript如下
从transcript中可以看到AXI Master0、1、2、3依次与Slave0完成AW握手,并且Slave0成功将W通道的数据计入FIFO,后根据awlen再从FIFO中读出并通过B通道与正确的AXI Master完成写反馈握手。
需要说明的是tb中slave的逻辑:这里的slave逻辑与axi_round_robin_arbiter_tb中的slave逻辑不同,此处的slave在AW通道和W通道分别设置AW_FIFO和W_FIFO(用mailbox实现)不断收集这两个通道的数据。如果能够读出AW_FIFO值的话,状态机启动,并根据awlen信号从W_FIFO读出数据,读出成功则通过B通道给一个反馈。
真正的Slave模块也可以这么设计
4v4写测试
未完待续