ipdom bug fix

This commit is contained in:
Blaise Tine
2021-10-11 16:25:54 -04:00
parent 7102ca5394
commit d94dc37cfe
2 changed files with 21 additions and 15 deletions

View File

@@ -6,11 +6,13 @@ module VX_ipdom_stack #(
) ( ) (
input wire clk, input wire clk,
input wire reset, input wire reset,
input wire pair,
input wire [WIDTH - 1:0] q1, input wire [WIDTH - 1:0] q1,
input wire [WIDTH - 1:0] q2, input wire [WIDTH - 1:0] q2,
output wire [WIDTH - 1:0] d, output wire [WIDTH - 1:0] d,
input wire push, input wire push,
input wire pop, input wire pop,
output wire index,
output wire empty, output wire empty,
output wire full output wire full
); );
@@ -52,15 +54,15 @@ module VX_ipdom_stack #(
always @(posedge clk) begin always @(posedge clk) begin
if (push) begin if (push) begin
is_part[wr_ptr] <= 0; is_part[wr_ptr] <= ~pair;
end else if (pop) begin end else if (pop) begin
is_part[rd_ptr] <= 1; is_part[rd_ptr] <= 1;
end end
end end
wire p = is_part[rd_ptr];
assign d = p ? d1 : d2; assign index = is_part[rd_ptr];
assign empty = ~(| wr_ptr); assign d = index ? d1 : d2;
assign empty = (ADDRW'(0) == wr_ptr);
assign full = (ADDRW'(DEPTH-1) == wr_ptr); assign full = (ADDRW'(DEPTH-1) == wr_ptr);
endmodule endmodule

View File

@@ -24,7 +24,7 @@ module VX_warp_sched #(
wire join_else; wire join_else;
wire [31:0] join_pc; wire [31:0] join_pc;
wire [`NUM_THREADS-1:0] join_tm; wire [`NUM_THREADS-1:0] join_tmask;
reg [`NUM_WARPS-1:0] active_warps, active_warps_n; // real active warps (updated when a warp is activated or disabled) reg [`NUM_WARPS-1:0] active_warps, active_warps_n; // real active warps (updated when a warp is activated or disabled)
reg [`NUM_WARPS-1:0] stalled_warps; // asserted when a branch/gpgpu instructions are issued reg [`NUM_WARPS-1:0] stalled_warps; // asserted when a branch/gpgpu instructions are issued
@@ -132,7 +132,7 @@ module VX_warp_sched #(
if (join_else) begin if (join_else) begin
warp_pcs[join_if.wid] <= join_pc; warp_pcs[join_if.wid] <= join_pc;
end end
thread_masks[join_if.wid] <= join_tm; thread_masks[join_if.wid] <= join_tmask;
end end
active_warps <= active_warps_n; active_warps <= active_warps_n;
@@ -162,9 +162,8 @@ module VX_warp_sched #(
// split/join stack management // split/join stack management
wire [(1+32+`NUM_THREADS)-1:0] ipdom [`NUM_WARPS-1:0]; wire [(32+`NUM_THREADS)-1:0] ipdom_data [`NUM_WARPS-1:0];
wire ipdom_index [`NUM_WARPS-1:0];
wire [`NUM_THREADS-1:0] curr_tmask = thread_masks[warp_ctl_if.wid];
for (genvar i = 0; i < `NUM_WARPS; i++) begin for (genvar i = 0; i < `NUM_WARPS; i++) begin
wire push = warp_ctl_if.valid wire push = warp_ctl_if.valid
@@ -173,27 +172,32 @@ module VX_warp_sched #(
wire pop = join_if.valid && (i == join_if.wid); wire pop = join_if.valid && (i == join_if.wid);
wire [`NUM_THREADS-1:0] else_tmask = warp_ctl_if.split.diverged ? warp_ctl_if.split.else_tmask : curr_tmask; wire [`NUM_THREADS-1:0] else_tmask = warp_ctl_if.split.else_tmask;
wire [(1+32+`NUM_THREADS)-1:0] q_end = {1'b0, 32'b0, curr_tmask}; wire [`NUM_THREADS-1:0] orig_tmask = thread_masks[warp_ctl_if.wid];
wire [(1+32+`NUM_THREADS)-1:0] q_else = {1'b1, warp_ctl_if.split.pc, else_tmask};
wire [(32+`NUM_THREADS)-1:0] q_else = {warp_ctl_if.split.pc, else_tmask};
wire [(32+`NUM_THREADS)-1:0] q_end = {32'b0, orig_tmask};
VX_ipdom_stack #( VX_ipdom_stack #(
.WIDTH (1+32+`NUM_THREADS), .WIDTH (32+`NUM_THREADS),
.DEPTH (2 ** (`NT_BITS+1)) .DEPTH (2 ** (`NT_BITS+1))
) ipdom_stack ( ) ipdom_stack (
.clk (clk), .clk (clk),
.reset (reset), .reset (reset),
.push (push), .push (push),
.pop (pop), .pop (pop),
.pair (warp_ctl_if.split.diverged),
.q1 (q_end), .q1 (q_end),
.q2 (q_else), .q2 (q_else),
.d (ipdom[i]), .d (ipdom_data[i]),
.index (ipdom_index[i]),
`UNUSED_PIN (empty), `UNUSED_PIN (empty),
`UNUSED_PIN (full) `UNUSED_PIN (full)
); );
end end
assign {join_else, join_pc, join_tm} = ipdom [join_if.wid]; assign {join_pc, join_tmask} = ipdom_data[join_if.wid];
assign join_else = ~ipdom_index[join_if.wid];
// schedule the next ready warp // schedule the next ready warp