summaryrefslogtreecommitdiff
path: root/platform/wavelet3d/gfx_shader_fpint.sv
diff options
context:
space:
mode:
Diffstat (limited to 'platform/wavelet3d/gfx_shader_fpint.sv')
-rw-r--r--platform/wavelet3d/gfx_shader_fpint.sv69
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