Skip to content

Commit

Permalink
test(branch_addr_calc.cpp): Updated test
Browse files Browse the repository at this point in the history
  • Loading branch information
ShinyMiraidon committed Feb 13, 2024
1 parent 0d7aa74 commit 217b71c
Showing 1 changed file with 41 additions and 88 deletions.
129 changes: 41 additions & 88 deletions dv/branch_addr_calc.cpp
Original file line number Diff line number Diff line change
@@ -1,102 +1,55 @@
#include <cstdint>

#include <catch2/catch_test_macros.hpp>
#include <NyuTestUtil.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;

static void eval(bool mode, bool taken, std::uint32_t imm, std::uint32_t rs1d, std::uint32_t pc_in) {
auto& bac {nyu::getDUT<VBranch_Addr_Calc>()};
bac.addr_mode = mode;
bac.branch_taken = taken;
bac.imm = imm;
bac.rs1d = rs1d;
bac.pc_in = pc_in;
nyu::eval(bac);

INFO("Testing imm = " << imm << ", rs1d = " << rs1d << ", and pc_in = " << pc_in);

for (int i = 0; i < 1000; i++) {
imm = rand() % (int) (pow(2, 32));
rs1d = rand() % (int) (pow(2, 32));
mode = 0;
taken = 0;
if(mode) REQUIRE((uint32_t) bac.branch_addr == (uint32_t) (imm + rs1d));
else REQUIRE((uint32_t) bac.branch_addr == (uint32_t) (pc_in + imm));

if(taken) REQUIRE((uint32_t) bac.npc == (uint32_t) bac.branch_addr);
else REQUIRE((uint32_t) bac.npc == (uint32_t) pc_in);

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;
static void test(bool mode, bool taken) {
for(std::uint32_t imm {0}; imm < 128; ++imm)
for(std::uint32_t rs1d {0}; rs1d < 128; ++rs1d)
for(std::uint32_t pc_in {0}; pc_in < 128; ++pc_in)
eval(mode, taken, imm, rs1d, pc_in);

for (int i = 0; i < 1000; i++) {
imm = rand() % (int) (pow(2, 32));
rs1d = rand() % (int) (pow(2, 32));
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);
}
for(std::uint32_t imm {1}; imm; imm <<= 1)
for(std::uint32_t rs1d {1}; rs1d; rs1d <<= 1)
for(std::uint32_t pc_in {1}; pc_in; pc_in <<= 1)
eval(mode, taken, imm, rs1d, pc_in);
}


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));
rs1d = rand() % (int) (pow(2, 32));
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("PC No Branch") { //Case when branch_addr = pc + imm, but branch is not taken (addr mode 0, taken 0)
test(0, 0);
}

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));
rs1d = rand() % (int) (pow(2, 32));
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);
}
TEST_CASE("PC Branch") { //Case when branch_addr = pc + imm, and branch is taken (addr mode 0, taken 1)
test(0, 1);
}

TEST_CASE("RS1D No Branch") { //Case when branch_addr = imm + rs1d, but branch is not taken (addr mode 1, taken 0)
test(1, 0);
}

TEST_CASE("RS1D Branch") { //Case when branch_addr = rs1d, and branch is taken (addr mode 1, taken 1)
test(1, 1);
}

0 comments on commit 217b71c

Please sign in to comment.