diff options
Diffstat (limited to 'rtl/legacy_gfx/gfx_sp_writeback.sv')
| -rw-r--r-- | rtl/legacy_gfx/gfx_sp_writeback.sv | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/rtl/legacy_gfx/gfx_sp_writeback.sv b/rtl/legacy_gfx/gfx_sp_writeback.sv new file mode 100644 index 0000000..1195910 --- /dev/null +++ b/rtl/legacy_gfx/gfx_sp_writeback.sv @@ -0,0 +1,65 @@ +`include "gfx/gfx_defs.sv" + +module gfx_sp_writeback +( + input logic clk, + rst_n, + + input wb_op stream_wb, + input logic stream_wb_valid, + output logic stream_wb_ready, + + input wb_op combiner_wb, + input logic combiner_wb_valid, + output logic combiner_wb_ready, + + input wb_op shuffler_wb, + input logic shuffler_wb_valid, + output logic shuffler_wb_ready, + + output logic wr, + output vreg_num wr_reg, + output mat4 wr_data +); + + wb_op wb_in, wb_out; + + assign wr_reg = wb_out.dst; + assign wr_data = wb_out.data; + + gfx_pipeline_flow #(.STAGES(`GFX_SP_WB_STAGES)) flow + ( + .stall(), + .in_ready(), + .in_valid(stream_wb_valid || combiner_wb_valid || shuffler_wb_valid), + .out_ready(1), + .out_valid(wr), + .* + ); + + gfx_pipes #(.WIDTH($bits(wb_out)), .DEPTH(`GFX_SP_WB_STAGES)) pipes + ( + .in(wb_in), + .out(wb_out), + .stall(0), + .* + ); + + always_comb begin + stream_wb_ready = 0; + combiner_wb_ready = 0; + shuffler_wb_ready = 0; + + if (stream_wb_valid) begin + wb_in = stream_wb; + stream_wb_ready = 1; + end else if (shuffler_wb_valid) begin + wb_in = shuffler_wb; + shuffler_wb_ready = 1; + end else begin + wb_in = combiner_wb; + combiner_wb_ready = 1; + end + end + +endmodule |
