aboutsummaryrefslogtreecommitdiff
path: root/multiplier/tb_multiplier.cpp
diff options
context:
space:
mode:
authorjoshua <joshua@joshuayun.com>2023-12-22 20:39:14 -0500
committerjoshua <joshua@joshuayun.com>2023-12-22 20:39:58 -0500
commitc2f4f7dad93d68d2757b86ff28c1058982c22da5 (patch)
tree1bbae88e073cc20b9459dec338790d18150e1e1e /multiplier/tb_multiplier.cpp
parent64174676bb02a59cda6640ccd1eb941f906494b1 (diff)
downloadriscv-processor-c2f4f7dad93d68d2757b86ff28c1058982c22da5.tar.gz
initial multiplier commit
Diffstat (limited to 'multiplier/tb_multiplier.cpp')
-rw-r--r--multiplier/tb_multiplier.cpp93
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;
+}