Compare commits

..

1 Commits

Author SHA1 Message Date
23150919-Wang Jiadong 458bcacfec fix: 加强了 lab4 测试数据
10 months ago

1
.gitignore vendored

@ -1,4 +1,3 @@
.vscode/
.metals/
.VSCodeCounter/
.DS_Store

@ -10,7 +10,7 @@
```
# 🚀 [RISCV-LAB](https://github.com/Ciliphen/riscv-lab)
# 🚀 [RISCV-LAB](https://code.educoder.net/ppg69fuwb/riscv-lab)
从零开始的 RV64IMAZicsr_Zifencei 流水线设计实验
@ -49,10 +49,6 @@
## 🛠️ 环境配置
- 以下配置流程在 Ubuntu22.04 以及 WSL2 的 Ubuntu22.04 版本下得到验证,可顺利执行
- 对于 Mac 用户,可使用 brew 工具直接安装对应的工具(由于 brew 安装的 Mill 的版本较新,需将 chisel/build.sc 的内容替换为 [chisel-playground/build.mill](https://github.com/OSCPU/chisel-playground/blob/master/build.mill) 中的内容以解决环境构建问题)
- 推荐使用 Ubuntu22.04 版本进行实验,对于其他环境出现的问题请先自己尝试解决
### 🍕 安装 Verilator
```bash
@ -161,8 +157,8 @@ git pull # 拉取最新代码
```bash
make trace TESTBIN_DIR=<测例对应的bin文件的路径>
# 如在 difftest 目录下输入以下命令可生成CPU运行 am-tests/01-add-longlong.bin 测例的波形
make trace TESTBIN_DIR=./test/bin/am-tests/01-add-longlong.bin
# 如在 difftest 目录下输入以下命令可生成CPU运行 am-tests/add.bin 测例的波形
make trace TESTBIN_DIR=./test/bin/am-tests/add.bin
```
## 📢 注意事项

