Board Support
Directory Convention
Every supported board lives under hardware/<BoardName>/ and follows the same internal
layout. Using XilinxKcu1500 as the worked example, the skeleton looks like this:
hardware/<BoardName>/
ruckus.tcl # board entry-point
rtl/
<BoardName>Core.vhd # top-level integration
AxiPciePkg.vhd # board-specific constants
pcie/ # PCIe PHY IP wrapper + .dcp
ddr/ or hbm/ # optional MIG / HBM buffer
xdc/ # board pin/timing constraints
The pcie/ subtree holds the pre-compiled Vivado .dcp checkpoint and the thin VHDL
wrapper that presents a uniform AXI4 interface to the rest of the design. The ddr/ or
hbm/ subtrees are optional; boards without on-board memory omit them.
The ruckus.tcl Entry-Point Chain
The build system chains from the downstream project inward through four levels:
The downstream project’s top-level
ruckus.tclsourceshardware/<BoardName>/ruckus.tclvialoadRuckusTcl.The board
ruckus.tclsourcesshared/ruckus.tclas its first action.shared/ruckus.tclcallsSubmoduleCheckto enforce ruckus ≥ v4.24.2 and surf ≥ v2.71.0, verifies Vivado version ≥ 2020.1, then loads all ofshared/rtl/andshared/ip/into theaxi_pcie_coreVHDL library.The board
ruckus.tclloads its ownrtl/sources, the PCIe PHY.dcp, the.xdcconstraints, and — conditionally — theddr/orhbm/subtree depending on the board’s optional memory configuration.
Some boards impose additional constraints. XilinxAlveoU55c, for example, requires
Vivado 2024.2 and sources a block-design subtree (bd/) before loading the shared
library. These variations are handled inside each board’s own ruckus.tcl; the
downstream project’s entry point remains unchanged.
Adding a New Board (overview)
Full step-by-step instructions will appear in how-to/add_new_board.rst. At a high
level, adding a board requires four touchpoints: create hardware/<BoardName>/ with
the standard subtree layout described above; write <BoardName>Core.vhd wiring the
PCIe PHY, shared REG/DMA modules, and board I/O; supply AxiPciePkg.vhd with the
board’s DMA_CLK_FREQ_C and AXI_PCIE_CONFIG_C constants; and register a new
HW_TYPE_* identifier in shared/rtl/AxiPcieSharedPkg.vhd so the firmware can
report its board type at runtime.