PERCIVAL is an application-level posit capable RISC-V core based on CVA6 that can execute all posit instructions, including the quire fused operations.
You can find the Xposit RISC-V custom extension for posit arithmetic used together with this repository here: https://github.com/artecs-group/llvm-xposit
You can find the original CVA6 repo with additional documentation here: https://github.com/openhwgroup/cva6
Here you can also find Big-PERCIVAL, an updated version of PERCIVAL which adds posit64 operations and increased flexibility in the PAU. You can read about it in our pre-print: https://doi.org/10.48550/arXiv.2305.06946
For the original PERCIVAL code switch to the posit-master
branch. However, we recommend using the current default big-percival-main
branch, as this also supports 32-bit posits.
If you use PERCIVAL in your academic work you can cite us:
D. Mallasén, R. Murillo, A. A. D. Barrio, G. Botella, L. Piñuel, and M. Prieto-Matias, “PERCIVAL: Open-Source Posit RISC-V Core With Quire Capability,” IEEE Transactions on Emerging Topics in Computing, vol. 10, no. 3, pp. 1241–1252, 2022, doi: 10.1109/TETC.2022.3187199.
D. Mallasén, A. A. Del Barrio, and M. Prieto-Matias, “Big-PERCIVAL: Exploring the Native Use of 64-Bit Posit Arithmetic in Scientific Computing.” arXiv [cs.AR], 2023. Available: http://arxiv.org/abs/2305.06946
@article{mallasen2022PERCIVAL,
title = {PERCIVAL: Open-Source Posit RISC-V Core With Quire Capability},
author = {Mallasén, David and Murillo, Raul and Del Barrio, Alberto A. and Botella, Guillermo and Piñuel, Luis and Prieto-Matias, Manuel},
year = {2022},
journal = {IEEE Transactions on Emerging Topics in Computing},
volume = {10},
number = {3},
pages = {1241-1252},
issn = {2168-6750},
doi = {10.1109/TETC.2022.3187199}
}
@misc{mallasen2023BigPERCIVAL,
title = {Big-PERCIVAL: Exploring the Native Use of 64-Bit Posit Arithmetic in Scientific Computing},
author = {Mallasén, David and Del Barrio, Alberto A. and Prieto-Matias, Manuel},
year = {2023},
month = may,
eprint = {2305.06946},
primaryclass = {cs.AR},
archiveprefix = {arXiv}
}
The top-level module of the PAU can be found in core/pau_top.sv
. The individual arithmetic modules are in core/pau/
. You can configure the PAU changing the parameters in core/include/ariane_pkg.sv
.
The following instructions will get you a copy of the project up and running on your local machine and run the posit testsuite using the QuestaSim simulator. If you run into problems, look at the troubleshooting section.
These instructions assume you have the LLVM Xposit compiler and the QuestaSim simulator installed in your system. Also, on a fresh Ubuntu 22.04 installation you will need to install the following packages:
sudo apt install -y git curl gcc g++ make autoconf device-tree-compiler screen
Make sure you have the $RISCV
environment variable pointing to the directory where you installed the RISC-V gcc toolchain. E.g. export RISCV="/opt/riscv
. Consider adding this permanently in your .bashrc
file.
To set up the repository, run:
git clone https://github.com/artecs-group/PERCIVAL.git
cd PERCIVAL
git submodule update --init --recursive
mkdir tmp
./ci/install-riscvpk.sh
To compile the posit64 testsuite, you must use the next command:
clang --target=riscv64 -march=rv64gcxposit posit64_testsuite_llvm.c -c -o posit64_testsuite_llvm.o
riscv64-unknown-elf-gcc posit64_testsuite_llvm.o -o posit64_testsuite_llvm.elf
(Optional) Once the .elf
executable has been generated, you can create visualize the generated assembly code with:
riscv64-unknown-elf-objdump -DC posit64_testsuite_llvm.elf > posit64_testsuite_llvm.dump
To run the simulation, execute:
make sim elf-bin=$RISCV/riscv64-unknown-elf/bin/pk target-options=posit64_testsuite_llvm.elf batch-mode=1
You should see the following output at the end of the simulation:
PADD test OK
PSUB test OK
PMUL test OK
PDIV test OK
PSQRT test OK
PMIN test OK
PMAX test OK
QUIRE test OK
PCVTWS test OK
PCVTWUS test OK
PCVTLS test OK
PCVTLUS test OK
PCVTSW test OK
PCVTSWU test OK
PCVTSL test OK
PCVTSLU test OK
PSGNJ test OK
PSGNJN test OK
PSGNJNX test OK
PMVXW test OK
PMVWX test OK
PEQ test OK
PLT test OK
PLE test OK
Note: If you want to use the QuestaSim GUI, remove the batch-mode=1
option from the make sim
command.
PERCIVAL is designed to be used with the Genesys II board.
To generate the FPGA bitstream of PERCIVAL run make fpga
.
This will produce a bitstream file and memory configuration file in corev_apu/fpga/work-fpga/
.
xc7k325t
).xc7k325t
.s25fl256sxxxxxx0
.ariane_xilinx.mcs
generated in corev_apu/fpga/work-fpga/
.Insert the SD card to the PC.
Clone the cva6-sdk repository and follow the Quickstart.
git clone https://github.com/openhwgroup/cva6-sdk.git
git checkout 176923f60efb9348dfa907412873dadbfd59319c
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev libusb-1.0-0-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev device-tree-compiler pkg-config libexpat-dev
git submodule update --init --recursive
Add the file PERCIVAL/posit_testsuite_llvm.elf
to the cva6-sdk/rootfs/
folder. All executables added here, will be built into the generated Linux image.
If you have created a previous Linux image, you must delete the cva6-sdk/install64
folder, using:
rm -rf install64
Create the Linux image (this can take a few minutes):
make images
Get the ID of the SD device with lsblk
or fdisk -l
. E.g. /dev/sdc.
Flash the SD with the next command:
sudo -E make flash-sdcard SDDEVICE=/dev/sdc
Remove the SD card from the PC.
Insert the flashed SD to the Genesys II FPGA.
Connect the FPGA to the PC using the UART port and turn the FPGA on.
You may have to configure the permissions to the device (normally uses ttyUSB0).
Configure a terminal connection with the FPGA specifying the baudrate to 115200. For example:
screen /dev/ttyUSB0 115200
You can create a log file with the content of the session using -L "nameFile"
the option.
screen -L "nameFile" /dev/ttyUSB0 115200
Now PERCIVAL is running and you should see the the booting process.
Once it finishes booting you should see the following:
Starting rpcbind: OK
[ 33.124523] random: crng init done
[ 33.124523] random: crng init done
Starting sshd: OK
NFS preparation skipped, OK
#
Now, you can use the console to communicate with PERCIVAL. Try to rerun the posit_testsuite_llvm
. The output should be the same than in the simulation.
# ls
README.md opt
bin posit64_testsuite_llvm.elf
cachetest.elf proc
dev root
etc run
init sbin
lib sys
lib64 tetris
linuxrc tmp
media usr
mnt var
#
# ./posit64_testsuite_llvm.elf
.
.
.
Congratulations! If you have arrived here, you have done everything well. Now, you can enjoy playing Tetris on the FPGA.
./tetris
When you are finished, close the session using ctrl-a
k
y
. You can also use detach using ctrl-a
d
and reattach with screen -r PID
(screen -ls
shows the active screens).
libfesvr.so
If QuestaSim does not find the libfesvr.so
, you can generate it by running the ./ci/install-fesvr.sh
script.
If it still doesn't generate the library, add the line fesvr_install_shared_lib = yes
to the ./tmp/riscv-isa-sim/fesvr/fesvr.mk.in
file and follow the ./ci/install-fesvr.sh
script instructions manually in a console. Add make libfesvr.so
and cp libfesvr.so $RISCV/lib
.
Fatal: Unexpected signal: 11
If QuestaSim fails with the following error: Fatal: Unexpected signal: 11
, try running with:
make sim elf-bin=posit64_testsuite_llvm.elf QUESTASIM_FLAGS="-novopt -suppress 12110" batch-mode=1
This fix follows the instructions here. It should be fixed with newer versions of QuestaSim (2022.4 or later).
svdpi.h
fileWhile simulating, QuestaSIM can return the next error:
*corev_apu/tb/dpi/elfloader.cc:4:10: fatal error: svdpi.h: No such file or directory*
To fix this, you must add QuestaSIM's installation path to the QUESTASIM_HOME
variable.
libstdc++.so
If the libstdc++.so.6
library shipped with questasim doesn't work, you must rename it so the system library is used instead.
This work was supported in part by the 2020 Leonardo Grant for Researchers and Cultural Creators, from BBVA Foundation under Grant PR2003_20/01, in part by the Spanish MINECO, the EU(FEDER), and Comunidad de Madrid under Grants RTI2018-093684-B-I00 and S2018/TCS-4423, and in part by grants PID2021-123041OB-I00 and PID2021-126576NB-I00 funded by MCIN/AEI/ 10.13039/501100011033 and by “ERDF A way of making Europe”.