Optimize matmul DMA with chained 256-beat bursts
This commit is contained in:
@@ -481,10 +481,19 @@ module matmul_axi_slave (
|
||||
localparam DMA_RD_ADDR = 2'd1;
|
||||
localparam DMA_RD_DATA = 2'd2;
|
||||
reg [1:0] dma_rd_state;
|
||||
reg [4:0] dma_rd_count;
|
||||
reg [7:0] dma_rd_count;
|
||||
reg dma_rd_bank;
|
||||
wire [4:0] dma_rd_group_word_idx = dma_rd_count[4:0];
|
||||
wire [3:0] dma_rd_word_idx = dma_rd_count[3:0];
|
||||
wire dma_rd_fill_bank = dma_rd_bank ^ dma_rd_count[5];
|
||||
wire dma_rd_commit = (dma_rd_state == DMA_RD_DATA) && m_axi_rvalid && m_axi_rready;
|
||||
wire dma_bank0_free = !bank_loaded[0] && !bank_compute_pending[0] && !req_0 &&
|
||||
!(state == C_RUN && cur_bank == 1'b0);
|
||||
wire dma_bank1_free = !bank_loaded[1] && !bank_compute_pending[1] && !req_1 &&
|
||||
!(state == C_RUN && cur_bank == 1'b1);
|
||||
wire dma_load_bank_free = dma_load_bank ? dma_bank1_free : dma_bank0_free;
|
||||
wire dma_rd_fill_bank_free = dma_rd_fill_bank ? dma_bank1_free : dma_bank0_free;
|
||||
wire dma_rd_next_bank_free = dma_rd_fill_bank ? dma_bank0_free : dma_bank1_free;
|
||||
|
||||
localparam DMA_WR_IDLE = 2'd0;
|
||||
localparam DMA_WR_ADDR = 2'd1;
|
||||
@@ -519,13 +528,13 @@ module matmul_axi_slave (
|
||||
dma_done_clear_pulse <= 1'b0;
|
||||
|
||||
if (dma_rd_commit) begin
|
||||
if (dma_rd_bank == 1'b0) begin
|
||||
if (dma_rd_count < 5'd16)
|
||||
if (dma_rd_fill_bank == 1'b0) begin
|
||||
if (dma_rd_group_word_idx < 5'd16)
|
||||
b0_a[dma_rd_word_idx] <= m_axi_rdata;
|
||||
else
|
||||
b0_b[dma_rd_word_idx] <= m_axi_rdata;
|
||||
end else begin
|
||||
if (dma_rd_count < 5'd16)
|
||||
if (dma_rd_group_word_idx < 5'd16)
|
||||
b1_a[dma_rd_word_idx] <= m_axi_rdata;
|
||||
else
|
||||
b1_b[dma_rd_word_idx] <= m_axi_rdata;
|
||||
@@ -960,7 +969,7 @@ module matmul_axi_slave (
|
||||
dma_load_bank <= 1'b0;
|
||||
dma_store_bank <= 1'b0;
|
||||
dma_rd_state <= DMA_RD_IDLE;
|
||||
dma_rd_count <= 5'd0;
|
||||
dma_rd_count <= 8'd0;
|
||||
dma_rd_bank <= 1'b0;
|
||||
dma_wr_state <= DMA_WR_IDLE;
|
||||
dma_wr_count <= 6'd0;
|
||||
@@ -1058,14 +1067,12 @@ module matmul_axi_slave (
|
||||
DMA_RD_IDLE: begin
|
||||
m_axi_arvalid <= 1'b0;
|
||||
m_axi_rready <= 1'b0;
|
||||
if (dma_busy && load_group < dma_groups && !bank_loaded[dma_load_bank] &&
|
||||
!bank_compute_pending[dma_load_bank] &&
|
||||
!((dma_load_bank == 1'b0) ? req_0 : req_1) &&
|
||||
!(state == C_RUN && cur_bank == dma_load_bank)) begin
|
||||
if (dma_busy && load_group < dma_groups && dma_load_bank_free) begin
|
||||
dma_rd_bank <= dma_load_bank;
|
||||
dma_rd_count <= 5'd0;
|
||||
dma_rd_count <= 8'd0;
|
||||
m_axi_araddr <= dma_next_rd_addr;
|
||||
m_axi_arlen <= 8'd31;
|
||||
m_axi_arlen <= ((dma_src_stride == 32'd128) &&
|
||||
((dma_groups - load_group) >= 32'd8)) ? 8'd255 : 8'd31;
|
||||
m_axi_arsize <= 3'd2;
|
||||
m_axi_arburst <= 2'b01;
|
||||
m_axi_arvalid <= 1'b1;
|
||||
@@ -1080,16 +1087,54 @@ module matmul_axi_slave (
|
||||
end
|
||||
end
|
||||
DMA_RD_DATA: begin
|
||||
if (!m_axi_rready && dma_rd_fill_bank_free)
|
||||
m_axi_rready <= 1'b1;
|
||||
|
||||
if (m_axi_rvalid && m_axi_rready) begin
|
||||
if (m_axi_rlast) begin
|
||||
m_axi_rready <= 1'b0;
|
||||
bank_loaded[dma_rd_bank] <= 1'b1;
|
||||
// Present the next request one beat early so the SRAM
|
||||
// slave can accept it together with the current RLAST.
|
||||
if ((dma_rd_count == 8'd254) && dma_busy &&
|
||||
((load_group + 32'd1) < dma_groups) && dma_rd_next_bank_free) begin
|
||||
m_axi_araddr <= dma_next_rd_addr + dma_src_stride;
|
||||
m_axi_arlen <= ((dma_src_stride == 32'd128) &&
|
||||
((dma_groups - (load_group + 32'd1)) >= 32'd8)) ?
|
||||
8'd255 : 8'd31;
|
||||
m_axi_arvalid <= 1'b1;
|
||||
end
|
||||
|
||||
if (dma_rd_group_word_idx == 5'd31) begin
|
||||
bank_loaded[dma_rd_fill_bank] <= 1'b1;
|
||||
load_group <= load_group + 32'd1;
|
||||
dma_next_rd_addr <= dma_next_rd_addr + dma_src_stride;
|
||||
dma_load_bank <= ~dma_load_bank;
|
||||
dma_rd_state <= DMA_RD_IDLE;
|
||||
end
|
||||
|
||||
if (m_axi_rlast) begin
|
||||
m_axi_rready <= 1'b0;
|
||||
if (dma_busy && ((load_group + 32'd1) < dma_groups) &&
|
||||
dma_rd_next_bank_free) begin
|
||||
dma_rd_bank <= ~dma_rd_fill_bank;
|
||||
dma_rd_count <= 8'd0;
|
||||
if (m_axi_arvalid && m_axi_arready) begin
|
||||
m_axi_arvalid <= 1'b0;
|
||||
m_axi_rready <= 1'b1;
|
||||
dma_rd_state <= DMA_RD_DATA;
|
||||
end else begin
|
||||
m_axi_araddr <= dma_next_rd_addr + dma_src_stride;
|
||||
m_axi_arlen <= ((dma_src_stride == 32'd128) &&
|
||||
((dma_groups - (load_group + 32'd1)) >= 32'd8)) ?
|
||||
8'd255 : 8'd31;
|
||||
m_axi_arvalid <= 1'b1;
|
||||
dma_rd_state <= DMA_RD_ADDR;
|
||||
end
|
||||
end else begin
|
||||
m_axi_arvalid <= 1'b0;
|
||||
dma_rd_state <= DMA_RD_IDLE;
|
||||
end
|
||||
end else begin
|
||||
dma_rd_count <= dma_rd_count + 5'd1;
|
||||
dma_rd_count <= dma_rd_count + 8'd1;
|
||||
if ((dma_rd_group_word_idx == 5'd31) && !dma_rd_next_bank_free)
|
||||
m_axi_rready <= 1'b0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user