summaryrefslogtreecommitdiff
path: root/platform/wavelet3d/gfx_shader_front.sv
diff options
context:
space:
mode:
Diffstat (limited to 'platform/wavelet3d/gfx_shader_front.sv')
-rw-r--r--platform/wavelet3d/gfx_shader_front.sv82
1 files changed, 55 insertions, 27 deletions
diff --git a/platform/wavelet3d/gfx_shader_front.sv b/platform/wavelet3d/gfx_shader_front.sv
index 5ad0203..52074fd 100644
--- a/platform/wavelet3d/gfx_shader_front.sv
+++ b/platform/wavelet3d/gfx_shader_front.sv
@@ -4,7 +4,13 @@ typedef struct
retry;
gfx::group_id group;
gfx_isa::insn_word insn;
-} shader_front_wave;
+} front_wave;
+
+typedef struct
+{
+ gfx::xgpr_num dest;
+ logic dest_scalar;
+} front_reg_passthru;
typedef logic[4:0] icache_line_num;
@@ -40,7 +46,11 @@ import gfx::*;
word fetch_insn, port_insn;
logic fetch_hit, p0_writeback;
- shader_front_wave bind_wave, dec_wave, port_dec_wave;
+ front_wave bind_wave, dec_wave, port_dec_wave;
+ front_reg_passthru reg_passthru;
+
+ assign front.execute.wave.dest = reg_passthru.dest;
+ assign front.execute.wave.dest_scalar = reg_passthru.dest_scalar;
gfx_shader_bind bind_
(
@@ -60,7 +70,8 @@ import gfx::*;
.rst_n,
.in(bind_wave),
.out(dec_wave),
- .read(reg_read)
+ .read(reg_read),
+ .passthru(reg_passthru)
);
gfx_shader_decode_class class_dec
@@ -68,7 +79,7 @@ import gfx::*;
.clk,
.rst_n,
.wave(dec_wave),
- .out_group(front.execute.group),
+ .out_group(front.execute.wave.group),
.port_wave(port_dec_wave),
.dispatch(front.dispatch),
.p0_writeback
@@ -99,7 +110,7 @@ import gfx::*;
gfx_regfile_io.bind_ regs,
- output shader_front_wave wave
+ output front_wave wave
);
localparam int ICACHE_STAGES = 6;
@@ -419,31 +430,48 @@ import gfx_isa::*;
input logic clk,
rst_n,
- input shader_front_wave in,
+ input front_wave in,
gfx_regfile_io.read read,
- output shader_front_wave out
+ output front_wave out,
+ output front_reg_passthru passthru
);
- localparam int HOLD_DEPTH = REG_READ_STAGES + 1 - 2;
+ // + 1 por next-cycle de read.op
+ localparam int PASSTHRU_DEPTH = REG_READ_STAGES + 1 - 2;
+ localparam int HOLD_DEPTH = PASSTHRU_DEPTH - 2;
logic reg_rev;
- logic hold_valid[HOLD_DEPTH];
- shader_front_wave hold[HOLD_DEPTH];
+ logic valid[HOLD_DEPTH];
+ front_wave out_hold[HOLD_DEPTH];
+ front_reg_passthru passthru_hold[PASSTHRU_DEPTH];
+
+ assign passthru = passthru_hold[$size(passthru_hold) - 1];
assign reg_rev = in.insn.reg_rev;
always_comb begin
- out = hold[$size(hold) - 1];
- out.valid = hold_valid[$size(hold_valid) - 1];
+ out = out_hold[$size(out_hold) - 1];
+ out.valid = valid[$size(valid) - 1];
end
always_ff @(posedge clk) begin
- hold[0] <= in;
+ out_hold[0] <= in;
+ for (int i = 1; i < $size(out_hold); ++i)
+ out_hold[i] <= out_hold[i - 1];
+
+ passthru_hold[0].dest <= in.insn.dst_src.rr.rd;
+ unique case (in.insn.reg_mode)
+ REGS_SVS, REGS_SSS:
+ passthru_hold[0].dest_scalar <= 1;
+
+ REGS_VVS, REGS_VVV:
+ passthru_hold[0].dest_scalar <= 0;
+ endcase
- for (int i = 1; i < HOLD_DEPTH; ++i)
- hold[i] <= hold[i - 1];
+ for (int i = 1; i < $size(passthru_hold); ++i)
+ passthru_hold[i] <= passthru_hold[i - 1];
read.op.group <= in.group;
@@ -476,13 +504,13 @@ import gfx_isa::*;
always_ff @(posedge clk or negedge rst_n)
if (~rst_n)
- for (int i = 1; i < HOLD_DEPTH; ++i)
- hold_valid[i] <= 0;
+ for (int i = 0; i < HOLD_DEPTH; ++i)
+ valid[i] <= 0;
else begin
- hold_valid[0] <= in.valid;
+ valid[0] <= in.valid;
for (int i = 1; i < HOLD_DEPTH; ++i)
- hold_valid[i] <= hold_valid[i - 1];
+ valid[i] <= valid[i - 1];
end
endmodule
@@ -491,19 +519,19 @@ module gfx_shader_decode_class
import gfx::*;
import gfx_isa::*;
(
- input logic clk,
- rst_n,
+ input logic clk,
+ rst_n,
- input shader_front_wave wave,
- output shader_front_wave port_wave,
- output group_id out_group,
+ input front_wave wave,
+ output front_wave port_wave,
+ output group_id out_group,
- output shader_dispatch dispatch,
- output logic p0_writeback
+ output shader_dispatch dispatch,
+ output logic p0_writeback
);
logic is_fsu, is_mem, is_group, hold_valid, retry;
- shader_front_wave hold_wave;
+ front_wave hold_wave;
assign p0_writeback = ~(is_mem | is_fsu | is_group | retry);