Stall the decode stage if it is waiting on a load

This commit is contained in:
Graham Edgecombe 2017-12-04 22:41:47 +00:00
parent 965311c1e5
commit 0acde319b0
3 changed files with 38 additions and 1 deletions

14
rv32.sv
View file

@ -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;

View file

@ -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;

View file

@ -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;