一、接口背景介紹
標準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:固定為高電平