rtl: re-factor dma for new ifaces

This commit is contained in:
Phil
2026-06-11 17:03:37 +03:00
parent 7bafa8534f
commit 0933768537

View File

@ -1,12 +1,10 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
// //
// Thin SystemVerilog interface wrapper around alexforencich/verilog-axi axi_dma.v. // SystemVerilog interface wrapper around alexforencich/verilog-axi axi_dma.v.
// //
// Policy used here: // AXI memory, AXI-Stream data, DMA descriptor, and DMA status channels are all
// * AXI memory master is exposed as axi4_if.master. // exposed through compact interfaces. The original Forencich core remains
// * AXI-Stream read/write data paths are exposed as axis_if master/slave. // untouched and is connected through local flat wires.
// * Descriptor and status channels remain flat because they are DMA-specific
// command/status streams, not generic AXI-Stream data interfaces.
`default_nettype none `default_nettype none
@ -38,23 +36,14 @@ module axi_dma_if_wrapper #(
input logic rst, input logic rst,
/* /*
* AXI read descriptor input, kept flat intentionally. * AXI read descriptor input.
*/ */
input logic [AXI_ADDR_WIDTH-1:0] s_axis_read_desc_addr, axi_dma_read_desc_if.slave s_axis_read_desc,
input logic [LEN_WIDTH-1:0] s_axis_read_desc_len,
input logic [TAG_WIDTH-1:0] s_axis_read_desc_tag,
input logic [AXIS_ID_WIDTH-1:0] s_axis_read_desc_id,
input logic [AXIS_DEST_WIDTH-1:0] s_axis_read_desc_dest,
input logic [AXIS_USER_WIDTH-1:0] s_axis_read_desc_user,
input logic s_axis_read_desc_valid,
output logic s_axis_read_desc_ready,
/* /*
* AXI read descriptor status output, kept flat intentionally. * AXI read descriptor status output.
*/ */
output logic [TAG_WIDTH-1:0] m_axis_read_desc_status_tag, axi_dma_read_desc_status_if.master m_axis_read_desc_status,
output logic [3:0] m_axis_read_desc_status_error,
output logic m_axis_read_desc_status_valid,
/* /*
* AXI stream read data output. * AXI stream read data output.
@ -62,24 +51,14 @@ module axi_dma_if_wrapper #(
axis_if.master m_axis_read_data, axis_if.master m_axis_read_data,
/* /*
* AXI write descriptor input, kept flat intentionally. * AXI write descriptor input.
*/ */
input logic [AXI_ADDR_WIDTH-1:0] s_axis_write_desc_addr, axi_dma_write_desc_if.slave s_axis_write_desc,
input logic [LEN_WIDTH-1:0] s_axis_write_desc_len,
input logic [TAG_WIDTH-1:0] s_axis_write_desc_tag,
input logic s_axis_write_desc_valid,
output logic s_axis_write_desc_ready,
/* /*
* AXI write descriptor status output, kept flat intentionally. * AXI write descriptor status output.
*/ */
output logic [LEN_WIDTH-1:0] m_axis_write_desc_status_len, axi_dma_write_desc_status_if.master m_axis_write_desc_status,
output logic [TAG_WIDTH-1:0] m_axis_write_desc_status_tag,
output logic [AXIS_ID_WIDTH-1:0] m_axis_write_desc_status_id,
output logic [AXIS_DEST_WIDTH-1:0] m_axis_write_desc_status_dest,
output logic [AXIS_USER_WIDTH-1:0] m_axis_write_desc_status_user,
output logic [3:0] m_axis_write_desc_status_error,
output logic m_axis_write_desc_status_valid,
/* /*
* AXI stream write data input. * AXI stream write data input.
@ -103,6 +82,33 @@ module axi_dma_if_wrapper #(
// Flat wires connected to original alexforencich axi_dma.v // Flat wires connected to original alexforencich axi_dma.v
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
logic [AXI_ADDR_WIDTH-1:0] dma_s_axis_read_desc_addr;
logic [LEN_WIDTH-1:0] dma_s_axis_read_desc_len;
logic [TAG_WIDTH-1:0] dma_s_axis_read_desc_tag;
logic [AXIS_ID_WIDTH-1:0] dma_s_axis_read_desc_id;
logic [AXIS_DEST_WIDTH-1:0] dma_s_axis_read_desc_dest;
logic [AXIS_USER_WIDTH-1:0] dma_s_axis_read_desc_user;
logic dma_s_axis_read_desc_valid;
logic dma_s_axis_read_desc_ready;
logic [TAG_WIDTH-1:0] dma_m_axis_read_desc_status_tag;
logic [3:0] dma_m_axis_read_desc_status_error;
logic dma_m_axis_read_desc_status_valid;
logic [AXI_ADDR_WIDTH-1:0] dma_s_axis_write_desc_addr;
logic [LEN_WIDTH-1:0] dma_s_axis_write_desc_len;
logic [TAG_WIDTH-1:0] dma_s_axis_write_desc_tag;
logic dma_s_axis_write_desc_valid;
logic dma_s_axis_write_desc_ready;
logic [LEN_WIDTH-1:0] dma_m_axis_write_desc_status_len;
logic [TAG_WIDTH-1:0] dma_m_axis_write_desc_status_tag;
logic [AXIS_ID_WIDTH-1:0] dma_m_axis_write_desc_status_id;
logic [AXIS_DEST_WIDTH-1:0] dma_m_axis_write_desc_status_dest;
logic [AXIS_USER_WIDTH-1:0] dma_m_axis_write_desc_status_user;
logic [3:0] dma_m_axis_write_desc_status_error;
logic dma_m_axis_write_desc_status_valid;
logic [AXIS_DATA_WIDTH-1:0] dma_m_axis_read_data_tdata; logic [AXIS_DATA_WIDTH-1:0] dma_m_axis_read_data_tdata;
logic [AXIS_KEEP_WIDTH-1:0] dma_m_axis_read_data_tkeep; logic [AXIS_KEEP_WIDTH-1:0] dma_m_axis_read_data_tkeep;
logic dma_m_axis_read_data_tvalid; logic dma_m_axis_read_data_tvalid;
@ -190,18 +196,18 @@ module axi_dma_if_wrapper #(
.clk (clk), .clk (clk),
.rst (rst), .rst (rst),
.s_axis_read_desc_addr (s_axis_read_desc_addr), .s_axis_read_desc_addr (dma_s_axis_read_desc_addr),
.s_axis_read_desc_len (s_axis_read_desc_len), .s_axis_read_desc_len (dma_s_axis_read_desc_len),
.s_axis_read_desc_tag (s_axis_read_desc_tag), .s_axis_read_desc_tag (dma_s_axis_read_desc_tag),
.s_axis_read_desc_id (s_axis_read_desc_id), .s_axis_read_desc_id (dma_s_axis_read_desc_id),
.s_axis_read_desc_dest (s_axis_read_desc_dest), .s_axis_read_desc_dest (dma_s_axis_read_desc_dest),
.s_axis_read_desc_user (s_axis_read_desc_user), .s_axis_read_desc_user (dma_s_axis_read_desc_user),
.s_axis_read_desc_valid (s_axis_read_desc_valid), .s_axis_read_desc_valid (dma_s_axis_read_desc_valid),
.s_axis_read_desc_ready (s_axis_read_desc_ready), .s_axis_read_desc_ready (dma_s_axis_read_desc_ready),
.m_axis_read_desc_status_tag (m_axis_read_desc_status_tag), .m_axis_read_desc_status_tag (dma_m_axis_read_desc_status_tag),
.m_axis_read_desc_status_error (m_axis_read_desc_status_error), .m_axis_read_desc_status_error (dma_m_axis_read_desc_status_error),
.m_axis_read_desc_status_valid (m_axis_read_desc_status_valid), .m_axis_read_desc_status_valid (dma_m_axis_read_desc_status_valid),
.m_axis_read_data_tdata (dma_m_axis_read_data_tdata), .m_axis_read_data_tdata (dma_m_axis_read_data_tdata),
.m_axis_read_data_tkeep (dma_m_axis_read_data_tkeep), .m_axis_read_data_tkeep (dma_m_axis_read_data_tkeep),
@ -212,19 +218,19 @@ module axi_dma_if_wrapper #(
.m_axis_read_data_tdest (dma_m_axis_read_data_tdest), .m_axis_read_data_tdest (dma_m_axis_read_data_tdest),
.m_axis_read_data_tuser (dma_m_axis_read_data_tuser), .m_axis_read_data_tuser (dma_m_axis_read_data_tuser),
.s_axis_write_desc_addr (s_axis_write_desc_addr), .s_axis_write_desc_addr (dma_s_axis_write_desc_addr),
.s_axis_write_desc_len (s_axis_write_desc_len), .s_axis_write_desc_len (dma_s_axis_write_desc_len),
.s_axis_write_desc_tag (s_axis_write_desc_tag), .s_axis_write_desc_tag (dma_s_axis_write_desc_tag),
.s_axis_write_desc_valid (s_axis_write_desc_valid), .s_axis_write_desc_valid (dma_s_axis_write_desc_valid),
.s_axis_write_desc_ready (s_axis_write_desc_ready), .s_axis_write_desc_ready (dma_s_axis_write_desc_ready),
.m_axis_write_desc_status_len (m_axis_write_desc_status_len), .m_axis_write_desc_status_len (dma_m_axis_write_desc_status_len),
.m_axis_write_desc_status_tag (m_axis_write_desc_status_tag), .m_axis_write_desc_status_tag (dma_m_axis_write_desc_status_tag),
.m_axis_write_desc_status_id (m_axis_write_desc_status_id), .m_axis_write_desc_status_id (dma_m_axis_write_desc_status_id),
.m_axis_write_desc_status_dest (m_axis_write_desc_status_dest), .m_axis_write_desc_status_dest (dma_m_axis_write_desc_status_dest),
.m_axis_write_desc_status_user (m_axis_write_desc_status_user), .m_axis_write_desc_status_user (dma_m_axis_write_desc_status_user),
.m_axis_write_desc_status_error (m_axis_write_desc_status_error), .m_axis_write_desc_status_error (dma_m_axis_write_desc_status_error),
.m_axis_write_desc_status_valid (m_axis_write_desc_status_valid), .m_axis_write_desc_status_valid (dma_m_axis_write_desc_status_valid),
.s_axis_write_data_tdata (dma_s_axis_write_data_tdata), .s_axis_write_data_tdata (dma_s_axis_write_data_tdata),
.s_axis_write_data_tkeep (dma_s_axis_write_data_tkeep), .s_axis_write_data_tkeep (dma_s_axis_write_data_tkeep),
@ -280,6 +286,68 @@ module axi_dma_if_wrapper #(
.write_abort (write_abort) .write_abort (write_abort)
); );
// local read descriptor interface -> DMA flat input
axi_dma_read_desc_if_to_flat #(
.ADDR_W (AXI_ADDR_WIDTH),
.LEN_W (LEN_WIDTH),
.TAG_W (TAG_WIDTH),
.ID_W (AXIS_ID_WIDTH),
.DEST_W (AXIS_DEST_WIDTH),
.USER_W (AXIS_USER_WIDTH)
) u_s_axis_read_desc_if_to_flat (
.s_axis_read_desc (s_axis_read_desc),
.m_axis_read_desc_addr (dma_s_axis_read_desc_addr),
.m_axis_read_desc_len (dma_s_axis_read_desc_len),
.m_axis_read_desc_tag (dma_s_axis_read_desc_tag),
.m_axis_read_desc_id (dma_s_axis_read_desc_id),
.m_axis_read_desc_dest (dma_s_axis_read_desc_dest),
.m_axis_read_desc_user (dma_s_axis_read_desc_user),
.m_axis_read_desc_valid (dma_s_axis_read_desc_valid),
.m_axis_read_desc_ready (dma_s_axis_read_desc_ready)
);
// DMA read descriptor status flat output -> local status interface
axi_dma_read_desc_status_flat_to_if #(
.TAG_W (TAG_WIDTH)
) u_m_axis_read_desc_status_flat_to_if (
.m_axis_read_desc_status_tag (dma_m_axis_read_desc_status_tag),
.m_axis_read_desc_status_error (dma_m_axis_read_desc_status_error),
.m_axis_read_desc_status_valid (dma_m_axis_read_desc_status_valid),
.m_axis_read_desc_status (m_axis_read_desc_status)
);
// local write descriptor interface -> DMA flat input
axi_dma_write_desc_if_to_flat #(
.ADDR_W (AXI_ADDR_WIDTH),
.LEN_W (LEN_WIDTH),
.TAG_W (TAG_WIDTH)
) u_s_axis_write_desc_if_to_flat (
.s_axis_write_desc (s_axis_write_desc),
.m_axis_write_desc_addr (dma_s_axis_write_desc_addr),
.m_axis_write_desc_len (dma_s_axis_write_desc_len),
.m_axis_write_desc_tag (dma_s_axis_write_desc_tag),
.m_axis_write_desc_valid (dma_s_axis_write_desc_valid),
.m_axis_write_desc_ready (dma_s_axis_write_desc_ready)
);
// DMA write descriptor status flat output -> local status interface
axi_dma_write_desc_status_flat_to_if #(
.LEN_W (LEN_WIDTH),
.TAG_W (TAG_WIDTH),
.ID_W (AXIS_ID_WIDTH),
.DEST_W (AXIS_DEST_WIDTH),
.USER_W (AXIS_USER_WIDTH)
) u_m_axis_write_desc_status_flat_to_if (
.m_axis_write_desc_status_len (dma_m_axis_write_desc_status_len),
.m_axis_write_desc_status_tag (dma_m_axis_write_desc_status_tag),
.m_axis_write_desc_status_id (dma_m_axis_write_desc_status_id),
.m_axis_write_desc_status_dest (dma_m_axis_write_desc_status_dest),
.m_axis_write_desc_status_user (dma_m_axis_write_desc_status_user),
.m_axis_write_desc_status_error (dma_m_axis_write_desc_status_error),
.m_axis_write_desc_status_valid (dma_m_axis_write_desc_status_valid),
.m_axis_write_desc_status (m_axis_write_desc_status)
);
// DMA read data flat output -> local axis_if.master // DMA read data flat output -> local axis_if.master
axis_flat_to_if #( axis_flat_to_if #(
.DATA_W (AXIS_DATA_WIDTH), .DATA_W (AXIS_DATA_WIDTH),