aboutsummaryrefslogblamecommitdiff
path: root/multiplier/tb_multiplier.cpp
blob: 040df80bcd686d69e98715c598777bab98cb524e (plain) (tree)




























































































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