263 lines
9.6 KiB
Makefile
263 lines
9.6 KiB
Makefile
SHELL := /bin/bash
|
|
.ONESHELL:
|
|
.SHELLFLAGS := -eu -o pipefail -c
|
|
|
|
ASIC_DIR := $(abspath .)
|
|
REPO_DIR := $(abspath ../../..)
|
|
TOOLS_DIR := $(ASIC_DIR)/tools
|
|
SOC_DIR := $(REPO_DIR)/soc
|
|
SOC_SW_DIR := $(SOC_DIR)/software
|
|
SOC_OUT_DIR := $(SOC_DIR)/out
|
|
HW_DIR := $(REPO_DIR)/hardware
|
|
UPSTREAM_RESOURCES_DIR := $(HW_DIR)/upstream/rocket-chip/src/main/resources
|
|
SOC_SCALA_DIR := $(HW_DIR)/soc/scala
|
|
HW_GENERATED_DIR := $(HW_DIR)/generated
|
|
ASIC_SIM_DIR := $(HW_DIR)/sim/asic/rocket
|
|
OUT_DIR := $(ASIC_DIR)/out
|
|
LOG_DIR := $(OUT_DIR)/logs
|
|
FILELIST_DIR := $(OUT_DIR)/filelists
|
|
FLASH_DIR := $(SOC_OUT_DIR)/flash
|
|
|
|
include $(REPO_DIR)/tools/project.mk
|
|
|
|
VLOG ?= vlog
|
|
VSIM ?= vsim
|
|
CXX ?= g++
|
|
|
|
TOP_CLASS ?= freechips.rocketchip.fpga.VCU118RocketSystem
|
|
ASIC_CONFIG ?= freechips.rocketchip.fpga.VCU118RocketJtagConfig
|
|
FIRRTL_DIR ?= $(HW_GENERATED_DIR)/asic-rocket-soc
|
|
VERILOG_DIR ?= $(HW_GENERATED_DIR)/asic-rocket-soc-verilog
|
|
SIM_VERILOG_DIR ?= $(HW_GENERATED_DIR)/asic-rocket-soc-sim-verilog
|
|
|
|
ASIC_TOP ?= $(OUT_DIR)/generated/asic_rocket_top.sv
|
|
SIM_ASIC_TOP ?= $(OUT_DIR)/generated/asic_rocket_top_sim.sv
|
|
app ?=
|
|
ifneq ($(strip $(app)),)
|
|
APP ?= $(app)
|
|
else
|
|
APP ?= hello_uart
|
|
endif
|
|
SIM_APP ?= $(APP)
|
|
APP_FLASH_OFFSET ?= 0x06000000
|
|
APP_BUILD_DIR ?= $(SOC_OUT_DIR)/software/$(SIM_APP)
|
|
APP_ELF ?= $(APP_BUILD_DIR)/$(SIM_APP).elf
|
|
APP_FLASH_BIN ?= $(FLASH_DIR)/$(SIM_APP).flash.bin
|
|
APP_FLASH_HEX ?= $(FLASH_DIR)/$(SIM_APP).flash.hex
|
|
BOOTLOADER_IMG ?= $(SOC_OUT_DIR)/software/bootloader/bootloader.img
|
|
GPS_DEBUG ?= 1
|
|
GPS_DEBUG_LEVEL ?= 4
|
|
BSP_UART_CLOCK_HZ ?= 100000000
|
|
BSP_UART_BAUDRATE ?= 115200
|
|
BSP_CLINT_TIMEBASE_HZ ?= 1000000
|
|
RTL_FILELIST := $(FILELIST_DIR)/asic_rtl.f
|
|
TB_FILELIST := $(FILELIST_DIR)/asic_tb.f
|
|
SIM_DPI := $(OUT_DIR)/dpi/libsimjtag.so
|
|
GPS_SYSTEM_DIR ?= $(HW_DIR)/external/gps/rtl
|
|
GPS_RTL_LIST ?= $(HW_DIR)/external/gps/rtl/filelist.f
|
|
GPS_INC_DIRS := $(GPS_SYSTEM_DIR)/trck_src/pulp_fifo
|
|
GPS_RTL := $(addprefix $(GPS_SYSTEM_DIR)/,$(shell sed '/^[[:space:]]*$$/d; /^[[:space:]]*#/d' "$(GPS_RTL_LIST)"))
|
|
ASIC_PLL_MODEL := $(ASIC_SIM_DIR)/tb/models/clock/asic_pll_model.sv
|
|
CHISEL_SRCS := $(shell find $(SOC_SCALA_DIR) -type f -name '*.scala' 2>/dev/null)
|
|
APP_SW_DIR := $(SOC_SW_DIR)/$(SIM_APP)
|
|
APP_SW_SRCS := $(wildcard $(APP_SW_DIR)/*)
|
|
SIM_APP_MAKE_ARGS :=
|
|
ifeq ($(SIM_APP),pmod_irq_test)
|
|
SIM_APP_MAKE_ARGS += PMOD_IRQ_TEST_QUIET=1 BSP_UART_CLOCK_HZ=$(BSP_UART_CLOCK_HZ) BSP_CLINT_TIMEBASE_HZ=$(BSP_CLINT_TIMEBASE_HZ)
|
|
endif
|
|
BOOTLOADER_SW_SRCS := $(wildcard $(SOC_SW_DIR)/bootloader/*)
|
|
MAKE_FLASH_IMAGE := $(SOC_SW_DIR)/tools/make_flash_image.py
|
|
OBJCOPY := $(CROSS)objcopy
|
|
READELF := $(CROSS)readelf
|
|
|
|
VLOG_FLAGS ?= +define+PRINTF_COND=0
|
|
SIM_VLOG_FLAGS ?= +define+PRINTF_COND=0 +define+RANDOMIZE_REG_INIT +define+RANDOMIZE_MEM_INIT +define+RANDOM=0 +define+INIT_RANDOM_PROLOG_
|
|
GUI_VOPTARGS ?= +acc
|
|
SIM_PLUSARGS ?=
|
|
|
|
.PHONY: help all software chisel rtl sim-rtl filelist vlog-soc vlog-tb dpi sim sim-gui sim-pmod-irq sim-pmod-irq-rtl sanity clean FORCE
|
|
|
|
help:
|
|
@printf '%s\n' \
|
|
'Targets:' \
|
|
' make software Build bootloader, hello app, and SPI flash hex' \
|
|
' make chisel Emit ASIC/JTAG Rocket FIRRTL' \
|
|
' make rtl Emit synthesis-style SystemVerilog and ASIC top' \
|
|
' make sim-rtl Emit simulation SystemVerilog and simulation ASIC top' \
|
|
' make filelist Generate RTL/TB filelists' \
|
|
' make vlog-soc Compile synthesis-style SoC RTL with Questa vlog' \
|
|
' make vlog-tb Compile simulation RTL, models, SimJTAG, and TB' \
|
|
' make sim Run UART/SPI flash sanity simulation' \
|
|
' make sim-pmod-irq Run PMOD IRQ square-wave/PLIC/ISR simulation' \
|
|
' make sim-pmod-irq-rtl Run fast PMOD IRQ square-wave/PLIC simulation' \
|
|
' make sim GUI=1 Open Questa/ModelSim GUI, load wave.do, run 0 ns' \
|
|
' make sim-gui Alias for make sim GUI=1' \
|
|
' make clean Remove generated ASIC outputs'
|
|
|
|
all: rtl vlog-tb
|
|
|
|
software: $(BOOTLOADER_IMG) $(APP_FLASH_HEX)
|
|
|
|
$(BOOTLOADER_IMG): FORCE $(BOOTLOADER_SW_SRCS)
|
|
$(MAKE) -C "$(SOC_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" APP="$(SIM_APP)" \
|
|
APP_FLASH_OFFSET="$(APP_FLASH_OFFSET)" \
|
|
BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" \
|
|
BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" \
|
|
BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" bootloader
|
|
|
|
$(APP_ELF): $(APP_SW_SRCS)
|
|
test -d "$(APP_SW_DIR)"
|
|
$(MAKE) -C "$(APP_SW_DIR)" TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(APP_BUILD_DIR)" \
|
|
GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" \
|
|
BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" \
|
|
BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" \
|
|
BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" \
|
|
$(SIM_APP_MAKE_ARGS) all
|
|
|
|
$(APP_FLASH_BIN): $(APP_ELF)
|
|
mkdir -p "$(FLASH_DIR)"
|
|
python3 "$(MAKE_FLASH_IMAGE)" \
|
|
--elf "$(APP_ELF)" \
|
|
--out "$(APP_FLASH_BIN)" \
|
|
--flash-offset "$(APP_FLASH_OFFSET)" \
|
|
--objcopy "$(OBJCOPY)" \
|
|
--readelf "$(READELF)"
|
|
|
|
$(APP_FLASH_HEX): $(APP_FLASH_BIN)
|
|
mkdir -p "$(FLASH_DIR)"
|
|
od -An -tx1 -v "$(APP_FLASH_BIN)" | tr -s ' ' '\n' | sed '/^$$/d' > "$(APP_FLASH_HEX)"
|
|
|
|
chisel: $(FIRRTL_DIR)/VCU118RocketSystem.fir
|
|
|
|
$(FIRRTL_DIR)/VCU118RocketSystem.fir: $(BOOTLOADER_IMG) $(CHISEL_SRCS)
|
|
cd "$(REPO_DIR)"
|
|
"$(MILL)" -i 'rocketchip[6.7.0].assembly'
|
|
rm -rf "$(FIRRTL_DIR)"
|
|
mkdir -p "$(FIRRTL_DIR)"
|
|
"$(JAVA_HOME)/bin/java" -jar "$(REPO_DIR)/out/rocketchip/6.7.0/assembly.dest/out.jar" \
|
|
--dir "$(FIRRTL_DIR)" \
|
|
--top "$(TOP_CLASS)" \
|
|
--config "$(ASIC_CONFIG)"
|
|
|
|
rtl: $(ASIC_TOP) $(RTL_FILELIST)
|
|
|
|
$(ASIC_TOP): $(FIRRTL_DIR)/VCU118RocketSystem.fir $(TOOLS_DIR)/gen_asic_wrapper.py
|
|
cd "$(REPO_DIR)"
|
|
rm -rf "$(VERILOG_DIR)"
|
|
mkdir -p "$(VERILOG_DIR)" "$(OUT_DIR)/generated"
|
|
$(FIRTOOL_ENV) "$(FIRTOOL)" \
|
|
"$(FIRRTL_DIR)/VCU118RocketSystem.fir" \
|
|
--split-verilog -o "$(VERILOG_DIR)" \
|
|
--preserve-aggregate=none \
|
|
--disable-annotation-unknown \
|
|
--disable-all-randomization \
|
|
--strip-debug-info
|
|
find "$(VERILOG_DIR)" -maxdepth 1 -type f \( -name '*.sv' -o -name '*.v' \) -printf '%p\n' | sort > "$(VERILOG_DIR)/filelist.abs.f"
|
|
perl -0pi -e 's/^([ \t]*)if \([^\n]*\)\n[ \t]*assert__[^\n]*:\s*assert\([^\n]*\);\n//mg; s/^[ \t]*assert__[^\n]*:\s*assert\([^\n]*\);\n//mg' "$(VERILOG_DIR)"/*.sv
|
|
python3 "$(TOOLS_DIR)/gen_asic_wrapper.py" \
|
|
--rocket-top "$(VERILOG_DIR)/VCU118RocketSystem.sv" \
|
|
--out "$@"
|
|
|
|
sim-rtl: $(SIM_ASIC_TOP) $(TB_FILELIST)
|
|
|
|
$(SIM_ASIC_TOP): $(FIRRTL_DIR)/VCU118RocketSystem.fir $(TOOLS_DIR)/gen_asic_wrapper.py
|
|
cd "$(REPO_DIR)"
|
|
rm -rf "$(SIM_VERILOG_DIR)"
|
|
mkdir -p "$(SIM_VERILOG_DIR)" "$(OUT_DIR)/generated"
|
|
$(FIRTOOL_ENV) "$(FIRTOOL)" \
|
|
"$(FIRRTL_DIR)/VCU118RocketSystem.fir" \
|
|
--split-verilog -o "$(SIM_VERILOG_DIR)" \
|
|
--preserve-aggregate=none \
|
|
--disable-annotation-unknown \
|
|
--strip-debug-info
|
|
find "$(SIM_VERILOG_DIR)" -maxdepth 1 -type f \( -name '*.sv' -o -name '*.v' \) -printf '%p\n' | sort > "$(SIM_VERILOG_DIR)/filelist.abs.f"
|
|
perl -0pi -e 's/^([ \t]*)if \([^\n]*\)\n[ \t]*assert__[^\n]*:\s*assert\([^\n]*\);\n//mg; s/^[ \t]*assert__[^\n]*:\s*assert\([^\n]*\);\n//mg' "$(SIM_VERILOG_DIR)"/*.sv
|
|
python3 "$(TOOLS_DIR)/gen_asic_wrapper.py" \
|
|
--rocket-top "$(SIM_VERILOG_DIR)/VCU118RocketSystem.sv" \
|
|
--out "$@"
|
|
|
|
filelist: $(RTL_FILELIST) $(TB_FILELIST)
|
|
|
|
$(RTL_FILELIST): $(ASIC_TOP)
|
|
mkdir -p "$(FILELIST_DIR)"
|
|
{
|
|
echo "$(UPSTREAM_RESOURCES_DIR)/vsrc/plusarg_reader.v"
|
|
echo "+incdir+$(GPS_INC_DIRS)"
|
|
printf '%s\n' $(GPS_RTL)
|
|
echo "$(ASIC_PLL_MODEL)"
|
|
cat "$(VERILOG_DIR)/filelist.abs.f"
|
|
echo "$(ASIC_TOP)"
|
|
} > "$@"
|
|
echo "Wrote $@"
|
|
|
|
$(TB_FILELIST): $(SIM_ASIC_TOP)
|
|
mkdir -p "$(FILELIST_DIR)"
|
|
{
|
|
echo "$(UPSTREAM_RESOURCES_DIR)/vsrc/SimJTAG.v"
|
|
echo "$(UPSTREAM_RESOURCES_DIR)/vsrc/plusarg_reader.v"
|
|
echo "+incdir+$(GPS_INC_DIRS)"
|
|
printf '%s\n' $(GPS_RTL)
|
|
cat "$(SIM_VERILOG_DIR)/filelist.abs.f"
|
|
echo "$(SIM_ASIC_TOP)"
|
|
find "$(ASIC_SIM_DIR)/tb/models" -type f \( -name '*.sv' -o -name '*.v' \) | sort
|
|
echo "$(ASIC_SIM_DIR)/tb/asic_rocket_tb.sv"
|
|
} > "$@"
|
|
{
|
|
echo "$(UPSTREAM_RESOURCES_DIR)/csrc/SimJTAG.cc"
|
|
echo "$(UPSTREAM_RESOURCES_DIR)/csrc/remote_bitbang.cc"
|
|
} > "$(FILELIST_DIR)/sim_dpi_sources.f"
|
|
echo "Wrote $@"
|
|
|
|
vlog-soc: $(RTL_FILELIST)
|
|
mkdir -p "$(LOG_DIR)"
|
|
[[ -d "$(ASIC_DIR)/work" ]] || vlib "$(ASIC_DIR)/work"
|
|
cd "$(ASIC_DIR)"
|
|
"$(VLOG)" $(VLOG_FLAGS) -sv -work work -f "$(RTL_FILELIST)" | tee "$(LOG_DIR)/vlog_soc.log"
|
|
|
|
vlog-tb: $(TB_FILELIST) $(APP_FLASH_HEX)
|
|
mkdir -p "$(LOG_DIR)"
|
|
[[ -d "$(ASIC_DIR)/work" ]] || vlib "$(ASIC_DIR)/work"
|
|
cd "$(ASIC_DIR)"
|
|
"$(VLOG)" $(SIM_VLOG_FLAGS) -sv -work work -f "$(TB_FILELIST)" | tee "$(LOG_DIR)/vlog_tb.log"
|
|
|
|
dpi: $(SIM_DPI)
|
|
|
|
$(SIM_DPI): $(UPSTREAM_RESOURCES_DIR)/csrc/SimJTAG.cc $(UPSTREAM_RESOURCES_DIR)/csrc/remote_bitbang.cc
|
|
mkdir -p "$(OUT_DIR)/dpi"
|
|
"$(CXX)" -fPIC -shared -std=c++17 \
|
|
-I/tools/altera/altera_pro26/questa_fse/include \
|
|
-I"$(UPSTREAM_RESOURCES_DIR)/csrc" \
|
|
"$(UPSTREAM_RESOURCES_DIR)/csrc/SimJTAG.cc" \
|
|
"$(UPSTREAM_RESOURCES_DIR)/csrc/remote_bitbang.cc" \
|
|
-o "$@"
|
|
|
|
sim sanity: vlog-tb $(SIM_DPI)
|
|
mkdir -p "$(LOG_DIR)"
|
|
cd "$(REPO_DIR)"
|
|
if [[ "$(GUI)" == "1" ]]; then
|
|
"$(VSIM)" -suppress 3009 -lib "$(ASIC_DIR)/work" -sv_lib "$(OUT_DIR)/dpi/libsimjtag" asic_rocket_tb \
|
|
-voptargs="$(GUI_VOPTARGS)" \
|
|
+flash_hex="$(APP_FLASH_HEX)" \
|
|
-do "onfinish stop; do $(ASIC_SIM_DIR)/wave.do; run 0ns"
|
|
else
|
|
"$(VSIM)" -c -suppress 3009 -lib "$(ASIC_DIR)/work" -sv_lib "$(OUT_DIR)/dpi/libsimjtag" asic_rocket_tb \
|
|
+flash_hex="$(APP_FLASH_HEX)" \
|
|
$(SIM_PLUSARGS) \
|
|
-do "run -all; quit -f" | tee "$(LOG_DIR)/vsim_sanity.log"
|
|
grep -q "ASIC sanity PASS" "$(LOG_DIR)/vsim_sanity.log"
|
|
fi
|
|
|
|
sim-gui:
|
|
$(MAKE) sim GUI=1
|
|
|
|
sim-pmod-irq:
|
|
$(MAKE) sim SIM_APP=pmod_irq_test
|
|
|
|
sim-pmod-irq-rtl:
|
|
$(MAKE) sim SIM_APP=pmod_irq_test SIM_PLUSARGS=+pmod_irq_rtl_only
|
|
|
|
clean:
|
|
rm -rf "$(OUT_DIR)" "$(FIRRTL_DIR)" "$(VERILOG_DIR)" "$(SIM_VERILOG_DIR)"
|
|
|
|
FORCE:
|