diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2026-11-07 02:59:33 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2026-11-07 02:59:33 +0800 |
| commit | bc3ec25107314be3cd816c0b669d82338e892806 (patch) | |
| tree | ff3e69ce6be1218be8bd0dd04e0c75760776d7dc /rv64cpu/tb/unit/tb_alu.cc | |
| parent | c67ba709482821f37d63601b001ac07e6db867b6 (diff) | |
| download | rcc-project-bc3ec25107314be3cd816c0b669d82338e892806.tar.gz rcc-project-bc3ec25107314be3cd816c0b669d82338e892806.tar.xz | |
checkpoint: preserve current RV64 CPU development state
Diffstat (limited to 'rv64cpu/tb/unit/tb_alu.cc')
| -rw-r--r-- | rv64cpu/tb/unit/tb_alu.cc | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/rv64cpu/tb/unit/tb_alu.cc b/rv64cpu/tb/unit/tb_alu.cc index 04eaaed..0ed5059 100644 --- a/rv64cpu/tb/unit/tb_alu.cc +++ b/rv64cpu/tb/unit/tb_alu.cc @@ -22,16 +22,24 @@ #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 + ALU_ADD = 0, + ALU_SUB = 8, + ALU_SLL = 1, + ALU_SLT = 2, + ALU_SLTU = 3, + ALU_XOR = 4, + ALU_SRL = 5, + ALU_SRA = 13, + ALU_OR = 6, + ALU_AND = 7, + ALU_MUL = 16, + ALU_MULH = 17, + ALU_MULHSU = 18, + ALU_MULHU = 19, + ALU_DIV = 20, + ALU_DIVU = 21, + ALU_REM = 22, + ALU_REMU = 23 }; void test_alu(Valu* alu, uint8_t op, uint64_t rs1, uint64_t rs2, uint64_t expected, const char* test_name) { @@ -104,10 +112,25 @@ int main(int argc, char** argv) { // SLT Edge Cases test_alu(alu, ALU_SLT, 0x8000000000000000ULL, 0x7FFFFFFFFFFFFFFFULL, 1, "SLT_Min_max"); test_alu(alu, ALU_SLT, 0x7FFFFFFFFFFFFFFFULL, 0x8000000000000000ULL, 0, "SLT_Max_Min"); + + // M extension + test_alu(alu, ALU_MUL, 7, 6, 42, "MUL_Positive"); + test_alu(alu, ALU_MUL, 0xFFFFFFFFFFFFFFFFULL, 2, 0xFFFFFFFFFFFFFFFEULL, "MUL_NegativeLow"); + test_alu(alu, ALU_MULH, 0xFFFFFFFFFFFFFFFFULL, 2, 0xFFFFFFFFFFFFFFFFULL, "MULH_Negative"); + test_alu(alu, ALU_MULHU, 0xFFFFFFFFFFFFFFFFULL, 2, 1, "MULHU_UnsignedHigh"); + test_alu(alu, ALU_DIV, (uint64_t)-21, 4, (uint64_t)-5, "DIV_SignedTruncTowardZero"); + test_alu(alu, ALU_DIVU, 21, 4, 5, "DIVU"); + test_alu(alu, ALU_REM, (uint64_t)-21, 4, (uint64_t)-1, "REM_Signed"); + test_alu(alu, ALU_REMU, 21, 4, 1, "REMU"); + test_alu(alu, ALU_DIV, 123, 0, 0xFFFFFFFFFFFFFFFFULL, "DIV_ByZero"); + test_alu(alu, ALU_REM, 123, 0, 123, "REM_ByZero"); + test_alu(alu, ALU_DIV, 0x8000000000000000ULL, 0xFFFFFFFFFFFFFFFFULL, + 0x8000000000000000ULL, "DIV_Overflow"); + test_alu(alu, ALU_REM, 0x8000000000000000ULL, 0xFFFFFFFFFFFFFFFFULL, 0, "REM_Overflow"); std::cout << "----------------------------------" << std::endl; std::cout << "\033[32mAll tests passed!\033[0m" << std::endl; std::cout << "----------------------------------" << std::endl; delete alu; return 0; -}
\ No newline at end of file +} |
