diff options
| author | Alejandro Soto <alejandro@34project.org> | 2024-05-26 12:51:11 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2024-05-26 12:51:52 -0600 |
| commit | 07dc220d10e7c4259557d2450c48074c4cb05151 (patch) | |
| tree | 9285421d7e5673e0592c9d75d013462b2409eb2d /rtl | |
| parent | 8cb646e5a2c9e8ab796973185f4ebf9cbcea57fe (diff) | |
rtl/gfx: implement writeback arbiter
Diffstat (limited to 'rtl')
| -rw-r--r-- | rtl/gfx/gfx_shader_back.sv | 41 |
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 |
