#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; }