Optimized cache writeback path by 1) VX_fair_arbiter and 2) Added a wb register between LSU and WB arbiter

This commit is contained in:
felsabbagh3 2020-06-28 14:27:47 -07:00
parent c95d3cb22b
commit ffb760cf73
4 changed files with 91 additions and 7 deletions

View file

@ -76,7 +76,7 @@ module VX_back_end #(
.clk (clk),
.reset (reset),
.lsu_req_if (lsu_req_if),
.mem_wb_if (mem_wb_if),
.mem_wb_if_p1 (mem_wb_if),
.dcache_req_if (dcache_req_if),
.dcache_rsp_if (dcache_rsp_if),
.delay (mem_delay),
@ -145,4 +145,4 @@ module VX_back_end #(
`SCOPE_ASSIGN(scope_writeback_rd, writeback_if.rd);
`SCOPE_ASSIGN(scope_writeback_data, writeback_if.data);
endmodule
endmodule

View file

@ -12,7 +12,7 @@ module VX_lsu_unit #(
VX_lsu_req_if lsu_req_if,
// Write back to GPR
VX_wb_if mem_wb_if,
VX_wb_if mem_wb_if_p1,
// Dcache interface
VX_cache_core_req_if dcache_req_if,
@ -20,6 +20,9 @@ module VX_lsu_unit #(
output wire delay
);
VX_wb_if mem_wb_if;
wire[`NUM_THREADS-1:0][31:0] use_address;
wire[`NUM_THREADS-1:0][31:0] use_store_data;
wire[`NUM_THREADS-1:0] use_valid;
@ -156,7 +159,20 @@ module VX_lsu_unit #(
assign mem_wb_if.data = core_rsp_data;
// Can't accept new response
assign dcache_rsp_if.core_rsp_ready = !no_slot_mem;
assign dcache_rsp_if.core_rsp_ready = !no_slot_mem & (|mem_wb_if_p1.valid);
// From LSU to WB
localparam WB_REQ_SIZE = (`NUM_THREADS) + (`NUM_THREADS * 32) + (`NW_BITS) + (5) + (2) + 32;
VX_generic_register #(.N(WB_REQ_SIZE)) lsu_to_wb(
.clk (clk),
.reset (reset),
.stall (no_slot_mem),
.flush (1'b0),
.in ({mem_wb_if.valid , mem_wb_if.data , mem_wb_if.warp_num , mem_wb_if.rd , mem_wb_if.wb , mem_wb_if.curr_PC }),
.out ({mem_wb_if_p1.valid, mem_wb_if_p1.data, mem_wb_if_p1.warp_num, mem_wb_if_p1.rd, mem_wb_if_p1.wb, mem_wb_if_p1.curr_PC})
);
`SCOPE_ASSIGN(scope_dcache_req_valid, dcache_req_if.core_req_valid);
`SCOPE_ASSIGN(scope_dcache_req_warp_num, use_warp_num);
@ -186,4 +202,4 @@ module VX_lsu_unit #(
end
`endif
endmodule
endmodule

View file

@ -35,7 +35,7 @@ module VX_cache_core_rsp_merge #(
wire [`BANK_BITS-1:0] main_bank_index;
VX_fixed_arbiter #(
VX_fair_arbiter #(
.N(NUM_BANKS)
) sel_bank (
.clk (clk),
@ -85,4 +85,4 @@ module VX_cache_core_rsp_merge #(
end
end
endmodule
endmodule

View file

@ -0,0 +1,68 @@
`include "VX_define.vh"
module VX_fair_arbiter #(
parameter N = 0
) (
input wire clk,
input wire reset,
input wire [N-1:0] requests,
output wire [`LOG2UP(N)-1:0] grant_index,
output wire [N-1:0] grant_onehot,
output wire grant_valid
);
if (N == 1) begin
`UNUSED_VAR (clk)
`UNUSED_VAR (reset)
assign grant_index = 0;
assign grant_onehot = requests;
assign grant_valid = requests[0];
end else begin
reg [N-1:0] requests_use;
wire [N-1:0] update_value;
wire refill;
wire [N-1:0] refill_value;
reg [N-1:0] refill_original;
always @(posedge clk) begin
if (reset) begin
requests_use <= 0;
refill_original <= 0;
end else if (refill) begin
requests_use <= refill_value;
refill_original <= refill_value;
end else begin
requests_use <= update_value;
end
end
assign refill = (requests_use == 0);
assign refill_value = requests;
reg [N-1:0] grant_onehot_r;
VX_priority_encoder # (
.N(N)
) priority_encoder (
.data_in (requests_use),
.data_out (grant_index ),
.valid_out (grant_valid )
);
always @(*) begin
grant_onehot_r = N'(0);
grant_onehot_r[grant_index] = 1;
end
assign grant_onehot = grant_onehot_r;
assign update_value = (requests_use & ~grant_onehot_r) | ((refill_original ^ requests) & ~refill_original);
end
endmodule