diff options
| author | Alejandro Soto <alejandro@34project.org> | 2023-11-21 00:17:55 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2023-11-21 00:17:55 -0600 |
| commit | de9a1bf57f6a6c70aef36da4eea024b44fe87470 (patch) | |
| tree | 856ddb1a6f5dd30b43e2b933b309e4176bff2865 | |
| parent | fc99889c3ae4d5c780e878f2e881fdbe40c041fb (diff) | |
rtl/gfx: implement SP decode
Diffstat (limited to '')
| -rw-r--r-- | gfx_hw.tcl | 2 | ||||
| -rw-r--r-- | rtl/gfx/gfx_defs.sv | 32 | ||||
| -rw-r--r-- | rtl/gfx/gfx_isa.sv | 23 | ||||
| -rw-r--r-- | rtl/gfx/gfx_sp.sv | 17 | ||||
| -rw-r--r-- | rtl/gfx/gfx_sp_decode.sv | 117 |
5 files changed, 187 insertions, 4 deletions
@@ -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 |
