icicle/rv32_hazard.sv

46 lines
1.2 KiB
Systemverilog
Raw Normal View History

2017-12-04 21:26:26 +00:00
`ifndef RV32_HAZARD
`define RV32_HAZARD
2017-12-12 21:04:33 +00:00
module rv32_hazard_unit (
2017-12-04 21:47:09 +00:00
/* control in */
input [4:0] decode_rs1_in,
input [4:0] decode_rs2_in,
input decode_mem_read_in,
2017-12-05 18:33:25 +00:00
input [4:0] decode_rd_in,
input decode_rd_write_in,
2017-12-05 18:33:25 +00:00
input mem_branch_taken_in,
2017-12-04 21:47:09 +00:00
/* control out */
output logic fetch_stall_out,
output logic fetch_flush_out,
2017-12-04 21:26:26 +00:00
output logic decode_stall_out,
output logic decode_flush_out,
2017-12-04 21:26:26 +00:00
output logic execute_stall_out,
output logic execute_flush_out,
2017-12-04 21:26:26 +00:00
output logic mem_stall_out,
output logic mem_flush_out
2017-12-04 21:26:26 +00:00
);
logic fetch_wait_for_mem_read;
assign fetch_wait_for_mem_read = (decode_rs1_in == decode_rd_in || decode_rs2_in == decode_rd_in) && |decode_rd_in && decode_mem_read_in && decode_rd_write_in;
2017-12-05 18:33:25 +00:00
assign fetch_stall_out = decode_stall_out || fetch_wait_for_mem_read;
2017-12-04 21:26:26 +00:00
assign fetch_flush_out = 0;
2017-12-05 18:33:25 +00:00
assign decode_stall_out = execute_stall_out;
assign decode_flush_out = fetch_stall_out || mem_branch_taken_in;
2017-12-04 21:26:26 +00:00
assign execute_stall_out = mem_stall_out;
assign execute_flush_out = decode_stall_out || mem_branch_taken_in;
2017-12-04 21:26:26 +00:00
assign mem_stall_out = 0;
assign mem_flush_out = execute_stall_out;
endmodule
`endif