Stall the decode stage if it is waiting on a load
This commit is contained in:
parent
965311c1e5
commit
0acde319b0
3 changed files with 38 additions and 1 deletions
14
rv32.sv
14
rv32.sv
|
|
@ -18,7 +18,17 @@ module rv32 (
|
|||
|
||||
rv32_hazard hazard (
|
||||
/* control in */
|
||||
.decode_rs1_in(decode_rs1),
|
||||
.decode_rs2_in(decode_rs2),
|
||||
|
||||
.execute_mem_read_en_in(execute_mem_read_en),
|
||||
.execute_rd_in(execute_rd),
|
||||
.execute_rd_writeback_in(execute_rd_writeback),
|
||||
|
||||
.mem_branch_taken_in(mem_branch_taken),
|
||||
.mem_read_en_in(mem_read_en),
|
||||
.mem_rd_in(mem_rd),
|
||||
.mem_rd_writeback_in(mem_rd_writeback),
|
||||
|
||||
/* control out */
|
||||
.fetch_stall_out(fetch_stall),
|
||||
|
|
@ -222,6 +232,7 @@ module rv32 (
|
|||
.branch_pc_in(execute_branch_pc),
|
||||
|
||||
/* control out */
|
||||
.read_en_out(mem_read_en),
|
||||
.branch_taken_out(mem_branch_taken),
|
||||
.rd_out(mem_rd),
|
||||
.rd_writeback_out(mem_rd_writeback),
|
||||
|
|
@ -231,6 +242,9 @@ module rv32 (
|
|||
.branch_pc_out(mem_branch_pc)
|
||||
);
|
||||
|
||||
/* mem -> hazard control */
|
||||
logic mem_read_en;
|
||||
|
||||
/* mem -> writeback control */
|
||||
logic [4:0] mem_rd;
|
||||
logic mem_rd_writeback;
|
||||
|
|
|
|||
|
|
@ -3,7 +3,17 @@
|
|||
|
||||
module rv32_hazard (
|
||||
/* control in */
|
||||
input [4:0] decode_rs1_in,
|
||||
input [4:0] decode_rs2_in,
|
||||
|
||||
input execute_mem_read_en_in,
|
||||
input [4:0] execute_rd_in,
|
||||
input execute_rd_writeback_in,
|
||||
|
||||
input mem_branch_taken_in,
|
||||
input mem_read_en_in,
|
||||
input [4:0] mem_rd_in,
|
||||
input mem_rd_writeback_in,
|
||||
|
||||
/* control out */
|
||||
output fetch_stall_out,
|
||||
|
|
@ -18,10 +28,21 @@ module rv32_hazard (
|
|||
output mem_stall_out,
|
||||
output mem_flush_out
|
||||
);
|
||||
logic decode_wait_for_mem_read;
|
||||
|
||||
always_comb begin
|
||||
if ((decode_rs1_in == execute_rd_in || decode_rs2_in == execute_rd_in) && |execute_rd_in && execute_mem_read_en_in && execute_rd_writeback_in)
|
||||
decode_wait_for_mem_read = 1;
|
||||
else if ((decode_rs1_in == mem_rd_in || decode_rs2_in == mem_rd_in) && |mem_rd_in && mem_read_en_in && mem_rd_writeback_in)
|
||||
decode_wait_for_mem_read = 1;
|
||||
else
|
||||
decode_wait_for_mem_read = 0;
|
||||
end
|
||||
|
||||
assign fetch_stall_out = decode_stall_out;
|
||||
assign fetch_flush_out = 0;
|
||||
|
||||
assign decode_stall_out = execute_stall_out;
|
||||
assign decode_stall_out = execute_stall_out || decode_wait_for_mem_read;
|
||||
assign decode_flush_out = fetch_stall_out || mem_branch_taken_in;
|
||||
|
||||
assign execute_stall_out = mem_stall_out;
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ module rv32_mem (
|
|||
input [31:0] branch_pc_in,
|
||||
|
||||
/* control out */
|
||||
output read_en_out,
|
||||
output branch_taken_out,
|
||||
output [4:0] rd_out,
|
||||
output rd_writeback_out,
|
||||
|
|
@ -115,6 +116,7 @@ module rv32_mem (
|
|||
|
||||
always_ff @(posedge clk) begin
|
||||
if (!stall_in) begin
|
||||
read_en_out <= read_en_in;
|
||||
rd_out <= rd_in;
|
||||
rd_writeback_out <= rd_writeback_in;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue