RVSCC/rtl/HazardUnit.sv
2023-01-29 01:55:22 -03:00

54 lines
1.5 KiB
Systemverilog

`timescale 1ns / 1ps
module HazardUnit (
input logic rst,
execute_pc_src,
execute_result_src_0,
memory_reg_write,
writeback_reg_write,
input logic [4:0] decode_rs_1,
decode_rs_2,
execute_rs_1,
execute_rs_2,
execute_rd,
memory_rd,
writeback_rd,
output logic fetch_stall,
decode_stall,
decode_flush,
execute_flush,
output logic [1:0] execute_forward_a,
execute_forward_b
);
logic lw_stall;
always_comb begin
if (rst) begin
fetch_stall = 0;
decode_stall = 0;
decode_flush = 1;
execute_flush = 1;
execute_forward_a = 0;
execute_forward_b = 0;
end else begin
if (((execute_rs_1 == memory_rd) & memory_reg_write) & (execute_rs_1 != 0))
execute_forward_a = 'b10;
else if (((execute_rs_1 == writeback_rd) & writeback_reg_write) & (execute_rs_1 != 0))
execute_forward_a = 'b01;
else execute_forward_a = 'b00;
if (((execute_rs_2 == memory_rd) & memory_reg_write) & (execute_rs_2 != 0))
execute_forward_b = 'b10;
else if (((execute_rs_2 == writeback_rd) & writeback_reg_write) & (execute_rs_2 != 0))
execute_forward_b = 'b01;
else execute_forward_b = 'b00;
lw_stall = execute_result_src_0 & ((decode_rs_1 == execute_rd) | (decode_rs_2 == execute_rd));
fetch_stall = lw_stall;
decode_stall = lw_stall;
decode_flush = execute_pc_src;
execute_flush = lw_stall | execute_pc_src;
end
end
endmodule