Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # This makefrag is sourced by each board's subdirectory
- JOBS = 16
- TEMPLATE_DIR ?= $(base_dir)/boom-template
- ROCKET_DIR ?= $(TEMPLATE_DIR)/rocket-chip
- TOP_MODULE ?= Top
- CFG_PROJECT ?= $(TOP_MODULE_PROJECT)
- SCALA_VERSION=2.12.4
- SCALA_VERSION_MAJOR=$(basename $(SCALA_VERSION))
- base_dir = $(abspath ..)
- common = $(base_dir)/common
- common_build = $(common)/build
- testchipip = $(base_dir)/testchipip
- output_delivery = deliver_output
- SHELL := /bin/bash
- bootrom_img = $(testchipip)/bootrom/bootrom.rv64.img $(testchipip)/bootrom/bootrom.rv32.img
- ifneq ($(BOARD_MODEL),)
- insert_board = s/\# REPLACE FOR OFFICIAL BOARD NAME/set_property "board_part" "$(BOARD_MODEL)"/g
- endif
- proj_name = $(BOARD)_rocketchip_$(CONFIG)
- verilog_srcs = \
- src/verilog/clocking.vh \
- src/verilog/rocketchip_wrapper.v \
- src/verilog/$(TOP_MODULE).$(CONFIG).v \
- src/verilog/AsyncResetReg.v \
- src/verilog/plusarg_reader.v \
- bootimage = fpga-images-$(BOARD)/boot.bin
- ifneq ($(BOARD),zc706_MIG)
- bootimage: $(bootimage)
- else
- default: bitstream
- endif
- $(addprefix src/verilog/,AsyncResetReg.v plusarg_reader.v): \
- src/verilog/%.v: \
- $(ROCKET_DIR)/src/main/resources/vsrc/%.v
- cp $< $@
- # 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 ++$(SCALA_VERSION)
- ROCKET_CLASSES ?= "$(ROCKET_DIR)/target/scala-$(SCALA_VERSION_MAJOR)/classes:$(ROCKET_DIR)/chisel3/target/scala-$(SCALA_VERSION_MAJOR)/*"
- FIRRTL_JAR ?= $(ROCKET_DIR)/firrtl/utils/bin/firrtl.jar
- FIRRTL ?= java -Xmx2G -Xss8M -XX:MaxPermSize=256M -cp $(ROCKET_CLASSES):$(FIRRTL_JAR) firrtl.Driver
- $(FIRRTL_JAR): $(shell find $(ROCKET_DIR)/firrtl/src/main/scala -iname "*.scala" 2> /dev/null)
- $(MAKE) -C $(ROCKET_DIR)/firrtl SBT="$(SBT)" root_dir=$(ROCKET_DIR)/firrtl build-scala
- .PRECIOUS: $(FIRRTL_JAR)
- # Initialize rocket-chip submodule
- # ------------------------------------------------------------------------------
- init-submodules:
- cd $(base_dir) && git submodule update --init boom-template testchipip
- cd $(TEMPLATE_DIR) && git submodule update --init
- cd $(ROCKET_DIR) && git submodule update --init
- # Specialize sources for board
- # ------------------------------------------------------------------------------
- ifneq ($(BOARD),zc706_MIG)
- src/verilog/rocketchip_wrapper.v: $(common)/rocketchip_wrapper.v
- cp $(common)/rocketchip_wrapper.v src/verilog/
- endif
- src/tcl/$(proj_name).tcl: $(common)/zynq_rocketchip.tcl Makefile
- sed 's/BOARD_NAME_HERE/$(BOARD)/g;s/PART_NUMBER_HERE/$(PART)/g;$(insert_board);s/CHISEL_CONFIG_HERE/$(CONFIG)/g' \
- $(common)/zynq_rocketchip.tcl > src/tcl/$(proj_name).tcl
- 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
- src/verilog/%.v: $(ROCKET_DIR)/vsrc/%.v
- cp $< $@
- $(ROCKET_DIR)/lib/firrtl.jar: $(FIRRTL_JAR)
- mkdir -p $(@D)
- cp $< $@
- FIRRTL_FILE=$(common_build)/$(TOP_MODULE).$(CONFIG).fir
- ANNO_FILE=$(common_build)/$(TOP_MODULE).$(CONFIG).anno
- VERILOG_FILE=$(common_build)/$(TOP_MODULE).$(CONFIG).v
- PACKAGES=boom-template/rocket-chip boom-template/boom testchipip
- SCALA_SOURCES=$(foreach pkg,$(PACKAGES),$(call lookup_scala_srcs,$(base_dir)/$(pkg)/src/main/scala)) $(call lookup_scala_srcs,$(base_dir)/src/main/scala)
- $(FIRRTL_FILE) $(ANNO_FILE): $(SCALA_SOURCES) $(FIRRTL_JAR)
- mkdir -p $(common_build)
- cd $(base_dir) && $(SBT) "runMain zynq.Generator $(common_build) \
- $(TOP_MODULE_PROJECT) $(TOP_MODULE) $(CFG_PROJECT) $(CONFIG)"
- .PRECIOUS: $(FIRRTL_FILE) $(ANNO_FILE)
- $(VERILOG_FILE): $(FIRRTL_FILE) $(ANNO_FILE) $(FIRRTL_JAR) $(bootrom_img)
- $(FIRRTL) -i $(FIRRTL_FILE) -o $(VERILOG_FILE) -X verilog -faf $(ANNO_FILE)
- src/verilog/$(TOP_MODULE).$(CONFIG).v: $(VERILOG_FILE)
- cp $< $@
- rocket: src/verilog/$(TOP_MODULE).$(CONFIG).v
- # Project generation
- # ------------------------------------------------------------------------------
- project = $(proj_name)/$(proj_name).xpr
- $(project): src/tcl/$(proj_name).tcl | $(verilog_srcs)
- rm -rf $(proj_name)
- vivado -mode tcl -source src/tcl/$(proj_name).tcl;
- project: $(project)
- vivado: $(project)
- vivado $(project) &
- 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
- rocketchip_wrapper.bit: $(bitstream)
- cp $< $@
- bitstream: rocketchip_wrapper.bit
- # Platform software generation
- # ------------------------------------------------------------------------------
- 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
- git submodule update --init $(arm_linux_dir)
- # 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
- git submodule update --init $(uboot_dir)
- # 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
- 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
- # Handle images and git submodule for prebuilt modules
- # ------------------------------------------------------------------------------
- ifneq ($(BOARD),zc706_MIG)
- images = fpga-images-$(BOARD)/boot.bif
- $(images):
- git submodule update --init --depth=1 fpga-images-$(BOARD)
- fetch-images: $(images)
- $(bootimage): $(images) $(bitstream)
- ln -sf ../../$(bitstream) fpga-images-$(BOARD)/boot_image/rocketchip_wrapper.bit
- cd fpga-images-$(BOARD); bootgen -image boot.bif -w -o boot.bin
- load-sd: $(images)
- $(base_dir)/common/load_card.sh $(SD)
- ramdisk-open: $(images)
- 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)"
- # Fetch ramdisk for user building from scratch
- # ------------------------------------------------------------------------------
- s3_url = https://s3-us-west-1.amazonaws.com/riscv.org/fpga-zynq-files
- ramdisk_url = $(s3_url)/uramdisk.image.gz
- 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
- endif
- # Build riscv-fesvr for zynq
- # ------------------------------------------------------------------------------
- fesvr-main = fesvr-zynq
- 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
- CXX_FPGA = arm-xilinx-linux-gnueabi-g++
- CXXFLAGS_FPGA = -O2 -std=c++11 -Wall -L$(common_build) -lfesvr \
- -Wl,-rpath,/usr/local/lib \
- -I $(common)/csrc -I $(testchipip)/csrc \
- -I $(ROCKET_DIR)/riscv-tools/riscv-fesvr/ \
- -Wl,-rpath,/usr/local/lib \
- $(fesvr-lib):
- mkdir -p $(common_build)
- cd $(common_build) && \
- $(ROCKET_DIR)/riscv-tools/riscv-fesvr/configure \
- --host=arm-xilinx-linux-gnueabi && \
- make libfesvr.so
- $(common_build)/$(fesvr-main): $(fesvr-lib) $(fesvr-srcs) $(fesvr-hdrs)
- $(CXX_FPGA) $(CXXFLAGS_FPGA) -o $(common_build)/$(fesvr-main) $(fesvr-srcs)
- fesvr-zynq: $(common_build)/$(fesvr-main)
- # Fetch pre-built risc-v linux binary and root fs from S3
- # ------------------------------------------------------------------------------
- riscv_root_bin = $(s3_url)/root.bin
- ifeq ($(BOARD), zybo)
- riscv_vmlinux = $(s3_url)/vmlinux_nofpu
- else
- riscv_vmlinux = $(s3_url)/vmlinux
- endif
- sd_riscv = fpga-images-$(BOARD)/riscv
- sd_riscv_scratch = $(output_delivery)/riscv
- fetch-riscv-linux:
- mkdir -p $(sd_riscv)
- curl $(riscv_root_bin) > $(sd_riscv)/root.bin
- curl $(riscv_vmlinux) > $(sd_riscv)/vmlinux
- fetch-riscv-linux-deliver:
- mkdir -p $(sd_riscv_scratch)
- curl $(riscv_root_bin) > $(sd_riscv_scratch)/root.bin
- curl $(riscv_vmlinux) > $(sd_riscv_scratch)/vmlinux
- clean:
- rm -f *.log *.jou *.str
- rm -rf csrc simv-* output ucli.key vc_hdrs.h DVEfiles
- .PHONY: vivado project init-submodules rocket fesvr-zynq fetch-images load-sd ramdisk-open ramdisk-close clean
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement