- 现在只有一份源文件,就在 pipelined-cpu/ 下:
srcs/rtl(13 个处理器 RTL)、srcs/board、srcs/constrs、srcs/tb、srcs/rom、
tools/(rv_asm.py、hex2vh.py、run_regress.ps1)、programs/(汇编源码与期望值)。
仓库根目录的 rtl/、board/、testbench/、tools/ 已删除(删除前逐个文件比对过 MD5,
与工程目录里的副本完全一致),说明文档仍放在最外层
cpu21_riscv_redirect_int_bpb说明.md。
- .gitignore 改为:忽略 pipelined-cpu/ 下的工程生成物(*.xpr、*.runs、*.sim、*.cache…),
只跟踪 srcs/、tools/、programs/、create_project.tcl;_tmp/、_vivado/ 等本地临时目录
继续忽略。
- 新增 tools/run_regress.ps1:一键回归脚本。编译 srcs/rtl/ → 跑 muldiv/isa/lui/mmio
四个指令测试并与 programs/*.expected 逐值比对 → 跑两个流水基线 → 跑板级顶层
(-d BOARD_ROM_FAST)检查跑马灯,最后汇总 PASS/FAIL 并返回失败数作为退出码。
编译与仿真的中间文件写在 %TEMP%\cpu21_regress,不污染工程目录。实测全部通过。
- 新增 programs/board_demo_fast.asm:快速版演示程序(延时初值 64,约 2.6 µs/步),
对应 srcs/board/cpu21_board_rom_fast.vh;仿真时用 -d BOARD_ROM_FAST 才会选到它。
- 两个测试平台增加 srcs/rom 探测路径,工程目录内直接 Run Simulation 即可加载镜像。
- 文档:目录结构一节按新布局重写;新增“回归测试”一节(脚本用法 + 期望基线数字);
上板章节的生成/仿真命令改为相对工程目录(python tools/rv_asm.py programs/…、
xvlog -d BOARD_ROM_FAST srcs/rtl/*.v …);tools 里的用法示例同步更新;
“工程分享”一节去掉已不存在的副本同步说明。
- 清理:删除本地 _tmp/(约 57 MB)、_vivado/、.Xil/ 临时目录。
422 lines
8.3 KiB
NASM
422 lines
8.3 KiB
NASM
.text
|
|
addi sp, zero, 2000 #内存堆栈初始化
|
|
|
|
#############################################################
|
|
#走马灯测?,测试addi,andi,slli,srli,srai,or,ori,nor,ecall LED按走马灯方式来回显示数据
|
|
#############################################################
|
|
|
|
.text
|
|
START:
|
|
|
|
addi s0,zero,1
|
|
slli s3, s0, 31 # s3=0x80000000
|
|
srai s3, s3, 31 # s3=0xFFFFFFFF
|
|
add s0,zero,zero # s0=0
|
|
addi s2,zero,12
|
|
|
|
addi s6,zero,8 #走马灯计数
|
|
zmd_loop:
|
|
|
|
addi s0, s0, 1 #计算下一个走马灯的数
|
|
andi s0, s0, 15
|
|
|
|
#######################################
|
|
addi t0,zero,8
|
|
addi t1,zero,1
|
|
left:
|
|
|
|
slli s3, s3, 4 #走马灯左移
|
|
or s3, s3, s0
|
|
|
|
add a0,zero,s3 # display s3
|
|
addi a7,zero,34 # system call for LED display
|
|
ecall # display
|
|
|
|
sub t0,t0,t1
|
|
bne t0,zero,left
|
|
#######################################
|
|
|
|
addi s0, s0, 1 #计算下一个走马灯的数
|
|
addi t6,zero,15
|
|
and s0, s0, t6
|
|
slli s0, s0, 28
|
|
|
|
addi t0,zero,8
|
|
addi t1,zero,1
|
|
|
|
zmd_right:
|
|
|
|
srli s3, s3, 4 #走马灯右移
|
|
or s3, s3, s0
|
|
|
|
add a0,zero,s3 # display s3
|
|
addi a7,zero,34 # system call for LED display
|
|
ecall # display
|
|
|
|
sub t0,t0,t1
|
|
bne t0,zero,zmd_right
|
|
srli s0, s0, 28
|
|
#######################################
|
|
|
|
sub s6,s6,t1
|
|
beq s6,zero, exit
|
|
j zmd_loop
|
|
|
|
exit:
|
|
|
|
add t0,zero,zero
|
|
xori t0,t0,-1 #test nor ori
|
|
slli t0,t0,16
|
|
ori t0,t0,-1
|
|
|
|
add a0,zero,t0 # display t0
|
|
addi a7,zero,34 # system call for LED display
|
|
ecall # display
|
|
|
|
j START # loop forever
|
|
|
|
|
|
#InteruptProgram1:
|
|
#############################################################################################
|
|
# exceptoin 1
|
|
# 使用?s6? s5?s4?s3?s0?a0?a7
|
|
#############################################################################################
|
|
|
|
################# 保护现场
|
|
InteruptProgram1:
|
|
sw t0, 0(sp) #保护t0现场
|
|
addi sp, sp, 4
|
|
sw t3, 0(sp) #保护t3现场
|
|
addi sp, sp, 4
|
|
sw s1, 0(sp) #保护s1现场
|
|
addi sp, sp, 4
|
|
sw a7, 0(sp)
|
|
addi sp, sp, 4
|
|
sw a0, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s0, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s3, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s4, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s5, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s6, 0(sp)
|
|
addi sp, sp, 4
|
|
|
|
csrrsi s6,0x41,0 #s6=uepc
|
|
sw s6, 0(sp) #uepc压栈保护
|
|
addi sp, sp, 4
|
|
|
|
|
|
################# 开中断
|
|
csrrsi zero,0x4,1 #ustatus.MIE=1
|
|
|
|
################# DIVU测试
|
|
addi t0,zero,2 # /2
|
|
addi s1,zero, 0x11
|
|
slli s1,s1,8
|
|
addi s1,s1,0x11
|
|
slli s1,s1,16
|
|
|
|
add a0,zero,s1
|
|
addi a7,zero,34
|
|
ecall
|
|
addi t3,zero,28 #ѭ������
|
|
|
|
divu_branch:
|
|
divu s1,s1,t0 #����ָ��
|
|
add a0,zero,s1
|
|
addi a7,zero,34
|
|
ecall #�����ǰֵ
|
|
addi t3,t3, -1
|
|
bne t3,zero,divu_branch #ѭ��
|
|
|
|
|
|
addi a7,zero,10
|
|
|
|
################# 中断服务
|
|
addi s6,zero,1 #中断?1,2,3 不同中断号显示值不一样
|
|
addi s4,zero,3 #循环次数初始值
|
|
addi s5,zero,1 #计数器累加值
|
|
|
|
IntLoop1:
|
|
add s0,zero,s6
|
|
|
|
IntLeftShift1:
|
|
|
|
slli s0, s0, 4
|
|
or s3,s0,s4
|
|
add a0,zero,s3 #display s0
|
|
addi a7,zero,34 # display hex
|
|
ecall
|
|
|
|
bne s0, zero, IntLeftShift1
|
|
sub s4,s4,s5 #循环次数递减
|
|
bne s4, zero, IntLoop1
|
|
|
|
################# 关中断
|
|
csrrci zero,0x4,1 #ustatus.MIE=0
|
|
|
|
################# 恢复现场
|
|
addi sp, sp, -4
|
|
lw s6, 0(sp)
|
|
|
|
csrrw zero,0x41,s6 #uepc=s6
|
|
|
|
addi sp, sp, -4
|
|
lw s6, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s5, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s4, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s3, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s0, 0(sp)
|
|
addi sp, sp, -4
|
|
lw a0, 0(sp)
|
|
addi sp, sp, -4
|
|
lw a7, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s1, 0(sp) #恢复s1现场
|
|
addi sp, sp, -4
|
|
lw t3, 0(sp) #恢复t3现场
|
|
addi sp, sp, -4
|
|
lw t0, 0(sp) #恢复t0现场
|
|
|
|
################ 中断返回
|
|
uret #同步开中断,uepc-->pc
|
|
|
|
|
|
#InteruptProgram2:
|
|
#############################################################################################
|
|
# exceptoin 2
|
|
# 使用?s6? s5?s4?s3?s0?a0?a7
|
|
#############################################################################################
|
|
|
|
################# 保护现场
|
|
InteruptProgram2:
|
|
sw t1, 0(sp) #保护t1现场
|
|
addi sp, sp, 4
|
|
sw t3, 0(sp) #保护t3现场
|
|
addi sp, sp, 4
|
|
sw s1, 0(sp) #保护s1现场
|
|
addi sp, sp, 4
|
|
sw s2, 0(sp) #保护s2现场
|
|
addi sp, sp, 4
|
|
sw a7, 0(sp)
|
|
addi sp, sp, 4
|
|
sw a0, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s0, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s3, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s4, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s5, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s6, 0(sp)
|
|
addi sp, sp, 4
|
|
|
|
csrrsi s6,0x41,0 #s6=uepc
|
|
sw s6, 0(sp) #uepc压栈保护
|
|
addi sp, sp, 4
|
|
|
|
|
|
################# 开中断
|
|
csrrsi zero,0x4,1 #ustatus.MIE=1
|
|
|
|
################# BLT测试
|
|
addi s1,zero,-15 #初始值
|
|
blt_branch:
|
|
add a0,zero,s1
|
|
addi a7,zero,34
|
|
ecall #输出当前值
|
|
addi s1,s1,1
|
|
blt s1,zero,blt_branch #当前指令
|
|
|
|
|
|
addi a7,zero,10
|
|
|
|
################# 中断服务
|
|
|
|
addi s6,zero,2 #中断?1,2,3 不同中断号显示值不一样
|
|
|
|
addi s4,zero,3 #循环次数初始值
|
|
addi s5,zero,1 #计数器累加值
|
|
|
|
IntLoop2:
|
|
add s0,zero,s6
|
|
|
|
IntLeftShift2:
|
|
|
|
|
|
slli s0, s0, 4
|
|
or s3,s0,s4
|
|
add a0,zero,s3 #display s0
|
|
addi a7,zero,34 # display hex
|
|
ecall
|
|
|
|
bne s0, zero, IntLeftShift2
|
|
sub s4,s4,s5 #循环次数递减
|
|
bne s4, zero, IntLoop2
|
|
|
|
################# 关中断
|
|
csrrci zero,0x4,1 #ustatus.MIE=0
|
|
|
|
################# 恢复现场
|
|
|
|
|
|
addi sp, sp, -4
|
|
lw s6, 0(sp)
|
|
csrrw zero,0x41,s6 #uepc=s6
|
|
|
|
addi sp, sp, -4
|
|
lw s6, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s5, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s4, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s3, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s0, 0(sp) #恢复s0现场
|
|
addi sp, sp, -4
|
|
lw a0, 0(sp)
|
|
addi sp, sp, -4
|
|
lw a7, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s2, 0(sp) #恢复s2现场
|
|
addi sp, sp, -4
|
|
lw s1, 0(sp) #恢复s1现场
|
|
addi sp, sp, -4
|
|
lw t3, 0(sp) #恢复t3现场
|
|
addi sp, sp, -4
|
|
lw t1, 0(sp) #恢复t1现场
|
|
|
|
################ 中断返回
|
|
uret #同步开中断,uepc-->pc
|
|
|
|
|
|
#InteruptProgram3:
|
|
#############################################################################################
|
|
# exceptoin 3
|
|
# 使用?s6? s5?s4?s3?s0?a0?a7
|
|
#############################################################################################
|
|
|
|
|
|
################# 保护现场
|
|
InteruptProgram3:
|
|
sw s1, 0(sp) #保护s1现场
|
|
addi sp, sp, 4
|
|
sw a7, 0(sp)
|
|
addi sp, sp, 4
|
|
sw a0, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s0, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s3, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s4, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s5, 0(sp)
|
|
addi sp, sp, 4
|
|
sw s6, 0(sp)
|
|
addi sp, sp, 4
|
|
|
|
csrrsi s6,0x41,0 #s6=uepc
|
|
sw s6, 0(sp) #uepc压栈保护
|
|
addi sp, sp, 4
|
|
|
|
|
|
################# 开中断
|
|
csrrsi zero,0x4,1 #ustatus.MIE=1
|
|
|
|
################# SB测试
|
|
addi t1,zero,0 #init_addr
|
|
addi t3,zero,32 #counter
|
|
|
|
#sb写入 01,02,03,04
|
|
addi s1,zero, 0x00 #
|
|
addi s2,zero, 0x01 #
|
|
|
|
sb_store:
|
|
sb s1,(t1)
|
|
add a0,zero,s1
|
|
addi a7,zero,34 # system call for print
|
|
ecall # print
|
|
|
|
add s1,s1,s2 #data +1
|
|
addi t1,t1,1 # addr ++
|
|
addi t3,t3,-1 #counter
|
|
bne t3,zero,sb_store
|
|
|
|
addi t3,zero,8
|
|
addi t1,zero,0 # addr
|
|
sb_branch:
|
|
lw s1,(t1) #读出数据
|
|
add a0,zero,s1
|
|
addi a7,zero,34 # system call for print
|
|
ecall # print
|
|
addi t1,t1,4
|
|
addi t3,t3, -1
|
|
bne t3,zero,sb_branch
|
|
|
|
addi a7,zero,10 # system call for exit
|
|
|
|
|
|
################# 中断服务
|
|
addi s6,zero,3 #中断?1,2,3 不同中断号显示值不一样
|
|
addi s4,zero,3 #循环次数初始值
|
|
addi s5,zero,1 #计数器累加值
|
|
|
|
IntLoop3:
|
|
add s0,zero,s6
|
|
|
|
IntLeftShift3:
|
|
|
|
slli s0, s0, 4
|
|
or s3,s0,s4
|
|
add a0,zero,s3 #display s0
|
|
addi a7,zero,34 # display hex
|
|
ecall
|
|
|
|
bne s0, zero, IntLeftShift3
|
|
sub s4,s4,s5 #循环次数递减
|
|
bne s4, zero, IntLoop3
|
|
|
|
################# 关中断
|
|
csrrci zero,0x4,1 #ustatus.MIE=0
|
|
|
|
|
|
|
|
################# 恢复现场
|
|
|
|
addi sp, sp, -4
|
|
lw s6, 0(sp)
|
|
csrrw zero,0x41,s6 #uepc=s6
|
|
|
|
addi sp, sp, -4
|
|
lw s6, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s5, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s4, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s3, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s0, 0(sp)
|
|
addi sp, sp, -4
|
|
lw a0, 0(sp)
|
|
addi sp, sp, -4
|
|
lw a7, 0(sp)
|
|
addi sp, sp, -4
|
|
lw s1, 0(sp) #恢复s1现场
|
|
|
|
################ 中断返回
|
|
uret #同步开中断,uepc-->pc
|
|
|