Skip to content

Commit

Permalink
Add(Branch Address Calculator)
Browse files Browse the repository at this point in the history
* update dv CMakeLists.txt

* rtl CMakeLists.txt

* dv and rtl

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update branch_addr_calc.cpp

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update Branch_Addr_Calc.sv

* Update branch_addr_calc.cpp

* Update branch_addr_calc.cpp
  • Loading branch information
gil92723 authored Oct 31, 2023
1 parent 93c11af commit 58f99ec
Show file tree
Hide file tree
Showing 4 changed files with 149 additions and 3 deletions.
4 changes: 2 additions & 2 deletions dv/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ find_package(nyu-util REQUIRED CONFIG)

add_executable(tests)
target_sources(tests PRIVATE
alu.cpp branch_eval.cpp pc.cpp ifid.cpp memwb.cpp gpr.cpp exmem.cpp
alu.cpp branch_eval.cpp pc.cpp ifid.cpp memwb.cpp gpr.cpp exmem.cpp branch_addr_calc.cpp
)
nyu_link_sv(tests PRIVATE core)
nyu_target_verilate(tests
TOP_MODULES Alu Branch_Eval PC IFID MEMWB GPR EXMEM
TOP_MODULES Alu Branch_Eval PC IFID MEMWB GPR EXMEM Branch_Addr_Calc
ARGS COVERAGE
)
target_link_libraries(tests PRIVATE Catch2::Catch2WithMain nyu::covrecorder)
Expand Down
102 changes: 102 additions & 0 deletions dv/branch_addr_calc.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
#include <catch2/catch_test_macros.hpp>
#include <VBranch_Addr_Calc.h>
#include <cstdint>
#include <stdlib.h>
#include <math.h>

TEST_CASE("PC No Branch") { //Case when branch_addr = pc + imm, but branch is not taken
VBranch_Addr_Calc model;
bool mode;
bool taken;
uint32_t imm;
uint32_t rs1d;
uint32_t pc_in;

for (int i = 0; i < 1000; i++) {
imm = rand() % (int) (pow(2, 32) - 1);
rs1d = rand() % (int) (pow(2, 32) - 1);
mode = 0;
taken = 0;

model.addr_mode = mode;
model.imm = imm;
model.rs1d = rs1d;
model.branch_taken = taken;
model.eval();
REQUIRE((uint32_t) model.branch_addr == (uint32_t) (model.pc_in + model.imm));
REQUIRE((uint32_t) model.npc == (uint32_t) model.pc_in);
}
}

TEST_CASE("PC Branch") { //Case when branch_addr = pc + imm, and branch is taken
VBranch_Addr_Calc model;
bool mode;
bool taken;
uint32_t imm;
uint32_t rs1d;
uint32_t pc_in;

for (int i = 0; i < 1000; i++) {
imm = rand() % (int) (pow(2, 32) - 1);
rs1d = rand() % (int) (pow(2, 32) - 1);
mode = 0;
taken = 1;

model.addr_mode = mode;
model.imm = imm;
model.rs1d = rs1d;
model.branch_taken = taken;
model.eval();
REQUIRE((uint32_t) model.branch_addr == (uint32_t) (model.pc_in + model.imm));
REQUIRE((uint32_t) model.npc == (uint32_t) model.branch_addr);
}
}


TEST_CASE("RS1D No Branch") { //Case when branch_addr = imm + rs1d, but branch is not taken
VBranch_Addr_Calc model;
bool mode;
bool taken;
uint32_t imm;
uint32_t rs1d;
uint32_t pc_in;

for (int i = 0; i < 1000; i++) {
imm = rand() % (int) (pow(2, 32) - 1);
rs1d = rand() % (int) (pow(2, 32) - 1);
mode = 1;
taken = 0;

model.addr_mode = mode;
model.imm = imm;
model.rs1d = rs1d;
model.branch_taken = taken;
model.eval();
REQUIRE((uint32_t) model.branch_addr == (uint32_t) (model.imm + model.rs1d));
REQUIRE((uint32_t) model.npc == (uint32_t) model.pc_in);
}
}

TEST_CASE("RS1D Branch") { //Case when branch_addr = rs1d, and branch is taken
VBranch_Addr_Calc model;
bool mode;
bool taken;
uint32_t imm;
uint32_t rs1d;
uint32_t pc_in;

for (int i = 0; i < 1000; i++) {
imm = rand() % (int) (pow(2, 32) - 1);
rs1d = rand() % (int) (pow(2, 32) - 1);
mode = 1;
taken = 1;

model.addr_mode = mode;
model.imm = imm;
model.rs1d = rs1d;
model.branch_taken = taken;
model.eval();
REQUIRE((uint32_t) model.branch_addr == (uint32_t) (model.imm + model.rs1d));
REQUIRE((uint32_t) model.npc == (uint32_t) model.branch_addr);
}
}
44 changes: 44 additions & 0 deletions rtl/Branch_Addr_Calc.sv
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//Branch Address Conditions
parameter PC = 0; //Case when branch_addr = pc + imm
parameter RD = 1; //Case when branch_addr = imm + rs1d

module Branch_Addr_Calc # (
WordSize = 32
)(
input addr_mode, branch_taken,
input [WordSize - 1:0] imm, rs1d, pc_in,
output logic [WordSize - 1:0] branch_addr, npc
);

always_comb begin
case(addr_mode)
PC:
case (branch_taken)
1'b0: begin
branch_addr = pc_in + imm;
npc = pc_in;
end
1'b1: begin
branch_addr = pc_in + imm;
npc = branch_addr;
end
endcase
RD:
case (branch_taken)
1'b0: begin
branch_addr = imm + rs1d;
npc = pc_in;
end
1'b1: begin
branch_addr = imm + rs1d;
npc = branch_addr;
end
endcase
default: begin
branch_addr = pc_in + imm;
npc = pc_in;
end
endcase
end

endmodule
2 changes: 1 addition & 1 deletion rtl/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
nyu_add_sv(core
Alu.sv Branch_Eval.sv PC.sv IFID.sv MEMWB.sv GPR.sv EXMEM.sv
Alu.sv Branch_Eval.sv PC.sv IFID.sv MEMWB.sv GPR.sv EXMEM.sv Branch_Addr_Calc.sv
)

0 comments on commit 58f99ec

Please sign in to comment.