@ -23,7 +23,7 @@ test:
clean:
rm -rf obj_dir
rm -rf core/PuaCpu.v
rm -rf core/Puacpu.v
perf: obj_dir/V$(TOP_NAME)
$(call git_commit, "perf test RTL") # DO NOT REMOVE THIS LINE!!!
@ -34,17 +34,6 @@ perf: obj_dir/V$(TOP_NAME)
./obj_dir/V$(TOP_NAME) $$test -rvtest -pc -perf; \
done; \
qbench: obj_dir/V$(TOP_NAME)
@echo "==================================================================="
@echo "=========================quick benchmarks=========================="
@echo "==================================================================="
@count=0; \
for test in $$(find ./test/bin/riscv-test/benchmarks \( -name "*.bin" \) | sort | grep -vE "*dhrystone*|*mt-vvadd*"); do \
count=$$((count + 1)); \
echo "Running bench $$count: $$test"; \
./obj_dir/V$(TOP_NAME) $$test -rvtest -pc -perf; \
done; \
lab1: obj_dir/V$(TOP_NAME)
$(call git_commit, "test lab1") # DO NOT REMOVE THIS LINE!!!
./obj_dir/V$(TOP_NAME) ./test/bin/lab-test/lab1.bin -rvtest -initgprs -trace 10000000 -pc
@ -78,7 +67,7 @@ TRACE_TESTS67 := $(addprefix trace_,$(TEST67))
$(TEST67): obj_dir/V$(TOP_NAME)
$(call git_commit, "test $@") # DO NOT REMOVE THIS LINE!!!
count=0; \
for test in $$(ls ./test/bin/am-tests/* | sort); do \
for test in ./test/bin/am-tests/*; do \
count=$$((count + 1)); \
echo "Running test $$count: $$test"; \
./obj_dir/V$(TOP_NAME) $$test -rvtest -pc; \
@ -92,7 +81,7 @@ $(TRACE_TESTS67): obj_dir/V$(TOP_NAME)
$(call git_commit, "trace $*") # DO NOT REMOVE THIS LINE!!!
rm -rf ./trace.txt
count=0; \
for test in $$(ls ./test/bin/am-tests/* | sort); do \
for test in ./test/bin/am-tests/*; do \
count=$$((count + 1)); \
echo "Running test $$count: $$test"; \
./obj_dir/V$(TOP_NAME) $$test -rvtest -cpu_trace -writeappend; \
@ -114,32 +103,21 @@ trace_lab8: obj_dir/V$(TOP_NAME)
lab9: obj_dir/V$(TOP_NAME)
$(call git_commit, "test lab9") # DO NOT REMOVE THIS LINE!!!
count=0; \
for test in $$(find ./test/bin/riscv-test/ \( -name "*rv64ui-p-*" -o -name "*rv64um-p-*" -o -name "*rv64mi-p-*" \) | sort | grep -vE "*rv64ui-p-fence_i|*rv64mi-p-access"); do \
for test in $$(find ./test/bin/riscv-test/ \( -name "*rv64ui-p-*" -o -name "*rv64um-p-*" -o -name "*rv64mi-p-*" \) | grep -vE "*rv64ui-p-fence_i|*rv64mi-p-access"); do \
count=$$((count + 1)); \
echo "Running test $$count: $$test"; \
./obj_dir/V$(TOP_NAME) $$test -rvtest -pc; \
done; \
echo "Total tests run: $$count";
$(MAKE) qbench
trace_lab9: obj_dir/V$(TOP_NAME)
$(call git_commit, "trace lab9") # DO NOT REMOVE THIS LINE!!!
rm -rf ./trace.txt
count=0; \
for test in $$(find ./test/bin/riscv-test/ \( -name "*rv64ui-p-*" -o -name "*rv64um-p-*" -o -name "*rv64mi-p-*" \) | sort | grep -vE "*rv64ui-p-fence_i|*rv64mi-p-access"); do \
for test in $$(find ./test/bin/riscv-test/ \( -name "*rv64ui-p-*" -o -name "*rv64um-p-*" -o -name "*rv64mi-p-*" \) | grep -vE "*rv64ui-p-fence_i|*rv64mi-p-access"); do \
count=$$((count + 1)); \
echo "Running test $$count: $$test"; \
./obj_dir/V$(TOP_NAME) $$test -rvtest -cpu_trace -writeappend; \
done; \
echo "Total tests run: $$count";
help:
@echo "Usage: make [target]"
@echo "Available targets:"
@echo " clean - Remove build artifacts"
@echo " verilog - Generate verilog files"
@echo " perf - Run performance tests"
@echo " lab<number> - Run lab<number>, eg. lab1, lab2, ..."
@echo " trace_lab<number> - Run lab<number> with trace, eg. trace_lab1, trace_lab2, ..."
-include ../Makefile

@ -13,12 +13,12 @@
## 🔨 使用方法
1. 将 CPU 代码放置到相对于本文件夹的 `core` 文件夹中。
2. 在本文件夹下,使用 `make` 命令完成编译结果位于 `obj_dir/Vtop`
2. 在本文件夹下,使用 `make` 命令完成编译编译结果位于 `obj_dir/Vtop`
3. 每次修改 CPU 代码后,需要重新 `make`,如果引入了一些时间早于编译产物的代码,需要先 `make clean``make`
## 🧪 参数说明
`makefile` 中已经预置了常用命令,使用 `make help` 查看命令使用方法
`makefile` 中已经预置了常用命令
在命令 `./obj_dir/Vtop` 后面可以加上不同参数,可以实现不同的功能:
@ -31,4 +31,3 @@
- `-pc` 报错时将额外输出最近的 PC 历史记录
- `-delay` 行为不一致时将继续运行一段时间再停止
- `-cpu_trace` 记录被测试的处理器的程序运行历史信息,生成 trace.txt
- `-perf` 打印处理器运行的IPC数据

@ -39,20 +39,15 @@ public:
status = 0;
csr_mstatus_def *mstatus = (csr_mstatus_def *)&status;
csr_misa_def *isa = (csr_misa_def *)&misa;
if (run_riscv_test)
if (only_modeM && run_riscv_test)
{
if (only_modeM)
{
// 只实现M-Mode的CPU
isa->ext = rv_ext('i') | rv_ext('m');
mstatus->mpp = M_MODE;
}
else
{
// 实现M-Mode和U-Mode的CPU
mstatus->uxl = 2;
isa->ext = rv_ext('i') | rv_ext('m') | rv_ext('u');
}
isa->ext = rv_ext('i') | rv_ext('m') | rv_ext('u');
mstatus->mpp = M_MODE;
}
else
{
mstatus->uxl = 2;
isa->ext = rv_ext('i') | rv_ext('m') | rv_ext('u');
}
isa->mxl = 2; // rv64
isa->blank = 0;
@ -267,7 +262,7 @@ public:
assert(mstatus->spie != 2);
assert(mstatus->mpie != 2);
// mstatus->spp = nstatus->spp;
mstatus->mpp = (nstatus->mpp == 3 || nstatus->mpp == 0) ? nstatus->mpp : mstatus->mpp;
mstatus->mpp = (nstatus->mpp == 3 || nstatus->mpp == 0) ? nstatus->mpp : 0;
mstatus->mprv = nstatus->mprv;
// mstatus->sum = nstatus->sum; // always true
// mstatus->mxr = nstatus->mxr; // always true

Loading…
Cancel
Save