2015-06-06 08:01:37 -04:00
2019-02-19 04:43:36 -05:00
RISCV_GNU_TOOLCHAIN_GIT_REVISION = 411d134
2016-12-09 05:47:05 -05:00
RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX = /opt/riscv32
2016-04-09 06:29:19 -04:00
2020-04-27 11:23:45 -04:00
# Give the user some easy overrides for local configuration quirks.
# If you change one of these and it breaks, then you get to keep both pieces.
2016-08-16 19:06:10 -04:00
SHELL = bash
2020-04-27 11:23:45 -04:00
PYTHON = python3
VERILATOR = verilator
ICARUS_SUFFIX =
IVERILOG = iverilog$( ICARUS_SUFFIX)
VVP = vvp$( ICARUS_SUFFIX)
2015-06-26 16:02:22 -04:00
TEST_OBJS = $( addsuffix .o,$( basename $( wildcard tests/*.S) ) )
2019-09-12 04:48:14 -04:00
FIRMWARE_OBJS = firmware/start.o firmware/irq.o firmware/print.o firmware/hello.o firmware/sieve.o firmware/multest.o firmware/stats.o
2015-07-04 10:31:26 -04:00
GCC_WARNS = -Werror -Wall -Wextra -Wshadow -Wundef -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings
2015-07-04 05:47:19 -04:00
GCC_WARNS += -Wredundant-decls -Wstrict-prototypes -Wmissing-prototypes -pedantic # -Wconversion
2016-12-09 05:47:05 -05:00
TOOLCHAIN_PREFIX = $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) i/bin/riscv32-unknown-elf-
2016-04-09 08:35:17 -04:00
COMPRESSED_ISA = C
2015-06-06 08:01:37 -04:00
2017-03-15 11:35:02 -04:00
# Add things like "export http_proxy=... https_proxy=..." here
2017-04-07 05:43:05 -04:00
GIT_ENV = true
2017-03-15 11:35:02 -04:00
2016-05-04 02:57:16 -04:00
test : testbench .vvp firmware /firmware .hex
2020-04-27 11:23:45 -04:00
$( VVP) -N $<
2015-06-06 08:01:37 -04:00
2017-03-12 05:59:22 -04:00
test_vcd : testbench .vvp firmware /firmware .hex
2020-04-27 11:23:45 -04:00
$( VVP) -N $< +vcd +trace +noerror
2015-07-02 04:45:35 -04:00
2017-09-13 12:45:57 -04:00
test_rvf : testbench_rvf .vvp firmware /firmware .hex
2020-04-27 11:23:45 -04:00
$( VVP) -N $< +vcd +trace +noerror
2017-09-13 12:45:57 -04:00
2017-03-11 15:55:14 -05:00
test_wb : testbench_wb .vvp firmware /firmware .hex
2020-04-27 11:23:45 -04:00
$( VVP) -N $<
2017-03-11 15:55:14 -05:00
test_wb_vcd : testbench_wb .vvp firmware /firmware .hex
2020-04-27 11:23:45 -04:00
$( VVP) -N $< +vcd +trace +noerror
2017-03-11 15:55:14 -05:00
2017-07-27 15:36:38 -04:00
test_ez : testbench_ez .vvp
2020-04-27 11:23:45 -04:00
$( VVP) -N $<
2017-07-27 15:36:38 -04:00
test_ez_vcd : testbench_ez .vvp
2020-04-27 11:23:45 -04:00
$( VVP) -N $< +vcd
2017-07-27 15:36:38 -04:00
2016-05-04 02:57:16 -04:00
test_sp : testbench_sp .vvp firmware /firmware .hex
2020-04-27 11:23:45 -04:00
$( VVP) -N $<
2015-06-26 17:54:12 -04:00
2016-05-04 02:57:16 -04:00
test_axi : testbench .vvp firmware /firmware .hex
2020-04-27 11:23:45 -04:00
$( VVP) -N $< +axi_test
2015-06-06 13:22:28 -04:00
2016-05-04 02:57:16 -04:00
test_synth : testbench_synth .vvp firmware /firmware .hex
2020-04-27 11:23:45 -04:00
$( VVP) -N $<
2015-06-29 19:46:25 -04:00
2018-05-25 06:53:21 -04:00
test_verilator : testbench_verilator firmware /firmware .hex
./testbench_verilator
2016-05-04 02:57:16 -04:00
testbench.vvp : testbench .v picorv 32.v
2020-04-27 11:23:45 -04:00
$( IVERILOG) -o $@ $( subst C,-DCOMPRESSED_ISA,$( COMPRESSED_ISA) ) $^
2017-03-15 00:06:31 -04:00
chmod -x $@
2015-06-06 08:01:37 -04:00
2017-09-13 12:45:57 -04:00
testbench_rvf.vvp : testbench .v picorv 32.v rvfimon .v
2020-04-27 11:23:45 -04:00
$( IVERILOG) -o $@ -D RISCV_FORMAL $( subst C,-DCOMPRESSED_ISA,$( COMPRESSED_ISA) ) $^
2017-09-13 12:45:57 -04:00
chmod -x $@
2017-03-11 15:55:14 -05:00
testbench_wb.vvp : testbench_wb .v picorv 32.v
2020-04-27 11:23:45 -04:00
$( IVERILOG) -o $@ $( subst C,-DCOMPRESSED_ISA,$( COMPRESSED_ISA) ) $^
2017-03-11 15:55:14 -05:00
chmod -x $@
2017-07-27 15:36:38 -04:00
testbench_ez.vvp : testbench_ez .v picorv 32.v
2020-04-27 11:23:45 -04:00
$( IVERILOG) -o $@ $( subst C,-DCOMPRESSED_ISA,$( COMPRESSED_ISA) ) $^
2017-07-27 15:36:38 -04:00
chmod -x $@
2016-05-04 02:57:16 -04:00
testbench_sp.vvp : testbench .v picorv 32.v
2020-04-27 11:23:45 -04:00
$( IVERILOG) -o $@ $( subst C,-DCOMPRESSED_ISA,$( COMPRESSED_ISA) ) -DSP_TEST $^
2017-03-15 00:06:31 -04:00
chmod -x $@
2015-06-26 17:54:12 -04:00
2016-05-04 02:57:16 -04:00
testbench_synth.vvp : testbench .v synth .v
2020-04-27 11:23:45 -04:00
$( IVERILOG) -o $@ -DSYNTH_TEST $^
2017-03-15 00:06:31 -04:00
chmod -x $@
2015-06-29 19:46:25 -04:00
2019-03-19 09:33:50 -04:00
testbench_verilator : testbench .v picorv 32.v testbench .cc
2020-04-27 11:23:45 -04:00
$( VERILATOR) --cc --exe -Wno-lint -trace --top-module picorv32_wrapper testbench.v picorv32.v testbench.cc \
2018-05-25 07:04:49 -04:00
$( subst C,-DCOMPRESSED_ISA,$( COMPRESSED_ISA) ) --Mdir testbench_verilator_dir
$( MAKE) -C testbench_verilator_dir -f Vpicorv32_wrapper.mk
2018-05-25 15:04:30 -04:00
cp testbench_verilator_dir/Vpicorv32_wrapper testbench_verilator
2018-05-25 06:53:21 -04:00
2017-09-13 12:45:57 -04:00
check : check -yices
check-% : check .smt 2
yosys-smtbmc -s $( subst check-,,$@ ) -t 30 --dump-vcd check.vcd check.smt2
yosys-smtbmc -s $( subst check-,,$@ ) -t 25 --dump-vcd check.vcd -i check.smt2
check.smt2 : picorv 32.v
yosys -v2 -p 'read_verilog -formal picorv32.v' \
-p 'prep -top picorv32 -nordff' \
2021-12-27 04:52:12 -05:00
-p 'assertpmux -noinit; opt -fast; dffunmap' \
2017-09-13 12:45:57 -04:00
-p 'write_smt2 -wires check.smt2'
2015-06-29 19:46:25 -04:00
synth.v : picorv 32.v scripts /yosys /synth_sim .ys
yosys -qv3 -l synth.log scripts/yosys/synth_sim.ys
2015-06-06 08:01:37 -04:00
firmware/firmware.hex : firmware /firmware .bin firmware /makehex .py
2020-04-27 11:23:45 -04:00
$( PYTHON) firmware/makehex.py $< 32768 > $@
2015-06-06 08:01:37 -04:00
firmware/firmware.bin : firmware /firmware .elf
2015-07-04 05:47:19 -04:00
$( TOOLCHAIN_PREFIX) objcopy -O binary $< $@
2015-06-06 08:01:37 -04:00
chmod -x $@
2015-06-26 16:02:22 -04:00
firmware/firmware.elf : $( FIRMWARE_OBJS ) $( TEST_OBJS ) firmware /sections .lds
2020-06-03 03:48:04 -04:00
$( TOOLCHAIN_PREFIX) gcc -Os -mabi= ilp32 -march= rv32im$( subst C,c,$( COMPRESSED_ISA) ) -ffreestanding -nostdlib -o $@ \
-Wl,--build-id= none,-Bstatic,-T,firmware/sections.lds,-Map,firmware/firmware.map,--strip-debug \
2015-06-26 16:02:22 -04:00
$( FIRMWARE_OBJS) $( TEST_OBJS) -lgcc
2015-06-06 08:01:37 -04:00
chmod -x $@
2015-06-25 08:08:39 -04:00
firmware/start.o : firmware /start .S
2020-06-03 03:48:04 -04:00
$( TOOLCHAIN_PREFIX) gcc -c -mabi= ilp32 -march= rv32im$( subst C,c,$( COMPRESSED_ISA) ) -o $@ $<
2015-06-25 08:08:39 -04:00
2015-06-26 16:02:22 -04:00
firmware/%.o : firmware /%.c
2020-06-03 03:48:04 -04:00
$( TOOLCHAIN_PREFIX) gcc -c -mabi= ilp32 -march= rv32i$( subst C,c,$( COMPRESSED_ISA) ) -Os --std= c99 $( GCC_WARNS) -ffreestanding -nostdlib -o $@ $<
2015-06-26 16:02:22 -04:00
2015-06-06 08:01:37 -04:00
tests/%.o : tests /%.S tests /riscv_test .h tests /test_macros .h
2020-06-03 03:48:04 -04:00
$( TOOLCHAIN_PREFIX) gcc -c -mabi= ilp32 -march= rv32im -o $@ -DTEST_FUNC_NAME= $( notdir $( basename $<) ) \
2015-06-06 08:01:37 -04:00
-DTEST_FUNC_TXT= '"$(notdir $(basename $<))"' -DTEST_FUNC_RET= $( notdir $( basename $<) ) _ret $<
2016-04-09 06:29:19 -04:00
download-tools :
2017-03-15 11:35:02 -04:00
sudo bash -c ' set -ex; mkdir -p /var/cache/distfiles; $( GIT_ENV) ; \
2019-03-02 17:06:11 -05:00
$( foreach REPO,riscv-gnu-toolchain riscv-binutils-gdb riscv-gcc riscv-glibc riscv-newlib, \
2016-08-16 19:06:10 -04:00
if ! test -d /var/cache/distfiles/$( REPO) .git; then rm -rf /var/cache/distfiles/$( REPO) .git.part; \
git clone --bare https://github.com/riscv/$( REPO) /var/cache/distfiles/$( REPO) .git.part; \
mv /var/cache/distfiles/$( REPO) .git.part /var/cache/distfiles/$( REPO) .git; else \
( cd /var/cache/distfiles/$( REPO) .git; git fetch https://github.com/riscv/$( REPO) ) ; fi ; ) '
2016-04-09 06:29:19 -04:00
d e f i n e b u i l d _ t o o l s _ t e m p l a t e
build-$(1)-tools :
2016-12-09 05:47:05 -05:00
@read -p " This will remove all existing data from $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) $( subst riscv32,,$( 1) ) . Type YES to continue: " reply && [ [ " $$ $$ reply " = = [ Yy] [ Ee] [ Ss] || " $$ $$ reply " = = [ Yy] ] ]
2018-08-26 12:23:55 -04:00
sudo bash -c " set -ex; rm -rf $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) $( subst riscv32,,$( 1) ) ; mkdir -p $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) $( subst riscv32,,$( 1) ) ; chown $$ $$ {USER}: $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) $( subst riscv32,,$( 1) ) "
2016-12-09 05:47:05 -05:00
+$( MAKE) build-$( 1) -tools-bh
2016-04-11 06:46:29 -04:00
build-$(1)-tools-bh :
2017-03-15 11:35:02 -04:00
+set -ex; $( GIT_ENV) ; \
2016-08-16 19:06:10 -04:00
if [ -d /var/cache/distfiles/riscv-gnu-toolchain.git ] ; then reference_riscv_gnu_toolchain = "--reference /var/cache/distfiles/riscv-gnu-toolchain.git" ; else reference_riscv_gnu_toolchain = "" ; fi ; \
if [ -d /var/cache/distfiles/riscv-binutils-gdb.git ] ; then reference_riscv_binutils_gdb = "--reference /var/cache/distfiles/riscv-binutils-gdb.git" ; else reference_riscv_binutils_gdb = "" ; fi ; \
if [ -d /var/cache/distfiles/riscv-gcc.git ] ; then reference_riscv_gcc = "--reference /var/cache/distfiles/riscv-gcc.git" ; else reference_riscv_gcc = "" ; fi ; \
if [ -d /var/cache/distfiles/riscv-glibc.git ] ; then reference_riscv_glibc = "--reference /var/cache/distfiles/riscv-glibc.git" ; else reference_riscv_glibc = "" ; fi ; \
2016-12-08 08:09:09 -05:00
if [ -d /var/cache/distfiles/riscv-newlib.git ] ; then reference_riscv_newlib = "--reference /var/cache/distfiles/riscv-newlib.git" ; else reference_riscv_newlib = "" ; fi ; \
2016-08-16 19:06:10 -04:00
rm -rf riscv-gnu-toolchain-$( 1) ; git clone $$ $$ reference_riscv_gnu_toolchain https://github.com/riscv/riscv-gnu-toolchain riscv-gnu-toolchain-$( 1) ; \
2016-12-09 05:47:05 -05:00
cd riscv-gnu-toolchain-$( 1) ; git checkout $( RISCV_GNU_TOOLCHAIN_GIT_REVISION) ; \
2018-06-29 16:35:22 -04:00
git submodule update --init $$ $$ reference_riscv_binutils_gdb riscv-binutils; \
git submodule update --init $$ $$ reference_riscv_binutils_gdb riscv-gdb; \
2016-08-16 19:06:10 -04:00
git submodule update --init $$ $$ reference_riscv_gcc riscv-gcc; \
git submodule update --init $$ $$ reference_riscv_glibc riscv-glibc; \
2016-12-08 08:09:09 -05:00
git submodule update --init $$ $$ reference_riscv_newlib riscv-newlib; \
2016-12-09 05:47:05 -05:00
mkdir build; cd build; ../configure --with-arch= $( 2) --prefix= $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) $( subst riscv32,,$( 1) ) ; make
2016-04-09 06:29:19 -04:00
.PHONY : build -$( 1) -tools
e n d e f
2016-12-15 08:43:21 -05:00
$( eval $ ( call build_tools_template ,riscv 32i ,rv 32i ) )
$( eval $ ( call build_tools_template ,riscv 32ic ,rv 32ic ) )
$( eval $ ( call build_tools_template ,riscv 32im ,rv 32im ) )
$( eval $ ( call build_tools_template ,riscv 32imc ,rv 32imc ) )
2016-04-09 06:29:19 -04:00
2016-04-11 06:46:29 -04:00
build-tools :
2016-12-09 05:47:05 -05:00
@echo " This will remove all existing data from $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) i, $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) ic, $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) im, and $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) imc. "
2016-04-11 06:46:29 -04:00
@read -p "Type YES to continue: " reply && [ [ " $$ reply " = = [ Yy] [ Ee] [ Ss] || " $$ reply " = = [ Yy] ] ]
2018-08-26 12:23:55 -04:00
sudo bash -c " set -ex; rm -rf $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) {i,ic,im,imc}; mkdir -p $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) {i,ic,im,imc}; chown $$ {USER}: $( RISCV_GNU_TOOLCHAIN_INSTALL_PREFIX) {i,ic,im,imc} "
2016-12-09 05:47:05 -05:00
+$( MAKE) build-riscv32i-tools-bh
+$( MAKE) build-riscv32ic-tools-bh
+$( MAKE) build-riscv32im-tools-bh
+$( MAKE) build-riscv32imc-tools-bh
2016-04-11 06:46:29 -04:00
2015-06-30 06:25:05 -04:00
toc :
gawk '/^-+$$/ { y=tolower(x); gsub("[^a-z0-9]+", "-", y); gsub("-$$", "", y); printf("- [%s](#%s)\n", x, y); } { x=$$0; }' README.md
2015-06-06 08:01:37 -04:00
clean :
2016-04-09 06:51:50 -04:00
rm -rf riscv-gnu-toolchain-riscv32i riscv-gnu-toolchain-riscv32ic \
riscv-gnu-toolchain-riscv32im riscv-gnu-toolchain-riscv32imc
2015-10-14 17:26:04 -04:00
rm -vrf $( FIRMWARE_OBJS) $( TEST_OBJS) check.smt2 check.vcd synth.v synth.log \
2015-07-02 05:01:21 -04:00
firmware/firmware.elf firmware/firmware.bin firmware/firmware.hex firmware/firmware.map \
2017-07-27 15:36:38 -04:00
testbench.vvp testbench_sp.vvp testbench_synth.vvp testbench_ez.vvp \
2018-05-25 07:04:49 -04:00
testbench_rvf.vvp testbench_wb.vvp testbench.vcd testbench.trace \
testbench_verilator testbench_verilator_dir
2015-06-06 08:01:37 -04:00
2017-07-27 15:36:38 -04:00
.PHONY : test test_vcd test_sp test_axi test_wb test_wb_vcd test_ez test_ez_vcd test_synth download -tools build -tools toc clean