2014-09-19 08:44:45 +08:00
|
|
|
# This makefrag is sourced by each board's subdirectory
|
|
|
|
|
2014-09-22 09:22:42 +08:00
|
|
|
JOBS = 16
|
2016-08-09 05:39:11 +08:00
|
|
|
ROCKET_DIR ?= $(base_dir)/rocket-chip
|
2016-09-09 06:49:27 +08:00
|
|
|
TOP_MODULE_PROJECT ?= zynq
|
|
|
|
TOP_MODULE ?= Top
|
2016-09-30 03:44:10 +08:00
|
|
|
CFG_PROJECT ?= $(TOP_MODULE_PROJECT)
|
|
|
|
CONFIG ?= ZynqConfig
|
2017-06-09 00:54:23 +08:00
|
|
|
SCALA_VERSION=2.11.12
|
2016-10-11 07:42:09 +08:00
|
|
|
EXTRA_PACKAGES=testchipip
|
2016-08-09 05:39:11 +08:00
|
|
|
|
2014-09-11 08:53:33 +08:00
|
|
|
base_dir = $(abspath ..)
|
2014-09-25 08:12:28 +08:00
|
|
|
common = $(base_dir)/common
|
2016-08-09 05:39:11 +08:00
|
|
|
common_build = $(common)/build
|
2017-06-09 00:54:23 +08:00
|
|
|
testchipip = $(base_dir)/testchipip
|
2014-09-22 09:22:42 +08:00
|
|
|
output_delivery = deliver_output
|
2016-02-26 13:00:26 +08:00
|
|
|
SHELL := /bin/bash
|
2014-09-11 08:53:33 +08:00
|
|
|
|
2017-06-09 00:54:23 +08:00
|
|
|
bootrom_img = $(testchipip)/bootrom/bootrom.rv64.img $(testchipip)/bootrom/bootrom.rv32.img
|
2016-10-05 05:52:49 +08:00
|
|
|
rocketchip_stamp = $(common)/lib/rocketchip.stamp
|
2016-10-11 07:42:09 +08:00
|
|
|
extra_stamps = $(addprefix $(common)/lib/,$(addsuffix .stamp,$(EXTRA_PACKAGES)))
|
2016-10-05 05:52:49 +08:00
|
|
|
|
2014-09-14 03:22:39 +08:00
|
|
|
ifneq ($(BOARD_MODEL),)
|
2015-01-07 11:23:19 +08:00
|
|
|
insert_board = s/\# REPLACE FOR OFFICIAL BOARD NAME/set_property "board_part" "$(BOARD_MODEL)"/g
|
2014-09-14 03:22:39 +08:00
|
|
|
endif
|
2014-09-11 08:53:33 +08:00
|
|
|
|
2015-07-01 03:46:35 +08:00
|
|
|
proj_name = $(BOARD)_rocketchip_$(CONFIG)
|
2014-09-25 08:12:28 +08:00
|
|
|
|
2014-09-19 08:44:45 +08:00
|
|
|
verilog_srcs = \
|
|
|
|
src/verilog/clocking.vh \
|
|
|
|
src/verilog/rocketchip_wrapper.v \
|
2016-09-30 03:44:10 +08:00
|
|
|
src/verilog/$(TOP_MODULE).$(CONFIG).v \
|
2017-06-09 00:54:23 +08:00
|
|
|
src/verilog/AsyncResetReg.v \
|
|
|
|
src/verilog/plusarg_reader.v \
|
2014-09-11 08:53:33 +08:00
|
|
|
|
2016-09-30 03:44:10 +08:00
|
|
|
bootimage = fpga-images-$(BOARD)/boot.bin
|
|
|
|
bootimage: $(bootimage)
|
2014-09-20 01:37:50 +08:00
|
|
|
|
2016-08-11 04:54:11 +08:00
|
|
|
# Taken from rocket chip 2a5aeea. TODO: Maybe source this directly from makefrag?
|
|
|
|
SBT ?= java -Xmx2G -Xss8M -XX:MaxPermSize=256M -jar $(ROCKET_DIR)/sbt-launch.jar
|
2014-09-20 01:37:50 +08:00
|
|
|
|
2016-08-11 04:54:11 +08:00
|
|
|
FIRRTL_JAR ?= $(ROCKET_DIR)/firrtl/utils/bin/firrtl.jar
|
|
|
|
FIRRTL ?= java -Xmx2G -Xss8M -XX:MaxPermSize=256M -cp $(FIRRTL_JAR) firrtl.Driver
|
|
|
|
|
2016-08-13 07:39:18 +08:00
|
|
|
$(FIRRTL_JAR): $(shell find $(ROCKET_DIR)/firrtl/src/main/scala -iname "*.scala" 2> /dev/null)
|
2016-08-11 04:54:11 +08:00
|
|
|
$(MAKE) -C $(ROCKET_DIR)/firrtl SBT="$(SBT)" root_dir=$(ROCKET_DIR)/firrtl build-scala
|
|
|
|
|
2016-09-09 06:49:27 +08:00
|
|
|
CHISEL_ARGS := $(common_build)
|
2014-09-20 01:37:50 +08:00
|
|
|
|
2016-08-18 05:10:53 +08:00
|
|
|
lookup_scala_srcs = $(shell find $(1)/. -iname "*.scala" 2> /dev/null)
|
|
|
|
|
|
|
|
# Initialize rocket-chip submodule
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
2016-11-02 04:34:54 +08:00
|
|
|
init-submodules:
|
|
|
|
cd $(base_dir) && git submodule update --init rocket-chip $(EXTRA_PACKAGES)
|
2016-08-18 05:10:53 +08:00
|
|
|
cd $(ROCKET_DIR) && git submodule update --init
|
|
|
|
|
2014-09-19 08:44:45 +08:00
|
|
|
# Specialize sources for board
|
2014-09-25 08:12:28 +08:00
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
src/verilog/rocketchip_wrapper.v: $(common)/rocketchip_wrapper.v
|
|
|
|
cp $(common)/rocketchip_wrapper.v src/verilog/
|
2014-09-11 08:53:33 +08:00
|
|
|
|
2015-07-01 03:46:35 +08:00
|
|
|
src/tcl/$(proj_name).tcl: $(common)/zynq_rocketchip.tcl Makefile
|
2014-10-04 07:44:09 +08:00
|
|
|
sed 's/BOARD_NAME_HERE/$(BOARD)/g;s/PART_NUMBER_HERE/$(PART)/g;$(insert_board);s/CHISEL_CONFIG_HERE/$(CONFIG)/g' \
|
2015-07-01 03:46:35 +08:00
|
|
|
$(common)/zynq_rocketchip.tcl > src/tcl/$(proj_name).tcl
|
2014-09-11 14:37:47 +08:00
|
|
|
|
2015-07-01 03:46:35 +08:00
|
|
|
src/tcl/make_bitstream_$(CONFIG).tcl: $(common)/make_bitstream.tcl
|
|
|
|
sed 's/BOARD_NAME_HERE/$(BOARD)/g;s/CHISEL_CONFIG_HERE/$(CONFIG)/g' \
|
|
|
|
$(common)/make_bitstream.tcl > src/tcl/make_bitstream_$(CONFIG).tcl
|
2014-09-19 08:44:45 +08:00
|
|
|
|
2017-06-09 00:54:23 +08:00
|
|
|
src/verilog/%.v: $(ROCKET_DIR)/vsrc/%.v
|
|
|
|
cp $< $@
|
2017-03-10 09:47:58 +08:00
|
|
|
|
|
|
|
$(ROCKET_DIR)/lib/firrtl.jar: $(FIRRTL_JAR)
|
|
|
|
mkdir -p $(@D)
|
|
|
|
cp $< $@
|
|
|
|
|
|
|
|
$(rocketchip_stamp): $(call lookup_scala_srcs, $(ROCKET_DIR)) $(ROCKET_DIR)/lib/firrtl.jar
|
2016-10-05 05:52:49 +08:00
|
|
|
cd $(ROCKET_DIR) && $(SBT) pack
|
2016-08-11 04:54:11 +08:00
|
|
|
mkdir -p $(common)/lib
|
|
|
|
cp $(ROCKET_DIR)/target/pack/lib/* $(common)/lib
|
2016-10-05 05:52:49 +08:00
|
|
|
touch $(rocketchip_stamp)
|
|
|
|
|
2016-10-12 02:42:46 +08:00
|
|
|
$(common)/Makefrag.pkgs: $(common)/generate-pkg-mk.sh
|
|
|
|
bash $(common)/generate-pkg-mk.sh $(EXTRA_PACKAGES) > $@
|
|
|
|
|
2016-10-22 01:13:06 +08:00
|
|
|
-include $(common)/Makefrag.pkgs
|
2016-08-11 04:54:11 +08:00
|
|
|
|
2016-10-11 07:42:09 +08:00
|
|
|
$(common_build)/$(TOP_MODULE).$(CONFIG).fir: $(rocketchip_stamp) $(extra_stamps) $(bootrom_img) $(call lookup_scala_srcs,$(common))
|
2016-08-11 04:54:11 +08:00
|
|
|
mkdir -p $(@D)
|
2016-09-09 06:49:27 +08:00
|
|
|
cd $(common) && $(SBT) "run $(CHISEL_ARGS) $(TOP_MODULE_PROJECT) $(TOP_MODULE) $(CFG_PROJECT) $(CONFIG)"
|
2016-08-11 04:54:11 +08:00
|
|
|
|
2016-09-30 03:44:10 +08:00
|
|
|
$(common_build)/$(TOP_MODULE).$(CONFIG).v: $(common_build)/$(TOP_MODULE).$(CONFIG).fir $(FIRRTL_JAR)
|
2016-08-11 04:54:11 +08:00
|
|
|
$(FIRRTL) -i $< -o $@ -X verilog
|
2016-08-09 05:39:11 +08:00
|
|
|
|
2016-09-30 03:44:10 +08:00
|
|
|
src/verilog/$(TOP_MODULE).$(CONFIG).v: $(common_build)/$(TOP_MODULE).$(CONFIG).v
|
2016-08-18 07:45:30 +08:00
|
|
|
cp $< $@
|
2014-09-20 09:02:35 +08:00
|
|
|
|
2016-09-30 03:44:10 +08:00
|
|
|
rocket: src/verilog/$(TOP_MODULE).$(CONFIG).v
|
2014-09-19 08:44:45 +08:00
|
|
|
|
2014-09-20 01:37:50 +08:00
|
|
|
|
2014-09-19 08:44:45 +08:00
|
|
|
# Project generation
|
2014-09-25 08:12:28 +08:00
|
|
|
# ------------------------------------------------------------------------------
|
2015-07-01 03:46:35 +08:00
|
|
|
project = $(proj_name)/$(proj_name).xpr
|
2017-06-09 00:54:23 +08:00
|
|
|
$(project): src/tcl/$(proj_name).tcl | $(verilog_srcs)
|
|
|
|
rm -rf $(proj_name)
|
2015-07-01 03:46:35 +08:00
|
|
|
vivado -mode tcl -source src/tcl/$(proj_name).tcl;
|
2014-09-19 08:44:45 +08:00
|
|
|
|
2016-10-04 07:59:28 +08:00
|
|
|
project: $(project)
|
|
|
|
|
2014-09-25 08:12:28 +08:00
|
|
|
vivado: $(project)
|
|
|
|
vivado $(project) &
|
2014-09-19 08:44:45 +08:00
|
|
|
|
2015-07-01 03:46:35 +08:00
|
|
|
bitstream = $(proj_name)/$(proj_name).runs/impl_1/rocketchip_wrapper.bit
|
|
|
|
$(bitstream): src/tcl/make_bitstream_$(CONFIG).tcl $(verilog_srcs) src/constrs/base.xdc | $(project)
|
|
|
|
vivado -mode tcl -source src/tcl/make_bitstream_$(CONFIG).tcl
|
2014-09-25 08:12:28 +08:00
|
|
|
bitstream: $(bitstream)
|
2014-09-20 01:37:50 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
2014-09-25 08:12:28 +08:00
|
|
|
# Platform software generation
|
|
|
|
# ------------------------------------------------------------------------------
|
2014-09-22 09:22:42 +08:00
|
|
|
arm_linux_dir = $(base_dir)/common/linux-xlnx
|
|
|
|
uboot_dir = $(base_dir)/common/u-boot-xlnx
|
|
|
|
soft_build_dir = soft_build
|
|
|
|
|
|
|
|
arm-linux: arm-uboot # must first build uboot because we need tools
|
|
|
|
# compile kernel
|
2014-09-24 22:53:05 +08:00
|
|
|
git submodule update --init $(arm_linux_dir)
|
2014-09-22 09:22:42 +08:00
|
|
|
# no make clean included here since one copy of linux should work on all boards
|
|
|
|
cd $(arm_linux_dir) && make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- xilinx_zynq_defconfig
|
|
|
|
cd $(arm_linux_dir) && make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- -j$(JOBS)
|
|
|
|
# convert zImage to uImage
|
|
|
|
cd $(arm_linux_dir) && export PATH=$(uboot_dir)/tools:$$PATH && make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- UIMAGE_LOADADDR=0x8000 uImage
|
|
|
|
mkdir -p $(output_delivery)
|
|
|
|
cp $(arm_linux_dir)/arch/arm/boot/uImage $(output_delivery)/
|
|
|
|
|
|
|
|
arm-uboot:
|
|
|
|
# compile board-compatible u-boot
|
2014-09-24 22:53:05 +08:00
|
|
|
git submodule update --init $(uboot_dir)
|
2014-09-22 09:22:42 +08:00
|
|
|
# copy relevant configuration files
|
|
|
|
if [ -a soft_config/boards.cfg ] ; \
|
|
|
|
then \
|
|
|
|
cp soft_config/boards.cfg $(uboot_dir)/ ; \
|
|
|
|
fi;
|
|
|
|
cp soft_config/zynq_$(UBOOT_CONFIG).h $(uboot_dir)/include/configs/
|
|
|
|
# actually build
|
|
|
|
cd $(uboot_dir) && make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_$(UBOOT_CONFIG)_config
|
|
|
|
cd $(uboot_dir) && make CROSS_COMPILE=arm-xilinx-linux-gnueabi- -j$(JOBS)
|
|
|
|
mkdir -p $(soft_build_dir)
|
|
|
|
cp $(uboot_dir)/u-boot $(soft_build_dir)/u-boot.elf
|
2014-09-19 08:44:45 +08:00
|
|
|
|
2014-09-22 09:30:41 +08:00
|
|
|
arm-dtb:
|
|
|
|
export PATH=$(arm_linux_dir)/scripts/dtc:$$PATH && dtc -I dts -O dtb -o $(output_delivery)/devicetree.dtb soft_config/$(BOARD)_devicetree.dts
|
|
|
|
|
2014-09-25 08:12:28 +08:00
|
|
|
|
|
|
|
|
2014-09-20 05:54:09 +08:00
|
|
|
# Handle images and git submodule for prebuilt modules
|
2014-09-25 08:12:28 +08:00
|
|
|
# ------------------------------------------------------------------------------
|
2014-09-26 05:04:14 +08:00
|
|
|
images = fpga-images-$(BOARD)/boot.bif
|
|
|
|
$(images):
|
2014-09-19 08:44:45 +08:00
|
|
|
git submodule update --init --depth=1 fpga-images-$(BOARD)
|
|
|
|
|
2014-09-26 05:04:14 +08:00
|
|
|
fetch-images: $(images)
|
2014-09-19 08:44:45 +08:00
|
|
|
|
2016-09-30 03:44:10 +08:00
|
|
|
$(bootimage): $(images) $(bitstream)
|
2015-08-05 06:56:42 +08:00
|
|
|
ln -sf ../../$(bitstream) fpga-images-$(BOARD)/boot_image/rocketchip_wrapper.bit
|
2014-09-26 05:04:14 +08:00
|
|
|
cd fpga-images-$(BOARD); bootgen -image boot.bif -w -o boot.bin
|
2014-09-19 08:44:45 +08:00
|
|
|
|
2014-09-26 13:48:58 +08:00
|
|
|
load-sd: $(images)
|
2014-09-19 08:44:45 +08:00
|
|
|
$(base_dir)/common/load_card.sh $(SD)
|
2014-09-12 07:15:15 +08:00
|
|
|
|
2014-09-26 05:04:14 +08:00
|
|
|
ramdisk-open: $(images)
|
2014-09-20 05:54:09 +08:00
|
|
|
mkdir ramdisk
|
|
|
|
dd if=fpga-images-$(BOARD)/uramdisk.image.gz bs=64 skip=1 | \
|
|
|
|
gunzip -c | sudo sh -c 'cd ramdisk/ && cpio -i'
|
|
|
|
|
|
|
|
ramdisk-close:
|
|
|
|
@if [ ! -d "ramdisk" ]; then \
|
|
|
|
echo "No ramdisk to close (use make ramdisk-open first)"; \
|
|
|
|
exit 1; \
|
|
|
|
fi
|
|
|
|
sh -c 'cd ramdisk/ && sudo find . | sudo cpio -H newc -o' | gzip -9 > uramdisk.cpio.gz
|
|
|
|
mkimage -A arm -O linux -T ramdisk -d uramdisk.cpio.gz fpga-images-$(BOARD)/uramdisk.image.gz
|
|
|
|
rm uramdisk.cpio.gz
|
|
|
|
@echo "Don't forget to remove ramdisk before opening it again (sudo rm -rf ramdisk)"
|
2014-09-20 01:37:50 +08:00
|
|
|
|
2014-09-25 08:12:28 +08:00
|
|
|
|
2014-09-26 13:13:27 +08:00
|
|
|
# Fetch ramdisk for user building from scratch
|
|
|
|
# ------------------------------------------------------------------------------
|
2014-09-26 13:55:42 +08:00
|
|
|
s3_url = https://s3-us-west-1.amazonaws.com/riscv.org/fpga-zynq-files
|
|
|
|
ramdisk_url = $(s3_url)/uramdisk.image.gz
|
2014-09-26 13:13:27 +08:00
|
|
|
fetch-ramdisk:
|
|
|
|
mkdir -p $(output_delivery)
|
|
|
|
curl $(ramdisk_url) > $(output_delivery)/uramdisk.image.gz
|
|
|
|
|
|
|
|
|
|
|
|
# Rebuild from bif for user building from scratch
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
$(output_delivery)/boot.bin:
|
|
|
|
cd $(output_delivery); bootgen -image output.bif -w -o boot.bin
|
|
|
|
|
2016-08-09 05:39:11 +08:00
|
|
|
# Build riscv-fesvr for zynq
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
fesvr-main = fesvr-zynq
|
2017-06-09 00:54:23 +08:00
|
|
|
fesvr-srcs = \
|
|
|
|
$(common)/csrc/fesvr_zynq.cc \
|
|
|
|
$(common)/csrc/zynq_driver.cc \
|
|
|
|
$(testchipip)/csrc/blkdev.cc \
|
|
|
|
|
|
|
|
fesvr-hdrs = \
|
|
|
|
$(common)/csrc/zynq_driver.h \
|
|
|
|
$(testchipip)/csrc/blkdev.h \
|
|
|
|
|
|
|
|
fesvr-lib = $(common_build)/libfesvr.so
|
2016-08-09 05:39:11 +08:00
|
|
|
|
|
|
|
CXX_FPGA = arm-xilinx-linux-gnueabi-g++
|
|
|
|
CXXFLAGS_FPGA = -O2 -std=c++11 -Wall -L$(common_build) -lfesvr \
|
2017-06-09 00:54:23 +08:00
|
|
|
-Wl,-rpath,/usr/local/lib \
|
2018-07-08 08:37:11 +08:00
|
|
|
-I $(common)/csrc -I $(testchipip)/csrc \
|
2017-06-09 00:54:23 +08:00
|
|
|
-I $(ROCKET_DIR)/riscv-tools/riscv-fesvr/ \
|
|
|
|
-Wl,-rpath,/usr/local/lib \
|
2016-08-09 05:39:11 +08:00
|
|
|
|
|
|
|
$(fesvr-lib):
|
|
|
|
mkdir -p $(common_build)
|
2017-06-09 00:54:23 +08:00
|
|
|
cd $(common_build) && \
|
|
|
|
$(ROCKET_DIR)/riscv-tools/riscv-fesvr/configure \
|
|
|
|
--host=arm-xilinx-linux-gnueabi && \
|
|
|
|
make libfesvr.so
|
2016-08-09 05:39:11 +08:00
|
|
|
|
2017-06-09 00:54:23 +08:00
|
|
|
$(common_build)/$(fesvr-main): $(fesvr-lib) $(fesvr-srcs) $(fesvr-hdrs)
|
2016-09-09 06:49:27 +08:00
|
|
|
$(CXX_FPGA) $(CXXFLAGS_FPGA) -o $(common_build)/$(fesvr-main) $(fesvr-srcs)
|
2016-08-09 05:39:11 +08:00
|
|
|
|
2017-06-09 00:54:23 +08:00
|
|
|
fesvr-zynq: $(common_build)/$(fesvr-main)
|
2014-09-26 08:39:49 +08:00
|
|
|
|
2014-09-12 07:15:15 +08:00
|
|
|
clean:
|
2014-09-25 08:12:28 +08:00
|
|
|
rm -f *.log *.jou *.str
|
2016-10-25 08:16:57 +08:00
|
|
|
rm -rf csrc simv-* output ucli.key vc_hdrs.h DVEfiles
|
2014-09-20 01:37:50 +08:00
|
|
|
|
2016-11-02 04:34:54 +08:00
|
|
|
.PHONY: vivado project init-submodules rocket fesvr-zynq fetch-images load-sd ramdisk-open ramdisk-close clean
|