`timescale 1ns / 1ps `default_nettype none // ----------------------------------------------------------------------------- // 冒险/流水控制单元。 // // load-use 冒险:EX 级是 load 且 ID 级指令马上要用它的结果时,插入一个 // 气泡(停顿一拍)。其余数据相关由前递网络解决。 // 冲刷(flush_younger)优先级高于停顿:中断、URET、ecall 停机、分支 // 重定向都会丢弃年轻指令,此时不需要再插气泡。 // ----------------------------------------------------------------------------- module cpu21_riscv_hazard_unit ( input wire ifid_valid_i, input wire idex_valid_i, input wire idex_mem_to_reg_i, input wire [4:0] idex_rd_i, input wire d_uses_rs1_i, input wire d_uses_rs2_i, input wire [4:0] d_src1_idx_i, input wire [4:0] d_src2_idx_i, // 冲刷来源 input wire take_irq_i, input wire uret_redirect_i, input wire halt_event_i, input wire redirect_valid_i, input wire halted_i, // 控制结果 output wire load_use_hazard_o, output wire flush_younger_o, output wire pipeline_stall_o ); // EX 级为 load,且 ID 级的源寄存器与它的目的寄存器相同。 assign load_use_hazard_o = ifid_valid_i && idex_valid_i && idex_mem_to_reg_i && (idex_rd_i != 5'd0) && ((d_uses_rs1_i && (d_src1_idx_i == idex_rd_i)) || (d_uses_rs2_i && (d_src2_idx_i == idex_rd_i))); assign flush_younger_o = take_irq_i || uret_redirect_i || halt_event_i || redirect_valid_i; assign pipeline_stall_o = load_use_hazard_o && !flush_younger_o && !halted_i; endmodule `default_nettype wire