summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--gfx_hw.tcl5
-rw-r--r--rtl/gfx/gfx_defs.sv16
-rw-r--r--rtl/gfx/gfx_shuffle.sv20
-rw-r--r--rtl/gfx/gfx_sp.sv13
-rw-r--r--rtl/gfx/gfx_sp_decode.sv7
-rw-r--r--rtl/gfx/gfx_sp_select.sv25
-rw-r--r--rtl/gfx/gfx_sp_shuffler.sv70
-rw-r--r--rtl/gfx/gfx_sp_swizzle.sv (renamed from rtl/gfx/gfx_swizzle.sv)6
8 files changed, 128 insertions, 34 deletions
diff --git a/gfx_hw.tcl b/gfx_hw.tcl
index f252f7a..5a0629d 100644
--- a/gfx_hw.tcl
+++ b/gfx_hw.tcl
@@ -85,9 +85,10 @@ add_fileset_file gfx_sp.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_sp.sv
add_fileset_file gfx_sp_batch.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_sp_batch.sv
add_fileset_file gfx_sp_fetch.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_sp_fetch.sv
add_fileset_file gfx_sp_decode.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_sp_decode.sv
+add_fileset_file gfx_sp_select.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_sp_select.sv
add_fileset_file gfx_sp_widener.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_sp_widener.sv
-add_fileset_file gfx_shuffle.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_shuffle.sv
-add_fileset_file gfx_swizzle.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_swizzle.sv
+add_fileset_file gfx_sp_swizzle.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_sp_swizzle.sv
+add_fileset_file gfx_sp_shuffler.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_sp_shuffler.sv
#
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