-
Notifications
You must be signed in to change notification settings - Fork 16
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
example/Alveo: Add example design for Xilinx Alveo series
Signed-off-by: Alex Forencich <[email protected]>
- Loading branch information
1 parent
4cdc4be
commit b18b643
Showing
38 changed files
with
6,237 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
# Taxi Example Design for Alveo | ||
|
||
## Introduction | ||
|
||
This example design targets the Xilinx Alveo series. | ||
|
||
The design places looped-back MACs on the Ethernet ports as well as a looped-back UART on on the USB UART connections. | ||
|
||
* USB UART | ||
* Looped-back UART | ||
* DSFP/QSFP28 | ||
* Looped-back 10GBASE-R or 25GBASE-R MACs via GTY transceivers | ||
|
||
## Board details | ||
|
||
* FPGA | ||
* AU45N/SN1000: xcu26-vsva1365-2LV-e | ||
* AU50: xcu50-fsvh2104-2-e | ||
* AU55C: xcu55c-fsvh2892-2L-e | ||
* AU55N/C1100: xcu55n-fsvh2892-2L-e | ||
* AU200: xcu200-fsgd2104-2-e | ||
* AU250: xcu250-fsgd2104-2-e | ||
* AU280: xcu280-fsvh2892-2L-e | ||
* VCU1525: xcvu9p-fsgd2104-2L-e | ||
* X3/X3522: xcux35-vsva1365-3-e | ||
* 25GBASE-R PHY: Soft PCS with GTY transceivers | ||
|
||
## Licensing | ||
|
||
* Toolchain | ||
* Vivado Standard (enterprise license not required) | ||
* IP | ||
* No licensed vendor IP or 3rd party IP | ||
|
||
## How to build | ||
|
||
Run `make` in the appropriate `fpga*` subdirectory to build the bitstream. Ensure that the Xilinx Vivado toolchain components are in PATH. | ||
|
||
## How to test | ||
|
||
Run `make program` to program the board with Vivado. | ||
|
||
To test the looped-back UART, use any serial terminal software like minicom, screen, etc. The looped-back UART will echo typed text back without modification. | ||
|
||
To test the looped-back MAC, it is recommended to use a network tester like the Viavi T-BERD 5800 that supports basic layer 2 tests with a loopback. Do not connect the looped-back MAC to a network as the reflected packets may cause problems. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,153 @@ | ||
# SPDX-License-Identifier: MIT | ||
################################################################### | ||
# | ||
# Xilinx Vivado FPGA Makefile | ||
# | ||
# Copyright (c) 2016-2025 Alex Forencich | ||
# | ||
################################################################### | ||
# | ||
# Parameters: | ||
# FPGA_TOP - Top module name | ||
# FPGA_FAMILY - FPGA family (e.g. VirtexUltrascale) | ||
# FPGA_DEVICE - FPGA device (e.g. xcvu095-ffva2104-2-e) | ||
# SYN_FILES - list of source files | ||
# INC_FILES - list of include files | ||
# XDC_FILES - list of timing constraint files | ||
# XCI_FILES - list of IP XCI files | ||
# IP_TCL_FILES - list of IP TCL files (sourced during project creation) | ||
# CONFIG_TCL_FILES - list of config TCL files (sourced before each build) | ||
# | ||
# Note: both SYN_FILES and INC_FILES support file list files. File list | ||
# files are files with a .f extension that contain a list of additional | ||
# files to include, one path relative to the .f file location per line. | ||
# The .f files are processed recursively, and then the complete file list | ||
# is de-duplicated, with later files in the list taking precedence. | ||
# | ||
# Example: | ||
# | ||
# FPGA_TOP = fpga | ||
# FPGA_FAMILY = VirtexUltrascale | ||
# FPGA_DEVICE = xcvu095-ffva2104-2-e | ||
# SYN_FILES = rtl/fpga.v | ||
# XDC_FILES = fpga.xdc | ||
# XCI_FILES = ip/pcspma.xci | ||
# include ../common/vivado.mk | ||
# | ||
################################################################### | ||
|
||
# phony targets | ||
.PHONY: fpga vivado tmpclean clean distclean | ||
|
||
# prevent make from deleting intermediate files and reports | ||
.PRECIOUS: %.xpr %.bit %.bin %.ltx %.xsa %.mcs %.prm | ||
.SECONDARY: | ||
|
||
CONFIG ?= config.mk | ||
-include $(CONFIG) | ||
|
||
FPGA_TOP ?= fpga | ||
PROJECT ?= $(FPGA_TOP) | ||
XDC_FILES ?= $(PROJECT).xdc | ||
|
||
# handle file list files | ||
process_f_file = $(call process_f_files,$(addprefix $(dir $1),$(shell cat $1))) | ||
process_f_files = $(foreach f,$1,$(if $(filter %.f,$f),$(call process_f_file,$f),$f)) | ||
uniq_base = $(if $1,$(call uniq_base,$(foreach f,$1,$(if $(filter-out $(notdir $(lastword $1)),$(notdir $f)),$f,))) $(lastword $1)) | ||
SYN_FILES := $(call uniq_base,$(call process_f_files,$(SYN_FILES))) | ||
INC_FILES := $(call uniq_base,$(call process_f_files,$(INC_FILES))) | ||
|
||
################################################################### | ||
# Main Targets | ||
# | ||
# all: build everything (fpga) | ||
# fpga: build FPGA config | ||
# vivado: open project in Vivado | ||
# tmpclean: remove intermediate files | ||
# clean: remove output files and project files | ||
# distclean: remove archived output files | ||
################################################################### | ||
|
||
all: fpga | ||
|
||
fpga: $(PROJECT).bit | ||
|
||
vivado: $(PROJECT).xpr | ||
vivado $(PROJECT).xpr | ||
|
||
tmpclean:: | ||
-rm -rf *.log *.jou *.cache *.gen *.hbs *.hw *.ip_user_files *.runs *.xpr *.html *.xml *.sim *.srcs *.str .Xil defines.v | ||
-rm -rf create_project.tcl update_config.tcl run_synth.tcl run_impl.tcl generate_bit.tcl | ||
|
||
clean:: tmpclean | ||
-rm -rf *.bit *.bin *.ltx *.xsa program.tcl generate_mcs.tcl *.mcs *.prm flash.tcl | ||
-rm -rf *_utilization.rpt *_utilization_hierarchical.rpt | ||
|
||
distclean:: clean | ||
-rm -rf rev | ||
|
||
################################################################### | ||
# Target implementations | ||
################################################################### | ||
|
||
# Vivado project file | ||
|
||
# create fresh project if Makefile or IP files have changed | ||
create_project.tcl: Makefile $(XCI_FILES) $(IP_TCL_FILES) | ||
rm -rf defines.v | ||
touch defines.v | ||
for x in $(DEFS); do echo '`define' $$x >> defines.v; done | ||
echo "create_project -force -part $(FPGA_PART) $(PROJECT)" > $@ | ||
echo "add_files -fileset sources_1 defines.v $(SYN_FILES)" >> $@ | ||
echo "set_property top $(FPGA_TOP) [current_fileset]" >> $@ | ||
echo "add_files -fileset constrs_1 $(XDC_FILES)" >> $@ | ||
for x in $(XCI_FILES); do echo "import_ip $$x" >> $@; done | ||
for x in $(IP_TCL_FILES); do echo "source $$x" >> $@; done | ||
for x in $(CONFIG_TCL_FILES); do echo "source $$x" >> $@; done | ||
|
||
# source config TCL scripts if any source file has changed | ||
update_config.tcl: $(CONFIG_TCL_FILES) $(SYN_FILES) $(INC_FILES) $(XDC_FILES) | ||
echo "open_project -quiet $(PROJECT).xpr" > $@ | ||
for x in $(CONFIG_TCL_FILES); do echo "source $$x" >> $@; done | ||
|
||
$(PROJECT).xpr: create_project.tcl update_config.tcl | ||
vivado -nojournal -nolog -mode batch $(foreach x,$?,-source $x) | ||
|
||
# synthesis run | ||
$(PROJECT).runs/synth_1/$(PROJECT).dcp: create_project.tcl update_config.tcl $(SYN_FILES) $(INC_FILES) $(XDC_FILES) | $(PROJECT).xpr | ||
echo "open_project $(PROJECT).xpr" > run_synth.tcl | ||
echo "reset_run synth_1" >> run_synth.tcl | ||
echo "launch_runs -jobs 4 synth_1" >> run_synth.tcl | ||
echo "wait_on_run synth_1" >> run_synth.tcl | ||
vivado -nojournal -nolog -mode batch -source run_synth.tcl | ||
|
||
# implementation run | ||
$(PROJECT).runs/impl_1/$(PROJECT)_routed.dcp: $(PROJECT).runs/synth_1/$(PROJECT).dcp | ||
echo "open_project $(PROJECT).xpr" > run_impl.tcl | ||
echo "reset_run impl_1" >> run_impl.tcl | ||
echo "launch_runs -jobs 4 impl_1" >> run_impl.tcl | ||
echo "wait_on_run impl_1" >> run_impl.tcl | ||
echo "open_run impl_1" >> run_impl.tcl | ||
echo "report_utilization -file $(PROJECT)_utilization.rpt" >> run_impl.tcl | ||
echo "report_utilization -hierarchical -file $(PROJECT)_utilization_hierarchical.rpt" >> run_impl.tcl | ||
vivado -nojournal -nolog -mode batch -source run_impl.tcl | ||
|
||
# output files (including potentially bit, bin, ltx, and xsa) | ||
$(PROJECT).bit $(PROJECT).bin $(PROJECT).ltx $(PROJECT).xsa: $(PROJECT).runs/impl_1/$(PROJECT)_routed.dcp | ||
echo "open_project $(PROJECT).xpr" > generate_bit.tcl | ||
echo "open_run impl_1" >> generate_bit.tcl | ||
echo "write_bitstream -force -bin_file $(PROJECT).runs/impl_1/$(PROJECT).bit" >> generate_bit.tcl | ||
echo "write_debug_probes -force $(PROJECT).runs/impl_1/$(PROJECT).ltx" >> generate_bit.tcl | ||
echo "write_hw_platform -fixed -force -include_bit $(PROJECT).xsa" >> generate_bit.tcl | ||
vivado -nojournal -nolog -mode batch -source generate_bit.tcl | ||
ln -f -s $(PROJECT).runs/impl_1/$(PROJECT).bit . | ||
ln -f -s $(PROJECT).runs/impl_1/$(PROJECT).bin . | ||
if [ -e $(PROJECT).runs/impl_1/$(PROJECT).ltx ]; then ln -f -s $(PROJECT).runs/impl_1/$(PROJECT).ltx .; fi | ||
mkdir -p rev | ||
COUNT=100; \ | ||
while [ -e rev/$(PROJECT)_rev$$COUNT.bit ]; \ | ||
do COUNT=$$((COUNT+1)); done; \ | ||
cp -pv $(PROJECT).runs/impl_1/$(PROJECT).bit rev/$(PROJECT)_rev$$COUNT.bit; \ | ||
cp -pv $(PROJECT).runs/impl_1/$(PROJECT).bin rev/$(PROJECT)_rev$$COUNT.bin; \ | ||
if [ -e $(PROJECT).runs/impl_1/$(PROJECT).ltx ]; then cp -pv $(PROJECT).runs/impl_1/$(PROJECT).ltx rev/$(PROJECT)_rev$$COUNT.ltx; fi; \ | ||
if [ -e $(PROJECT).xsa ]; then cp -pv $(PROJECT).xsa rev/$(PROJECT)_rev$$COUNT.xsa; fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
# SPDX-License-Identifier: MIT | ||
# | ||
# Copyright (c) 2025 FPGA Ninja, LLC | ||
# | ||
# Authors: | ||
# - Alex Forencich | ||
# | ||
|
||
# FPGA settings | ||
FPGA_PART = xcu200-fsgd2104-2-e | ||
FPGA_TOP = fpga | ||
FPGA_ARCH = virtexuplus | ||
|
||
# Files for synthesis | ||
SYN_FILES = ../rtl/fpga_au200.sv | ||
SYN_FILES += ../rtl/fpga_core.sv | ||
SYN_FILES += ../lib/taxi/rtl/eth/us/taxi_eth_mac_25g_us.f | ||
SYN_FILES += ../lib/taxi/rtl/lss/taxi_uart.f | ||
SYN_FILES += ../lib/taxi/rtl/axis/taxi_axis_async_fifo.f | ||
SYN_FILES += ../lib/taxi/rtl/sync/taxi_sync_reset.sv | ||
SYN_FILES += ../lib/taxi/rtl/sync/taxi_sync_signal.sv | ||
SYN_FILES += ../lib/taxi/rtl/io/taxi_debounce_switch.sv | ||
|
||
# XDC files | ||
XDC_FILES = ../fpga_au200.xdc | ||
XDC_FILES += ../lib/taxi/syn/vivado/taxi_eth_mac_fifo.tcl | ||
XDC_FILES += ../lib/taxi/syn/vivado/taxi_axis_async_fifo.tcl | ||
XDC_FILES += ../lib/taxi/syn/vivado/taxi_sync_reset.tcl | ||
|
||
# IP | ||
IP_TCL_FILES = ../lib/taxi/rtl/eth/us/taxi_eth_mac_25g_us_gty_25g_156.tcl | ||
|
||
# Configuration | ||
#CONFIG_TCL_FILES = ./config.tcl | ||
|
||
include ../common/vivado.mk | ||
|
||
program: $(PROJECT).bit | ||
echo "open_hw_manager" > program.tcl | ||
echo "connect_hw_server" >> program.tcl | ||
echo "open_hw_target" >> program.tcl | ||
echo "current_hw_device [lindex [get_hw_devices] 0]" >> program.tcl | ||
echo "refresh_hw_device -update_hw_probes false [current_hw_device]" >> program.tcl | ||
echo "set_property PROGRAM.FILE {$(PROJECT).bit} [current_hw_device]" >> program.tcl | ||
echo "program_hw_devices [current_hw_device]" >> program.tcl | ||
echo "exit" >> program.tcl | ||
vivado -nojournal -nolog -mode batch -source program.tcl | ||
|
||
$(PROJECT).mcs $(PROJECT).prm: $(PROJECT).bit | ||
echo "write_cfgmem -force -format mcs -size 128 -interface SPIx4 -loadbit {up 0x01002000 $*.bit} -checksum -file $*.mcs" > generate_mcs.tcl | ||
echo "exit" >> generate_mcs.tcl | ||
vivado -nojournal -nolog -mode batch -source generate_mcs.tcl | ||
mkdir -p rev | ||
COUNT=100; \ | ||
while [ -e rev/$*_rev$$COUNT.bit ]; \ | ||
do COUNT=$$((COUNT+1)); done; \ | ||
COUNT=$$((COUNT-1)); \ | ||
for x in .mcs .prm; \ | ||
do cp $*$$x rev/$*_rev$$COUNT$$x; \ | ||
echo "Output: rev/$*_rev$$COUNT$$x"; done; | ||
|
||
flash: $(PROJECT).mcs $(PROJECT).prm | ||
echo "open_hw_manager" > flash.tcl | ||
echo "connect_hw_server" >> flash.tcl | ||
echo "open_hw_target" >> flash.tcl | ||
echo "current_hw_device [lindex [get_hw_devices] 0]" >> flash.tcl | ||
echo "refresh_hw_device -update_hw_probes false [current_hw_device]" >> flash.tcl | ||
echo "create_hw_cfgmem -hw_device [current_hw_device] [lindex [get_cfgmem_parts {mt25qu01g-spi-x1_x2_x4}] 0]" >> flash.tcl | ||
echo "current_hw_cfgmem -hw_device [current_hw_device] [get_property PROGRAM.HW_CFGMEM [current_hw_device]]" >> flash.tcl | ||
echo "set_property PROGRAM.FILES [list \"$(PROJECT).mcs\"] [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.PRM_FILES [list \"$(PROJECT).prm\"] [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.ERASE 1 [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.CFG_PROGRAM 1 [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.VERIFY 1 [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.CHECKSUM 0 [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.ADDRESS_RANGE {use_file} [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.UNUSED_PIN_TERMINATION {pull-none} [current_hw_cfgmem]" >> flash.tcl | ||
echo "create_hw_bitstream -hw_device [current_hw_device] [get_property PROGRAM.HW_CFGMEM_BITFILE [current_hw_device]]" >> flash.tcl | ||
echo "program_hw_devices [current_hw_device]" >> flash.tcl | ||
echo "refresh_hw_device [current_hw_device]" >> flash.tcl | ||
echo "program_hw_cfgmem -hw_cfgmem [current_hw_cfgmem]" >> flash.tcl | ||
echo "boot_hw_device [current_hw_device]" >> flash.tcl | ||
echo "exit" >> flash.tcl | ||
vivado -nojournal -nolog -mode batch -source flash.tcl |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
# SPDX-License-Identifier: MIT | ||
# | ||
# Copyright (c) 2025 FPGA Ninja, LLC | ||
# | ||
# Authors: | ||
# - Alex Forencich | ||
# | ||
|
||
# FPGA settings | ||
FPGA_PART = xcu200-fsgd2104-2-e | ||
FPGA_TOP = fpga | ||
FPGA_ARCH = virtexuplus | ||
|
||
# Files for synthesis | ||
SYN_FILES = ../rtl/fpga_au200.sv | ||
SYN_FILES += ../rtl/fpga_core.sv | ||
SYN_FILES += ../lib/taxi/rtl/eth/us/taxi_eth_mac_25g_us.f | ||
SYN_FILES += ../lib/taxi/rtl/lss/taxi_uart.f | ||
SYN_FILES += ../lib/taxi/rtl/axis/taxi_axis_async_fifo.f | ||
SYN_FILES += ../lib/taxi/rtl/sync/taxi_sync_reset.sv | ||
SYN_FILES += ../lib/taxi/rtl/sync/taxi_sync_signal.sv | ||
SYN_FILES += ../lib/taxi/rtl/io/taxi_debounce_switch.sv | ||
|
||
# XDC files | ||
XDC_FILES = ../fpga_au200.xdc | ||
XDC_FILES += ../lib/taxi/syn/vivado/taxi_eth_mac_fifo.tcl | ||
XDC_FILES += ../lib/taxi/syn/vivado/taxi_axis_async_fifo.tcl | ||
XDC_FILES += ../lib/taxi/syn/vivado/taxi_sync_reset.tcl | ||
|
||
# IP | ||
IP_TCL_FILES = ../lib/taxi/rtl/eth/us/taxi_eth_mac_25g_us_gty_10g_156.tcl | ||
|
||
# Configuration | ||
#CONFIG_TCL_FILES = ./config.tcl | ||
|
||
include ../common/vivado.mk | ||
|
||
program: $(PROJECT).bit | ||
echo "open_hw_manager" > program.tcl | ||
echo "connect_hw_server" >> program.tcl | ||
echo "open_hw_target" >> program.tcl | ||
echo "current_hw_device [lindex [get_hw_devices] 0]" >> program.tcl | ||
echo "refresh_hw_device -update_hw_probes false [current_hw_device]" >> program.tcl | ||
echo "set_property PROGRAM.FILE {$(PROJECT).bit} [current_hw_device]" >> program.tcl | ||
echo "program_hw_devices [current_hw_device]" >> program.tcl | ||
echo "exit" >> program.tcl | ||
vivado -nojournal -nolog -mode batch -source program.tcl | ||
|
||
$(PROJECT).mcs $(PROJECT).prm: $(PROJECT).bit | ||
echo "write_cfgmem -force -format mcs -size 128 -interface SPIx4 -loadbit {up 0x01002000 $*.bit} -checksum -file $*.mcs" > generate_mcs.tcl | ||
echo "exit" >> generate_mcs.tcl | ||
vivado -nojournal -nolog -mode batch -source generate_mcs.tcl | ||
mkdir -p rev | ||
COUNT=100; \ | ||
while [ -e rev/$*_rev$$COUNT.bit ]; \ | ||
do COUNT=$$((COUNT+1)); done; \ | ||
COUNT=$$((COUNT-1)); \ | ||
for x in .mcs .prm; \ | ||
do cp $*$$x rev/$*_rev$$COUNT$$x; \ | ||
echo "Output: rev/$*_rev$$COUNT$$x"; done; | ||
|
||
flash: $(PROJECT).mcs $(PROJECT).prm | ||
echo "open_hw_manager" > flash.tcl | ||
echo "connect_hw_server" >> flash.tcl | ||
echo "open_hw_target" >> flash.tcl | ||
echo "current_hw_device [lindex [get_hw_devices] 0]" >> flash.tcl | ||
echo "refresh_hw_device -update_hw_probes false [current_hw_device]" >> flash.tcl | ||
echo "create_hw_cfgmem -hw_device [current_hw_device] [lindex [get_cfgmem_parts {mt25qu01g-spi-x1_x2_x4}] 0]" >> flash.tcl | ||
echo "current_hw_cfgmem -hw_device [current_hw_device] [get_property PROGRAM.HW_CFGMEM [current_hw_device]]" >> flash.tcl | ||
echo "set_property PROGRAM.FILES [list \"$(PROJECT).mcs\"] [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.PRM_FILES [list \"$(PROJECT).prm\"] [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.ERASE 1 [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.CFG_PROGRAM 1 [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.VERIFY 1 [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.CHECKSUM 0 [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.ADDRESS_RANGE {use_file} [current_hw_cfgmem]" >> flash.tcl | ||
echo "set_property PROGRAM.UNUSED_PIN_TERMINATION {pull-none} [current_hw_cfgmem]" >> flash.tcl | ||
echo "create_hw_bitstream -hw_device [current_hw_device] [get_property PROGRAM.HW_CFGMEM_BITFILE [current_hw_device]]" >> flash.tcl | ||
echo "program_hw_devices [current_hw_device]" >> flash.tcl | ||
echo "refresh_hw_device [current_hw_device]" >> flash.tcl | ||
echo "program_hw_cfgmem -hw_cfgmem [current_hw_cfgmem]" >> flash.tcl | ||
echo "boot_hw_device [current_hw_device]" >> flash.tcl | ||
echo "exit" >> flash.tcl | ||
vivado -nojournal -nolog -mode batch -source flash.tcl |
Oops, something went wrong.