Files
lab-rv32i-c-interrupts/tests/test_hazard3.sh
T
2026-07-21 19:14:20 +02:00

67 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
env_root="${RV_ENV_ROOT:-/home/user/dev/edu/rv32i-hazard3-student-env}"
tb="${HAZARD3_TB:-$env_root/vendor/Hazard3/test/sim/tb_verilator/tb}"
objdump="${RISCV_PREFIX:-riscv64-unknown-elf-}objdump"
make -C "$root" -s tasks "RV_ENV_ROOT=$env_root"
run_task() {
local task="$1"
shift
local log="$root/build/$task/oracle.log"
"$tb" --bin "$root/build/$task/prog.bin" --cycles 500000 --cpuret --logfile "$log"
grep -Fqx 'CPU requested halt. Exit code 0' "$log"
local expected
for expected in "$@"; do
grep -Fqx "$expected" "$log" || {
printf 'FAIL %s missing <%s>\n' "$task" "$expected" >&2
sed -n '1,160p' "$log" >&2
return 1
}
done
printf 'PASS Hazard3 oracle: %s\n' "$task"
}
run_task task01_ecall_resume \
'T01 count=00000001' \
'T01 mcause=0000000b' \
'T01 delta=00000004' \
'T01 resumed=00000001' \
'T01 pass=00000001'
run_task task02_machine_software_irq \
'T02 count=00000001' \
'T02 mcause=80000003' \
'T02 pending_before=00000001' \
'T02 pending_in_handler=00000001' \
'T02 pending_after=00000000' \
'T02 resumed=00000001' \
'T02 pass=00000001'
run_task task03_pending_enable_matrix \
'T03 pending=00000001' \
'T03 blocked_no_msie=00000001' \
'T03 blocked_no_mie=00000001' \
'T03 delivered_both=00000001' \
'T03 count=00000001' \
'T03 mcause=80000003' \
'T03 pending_after=00000000' \
'T03 pass=00000001'
for pair in 'task01_ecall_resume handle_exception' \
'task02_machine_software_irq isr_machine_softirq' \
'task03_pending_enable_matrix isr_machine_softirq'; do
read -r task symbol <<<"$pair"
"$objdump" -d "$root/build/$task/prog.elf" |
sed -n "/<$symbol>:/,/^$/p" |
grep -Eq '[[:space:]]mret$'
done
t01_mepc=$(sed -n 's/^T01 mepc=//p' "$root/build/task01_ecall_resume/oracle.log")
t01_resume=$(sed -n 's/^T01 resume_pc=//p' "$root/build/task01_ecall_resume/oracle.log")
(( 16#$t01_resume - 16#$t01_mepc == 4 ))
printf 'PASS independent oracle: mepc+4, pending/enable matrix, ISR mret\n'