diff --git a/dv/branch_manager.cpp b/dv/branch_manager.cpp new file mode 100644 index 00000000..6cc7391a --- /dev/null +++ b/dv/branch_manager.cpp @@ -0,0 +1,23 @@ +#include +#include +#include +#include +#include + +TEST_CASE("") { + + VBranch_Manager model; + + //Initialize Module + model.rstn = 1; + model.clk = 0; + model.eval(); + model.rstn_h = 0; + model.eval(); + + + //Test Module + for (int i = 0; i < 1000; i++) { + + } +} \ No newline at end of file diff --git a/rtl/Branch_Manager.sv b/rtl/Branch_Manager.sv new file mode 100644 index 00000000..401fd5f6 --- /dev/null +++ b/rtl/Branch_Manager.sv @@ -0,0 +1,34 @@ +module Branch_Manager ( + input clk, rstn, pred_taken, act_taken + input [WordSize - 1:0] pred_pc, pred_addr + output logic flush + output logic [WordSize - 1:0] npc +); + +logic restart; + +always @ (posedge clk or negedge rstn_h) begin + if (!rstn) begin + restart <= 1; + flush <= 0; + npc <= 0; + end + else begin + if ((pred_taken != act_taken) && !restart) begin + flush <= 1; + case(act_taken) + 0: npc <= pred_pc + 4 + 1: npc <= pred_addr + endcase + end + else begin + flush <= 0; + case(pred_taken) + 0: npc <= pred_pc + 4 + 1: npc <= pred_addr + endcase + end + if (restart) restart <= 0; + end +end +endmodule \ No newline at end of file