summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2023-11-21 00:17:55 -0600
committerAlejandro Soto <alejandro@34project.org>2023-11-21 00:17:55 -0600
commitde9a1bf57f6a6c70aef36da4eea024b44fe87470 (patch)
tree856ddb1a6f5dd30b43e2b933b309e4176bff2865
parentfc99889c3ae4d5c780e878f2e881fdbe40c041fb (diff)
rtl/gfx: implement SP decode
-rw-r--r--gfx_hw.tcl2
-rw-r--r--rtl/gfx/gfx_defs.sv32
-rw-r--r--rtl/gfx/gfx_isa.sv23
-rw-r--r--rtl/gfx/gfx_sp.sv17
-rw-r--r--rtl/gfx/gfx_sp_decode.sv117
5 files changed, 187 insertions, 4 deletions
diff --git a/gfx_hw.tcl b/gfx_hw.tcl
index d726edd..f252f7a 100644
--- a/gfx_hw.tcl
+++ b/gfx_hw.tcl
@@ -46,6 +46,7 @@ add_fileset_file gfx_fixed_div.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_fixed_div.sv
add_fileset_file gfx_fixed_fma.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_fixed_fma.sv
add_fileset_file gfx_fixed_fma_dot.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_fixed_fma_dot.sv
add_fileset_file gfx_cmd.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_cmd.sv
+add_fileset_file gfx_isa.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_isa.sv
add_fileset_file gfx_defs.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_defs.sv
add_fileset_file gfx_fold.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_fold.sv
add_fileset_file gfx_mat_mat.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_mat_mat.sv
@@ -83,6 +84,7 @@ add_fileset_file gfx_mem.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_mem.sv
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_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
diff --git a/rtl/gfx/gfx_defs.sv b/rtl/gfx/gfx_defs.sv
index 01fe2e3..b65d74e 100644
--- a/rtl/gfx/gfx_defs.sv
+++ b/rtl/gfx/gfx_defs.sv
@@ -179,6 +179,7 @@ typedef logic[`GFX_MEM_WORD_ADDR_BITS - 1:0] vram_addr;
`define GFX_LANE_BITS $bits(mat4)
`define GFX_LANE_ADDR_BITS (`GFX_MEM_WORD_ADDR_BITS - $clog2(`GFX_LANE_BITS / `GFX_MEM_DATA_BITS))
`define GFX_LANE_SUBWORD_BITS (`GFX_MEM_ADDR_BITS - `GFX_LANE_ADDR_BITS)
+`define GFX_INSN_BITS_IN_LANE (`GFX_LANE_SUBWORD_BITS - `GFX_INSN_SUBWORD_BITS)
typedef logic[`GFX_INSN_BITS - 1:0] insn_word;
typedef logic[`GFX_LANE_BITS - 1:0] lane_word;
@@ -217,4 +218,35 @@ typedef logic[`FLOATS_PER_VEC - 1:0] vec_mask;
typedef logic[`FLOATS_PER_VEC - 1:0][$clog2(`FLOATS_PER_VEC) - 1:0] swizzle_lanes;
+typedef logic[2:0] vreg_num;
+
+typedef struct packed
+{
+ logic stream,
+ combiner,
+ shuffler;
+} ex_units;
+
+typedef struct packed
+{
+ logic is_imm,
+ is_swizzle;
+ fp imm;
+ vec_mask select_mask;
+ swizzle_lanes swizzle_op;
+} shuffler_deco;
+
+typedef struct packed
+{
+ logic writeback,
+ read_src_a,
+ read_src_b,
+ clear_lanes;
+ vreg_num dst,
+ src_a,
+ src_b;
+ ex_units ex;
+ shuffler_deco shuffler;
+} insn_deco; // "insn_decode" ya existe en core, esto es confuso pero lo hice por tiempo
+
`endif
diff --git a/rtl/gfx/gfx_isa.sv b/rtl/gfx/gfx_isa.sv
new file mode 100644
index 0000000..18a28e4
--- /dev/null
+++ b/rtl/gfx/gfx_isa.sv
@@ -0,0 +1,23 @@
+`ifndef GFX_ISA_SV
+`define GFX_ISA_SV
+
+`include "gfx/gfx_defs.sv"
+
+`define GFX_INSN_OP_SELECT 32'b00000000_zzzz0zzz_0zzz0zzz_00000001
+`define GFX_INSN_OP_SWIZZL 32'bzzzzzzzz_00000000_0zzz0zzz_00000010
+`define GFX_INSN_OP_BROADC 32'bzzzzzzzz_zzzzzzzz_00000zzz_00000100
+`define GFX_INSN_OP_MATVEC 32'b00000000_00000zzz_0zzz0zzz_00001000
+`define GFX_INSN_OP_SEND 32'b00000000_00000000_0zzz0000_00010000
+`define GFX_INSN_OP_RECV 32'b00000000_00000000_00000zzz_00100000
+
+`define GFX_INSN_DST [10:8]
+`define GFX_INSN_SRC_A [14:12]
+`define GFX_INSN_SRC_B [18:16]
+
+`define GFX_INSN_SELECT_MASK [23:20]
+
+`define GFX_INSN_SWIZZL_LANES [31:24]
+
+`define GFX_INSN_BROADC_IMM [31:16]
+
+`endif
diff --git a/rtl/gfx/gfx_sp.sv b/rtl/gfx/gfx_sp.sv
index 9a638c3..4459870 100644
--- a/rtl/gfx/gfx_sp.sv
+++ b/rtl/gfx/gfx_sp.sv
@@ -22,15 +22,23 @@ module gfx_sp
program_header_size
);
- logic batch_start, clear_lanes, running;
+ logic batch_start, clear_lanes, insn_valid, running;
cmd_word batch_length;
insn_word insn;
vram_insn_addr batch_base;
gfx_sp_fetch fetch
(
- .ready(1),
- .valid(),
+ .ready(insn_ready),
+ .valid(insn_valid),
+ .*
+ );
+
+ logic deco_valid, insn_ready;
+ insn_deco deco;
+
+ gfx_sp_decode decode
+ (
.*
);
@@ -43,6 +51,7 @@ module gfx_sp
.*
);
- logic batch_end;
+ logic batch_end, deco_ready;
+ assign deco_ready = 1;
endmodule
diff --git a/rtl/gfx/gfx_sp_decode.sv b/rtl/gfx/gfx_sp_decode.sv
new file mode 100644
index 0000000..d24c608
--- /dev/null
+++ b/rtl/gfx/gfx_sp_decode.sv
@@ -0,0 +1,117 @@
+`include "gfx/gfx_isa.sv"
+`include "gfx/gfx_defs.sv"
+
+module gfx_sp_decode
+(
+ input logic clk,
+ rst_n,
+
+ input logic clear_lanes,
+ input insn_word insn,
+ input logic insn_valid,
+ output logic insn_ready,
+
+ output insn_deco deco,
+ input logic deco_ready,
+ output logic deco_valid
+);
+
+ logic stall;
+ insn_deco deco_in, deco_out;
+
+ gfx_pipeline_flow #(.STAGES(1)) flow
+ (
+ .in_ready(insn_ready),
+ .in_valid(insn_valid),
+ .out_ready(deco_ready),
+ .out_valid(deco_valid),
+ .*
+ );
+
+ gfx_pipes #(.WIDTH($bits(deco)), .DEPTH(1)) pipe
+ (
+ .in(deco_in),
+ .out(deco_out),
+ .*
+ );
+
+ gfx_skid_buf #(.WIDTH($bits(deco))) skid
+ (
+ .in(deco_out),
+ .out(deco),
+ .*
+ );
+
+ always_comb begin
+ deco_in.writeback = 0;
+ deco_in.read_src_a = 0;
+ deco_in.read_src_b = 0;
+
+ deco_in.ex.stream = 0;
+ deco_in.ex.combiner = 0;
+ deco_in.ex.shuffler = 0;
+
+ deco_in.shuffler.is_imm = 1'bx;
+ deco_in.shuffler.is_swizzle = 1'bx;
+
+ unique casez (insn)
+ `GFX_INSN_OP_SELECT: begin
+ deco_in.writeback = 1;
+ deco_in.read_src_a = 1;
+ deco_in.read_src_b = 1;
+
+ deco_in.ex.shuffler = 1;
+ deco_in.shuffler.is_imm = 0;
+ deco_in.shuffler.is_swizzle = 0;
+ end
+
+ `GFX_INSN_OP_SWIZZL: begin
+ deco_in.writeback = 1;
+ deco_in.read_src_a = 1;
+
+ deco_in.ex.shuffler = 1;
+ deco_in.shuffler.is_imm = 0;
+ deco_in.shuffler.is_swizzle = 1;
+ end
+
+ `GFX_INSN_OP_BROADC: begin
+ deco_in.writeback = 1;
+
+ deco_in.ex.shuffler = 1;
+ deco_in.shuffler.is_imm = 1;
+ deco_in.shuffler.is_swizzle = 0;
+ end
+
+ `GFX_INSN_OP_MATVEC: begin
+ deco_in.writeback = 1;
+ deco_in.read_src_a = 1;
+ deco_in.read_src_b = 1;
+ deco_in.ex.combiner = 1;
+ end
+
+ `GFX_INSN_OP_SEND: begin
+ deco_in.read_src_a = 1;
+ deco_in.ex.stream = 1;
+ end
+
+ `GFX_INSN_OP_RECV: begin
+ deco_in.writeback = 1;
+ deco_in.ex.stream = 1;
+ end
+
+ default:
+ // Esto es jugar con fuego, pero lo vale con tal de que cierre el timing
+ deco_in = {($bits(deco_in)){1'bx}};
+ endcase
+
+ deco_in.dst = insn `GFX_INSN_DST;
+ deco_in.src_a = insn `GFX_INSN_SRC_A;
+ deco_in.src_b = insn `GFX_INSN_SRC_B;
+ deco_in.clear_lanes = clear_lanes;
+
+ deco_in.shuffler.imm = insn `GFX_INSN_BROADC_IMM;
+ deco_in.shuffler.select_mask = insn `GFX_INSN_SELECT_MASK;
+ deco_in.shuffler.swizzle_op = insn `GFX_INSN_SWIZZL_LANES;
+ end
+
+endmodule