blob: b6a3b29303845db3872859481cbbf2049e64657e [file] [log] [blame]
# Copyright 2019 Clifford Wolf
# Copyright 2019 Robert Balas
# Copyright 2020 ETH Zurich and University of Bologna.
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# Author: Robert Balas (balasr@iis.ee.ethz.ch)
# Description: All in one. Uses parts of picorv32's makefile.
MAKE = make
CTAGS = ctags
# vsim configuration
VVERSION = "10.7b"
VLIB = vlib-$(VVERSION)
VWORK = work
VLOG = vlog-$(VVERSION)
VLOG_FLAGS = -pedanticerrors -suppress 2577 -suppress 2583
VLOG_LOG = vloggy
VOPT = vopt-$(VVERSION)
VOPT_FLAGS = -debugdb -fsmdebug -pedanticerrors #=mnprft
VSIM = vsim-$(VVERSION)
VSIM_HOME = /usr/pack/modelsim-$(VVERSION)-kgf/questasim
VSIM_FLAGS = # user defined
ALL_VSIM_FLAGS = $(VSIM_FLAGS) -sv_lib remote_bitbang/librbs_vsim
VSIM_DEBUG_FLAGS = -debugdb
VSIM_GUI_FLAGS = -gui -debugdb
VSIM_SCRIPT_BATCH = vsim_batch.tcl
VSIM_SCRIPT_GUI = vsim_gui.tcl
VCS = vcs-2017.03-kgf vcs
VCS_HOME = /usr/pack/vcs-2017.03-kgf
VCS_FLAGS =
SIMV_FLAGS =
# verilator configuration
VERILATOR = verilator
VERI_FLAGS =
VERI_COMPILE_FLAGS =
VERI_TRACE =
VERI_DIR = cobj_dir
VERI_CFLAGS = -O2
# RTL source files
RTLSRC_TB_PKG :=
RTLSRC_TB_TOP := tb_top.sv
RTLSRC_TB := boot_rom.sv \
dp_ram.sv \
mm_ram.sv \
SimJTAG.sv \
../sva/dm_top_sva.sv \
../sva/dm_csrs_sva.sv \
../sva/dm_sba_sva.sv \
tb_test_env.sv \
tb_top.sv
RTLSRC_VERI_TB := boot_rom.sv \
dp_ram.sv \
mm_ram.sv \
SimJTAG.sv \
tb_top_verilator.sv
RTLSRC_INCDIR := riscv/rtl/include
RTLSRC_FPNEW_PKG := fpnew/src/fpnew_pkg.sv
RTLSRC_RISCV_PKG += $(addprefix riscv/rtl/include/,\
cv32e40p_apu_core_pkg.sv cv32e40p_pkg.sv \
../../bhv/include/cv32e40p_tracer_pkg.sv)
RTLSRC_DM_PKG += ../src/dm_pkg.sv
RTLSRC_PKG = $(RTLSRC_FPNEW_PKG) dm_tb_pkg.sv $(RTLSRC_RISCV_PKG) $(RTLSRC_DM_PKG)
RTLSRC_RISCV := $(addprefix riscv/rtl/,\
../bhv/cv32e40p_sim_clock_gate.sv \
../bhv/cv32e40p_tracer.sv \
cv32e40p_if_stage.sv \
cv32e40p_cs_registers.sv \
cv32e40p_register_file_ff.sv \
cv32e40p_load_store_unit.sv \
cv32e40p_id_stage.sv \
cv32e40p_aligner.sv \
cv32e40p_decoder.sv \
cv32e40p_compressed_decoder.sv \
cv32e40p_fifo.sv \
cv32e40p_prefetch_buffer.sv \
cv32e40p_hwloop_regs.sv \
cv32e40p_mult.sv \
cv32e40p_int_controller.sv \
cv32e40p_ex_stage.sv \
cv32e40p_alu_div.sv \
cv32e40p_alu.sv \
cv32e40p_ff_one.sv \
cv32e40p_popcnt.sv \
cv32e40p_apu_disp.sv \
cv32e40p_controller.sv \
cv32e40p_obi_interface.sv \
cv32e40p_prefetch_controller.sv \
cv32e40p_sleep_unit.sv \
cv32e40p_core.sv)
RTLSRC_COMMON := $(addprefix common_cells/src/,\
cdc_2phase.sv fifo_v2.sv fifo_v3.sv\
rstgen.sv rstgen_bypass.sv)
RTLSRC_TECH := $(addprefix tech_cells_generic/src/,\
cluster_clock_inverter.sv pulp_clock_mux2.sv\
cluster_clock_gating.sv)
RTLSRC_DEBUG := ../debug_rom/debug_rom.sv
RTLSRC_DEBUG += $(addprefix ../src/,\
dm_csrs.sv dmi_cdc.sv dmi_jtag.sv \
dmi_jtag_tap.sv dm_mem.sv \
dm_sba.sv dm_top.sv dm_obi_top.sv)
RTLSRC += $(RTLSRC_RISCV) $(RTLSRC_COMMON) $(RTLSRC_TECH) $(RTLSRC_DEBUG)
# versions for this tb
CV32E40P_SHA = f9d63290eea738cb0a6fbf1e77bbd18555015a03
FPU_SHA = v0.6.1
COMMON_SHA = 337f54a7cdfdad78b124cbdd2a627db3e0939141
TECH_SHA = b35652608124b7ea813818b14a00ca76edd7599d
RAM_START_ADDR = 0x1c000000
# TODO: clean this up
RTLSRC_VLOG_TB_TOP := $(basename $(notdir $(RTLSRC_TB_TOP)))
RTLSRC_VOPT_TB_TOP := $(addsuffix _vopt, $(RTLSRC_VLOG_TB_TOP))
# riscv bare metal cross compiling
RISCV ?= $(HOME)/.riscv
RV_CC = $(RISCV)/bin/riscv32-unknown-elf-gcc
RV_CFLAGS = -march=rv32imc -Os -g
RV_LDFLAGS = -nostdlib -static -T prog/link.ld
RV_LDLIBS = -lc -lm -lgcc
RV_OBJCOPY = $(RISCV)/bin/riscv32-unknown-elf-objcopy
# assume verilator if no target chosen
.DEFAULT_GOAL := veri-run
all: veri-run
# vsim testbench compilation and optimization
vlib: .lib-rtl
.lib-rtl:
$(VLIB) $(VWORK)
touch .lib-rtl
# rebuild if we change some sourcefile
.build-rtl: .lib-rtl $(RTLSRC_PKG) $(RTLSRC) $(RTLSRC_TB_PKG) $(RTLSRC_TB)
$(VLOG) -work $(VWORK) +incdir+$(RTLSRC_INCDIR) $(VLOG_FLAGS) \
$(RTLSRC_PKG) $(RTLSRC) $(RTLSRC_TB_PKG) $(RTLSRC_TB)
touch .build-rtl
vsim-all: .opt-rtl
.opt-rtl: .build-rtl
$(VOPT) -work $(VWORK) $(VOPT_FLAGS) $(RTLSRC_VLOG_TB_TOP) -o \
$(RTLSRC_VOPT_TB_TOP)
touch .opt-rtl
# vcs testbench compilation
vcsify: $(RTLSRC_PKG) $(RTLSRC) $(RTLSRC_TB_PKG) $(RTLSRC_TB) remote_bitbang/librbs_vcs.so
$(VCS) +vc -sverilog -race=all -ignore unique_checks -full64 \
-timescale=1ns/1ps \
-CC "-I$(VCS_HOME)/include -O3 -march=native" $(VCS_FLAGS) \
$(RTLSRC_PKG) $(RTLSRC) $(RTLSRC_TB_PKG) $(RTLSRC_TB) \
+incdir+$(RTLSRC_INCDIR)
vcs-clean:
rm -rf simv* *.daidir *.vpd *.db csrc ucli.key vc_hdrs.h
# verilator testbench compilation
# We first test if the user wants to to vcd dumping. This hacky part is required
# because we need to conditionally compile the testbench (-DVCD_TRACE) and pass
# the --trace flags to the verilator call
ifeq ($(findstring +vcd,$(VERI_FLAGS)),+vcd)
VERI_TRACE="--trace"
VERI_CFLAGS+="-DVCD_TRACE"
endif
VPATH += ../
verilate: testbench_verilator
# We set the RUNPATH (not RPATH, allows LD_LIBRARY_PATH to overwrite) to
# remote_bitbang and manually link against librbs_veri since putting in
# librbs_veri.so as parameter doesn't work because it searches in the build
# directory
testbench_verilator: $(RTLSRC_VERI_TB) $(RTLSRC_PKG) $(RTLSRC) \
remote_bitbang/librbs_veri.so
$(VERILATOR) --cc --sv --exe $(VERI_TRACE) \
--Wno-lint --Wno-UNOPTFLAT --Wno-BLKANDNBLK \
--Wno-MODDUP +incdir+$(RTLSRC_INCDIR) --top-module \
tb_top_verilator --Mdir $(VERI_DIR) \
-CFLAGS "-std=gnu++11 $(VERI_CFLAGS)" $(VERI_COMPILE_FLAGS) \
$(RTLSRC_PKG) $(RTLSRC_VERI_TB) $(RTLSRC) \
-LDFLAGS "-L../remote_bitbang \
-Wl,--enable-new-dtags -Wl,-rpath,remote_bitbang -lrbs_veri" \
tb_top_verilator.cpp
cd $(VERI_DIR) && $(MAKE) -f Vtb_top_verilator.mk
cp $(VERI_DIR)/Vtb_top_verilator testbench_verilator
verilate-clean:
if [ -d $(VERI_DIR) ]; then rm -r $(VERI_DIR); fi
rm -rf testbench_verilator
# git dependencies
download_deps: fpnew/src/fpnew_pkg.sv $(RTLSRC_COMMON) $(RTLSRC_TECH) $(RTLSRC_RISCV)
fpnew/src/fpnew_pkg.sv:
git clone https://github.com/pulp-platform/fpnew.git --recurse -b v0.6.1
$(RTLSRC_COMMON):
git clone https://github.com/pulp-platform/common_cells.git
cd common_cells/ && git checkout $(COMMON_SHA)
$(RTLSRC_TECH):
git clone https://github.com/pulp-platform/tech_cells_generic.git
cd tech_cells_generic/ && git checkout $(TECH_SHA)
$(RTLSRC_RISCV_PKG) $(RTLSRC_RISCV):
git clone https://github.com/openhwgroup/cv32e40p.git riscv
cd riscv/ && git checkout $(CV32E40P_SHA)
# openocd server
remote_bitbang/librbs_veri.so: INCLUDE_DIRS =./ $(VSIM_HOME)/include
remote_bitbang/librbs_veri.so:
$(MAKE) -C remote_bitbang all
mv remote_bitbang/librbs.so $@
remote_bitbang/librbs_vsim.so: INCLUDE_DIRS =./ $(VSIM_HOME)/include
remote_bitbang/librbs_vsim.so:
$(MAKE) -C remote_bitbang all
mv remote_bitbang/librbs.so $@
remote_bitbang/librbs_vcs.so: INCLUDE_DIRS =./ $(VCS_HOME)/include
remote_bitbang/librbs_vcs.so:
$(MAKE) -C remote_bitbang all
mv remote_bitbang/librbs.so $@
rbs-clean:
$(MAKE) -C remote_bitbang clean
rm -rf remote_bitbang/librbs_vsim.so remote_bitbang/librbs_vcs.so
# run tb and exit
.PHONY: vsim-tb-run
vsim-tb-run: ALL_VSIM_FLAGS += -c
vsim-tb-run: vsim-all remote_bitbang/librbs_vsim.so
$(VSIM) -work $(VWORK) $(ALL_VSIM_FLAGS) \
$(RTLSRC_VOPT_TB_TOP) -do 'source $(VSIM_SCRIPT_BATCH); exit -f'
# run tb and drop into interactive shell
.PHONY: vsim-tb-run-sh
vsim-tb-run: ALL_VSIM_FLAGS += -c
vsim-tb-run-sh: vsim-all remote_bitbang/librbs_vsim.so
$(VSIM) -work $(VWORK) $(ALL_VSIM_FLAGS) \
$(RTLSRC_VOPT_TB_TOP) -do $(VSIM_SCRIPT_BATCH)
# run tb with simulator gui
.PHONY: vsim-tb-run-gui
vsim-tb-run-gui: ALL_VSIM_FLAGS += $(VSIM_GUI_FLAGS)
vsim-tb-run-gui: vsim-all remote_bitbang/librbs_vsim.so
$(VSIM) -work $(VWORK) $(ALL_VSIM_FLAGS) \
$(RTLSRC_VOPT_TB_TOP) -do $(VSIM_SCRIPT_GUI)
.PHONY: vsim-clean
vsim-clean:
if [ -d $(VWORK) ]; then rm -r $(VWORK); fi
rm -f transcript vsim.wlf vsim.dbg trace_core*.log \
.build-rtl .opt-rtl .lib-rtl *.vcd objdump
# compile and dump program
prog/test.elf: prog/test.c prog/crt0.S prog/syscalls.c prog/vectors.S
$(RV_CC) $(RV_CFLAGS) $(RV_CPPFLAGS) $(RV_LDFLAGS) $^ $(RV_LDLIBS) -o $@
prog/test.hex: prog/test.elf
$(RV_OBJCOPY) -O verilog --change-addresses -$(RAM_START_ADDR) $< $@
.PHONY: prog-clean
prog-clean:
rm -vrf $(addprefix prog/,test.elf test.hex)
# run program
.PHONY: veri-run
veri-run: verilate prog/test.hex
./testbench_verilator $(VERI_FLAGS) \
"+firmware=prog/test.hex"
.PHONY: vsim-run
vsim-run: vsim-all prog/test.hex
vsim-run: ALL_VSIM_FLAGS += "+firmware=prog/test.hex"
vsim-run: vsim-tb-run
.PHONY: vsim-run-gui
vsim-run-gui: vsim-all prog/test.hex
vsim-run-gui: ALL_VSIM_FLAGS += "+firmware=prog/test.hex"
vsim-run-gui: vsim-tb-run-gui
.PHONY: vcs-run
vcs-run: vcsify prog/test.hex
./simv -sv_lib remote_bitbang/librbs_vcs $(SIMV_FLAGS) "+firmware=prog/test.hex"
.PHONY: vcs-run-gui
vcs-run-gui: VCS_FLAGS+=-debug_all
vcs-run-gui: vcsify prog/test.hex
./simv -sv_lib remote_bitbang/librbs_vcs $(SIMV_FLAGS) -gui "+firmware=prog/test.hex"
# general targets
.PHONY: clean
clean: vsim-clean verilate-clean vcs-clean rbs-clean prog-clean
.PHONY: distclean
distclean: clean
rm -rf common_cells/ tech_cells_generic/ fpnew/ riscv/