From 217b71ce2441e99873b42078da1105efc0ab31ca Mon Sep 17 00:00:00 2001 From: ShinyMiraidon Date: Tue, 13 Feb 2024 15:51:06 -0500 Subject: [PATCH] test(branch_addr_calc.cpp): Updated test --- dv/branch_addr_calc.cpp | 129 +++++++++++++--------------------------- 1 file changed, 41 insertions(+), 88 deletions(-) diff --git a/dv/branch_addr_calc.cpp b/dv/branch_addr_calc.cpp index c66ade79..7fc66be9 100644 --- a/dv/branch_addr_calc.cpp +++ b/dv/branch_addr_calc.cpp @@ -1,102 +1,55 @@ +#include + #include +#include + #include -#include -#include -#include -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()}; + 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); } \ No newline at end of file