mirror of
https://github.com/openhwgroup/cva5.git
synced 2025-04-20 12:07:53 -04:00
2nd cycle forwarding removal
This commit is contained in:
parent
ba64f8dcae
commit
6285d7cae5
2 changed files with 8 additions and 28 deletions
|
@ -69,7 +69,6 @@ module dcache(
|
|||
logic stage2_store;
|
||||
logic [3:0] stage2_be;
|
||||
logic [2:0] stage2_fn3;
|
||||
logic [31:0] stage2_data_in;
|
||||
logic [31:0] stage2_data;
|
||||
|
||||
logic stage2_use_forwarded_data;
|
||||
|
@ -109,15 +108,6 @@ module dcache(
|
|||
/*************************************
|
||||
* 2nd cycle signals
|
||||
*************************************/
|
||||
always_ff @ (posedge clk) begin
|
||||
if(rst)
|
||||
stage2_use_forwarded_data <= 0;
|
||||
else if (ls.new_request)
|
||||
stage2_use_forwarded_data <= use_forwarded_data;
|
||||
else if (store_complete)
|
||||
stage2_use_forwarded_data <= 0;
|
||||
end
|
||||
|
||||
always_ff @ (posedge clk) begin
|
||||
if (ls.new_request) begin
|
||||
stage2_addr <= ls_inputs.addr;
|
||||
|
@ -125,14 +115,11 @@ module dcache(
|
|||
stage2_load <= ls_inputs.load;
|
||||
stage2_store <= ls_inputs.store;
|
||||
stage2_fn3 <= ls_inputs.fn3;
|
||||
stage2_data_in <= ls_inputs.data_in;
|
||||
stage2_data <= ls_inputs.data_in;
|
||||
stage2_amo <= amo;
|
||||
end
|
||||
end
|
||||
|
||||
assign dcache_stage2_fn3 = stage2_fn3;
|
||||
assign dcache_forward_data = stage2_use_forwarded_data;
|
||||
|
||||
/*************************************
|
||||
* General Control Logic
|
||||
*************************************/
|
||||
|
@ -248,7 +235,7 @@ module dcache(
|
|||
|
||||
//AMO op processing on incoming data
|
||||
always_ff @ (posedge clk) begin
|
||||
amo_rs2 <= stage2_data_in; //Only forwarding on STORE opcode
|
||||
amo_rs2 <= stage2_data;
|
||||
end
|
||||
|
||||
assign amo_alu_inputs.rs1_load = l1_response.data;
|
||||
|
@ -263,7 +250,7 @@ module dcache(
|
|||
if (stage2_amo.is_amo & is_target_word)
|
||||
new_line_data = amo_result;
|
||||
else if (stage2_amo.is_sc)
|
||||
new_line_data = stage2_data_in;//Only forwarding on STORE opcode
|
||||
new_line_data = stage2_data;
|
||||
else
|
||||
new_line_data = l1_response.data;
|
||||
end
|
||||
|
@ -272,7 +259,6 @@ module dcache(
|
|||
assign sc_write_index = stage2_addr[DCACHE_SUB_LINE_ADDR_W+1:2];
|
||||
assign update_word_index = stage2_amo.is_sc ? sc_write_index : word_count;
|
||||
////////////////////////////////////////////////////////
|
||||
assign stage2_data = stage2_use_forwarded_data ? ls_inputs.data_in : stage2_data_in;
|
||||
|
||||
//Data Bank(s)
|
||||
ddata_bank #(DCACHE_LINES*DCACHE_LINE_W*DCACHE_WAYS) data_bank (
|
||||
|
|
|
@ -97,8 +97,6 @@ module load_store_unit (
|
|||
logic unaligned_addr;
|
||||
logic [NUM_SUB_UNITS-1:0] sub_unit_address_match;
|
||||
|
||||
logic dcache_forward_data;
|
||||
logic [2:0] dcache_stage2_fn3;
|
||||
logic unit_stall;
|
||||
|
||||
typedef struct packed{
|
||||
|
@ -221,20 +219,16 @@ module load_store_unit (
|
|||
assign shared_inputs.be = be;
|
||||
assign shared_inputs.fn3 = stage1.fn3;
|
||||
|
||||
logic forward_data;
|
||||
assign forward_data = stage1.load_store_forward | dcache_forward_data;
|
||||
assign stage1_raw_data = forward_data ? previous_load : stage1.rs2;
|
||||
assign stage1_raw_data = stage1.load_store_forward ? previous_load : stage1.rs2;
|
||||
|
||||
//Input: ABCD
|
||||
//Assuming aligned requests,
|
||||
//Possible byte selections: (A/C/D, B/D, C/D, D)
|
||||
logic [1:0] data_in_mux;
|
||||
always_comb begin
|
||||
data_in_mux = dcache_forward_data ? dcache_stage2_fn3[1:0] : virtual_address[1:0];
|
||||
shared_inputs.data_in[7:0] = stage1_raw_data[7:0];
|
||||
shared_inputs.data_in[15:8] = (data_in_mux == 2'b01) ? stage1_raw_data[7:0] : stage1_raw_data[15:8];
|
||||
shared_inputs.data_in[23:16] = (data_in_mux == 2'b10) ? stage1_raw_data[7:0] : stage1_raw_data[23:16];
|
||||
case(data_in_mux)
|
||||
shared_inputs.data_in[15:8] = (virtual_address[1:0] == 2'b01) ? stage1_raw_data[7:0] : stage1_raw_data[15:8];
|
||||
shared_inputs.data_in[23:16] = (virtual_address[1:0] == 2'b10) ? stage1_raw_data[7:0] : stage1_raw_data[23:16];
|
||||
case(virtual_address[1:0])
|
||||
2'b10 : shared_inputs.data_in[31:24] = stage1_raw_data[15:8];
|
||||
2'b11 : shared_inputs.data_in[31:24] = stage1_raw_data[7:0];
|
||||
default : shared_inputs.data_in[31:24] = stage1_raw_data[31:24];
|
||||
|
@ -294,7 +288,7 @@ module load_store_unit (
|
|||
assign unit_ready[DCACHE_ID] = cache.ready;
|
||||
assign unit_data_valid[DCACHE_ID] = cache.data_valid;
|
||||
|
||||
dcache data_cache (.*, .ls_inputs(shared_inputs), .ls(cache), .amo(stage1.amo), .use_forwarded_data(stage1.load_store_forward), .data_out(unit_data_array[DCACHE_ID]));
|
||||
dcache data_cache (.*, .ls_inputs(shared_inputs), .ls(cache), .amo(stage1.amo), .data_out(unit_data_array[DCACHE_ID]));
|
||||
end
|
||||
endgenerate
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue