tools/rv_asm.py - 极简 RISC-V 汇编器(Python 3,无第三方依赖),支持 add/sub/and/or/xor/sll/srl/sra/slt/sltu、mul/mulh/mulhsu/mulhu、 addi/slti/sltiu/xori/ori/andi、slli/srli/srai、lw/sw、 beq/bne/blt/bge/bltu/bgeu、lui、jal/jalr、ecall、标签与 # 注释; - 提供 print / halt 两条双字伪指令(分别等价于 addi a7,zero,34 + ecall、 addi a7,zero,10 + ecall); - I 型与访存立即数做 12 位有符号范围检查,越界直接报错,避免静默截断; - 除 hex 外同时输出 .lst 编码清单,便于与 .asm 逐行核对。 testbench/programs/isa_test.asm + isa_test.expected - 指令扩展验证程序:sltiu(两个方向)、xor/sll/srl/sra、mul/mulh/mulhu/mulhsu、 bltu/bge/bgeu 的有符号与无符号区分,以及 bge/bgeu/bltu 三个循环, 共 24 项 LED 输出,期望值逐行保存在 isa_test.expected。 testbench/programs/lui_test.asm - LUI 验证程序:0x12345 / 0xfffff / 0x80000 与 lui+addi 组合,共 4 项输出。 另外包含编辑器/格式化工具对 cpu21_riscv_alu.v、cpu21_riscv_branch_unit.v、 cpu21_riscv_decoder.v 的重排(纯格式,语义等价)。 验证(xsim + testbench/tb_no_intr.v,按提交后的正式路径生成 hex) - isa_test:24 项 LED 输出与 isa_test.expected 逐项一致,143 周期后 halt 停机; - lui_test:12345000 / fffff000 / 80000000 / 12345678,21 周期后停机; - 重新编译无 error / warning。
110 lines
3.5 KiB
NASM
110 lines
3.5 KiB
NASM
# 指令扩展验证程序:每条被测指令的结果都通过 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 <u 0xffffffff -> 00000001
|
||
print
|
||
sltiu a0, t1, 1 # 0xffffffff <u 1 -> 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 <u 0xffffffff 成立(按有符号比较则不成立)----
|
||
addi t0, zero, -1
|
||
bltu zero, t0, bltu_ok
|
||
addi a0, zero, 0x101 # 不应执行
|
||
print
|
||
bltu_ok:
|
||
addi a0, zero, 0x601 # 00000601
|
||
print
|
||
|
||
# ---- bge:有符号 >= ,(-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
|