# 指令扩展验证程序:每条被测指令的结果都通过 ecall(a7=34) 输出,最后用 halt 停机。 # 期望输出顺序见每行注释(共 24 次输出),同时保存在同目录 isa_test.expected(每行一项 LED 值)。 # # 用法(在仓库根目录执行): # python tools/rv_asm.py testbench/programs/isa_test.asm <仿真工作目录>/risc-v-benchmark_ccab.hex # 再用 testbench/tb_no_intr.v 仿真;hex 命名为 risc-v-benchmark_ccab.hex 时会被测试 # 平台优先从仿真工作目录载入(参见 tb_no_intr.v 的 ROM 探测顺序)。 # print / halt 是 tools/rv_asm.py 提供的双字伪指令: # print = addi a7,zero,34 + ecall;halt = addi a7,zero,10 + ecall。 # ---- sltiu:立即数符号扩展后做无符号比较 ---- addi t0, zero, 1 addi t1, zero, -1 # t1 = 0xffffffff sltiu a0, t0, -1 # 1 00000001 print sltiu a0, t1, 1 # 0xffffffff 00000000 print # ---- xor / sll / srl / sra(原有指令回归)---- addi t0, zero, 0xff addi t1, zero, -1 xor a0, t0, t1 # 0xff ^ 0xffffffff -> ffffff00 print addi t0, zero, 1 addi t1, zero, 31 sll a0, t0, t1 # 1 << 31 -> 80000000 print addi t0, zero, -1 addi t1, zero, 28 srl a0, t0, t1 # 逻辑右移 -> 0000000f print sra a0, t0, t1 # 算术右移 -> ffffffff print # ---- mul:无符号乘积低 32 位 ---- addi t0, zero, 1234 addi t1, zero, 567 mul a0, t0, t1 # 1234*567 = 0x000aad1e print # ---- mulh / mulhu / mulhsu:64 位乘积的高 32 位 ---- addi t0, zero, -1 # 有符号 -1 / 无符号 0xffffffff addi t1, zero, -1 mulh a0, t0, t1 # (-1)*(-1)=1 -> 00000000 print mulhu a0, t0, t1 # 0xffffffff^2 -> fffffffe print addi t0, zero, -1 addi t1, zero, 2 mulhsu a0, t0, t1 # (-1)*2=-2 -> ffffffff print # ---- bltu:0 = ,(-1) >= 0 不成立,应走 fall-through ---- addi t0, zero, -1 bge t0, zero, bge_bad addi a0, zero, 0x602 # 00000602 print jal zero, bge_done bge_bad: addi a0, zero, 0x102 # 不应执行 print bge_done: # ---- bgeu:无符号 >= ,0xffffffff >=u 0 成立 ---- addi t0, zero, -1 bgeu t0, zero, bgeu_ok addi a0, zero, 0x103 # 不应执行 print bgeu_ok: addi a0, zero, 0x603 # 00000603 print # ---- bge 循环:从 -3 递增到 0(共 4 次输出)---- addi s1, zero, -3 bge_loop: add a0, zero, s1 print # fffffffd / fffffffe / ffffffff / 00000000 addi s1, s1, 1 bge zero, s1, bge_loop # ---- bgeu 循环:3 -> 1(共 3 次输出)---- addi t0, zero, 3 bgeu_loop: add a0, zero, t0 print # 00000003 / 00000002 / 00000001 addi t0, t0, -1 addi t2, zero, 1 bgeu t0, t2, bgeu_loop # ---- bltu 循环:4 -> 1(共 4 次输出)---- addi s1, zero, 4 bltu_loop: add a0, zero, s1 print # 00000004 / 00000003 / 00000002 / 00000001 addi s1, s1, -1 bltu zero, s1, bltu_loop halt