diff options
Diffstat (limited to 'platform/wavelet3d/gfx_shader_fpint.sv')
| -rw-r--r-- | platform/wavelet3d/gfx_shader_fpint.sv | 69 |
1 files changed, 44 insertions, 25 deletions
diff --git a/platform/wavelet3d/gfx_shader_fpint.sv b/platform/wavelet3d/gfx_shader_fpint.sv index 392a8b5..a418dcc 100644 --- a/platform/wavelet3d/gfx_shader_fpint.sv +++ b/platform/wavelet3d/gfx_shader_fpint.sv @@ -154,6 +154,7 @@ import gfx::*; rst_n, input fpint_op op, + input wave_exec wave, input logic abort, in_valid, @@ -164,10 +165,25 @@ import gfx::*; localparam int FPINT_STAGES = 7 + FPINT_CLZ_STAGES + 4; + struct + { + fpint_op op; + wave_exec wave; + } stage[FPINT_STAGES]; + logic stage_valid[FPINT_STAGES]; - fpint_op stage_op[FPINT_STAGES]; - assign stage_op[0] = op; + assign wb.dest = stage[FPINT_STAGES - 1].wave.dest; + assign wb.mask = 'x; + assign wb.group = stage[FPINT_STAGES - 1].wave.group; + assign wb.pc_add = 'x; + assign wb.pc_inc = 1; + assign wb.scalar = stage[FPINT_STAGES - 1].wave.dest_scalar; + assign wb.pc_update = wb.writeback; + assign wb.writeback = stage[FPINT_STAGES - 1].op.writeback; + assign wb.mask_update = 0; + + // Ojo: stage_valid[0], pero stage[0] no assign stage_valid[0] = in_valid; genvar lane; @@ -179,32 +195,36 @@ import gfx::*; .a(read_data.a[lane]), .b(read_data.b[lane]), .q(wb.lanes[lane]), - .mul_float_0(stage_op[0].setup_mul_float), - .unit_b_0(stage_op[0].setup_unit_b), - .put_hi_2(stage_op[2].mnorm_put_hi), - .put_lo_2(stage_op[2].mnorm_put_lo), - .put_mul_2(stage_op[2].mnorm_put_mul), - .zero_b_2(stage_op[2].mnorm_zero_b), - .zero_flags_2(stage_op[2].mnorm_zero_flags), - .abs_3(stage_op[3].minmax_abs), - .swap_3(stage_op[3].minmax_swap), - .zero_min_3(stage_op[3].minmax_zero_min), - .copy_flags_3(stage_op[3].minmax_copy_flags), - .int_signed_5(stage_op[5].shiftr_int_signed), - .copy_flags_6(stage_op[6].addsub_copy_flags), - .int_operand_6(stage_op[6].addsub_int_operand), - .force_nop_7(stage_op[7].clz_force_nop), - .copy_flags_11(stage_op[11].shiftl_copy_flags), - .copy_flags_12(stage_op[12].round_copy_flags), - .enable_12(stage_op[12].round_enable), - .enable_14(stage_op[14].encode_enable) + .mul_float_0(op.setup_mul_float), + .unit_b_0(op.setup_unit_b), + .put_hi_2(stage[2 - 1].op.mnorm_put_hi), + .put_lo_2(stage[2 - 1].op.mnorm_put_lo), + .put_mul_2(stage[2 - 1].op.mnorm_put_mul), + .zero_b_2(stage[2 - 1].op.mnorm_zero_b), + .zero_flags_2(stage[2 - 1].op.mnorm_zero_flags), + .abs_3(stage[3 - 1].op.minmax_abs), + .swap_3(stage[3 - 1].op.minmax_swap), + .zero_min_3(stage[3 - 1].op.minmax_zero_min), + .copy_flags_3(stage[3 - 1].op.minmax_copy_flags), + .int_signed_5(stage[5 - 1].op.shiftr_int_signed), + .copy_flags_6(stage[6 - 1].op.addsub_copy_flags), + .int_operand_6(stage[6 - 1].op.addsub_int_operand), + .force_nop_7(stage[7 - 1].op.clz_force_nop), + .copy_flags_11(stage[11 - 1].op.shiftl_copy_flags), + .copy_flags_12(stage[12 - 1].op.round_copy_flags), + .enable_12(stage[12 - 1].op.round_enable), + .enable_14(stage[14 - 1].op.encode_enable) ); end endgenerate - always_ff @(posedge clk) + always_ff @(posedge clk) begin + stage[0].op <= op; + stage[0].wave <= wave; + for (int i = 1; i < FPINT_STAGES; ++i) - stage_op[i] <= stage_op[i - 1]; + stage[i] <= stage[i - 1]; + end always_ff @(posedge clk or negedge rst_n) if (~rst_n) begin @@ -217,8 +237,7 @@ import gfx::*; stage_valid[i] <= stage_valid[i - 1]; // Se levanta 1 ciclo luego que in_valid - if (abort) - stage_valid[2] <= 0; + stage_valid[2] <= stage_valid[1] & ~abort; wb.valid <= stage_valid[FPINT_STAGES - 1]; end |
