aboutsummaryrefslogtreecommitdiff
path: root/rv64cpu/tb/unit/tb_alu.cc
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-03-16 14:57:03 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-03-16 15:02:06 +0800
commitac1bfb6ae8253d71904a273b20a1d0e5d4803fd4 (patch)
tree61bd790dcf30dfd3435c7738c1f9e63f3ac121dd /rv64cpu/tb/unit/tb_alu.cc
parent1554746fd79d51c6bd2281820520a4e2d2c16301 (diff)
downloadrcc-project-ac1bfb6ae8253d71904a273b20a1d0e5d4803fd4.tar.gz
rcc-project-ac1bfb6ae8253d71904a273b20a1d0e5d4803fd4.tar.xz
expand tests and format output
Diffstat (limited to 'rv64cpu/tb/unit/tb_alu.cc')
-rw-r--r--rv64cpu/tb/unit/tb_alu.cc27
1 files changed, 27 insertions, 0 deletions
diff --git a/rv64cpu/tb/unit/tb_alu.cc b/rv64cpu/tb/unit/tb_alu.cc
index 0d37b30..60afd4e 100644
--- a/rv64cpu/tb/unit/tb_alu.cc
+++ b/rv64cpu/tb/unit/tb_alu.cc
@@ -77,6 +77,33 @@ int main(int argc, char** argv) {
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)");
+
+ // Missing Basic Operations
+ test_alu(alu, ALU_OR, 0xAAAA, 0x5555, 0xFFFF, "OR_All_Bits");
+ test_alu(alu, ALU_SRL, 0xF000000000000000ULL, 4, 0x0F00000000000000ULL, "SRL_By_4");
+
+ // Arithmetic Right Shift (SRA)
+ test_alu(alu, ALU_SRA, 0xF000000000000000ULL, 4, 0xFF00000000000000ULL, "SRA_Negative_By_4");
+ test_alu(alu, ALU_SRA, 0x7000000000000000ULL, 4, 0x0700000000000000ULL, "SRA_Positive_By_4");
+
+ // Shift Edge Cases
+ test_alu(alu, ALU_SLL, 1, 0, 1, "SLL_By_0");
+ test_alu(alu, ALU_SLL, 1, 63, 0x8000000000000000ULL, "SLL_By_63");
+ test_alu(alu, ALU_SRL, 0x8000000000000000ULL, 63, 1, "SRL_By_63");
+ test_alu(alu, ALU_SRA, 0x8000000000000000ULL, 63, 0xFFFFFFFFFFFFFFFFULL, "SRA_By_63_SignExt");
+
+ // All 0 / All 1 Cases
+ test_alu(alu, ALU_ADD, 0, 0, 0, "ADD_Zero");
+ test_alu(alu, ALU_ADD, 0xFFFFFFFFFFFFFFFFULL, 1, 0, "ADD_Overflow");
+ test_alu(alu, ALU_XOR, 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, 0, "XOR_Same");
+
+ // SLT / SLTU Same Value
+ test_alu(alu, ALU_SLT, 100, 100, 0, "SLT_Same_Value");
+ test_alu(alu, ALU_SLTU, 100, 100, 0, "SLTU_Same_Value");
+
+ // 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");
std::cout << "All tests passed!" << std::endl;
delete alu;