|  | # 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/ |