diff options
author | joshua <joshua@joshuayun.com> | 2023-12-22 20:39:14 -0500 |
---|---|---|
committer | joshua <joshua@joshuayun.com> | 2023-12-22 20:39:58 -0500 |
commit | c2f4f7dad93d68d2757b86ff28c1058982c22da5 (patch) | |
tree | 1bbae88e073cc20b9459dec338790d18150e1e1e /multiplier/tb_multiplier.cpp | |
parent | 64174676bb02a59cda6640ccd1eb941f906494b1 (diff) | |
download | riscv-processor-c2f4f7dad93d68d2757b86ff28c1058982c22da5.tar.gz |
initial multiplier commit
Diffstat (limited to 'multiplier/tb_multiplier.cpp')
-rw-r--r-- | multiplier/tb_multiplier.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/multiplier/tb_multiplier.cpp b/multiplier/tb_multiplier.cpp new file mode 100644 index 0000000..040df80 --- /dev/null +++ b/multiplier/tb_multiplier.cpp @@ -0,0 +1,93 @@ +#include <iostream> +#include <iomanip> +#include <bitset> +#include <cstdint> + +#include "Vmultiplier.h" +#include "verilated.h" + +#define BITWIDTH 32 + +int main(int argc, char** argv, char** env) { + + if (false && argc && argv && env) {} + + Verilated::mkdir("logs"); + VerilatedContext* contextp = new VerilatedContext; + + contextp->debug(0); + contextp->randReset(2); + contextp->traceEverOn(true); + contextp->commandArgs(argc, argv); + + Vmultiplier* dut = new Vmultiplier{contextp}; + + uint32_t testsize = 0x1000; + + for (int i = 0; i < testsize; i++) { + for (int j = 0; j < testsize; j++) { + dut->a = (uint32_t) i; + dut->b = (uint32_t) j; + unsigned int answer = (unsigned int) (i * j); + + dut->eval(); + if (answer != dut->c) { + std::bitset<BITWIDTH> in1(dut->a); + std::bitset<BITWIDTH> in2(dut->b); + std::bitset<BITWIDTH*2> expected(answer); + std::bitset<BITWIDTH*2> actual(dut->c); + std::cout << "Inputs: 1: " << in1 << " 2: " << in2 << '\n'; + std::cout << "Expected: " << expected << '\n'; + std::cout << "Actual: " << actual << '\n'; + return -1; + } + } + } + + + std::cout << "LOWER HALF PASSED\n"; + + uint64_t top = 1; + for (int i = 1; i < BITWIDTH; i++) { + top <<= 1; + top |= 1; + } + uint64_t bottom = top - testsize; + + for (uint64_t i = bottom; i < top; i++) { + for (uint64_t j = bottom; j < top; j++) { + + dut->a = (uint32_t) i; + dut->b = (uint32_t) j; + + uint64_t answer = i * j; + + dut->eval(); + if (answer != dut->c) { + std::bitset<BITWIDTH> in1(dut->a); + std::bitset<BITWIDTH> in2(dut->b); + std::bitset<BITWIDTH*2> expected(answer); + std::bitset<BITWIDTH*2> actual(dut->c); + std::cout << "In 1: " << in1 << '\n'; + std::cout << "In 2: " << in2 << '\n'; + std::cout << "Expected: " << expected << '\n'; + std::cout << "Actual: " << actual << '\n'; + + std::cout << "In 1: " << std::hex << (uint32_t) dut->a << '\n'; + std::cout << "In 2: " << std::hex << (uint32_t) dut->b << '\n'; + std::cout << "Expected: " << std::hex << (uint64_t) answer << '\n'; + std::cout << "Actual: " << std::hex << (uint64_t) dut->c << '\n'; + return -1; + } + } + } + + std::cout << "UPPER HALF PASSED\n"; + + + std::cout << "Test Passed for " << BITWIDTH << " bit multiplier\n"; + + delete dut; + delete contextp; + return 0; +} |