summaryrefslogtreecommitdiff
path: root/rtl
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2023-11-21 01:47:23 -0600
committerAlejandro Soto <alejandro@34project.org>2023-11-21 18:02:52 -0600
commit3821d219fa63837f847027022e1d585688ec66a9 (patch)
tree3fb653c5d212e8ecf7b78ac47495f733a5b36369 /rtl
parent7f20f4493ef1938f0ea8e86dc16f5c058fe7e4f3 (diff)
rtl/gfx: implement SP combiner
Diffstat (limited to 'rtl')
-rw-r--r--rtl/gfx/gfx_defs.sv2
-rw-r--r--rtl/gfx/gfx_sp.sv13
-rw-r--r--rtl/gfx/gfx_sp_combiner.sv63
-rw-r--r--rtl/gfx/gfx_sp_shuffler.sv4
4 files changed, 80 insertions, 2 deletions
diff --git a/rtl/gfx/gfx_defs.sv b/rtl/gfx/gfx_defs.sv
index 0a4a5da..260b17a 100644
--- a/rtl/gfx/gfx_defs.sv
+++ b/rtl/gfx/gfx_defs.sv
@@ -255,4 +255,6 @@ typedef struct packed
mat4 data;
} wb_op;
+`define GFX_SP_COMBINER_FIFO_DEPTH 4 // TODO: optimizar esto
+
`endif
diff --git a/rtl/gfx/gfx_sp.sv b/rtl/gfx/gfx_sp.sv
index a65bd6e..acb1dc2 100644
--- a/rtl/gfx/gfx_sp.sv
+++ b/rtl/gfx/gfx_sp.sv
@@ -64,6 +64,19 @@ module gfx_sp
.*
);
+ gfx_sp_combiner combiner
+ (
+ .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_combiner.sv b/rtl/gfx/gfx_sp_combiner.sv
new file mode 100644
index 0000000..e5e64c3
--- /dev/null
+++ b/rtl/gfx/gfx_sp_combiner.sv
@@ -0,0 +1,63 @@
+`include "gfx/gfx_defs.sv"
+
+module gfx_sp_combiner
+(
+ 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
+);
+
+ wb_op wb_out;
+ logic mul_ready, mul_valid, fifo_ready, fifo_valid, skid_ready, out_stall;
+
+ assign in_ready = mul_ready && fifo_ready;
+
+ gfx_mat_mat mul
+ (
+ .q(wb_out.data),
+ .in_ready(mul_ready),
+ .in_valid(in_valid && fifo_ready),
+ .out_ready(skid_ready && fifo_valid),
+ .out_valid(mul_valid),
+ .*
+ );
+
+ gfx_fifo #(.WIDTH($bits(vreg_num)), .DEPTH(`GFX_SP_COMBINER_FIFO_DEPTH)) depth
+ (
+ .in(deco.dst),
+ .out(wb_out.dst),
+ .in_ready(fifo_ready),
+ .in_valid(in_valid && mul_ready),
+ .out_ready(skid_ready && mul_valid),
+ .out_valid(fifo_valid),
+ .*
+ );
+
+ gfx_skid_flow out_flow
+ (
+ .stall(out_stall),
+ .in_ready(skid_ready),
+ .in_valid(fifo_valid && mul_valid),
+ .out_ready(wb_ready),
+ .out_valid(wb_valid),
+ .*
+ );
+
+ gfx_skid_buf #(.WIDTH($bits(wb))) out_skid
+ (
+ .in(wb_out),
+ .out(wb),
+ .stall(out_stall),
+ .*
+ );
+
+endmodule
diff --git a/rtl/gfx/gfx_sp_shuffler.sv b/rtl/gfx/gfx_sp_shuffler.sv
index e4c119d..627bf8a 100644
--- a/rtl/gfx/gfx_sp_shuffler.sv
+++ b/rtl/gfx/gfx_sp_shuffler.sv
@@ -37,7 +37,7 @@ module gfx_sp_shuffler
genvar gen_i;
generate
- for (gen_i = 0; gen_i < `VECS_PER_MAT; ++gen_i) begin: lanes
+ for (gen_i = 0; gen_i < `GFX_SP_LANES; ++gen_i) begin: lanes
gfx_sp_select select
(
.a(a[gen_i]),
@@ -63,7 +63,7 @@ module gfx_sp_shuffler
is_swizzle <= deco.shuffler.is_swizzle;
wb_out.dst <= hold_dst;
- for (integer i = 0; i < `VECS_PER_MAT; ++i)
+ for (integer i = 0; i < `GFX_SP_LANES; ++i)
wb_out.data[i] <= is_swizzle ? swizzle_out[i] : select_out[i];
end