This commit is contained in:
felsabbagh3
2019-10-17 11:04:06 -04:00
parent 7fd5312b67
commit b08297eafb
2 changed files with 25 additions and 13 deletions

View File

@@ -79,7 +79,7 @@ module VX_fetch (
assign fe_inst_meta_fd.valid = thread_mask; assign fe_inst_meta_fd.valid = thread_mask;
// assign fe_inst_meta_fd.instruction = (pipe_stall || warp_stall) ? 32'b0 : icache_response.instruction;; // assign fe_inst_meta_fd.instruction = (pipe_stall || warp_stall) ? 32'b0 : icache_response.instruction;;
assign fe_inst_meta_fd.instruction = (thread_mask == 0) ? 32'0 : icache_response.instruction;; assign fe_inst_meta_fd.instruction = (thread_mask == 0) ? 32'b0 : icache_response.instruction;;
assign fe_inst_meta_fd.inst_pc = warp_pc; assign fe_inst_meta_fd.inst_pc = warp_pc;

View File

@@ -50,6 +50,25 @@ module VX_warp_scheduler (
reg[`NT_M1:0] thread_masks[`NW-1:0]; reg[`NT_M1:0] thread_masks[`NW-1:0];
reg[31:0] warp_pcs[`NW-1:0]; reg[31:0] warp_pcs[`NW-1:0];
// Choosing a warp to wsapwn
wire[`NW_M1:0] warp_to_wsapwn;
wire found_wspawn;
wire[`NW_M1:0] warp_to_schedule;
wire schedule;
wire hazard;
wire global_stall;
wire real_schedule;
wire[31:0] new_pc;
/* verilator lint_off UNUSED */
wire[`NW_M1:0] num_active;
/* verilator lint_on UNUSED */
reg[1:0] start; reg[1:0] start;
initial begin initial begin
warp_pcs[0] = (32'h80000000 - 4); warp_pcs[0] = (32'h80000000 - 4);
@@ -123,11 +142,11 @@ module VX_warp_scheduler (
wire should_jal = (jal && (warp_to_schedule == jal_warp_num)); wire should_jal = (jal && (warp_to_schedule == jal_warp_num));
wire should_bra = (branch_dir && (warp_to_schedule == branch_warp_num)); wire should_bra = (branch_dir && (warp_to_schedule == branch_warp_num));
wire hazard = (should_jal || should_bra) && schedule; assign hazard = (should_jal || should_bra) && schedule;
wire real_schedule = schedule && !warp_stalled[warp_to_schedule]; assign real_schedule = schedule && !warp_stalled[warp_to_schedule];
wire global_stall = (stall || wstall || hazard || !real_schedule); assign global_stall = (stall || wstall || hazard || !real_schedule);
assign warp_pc = warp_pcs[warp_to_schedule]; assign warp_pc = warp_pcs[warp_to_schedule];
@@ -135,23 +154,19 @@ module VX_warp_scheduler (
assign warp_num = warp_to_schedule; assign warp_num = warp_to_schedule;
wire[31:0] new_pc = warp_pc + 4; assign new_pc = warp_pc + 4;
assign use_active = (num_active <= 1) ? (warp_active & (~warp_stalled)) : visible_active; assign use_active = (num_active <= 1) ? (warp_active & (~warp_stalled)) : visible_active;
// Choosing a warp to schedule // Choosing a warp to schedule
wire[`NW_M1:0] warp_to_schedule;
wire schedule;
VX_priority_encoder choose_schedule( VX_priority_encoder choose_schedule(
.valids(use_active), .valids(use_active),
.index (warp_to_schedule), .index (warp_to_schedule),
.found (schedule) .found (schedule)
); );
// Choosing a warp to wsapwn
wire[`NW_M1:0] warp_to_wsapwn;
wire found_wspawn;
VX_priority_encoder choose_wsapwn( VX_priority_encoder choose_wsapwn(
.valids(~warp_active), .valids(~warp_active),
.index (warp_to_wsapwn), .index (warp_to_wsapwn),
@@ -160,9 +175,6 @@ module VX_warp_scheduler (
// Valid counter // Valid counter
/* verilator lint_off UNUSED */
wire[`NW_M1:0] num_active;
/* verilator lint_on UNUSED */
VX_one_counter valid_counter( VX_one_counter valid_counter(
.valids(visible_active), .valids(visible_active),
.ones_found(num_active) .ones_found(num_active)