From 75c17dc372f7c5f8d31dc8efedf9233aba8b2c58 Mon Sep 17 00:00:00 2001 From: David Harris Date: Sun, 10 Oct 2021 15:07:51 -0700 Subject: [PATCH] Major reorganization of regression and simulation and testbenches --- .../{ => old}/rv32icfd/BTBPredictor.txt | 0 .../{ => old}/rv32icfd/twoBitPredictor.txt | 0 .../config/{ => old}/rv32icfd/wally-config.vh | 0 .../{ => old}/rv64icfd/BTBPredictor.txt | 0 .../{ => old}/rv64icfd/twoBitPredictor.txt | 0 .../config/{ => old}/rv64icfd/wally-config.vh | 0 .../config/{ => old}/rv64imc/BTBPredictor.txt | 0 .../{ => old}/rv64imc/twoBitPredictor.txt | 0 .../config/{ => old}/rv64imc/wally-config.vh | 0 wally-pipelined/config/rv32g/BTBPredictor.txt | 1024 +++++++++++++++++ .../config/rv32g/twoBitPredictor.txt | 1024 +++++++++++++++++ wally-pipelined/config/rv32g/wally-config.vh | 121 ++ wally-pipelined/config/rv32ic/wally-config.vh | 4 +- wally-pipelined/config/rv64g/BTBPredictor.txt | 1024 +++++++++++++++++ .../config/rv64g/twoBitPredictor.txt | 1024 +++++++++++++++++ wally-pipelined/config/rv64g/wally-config.vh | 125 ++ wally-pipelined/config/rv64ic/wally-config.vh | 4 +- wally-pipelined/regression/old/qrun.do | 24 + wally-pipelined/regression/old/qrun.log | 215 ++++ .../regression/old/qrun.out/history | 6 + .../regression/old/qrun.out/history.cnt | 1 + .../old/qrun.out/sessions/qrun.out$work | Bin 0 -> 20106 bytes .../regression/old/qrun.out/stats_log | 2 + .../regression/old/qrun.out/top_dus | 1 + .../regression/old/qrun.out/version | 1 + wally-pipelined/regression/old/sim-buildroot | 1 + .../regression/old/sim-buildroot-batch | 3 + .../regression/{ => old}/sim-busybear | 0 .../regression/{ => old}/sim-busybear-batch | 0 wally-pipelined/regression/{ => old}/sim-fp64 | 0 .../regression/{ => old}/sim-fp64-batch | 0 .../regression/{ => old}/sim-wally-arch-batch | 0 .../{ => old}/sim-wally-arch-batch-rv32ic | 0 .../{ => old}/sim-wally-batch-muldiv | 0 .../regression/old/sim-wally-batch-rv32ic | 3 + .../{ => old}/sim-wally-batch-rv32icfd | 0 .../{ => old}/sim-wally-batch-rv64icfd | 0 .../regression/{ => old}/sim-wally-muldiv | 0 .../regression/{ => old}/sim-wally-rv32ic | 0 .../regression/{ => old}/sim-wally-rv32icfd | 0 .../regression/{ => old}/sim-wally-rv64icfd | 0 .../regression/{ => old}/wally-arch.do | 0 .../{ => old}/wally-busybear-batch.do | 0 .../regression/{ => old}/wally-busybear.do | 0 .../{ => old}/wally-coremark_bare.do | 0 .../{ => old}/wally-pipelined-batch-muldiv.do | 0 .../wally-pipelined-batch-rv32icfd.do | 0 .../wally-pipelined-batch-rv64icfd.do | 0 .../{ => old}/wally-pipelined-muldiv.do | 0 .../{ => old}/wally-pipelined-ross.do | 0 .../{ => old}/wally-pipelined-rv32icfd.do | 0 .../{ => old}/wally-pipelined-rv64icfd.do | 0 .../regression/{ => old}/wally-privileged.do | 0 .../regression/regression-wally.py | 45 +- wally-pipelined/regression/run_sim.sh | 3 - wally-pipelined/regression/sim-wally | 3 +- wally-pipelined/regression/sim-wally-batch | 2 +- .../regression/sim-wally-batch-rv32ic | 3 - wally-pipelined/regression/udiv.c | 22 - .../regression/wally-pipelined-batch.do | 20 +- wally-pipelined/regression/wally-pipelined.do | 16 +- wally-pipelined/src/generic/counter.sv | 38 + wally-pipelined/src/muldiv/mul.sv | 5 + .../build/Linux-x86_64-GCC/softfloat.a | Bin 0 -> 514606 bytes wally-pipelined/testbench/testbench-arch.sv | 780 ------------- .../testbench/testbench-imperas.sv | 872 -------------- wally-pipelined/testbench/testbench.sv | 464 ++++++++ wally-pipelined/testbench/tests.vh | 744 ++++++++++++ 68 files changed, 5897 insertions(+), 1727 deletions(-) rename wally-pipelined/config/{ => old}/rv32icfd/BTBPredictor.txt (100%) rename wally-pipelined/config/{ => old}/rv32icfd/twoBitPredictor.txt (100%) rename wally-pipelined/config/{ => old}/rv32icfd/wally-config.vh (100%) rename wally-pipelined/config/{ => old}/rv64icfd/BTBPredictor.txt (100%) rename wally-pipelined/config/{ => old}/rv64icfd/twoBitPredictor.txt (100%) rename wally-pipelined/config/{ => old}/rv64icfd/wally-config.vh (100%) rename wally-pipelined/config/{ => old}/rv64imc/BTBPredictor.txt (100%) rename wally-pipelined/config/{ => old}/rv64imc/twoBitPredictor.txt (100%) rename wally-pipelined/config/{ => old}/rv64imc/wally-config.vh (100%) create mode 100644 wally-pipelined/config/rv32g/BTBPredictor.txt create mode 100644 wally-pipelined/config/rv32g/twoBitPredictor.txt create mode 100644 wally-pipelined/config/rv32g/wally-config.vh create mode 100644 wally-pipelined/config/rv64g/BTBPredictor.txt create mode 100644 wally-pipelined/config/rv64g/twoBitPredictor.txt create mode 100644 wally-pipelined/config/rv64g/wally-config.vh create mode 100644 wally-pipelined/regression/old/qrun.do create mode 100644 wally-pipelined/regression/old/qrun.log create mode 100644 wally-pipelined/regression/old/qrun.out/history create mode 100644 wally-pipelined/regression/old/qrun.out/history.cnt create mode 100644 wally-pipelined/regression/old/qrun.out/sessions/qrun.out$work create mode 100644 wally-pipelined/regression/old/qrun.out/stats_log create mode 100644 wally-pipelined/regression/old/qrun.out/top_dus create mode 100644 wally-pipelined/regression/old/qrun.out/version create mode 100755 wally-pipelined/regression/old/sim-buildroot create mode 100755 wally-pipelined/regression/old/sim-buildroot-batch rename wally-pipelined/regression/{ => old}/sim-busybear (100%) rename wally-pipelined/regression/{ => old}/sim-busybear-batch (100%) rename wally-pipelined/regression/{ => old}/sim-fp64 (100%) rename wally-pipelined/regression/{ => old}/sim-fp64-batch (100%) rename wally-pipelined/regression/{ => old}/sim-wally-arch-batch (100%) rename wally-pipelined/regression/{ => old}/sim-wally-arch-batch-rv32ic (100%) rename wally-pipelined/regression/{ => old}/sim-wally-batch-muldiv (100%) create mode 100755 wally-pipelined/regression/old/sim-wally-batch-rv32ic rename wally-pipelined/regression/{ => old}/sim-wally-batch-rv32icfd (100%) rename wally-pipelined/regression/{ => old}/sim-wally-batch-rv64icfd (100%) rename wally-pipelined/regression/{ => old}/sim-wally-muldiv (100%) rename wally-pipelined/regression/{ => old}/sim-wally-rv32ic (100%) rename wally-pipelined/regression/{ => old}/sim-wally-rv32icfd (100%) rename wally-pipelined/regression/{ => old}/sim-wally-rv64icfd (100%) rename wally-pipelined/regression/{ => old}/wally-arch.do (100%) rename wally-pipelined/regression/{ => old}/wally-busybear-batch.do (100%) rename wally-pipelined/regression/{ => old}/wally-busybear.do (100%) rename wally-pipelined/regression/{ => old}/wally-coremark_bare.do (100%) rename wally-pipelined/regression/{ => old}/wally-pipelined-batch-muldiv.do (100%) rename wally-pipelined/regression/{ => old}/wally-pipelined-batch-rv32icfd.do (100%) rename wally-pipelined/regression/{ => old}/wally-pipelined-batch-rv64icfd.do (100%) rename wally-pipelined/regression/{ => old}/wally-pipelined-muldiv.do (100%) rename wally-pipelined/regression/{ => old}/wally-pipelined-ross.do (100%) rename wally-pipelined/regression/{ => old}/wally-pipelined-rv32icfd.do (100%) rename wally-pipelined/regression/{ => old}/wally-pipelined-rv64icfd.do (100%) rename wally-pipelined/regression/{ => old}/wally-privileged.do (100%) delete mode 100755 wally-pipelined/regression/run_sim.sh delete mode 100755 wally-pipelined/regression/sim-wally-batch-rv32ic delete mode 100644 wally-pipelined/regression/udiv.c create mode 100644 wally-pipelined/src/generic/counter.sv create mode 100644 wally-pipelined/testbench/fp/SoftFloat-3e/build/Linux-x86_64-GCC/softfloat.a delete mode 100644 wally-pipelined/testbench/testbench-arch.sv delete mode 100644 wally-pipelined/testbench/testbench-imperas.sv create mode 100644 wally-pipelined/testbench/testbench.sv create mode 100644 wally-pipelined/testbench/tests.vh diff --git a/wally-pipelined/config/rv32icfd/BTBPredictor.txt b/wally-pipelined/config/old/rv32icfd/BTBPredictor.txt similarity index 100% rename from wally-pipelined/config/rv32icfd/BTBPredictor.txt rename to wally-pipelined/config/old/rv32icfd/BTBPredictor.txt diff --git a/wally-pipelined/config/rv32icfd/twoBitPredictor.txt b/wally-pipelined/config/old/rv32icfd/twoBitPredictor.txt similarity index 100% rename from wally-pipelined/config/rv32icfd/twoBitPredictor.txt rename to wally-pipelined/config/old/rv32icfd/twoBitPredictor.txt diff --git a/wally-pipelined/config/rv32icfd/wally-config.vh b/wally-pipelined/config/old/rv32icfd/wally-config.vh similarity index 100% rename from wally-pipelined/config/rv32icfd/wally-config.vh rename to wally-pipelined/config/old/rv32icfd/wally-config.vh diff --git a/wally-pipelined/config/rv64icfd/BTBPredictor.txt b/wally-pipelined/config/old/rv64icfd/BTBPredictor.txt similarity index 100% rename from wally-pipelined/config/rv64icfd/BTBPredictor.txt rename to wally-pipelined/config/old/rv64icfd/BTBPredictor.txt diff --git a/wally-pipelined/config/rv64icfd/twoBitPredictor.txt b/wally-pipelined/config/old/rv64icfd/twoBitPredictor.txt similarity index 100% rename from wally-pipelined/config/rv64icfd/twoBitPredictor.txt rename to wally-pipelined/config/old/rv64icfd/twoBitPredictor.txt diff --git a/wally-pipelined/config/rv64icfd/wally-config.vh b/wally-pipelined/config/old/rv64icfd/wally-config.vh similarity index 100% rename from wally-pipelined/config/rv64icfd/wally-config.vh rename to wally-pipelined/config/old/rv64icfd/wally-config.vh diff --git a/wally-pipelined/config/rv64imc/BTBPredictor.txt b/wally-pipelined/config/old/rv64imc/BTBPredictor.txt similarity index 100% rename from wally-pipelined/config/rv64imc/BTBPredictor.txt rename to wally-pipelined/config/old/rv64imc/BTBPredictor.txt diff --git a/wally-pipelined/config/rv64imc/twoBitPredictor.txt b/wally-pipelined/config/old/rv64imc/twoBitPredictor.txt similarity index 100% rename from wally-pipelined/config/rv64imc/twoBitPredictor.txt rename to wally-pipelined/config/old/rv64imc/twoBitPredictor.txt diff --git a/wally-pipelined/config/rv64imc/wally-config.vh b/wally-pipelined/config/old/rv64imc/wally-config.vh similarity index 100% rename from wally-pipelined/config/rv64imc/wally-config.vh rename to wally-pipelined/config/old/rv64imc/wally-config.vh diff --git a/wally-pipelined/config/rv32g/BTBPredictor.txt b/wally-pipelined/config/rv32g/BTBPredictor.txt new file mode 100644 index 000000000..fd3eedffb --- /dev/null +++ b/wally-pipelined/config/rv32g/BTBPredictor.txt @@ -0,0 +1,1024 @@ +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 +000000000000000000000000000000000000 diff --git a/wally-pipelined/config/rv32g/twoBitPredictor.txt b/wally-pipelined/config/rv32g/twoBitPredictor.txt new file mode 100644 index 000000000..ff57bd473 --- /dev/null +++ b/wally-pipelined/config/rv32g/twoBitPredictor.txt @@ -0,0 +1,1024 @@ +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 diff --git a/wally-pipelined/config/rv32g/wally-config.vh b/wally-pipelined/config/rv32g/wally-config.vh new file mode 100644 index 000000000..00eb563c8 --- /dev/null +++ b/wally-pipelined/config/rv32g/wally-config.vh @@ -0,0 +1,121 @@ +////////////////////////////////////////// +// wally-config.vh +// +// Written: David_Harris@hmc.edu 4 January 2021 +// Modified: +// +// Purpose: Specify which features are configured +// Macros to determine which modes are supported based on MISA +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +// include shared configuration +`include "wally-shared.vh" + +`define QEMU 0 +`define BUILDROOT 0 +`define BUSYBEAR 0 + +// RV32 or RV64: XLEN = 32 or 64 +`define XLEN 32 + +`define MISA (32'h00000104 | 1 << 20 | 1 << 18 | 1 << 12 | 1 << 0 | 1 <<3 | 1 << 5) +`define ZICSR_SUPPORTED 1 +`define ZIFENCEI_SUPPORTED 1 +`define COUNTERS 32 +`define ZICOUNTERS_SUPPORTED 1 + +// Microarchitectural Features +`define UARCH_PIPELINED 1 +`define UARCH_SUPERSCALR 0 +`define UARCH_SINGLECYCLE 0 +`define MEM_DCACHE 1 +`define MEM_DTIM 1 +`define MEM_ICACHE 1 +`define MEM_VIRTMEM 1 +`define VECTORED_INTERRUPTS_SUPPORTED 1 + +// TLB configuration. Entries should be a power of 2 +`define ITLB_ENTRIES 32 +`define DTLB_ENTRIES 32 + +// Cache configuration. Sizes should be a power of two +// typical configuration 4 ways, 4096 bytes per way, 256 bit or more blocks +`define DCACHE_NUMWAYS 4 +`define DCACHE_WAYSIZEINBYTES 4096 +`define DCACHE_BLOCKLENINBITS 256 +`define DCACHE_REPLBITS 3 +`define ICACHE_NUMWAYS 4 +`define ICACHE_WAYSIZEINBYTES 4096 +`define ICACHE_BLOCKLENINBITS 256 + +// Integer Divider Configuration +// DIV_BITSPERCYCLE must be 1, 2, or 4 +`define DIV_BITSPERCYCLE 4 + +// Legal number of PMP entries are 0, 16, or 64 +`define PMP_ENTRIES 16 + +// Address space +`define RESET_VECTOR 32'h80000000 + +// Peripheral Addresses +// Peripheral memory space extends from BASE to BASE+RANGE +// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits +`define BOOTTIM_SUPPORTED 1'b1 +`define BOOTTIM_BASE 34'h00001000 +`define BOOTTIM_RANGE 34'h00000FFF +`define TIM_SUPPORTED 1'b1 +`define TIM_BASE 34'h80000000 +`define TIM_RANGE 34'h07FFFFFF +`define CLINT_SUPPORTED 1'b1 +`define CLINT_BASE 34'h02000000 +`define CLINT_RANGE 34'h0000FFFF +`define GPIO_SUPPORTED 1'b1 +`define GPIO_BASE 34'h10012000 +`define GPIO_RANGE 34'h000000FF +`define UART_SUPPORTED 1'b1 +`define UART_BASE 34'h10000000 +`define UART_RANGE 34'h00000007 +`define PLIC_SUPPORTED 1'b1 +`define PLIC_BASE 34'h0C000000 +`define PLIC_RANGE 34'h03FFFFFF + +// Bus Interface width +`define AHBW 32 + +// Test modes + +// Tie GPIO outputs back to inputs +`define GPIO_LOOPBACK_TEST 1 + +// Hardware configuration +`define UART_PRESCALE 1 + +// Interrupt configuration +`define PLIC_NUM_SRC 4 +// comment out the following if >=32 sources +`define PLIC_NUM_SRC_LT_32 +`define PLIC_GPIO_ID 3 +`define PLIC_UART_ID 4 + +`define TWO_BIT_PRELOAD "../config/rv32ic/twoBitPredictor.txt" +`define BTB_PRELOAD "../config/rv32ic/BTBPredictor.txt" +`define BPRED_ENABLED 1 +`define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE +`define TESTSBP 0 diff --git a/wally-pipelined/config/rv32ic/wally-config.vh b/wally-pipelined/config/rv32ic/wally-config.vh index 3280c3759..78c9383b9 100644 --- a/wally-pipelined/config/rv32ic/wally-config.vh +++ b/wally-pipelined/config/rv32ic/wally-config.vh @@ -34,7 +34,7 @@ // RV32 or RV64: XLEN = 32 or 64 `define XLEN 32 -`define MISA (32'h00000104 | 1 << 20 | 1 << 18 | 1 << 12 | 1 << 0) +`define MISA (32'h00000104) `define ZICSR_SUPPORTED 1 `define ZIFENCEI_SUPPORTED 1 `define COUNTERS 32 @@ -77,8 +77,6 @@ // Peripheral Addresses // Peripheral memory space extends from BASE to BASE+RANGE // Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits - -// *** each of these is `PA_BITS wide. is this paramaterizable INSIDE the config file? `define BOOTTIM_SUPPORTED 1'b1 `define BOOTTIM_BASE 34'h00001000 `define BOOTTIM_RANGE 34'h00000FFF diff --git a/wally-pipelined/config/rv64g/BTBPredictor.txt b/wally-pipelined/config/rv64g/BTBPredictor.txt new file mode 100644 index 000000000..b761147c6 --- /dev/null +++ b/wally-pipelined/config/rv64g/BTBPredictor.txt @@ -0,0 +1,1024 @@ +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000 diff --git a/wally-pipelined/config/rv64g/twoBitPredictor.txt b/wally-pipelined/config/rv64g/twoBitPredictor.txt new file mode 100644 index 000000000..ff57bd473 --- /dev/null +++ b/wally-pipelined/config/rv64g/twoBitPredictor.txt @@ -0,0 +1,1024 @@ +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 diff --git a/wally-pipelined/config/rv64g/wally-config.vh b/wally-pipelined/config/rv64g/wally-config.vh new file mode 100644 index 000000000..8f32e2d1f --- /dev/null +++ b/wally-pipelined/config/rv64g/wally-config.vh @@ -0,0 +1,125 @@ +////////////////////////////////////////// +// wally-config.vh +// +// Written: David_Harris@hmc.edu 4 January 2021 +// Modified: +// +// Purpose: Specify which features are configured +// Macros to determine which modes are supported based on MISA +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +// include shared configuration +`include "wally-shared.vh" + +`define QEMU 0 +`define BUILDROOT 0 +`define BUSYBEAR 0 + +// RV32 or RV64: XLEN = 32 or 64 +`define XLEN 64 + +// MISA RISC-V configuration per specification +`define MISA (32'h00000104 | 0 << 5 | 0 << 3 | 1 << 18 | 1 << 20 | 1 << 12 | 1 << 0 | 1 <<3 | 1 << 5) +`define ZICSR_SUPPORTED 1 +`define ZIFENCEI_SUPPORTED 1 +`define COUNTERS 32 +`define ZICOUNTERS_SUPPORTED 1 + +// Microarchitectural Features +`define UARCH_PIPELINED 1 +`define UARCH_SUPERSCALR 0 +`define UARCH_SINGLECYCLE 0 +`define MEM_DCACHE 1 +`define MEM_DTIM 1 +`define MEM_ICACHE 1 +`define MEM_VIRTMEM 1 +`define VECTORED_INTERRUPTS_SUPPORTED 1 + +// TLB configuration. Entries should be a power of 2 +`define ITLB_ENTRIES 32 +`define DTLB_ENTRIES 32 + +// Cache configuration. Sizes should be a power of two +// typical configuration 4 ways, 4096 bytes per way, 256 bit or more blocks +`define DCACHE_NUMWAYS 4 +`define DCACHE_WAYSIZEINBYTES 4096 +`define DCACHE_BLOCKLENINBITS 256 +`define DCACHE_REPLBITS 3 +`define ICACHE_NUMWAYS 4 +`define ICACHE_WAYSIZEINBYTES 4096 +`define ICACHE_BLOCKLENINBITS 256 + +// Integer Divider Configuration +// DIV_BITSPERCYCLE must be 1, 2, or 4 +`define DIV_BITSPERCYCLE 4 + +// Legal number of PMP entries are 0, 16, or 64 +`define PMP_ENTRIES 64 + +// Address space +`define RESET_VECTOR 64'h0000000080000000 + +// Bus Interface width +`define AHBW 64 + +// Peripheral Physiccal Addresses +// Peripheral memory space extends from BASE to BASE+RANGE +// Range should be a thermometer code with 0's in the upper bits and 1s in the lower bits + +// *** each of these is `PA_BITS wide. is this paramaterizable INSIDE the config file? +`define BOOTTIM_SUPPORTED 1'b1 +`define BOOTTIM_BASE 56'h00001000 // spec had been 0x1000 to 0x2FFF, but dh truncated to 0x1000 to 0x1FFF because upper half seems to be all zeros and this is easier for decoder +`define BOOTTIM_RANGE 56'h00000FFF +`define TIM_SUPPORTED 1'b1 +`define TIM_BASE 56'h80000000 +`define TIM_RANGE 56'h7FFFFFFF +`define CLINT_SUPPORTED 1'b1 +`define CLINT_BASE 56'h02000000 +`define CLINT_RANGE 56'h0000FFFF +`define GPIO_SUPPORTED 1'b1 +`define GPIO_BASE 56'h10012000 +`define GPIO_RANGE 56'h000000FF +`define UART_SUPPORTED 1'b1 +`define UART_BASE 56'h10000000 +`define UART_RANGE 56'h00000007 +`define PLIC_SUPPORTED 1'b1 +`define PLIC_BASE 56'h0C000000 +`define PLIC_RANGE 56'h03FFFFFF + +// Test modes + +// Tie GPIO outputs back to inputs +`define GPIO_LOOPBACK_TEST 1 + +// Hardware configuration +`define UART_PRESCALE 1 + +// Interrupt configuration +`define PLIC_NUM_SRC 4 +// comment out the following if >=32 sources +`define PLIC_NUM_SRC_LT_32 +`define PLIC_GPIO_ID 3 +`define PLIC_UART_ID 4 + +`define TWO_BIT_PRELOAD "../config/rv64ic/twoBitPredictor.txt" +`define BTB_PRELOAD "../config/rv64ic/BTBPredictor.txt" +`define BPRED_ENABLED 1 +`define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE +`define TESTSBP 0 + diff --git a/wally-pipelined/config/rv64ic/wally-config.vh b/wally-pipelined/config/rv64ic/wally-config.vh index bedfc4f3f..cd587c084 100644 --- a/wally-pipelined/config/rv64ic/wally-config.vh +++ b/wally-pipelined/config/rv64ic/wally-config.vh @@ -35,7 +35,7 @@ `define XLEN 64 // MISA RISC-V configuration per specification -`define MISA (32'h00000104 | 0 << 5 | 0 << 3 | 1 << 18 | 1 << 20 | 1 << 12 | 1 << 0) +`define MISA (32'h00000104) `define ZICSR_SUPPORTED 1 `define ZIFENCEI_SUPPORTED 1 `define COUNTERS 32 @@ -67,7 +67,7 @@ // Integer Divider Configuration // DIV_BITSPERCYCLE must be 1, 2, or 4 -`define DIV_BITSPERCYCLE 1 +`define DIV_BITSPERCYCLE 4 // Legal number of PMP entries are 0, 16, or 64 `define PMP_ENTRIES 64 diff --git a/wally-pipelined/regression/old/qrun.do b/wally-pipelined/regression/old/qrun.do new file mode 100644 index 000000000..cff7fec5f --- /dev/null +++ b/wally-pipelined/regression/old/qrun.do @@ -0,0 +1,24 @@ +# qrun.do +# +# Modification by Oklahoma State University & Harvey Mudd College +# Use with Testbench +# James Stine, 2008; David Harris 2021 +# Go Cowboys!!!!!! +# +# Takes 1:10 to run RV64IC tests using gui + +# Usage: do wally-pipelined-batch.do +# Example: do wally-pipelined-batch.do rv32 imperas-32i + +# Use this wally-pipelined-batch.do file to run this example. +# Either bring up ModelSim and type the following at the "ModelSim>" prompt: +# do wally-pipelined-batch.do +# or, to run from a shell, type the following at the shell prompt: +# vsim -do wally-pipelined-batch.do -c +# (omit the "-c" to see the GUI while running from the shell) + +qrun -clean +qrun +incdir+../config/rv32ic +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 -optimize -snapshot wally +notimingchecks +nospecify +qrun -simulate -snapshot wally +qrun -simulate -snapshot wally + diff --git a/wally-pipelined/regression/old/qrun.log b/wally-pipelined/regression/old/qrun.log new file mode 100644 index 000000000..28d788306 --- /dev/null +++ b/wally-pipelined/regression/old/qrun.log @@ -0,0 +1,215 @@ +QuestaSim-64 qrun 2021.2_1 Utility 2021.05 May 15 2021 +Start time: 21:17:08 on Oct 09,2021 +qrun -simulate -snapshot wally +# vsim -lib qrun.out/work -c -do "run -all; quit -f" -statslog qrun.out/stats_log wally -appendlog -l qrun.log +# Start time: 21:17:09 on Oct 09,2021 +# // Questa Sim-64 +# // Version 2021.2_1 linux_x86_64 May 15 2021 +# // +# // Copyright 1991-2021 Mentor Graphics Corporation +# // All Rights Reserved. +# // +# // QuestaSim and its associated documentation contain trade +# // secrets and commercial or financial information that are the property of +# // Mentor Graphics Corporation and are privileged, confidential, +# // and exempt from disclosure under the Freedom of Information Act, +# // 5 U.S.C. Section 552. Furthermore, this information +# // is prohibited from disclosure under the Trade Secrets Act, +# // 18 U.S.C. Section 1905. +# // +# Loading sv_std.std +# Loading work.cla_sub52(fast) +# Loading work.convert_inputs(fast) +# Loading work.convert_inputs_div(fast) +# Loading work.decoder(fast) +# Loading work.faddcvt(fast) +# Loading work.floprc(fast) +# Loading work.fpudivsqrtrecur(fast) +# Loading work.intdiv(fast) +# Loading work.lz52(fast) +# Loading work.qsel(fast) +# Loading work.ahbliteState(fast) +# Loading work.testbench_sv_unit(fast) +# Loading work.testbench(fast) +# Loading work.regfile(fast) +# Loading work.csrn(fast) +# Loading work.instrTrackerTB(fast) +# Loading work.instrNameDecTB(fast) +# Loading work.copyShadow(fast) +# Loading work.tlbcamline(fast) +# Loading work.pmpadrdec(fast) +# Loading work.cacheway(fast) +# Loading work.cacheway(fast__1) +# run -all +# ** Warning: Multiple Instruction Cache ways not yet implemented +# Time: 0 ns Scope: testbench.riscvassertions File: ../testbench/testbench.sv Line: 327 +# ** Error: Some regression tests will fail if TIM_RANGE is less than 56'h07FFFFFF +# Time: 0 ns Scope: testbench.riscvassertions File: ../testbench/testbench.sv Line: 330 +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-ADD-01.elf.memfile +# rv32i/I-ADD-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-ADDI-01.elf.memfile +# rv32i/I-ADDI-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-AND-01.elf.memfile +# rv32i/I-AND-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-ANDI-01.elf.memfile +# rv32i/I-ANDI-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-AUIPC-01.elf.memfile +# rv32i/I-AUIPC-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-BEQ-01.elf.memfile +# rv32i/I-BEQ-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-BGE-01.elf.memfile +# rv32i/I-BGE-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-BGEU-01.elf.memfile +# rv32i/I-BGEU-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-BLT-01.elf.memfile +# rv32i/I-BLT-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-BLTU-01.elf.memfile +# rv32i/I-BLTU-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-BNE-01.elf.memfile +# rv32i/I-BNE-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-DELAY_SLOTS-01.elf.memfile +# rv32i/I-DELAY_SLOTS-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-EBREAK-01.elf.memfile +# rv32i/I-EBREAK-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-ECALL-01.elf.memfile +# rv32i/I-ECALL-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-ENDIANESS-01.elf.memfile +# rv32i/I-ENDIANESS-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-IO-01.elf.memfile +# rv32i/I-IO-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-JAL-01.elf.memfile +# rv32i/I-JAL-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-JALR-01.elf.memfile +# rv32i/I-JALR-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-LB-01.elf.memfile +# 790020 Warning: access to memory address 0 +# +# rv32i/I-LB-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-LBU-01.elf.memfile +# rv32i/I-LBU-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-LH-01.elf.memfile +# rv32i/I-LH-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-LHU-01.elf.memfile +# rv32i/I-LHU-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-LUI-01.elf.memfile +# rv32i/I-LUI-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-LW-01.elf.memfile +# rv32i/I-LW-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-MISALIGN_LDST-01.elf.memfile +# rv32i/I-MISALIGN_LDST-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-NOP-01.elf.memfile +# rv32i/I-NOP-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-OR-01.elf.memfile +# rv32i/I-OR-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-ORI-01.elf.memfile +# rv32i/I-ORI-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-RF_size-01.elf.memfile +# rv32i/I-RF_size-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-RF_width-01.elf.memfile +# rv32i/I-RF_width-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-RF_x0-01.elf.memfile +# rv32i/I-RF_x0-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SB-01.elf.memfile +# 1233020 Warning: access to memory address 0 +# +# rv32i/I-SB-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SH-01.elf.memfile +# rv32i/I-SH-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SLL-01.elf.memfile +# rv32i/I-SLL-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SLLI-01.elf.memfile +# rv32i/I-SLLI-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SLT-01.elf.memfile +# rv32i/I-SLT-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SLTI-01.elf.memfile +# rv32i/I-SLTI-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SLTIU-01.elf.memfile +# rv32i/I-SLTIU-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SLTU-01.elf.memfile +# rv32i/I-SLTU-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SRA-01.elf.memfile +# rv32i/I-SRA-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SRAI-01.elf.memfile +# rv32i/I-SRAI-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SRL-01.elf.memfile +# rv32i/I-SRL-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SRLI-01.elf.memfile +# rv32i/I-SRLI-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SUB-01.elf.memfile +# rv32i/I-SUB-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-SW-01.elf.memfile +# rv32i/I-SW-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-XOR-01.elf.memfile +# rv32i/I-XOR-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/I-XORI-01.elf.memfile +# rv32i/I-XORI-01 succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-ADD.elf.memfile +# rv32i/WALLY-ADD succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-SUB.elf.memfile +# rv32i/WALLY-SUB succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-ADDI.elf.memfile +# rv32i/WALLY-ADDI succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-ANDI.elf.memfile +# rv32i/WALLY-ANDI succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-ORI.elf.memfile +# rv32i/WALLY-ORI succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-XORI.elf.memfile +# rv32i/WALLY-XORI succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-SLTI.elf.memfile +# rv32i/WALLY-SLTI succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-SLTIU.elf.memfile +# rv32i/WALLY-SLTIU succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-SLLI.elf.memfile +# rv32i/WALLY-SLLI succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-SRLI.elf.memfile +# rv32i/WALLY-SRLI succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-SRAI.elf.memfile +# rv32i/WALLY-SRAI succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-LOAD.elf.memfile +# rv32i/WALLY-LOAD succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-SUB.elf.memfile +# rv32i/WALLY-SUB succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-STORE.elf.memfile +# rv32i/WALLY-STORE succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-JAL.elf.memfile +# rv32i/WALLY-JAL succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-JALR.elf.memfile +# rv32i/WALLY-JALR succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-BEQ.elf.memfile +# 2846200 Warning: access to memory address 0 +# +# rv32i/WALLY-BEQ succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-BNE.elf.memfile +# rv32i/WALLY-BNE succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-BLTU.elf.memfile +# rv32i/WALLY-BLTU succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-BLT.elf.memfile +# rv32i/WALLY-BLT succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-BGE.elf.memfile +# rv32i/WALLY-BGE succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-BGEU.elf.memfile +# rv32i/WALLY-BGEU succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-CSRRW.elf.memfile +# rv32i/WALLY-CSRRW succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-CSRRS.elf.memfile +# rv32i/WALLY-CSRRS succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-CSRRC.elf.memfile +# rv32i/WALLY-CSRRC succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-CSRRWI.elf.memfile +# rv32i/WALLY-CSRRWI succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-CSRRSI.elf.memfile +# rv32i/WALLY-CSRRSI succeeded. Brilliant!!! +# Read memfile ../../imperas-riscv-tests/work/rv32i/WALLY-CSRRCI.elf.memfile +# rv32i/WALLY-CSRRCI succeeded. Brilliant!!! +# SUCCESS! All tests ran without failures. +# ** Note: $stop : ../testbench/testbench.sv(244) +# Time: 4170295 ns Iteration: 0 Instance: /testbench +# Break at ../testbench/testbench.sv line 244 +# Stopped at ../testbench/testbench.sv line 244 +# quit -f +# End time: 21:17:54 on Oct 09,2021, Elapsed time: 0:00:45 +# Errors: 1, Warnings: 1 +# *** Summary ********************************************* +# qrun: Errors: 0, Warnings: 0 +# vsim: Errors: 1, Warnings: 1 +# Totals: Errors: 1, Warnings: 1 diff --git a/wally-pipelined/regression/old/qrun.out/history b/wally-pipelined/regression/old/qrun.out/history new file mode 100644 index 000000000..daf20a20f --- /dev/null +++ b/wally-pipelined/regression/old/qrun.out/history @@ -0,0 +1,6 @@ +- Entry: 1 + Time: Sat Oct 9 21:16:56 2021 + Command: /cad/mentor/questa_sim-2021.2_1/questasim/linux_x86_64/qrun +incdir+../config/rv32ic +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/function_radix.sv ../testbench/common/instrNameDecTB.sv ../testbench/common/instrTrackerTB.sv ../testbench/common/logging.sv ../src/cache/cachereplacementpolicy.sv ../src/cache/cacheway.sv ../src/cache/dcache.sv ../src/cache/dcachefsm.sv ../src/cache/icache.sv ../src/cache/icachefsm.sv ../src/cache/sram1rw.sv ../src/ebu/ahblite.sv ../src/ebu/amoalu.sv ../src/fpu/adder.sv ../src/fpu/cla12.sv ../src/fpu/cla52.sv ../src/fpu/cla64.sv ../src/fpu/convert_inputs.sv ../src/fpu/convert_inputs_div.sv ../src/fpu/cvtfp.sv ../src/fpu/divconv.sv ../src/fpu/exception.sv ../src/fpu/exception_div.sv ../src/fpu/faddcvt.sv ../src/fpu/fclassify.sv ../src/fpu/fcmp.sv ../src/fpu/fctrl.sv ../src/fpu/fcvt.sv ../src/fpu/fhazard.sv ../src/fpu/fma.sv ../src/fpu/fpdiv.sv ../src/fpu/fpu.sv ../src/fpu/fpudivsqrtrecur.sv ../src/fpu/fpudivsqrtrecurcore.sv ../src/fpu/fregfile.sv ../src/fpu/fsgn.sv ../src/fpu/fsm.sv ../src/fpu/lzd_denorm.sv ../src/fpu/rounder_denorm.sv ../src/fpu/rounder_div.sv ../src/fpu/sbtm_a0.sv ../src/fpu/sbtm_a1.sv ../src/fpu/sbtm_a2.sv ../src/fpu/sbtm_a3.sv ../src/fpu/sbtm_div.sv ../src/fpu/sbtm_sqrt.sv ../src/fpu/shifter_denorm.sv ../src/fpu/unpacking.sv ../src/generic/adder.sv ../src/generic/clockgater.sv ../src/generic/flop.sv ../src/generic/lzd.sv ../src/generic/mux.sv ../src/generic/neg.sv ../src/generic/onehotdecoder.sv ../src/generic/or_rows.sv ../src/generic/shift.sv ../src/hazard/hazard.sv ../src/ieu/alu.sv ../src/ieu/controller.sv ../src/ieu/datapath.sv ../src/ieu/extend.sv ../src/ieu/forward.sv ../src/ieu/ieu.sv ../src/ieu/regfile.sv ../src/ieu/shifter.sv ../src/ifu/BTBPredictor.sv ../src/ifu/RAsPredictor.sv ../src/ifu/SRAM2P1R1W.sv ../src/ifu/bpred.sv ../src/ifu/decompress.sv ../src/ifu/globalHistoryPredictor.sv ../src/ifu/gsharePredictor.sv ../src/ifu/ifu.sv ../src/ifu/localHistoryPredictor.sv ../src/ifu/satCounter2.sv ../src/ifu/twoBitPredictor.sv ../src/lsu/lrsc.sv ../src/lsu/lsu.sv ../src/lsu/lsuArb.sv ../src/lsu/subwordread.sv ../src/mmu/adrdec.sv ../src/mmu/adrdecs.sv ../src/mmu/decoder.sv ../src/mmu/hptw.sv ../src/mmu/mmu.sv ../src/mmu/pmachecker.sv ../src/mmu/pmpadrdec.sv ../src/mmu/pmpchecker.sv ../src/mmu/priorityonehot.sv ../src/mmu/prioritythermometer.sv ../src/mmu/tlb.sv ../src/mmu/tlbcam.sv ../src/mmu/tlbcamline.sv ../src/mmu/tlbcontrol.sv ../src/mmu/tlblru.sv ../src/mmu/tlbmixer.sv ../src/mmu/tlbram.sv ../src/mmu/tlbramline.sv ../src/muldiv/div.sv ../src/muldiv/intdivrestoring.sv ../src/muldiv/intdivrestoringstep.sv ../src/muldiv/mul.sv ../src/muldiv/muldiv.sv ../src/privileged/csr.sv ../src/privileged/csrc.sv ../src/privileged/csri.sv ../src/privileged/csrm.sv ../src/privileged/csrn.sv ../src/privileged/csrs.sv ../src/privileged/csrsr.sv ../src/privileged/csru.sv ../src/privileged/privdec.sv ../src/privileged/privileged.sv ../src/privileged/trap.sv ../src/uncore/clint.sv ../src/uncore/dtim.sv ../src/uncore/gpio.sv ../src/uncore/plic.sv ../src/uncore/subwordwrite.sv ../src/uncore/uart.sv ../src/uncore/uartPC16550D.sv ../src/uncore/uncore.sv ../src/wally/wallypipelinedhart.sv ../src/wally/wallypipelinedsoc.sv -suppress 2583 -optimize -snapshot wally +notimingchecks +nospecify +- Entry: 2 + Time: Sat Oct 9 21:17:08 2021 + Command: /cad/mentor/questa_sim-2021.2_1/questasim/linux_x86_64/qrun -simulate -snapshot wally diff --git a/wally-pipelined/regression/old/qrun.out/history.cnt b/wally-pipelined/regression/old/qrun.out/history.cnt new file mode 100644 index 000000000..0cfbf0888 --- /dev/null +++ b/wally-pipelined/regression/old/qrun.out/history.cnt @@ -0,0 +1 @@ +2 diff --git a/wally-pipelined/regression/old/qrun.out/sessions/qrun.out$work b/wally-pipelined/regression/old/qrun.out/sessions/qrun.out$work new file mode 100644 index 0000000000000000000000000000000000000000..cb7ac58425c13f9edcafa16be51c4b53d46ceb12 GIT binary patch literal 20106 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 R$Y~+&_t(bDFanwE{~y<46-EF6 literal 0 HcmV?d00001 diff --git a/wally-pipelined/regression/old/qrun.out/stats_log b/wally-pipelined/regression/old/qrun.out/stats_log new file mode 100644 index 000000000..c7d500fcd --- /dev/null +++ b/wally-pipelined/regression/old/qrun.out/stats_log @@ -0,0 +1,2 @@ +qrun: Errors: 0, Warnings: 0 +vsim: Errors: 1, Warnings: 1 diff --git a/wally-pipelined/regression/old/qrun.out/top_dus b/wally-pipelined/regression/old/qrun.out/top_dus new file mode 100644 index 000000000..edcb6622a --- /dev/null +++ b/wally-pipelined/regression/old/qrun.out/top_dus @@ -0,0 +1 @@ +/mnt/scratch/harris_scratch/riscv-wally/wally-pipelined/regression/qrun.out/work 0 compiled diff --git a/wally-pipelined/regression/old/qrun.out/version b/wally-pipelined/regression/old/qrun.out/version new file mode 100644 index 000000000..f1f03fff8 --- /dev/null +++ b/wally-pipelined/regression/old/qrun.out/version @@ -0,0 +1 @@ +qrun 0.5 diff --git a/wally-pipelined/regression/old/sim-buildroot b/wally-pipelined/regression/old/sim-buildroot new file mode 100755 index 000000000..beeccd341 --- /dev/null +++ b/wally-pipelined/regression/old/sim-buildroot @@ -0,0 +1 @@ +vsim -do wally-buildroot.do diff --git a/wally-pipelined/regression/old/sim-buildroot-batch b/wally-pipelined/regression/old/sim-buildroot-batch new file mode 100755 index 000000000..efb09c9a0 --- /dev/null +++ b/wally-pipelined/regression/old/sim-buildroot-batch @@ -0,0 +1,3 @@ +vsim -c < {}", grepstr="8500000 instructions" ), - TestCase( - name="arch64", - cmd="vsim > {} -c < {} -c < {} -c < {} -c < {}", @@ -60,6 +40,23 @@ configs = [ ), ] +tests64 = ["arch64i", "arch64priv", "arch64c", "arch64m", "imperas64i", "imperas64p", "imperas64mmu", "imperas64f", "imperas64d", "imperas64m", "imperas64a", "imperas64c"] #, "testsBP64"] +for test in tests64: + tc = TestCase( + name=test, + cmd="vsim > {} -c < {} -c < -#include -#include - -int main() { - - uint64_t N; - uint64_t D; - uint64_t Q; - - D = 0xdf7f3844121bcc23; - N = 0x10fd3dedadea5195; - Q = N/D; - - printf("N = %" PRIx64 "\n", N); - printf("D = %" PRIx64 "\n", D); - printf("Q = %" PRIx64 "\n", Q); - printf("R = %" PRIx64 "\n", N%D); - - - -} diff --git a/wally-pipelined/regression/wally-pipelined-batch.do b/wally-pipelined/regression/wally-pipelined-batch.do index 28b866973..c663dd21c 100644 --- a/wally-pipelined/regression/wally-pipelined-batch.do +++ b/wally-pipelined/regression/wally-pipelined-batch.do @@ -7,6 +7,9 @@ # # Takes 1:10 to run RV64IC tests using gui +# Usage: do wally-pipelined-batch.do +# Example: do wally-pipelined-batch.do rv32ic imperas-32i + # Use this wally-pipelined-batch.do file to run this example. # Either bring up ModelSim and type the following at the "ModelSim>" prompt: # do wally-pipelined-batch.do @@ -17,10 +20,10 @@ onbreak {resume} # create library -if [file exists work_$2] { - vdel -lib work_$2 -all +if [file exists work_${1}_${2}] { + vdel -lib work_${1}_${2} -all } -vlib work_$2 +vlib work_${1}_${2} # compile source files # suppress spurious warnngs about @@ -29,15 +32,12 @@ vlib work_$2 # default to config/rv64ic, but allow this to be overridden at the command line. For example: # do wally-pipelined-batch.do ../config/rv32ic rv32ic -switch $argc { - 0 {vlog +incdir+../config/rv64ic +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} - 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} - 2 {vlog -work work_$2 +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} -} +vlog -work work_${1}_${2} +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 + # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals -vopt work_$2.testbench -work work_$2 -o workopt_$2 -vsim -lib work_$2 workopt_$2 +vopt work_${1}_${2}.testbench -work work_${1}_${2} -G TEST=$2 -o testbenchopt +vsim -lib work_${1}_${2} testbenchopt # Adding coverage increases runtime from 2:00 to 4:29. Can't run it all the time #vopt work_$2.testbench -work work_$2 -o workopt_$2 +cover=sbectf #vsim -coverage -lib work_$2 workopt_$2 diff --git a/wally-pipelined/regression/wally-pipelined.do b/wally-pipelined/regression/wally-pipelined.do index 76e3d8668..fd7ef2939 100644 --- a/wally-pipelined/regression/wally-pipelined.do +++ b/wally-pipelined/regression/wally-pipelined.do @@ -7,6 +7,8 @@ # # Takes 1:10 to run RV64IC tests using gui +# run with vsim -do "do wally-pipelined.do rv64ic riscvarchtest-64m" + # Use this wally-pipelined.do file to run this example. # Either bring up ModelSim and type the following at the "ModelSim>" prompt: # do wally-pipelined.do @@ -29,13 +31,14 @@ vlib work # default to config/rv64ic, but allow this to be overridden at the command line. For example: # do wally-pipelined.do ../config/rv32ic -switch $argc { - 0 {vlog +incdir+../config/rv64ic +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} - 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench-imperas.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} -} +#switch $argc { +# 0 {vlog +incdir+../config/rv64ic +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} +# 1 {vlog +incdir+$1 +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583} +#} # start and run simulation # remove +acc flag for faster sim during regressions if there is no need to access internal signals -vopt +acc work.testbench -o workopt +vlog +incdir+../config/$1 +incdir+../config/shared ../testbench/testbench.sv ../testbench/common/*.sv ../src/*/*.sv -suppress 2583 +vopt +acc work.testbench -G TEST=$2 -o workopt vsim workopt view wave @@ -46,5 +49,6 @@ do ./wave-dos/peripheral-waves.do #run 3600 run -all #quit -noview ../testbench/testbench-imperas.sv +#noview ../testbench/testbench-imperas.sv +noview ../testbench/testbench.sv view wave diff --git a/wally-pipelined/src/generic/counter.sv b/wally-pipelined/src/generic/counter.sv new file mode 100644 index 000000000..6b6fa24c9 --- /dev/null +++ b/wally-pipelined/src/generic/counter.sv @@ -0,0 +1,38 @@ +/////////////////////////////////////////// +// counter.sv +// +// Written: David_Harris@hmc.edu 10 October 2021 +// Modified: +// +// Purpose: Counter with reset and enable +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +`include "wally-config.vh" + +module counter #(parameter WIDTH=8) ( + input logic clk, reset, en, + output logic [WIDTH-1:0] q); + + logic [WIDTH-1:0] qnext; + + assign qnext = q + 1; + flopenr #(WIDTH) cntrflop(clk, reset, en, qnext, q); +endmodule + + diff --git a/wally-pipelined/src/muldiv/mul.sv b/wally-pipelined/src/muldiv/mul.sv index 3b29ee3fe..752c23799 100644 --- a/wally-pipelined/src/muldiv/mul.sv +++ b/wally-pipelined/src/muldiv/mul.sv @@ -54,6 +54,9 @@ module mul ( // portions of product assign Pprime = {1'b0, SrcAE[`XLEN-2:0]} * {1'b0, SrcBE[`XLEN-2:0]}; + + // *** assumes unsigned multiplication + // DW02_multp #((`XLEN-1), (`XLEN-1), 2*(`XLEN-1)) multp_dw( .a(SrcAE[`XLEN-2:0]), .b(SrcBE[`XLEN-2:0]), .tc(1'b0), .out0(Pprime0), .out1(Pprime1) ); assign PA = {(`XLEN-1){SrcAE[`XLEN-1]}} & SrcBE[`XLEN-2:0]; assign PB = {(`XLEN-1){SrcBE[`XLEN-1]}} & SrcAE[`XLEN-2:0]; assign PP = SrcAE[`XLEN-1] & SrcBE[`XLEN-1]; @@ -72,6 +75,8 @@ module mul ( else if (MULHSU) PP4 = {1'b1, ~PP, {(`XLEN-2){1'b0}}, 1'b1, {(`XLEN-1){1'b0}}}; else PP4 = {1'b0, PP, {(`XLEN*2-2){1'b0}}}; +// ***Put register before this final addition assign ProdE = PP1 + PP2 + PP3 + PP4; //SrcAE * SrcBE; +// assign ProdE = Pprime0 + Pprime1 + PP2 + PP3 + PP4; //SrcAE * SrcBE; endmodule diff --git a/wally-pipelined/testbench/fp/SoftFloat-3e/build/Linux-x86_64-GCC/softfloat.a b/wally-pipelined/testbench/fp/SoftFloat-3e/build/Linux-x86_64-GCC/softfloat.a new file mode 100644 index 0000000000000000000000000000000000000000..6ea94ddadad5c0199d0e76d82bb9fa912d51159f GIT binary patch literal 514606 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ℜ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 literal 0 HcmV?d00001 diff --git a/wally-pipelined/testbench/testbench-arch.sv b/wally-pipelined/testbench/testbench-arch.sv deleted file mode 100644 index c1ef5a237..000000000 --- a/wally-pipelined/testbench/testbench-arch.sv +++ /dev/null @@ -1,780 +0,0 @@ -/////////////////////////////////////////// -// testbench-imperas.sv -// -// Written: David_Harris@hmc.edu 9 January 2021 -// Modified: -// -// Purpose: Wally Testbench and helper modules -// Applies test programs from the Imperas suite -// -// A component of the Wally configurable RISC-V project. -// -// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, -// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT -// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -/////////////////////////////////////////// - -`include "wally-config.vh" - -module testbench(); - parameter DEBUG = 0; - parameter TESTSPERIPH = 0; // set to 0 for regression - parameter TESTSPRIV = 0; // set to 0 for regression - - logic clk; - logic reset; - - parameter SIGNATURESIZE = 5000000; - - int test, i, errors, totalerrors; - logic [31:0] sig32[0:SIGNATURESIZE]; - logic [`XLEN-1:0] signature[0:SIGNATURESIZE]; - logic [`XLEN-1:0] testadr; - string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName; - logic [31:0] InstrW; - logic [`XLEN-1:0] meminit; - - string tests32mmu[] = '{ - "rv32mmu/WALLY-MMU-SV32", "3000" - //"rv32mmu/WALLY-PMA", "3000", - //"rv32mmu/WALLY-PMA", "3000" - }; - - string tests64mmu[] = '{ - "rv64mmu/WALLY-MMU-SV48", "3000", - "rv64mmu/WALLY-MMU-SV39", "3000" - //"rv64mmu/WALLY-PMA", "3000", - //"rv64mmu/WALLY-PMA", "3000" - }; - - -string tests32f[] = '{ - "rv32f/I-FADD-S-01", "2000", - "rv32f/I-FCLASS-S-01", "2000", - "rv32f/I-FCVT-S-W-01", "2000", - "rv32f/I-FCVT-S-WU-01", "2000", - "rv32f/I-FCVT-W-S-01", "2000", - "rv32f/I-FCVT-WU-S-01", "2000", - "rv32f/I-FDIV-S-01", "2000", - "rv32f/I-FEQ-S-01", "2000", - "rv32f/I-FLE-S-01", "2000", - "rv32f/I-FLT-S-01", "2000", - "rv32f/I-FMADD-S-01", "2000", - "rv32f/I-FMAX-S-01", "2000", - "rv32f/I-FMIN-S-01", "2000", - "rv32f/I-FMSUB-S-01", "2000", - "rv32f/I-FMUL-S-01", "2000", - "rv32f/I-FMV-W-X-01", "2000", - "rv32f/I-FMV-X-W-01", "2000", - "rv32f/I-FNMADD-S-01", "2000", - "rv32f/I-FNMSUB-S-01", "2000", - "rv32f/I-FSGNJ-S-01", "2000", - "rv32f/I-FSGNJN-S-01", "2000", - "rv32f/I-FSGNJX-S-01", "2000", - "rv32f/I-FSQRT-S-01", "2000", - "rv32f/I-FSW-01", "2000", - "rv32f/I-FLW-01", "2110", - "rv32f/I-FSUB-S-01", "2000" - }; - - string tests64f[] = '{ - "rv64f/I-FLW-01", "2110", - "rv64f/I-FMV-W-X-01", "2000", - "rv64f/I-FMV-X-W-01", "2000", - "rv64f/I-FSW-01", "2000", - "rv64f/I-FCLASS-S-01", "2000", - "rv64f/I-FADD-S-01", "2000", -// "rv64f/I-FCVT-S-L-01", "2000", -// "rv64f/I-FCVT-S-LU-01", "2000", -// "rv64f/I-FCVT-S-W-01", "2000", -// "rv64f/I-FCVT-S-WU-01", "2000", - "rv64f/I-FCVT-L-S-01", "2000", - "rv64f/I-FCVT-LU-S-01", "2000", - "rv64f/I-FCVT-W-S-01", "2000", - "rv64f/I-FCVT-WU-S-01", "2000", - "rv64f/I-FDIV-S-01", "2000", - "rv64f/I-FEQ-S-01", "2000", - "rv64f/I-FLE-S-01", "2000", - "rv64f/I-FLT-S-01", "2000", - "rv64f/I-FMADD-S-01", "2000", - "rv64f/I-FMAX-S-01", "2000", - "rv64f/I-FMIN-S-01", "2000", - "rv64f/I-FMSUB-S-01", "2000", - "rv64f/I-FMUL-S-01", "2000", - "rv64f/I-FNMADD-S-01", "2000", - "rv64f/I-FNMSUB-S-01", "2000", - "rv64f/I-FSGNJ-S-01", "2000", - "rv64f/I-FSGNJN-S-01", "2000", - "rv64f/I-FSGNJX-S-01", "2000", - "rv64f/I-FSQRT-S-01", "2000", - "rv64f/I-FSUB-S-01", "2000" - }; - - string tests64d[] = '{ - "rv64d/I-FSD-01", "2000", - "rv64d/I-FLD-01", "2420", - "rv64d/I-FMV-X-D-01", "2000", - "rv64d/I-FMV-D-X-01", "2000", - "rv64d/I-FDIV-D-01", "2000", - "rv64d/I-FNMADD-D-01", "2000", - "rv64d/I-FNMSUB-D-01", "2000", - "rv64d/I-FMSUB-D-01", "2000", - "rv64d/I-FMAX-D-01", "2000", - "rv64d/I-FMIN-D-01", "2000", - "rv64d/I-FLE-D-01", "2000", - "rv64d/I-FLT-D-01", "2000", - "rv64d/I-FEQ-D-01", "2000", - "rv64d/I-FADD-D-01", "2000", - "rv64d/I-FCLASS-D-01", "2000", - "rv64d/I-FMADD-D-01", "2000", - "rv64d/I-FMUL-D-01", "2000", - "rv64d/I-FSGNJ-D-01", "2000", - "rv64d/I-FSGNJN-D-01", "2000", - "rv64d/I-FSGNJX-D-01", "2000", - "rv64d/I-FSQRT-D-01", "2000", - "rv64d/I-FSUB-D-01", "2000", -// "rv64d/I-FCVT-D-L-01", "2000", -// "rv64d/I-FCVT-D-LU-01", "2000", - "rv64d/I-FCVT-D-S-01", "2000", -// "rv64d/I-FCVT-D-W-01", "2000", -// "rv64d/I-FCVT-D-WU-01", "2000", - "rv64d/I-FCVT-L-D-01", "2000", - "rv64d/I-FCVT-LU-D-01", "2000", - "rv64d/I-FCVT-S-D-01", "2000", - "rv64d/I-FCVT-W-D-01", "2000", - "rv64d/I-FCVT-WU-D-01", "2000" -}; - - string tests64a[] = '{ - "rv64a/WALLY-AMO", "2110", - "rv64a/WALLY-LRSC", "2110" - }; - - string tests64priv[] = '{ - "rv64i_m/privilege/ebreak", "2090", - "rv64i_m/privilege/ecall", "2090", - "rv64i_m/privilege/misalign-beq-01", "20a0", - "rv64i_m/privilege/misalign-bge-01", "20a0", - "rv64i_m/privilege/misalign-bgeu-01", "20a0", - "rv64i_m/privilege/misalign-blt-01", "20a0", - "rv64i_m/privilege/misalign-bltu-01", "20a0", - "rv64i_m/privilege/misalign-bne-01", "20a0", - "rv64i_m/privilege/misalign-jal-01", "20a0", - "rv64i_m/privilege/misalign-ld-01", "20a0", - "rv64i_m/privilege/misalign-lh-01", "20a0", - "rv64i_m/privilege/misalign-lhu-01", "20a0", - "rv64i_m/privilege/misalign-lw-01", "20a0", - "rv64i_m/privilege/misalign-lwu-01", "20a0", - "rv64i_m/privilege/misalign-sd-01", "20a0", - "rv64i_m/privilege/misalign-sh-01", "20a0", - "rv64i_m/privilege/misalign-sw-01", "20a0", - "rv64i_m/privilege/misalign1-jalr-01", "20a0", - "rv64i_m/privilege/misalign2-jalr-01", "20a0" - }; - - string tests64m[] = '{ - "rv64i_m/M/div-01", "9010", - "rv64i_m/M/divu-01", "a010", - "rv64i_m/M/divuw-01", "a010", - "rv64i_m/M/divw-01", "9010", - "rv64i_m/M/mul-01", "9010", - "rv64i_m/M/mulh-01", "9010", - "rv64i_m/M/mulhsu-01", "9010", - "rv64i_m/M/mulhu-01", "a010", - "rv64i_m/M/mulw-01", "9010", - "rv64i_m/M/rem-01", "9010", - "rv64i_m/M/remu-01", "a010", - "rv64i_m/M/remuw-01", "a010", - "rv64i_m/M/remw-01", "9010" - }; - - string tests64ic[] = '{ - "rv64i_m/C/cadd-01", "8010", - "rv64i_m/C/caddi-01", "4010", - "rv64i_m/C/caddi16sp-01", "2010", - "rv64i_m/C/caddi4spn-01", "2010", - "rv64i_m/C/caddiw-01", "4010", - "rv64i_m/C/caddw-01", "8010", - "rv64i_m/C/cand-01", "8010", - "rv64i_m/C/candi-01", "4010", - "rv64i_m/C/cbeqz-01", "4010", - "rv64i_m/C/cbnez-01", "5010", - "rv64i_m/C/cebreak-01", "2070", - "rv64i_m/C/cj-01", "3010", - "rv64i_m/C/cjalr-01", "2010", - "rv64i_m/C/cjr-01", "2010", - "rv64i_m/C/cld-01", "2010", - "rv64i_m/C/cldsp-01", "2010", - "rv64i_m/C/cli-01", "2010", - "rv64i_m/C/clui-01", "2010", - "rv64i_m/C/clw-01", "2010", - "rv64i_m/C/clwsp-01", "2010", - "rv64i_m/C/cmv-01", "2010", - "rv64i_m/C/cnop-01", "2010", - "rv64i_m/C/cor-01", "8010", - "rv64i_m/C/csd-01", "3010", - "rv64i_m/C/csdsp-01", "3010", - "rv64i_m/C/cslli-01", "2010", - "rv64i_m/C/csrai-01", "2010", - "rv64i_m/C/csrli-01", "2010", - "rv64i_m/C/csub-01", "8010", - "rv64i_m/C/csubw-01", "8010", - "rv64i_m/C/csw-01", "3010", - "rv64i_m/C/cswsp-01", "3010", - "rv64i_m/C/cxor-01", "8010" - }; - - string tests64i[] = '{ - "rv64i_m/I/add-01", "9010", - "rv64i_m/I/addi-01", "6010", - "rv64i_m/I/addiw-01", "6010", - "rv64i_m/I/addw-01", "9010", - "rv64i_m/I/and-01", "9010", - "rv64i_m/I/andi-01", "6010", - "rv64i_m/I/auipc-01", "2010", - "rv64i_m/I/beq-01", "47010", - "rv64i_m/I/bge-01", "47010", - "rv64i_m/I/bgeu-01", "56010", - "rv64i_m/I/blt-01", "4d010", - "rv64i_m/I/bltu-01", "57010", - "rv64i_m/I/bne-01", "43010", - "rv64i_m/I/fence-01", "2010", - "rv64i_m/I/jal-01", "122010", - "rv64i_m/I/jalr-01", "2010", - "rv64i_m/I/lb-align-01", "2010", - "rv64i_m/I/lbu-align-01", "2010", - "rv64i_m/I/ld-align-01", "2010", - "rv64i_m/I/lh-align-01", "2010", - "rv64i_m/I/lhu-align-01", "2010", - "rv64i_m/I/lui-01", "2010", - "rv64i_m/I/lw-align-01", "2010", - "rv64i_m/I/lwu-align-01", "2010", - "rv64i_m/I/or-01", "9010", - "rv64i_m/I/ori-01", "6010", - "rv64i_m/I/sb-align-01", "3010", - "rv64i_m/I/sd-align-01", "3010", - "rv64i_m/I/sh-align-01", "3010", - "rv64i_m/I/sll-01", "3010", - "rv64i_m/I/slli-01", "2010", - "rv64i_m/I/slliw-01", "2010", - "rv64i_m/I/sllw-01", "3010", - "rv64i_m/I/slt-01", "9010", - "rv64i_m/I/slti-01", "6010", - "rv64i_m/I/sltiu-01", "6010", - "rv64i_m/I/sltu-01", "a010", - "rv64i_m/I/sra-01", "3010", - "rv64i_m/I/srai-01", "2010", - "rv64i_m/I/sraiw-01", "2010", - "rv64i_m/I/sraw-01", "3010", - "rv64i_m/I/srl-01", "3010", - "rv64i_m/I/srli-01", "2010", - "rv64i_m/I/srliw-01", "2010", - "rv64i_m/I/srlw-01", "3010", - "rv64i_m/I/sub-01", "9010", - "rv64i_m/I/subw-01", "9010", - "rv64i_m/I/sw-align-01", "3010", - "rv64i_m/I/xor-01", "9010", - "rv64i_m/I/xori-01", "6010" - }; - - string tests32priv[] = '{ - "rv32i_m/privilege/ebreak", "2070", - "rv32i_m/privilege/ecall", "2070", - "rv32i_m/privilege/misalign-beq-01", "2080", - "rv32i_m/privilege/misalign-bge-01", "2080", - "rv32i_m/privilege/misalign-bgeu-01", "2080", - "rv32i_m/privilege/misalign-blt-01", "2080", - "rv32i_m/privilege/misalign-bltu-01", "2080", - "rv32i_m/privilege/misalign-bne-01", "2080", - "rv32i_m/privilege/misalign-jal-01", "2080", - "rv32i_m/privilege/misalign-lh-01", "2080", - "rv32i_m/privilege/misalign-lhu-01", "2080", - "rv32i_m/privilege/misalign-lw-01", "2080", - "rv32i_m/privilege/misalign-sh-01", "2080", - "rv32i_m/privilege/misalign-sw-01", "2080", - "rv32i_m/privilege/misalign1-jalr-01", "2080", - "rv32i_m/privilege/misalign2-jalr-01", "2080" - }; - - string tests32m[] = '{ - "rv32i_m/M/div-01", "5010", - "rv32i_m/M/divu-01", "5010", - "rv32i_m/M/mul-01", "5010", - "rv32i_m/M/mulh-01", "5010", - "rv32i_m/M/mulhsu-01", "5010", - "rv32i_m/M/mulhu-01", "5010", - "rv32i_m/M/rem-01", "5010", - "rv32i_m/M/remu-01", "5010" - }; - - string tests32ic[] = '{ - "rv32i_m/C/cadd-01", "4010", - "rv32i_m/C/caddi-01", "3010", - "rv32i_m/C/caddi16sp-01", "2010", - "rv32i_m/C/caddi4spn-01", "2010", - "rv32i_m/C/cand-01", "4010", - "rv32i_m/C/candi-01", "3010", - "rv32i_m/C/cbeqz-01", "3010", - "rv32i_m/C/cbnez-01", "3010", - "rv32i_m/C/cebreak-01", "2050", - "rv32i_m/C/cj-01", "3010", - "rv32i_m/C/cjal-01", "3010", - "rv32i_m/C/cjalr-01", "2010", - "rv32i_m/C/cjr-01", "2010", - "rv32i_m/C/cli-01", "2010", - "rv32i_m/C/clui-01", "2010", - "rv32i_m/C/clw-01", "2010", - "rv32i_m/C/clwsp-01", "2010", - "rv32i_m/C/cmv-01", "2010", - "rv32i_m/C/cnop-01", "2010", - "rv32i_m/C/cor-01", "4010", - "rv32i_m/C/cslli-01", "2010", - "rv32i_m/C/csrai-01", "2010", - "rv32i_m/C/csrli-01", "2010", - "rv32i_m/C/csub-01", "4010", - "rv32i_m/C/csw-01", "2010", - "rv32i_m/C/cswsp-01", "2010", - "rv32i_m/C/cxor-01", "4010" - }; - - string tests32i[] = '{ - "rv32i_m/I/add-01", "5010", - "rv32i_m/I/addi-01", "4010", - "rv32i_m/I/and-01", "5010", - "rv32i_m/I/andi-01", "4010", - "rv32i_m/I/auipc-01", "2010", - "rv32i_m/I/beq-01", "39010", - "rv32i_m/I/bge-01", "3a010", - "rv32i_m/I/bgeu-01", "4a010", - "rv32i_m/I/blt-01", "38010", - "rv32i_m/I/bltu-01", "4b010", - "rv32i_m/I/bne-01", "39010", - "rv32i_m/I/fence-01", "2010", - "rv32i_m/I/jal-01", "1ad010", - "rv32i_m/I/jalr-01", "2010", - "rv32i_m/I/lb-align-01", "2010", - "rv32i_m/I/lbu-align-01", "2010", - "rv32i_m/I/lh-align-01", "2010", - "rv32i_m/I/lhu-align-01", "2010", - "rv32i_m/I/lui-01", "2010", - "rv32i_m/I/lw-align-01", "2010", - "rv32i_m/I/or-01", "5010", - "rv32i_m/I/ori-01", "4010", - "rv32i_m/I/sb-align-01", "2010", - "rv32i_m/I/sh-align-01", "2010", - "rv32i_m/I/sll-01", "2010", - "rv32i_m/I/slli-01", "2010", - "rv32i_m/I/slt-01", "5010", - "rv32i_m/I/slti-01", "4010", - "rv32i_m/I/sltiu-01", "4010", - "rv32i_m/I/sltu-01", "5010", - "rv32i_m/I/sra-01", "2010", - "rv32i_m/I/srai-01", "2010", - "rv32i_m/I/srl-01", "2010", - "rv32i_m/I/srli-01", "2010", - "rv32i_m/I/sub-01", "5010", - "rv32i_m/I/sw-align-01", "2010", - "rv32i_m/I/xor-01", "5010", - "rv32i_m/I/xori-01", "4010" - }; - - string tests[]; - string ProgramAddrMapFile, ProgramLabelMapFile; - logic [`AHBW-1:0] HRDATAEXT; - logic HREADYEXT, HRESPEXT; - logic [31:0] HADDR; - logic [`AHBW-1:0] HWDATA; - logic HWRITE; - logic [2:0] HSIZE; - logic [2:0] HBURST; - logic [3:0] HPROT; - logic [1:0] HTRANS; - logic HMASTLOCK; - logic HCLK, HRESETn; - logic [`XLEN-1:0] PCW; - - logic DCacheFlushDone, DCacheFlushStart; - - flopenr #(`XLEN) PCWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.PCM, PCW); - flopenr #(32) InstrWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.InstrM, InstrW); - - // check assertions for a legal configuration - riscvassertions riscvassertions(); - logging logging(clk, reset, dut.uncore.HADDR, dut.uncore.HTRANS); - - // pick tests based on modes supported - initial begin - if (`XLEN == 64) begin // RV64 - if (`TESTSBP) begin - //tests = testsBP64; - // testsbp should not run the other tests. It starts at address 0 rather than - // 0x8000_0000, the next if must remain an else if. - end else if (TESTSPERIPH) - //tests = tests64periph; - tests = {}; - else if (TESTSPRIV) - //tests = tests64p; - tests = {}; - else begin - tests = {tests64priv, tests64i}; -// tests = {tests64p,tests64i, tests64periph}; - if (`C_SUPPORTED) tests = {tests, tests64ic}; -// else tests = {tests, tests64iNOc}; - if (`M_SUPPORTED) tests = {tests64m, tests}; -/* if (`F_SUPPORTED) tests = {tests64f, tests}; - if (`D_SUPPORTED) tests = {tests64d, tests}; - if (`MEM_VIRTMEM) tests = {tests64mmu, tests}; - if (`A_SUPPORTED) tests = {tests64a, tests}; */ - end - //tests = {tests64a, tests}; - end else begin // RV32 - // *** add the 32 bit bp tests - if (TESTSPERIPH) - //tests = tests32periph; - tests = {}; - else if (TESTSPRIV) - //tests = tests32p; - tests = {}; - else begin - tests = {tests32priv, tests32i}; - //tests = {tests32i, tests32priv}; - if (`C_SUPPORTED) tests = {tests, tests32ic}; - if (`M_SUPPORTED) tests = {tests32m, tests}; - //if (`C_SUPPORTED) tests = {tests32ic, tests}; - //if (`M_SUPPORTED) tests = {tests32m, tests}; -/* tests = {tests32i, tests32p};//,tests32periph}; *** broken at the moment - if (`C_SUPPORTED % 2 == 1) tests = {tests, tests32ic}; - else tests = {tests, tests32iNOc}; - if (`M_SUPPORTED % 2 == 1) tests = {tests, tests32m}; - if (`F_SUPPORTED) tests = {tests32f, tests}; - if (`MEM_VIRTMEM) tests = {tests32mmu, tests}; - if (`A_SUPPORTED) tests = {tests32a, tests}; */ - end - end - end - - string tvroot, bootroot, signame, memfilename, romfilename; - - logic [31:0] GPIOPinsIn, GPIOPinsOut, GPIOPinsEn; - logic UARTSin, UARTSout; - - // instantiate device to be tested - assign GPIOPinsIn = 0; - assign UARTSin = 1; - assign HREADYEXT = 1; - assign HRESPEXT = 0; - assign HRDATAEXT = 0; - - wallypipelinedsoc dut(.*); - - // Track names of instructions - instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE, - dut.hart.ifu.icache.FinalInstrRawF, - dut.hart.ifu.InstrD, dut.hart.ifu.InstrE, - dut.hart.ifu.InstrM, dut.hart.ifu.InstrW, - InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); - - // initialize tests - localparam integer MemStartAddr = `TIM_BASE>>(1+`XLEN/32); - localparam integer MemEndAddr = (`TIM_RANGE+`TIM_BASE)>>1+(`XLEN/32); - - initial - begin - test = 0; - totalerrors = 0; - testadr = 0; - // fill memory with defined values to reduce Xs in simulation - // Quick note the memory will need to be initialized. The C library does not - // guarantee the initialized reads. For example a strcmp can read 6 byte - // strings, but uses a load double to read them in. If the last 2 bytes are - // not initialized the compare results in an 'x' which propagates through - // the design. - if (`XLEN == 32) meminit = 32'hFEDC0123; - else meminit = 64'hFEDCBA9876543210; - // *** broken because DTIM also drives RAM - if (`TESTSBP) begin - for (i=MemStartAddr; i= 128 || `MEM_DCACHE == 0) else $error("DCACHE_BLOCKLENINBITS must be at least 128 when caches are enabled"); - assert (`DCACHE_BLOCKLENINBITS < `DCACHE_WAYSIZEINBYTES*8) else $error("DCACHE_BLOCKLENINBITS must be smaller than way size"); - assert (`ICACHE_WAYSIZEINBYTES <= 4096 || `MEM_ICACHE == 0 || `MEM_VIRTMEM == 0) else $error("ICACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)"); - assert (`ICACHE_BLOCKLENINBITS >= 32 || `MEM_ICACHE == 0) else $error("ICACHE_BLOCKLENINBITS must be at least 32 when caches are enabled"); - assert (`ICACHE_BLOCKLENINBITS < `ICACHE_WAYSIZEINBYTES*8) else $error("ICACHE_BLOCKLENINBITS must be smaller than way size"); - assert (2**$clog2(`DCACHE_BLOCKLENINBITS) == `DCACHE_BLOCKLENINBITS) else $error("DCACHE_BLOCKLENINBITS must be a power of 2"); - assert (2**$clog2(`DCACHE_WAYSIZEINBYTES) == `DCACHE_WAYSIZEINBYTES) else $error("DCACHE_WAYSIZEINBYTES must be a power of 2"); - assert (2**$clog2(`ICACHE_BLOCKLENINBITS) == `ICACHE_BLOCKLENINBITS) else $error("ICACHE_BLOCKLENINBITS must be a power of 2"); - assert (2**$clog2(`ICACHE_WAYSIZEINBYTES) == `ICACHE_WAYSIZEINBYTES) else $error("ICACHE_WAYSIZEINBYTES must be a power of 2"); - assert (`ICACHE_NUMWAYS == 1 || `MEM_ICACHE == 0) else $warning("Multiple Instruction Cache ways not yet implemented"); - assert (2**$clog2(`ITLB_ENTRIES) == `ITLB_ENTRIES) else $error("ITLB_ENTRIES must be a power of 2"); - assert (2**$clog2(`DTLB_ENTRIES) == `DTLB_ENTRIES) else $error("DTLB_ENTRIES must be a power of 2"); - assert (`TIM_RANGE >= 56'h07FFFFFF) else $error("Some regression tests will fail if TIM_RANGE is less than 56'h07FFFFFF"); - end -endmodule - - -/* verilator lint_on STMTDLY */ -/* verilator lint_on WIDTH */ - -module DCacheFlushFSM - (input logic clk, - input logic reset, - input logic start, - output logic done); - - localparam integer numlines = testbench.dut.hart.lsu.dcache.NUMLINES; - localparam integer numways = testbench.dut.hart.lsu.dcache.NUMWAYS; - localparam integer blockbytelen = testbench.dut.hart.lsu.dcache.BLOCKBYTELEN; - localparam integer numwords = testbench.dut.hart.lsu.dcache.BLOCKLEN/`XLEN; - localparam integer lognumlines = $clog2(numlines); - localparam integer logblockbytelen = $clog2(blockbytelen); - localparam integer lognumways = $clog2(numways); - localparam integer tagstart = lognumlines + logblockbytelen; - - - - genvar index, way, cacheWord; - logic [`XLEN-1:0] CacheData [numways-1:0] [numlines-1:0] [numwords-1:0]; - logic [`XLEN-1:0] CacheTag [numways-1:0] [numlines-1:0] [numwords-1:0]; - logic CacheValid [numways-1:0] [numlines-1:0] [numwords-1:0]; - logic CacheDirty [numways-1:0] [numlines-1:0] [numwords-1:0]; - logic [`PA_BITS-1:0] CacheAdr [numways-1:0] [numlines-1:0] [numwords-1:0]; - genvar adr; - - logic [`XLEN-1:0] ShadowRAM[`TIM_BASE>>(1+`XLEN/32):(`TIM_RANGE+`TIM_BASE)>>1+(`XLEN/32)]; - - generate - for(index = 0; index < numlines; index++) begin - for(way = 0; way < numways; way++) begin - for(cacheWord = 0; cacheWord < numwords; cacheWord++) begin - copyShadow #(.tagstart(tagstart), - .logblockbytelen(logblockbytelen)) - copyShadow(.clk, - .start, - .tag(testbench.dut.hart.lsu.dcache.MemWay[way].CacheTagMem.StoredData[index]), - .valid(testbench.dut.hart.lsu.dcache.MemWay[way].ValidBits[index]), - .dirty(testbench.dut.hart.lsu.dcache.MemWay[way].DirtyBits[index]), - .data(testbench.dut.hart.lsu.dcache.MemWay[way].word[cacheWord].CacheDataMem.StoredData[index]), - .index(index), - .cacheWord(cacheWord), - .CacheData(CacheData[way][index][cacheWord]), - .CacheAdr(CacheAdr[way][index][cacheWord]), - .CacheTag(CacheTag[way][index][cacheWord]), - .CacheValid(CacheValid[way][index][cacheWord]), - .CacheDirty(CacheDirty[way][index][cacheWord])); - end - end - end - endgenerate - - integer i, j, k; - - always @(posedge clk) begin - if (start) begin #1 - #1 - for(i = 0; i < numlines; i++) begin - for(j = 0; j < numways; j++) begin - for(k = 0; k < numwords; k++) begin - if (CacheValid[j][i][k] && CacheDirty[j][i][k]) begin - ShadowRAM[CacheAdr[j][i][k] >> $clog2(`XLEN/8)] = CacheData[j][i][k]; - end - end - end - end - end - end - - - flop #(1) doneReg(.clk(clk), - .d(start), - .q(done)); - -endmodule - -module copyShadow - #(parameter tagstart, logblockbytelen) - (input logic clk, - input logic start, - input logic [`PA_BITS-1:tagstart] tag, - input logic valid, dirty, - input logic [`XLEN-1:0] data, - input logic [32-1:0] index, - input logic [32-1:0] cacheWord, - output logic [`XLEN-1:0] CacheData, - output logic [`PA_BITS-1:0] CacheAdr, - output logic [`XLEN-1:0] CacheTag, - output logic CacheValid, - output logic CacheDirty); - - - always_ff @(posedge clk) begin - if(start) begin - CacheTag = tag; - CacheValid = valid; - CacheDirty = dirty; - CacheData = data; - CacheAdr = (tag << tagstart) + (index << logblockbytelen) + (cacheWord << $clog2(`XLEN/8)); - end - end - -endmodule - diff --git a/wally-pipelined/testbench/testbench-imperas.sv b/wally-pipelined/testbench/testbench-imperas.sv deleted file mode 100644 index 40719351c..000000000 --- a/wally-pipelined/testbench/testbench-imperas.sv +++ /dev/null @@ -1,872 +0,0 @@ -/////////////////////////////////////////// -// testbench-imperas.sv -// -// Written: David_Harris@hmc.edu 9 January 2021 -// Modified: -// -// Purpose: Wally Testbench and helper modules -// Applies test programs from the Imperas suite -// -// A component of the Wally configurable RISC-V project. -// -// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, -// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT -// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -/////////////////////////////////////////// - -`include "wally-config.vh" - -module testbench(); - parameter DEBUG = 0; - parameter TESTSPERIPH = 0; // set to 0 for regression - parameter TESTSPRIV = 0; // set to 0 for regression - - logic clk; - logic reset; - - parameter SIGNATURESIZE = 5000000; - - int test, i, errors, totalerrors; - logic [31:0] sig32[0:SIGNATURESIZE]; - logic [`XLEN-1:0] signature[0:SIGNATURESIZE]; - logic [`XLEN-1:0] testadr; - string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName; - logic [31:0] InstrW; - logic [`XLEN-1:0] meminit; - - string tests32mmu[] = '{ - "rv32mmu/WALLY-MMU-SV32", "3000" - //"rv32mmu/WALLY-PMP", "3000", - //"rv32mmu/WALLY-PMA", "3000" - }; - - string tests64mmu[] = '{ - "rv64mmu/WALLY-MMU-SV48", "3000", - "rv64mmu/WALLY-MMU-SV39", "3000", - "rv64mmu/WALLY-PMP", "3000" - //"rv64mmu/WALLY-PMA", "3000" - }; - - -string tests32f[] = '{ - "rv32f/I-FADD-S-01", "2000", - "rv32f/I-FCLASS-S-01", "2000", - "rv32f/I-FCVT-S-W-01", "2000", - "rv32f/I-FCVT-S-WU-01", "2000", - "rv32f/I-FCVT-W-S-01", "2000", - "rv32f/I-FCVT-WU-S-01", "2000", - "rv32f/I-FDIV-S-01", "2000", - "rv32f/I-FEQ-S-01", "2000", - "rv32f/I-FLE-S-01", "2000", - "rv32f/I-FLT-S-01", "2000", - "rv32f/I-FMADD-S-01", "2000", - "rv32f/I-FMAX-S-01", "2000", - "rv32f/I-FMIN-S-01", "2000", - "rv32f/I-FMSUB-S-01", "2000", - "rv32f/I-FMUL-S-01", "2000", - "rv32f/I-FMV-W-X-01", "2000", - "rv32f/I-FMV-X-W-01", "2000", - "rv32f/I-FNMADD-S-01", "2000", - "rv32f/I-FNMSUB-S-01", "2000", - "rv32f/I-FSGNJ-S-01", "2000", - "rv32f/I-FSGNJN-S-01", "2000", - "rv32f/I-FSGNJX-S-01", "2000", - "rv32f/I-FSQRT-S-01", "2000", - "rv32f/I-FSW-01", "2000", - "rv32f/I-FLW-01", "2110", - "rv32f/I-FSUB-S-01", "2000" - }; - - string tests64f[] = '{ - "rv64f/I-FLW-01", "2110", - "rv64f/I-FMV-W-X-01", "2000", - "rv64f/I-FMV-X-W-01", "2000", - "rv64f/I-FSW-01", "2000", - "rv64f/I-FCLASS-S-01", "2000", - "rv64f/I-FADD-S-01", "2000", -// "rv64f/I-FCVT-S-L-01", "2000", -// "rv64f/I-FCVT-S-LU-01", "2000", -// "rv64f/I-FCVT-S-W-01", "2000", -// "rv64f/I-FCVT-S-WU-01", "2000", - "rv64f/I-FCVT-L-S-01", "2000", - "rv64f/I-FCVT-LU-S-01", "2000", - "rv64f/I-FCVT-W-S-01", "2000", - "rv64f/I-FCVT-WU-S-01", "2000", - "rv64f/I-FDIV-S-01", "2000", - "rv64f/I-FEQ-S-01", "2000", - "rv64f/I-FLE-S-01", "2000", - "rv64f/I-FLT-S-01", "2000", - "rv64f/I-FMADD-S-01", "2000", - "rv64f/I-FMAX-S-01", "2000", - "rv64f/I-FMIN-S-01", "2000", - "rv64f/I-FMSUB-S-01", "2000", - "rv64f/I-FMUL-S-01", "2000", - "rv64f/I-FNMADD-S-01", "2000", - "rv64f/I-FNMSUB-S-01", "2000", - "rv64f/I-FSGNJ-S-01", "2000", - "rv64f/I-FSGNJN-S-01", "2000", - "rv64f/I-FSGNJX-S-01", "2000", - "rv64f/I-FSQRT-S-01", "2000", - "rv64f/I-FSUB-S-01", "2000" - }; - - string tests64d[] = '{ - "rv64d/I-FSD-01", "2000", - "rv64d/I-FLD-01", "2420", - "rv64d/I-FMV-X-D-01", "2000", - "rv64d/I-FMV-D-X-01", "2000", - "rv64d/I-FDIV-D-01", "2000", - "rv64d/I-FNMADD-D-01", "2000", - "rv64d/I-FNMSUB-D-01", "2000", - "rv64d/I-FMSUB-D-01", "2000", - "rv64d/I-FMAX-D-01", "2000", - "rv64d/I-FMIN-D-01", "2000", - "rv64d/I-FLE-D-01", "2000", - "rv64d/I-FLT-D-01", "2000", - "rv64d/I-FEQ-D-01", "2000", - "rv64d/I-FADD-D-01", "2000", - "rv64d/I-FCLASS-D-01", "2000", - "rv64d/I-FMADD-D-01", "2000", - "rv64d/I-FMUL-D-01", "2000", - "rv64d/I-FSGNJ-D-01", "2000", - "rv64d/I-FSGNJN-D-01", "2000", - "rv64d/I-FSGNJX-D-01", "2000", - "rv64d/I-FSQRT-D-01", "2000", - "rv64d/I-FSUB-D-01", "2000", -// "rv64d/I-FCVT-D-L-01", "2000", -// "rv64d/I-FCVT-D-LU-01", "2000", - "rv64d/I-FCVT-D-S-01", "2000", -// "rv64d/I-FCVT-D-W-01", "2000", -// "rv64d/I-FCVT-D-WU-01", "2000", - "rv64d/I-FCVT-L-D-01", "2000", - "rv64d/I-FCVT-LU-D-01", "2000", - "rv64d/I-FCVT-S-D-01", "2000", - "rv64d/I-FCVT-W-D-01", "2000", - "rv64d/I-FCVT-WU-D-01", "2000" -}; - - string tests64a[] = '{ - "rv64a/WALLY-AMO", "2110", - "rv64a/WALLY-LRSC", "2110" - }; - - string tests64m[] = '{ - "rv64m/I-REMUW-01", "3000", - "rv64m/I-REMW-01", "3000", - "rv64m/I-DIVUW-01", "3000", - "rv64m/I-DIVW-01", "3000", - "rv64m/I-MUL-01", "3000", - "rv64m/I-MULH-01", "3000", - "rv64m/I-MULHSU-01", "3000", - "rv64m/I-MULHU-01", "3000", - "rv64m/I-MULW-01", "3000", - "rv64m/I-DIV-01", "3000", - "rv64m/I-DIVU-01", "3000", - "rv64m/I-REM-01", "3000", - "rv64m/I-REMU-01", "3000" - }; - - string tests64ic[] = '{ - "rv64ic/I-C-ADD-01", "3000", - "rv64ic/I-C-ADDI-01", "3000", - "rv64ic/I-C-ADDIW-01", "3000", - "rv64ic/I-C-ADDW-01", "3000", - "rv64ic/I-C-AND-01", "3000", - "rv64ic/I-C-ANDI-01", "3000", - "rv64ic/I-C-BEQZ-01", "3000", - "rv64ic/I-C-BNEZ-01", "3000", - "rv64ic/I-C-EBREAK-01", "2000", - "rv64ic/I-C-J-01", "3000", - "rv64ic/I-C-JALR-01", "4000", - "rv64ic/I-C-JR-01", "4000", - "rv64ic/I-C-LD-01", "3420", - "rv64ic/I-C-LDSP-01", "3420", - "rv64ic/I-C-LI-01", "3000", - "rv64ic/I-C-LUI-01", "2000", - "rv64ic/I-C-LW-01", "3110", - "rv64ic/I-C-LWSP-01", "3110", - "rv64ic/I-C-MV-01", "3000", - "rv64ic/I-C-NOP-01", "2000", - "rv64ic/I-C-OR-01", "3000", - "rv64ic/I-C-SD-01", "3000", - "rv64ic/I-C-SDSP-01", "3000", - "rv64ic/I-C-SLLI-01", "3000", - "rv64ic/I-C-SRAI-01", "3000", - "rv64ic/I-C-SRLI-01", "3000", - "rv64ic/I-C-SUB-01", "3000", - "rv64ic/I-C-SUBW-01", "3000", - "rv64ic/I-C-SW-01", "3000", - "rv64ic/I-C-SWSP-01", "3000", - "rv64ic/I-C-XOR-01", "3000" - }; - - string tests64iNOc[] = { - "rv64i/I-MISALIGN_JMP-01","2000" - }; - - string tests64i[] = '{ - //"rv64i/WALLY-PIPELINE-100K", "f7ff0", - "rv64i/I-ADD-01", "3000", - "rv64i/I-ADDI-01", "3000", - "rv64i/I-ADDIW-01", "3000", - "rv64i/I-ADDW-01", "3000", - "rv64i/I-AND-01", "3000", - "rv64i/I-ANDI-01", "3000", - "rv64i/I-AUIPC-01", "3000", - "rv64i/I-BEQ-01", "4000", - "rv64i/I-BGE-01", "4000", - "rv64i/I-BGEU-01", "4000", - "rv64i/I-BLT-01", "4000", - "rv64i/I-BLTU-01", "4000", - "rv64i/I-BNE-01", "4000", - "rv64i/I-DELAY_SLOTS-01", "2000", - "rv64i/I-EBREAK-01", "2000", - "rv64i/I-ECALL-01", "2000", - "rv64i/I-ENDIANESS-01", "2010", - "rv64i/I-IO-01", "2050", - "rv64i/I-JAL-01", "3000", - "rv64i/I-JALR-01", "4000", - "rv64i/I-LB-01", "4020", - "rv64i/I-LBU-01", "4020", - "rv64i/I-LD-01", "4420", - "rv64i/I-LH-01", "4050", - "rv64i/I-LHU-01", "4050", - "rv64i/I-LUI-01", "2000", - "rv64i/I-LW-01", "4110", - "rv64i/I-LWU-01", "4110", - "rv64i/I-MISALIGN_LDST-01", "2010", - "rv64i/I-NOP-01", "2000", - "rv64i/I-OR-01", "3000", - "rv64i/I-ORI-01", "3000", - "rv64i/I-RF_size-01", "2000", - "rv64i/I-RF_width-01", "2000", - "rv64i/I-RF_x0-01", "2010", - "rv64i/I-SB-01", "4000", - "rv64i/I-SD-01", "4000", - "rv64i/I-SH-01", "4000", - "rv64i/I-SLL-01", "3000", - "rv64i/I-SLLI-01", "3000", - "rv64i/I-SLLIW-01", "3000", - "rv64i/I-SLLW-01", "3000", - "rv64i/I-SLT-01", "3000", - "rv64i/I-SLTI-01", "3000", - "rv64i/I-SLTIU-01", "3000", - "rv64i/I-SLTU-01", "3000", - "rv64i/I-SRA-01", "3000", - "rv64i/I-SRAI-01", "3000", - "rv64i/I-SRAIW-01", "3000", - "rv64i/I-SRAW-01", "3000", - "rv64i/I-SRL-01", "3000", - "rv64i/I-SRLI-01", "3000", - "rv64i/I-SRLIW-01", "3000", - "rv64i/I-SRLW-01", "3000", - "rv64i/I-SUB-01", "3000", - "rv64i/I-SUBW-01", "3000", - "rv64i/I-SW-01", "4000", - "rv64i/I-XOR-01", "3000", - "rv64i/I-XORI-01", "3000", - "rv64i/WALLY-ADD", "4000", - "rv64i/WALLY-SUB", "4000", - "rv64i/WALLY-ADDI", "3000", - "rv64i/WALLY-ANDI", "3000", - "rv64i/WALLY-ORI", "3000", - "rv64i/WALLY-XORI", "3000", - "rv64i/WALLY-SLTI", "3000", - "rv64i/WALLY-SLTIU", "3000", - "rv64i/WALLY-SLLI", "3000", - "rv64i/WALLY-SRLI", "3000", - "rv64i/WALLY-SRAI", "3000", - "rv64i/WALLY-JAL", "4000", - "rv64i/WALLY-JALR", "3000", - "rv64i/WALLY-STORE", "3000", - "rv64i/WALLY-ADDIW", "3000", - "rv64i/WALLY-SLLIW", "3000", - "rv64i/WALLY-SRLIW", "3000", - "rv64i/WALLY-SRAIW", "3000", - "rv64i/WALLY-ADDW", "4000", - "rv64i/WALLY-SUBW", "4000", - "rv64i/WALLY-SLLW", "3000", - "rv64i/WALLY-SRLW", "3000", - "rv64i/WALLY-SRAW", "3000", - "rv64i/WALLY-BEQ" ,"5000", - "rv64i/WALLY-BNE", "5000 ", - "rv64i/WALLY-BLTU", "5000 ", - "rv64i/WALLY-BLT", "5000", - "rv64i/WALLY-BGE", "5000 ", - "rv64i/WALLY-BGEU", "5000 ", - "rv64i/WALLY-CSRRW", "4000", - "rv64i/WALLY-CSRRS", "4000", - "rv64i/WALLY-CSRRC", "5000", - "rv64i/WALLY-CSRRWI", "4000", - "rv64i/WALLY-CSRRSI", "4000", - "rv64i/WALLY-CSRRCI", "4000" - }; - - string tests32a[] = '{ - "rv32a/WALLY-AMO", "2110", - "rv32a/WALLY-LRSC", "2110" - }; - - string tests32m[] = '{ - "rv32m/I-DIVU-01", "2000", - "rv32m/I-REMU-01", "2000", - "rv32m/I-DIV-01", "2000", - "rv32m/I-REM-01", "2000", - "rv32m/I-MUL-01", "2000", - "rv32m/I-MULH-01", "2000", - "rv32m/I-MULHSU-01", "2000", - "rv32m/I-MULHU-01", "2000" - }; - - string tests32ic[] = '{ - "rv32ic/I-C-ADD-01", "2000", - "rv32ic/I-C-ADDI-01", "2000", - "rv32ic/I-C-AND-01", "2000", - "rv32ic/I-C-ANDI-01", "2000", - "rv32ic/I-C-BEQZ-01", "2000", - "rv32ic/I-C-BNEZ-01", "2000", - "rv32ic/I-C-EBREAK-01", "2000", - "rv32ic/I-C-J-01", "2000", - "rv32ic/I-C-JALR-01", "3000", - "rv32ic/I-C-JR-01", "3000", - "rv32ic/I-C-LI-01", "2000", - "rv32ic/I-C-LUI-01", "2000", - "rv32ic/I-C-LW-01", "2110", - "rv32ic/I-C-LWSP-01", "2110", - "rv32ic/I-C-MV-01", "2000", - "rv32ic/I-C-NOP-01", "2000", - "rv32ic/I-C-OR-01", "2000", - "rv32ic/I-C-SLLI-01", "2000", - "rv32ic/I-C-SRAI-01", "2000", - "rv32ic/I-C-SRLI-01", "2000", - "rv32ic/I-C-SUB-01", "2000", - "rv32ic/I-C-SW-01", "2000", - "rv32ic/I-C-SWSP-01", "2000", - "rv32ic/I-C-XOR-01", "2000" - }; - - string tests32iNOc[] = { - "rv32i/I-MISALIGN_JMP-01","2000" - }; - - string tests32i[] = { - //"rv32i/WALLY-PIPELINE-100K", "10a800", - "rv32i/I-ADD-01", "2000", - "rv32i/I-ADDI-01","2000", - "rv32i/I-AND-01","2000", - "rv32i/I-ANDI-01","2000", - "rv32i/I-AUIPC-01","2000", - "rv32i/I-BEQ-01","3000", - "rv32i/I-BGE-01","3000", - "rv32i/I-BGEU-01","3000", - "rv32i/I-BLT-01","3000", - "rv32i/I-BLTU-01","3000", - "rv32i/I-BNE-01","3000", - "rv32i/I-DELAY_SLOTS-01","2000", - "rv32i/I-EBREAK-01","2000", - "rv32i/I-ECALL-01","2000", - "rv32i/I-ENDIANESS-01","2010", - "rv32i/I-IO-01","2030rv", - "rv32i/I-JAL-01","3000", - "rv32i/I-JALR-01","3000", - "rv32i/I-LB-01","3020", - "rv32i/I-LBU-01","3020", - "rv32i/I-LH-01","3050", - "rv32i/I-LHU-01","3050", - "rv32i/I-LUI-01","2000", - "rv32i/I-LW-01","3110", - "rv32i/I-MISALIGN_LDST-01","2010", - "rv32i/I-NOP-01","2000", - "rv32i/I-OR-01","2000", - "rv32i/I-ORI-01","2000", - "rv32i/I-RF_size-01","2000", - "rv32i/I-RF_width-01","2000", - "rv32i/I-RF_x0-01","2010", - "rv32i/I-SB-01","3000", - "rv32i/I-SH-01","3000", - "rv32i/I-SLL-01","2000", - "rv32i/I-SLLI-01","2000", - "rv32i/I-SLT-01","2000", - "rv32i/I-SLTI-01","2000", - "rv32i/I-SLTIU-01","2000", - "rv32i/I-SLTU-01","2000", - "rv32i/I-SRA-01","2000", - "rv32i/I-SRAI-01","2000", - "rv32i/I-SRL-01","2000", - "rv32i/I-SRLI-01","2000", - "rv32i/I-SUB-01","2000", - "rv32i/I-SW-01","3000", - "rv32i/I-XOR-01","2000", - "rv32i/I-XORI-01","2000", - "rv32i/WALLY-ADD", "3000", - "rv32i/WALLY-SUB", "3000", - "rv32i/WALLY-ADDI", "2000", - "rv32i/WALLY-ANDI", "2000", - "rv32i/WALLY-ORI", "2000", - "rv32i/WALLY-XORI", "2000", - "rv32i/WALLY-SLTI", "2000", - "rv32i/WALLY-SLTIU", "2000", - "rv32i/WALLY-SLLI", "2000", - "rv32i/WALLY-SRLI", "2000", - "rv32i/WALLY-SRAI", "2000", - "rv32i/WALLY-LOAD", "11c00", - "rv32i/WALLY-SUB", "3000", - "rv32i/WALLY-STORE", "2000", - "rv32i/WALLY-JAL", "3000", - "rv32i/WALLY-JALR", "2000", - "rv32i/WALLY-BEQ" ,"4000", - "rv32i/WALLY-BNE", "4000 ", - "rv32i/WALLY-BLTU", "4000 ", - "rv32i/WALLY-BLT", "4000", - "rv32i/WALLY-BGE", "4000 ", - "rv32i/WALLY-BGEU", "4000 ", - "rv32i/WALLY-CSRRW", "3000", - "rv32i/WALLY-CSRRS", "3000", - "rv32i/WALLY-CSRRC", "4000", - "rv32i/WALLY-CSRRWI", "3000", - "rv32i/WALLY-CSRRSI", "3000", - "rv32i/WALLY-CSRRCI", "3000" - }; - - string testsBP64[] = '{ - "rv64BP/simple", "10000", - "rv64BP/mmm", "1000000", - "rv64BP/linpack_bench", "1000000", - "rv64BP/sieve", "1000000", - "rv64BP/qsort", "1000000", - "rv64BP/dhrystone", "1000000" - }; - - string tests64p[] = '{ - "rv64p/WALLY-MSTATUS", "2000", - "rv64p/WALLY-MCAUSE", "3000", - "rv64p/WALLY-SCAUSE", "2000", - "rv64p/WALLY-MEPC", "5000", - "rv64p/WALLY-SEPC", "4000", - "rv64p/WALLY-MTVAL", "6000", - "rv64p/WALLY-STVAL", "4000", - "rv64p/WALLY-MTVEC", "2000", - "rv64p/WALLY-STVEC", "2000", - "rv64p/WALLY-MARCHID", "4000", - "rv64p/WALLY-MIMPID", "4000", - "rv64p/WALLY-MHARTID", "4000", - "rv64p/WALLY-MVENDORID", "4000", - "rv64p/WALLY-MIE", "3000", - "rv64p/WALLY-MEDELEG", "4000", - "rv64p/WALLY-IP", "2000", - "rv64p/WALLY-CSR-PERMISSIONS-M", "5000", - "rv64p/WALLY-CSR-PERMISSIONS-S", "3000" - }; - - string tests32p[] = '{ - "rv32p/WALLY-MSTATUS", "2000", - "rv32p/WALLY-MCAUSE", "3000", - "rv32p/WALLY-SCAUSE", "2000", - "rv32p/WALLY-MEPC", "5000", - "rv32p/WALLY-SEPC", "4000", - "rv32p/WALLY-MTVAL", "5000", - "rv32p/WALLY-STVAL", "4000", - "rv32p/WALLY-MARCHID", "4000", - "rv32p/WALLY-MIMPID", "4000", - "rv32p/WALLY-MHARTID", "4000", - "rv32p/WALLY-MVENDORID", "4000", - "rv32p/WALLY-MTVEC", "2000", - "rv32p/WALLY-STVEC", "2000", - "rv32p/WALLY-MIE", "3000", - "rv32p/WALLY-MEDELEG", "4000", - "rv32p/WALLY-IP", "3000", - "rv32p/WALLY-CSR-PERMISSIONS-M", "5000", - "rv32p/WALLY-CSR-PERMISSIONS-S", "3000" - }; - - string tests64periph[] = '{ - "rv64i-periph/WALLY-PERIPH", "2000" - }; - - string tests32periph[] = '{ - "rv32i-periph/WALLY-PLIC", "2080" - }; - - string tests[]; - string ProgramAddrMapFile, ProgramLabelMapFile; - logic [`AHBW-1:0] HRDATAEXT; - logic HREADYEXT, HRESPEXT; - logic [31:0] HADDR; - logic [`AHBW-1:0] HWDATA; - logic HWRITE; - logic [2:0] HSIZE; - logic [2:0] HBURST; - logic [3:0] HPROT; - logic [1:0] HTRANS; - logic HMASTLOCK; - logic HCLK, HRESETn; - logic [`XLEN-1:0] PCW; - - logic DCacheFlushDone, DCacheFlushStart; - - flopenr #(`XLEN) PCWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.PCM, PCW); - flopenr #(32) InstrWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.InstrM, InstrW); - - // check assertions for a legal configuration - riscvassertions riscvassertions(); - logging logging(clk, reset, dut.uncore.HADDR, dut.uncore.HTRANS); - - // pick tests based on modes supported - initial begin - if (`XLEN == 64) begin // RV64 - if (`TESTSBP) begin - tests = testsBP64; - // testsbp should not run the other tests. It starts at address 0 rather than - // 0x8000_0000, the next if must remain an else if. - end else if (TESTSPERIPH) - tests = tests64periph; - else if (TESTSPRIV) - tests = tests64p; - else begin - tests = {tests64p,tests64i, tests64periph}; - if (`C_SUPPORTED) tests = {tests, tests64ic}; - else tests = {tests, tests64iNOc}; - if (`F_SUPPORTED) tests = {tests64f, tests}; - if (`D_SUPPORTED) tests = {tests64d, tests}; - if (`MEM_VIRTMEM) tests = {tests64mmu, tests}; - //if (`A_SUPPORTED) tests = {tests64a, tests}; - //if (`M_SUPPORTED) tests = {tests64m, tests}; - end - //tests = {tests64a, tests}; - end else begin // RV32 - // *** add the 32 bit bp tests - if (TESTSPERIPH) - tests = tests32periph; - else if (TESTSPRIV) - tests = tests32p; - else begin - tests = {tests32i, tests32p};//,tests32periph}; *** broken at the moment - if (`C_SUPPORTED) tests = {tests, tests32ic}; - else tests = {tests, tests32iNOc}; - if (`F_SUPPORTED) tests = {tests32f, tests}; - if (`MEM_VIRTMEM) tests = {tests32mmu, tests}; - if (`A_SUPPORTED) tests = {tests32a, tests}; - if (`M_SUPPORTED) tests = {tests32m, tests}; - end - end - end - - string signame, memfilename, romfilename; - - logic [31:0] GPIOPinsIn, GPIOPinsOut, GPIOPinsEn; - logic UARTSin, UARTSout; - - // instantiate device to be tested - assign GPIOPinsIn = 0; - assign UARTSin = 1; - assign HREADYEXT = 1; - assign HRESPEXT = 0; - assign HRDATAEXT = 0; - - wallypipelinedsoc dut(.*); - - // Track names of instructions - instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE, - dut.hart.ifu.icache.FinalInstrRawF, - dut.hart.ifu.InstrD, dut.hart.ifu.InstrE, - dut.hart.ifu.InstrM, dut.hart.ifu.InstrW, - InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); - - // initialize tests - localparam integer MemStartAddr = `TIM_BASE>>(1+`XLEN/32); - localparam integer MemEndAddr = (`TIM_RANGE+`TIM_BASE)>>1+(`XLEN/32); - - initial - begin - test = 0; - totalerrors = 0; - testadr = 0; - // fill memory with defined values to reduce Xs in simulation - // Quick note the memory will need to be initialized. The C library does not - // guarantee the initialized reads. For example a strcmp can read 6 byte - // strings, but uses a load double to read them in. If the last 2 bytes are - // not initialized the compare results in an 'x' which propagates through - // the design. - if (`XLEN == 32) meminit = 32'hFEDC0123; - else meminit = 64'hFEDCBA9876543210; - // *** broken because DTIM also drives RAM - if (`TESTSBP) begin - for (i=MemStartAddr; i= 128 || `MEM_DCACHE == 0) else $error("DCACHE_BLOCKLENINBITS must be at least 128 when caches are enabled"); - assert (`DCACHE_BLOCKLENINBITS < `DCACHE_WAYSIZEINBYTES*8) else $error("DCACHE_BLOCKLENINBITS must be smaller than way size"); - assert (`ICACHE_WAYSIZEINBYTES <= 4096 || `MEM_ICACHE == 0 || `MEM_VIRTMEM == 0) else $error("ICACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)"); - assert (`ICACHE_BLOCKLENINBITS >= 32 || `MEM_ICACHE == 0) else $error("ICACHE_BLOCKLENINBITS must be at least 32 when caches are enabled"); - assert (`ICACHE_BLOCKLENINBITS < `ICACHE_WAYSIZEINBYTES*8) else $error("ICACHE_BLOCKLENINBITS must be smaller than way size"); - assert (2**$clog2(`DCACHE_BLOCKLENINBITS) == `DCACHE_BLOCKLENINBITS) else $error("DCACHE_BLOCKLENINBITS must be a power of 2"); - assert (2**$clog2(`DCACHE_WAYSIZEINBYTES) == `DCACHE_WAYSIZEINBYTES) else $error("DCACHE_WAYSIZEINBYTES must be a power of 2"); - assert (2**$clog2(`ICACHE_BLOCKLENINBITS) == `ICACHE_BLOCKLENINBITS) else $error("ICACHE_BLOCKLENINBITS must be a power of 2"); - assert (2**$clog2(`ICACHE_WAYSIZEINBYTES) == `ICACHE_WAYSIZEINBYTES) else $error("ICACHE_WAYSIZEINBYTES must be a power of 2"); - assert (`ICACHE_NUMWAYS == 1 || `MEM_ICACHE == 0) else $warning("Multiple Instruction Cache ways not yet implemented"); - assert (2**$clog2(`ITLB_ENTRIES) == `ITLB_ENTRIES) else $error("ITLB_ENTRIES must be a power of 2"); - assert (2**$clog2(`DTLB_ENTRIES) == `DTLB_ENTRIES) else $error("DTLB_ENTRIES must be a power of 2"); - assert (`TIM_RANGE >= 56'h07FFFFFF) else $error("Some regression tests will fail if TIM_RANGE is less than 56'h07FFFFFF"); - end -endmodule - - -/* verilator lint_on STMTDLY */ -/* verilator lint_on WIDTH */ - -module DCacheFlushFSM - (input logic clk, - input logic reset, - input logic start, - output logic done); - - localparam integer numlines = testbench.dut.hart.lsu.dcache.NUMLINES; - localparam integer numways = testbench.dut.hart.lsu.dcache.NUMWAYS; - localparam integer blockbytelen = testbench.dut.hart.lsu.dcache.BLOCKBYTELEN; - localparam integer numwords = testbench.dut.hart.lsu.dcache.BLOCKLEN/`XLEN; - localparam integer lognumlines = $clog2(numlines); - localparam integer logblockbytelen = $clog2(blockbytelen); - localparam integer lognumways = $clog2(numways); - localparam integer tagstart = lognumlines + logblockbytelen; - - - - genvar index, way, cacheWord; - logic [`XLEN-1:0] CacheData [numways-1:0] [numlines-1:0] [numwords-1:0]; - logic [`XLEN-1:0] CacheTag [numways-1:0] [numlines-1:0] [numwords-1:0]; - logic CacheValid [numways-1:0] [numlines-1:0] [numwords-1:0]; - logic CacheDirty [numways-1:0] [numlines-1:0] [numwords-1:0]; - logic [`PA_BITS-1:0] CacheAdr [numways-1:0] [numlines-1:0] [numwords-1:0]; - genvar adr; - - logic [`XLEN-1:0] ShadowRAM[`TIM_BASE>>(1+`XLEN/32):(`TIM_RANGE+`TIM_BASE)>>1+(`XLEN/32)]; - - generate - for(index = 0; index < numlines; index++) begin - for(way = 0; way < numways; way++) begin - for(cacheWord = 0; cacheWord < numwords; cacheWord++) begin - copyShadow #(.tagstart(tagstart), - .logblockbytelen(logblockbytelen)) - copyShadow(.clk, - .start, - .tag(testbench.dut.hart.lsu.dcache.MemWay[way].CacheTagMem.StoredData[index]), - .valid(testbench.dut.hart.lsu.dcache.MemWay[way].ValidBits[index]), - .dirty(testbench.dut.hart.lsu.dcache.MemWay[way].DirtyBits[index]), - .data(testbench.dut.hart.lsu.dcache.MemWay[way].word[cacheWord].CacheDataMem.StoredData[index]), - .index(index), - .cacheWord(cacheWord), - .CacheData(CacheData[way][index][cacheWord]), - .CacheAdr(CacheAdr[way][index][cacheWord]), - .CacheTag(CacheTag[way][index][cacheWord]), - .CacheValid(CacheValid[way][index][cacheWord]), - .CacheDirty(CacheDirty[way][index][cacheWord])); - end - end - end - endgenerate - - integer i, j, k; - - always @(posedge clk) begin - if (start) begin #1 - #1 - for(i = 0; i < numlines; i++) begin - for(j = 0; j < numways; j++) begin - for(k = 0; k < numwords; k++) begin - if (CacheValid[j][i][k] && CacheDirty[j][i][k]) begin - ShadowRAM[CacheAdr[j][i][k] >> $clog2(`XLEN/8)] = CacheData[j][i][k]; - end - end - end - end - end - end - - - flop #(1) doneReg(.clk(clk), - .d(start), - .q(done)); - -endmodule - -module copyShadow - #(parameter tagstart, logblockbytelen) - (input logic clk, - input logic start, - input logic [`PA_BITS-1:tagstart] tag, - input logic valid, dirty, - input logic [`XLEN-1:0] data, - input logic [32-1:0] index, - input logic [32-1:0] cacheWord, - output logic [`XLEN-1:0] CacheData, - output logic [`PA_BITS-1:0] CacheAdr, - output logic [`XLEN-1:0] CacheTag, - output logic CacheValid, - output logic CacheDirty); - - - always_ff @(posedge clk) begin - if(start) begin - CacheTag = tag; - CacheValid = valid; - CacheDirty = dirty; - CacheData = data; - CacheAdr = (tag << tagstart) + (index << logblockbytelen) + (cacheWord << $clog2(`XLEN/8)); - end - end - -endmodule - diff --git a/wally-pipelined/testbench/testbench.sv b/wally-pipelined/testbench/testbench.sv new file mode 100644 index 000000000..bf6769218 --- /dev/null +++ b/wally-pipelined/testbench/testbench.sv @@ -0,0 +1,464 @@ +/////////////////////////////////////////// +// testbench.sv +// +// Written: David_Harris@hmc.edu 9 January 2021 +// Modified: +// +// Purpose: Wally Testbench and helper modules +// Applies test programs from the riscv-arch-test and Imperas suites +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +`include "wally-config.vh" +`include "tests.vh" + +module testbench (); + parameter TESTSPERIPH = 0; // set to 0 for regression + parameter TESTSPRIV = 0; // set to 0 for regression + parameter DEBUG=0; + parameter TEST="none"; + + logic clk; + logic reset; + + parameter SIGNATURESIZE = 5000000; + + int test, i, errors, totalerrors; + logic [31:0] sig32[0:SIGNATURESIZE]; + logic [`XLEN-1:0] signature[0:SIGNATURESIZE]; + logic [`XLEN-1:0] testadr; + string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName; + logic [31:0] InstrW; + logic [`XLEN-1:0] meminit; + + +string tests[]; +logic [3:0] dummy; + + string ProgramAddrMapFile, ProgramLabelMapFile; + logic [`AHBW-1:0] HRDATAEXT; + logic HREADYEXT, HRESPEXT; + logic [31:0] HADDR; + logic [`AHBW-1:0] HWDATA; + logic HWRITE; + logic [2:0] HSIZE; + logic [2:0] HBURST; + logic [3:0] HPROT; + logic [1:0] HTRANS; + logic HMASTLOCK; + logic HCLK, HRESETn; + logic [`XLEN-1:0] PCW; + + logic DCacheFlushDone, DCacheFlushStart; + + flopenr #(`XLEN) PCWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.PCM, PCW); + flopenr #(32) InstrWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.InstrM, InstrW); + + // check assertions for a legal configuration + riscvassertions riscvassertions(); + logging logging(clk, reset, dut.uncore.HADDR, dut.uncore.HTRANS); + + // pick tests based on modes supported + initial begin + $display("TEST is %s", TEST); + tests = '{"empty"}; + if (`XLEN == 64) begin // RV64 + case (TEST) + "arch64i": tests = arch64i; + "arch64priv": tests = arch64priv; + "arch64c": if (`C_SUPPORTED) tests = arch64c; + "arch64m": if (`M_SUPPORTED) tests = arch64m; + "imperas64i": tests = imperas64i; + "imperas64p": tests = imperas64p; + "imperas64mmu": if (`MEM_VIRTMEM) tests = imperas64mmu; + "imperas64f": if (`F_SUPPORTED) tests = imperas64f; + "imperas64d": if (`D_SUPPORTED) tests = imperas64d; + "imperas64m": if (`M_SUPPORTED) tests = imperas64m; + "imperas64a": if (`A_SUPPORTED) tests = imperas64a; + "imperas64c": if (`C_SUPPORTED) tests = imperas64c; + else tests = imperas64iNOc; + "testsBP64": tests = testsBP64; + // *** add arch f and d tests, peripheral tests + endcase + end else begin // RV32 + case (TEST) + "arch32i": tests = arch32i; + "arch32priv": tests = arch32priv; + "arch32c": if (`C_SUPPORTED) tests = arch32c; + "arch32m": if (`M_SUPPORTED) tests = arch32m; + "imperas32i": tests = imperas32i; + "imperas32p": tests = imperas32p; + "imperas32mmu": if (`MEM_VIRTMEM) tests = imperas32mmu; + "imperas32f": if (`F_SUPPORTED) tests = imperas32f; + "imperas32m": if (`M_SUPPORTED) tests = imperas32m; + "imperas32a": if (`A_SUPPORTED) tests = imperas32a; + "imperas32c": if (`C_SUPPORTED) tests = imperas32c; + else tests = imperas32iNOc; + // ***add arch f and d tests + endcase + end + if (tests.size() == 1) begin + $display("TEST %s not supported in this configuration", TEST); + $stop; + end + //if (TEST == "arch-64m") //tests = {archtests64m}; + /* if (`XLEN == 64) begin // RV64 + if (`TESTSBP) begin + tests = testsBP64; + // testsbp should not run the other tests. It starts at address 0 rather than + // 0x8000_0000, the next if must remain an else if. + end else if (TESTSPERIPH) + tests = imperastests64periph; + else if (TESTSPRIV) + tests = imperastests64p; + else begin + tests = {imperastests64p,imperastests64i, imperastests64periph}; + if (`C_SUPPORTED) tests = {tests, imperastests64ic}; + else tests = {tests, imperastests64iNOc}; + if (`F_SUPPORTED) tests = {imperastests64f, tests}; + if (`D_SUPPORTED) tests = {imperastests64d, tests}; + if (`MEM_VIRTMEM) tests = {imperastests64mmu, tests}; + if (`A_SUPPORTED) tests = {imperastests64a, tests}; + if (`M_SUPPORTED) tests = {imperastests64m, tests}; + end + //tests = {imperastests64a, tests}; + end else begin // RV32 + // *** add the 32 bit bp tests + if (TESTSPERIPH) + tests = imperastests32periph; + else if (TESTSPRIV) + tests = imperastests32p; + else begin + tests = {archtests32i, imperastests32i, imperastests32p};//,imperastests32periph}; *** broken at the moment + if (`C_SUPPORTED) tests = {tests, imperastests32ic}; + else tests = {tests, imperastests32iNOc}; + if (`F_SUPPORTED) tests = {imperastests32f, tests}; + if (`MEM_VIRTMEM) tests = {imperastests32mmu, tests}; + if (`A_SUPPORTED) tests = {imperastests32a, tests}; + if (`M_SUPPORTED) tests = {imperastests32m, tests}; + tests = {archtests32i}; + end + end */ + end + + string signame, memfilename, pathname; + + logic [31:0] GPIOPinsIn, GPIOPinsOut, GPIOPinsEn; + logic UARTSin, UARTSout; + + // instantiate device to be tested + assign GPIOPinsIn = 0; + assign UARTSin = 1; + assign HREADYEXT = 1; + assign HRESPEXT = 0; + assign HRDATAEXT = 0; + + wallypipelinedsoc dut(.*); + + // Track names of instructions + instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE, + dut.hart.ifu.icache.FinalInstrRawF, + dut.hart.ifu.InstrD, dut.hart.ifu.InstrE, + dut.hart.ifu.InstrM, dut.hart.ifu.InstrW, + InstrFName, InstrDName, InstrEName, InstrMName, InstrWName); + + // initialize tests + localparam integer MemStartAddr = `TIM_BASE>>(1+`XLEN/32); + localparam integer MemEndAddr = (`TIM_RANGE+`TIM_BASE)>>1+(`XLEN/32); + + initial + begin + test = 1; + totalerrors = 0; + testadr = 0; + // fill memory with defined values to reduce Xs in simulation + // Quick note the memory will need to be initialized. The C library does not + // guarantee the initialized reads. For example a strcmp can read 6 byte + // strings, but uses a load double to read them in. If the last 2 bytes are + // not initialized the compare results in an 'x' which propagates through + // the design. + if (`XLEN == 32) meminit = 32'hFEDC0123; + else meminit = 64'hFEDCBA9876543210; + // *** broken because DTIM also drives RAM + if (`TESTSBP) begin + for (i=MemStartAddr; i= 128 || `MEM_DCACHE == 0) else $error("DCACHE_BLOCKLENINBITS must be at least 128 when caches are enabled"); + assert (`DCACHE_BLOCKLENINBITS < `DCACHE_WAYSIZEINBYTES*8) else $error("DCACHE_BLOCKLENINBITS must be smaller than way size"); + assert (`ICACHE_WAYSIZEINBYTES <= 4096 || `MEM_ICACHE == 0 || `MEM_VIRTMEM == 0) else $error("ICACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)"); + assert (`ICACHE_BLOCKLENINBITS >= 32 || `MEM_ICACHE == 0) else $error("ICACHE_BLOCKLENINBITS must be at least 32 when caches are enabled"); + assert (`ICACHE_BLOCKLENINBITS < `ICACHE_WAYSIZEINBYTES*8) else $error("ICACHE_BLOCKLENINBITS must be smaller than way size"); + assert (2**$clog2(`DCACHE_BLOCKLENINBITS) == `DCACHE_BLOCKLENINBITS) else $error("DCACHE_BLOCKLENINBITS must be a power of 2"); + assert (2**$clog2(`DCACHE_WAYSIZEINBYTES) == `DCACHE_WAYSIZEINBYTES) else $error("DCACHE_WAYSIZEINBYTES must be a power of 2"); + assert (2**$clog2(`ICACHE_BLOCKLENINBITS) == `ICACHE_BLOCKLENINBITS) else $error("ICACHE_BLOCKLENINBITS must be a power of 2"); + assert (2**$clog2(`ICACHE_WAYSIZEINBYTES) == `ICACHE_WAYSIZEINBYTES) else $error("ICACHE_WAYSIZEINBYTES must be a power of 2"); + assert (`ICACHE_NUMWAYS == 1 || `MEM_ICACHE == 0) else $warning("Multiple Instruction Cache ways not yet implemented"); + assert (2**$clog2(`ITLB_ENTRIES) == `ITLB_ENTRIES) else $error("ITLB_ENTRIES must be a power of 2"); + assert (2**$clog2(`DTLB_ENTRIES) == `DTLB_ENTRIES) else $error("DTLB_ENTRIES must be a power of 2"); + assert (`TIM_RANGE >= 56'h07FFFFFF) else $warning("Some regression tests will fail if TIM_RANGE is less than 56'h07FFFFFF"); + end +endmodule + + +/* verilator lint_on STMTDLY */ +/* verilator lint_on WIDTH */ + +module DCacheFlushFSM + (input logic clk, + input logic reset, + input logic start, + output logic done); + + localparam integer numlines = testbench.dut.hart.lsu.dcache.NUMLINES; + localparam integer numways = testbench.dut.hart.lsu.dcache.NUMWAYS; + localparam integer blockbytelen = testbench.dut.hart.lsu.dcache.BLOCKBYTELEN; + localparam integer numwords = testbench.dut.hart.lsu.dcache.BLOCKLEN/`XLEN; + localparam integer lognumlines = $clog2(numlines); + localparam integer logblockbytelen = $clog2(blockbytelen); + localparam integer lognumways = $clog2(numways); + localparam integer tagstart = lognumlines + logblockbytelen; + + + + genvar index, way, cacheWord; + logic [`XLEN-1:0] CacheData [numways-1:0] [numlines-1:0] [numwords-1:0]; + logic [`XLEN-1:0] CacheTag [numways-1:0] [numlines-1:0] [numwords-1:0]; + logic CacheValid [numways-1:0] [numlines-1:0] [numwords-1:0]; + logic CacheDirty [numways-1:0] [numlines-1:0] [numwords-1:0]; + logic [`PA_BITS-1:0] CacheAdr [numways-1:0] [numlines-1:0] [numwords-1:0]; + genvar adr; + + logic [`XLEN-1:0] ShadowRAM[`TIM_BASE>>(1+`XLEN/32):(`TIM_RANGE+`TIM_BASE)>>1+(`XLEN/32)]; + + generate + for(index = 0; index < numlines; index++) begin + for(way = 0; way < numways; way++) begin + for(cacheWord = 0; cacheWord < numwords; cacheWord++) begin + copyShadow #(.tagstart(tagstart), + .logblockbytelen(logblockbytelen)) + copyShadow(.clk, + .start, + .tag(testbench.dut.hart.lsu.dcache.MemWay[way].CacheTagMem.StoredData[index]), + .valid(testbench.dut.hart.lsu.dcache.MemWay[way].ValidBits[index]), + .dirty(testbench.dut.hart.lsu.dcache.MemWay[way].DirtyBits[index]), + .data(testbench.dut.hart.lsu.dcache.MemWay[way].word[cacheWord].CacheDataMem.StoredData[index]), + .index(index), + .cacheWord(cacheWord), + .CacheData(CacheData[way][index][cacheWord]), + .CacheAdr(CacheAdr[way][index][cacheWord]), + .CacheTag(CacheTag[way][index][cacheWord]), + .CacheValid(CacheValid[way][index][cacheWord]), + .CacheDirty(CacheDirty[way][index][cacheWord])); + end + end + end + endgenerate + + integer i, j, k; + + always @(posedge clk) begin + if (start) begin #1 + #1 + for(i = 0; i < numlines; i++) begin + for(j = 0; j < numways; j++) begin + for(k = 0; k < numwords; k++) begin + if (CacheValid[j][i][k] && CacheDirty[j][i][k]) begin + ShadowRAM[CacheAdr[j][i][k] >> $clog2(`XLEN/8)] = CacheData[j][i][k]; + end + end + end + end + end + end + + + flop #(1) doneReg(.clk(clk), + .d(start), + .q(done)); + +endmodule + +module copyShadow + #(parameter tagstart, logblockbytelen) + (input logic clk, + input logic start, + input logic [`PA_BITS-1:tagstart] tag, + input logic valid, dirty, + input logic [`XLEN-1:0] data, + input logic [32-1:0] index, + input logic [32-1:0] cacheWord, + output logic [`XLEN-1:0] CacheData, + output logic [`PA_BITS-1:0] CacheAdr, + output logic [`XLEN-1:0] CacheTag, + output logic CacheValid, + output logic CacheDirty); + + + always_ff @(posedge clk) begin + if(start) begin + CacheTag = tag; + CacheValid = valid; + CacheDirty = dirty; + CacheData = data; + CacheAdr = (tag << tagstart) + (index << logblockbytelen) + (cacheWord << $clog2(`XLEN/8)); + end + end + +endmodule + diff --git a/wally-pipelined/testbench/tests.vh b/wally-pipelined/testbench/tests.vh new file mode 100644 index 000000000..86746150b --- /dev/null +++ b/wally-pipelined/testbench/tests.vh @@ -0,0 +1,744 @@ +/////////////////////////////////////////// +// tests.vh +// +// Written: David_Harris@hmc.edu 7 October 2021 +// Modified: +// +// Purpose: List of tests to apply +// +// A component of the Wally configurable RISC-V project. +// +// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/////////////////////////////////////////// + +`define IMPERASTEST "0" +`define RISCVARCHTEST "1" + +string tvpaths[] = '{ + "../../imperas-riscv-tests/work/", + "/home/harris/github/riscv-arch-test/work/" +}; + + string imperas32mmu[] = '{ + `IMPERASTEST, + "rv32mmu/WALLY-MMU-SV32", "3000" + //"rv32mmu/WALLY-PMA", "3000", + //"rv32mmu/WALLY-PMA", "3000" + }; + + string imperas64mmu[] = '{ + `IMPERASTEST, + "rv64mmu/WALLY-MMU-SV48", "3000", + "rv64mmu/WALLY-MMU-SV39", "3000" + //"rv64mmu/WALLY-PMA", "3000", + //"rv64mmu/WALLY-PMA", "3000" + }; + + +string imperas32f[] = '{ + `IMPERASTEST, + "rv32f/I-FADD-S-01", "2000", + "rv32f/I-FCLASS-S-01", "2000", + "rv32f/I-FCVT-S-W-01", "2000", + "rv32f/I-FCVT-S-WU-01", "2000", + "rv32f/I-FCVT-W-S-01", "2000", + "rv32f/I-FCVT-WU-S-01", "2000", + "rv32f/I-FDIV-S-01", "2000", + "rv32f/I-FEQ-S-01", "2000", + "rv32f/I-FLE-S-01", "2000", + "rv32f/I-FLT-S-01", "2000", + "rv32f/I-FMADD-S-01", "2000", + "rv32f/I-FMAX-S-01", "2000", + "rv32f/I-FMIN-S-01", "2000", + "rv32f/I-FMSUB-S-01", "2000", + "rv32f/I-FMUL-S-01", "2000", + "rv32f/I-FMV-W-X-01", "2000", + "rv32f/I-FMV-X-W-01", "2000", + "rv32f/I-FNMADD-S-01", "2000", + "rv32f/I-FNMSUB-S-01", "2000", + "rv32f/I-FSGNJ-S-01", "2000", + "rv32f/I-FSGNJN-S-01", "2000", + "rv32f/I-FSGNJX-S-01", "2000", + "rv32f/I-FSQRT-S-01", "2000", + "rv32f/I-FSW-01", "2000", + "rv32f/I-FLW-01", "2110", + "rv32f/I-FSUB-S-01", "2000" + }; + + string imperas64f[] = '{ + `IMPERASTEST, + "rv64f/I-FLW-01", "2110", + "rv64f/I-FMV-W-X-01", "2000", + "rv64f/I-FMV-X-W-01", "2000", + "rv64f/I-FSW-01", "2000", + "rv64f/I-FCLASS-S-01", "2000", + "rv64f/I-FADD-S-01", "2000", +// "rv64f/I-FCVT-S-L-01", "2000", +// "rv64f/I-FCVT-S-LU-01", "2000", +// "rv64f/I-FCVT-S-W-01", "2000", +// "rv64f/I-FCVT-S-WU-01", "2000", + "rv64f/I-FCVT-L-S-01", "2000", + "rv64f/I-FCVT-LU-S-01", "2000", + "rv64f/I-FCVT-W-S-01", "2000", + "rv64f/I-FCVT-WU-S-01", "2000", + "rv64f/I-FDIV-S-01", "2000", + "rv64f/I-FEQ-S-01", "2000", + "rv64f/I-FLE-S-01", "2000", + "rv64f/I-FLT-S-01", "2000", + "rv64f/I-FMADD-S-01", "2000", + "rv64f/I-FMAX-S-01", "2000", + "rv64f/I-FMIN-S-01", "2000", + "rv64f/I-FMSUB-S-01", "2000", + "rv64f/I-FMUL-S-01", "2000", + "rv64f/I-FNMADD-S-01", "2000", + "rv64f/I-FNMSUB-S-01", "2000", + "rv64f/I-FSGNJ-S-01", "2000", + "rv64f/I-FSGNJN-S-01", "2000", + "rv64f/I-FSGNJX-S-01", "2000", + "rv64f/I-FSQRT-S-01", "2000", + "rv64f/I-FSUB-S-01", "2000" + }; + + string imperas64d[] = '{ + `IMPERASTEST, + "rv64d/I-FSD-01", "2000", + "rv64d/I-FLD-01", "2420", + "rv64d/I-FMV-X-D-01", "2000", + "rv64d/I-FMV-D-X-01", "2000", + "rv64d/I-FDIV-D-01", "2000", + "rv64d/I-FNMADD-D-01", "2000", + "rv64d/I-FNMSUB-D-01", "2000", + "rv64d/I-FMSUB-D-01", "2000", + "rv64d/I-FMAX-D-01", "2000", + "rv64d/I-FMIN-D-01", "2000", + "rv64d/I-FLE-D-01", "2000", + "rv64d/I-FLT-D-01", "2000", + "rv64d/I-FEQ-D-01", "2000", + "rv64d/I-FADD-D-01", "2000", + "rv64d/I-FCLASS-D-01", "2000", + "rv64d/I-FMADD-D-01", "2000", + "rv64d/I-FMUL-D-01", "2000", + "rv64d/I-FSGNJ-D-01", "2000", + "rv64d/I-FSGNJN-D-01", "2000", + "rv64d/I-FSGNJX-D-01", "2000", + "rv64d/I-FSQRT-D-01", "2000", + "rv64d/I-FSUB-D-01", "2000", +// "rv64d/I-FCVT-D-L-01", "2000", +// "rv64d/I-FCVT-D-LU-01", "2000", + "rv64d/I-FCVT-D-S-01", "2000", +// "rv64d/I-FCVT-D-W-01", "2000", +// "rv64d/I-FCVT-D-WU-01", "2000", + "rv64d/I-FCVT-L-D-01", "2000", + "rv64d/I-FCVT-LU-D-01", "2000", + "rv64d/I-FCVT-S-D-01", "2000", + "rv64d/I-FCVT-W-D-01", "2000", + "rv64d/I-FCVT-WU-D-01", "2000" +}; + + string imperas64a[] = '{ + `IMPERASTEST, + "rv64a/WALLY-AMO", "2110", + "rv64a/WALLY-LRSC", "2110" + }; + + string imperas64m[] = '{ + `IMPERASTEST, + "rv64m/I-REMUW-01", "3000", + "rv64m/I-REMW-01", "3000", + "rv64m/I-DIVUW-01", "3000", + "rv64m/I-DIVW-01", "3000", + "rv64m/I-MUL-01", "3000", + "rv64m/I-MULH-01", "3000", + "rv64m/I-MULHSU-01", "3000", + "rv64m/I-MULHU-01", "3000", + "rv64m/I-MULW-01", "3000", + "rv64m/I-DIV-01", "3000", + "rv64m/I-DIVU-01", "3000", + "rv64m/I-REM-01", "3000", + "rv64m/I-REMU-01", "3000" + }; + + string imperas64c[] = '{ + `IMPERASTEST, + "rv64ic/I-C-ADD-01", "3000", + "rv64ic/I-C-ADDI-01", "3000", + "rv64ic/I-C-ADDIW-01", "3000", + "rv64ic/I-C-ADDW-01", "3000", + "rv64ic/I-C-AND-01", "3000", + "rv64ic/I-C-ANDI-01", "3000", + "rv64ic/I-C-BEQZ-01", "3000", + "rv64ic/I-C-BNEZ-01", "3000", + "rv64ic/I-C-EBREAK-01", "2000", + "rv64ic/I-C-J-01", "3000", + "rv64ic/I-C-JALR-01", "4000", + "rv64ic/I-C-JR-01", "4000", + "rv64ic/I-C-LD-01", "3420", + "rv64ic/I-C-LDSP-01", "3420", + "rv64ic/I-C-LI-01", "3000", + "rv64ic/I-C-LUI-01", "2000", + "rv64ic/I-C-LW-01", "3110", + "rv64ic/I-C-LWSP-01", "3110", + "rv64ic/I-C-MV-01", "3000", + "rv64ic/I-C-NOP-01", "2000", + "rv64ic/I-C-OR-01", "3000", + "rv64ic/I-C-SD-01", "3000", + "rv64ic/I-C-SDSP-01", "3000", + "rv64ic/I-C-SLLI-01", "3000", + "rv64ic/I-C-SRAI-01", "3000", + "rv64ic/I-C-SRLI-01", "3000", + "rv64ic/I-C-SUB-01", "3000", + "rv64ic/I-C-SUBW-01", "3000", + "rv64ic/I-C-SW-01", "3000", + "rv64ic/I-C-SWSP-01", "3000", + "rv64ic/I-C-XOR-01", "3000" + }; + + string imperas64iNOc[] = { + `IMPERASTEST, + "rv64i/I-MISALIGN_JMP-01","2000" + }; + + string imperas64i[] = '{ + `IMPERASTEST, + //"rv64i/WALLY-PIPELINE-100K", "f7ff0", + "rv64i/I-ADD-01", "3000", + "rv64i/I-ADDI-01", "3000", + "rv64i/I-ADDIW-01", "3000", + "rv64i/I-ADDW-01", "3000", + "rv64i/I-AND-01", "3000", + "rv64i/I-ANDI-01", "3000", + "rv64i/I-AUIPC-01", "3000", + "rv64i/I-BEQ-01", "4000", + "rv64i/I-BGE-01", "4000", + "rv64i/I-BGEU-01", "4000", + "rv64i/I-BLT-01", "4000", + "rv64i/I-BLTU-01", "4000", + "rv64i/I-BNE-01", "4000", + "rv64i/I-DELAY_SLOTS-01", "2000", + "rv64i/I-EBREAK-01", "2000", + "rv64i/I-ECALL-01", "2000", + "rv64i/I-ENDIANESS-01", "2010", + "rv64i/I-IO-01", "2050", + "rv64i/I-JAL-01", "3000", + "rv64i/I-JALR-01", "4000", + "rv64i/I-LB-01", "4020", + "rv64i/I-LBU-01", "4020", + "rv64i/I-LD-01", "4420", + "rv64i/I-LH-01", "4050", + "rv64i/I-LHU-01", "4050", + "rv64i/I-LUI-01", "2000", + "rv64i/I-LW-01", "4110", + "rv64i/I-LWU-01", "4110", + "rv64i/I-MISALIGN_LDST-01", "2010", + "rv64i/I-NOP-01", "2000", + "rv64i/I-OR-01", "3000", + "rv64i/I-ORI-01", "3000", + "rv64i/I-RF_size-01", "2000", + "rv64i/I-RF_width-01", "2000", + "rv64i/I-RF_x0-01", "2010", + "rv64i/I-SB-01", "4000", + "rv64i/I-SD-01", "4000", + "rv64i/I-SH-01", "4000", + "rv64i/I-SLL-01", "3000", + "rv64i/I-SLLI-01", "3000", + "rv64i/I-SLLIW-01", "3000", + "rv64i/I-SLLW-01", "3000", + "rv64i/I-SLT-01", "3000", + "rv64i/I-SLTI-01", "3000", + "rv64i/I-SLTIU-01", "3000", + "rv64i/I-SLTU-01", "3000", + "rv64i/I-SRA-01", "3000", + "rv64i/I-SRAI-01", "3000", + "rv64i/I-SRAIW-01", "3000", + "rv64i/I-SRAW-01", "3000", + "rv64i/I-SRL-01", "3000", + "rv64i/I-SRLI-01", "3000", + "rv64i/I-SRLIW-01", "3000", + "rv64i/I-SRLW-01", "3000", + "rv64i/I-SUB-01", "3000", + "rv64i/I-SUBW-01", "3000", + "rv64i/I-SW-01", "4000", + "rv64i/I-XOR-01", "3000", + "rv64i/I-XORI-01", "3000", + "rv64i/WALLY-ADD", "4000", + "rv64i/WALLY-SUB", "4000", + "rv64i/WALLY-ADDI", "3000", + "rv64i/WALLY-ANDI", "3000", + "rv64i/WALLY-ORI", "3000", + "rv64i/WALLY-XORI", "3000", + "rv64i/WALLY-SLTI", "3000", + "rv64i/WALLY-SLTIU", "3000", + "rv64i/WALLY-SLLI", "3000", + "rv64i/WALLY-SRLI", "3000", + "rv64i/WALLY-SRAI", "3000", + "rv64i/WALLY-JAL", "4000", + "rv64i/WALLY-JALR", "3000", + "rv64i/WALLY-STORE", "3000", + "rv64i/WALLY-ADDIW", "3000", + "rv64i/WALLY-SLLIW", "3000", + "rv64i/WALLY-SRLIW", "3000", + "rv64i/WALLY-SRAIW", "3000", + "rv64i/WALLY-ADDW", "4000", + "rv64i/WALLY-SUBW", "4000", + "rv64i/WALLY-SLLW", "3000", + "rv64i/WALLY-SRLW", "3000", + "rv64i/WALLY-SRAW", "3000", + "rv64i/WALLY-BEQ" ,"5000", + "rv64i/WALLY-BNE", "5000 ", + "rv64i/WALLY-BLTU", "5000 ", + "rv64i/WALLY-BLT", "5000", + "rv64i/WALLY-BGE", "5000 ", + "rv64i/WALLY-BGEU", "5000 ", + "rv64i/WALLY-CSRRW", "4000", + "rv64i/WALLY-CSRRS", "4000", + "rv64i/WALLY-CSRRC", "5000", + "rv64i/WALLY-CSRRWI", "4000", + "rv64i/WALLY-CSRRSI", "4000", + "rv64i/WALLY-CSRRCI", "4000" + }; + + string imperas32a[] = '{ + `IMPERASTEST, + "rv32a/WALLY-AMO", "2110", + "rv32a/WALLY-LRSC", "2110" + }; + + string imperas32m[] = '{ + `IMPERASTEST, + "rv32m/I-DIVU-01", "2000", + "rv32m/I-REMU-01", "2000", + "rv32m/I-DIV-01", "2000", + "rv32m/I-REM-01", "2000", + "rv32m/I-MUL-01", "2000", + "rv32m/I-MULH-01", "2000", + "rv32m/I-MULHSU-01", "2000", + "rv32m/I-MULHU-01", "2000" + }; + + string imperas32c[] = '{ + `IMPERASTEST, + "rv32ic/I-C-ADD-01", "2000", + "rv32ic/I-C-ADDI-01", "2000", + "rv32ic/I-C-AND-01", "2000", + "rv32ic/I-C-ANDI-01", "2000", + "rv32ic/I-C-BEQZ-01", "2000", + "rv32ic/I-C-BNEZ-01", "2000", + "rv32ic/I-C-EBREAK-01", "2000", + "rv32ic/I-C-J-01", "2000", + "rv32ic/I-C-JALR-01", "3000", + "rv32ic/I-C-JR-01", "3000", + "rv32ic/I-C-LI-01", "2000", + "rv32ic/I-C-LUI-01", "2000", + "rv32ic/I-C-LW-01", "2110", + "rv32ic/I-C-LWSP-01", "2110", + "rv32ic/I-C-MV-01", "2000", + "rv32ic/I-C-NOP-01", "2000", + "rv32ic/I-C-OR-01", "2000", + "rv32ic/I-C-SLLI-01", "2000", + "rv32ic/I-C-SRAI-01", "2000", + "rv32ic/I-C-SRLI-01", "2000", + "rv32ic/I-C-SUB-01", "2000", + "rv32ic/I-C-SW-01", "2000", + "rv32ic/I-C-SWSP-01", "2000", + "rv32ic/I-C-XOR-01", "2000" + }; + + string imperas32iNOc[] = { + `IMPERASTEST, + "rv32i/I-MISALIGN_JMP-01","2000" + }; + + string imperas32i[] = { + `IMPERASTEST, + //"rv32i/WALLY-PIPELINE-100K", "10a800", + "rv32i/I-ADD-01", "2000", + "rv32i/I-ADDI-01","2000", + "rv32i/I-AND-01","2000", + "rv32i/I-ANDI-01","2000", + "rv32i/I-AUIPC-01","2000", + "rv32i/I-BEQ-01","3000", + "rv32i/I-BGE-01","3000", + "rv32i/I-BGEU-01","3000", + "rv32i/I-BLT-01","3000", + "rv32i/I-BLTU-01","3000", + "rv32i/I-BNE-01","3000", + "rv32i/I-DELAY_SLOTS-01","2000", + "rv32i/I-EBREAK-01","2000", + "rv32i/I-ECALL-01","2000", + "rv32i/I-ENDIANESS-01","2010", + "rv32i/I-IO-01","2030rv", + "rv32i/I-JAL-01","3000", + "rv32i/I-JALR-01","3000", + "rv32i/I-LB-01","3020", + "rv32i/I-LBU-01","3020", + "rv32i/I-LH-01","3050", + "rv32i/I-LHU-01","3050", + "rv32i/I-LUI-01","2000", + "rv32i/I-LW-01","3110", + "rv32i/I-MISALIGN_LDST-01","2010", + "rv32i/I-NOP-01","2000", + "rv32i/I-OR-01","2000", + "rv32i/I-ORI-01","2000", + "rv32i/I-RF_size-01","2000", + "rv32i/I-RF_width-01","2000", + "rv32i/I-RF_x0-01","2010", + "rv32i/I-SB-01","3000", + "rv32i/I-SH-01","3000", + "rv32i/I-SLL-01","2000", + "rv32i/I-SLLI-01","2000", + "rv32i/I-SLT-01","2000", + "rv32i/I-SLTI-01","2000", + "rv32i/I-SLTIU-01","2000", + "rv32i/I-SLTU-01","2000", + "rv32i/I-SRA-01","2000", + "rv32i/I-SRAI-01","2000", + "rv32i/I-SRL-01","2000", + "rv32i/I-SRLI-01","2000", + "rv32i/I-SUB-01","2000", + "rv32i/I-SW-01","3000", + "rv32i/I-XOR-01","2000", + "rv32i/I-XORI-01","2000", + "rv32i/WALLY-ADD", "3000", + "rv32i/WALLY-SUB", "3000", + "rv32i/WALLY-ADDI", "2000", + "rv32i/WALLY-ANDI", "2000", + "rv32i/WALLY-ORI", "2000", + "rv32i/WALLY-XORI", "2000", + "rv32i/WALLY-SLTI", "2000", + "rv32i/WALLY-SLTIU", "2000", + "rv32i/WALLY-SLLI", "2000", + "rv32i/WALLY-SRLI", "2000", + "rv32i/WALLY-SRAI", "2000", + "rv32i/WALLY-LOAD", "11c00", + "rv32i/WALLY-SUB", "3000", + "rv32i/WALLY-STORE", "2000", + "rv32i/WALLY-JAL", "3000", + "rv32i/WALLY-JALR", "2000", + "rv32i/WALLY-BEQ" ,"4000", + "rv32i/WALLY-BNE", "4000 ", + "rv32i/WALLY-BLTU", "4000 ", + "rv32i/WALLY-BLT", "4000", + "rv32i/WALLY-BGE", "4000 ", + "rv32i/WALLY-BGEU", "4000 ", + "rv32i/WALLY-CSRRW", "3000", + "rv32i/WALLY-CSRRS", "3000", + "rv32i/WALLY-CSRRC", "4000", + "rv32i/WALLY-CSRRWI", "3000", + "rv32i/WALLY-CSRRSI", "3000", + "rv32i/WALLY-CSRRCI", "3000" + }; + + string testsBP64[] = '{ + `IMPERASTEST, + "rv64BP/simple", "10000", + "rv64BP/mmm", "1000000", + "rv64BP/linpack_bench", "1000000", + "rv64BP/sieve", "1000000", + "rv64BP/qsort", "1000000", + "rv64BP/dhrystone", "1000000" + }; + + string imperas64p[] = '{ + `IMPERASTEST, + "rv64p/WALLY-MSTATUS", "2000", + "rv64p/WALLY-MCAUSE", "3000", + "rv64p/WALLY-SCAUSE", "2000", + "rv64p/WALLY-MEPC", "5000", + "rv64p/WALLY-SEPC", "4000", + "rv64p/WALLY-MTVAL", "6000", + "rv64p/WALLY-STVAL", "4000", + "rv64p/WALLY-MTVEC", "2000", + "rv64p/WALLY-STVEC", "2000", + "rv64p/WALLY-MARCHID", "4000", + "rv64p/WALLY-MIMPID", "4000", + "rv64p/WALLY-MHARTID", "4000", + "rv64p/WALLY-MVENDORID", "4000", + "rv64p/WALLY-MIE", "3000", + "rv64p/WALLY-MEDELEG", "4000", + "rv64p/WALLY-IP", "2000", + "rv64p/WALLY-CSR-PERMISSIONS-M", "5000", + "rv64p/WALLY-CSR-PERMISSIONS-S", "3000" + }; + + string imperas32p[] = '{ + `IMPERASTEST, + "rv32p/WALLY-MSTATUS", "2000", + "rv32p/WALLY-MCAUSE", "3000", + "rv32p/WALLY-SCAUSE", "2000", + "rv32p/WALLY-MEPC", "5000", + "rv32p/WALLY-SEPC", "4000", + "rv32p/WALLY-MTVAL", "5000", + "rv32p/WALLY-STVAL", "4000", + "rv32p/WALLY-MARCHID", "4000", + "rv32p/WALLY-MIMPID", "4000", + "rv32p/WALLY-MHARTID", "4000", + "rv32p/WALLY-MVENDORID", "4000", + "rv32p/WALLY-MTVEC", "2000", + "rv32p/WALLY-STVEC", "2000", + "rv32p/WALLY-MIE", "3000", + "rv32p/WALLY-MEDELEG", "4000", + "rv32p/WALLY-IP", "3000", + "rv32p/WALLY-CSR-PERMISSIONS-M", "5000", + "rv32p/WALLY-CSR-PERMISSIONS-S", "3000" + }; + + string imperas64periph[] = '{ + `IMPERASTEST, + "rv64i-periph/WALLY-PERIPH", "2000" + }; + + string imperas32periph[] = '{ + `IMPERASTEST, + "rv32i-periph/WALLY-PLIC", "2080" + }; + + + string arch64priv[] = '{ + `RISCVARCHTEST, + "rv64i_m/privilege/ebreak", "2090", + "rv64i_m/privilege/ecall", "2090", + "rv64i_m/privilege/misalign-beq-01", "20a0", + "rv64i_m/privilege/misalign-bge-01", "20a0", + "rv64i_m/privilege/misalign-bgeu-01", "20a0", + "rv64i_m/privilege/misalign-blt-01", "20a0", + "rv64i_m/privilege/misalign-bltu-01", "20a0", + "rv64i_m/privilege/misalign-bne-01", "20a0", + "rv64i_m/privilege/misalign-jal-01", "20a0", + "rv64i_m/privilege/misalign-ld-01", "20a0", + "rv64i_m/privilege/misalign-lh-01", "20a0", + "rv64i_m/privilege/misalign-lhu-01", "20a0", + "rv64i_m/privilege/misalign-lw-01", "20a0", + "rv64i_m/privilege/misalign-lwu-01", "20a0", + "rv64i_m/privilege/misalign-sd-01", "20a0", + "rv64i_m/privilege/misalign-sh-01", "20a0", + "rv64i_m/privilege/misalign-sw-01", "20a0", + "rv64i_m/privilege/misalign1-jalr-01", "20a0", + "rv64i_m/privilege/misalign2-jalr-01", "20a0" + }; + + string arch64m[] = '{ + `RISCVARCHTEST, + "rv64i_m/M/div-01", "9010", + "rv64i_m/M/divu-01", "a010", + "rv64i_m/M/divuw-01", "a010", + "rv64i_m/M/divw-01", "9010", + "rv64i_m/M/mul-01", "9010", + "rv64i_m/M/mulh-01", "9010", + "rv64i_m/M/mulhsu-01", "9010", + "rv64i_m/M/mulhu-01", "a010", + "rv64i_m/M/mulw-01", "9010", + "rv64i_m/M/rem-01", "9010", + "rv64i_m/M/remu-01", "a010", + "rv64i_m/M/remuw-01", "a010", + "rv64i_m/M/remw-01", "9010" + }; + + string arch64c[] = '{ + `RISCVARCHTEST, + "rv64i_m/C/cadd-01", "8010", + "rv64i_m/C/caddi-01", "4010", + "rv64i_m/C/caddi16sp-01", "2010", + "rv64i_m/C/caddi4spn-01", "2010", + "rv64i_m/C/caddiw-01", "4010", + "rv64i_m/C/caddw-01", "8010", + "rv64i_m/C/cand-01", "8010", + "rv64i_m/C/candi-01", "4010", + "rv64i_m/C/cbeqz-01", "4010", + "rv64i_m/C/cbnez-01", "5010", + "rv64i_m/C/cebreak-01", "2070", + "rv64i_m/C/cj-01", "3010", + "rv64i_m/C/cjalr-01", "2010", + "rv64i_m/C/cjr-01", "2010", + "rv64i_m/C/cld-01", "2010", + "rv64i_m/C/cldsp-01", "2010", + "rv64i_m/C/cli-01", "2010", + "rv64i_m/C/clui-01", "2010", + "rv64i_m/C/clw-01", "2010", + "rv64i_m/C/clwsp-01", "2010", + "rv64i_m/C/cmv-01", "2010", + "rv64i_m/C/cnop-01", "2010", + "rv64i_m/C/cor-01", "8010", + "rv64i_m/C/csd-01", "3010", + "rv64i_m/C/csdsp-01", "3010", + "rv64i_m/C/cslli-01", "2010", + "rv64i_m/C/csrai-01", "2010", + "rv64i_m/C/csrli-01", "2010", + "rv64i_m/C/csub-01", "8010", + "rv64i_m/C/csubw-01", "8010", + "rv64i_m/C/csw-01", "3010", + "rv64i_m/C/cswsp-01", "3010", + "rv64i_m/C/cxor-01", "8010" + }; + + string arch64i[] = '{ + `RISCVARCHTEST, + "rv64i_m/I/add-01", "9010", + "rv64i_m/I/addi-01", "6010", + "rv64i_m/I/addiw-01", "6010", + "rv64i_m/I/addw-01", "9010", + "rv64i_m/I/and-01", "9010", + "rv64i_m/I/andi-01", "6010", + "rv64i_m/I/auipc-01", "2010", + "rv64i_m/I/beq-01", "47010", + "rv64i_m/I/bge-01", "47010", + "rv64i_m/I/bgeu-01", "56010", + "rv64i_m/I/blt-01", "4d010", + "rv64i_m/I/bltu-01", "57010", + "rv64i_m/I/bne-01", "43010", + "rv64i_m/I/fence-01", "2010", + "rv64i_m/I/jal-01", "122010", + "rv64i_m/I/jalr-01", "2010", + "rv64i_m/I/lb-align-01", "2010", + "rv64i_m/I/lbu-align-01", "2010", + "rv64i_m/I/ld-align-01", "2010", + "rv64i_m/I/lh-align-01", "2010", + "rv64i_m/I/lhu-align-01", "2010", + "rv64i_m/I/lui-01", "2010", + "rv64i_m/I/lw-align-01", "2010", + "rv64i_m/I/lwu-align-01", "2010", + "rv64i_m/I/or-01", "9010", + "rv64i_m/I/ori-01", "6010", + "rv64i_m/I/sb-align-01", "3010", + "rv64i_m/I/sd-align-01", "3010", + "rv64i_m/I/sh-align-01", "3010", + "rv64i_m/I/sll-01", "3010", + "rv64i_m/I/slli-01", "2010", + "rv64i_m/I/slliw-01", "2010", + "rv64i_m/I/sllw-01", "3010", + "rv64i_m/I/slt-01", "9010", + "rv64i_m/I/slti-01", "6010", + "rv64i_m/I/sltiu-01", "6010", + "rv64i_m/I/sltu-01", "a010", + "rv64i_m/I/sra-01", "3010", + "rv64i_m/I/srai-01", "2010", + "rv64i_m/I/sraiw-01", "2010", + "rv64i_m/I/sraw-01", "3010", + "rv64i_m/I/srl-01", "3010", + "rv64i_m/I/srli-01", "2010", + "rv64i_m/I/srliw-01", "2010", + "rv64i_m/I/srlw-01", "3010", + "rv64i_m/I/sub-01", "9010", + "rv64i_m/I/subw-01", "9010", + "rv64i_m/I/sw-align-01", "3010", + "rv64i_m/I/xor-01", "9010", + "rv64i_m/I/xori-01", "6010" + }; + + string arch32priv[] = '{ + `RISCVARCHTEST, + "rv32i_m/privilege/ebreak", "2070", + "rv32i_m/privilege/ecall", "2070", + "rv32i_m/privilege/misalign-beq-01", "2080", + "rv32i_m/privilege/misalign-bge-01", "2080", + "rv32i_m/privilege/misalign-bgeu-01", "2080", + "rv32i_m/privilege/misalign-blt-01", "2080", + "rv32i_m/privilege/misalign-bltu-01", "2080", + "rv32i_m/privilege/misalign-bne-01", "2080", + "rv32i_m/privilege/misalign-jal-01", "2080", + "rv32i_m/privilege/misalign-lh-01", "2080", + "rv32i_m/privilege/misalign-lhu-01", "2080", + "rv32i_m/privilege/misalign-lw-01", "2080", + "rv32i_m/privilege/misalign-sh-01", "2080", + "rv32i_m/privilege/misalign-sw-01", "2080", + "rv32i_m/privilege/misalign1-jalr-01", "2080", + "rv32i_m/privilege/misalign2-jalr-01", "2080" + }; + + string arch32m[] = '{ + `RISCVARCHTEST, + "rv32i_m/M/div-01", "5010", + "rv32i_m/M/divu-01", "5010", + "rv32i_m/M/mul-01", "5010", + "rv32i_m/M/mulh-01", "5010", + "rv32i_m/M/mulhsu-01", "5010", + "rv32i_m/M/mulhu-01", "5010", + "rv32i_m/M/rem-01", "5010", + "rv32i_m/M/remu-01", "5010" + }; + + string arch32c[] = '{ + `RISCVARCHTEST, + "rv32i_m/C/cadd-01", "4010", + "rv32i_m/C/caddi-01", "3010", + "rv32i_m/C/caddi16sp-01", "2010", + "rv32i_m/C/caddi4spn-01", "2010", + "rv32i_m/C/cand-01", "4010", + "rv32i_m/C/candi-01", "3010", + "rv32i_m/C/cbeqz-01", "3010", + "rv32i_m/C/cbnez-01", "3010", + "rv32i_m/C/cebreak-01", "2050", + "rv32i_m/C/cj-01", "3010", + "rv32i_m/C/cjal-01", "3010", + "rv32i_m/C/cjalr-01", "2010", + "rv32i_m/C/cjr-01", "2010", + "rv32i_m/C/cli-01", "2010", + "rv32i_m/C/clui-01", "2010", + "rv32i_m/C/clw-01", "2010", + "rv32i_m/C/clwsp-01", "2010", + "rv32i_m/C/cmv-01", "2010", + "rv32i_m/C/cnop-01", "2010", + "rv32i_m/C/cor-01", "4010", + "rv32i_m/C/cslli-01", "2010", + "rv32i_m/C/csrai-01", "2010", + "rv32i_m/C/csrli-01", "2010", + "rv32i_m/C/csub-01", "4010", + "rv32i_m/C/csw-01", "2010", + "rv32i_m/C/cswsp-01", "2010", + "rv32i_m/C/cxor-01", "4010" + }; + + string arch32i[] = '{ + `RISCVARCHTEST, + "rv32i_m/I/add-01", "5010", + "rv32i_m/I/addi-01", "4010", + "rv32i_m/I/and-01", "5010", + "rv32i_m/I/andi-01", "4010", + "rv32i_m/I/auipc-01", "2010", + "rv32i_m/I/beq-01", "39010", + "rv32i_m/I/bge-01", "3a010", + "rv32i_m/I/bgeu-01", "4a010", + "rv32i_m/I/blt-01", "38010", + "rv32i_m/I/bltu-01", "4b010", + "rv32i_m/I/bne-01", "39010", + "rv32i_m/I/fence-01", "2010", + "rv32i_m/I/jal-01", "1ad010", + "rv32i_m/I/jalr-01", "2010", + "rv32i_m/I/lb-align-01", "2010", + "rv32i_m/I/lbu-align-01", "2010", + "rv32i_m/I/lh-align-01", "2010", + "rv32i_m/I/lhu-align-01", "2010", + "rv32i_m/I/lui-01", "2010", + "rv32i_m/I/lw-align-01", "2010", + "rv32i_m/I/or-01", "5010", + "rv32i_m/I/ori-01", "4010", + "rv32i_m/I/sb-align-01", "2010", + "rv32i_m/I/sh-align-01", "2010", + "rv32i_m/I/sll-01", "2010", + "rv32i_m/I/slli-01", "2010", + "rv32i_m/I/slt-01", "5010", + "rv32i_m/I/slti-01", "4010", + "rv32i_m/I/sltiu-01", "4010", + "rv32i_m/I/sltu-01", "5010", + "rv32i_m/I/sra-01", "2010", + "rv32i_m/I/srai-01", "2010", + "rv32i_m/I/srl-01", "2010", + "rv32i_m/I/srli-01", "2010", + "rv32i_m/I/sub-01", "5010", + "rv32i_m/I/sw-align-01", "2010", + "rv32i_m/I/xor-01", "5010", + "rv32i_m/I/xori-01", "4010" + }; + +