summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_shader_back.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2024-05-26 12:51:11 -0600
committerAlejandro Soto <alejandro@34project.org>2024-05-26 12:51:52 -0600
commit07dc220d10e7c4259557d2450c48074c4cb05151 (patch)
tree9285421d7e5673e0592c9d75d013462b2409eb2d /rtl/gfx/gfx_shader_back.sv
parent8cb646e5a2c9e8ab796973185f4ebf9cbcea57fe (diff)
rtl/gfx: implement writeback arbiter
Diffstat (limited to '')
-rw-r--r--rtl/gfx/gfx_shader_back.sv41
1 files changed, 24 insertions, 17 deletions
diff --git a/rtl/gfx/gfx_shader_back.sv b/rtl/gfx/gfx_shader_back.sv
index 97a2726..a8c3a93 100644
--- a/rtl/gfx/gfx_shader_back.sv
+++ b/rtl/gfx/gfx_shader_back.sv
@@ -179,23 +179,30 @@ module gfx_shader_writeback_arbiter2_prio
gfx_wb.tx out
);
- //TODO
- assign a.ready = out.ready;
- assign b.ready = 0;
-
- assign out.dest = a.dest;
- assign out.lanes = a.lanes;
- assign out.group = a.group;
- assign out.valid = a.valid;
- assign out.scalar = a.scalar;
- assign out.writeback = a.writeback;
-
- assign out.mask = a.mask;
- assign out.mask_update = a.mask_update;
-
- assign out.pc_add = a.pc_add;
- assign out.pc_inc = a.pc_inc;
- assign out.pc_update = a.pc_update;
+ assign a.ready = out.ready | ~out.valid;
+ assign b.ready = (out.ready | ~out.valid) & ~a.valid;
+
+ always_ff @(posedge clk or negedge rst_n)
+ if (~rst_n)
+ out.valid <= 0;
+ else
+ out.valid <= (out.valid & ~out.ready) | a.valid | b.valid;
+
+ always_ff @(posedge clk)
+ if (out.ready | ~out.valid) begin
+ out.dest <= a.valid ? a.dest : b.dest;
+ out.lanes <= a.valid ? a.lanes : b.lanes;
+ out.group <= a.valid ? a.group : b.group;
+ out.scalar <= a.valid ? a.scalar : b.scalar;
+ out.writeback <= a.valid ? a.writeback : b.writeback;
+
+ out.mask <= a.valid ? a.mask : b.mask;
+ out.mask_update <= a.valid ? a.mask_update : b.mask_update;
+
+ out.pc_add <= a.valid ? a.pc_add : b.pc_add;
+ out.pc_inc <= a.valid ? a.pc_inc : b.pc_inc;
+ out.pc_update <= a.valid ? a.pc_update : b.pc_update;
+ end
endmodule