diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2026-03-15 23:30:38 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2026-03-15 23:30:38 +0800 |
| commit | ba535e24e0aaf2fcefa1196dc4d12ad241f349d3 (patch) | |
| tree | f77f3bfa770523c0654890039ba3dab9e45db48b /rv64cpu/tb/unit/tb_alu.cc | |
| parent | f6441a2e6f901748b504ef93872649c9463a404e (diff) | |
| download | rcc-project-ba535e24e0aaf2fcefa1196dc4d12ad241f349d3.tar.gz rcc-project-ba535e24e0aaf2fcefa1196dc4d12ad241f349d3.tar.xz | |
Add and test alu unit
Diffstat (limited to 'rv64cpu/tb/unit/tb_alu.cc')
| -rw-r--r-- | rv64cpu/tb/unit/tb_alu.cc | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/rv64cpu/tb/unit/tb_alu.cc b/rv64cpu/tb/unit/tb_alu.cc new file mode 100644 index 0000000..b783815 --- /dev/null +++ b/rv64cpu/tb/unit/tb_alu.cc @@ -0,0 +1,67 @@ +#include "Valu.h" +#include <cassert> +#include <cstdint> +#include <iostream> +#include <verilated.h> + +enum AluOp { + ALU_ADD = 0b0000, + ALU_SUB = 0b1000, + ALU_SLL = 0b0001, + ALU_SLT = 0b0010, + ALU_SLTU = 0b0011, + ALU_XOR = 0b0100, + ALU_SRL = 0b0101, + ALU_SRA = 0b1101, + ALU_OR = 0b0110, + ALU_AND = 0b0111 +}; + +void test_alu(Valu* alu, uint8_t op, uint64_t rs1, uint64_t rs2, uint64_t expected, const char* test_name) { + alu->alu_op = op; + alu->rs1_val = rs1; + alu->rs2_val = rs2; + + alu->eval(); + + if (alu->alu_res == expected) { + std::cout << "\033[32m"; + std::cout << "[PASS] " << test_name << " | " + << rs1 << " op " << rs2 << " = " << expected << std::endl; + std::cout << "\033[0m"; + } else { + std::cout << "\033[31m"; + std::cerr << "[FAIL] " << test_name << " | " + << "Expected: " << expected << ", Got: " << alu->alu_res << std::endl; + std::cout << "\033[0m"; + assert(false); + } +} + +int main(int argc, char** argv) { + Verilated::commandArgs(argc, argv); + Valu* alu = new Valu; + + std::cout << "Running ALU Unit Test ..." << std::endl; + + test_alu(alu, ALU_ADD, 100, 50, 150, "ADD_Positive"); + test_alu(alu, ALU_SUB, 100, 50, 50, "SUB_Positive"); + + test_alu(alu, ALU_ADD, (uint64_t)-5, 10, 5, "ADD_Negative"); + + test_alu(alu, ALU_AND, 0xFF00, 0x0F0F, 0x0F00, "AND_Mask"); + test_alu(alu, ALU_XOR, 0xAAAA, 0xFFFF, 0x5555, "XOR_Invert"); + + test_alu(alu, ALU_SLL, 1, 10, 1024, "SLL_By_10"); + + uint64_t minus_one = (uint64_t)-1; + uint64_t five = 5; + + test_alu(alu, ALU_SLTU, minus_one, five, 0, "SLTU (Unsigned: -1 < 5 is False)"); + test_alu(alu, ALU_SLT, minus_one, five, 1, "SLT (Signed: -1 < 5 is True)"); + + std::cout << "All tests passed!" << std::endl; + + delete alu; + return 0; +}
\ No newline at end of file |
