Skip to content
Snippets Groups Projects
makefile 5.79 KiB
#-----------------------------------------------------------------------------
# NanoSoC FPGA Flow Makefile 
# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
#
# Contributors
#
# David Mapstone (d.a.mapstone@soton.ac.uk)
#
# Copyright (C) 2021-3, SoC Labs (www.soclabs.org)
#-----------------------------------------------------------------------------

# Get properties for FPGA Boards
include $(SOCLABS_NANOSOC_TECH_DIR)/fpga/makefile.fpga_targets

# Vivado Options
VIVIADO_VERSION  ?= 2021_1

# NanoSoC Synthesis Properties
VENDOR   ?= soclabs.org
CORE_REV ?= 2

# System Design Filelist
ifeq ($(QUICKSTART),yes)
	DESIGN_VC            ?= $(SOCLABS_PROJECT_DIR)/flist/project/top_qs.flist
else
	DESIGN_VC            ?= $(SOCLABS_PROJECT_DIR)/flist/project/top.flist
endif

# Top-level of RTL design to Implement
COMPONENT_TOP  ?= nanosoc_chip

# Name of Implemented Chip Design (Including Socket IP)
DESIGN_NAME ?= nanosoc_design

# Location to build FPGA files
IMPLEMENTATION_DIR   ?= $(SOCLABS_PROJECT_DIR)/imp/fpga
RUN_DIR              := $(IMPLEMENTATION_DIR)/run
IMP_NANOSOC_DIR      := $(IMPLEMENTATION_DIR)/nanosoc
IMP_SOCKET_DIR       := $(IMPLEMENTATION_DIR)/socket
PROJECT_DIR          := $(IMPLEMENTATION_DIR)/targets/$(BOARD_NAME)

# Location of Defines File
DEFINES_DIR          := $(SOCLABS_PROJECT_DIR)/system/src/defines/
DEFINES_FILE         := $(DEFINES_DIR)/gen_defines.v

# Name of generated filelist by python script
TCL_FLIST_DIR        := $(IMP_NANOSOC_DIR)/flist
TCL_OUTPUT_FILELIST  := $(TCL_FLIST_DIR)/gen_flist.tcl

# NanoSoC Tech Flow Dependencies
NANOSOC_FPGA_FLOW_DIR := $(SOCLABS_NANOSOC_TECH_DIR)/fpga

# Directory to look for FPGA specific implementation files
TARGET_DIR            ?= $(NANOSOC_FPGA_FLOW_DIR)/targets/$(BOARD_NAME)
TARGET_TCL_DIR        := $(TARGET_DIR)/vivado_script/$(VIVIADO_VERSION)
PINMAP_FILE           ?= $(TARGET_DIR)/fpga_pinmap.xdc

# NanoSoC Tech Socket Design Dependencies
RTL_SOCKET_DIR        := $(SOCLABS_SOCDEBUG_TECH_DIR)/socket/vivado_packages

# Define Bitfile Output Directory depending on Platform
ifeq ($(PLATFORM), bare)
	OUTPUT_DIR ?=  $(IMPLEMENTATION_DIR)/output/$(BOARD_NAME)
else ifeq ($(PLATFORM), pynq)
	OUTPUT_DIR ?=  $(IMPLEMENTATION_DIR)/output/$(BOARD_NAME)/overlays
endif

# Is an accelerator subsystem present in the design?
ACCELERATOR ?= yes
ifeq ($(ACCELERATOR),yes)
	ACCELERATOR_SUBSYSTEM = ACCELERATOR_SUBSYSTEM
else
	ACCELERATOR_SUBSYSTEM = 0
endif

# Defines to pass to filelist compile
NANOSOC_DEFINES += $(ACCELERATOR_SUBSYSTEM)
NANOSOC_DEFINES += DMAC_0_PL230


# Compile Testcodes and Bootrom
code:
	@echo Compiling Firmware
	@$(MAKE) -C $(SOCLABS_NANOSOC_TECH_DIR) bootrom

defs_nanosoc:
	@mkdir -p $(DEFINES_DIR)
	@$(SOCLABS_SOCTOOLS_FLOW_DIR)/bin/defines_compile.py -d $(NANOSOC_DEFINES) -o $(DEFINES_FILE)

# Generate TCL filelist from flists
flist_nanosoc: defs_nanosoc
	@mkdir -p $(TCL_FLIST_DIR)
	@(cd $(TCL_FLIST_DIR); \
	$(SOCLABS_SOCTOOLS_FLOW_DIR)/bin/filelist_compile.py -t -f $(DESIGN_VC) -o $(TCL_OUTPUT_FILELIST) -r $(IMP_NANOSOC_DIR)/src -d $(NANOSOC_DEFINES);)

