summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_sp_batch.sv
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/gfx/gfx_sp_batch.sv')
-rw-r--r--rtl/gfx/gfx_sp_batch.sv53
1 files changed, 25 insertions, 28 deletions
diff --git a/rtl/gfx/gfx_sp_batch.sv b/rtl/gfx/gfx_sp_batch.sv
index 9c2c503..a2c13ee 100644
--- a/rtl/gfx/gfx_sp_batch.sv
+++ b/rtl/gfx/gfx_sp_batch.sv
@@ -24,12 +24,11 @@ module gfx_sp_batch
localparam TAIL_BITS = $clog2($bits(lane_mask)),
BLOCK_BITS = $bits(batch_length) - TAIL_BITS;
- logic fifo_down, fifo_up, lane_read, lane_readdatavalid, lane_waitrequest;
+ logic fifo_down_safe, lane_read, lane_readdatavalid, lane_waitrequest;
lane_word lane_readdata;
vram_lane_addr aligned_batch_base, lane_address;
logic[TAIL_BITS - 1:0] batch_length_tail, read_tail;
logic[BLOCK_BITS - 1:0] batch_length_block, fetch_block_count, read_block_count;
- logic[$clog2(`GFX_BATCH_FIFO_DEPTH + 1) - 1:0] fifo_pending;
struct packed
{
@@ -46,14 +45,10 @@ module gfx_sp_batch
assign out_data = fifo_out.data;
assign out_mask = fifo_out.mask;
- assign fifo_up = out_ready && out_valid;
- assign fifo_down = lane_read && !lane_waitrequest;
assign fifo_in.data = lane_readdata;
assign {batch_length_block, batch_length_tail} = batch_length;
- assign aligned_batch_base = batch_base[
- $bits(batch_base) - 1:$bits(batch_base) - $bits(vram_lane_addr)
- ];
+ assign aligned_batch_base = batch_base[`GFX_INSN_BITS_IN_LANE +: $bits(vram_lane_addr)];
gfx_sp_widener #(.WIDTH($bits(vram_lane_addr))) lane_bus
(
@@ -79,6 +74,14 @@ module gfx_sp_batch
.*
);
+ gfx_fifo_overflow #(.DEPTH(`GFX_BATCH_FIFO_DEPTH)) overflow
+ (
+ .down(lane_read && !lane_waitrequest),
+ .empty(),
+ .down_safe(fifo_down_safe),
+ .*
+ );
+
always_comb begin
unique case (read_tail)
2'b00: fifo_in.mask = 4'b0000;
@@ -95,29 +98,23 @@ module gfx_sp_batch
if (!rst_n) begin
state <= IDLE;
lane_read <= 0;
- fifo_pending <= 0;
- end else begin
- unique case (state)
- IDLE:
- if (batch_start) begin
- state <= STREAM;
- lane_read <= 1;
- end
-
- STREAM: begin
- if (!lane_read || !lane_waitrequest)
- lane_read <= fifo_pending < `GFX_BATCH_FIFO_DEPTH - 1;
-
- if (lane_read && !lane_waitrequest && read_block_count == 0)
- state <= IDLE;
+ end else unique case (state)
+ IDLE:
+ if (batch_start) begin
+ state <= STREAM;
+ lane_read <= 1;
end
- endcase
- if (fifo_up && !fifo_down)
- fifo_pending <= fifo_pending - 1;
- else if (!fifo_up && fifo_down)
- fifo_pending <= fifo_pending + 1;
- end
+ STREAM: begin
+ if (!lane_read || !lane_waitrequest)
+ lane_read <= fifo_down_safe;
+
+ if (lane_read && !lane_waitrequest && fetch_block_count == 0) begin
+ state <= IDLE;
+ lane_read <= 0;
+ end
+ end
+ endcase
always_ff @(posedge clk) begin
unique case (state)