`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: nope // Engineer: Jose // // Create Date: 02/20/2026 09:21:52 AM // Design Name: Hazard Unit // Module Name: hazard // Project Name: riscv-ac // Target Devices: Artix 7 // Tool Versions: 2025.2 // Description: Manages hazards between memory instructions and any other // // Dependencies: // // Revision: 1.0 // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module hazard ( input [4:0] IF_ID_Rs1, input [4:0] IF_ID_Rs2, input [4:0] ID_EX_Rd, input ID_EX_MemRead, input Branch_Taken, output reg PC_En, output reg IF_ID_En, output reg IF_ID_Clr, output reg ID_EX_Clr ); always @(*) begin PC_En = 1'b1; IF_ID_En = 1'b1; IF_ID_Clr = 1'b0; ID_EX_Clr = 1'b0; // si: // - se lee de memoria // - el Rd no es x0 // - el Rd es Rs1 o Rs2 // entonces: // bloqueamos para que el dato generado en ME lo pueda coger EX if (ID_EX_MemRead && (ID_EX_Rd != 5'b0) && ((ID_EX_Rd == IF_ID_Rs1) || (ID_EX_Rd == IF_ID_Rs2))) begin PC_En = 1'b0; IF_ID_En = 1'b0; ID_EX_Clr = 1'b1; end // si: // - salto tomado // entonces: // flush síncrono al reg IF/ID else if (Branch_Taken) begin IF_ID_Clr = 1'b1; end end endmodule