diff options
| author | Alejandro Soto <alejandro@34project.org> | 2023-11-21 01:17:26 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2023-11-21 18:00:48 -0600 |
| commit | 7f20f4493ef1938f0ea8e86dc16f5c058fe7e4f3 (patch) | |
| tree | 8068225a7068da4702e144e4ff588573c16e2b36 /rtl | |
| parent | de9a1bf57f6a6c70aef36da4eea024b44fe87470 (diff) | |
rtl/gfx: implement shuffler
Diffstat (limited to 'rtl')
| -rw-r--r-- | rtl/gfx/gfx_defs.sv | 16 | ||||
| -rw-r--r-- | rtl/gfx/gfx_shuffle.sv | 20 | ||||
| -rw-r--r-- | rtl/gfx/gfx_sp.sv | 13 | ||||
| -rw-r--r-- | rtl/gfx/gfx_sp_decode.sv | 7 | ||||
| -rw-r--r-- | rtl/gfx/gfx_sp_select.sv | 25 | ||||
| -rw-r--r-- | rtl/gfx/gfx_sp_shuffler.sv | 70 | ||||
| -rw-r--r-- | rtl/gfx/gfx_sp_swizzle.sv (renamed from rtl/gfx/gfx_swizzle.sv) | 6 |
7 files changed, 125 insertions, 32 deletions
diff --git a/rtl/gfx/gfx_defs.sv b/rtl/gfx/gfx_defs.sv index b65d74e..0a4a5da 100644 --- a/rtl/gfx/gfx_defs.sv +++ b/rtl/gfx/gfx_defs.sv @@ -12,9 +12,9 @@ `define FP_INV_STAGES 3 // ~178 LUTs ~1 bloque DSP typedef logic[`FLOAT_BITS - 1:0] fp; -typedef fp vec2[2]; -typedef fp vec4[`FLOATS_PER_VEC]; -typedef vec4 mat4[`VECS_PER_MAT]; +typedef fp[1:0] vec2; +typedef fp[`FLOATS_PER_VEC - 1:0] vec4; +typedef vec4[`VECS_PER_MAT - 1:0] mat4; `define FP_UNIT 16'h3c00 @@ -229,8 +229,8 @@ typedef struct packed typedef struct packed { - logic is_imm, - is_swizzle; + logic is_swizzle, + is_broadcast; fp imm; vec_mask select_mask; swizzle_lanes swizzle_op; @@ -249,4 +249,10 @@ typedef struct packed shuffler_deco shuffler; } insn_deco; // "insn_decode" ya existe en core, esto es confuso pero lo hice por tiempo +typedef struct packed +{ + vreg_num dst; + mat4 data; +} wb_op; + `endif diff --git a/rtl/gfx/gfx_shuffle.sv b/rtl/gfx/gfx_shuffle.sv deleted file mode 100644 index c52ef25..0000000 --- a/rtl/gfx/gfx_shuffle.sv +++ /dev/null @@ -1,20 +0,0 @@ -`include "gfx/gfx_defs.sv" - -module gfx_shuffle -( - input logic clk, - - input vec4 a, - b, - input vec_mask select, - input logic stall, - - output vec4 out -); - - always_ff @(posedge clk) - if (!stall) - for (integer i = 0; i < `FLOATS_PER_VEC; ++i) - out[i] <= select[i] ? b[i] : a[i]; - -endmodule diff --git a/rtl/gfx/gfx_sp.sv b/rtl/gfx/gfx_sp.sv index 4459870..a65bd6e 100644 --- a/rtl/gfx/gfx_sp.sv +++ b/rtl/gfx/gfx_sp.sv @@ -51,6 +51,19 @@ module gfx_sp .* ); + gfx_sp_shuffler shuffler + ( + .a(), + .b(), + .wb(), + .deco(), + .in_ready(), + .in_valid(0), + .wb_ready(1), + .wb_valid(), + .* + ); + logic batch_end, deco_ready; assign deco_ready = 1; diff --git a/rtl/gfx/gfx_sp_decode.sv b/rtl/gfx/gfx_sp_decode.sv index d24c608..41ce438 100644 --- a/rtl/gfx/gfx_sp_decode.sv +++ b/rtl/gfx/gfx_sp_decode.sv @@ -51,8 +51,8 @@ module gfx_sp_decode deco_in.ex.combiner = 0; deco_in.ex.shuffler = 0; - deco_in.shuffler.is_imm = 1'bx; deco_in.shuffler.is_swizzle = 1'bx; + deco_in.shuffler.is_broadcast = 1'bx; unique casez (insn) `GFX_INSN_OP_SELECT: begin @@ -61,8 +61,8 @@ module gfx_sp_decode deco_in.read_src_b = 1; deco_in.ex.shuffler = 1; - deco_in.shuffler.is_imm = 0; deco_in.shuffler.is_swizzle = 0; + deco_in.shuffler.is_broadcast = 0; end `GFX_INSN_OP_SWIZZL: begin @@ -70,7 +70,6 @@ module gfx_sp_decode deco_in.read_src_a = 1; deco_in.ex.shuffler = 1; - deco_in.shuffler.is_imm = 0; deco_in.shuffler.is_swizzle = 1; end @@ -78,8 +77,8 @@ module gfx_sp_decode deco_in.writeback = 1; deco_in.ex.shuffler = 1; - deco_in.shuffler.is_imm = 1; deco_in.shuffler.is_swizzle = 0; + deco_in.shuffler.is_broadcast = 1; end `GFX_INSN_OP_MATVEC: begin diff --git a/rtl/gfx/gfx_sp_select.sv b/rtl/gfx/gfx_sp_select.sv new file mode 100644 index 0000000..46b23c9 --- /dev/null +++ b/rtl/gfx/gfx_sp_select.sv @@ -0,0 +1,25 @@ +`include "gfx/gfx_defs.sv" + +module gfx_sp_select +( + input logic clk, + + input vec4 a, + b, + input shuffler_deco deco, + input logic stall, + + output vec4 out +); + + always_ff @(posedge clk) + if (!stall) + for (integer i = 0; i < `FLOATS_PER_VEC; ++i) + if (deco.is_broadcast) + out[i] <= deco.imm; + else if (deco.select_mask[i]) + out[i] <= b[i]; + else + out[i] <= a[i]; + +endmodule diff --git a/rtl/gfx/gfx_sp_shuffler.sv b/rtl/gfx/gfx_sp_shuffler.sv new file mode 100644 index 0000000..e4c119d --- /dev/null +++ b/rtl/gfx/gfx_sp_shuffler.sv @@ -0,0 +1,70 @@ +`include "gfx/gfx_defs.sv" + +module gfx_sp_shuffler +( + input logic clk, + rst_n, + + input insn_deco deco, + input mat4 a, + b, + input logic in_valid, + output logic in_ready, + + output wb_op wb, + input logic wb_ready, + output logic wb_valid +); + + mat4 select_out, swizzle_out; + wb_op wb_out; + logic stall, is_swizzle; + vreg_num hold_dst; + + gfx_pipeline_flow #(.STAGES(2)) flow + ( + .out_ready(wb_ready), + .out_valid(wb_valid), + .* + ); + + gfx_skid_buf #(.WIDTH($bits(wb))) skid + ( + .in(wb_out), + .out(wb), + .* + ); + + genvar gen_i; + generate + for (gen_i = 0; gen_i < `VECS_PER_MAT; ++gen_i) begin: lanes + gfx_sp_select select + ( + .a(a[gen_i]), + .b(b[gen_i]), + .out(select_out[gen_i]), + .deco(deco.shuffler), + .* + ); + + gfx_sp_swizzle swizzle + ( + .in(a[gen_i]), + .out(swizzle_out[gen_i]), + .deco(deco.shuffler), + .* + ); + end + endgenerate + + always_ff @(posedge clk) + if (!stall) begin + hold_dst <= deco.dst; + is_swizzle <= deco.shuffler.is_swizzle; + + wb_out.dst <= hold_dst; + for (integer i = 0; i < `VECS_PER_MAT; ++i) + wb_out.data[i] <= is_swizzle ? swizzle_out[i] : select_out[i]; + end + +endmodule diff --git a/rtl/gfx/gfx_swizzle.sv b/rtl/gfx/gfx_sp_swizzle.sv index 1a57c11..d07d934 100644 --- a/rtl/gfx/gfx_swizzle.sv +++ b/rtl/gfx/gfx_sp_swizzle.sv @@ -1,11 +1,11 @@ `include "gfx/gfx_defs.sv" -module gfx_swizzle +module gfx_sp_swizzle ( input logic clk, input vec4 in, - input swizzle_lanes select, + input shuffler_deco deco, input logic stall, output vec4 out @@ -14,6 +14,6 @@ module gfx_swizzle always_ff @(posedge clk) if (!stall) for (integer i = 0; i < `FLOATS_PER_VEC; ++i) - out[i] <= in[select[i]]; + out[i] <= in[deco.swizzle_op[i]]; endmodule |
