From c2f4f7dad93d68d2757b86ff28c1058982c22da5 Mon Sep 17 00:00:00 2001 From: joshua Date: Fri, 22 Dec 2023 20:39:14 -0500 Subject: initial multiplier commit --- multiplier/tb_multiplier.cpp | 93 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 multiplier/tb_multiplier.cpp (limited to 'multiplier/tb_multiplier.cpp') 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 +#include +#include +#include + +#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 in1(dut->a); + std::bitset in2(dut->b); + std::bitset expected(answer); + std::bitset 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 in1(dut->a); + std::bitset in2(dut->b); + std::bitset expected(answer); + std::bitset 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; +} -- cgit v1.2.3