# 乘除法(多周期单元)测试:每个结果都写给 MMIO 的 LED 寄存器,供测试平台比对。 # 期望输出顺序见同目录 muldiv_test.expected(共 13 个值)。 # # ① mul 7 * 6 = 42 -> 0000002a # ② mul -5 * 4 = -20 -> ffffffec # ③ mulh 0x40000000 * 4 高 32 位 -> 00000001 # ④ mulhu 0xffffffff * 2 高 32 位 -> 00000001 # ⑤ mulhsu -1 * 0xffffffff 高 32 位 -> ffffffff # ⑥ divu 100 / 7 = 14 -> 0000000e # ⑦ remu 100 % 7 = 2 -> 00000002 # ⑧ divu 0xffffffff / 2 = 2147483647 -> 7fffffff # ⑨ divu 12345 / 0 除零约定 -> ffffffff # ⑩ remu 12345 % 0 除零约定 -> 00003039 # ⑪ remu 0xffffffff % 16 = 15 -> 0000000f # ⑫ mul 0x12345678 * 16 低 32 位 -> 23456780 # ⑬ mulh 0x12345678 * 0x1000 高 32 位 -> 00000123 # # 用法:python tools/rv_asm.py testbench/programs/muldiv_test.asm testbench/rom/muldiv_test.hex # ① mul:有符号乘法的低 32 位 addi t1, zero, 7 addi t2, zero, 6 mul a0, t1, t2 print # ② mul:负乘数(低 32 位) addi t1, zero, -5 addi t2, zero, 4 mul a0, t1, t2 print # ③ mulh:正数相乘,高 32 位不为 0 lui t1, 0x40000 addi t2, zero, 4 mulh a0, t1, t2 print # ④ mulhu:无符号高位(0xffffffff * 2 = 0x1_fffffffe) addi t1, zero, -1 addi t2, zero, 2 mulhu a0, t1, t2 print # ⑤ mulhsu:有符号 x 无符号(-1 * 4294967295 = 0xffffffff_00000001) addi t1, zero, -1 addi t2, zero, -1 mulhsu a0, t1, t2 print # ⑥ divu:普通除法 addi t1, zero, 100 addi t2, zero, 7 divu a0, t1, t2 print # ⑦ remu:普通取余 remu a0, t1, t2 print # ⑧ divu:无符号大数 addi t1, zero, -1 addi t2, zero, 2 divu a0, t1, t2 print # ⑨ divu:除零(商为全 1) lui t1, 0x3 addi t1, t1, 0x39 # t1 = 12345 addi t2, zero, 0 divu a0, t1, t2 print # ⑩ remu:除零(余数为被除数) remu a0, t1, t2 print # ⑪ remu:0xffffffff % 16 addi t1, zero, -1 addi t2, zero, 16 remu a0, t1, t2 print # ⑫ mul:0x12345678 * 16 的低 32 位 lui t1, 0x12345 addi t1, t1, 0x678 addi t2, zero, 16 mul a0, t1, t2 print # ⑬ mulh:0x12345678 * 0x1000 的高 32 位 lui t2, 0x1 mulh a0, t1, t2 print halt