一、接口背景介绍
标准AXI4接口
AXI4(Advanced eXtensible Interface 4)是ARM公司制定的AMBA 4.0规范的一部分,广泛应用于高性能SoC设计中。标准AXI4协议提供了完整的信号集合,支持复杂的突发传输、乱序处理和多ID并发,能够满足CPU、GPU等高性能设备的互连需求。
紫光DDR IP的Simplified AXI4接口
紫光同创在其DDR控制器IP中采用了Simplified AXI4接口,这是一种针对内存访问场景优化的简化版本。相比标准AXI4,它减少了部分复杂特性,降低了实现复杂度和资源消耗,同时保持了足够的性能来满足DDR内存访问需求。
二、接口信号差异对比
写通道信号对比
信号名称 | 标准AXI4 | 紫光Simplified AXI4 | 位宽差异 | 信号含义 |
---|---|---|---|---|
地址信号 | awaddr[31:0] |
bist_axi_awaddr[31:0] |
相同 | 写地址 |
传输长度 | awlen[7:0] |
bist_axi_awlen[3:0] |
8位→4位 | 突发长度,简化版最大支持16次传输 |
传输ID | awid[7:0] |
bist_axi_awuser_id[3:0] |
8位→4位 | 传输标识,简化版降低路由复杂度 |
传输大小 | awsize[2:0] |
❌ 缺失 | - | 每次传输的字节数,简化版省略 |
突发类型 | awburst[1:0] |
❌ 缺失 | - | 突发模式,简化版固定为INCR |
用户信号 | 标准无 | bist_axi_awuser_ap |
新增1位 | 紫光自定义的用户信号 |
数据信号 | wdata[255:0] |
bist_axi_wdata[127:0] |
256位→128位 | 写数据,宽度与DDR接口匹配 |
字节使能 | wstrb[31:0] |
bist_axi_wstrb[15:0] |
32位→16位 | 字节写使能,对应数据宽度 |
最后传输 | wlast |
❌ 缺失 | - | 最后一次传输指示,简化版通过计数判断 |
读通道信号对比
信号名称 | 标准AXI4 | 紫光Simplified AXI4 | 位宽差异 | 信号含义 |
---|---|---|---|---|
地址信号 | araddr[31:0] |
bist_axi_araddr[31:0] |
相同 | 读地址 |
传输长度 | arlen[7:0] |
bist_axi_arlen[3:0] |
8位→4位 | 读突发长度 |
传输ID | arid[7:0] |
bist_axi_aruser_id[3:0] |
8位→4位 | 读传输标识 |
数据返回 | rdata[255:0] |
bist_axi_rdata[127:0] |
256位→128位 | 读数据 |
最后数据 | rlast |
❌ 缺失 | - | 最后一次读数据指示 |
读响应 | rresp[1:0] |
简化处理 | - | 读响应信号 |
关键信号含义解释
- awlen/arlen:突发传输长度-1,标准AXI4支持1-256次传输,简化版支持1-16次
- awsize/arsize:每次传输的字节大小,2^size字节,简化版通过数据宽度固定
- awburst/arburst:突发类型(FIXED/INCR/WRAP),简化版固定为INCR(递增)
- wlast/rlast:指示突发传输的最后一拍,简化版通过内部计数器实现
三、接口转换机制解析
基于代码分析,转换模块主要通过以下机制实现两种接口的桥接:
3.1 参数化设计
parameter DATA_WIDTH_MUL = MEM_DQ_WIDTH*8/AXI_DATA_WIDTH;
parameter LEN_SHIFT = (DATA_WIDTH_MUL == 1) ? 0 :
(DATA_WIDTH_MUL == 2) ? 1 : 2;
通过计算数据宽度比例,自动确定长度转换的移位量。
3.2 长度转换算法
assign axi_awlen_a = ({5'b0,bist_axi_awlen_d1} + 9'd1) << LEN_SHIFT;
assign axi_awlen_b = axi_awlen_a - 9'b1;
assign axi_awlen = axi_awlen_b[7:0];
转换步骤:
- 将简化接口的4位长度扩展为9位
- 加1得到实际传输次数
- 根据数据宽度比例左移(LEN_SHIFT)
- 减1转换为AXI4的len格式
3.3 地址对齐处理
parameter AXI_ADDR_SHIFT = (MEM_DQ_WIDTH == 16) ? 1 :
(MEM_DQ_WIDTH == 32) ? 2 : 3;
assign axi_awaddr = {bist_axi_awaddr_d1,{AXI_ADDR_SHIFT{1'b0}}};
根据内存数据宽度自动进行地址对齐,确保地址符合AXI4传输要求。
3.4 数据宽度转换
转换模块使用了两个关键的FIFO来处理数据宽度差异:
写数据FIFO:
- 输入:窄数据宽度 (MEM_DQ_WIDTH*8)
- 输出:宽数据宽度 (AXI_DATA_WIDTH)
- 功能:将多个窄数据合并为宽数据
读数据FIFO:
- 输入:宽数据宽度 (AXI_DATA_WIDTH)
- 输出:窄数据宽度 (MEM_DQ_WIDTH*8)
- 功能:将宽数据拆分为多个窄数据
3.5 流控同步机制
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
wr_align_done <= 1;
else if(bist_axi_awready & bist_axi_awvalid)
wr_align_done <= 0;
else if(axi_wready & axi_wvalid & (axi_wdata_cnt == axi_awlen))
wr_align_done <= 1;
end
通过wr_align_done
信号协调两个接口的握手时序:
- 简化接口发起传输时,禁止新的传输请求
- 标准AXI4传输完成后,重新使能简化接口
- 确保数据传输的完整性和一致性
3.6 信号映射与补全
转换模块还负责补全简化接口缺失的标准AXI4信号:
axi_awsize/axi_arsize
:根据数据宽度自动设置axi_awburst/axi_arburst
:固定设置为INCR模式axi_wlast
:通过内部计数器生成axi_bready
:固定为高电平