# Package NanoSoC Socket Components
package_socket:
	@$(MAKE) -C $(SOCLABS_SOCDEBUG_TECH_DIR)/fpga package_socket IMP_SOCKET_DIR=$(IMP_SOCKET_DIR) RTL_SOCKET_DIR=$(RTL_SOCKET_DIR)

# Environment Variables for Packaging NanoSoC
package_nanosoc: export FPGA_COMPONENT_FILELIST = $(TCL_OUTPUT_FILELIST)
package_nanosoc: export FPGA_COMPONENT_LIB      = $(IMP_NANOSOC_DIR)
package_nanosoc: export FPGA_ACCELERATOR        = $(ACCELERATOR_SUBSYSTEM)
package_nanosoc: export FPGA_COMPONENT_TOP      = $(COMPONENT_TOP)
package_nanosoc: export FPGA_VENDOR             = $(VENDOR)
package_nanosoc: export FPGA_CORE_REV           = $(CORE_REV)

# Package NanoSoC IP
package_nanosoc: code flist_nanosoc
	@echo Packaging NanoSoC
	@mkdir -p $(RUN_DIR)
	@cd $(RUN_DIR); vivado -mode batch -source $(SOCLABS_SOCTOOLS_FLOW_DIR)/resources/fpga/package_component.tcl
	@mkdir -p $(IMP_NANOSOC_DIR)/logs
	@cp $(RUN_DIR)/vivado.log $(IMP_NANOSOC_DIR)/logs
	@echo NanoSoC Packaged

# Environment Variables for Build NanoSoC Design
build_nanosoc_design: export FPGA_NAME               = $(BOARD_NAME)
build_nanosoc_design: export FPGA_PART               = $(XILINX_PART)
build_nanosoc_design: export FPGA_PROJECT_DIR        = $(PROJECT_DIR)
build_nanosoc_design: export FPGA_TARGET             = $(TARGET_DIR)
build_nanosoc_design: export FPGA_TARGET_TCL         = $(TARGET_TCL_DIR)
build_nanosoc_design: export FPGA_DESIGN_NAME        = $(DESIGN_NAME)
build_nanosoc_design: export FPGA_WRAPPER_NAME       = $(DESIGN_NAME)_wrapper
build_nanosoc_design: export FPGA_OUTPUT_DIR         = $(OUTPUT_DIR)
build_nanosoc_design: export FPGA_PINMAP             = $(PINMAP_FILE)
build_nanosoc_design: export FPGA_IMP_DIR            = $(IMPLEMENTATION_DIR)

# Synthesise and Implement an FPGA Bitfile
build_nanosoc_design:
	@echo Building NanoSoC Design
	@mkdir -p $(RUN_DIR)
	@cd $(RUN_DIR); vivado -mode batch -source $(SOCLABS_SOCTOOLS_FLOW_DIR)/resources/fpga/build_design.tcl
	@cp $(RUN_DIR)/vivado.log $(TARGET_DIR)
	@echo Built NanoSoC Design

# Move Output Files 
output_nanosoc_design:
	@echo Moving NanoSoC Design Files
	@unzip -u -o $(PROJECT_DIR)/$(DESIGN_NAME).xsa -d $(PROJECT_DIR)/export
	@mkdir -p $(OUTPUT_DIR)
	@cp -p $(PROJECT_DIR)/export/$(DESIGN_NAME).bit $(OUTPUT_DIR)
	@cp -p $(PROJECT_DIR)/export/$(DESIGN_NAME).hwh $(OUTPUT_DIR)
	
# Build NanoSoC Design Flow
build_fpga: clean_fpga package_socket package_nanosoc build_nanosoc_design output_nanosoc_design
	@echo NanoSOC Design Complete

# Clean FPGA Run
clean_fpga:
	@echo Cleaning Previous Runs of $(BOARD_NAME)
	@rm -rf $(PROJECT_DIR)
	@rm -rf $(RUN_DIR)

# Clean ALL FPGA Implementation Directory
clean_fpga_all:
	@echo Cleaning FPGA Implementation Directory
	@rm -rf $(IMPLEMENTATION_DIR)
	@echo Cleaning Firmware
	@$(MAKE) -C $(SOCLABS_NANOSOC_TECH_DIR) clean_all_code