RFNoC Image Builder is the tool that turns a high-level YAML description of your FPGA design into a complete, synthesizable Verilog design and optionally drives the Xilinx Vivado build all the way to a bitfile. You provide a list of NoC blocks, stream endpoints, static connections, and clock domains; Image Builder instantiates the requested blocks, wires them together through the CHDR and control crossbars, and integrates everything with the USRP board support package (BSP).Documentation Index
Fetch the complete documentation index at: https://mintlify.com/EttusResearch/uhd/llms.txt
Use this file to discover all available pages before exploring further.
What Image Builder Does
Given a YAML configuration file, Image Builder performs the following steps automatically:- Reads the block descriptor files (
.yml) for each requested NoC block. - Instantiates a CHDR Crossbar with enough ports for all transport adapters and stream endpoints.
- Instantiates the requested stream endpoints and connects them to the crossbar.
- Instantiates a Control Crossbar and connects all block control ports.
- Generates a Static Router from the declared
connectionslist. - Produces a synthesizable Verilog top-level and a Makefile that targets the specified USRP device.
- Optionally invokes Vivado to synthesize, implement, and generate a bitstream.
CLI Reference
| Flag | Description |
|---|---|
-y, --yaml-config | Path to the image configuration YAML file |
-r, --grc-config | Generate image from a GNU Radio Companion .grc file instead |
-F, --fpga-dir | Path to the FPGA source tree (defaults to current repo) |
-t, --target | Build target, e.g. X310_HG, N320_XG, X410, X440 |
-G, --generate-only | Generate Verilog but do not invoke Vivado |
-I, --include-dir | Path to an out-of-tree module directory (repeatable) |
-B, --build-dir | Output directory for generated image core files |
-d, --device | Target device if not specified in the YAML |
-g, --GUI | Open Vivado GUI during the build |
-j, --jobs | Number of parallel Vivado jobs |
-c, --clean-all | Clean IP before building |
-p, --vivado-path | Override the default Vivado installation path |
Valid Targets
Image Builder validates the--target argument against the known list:
| Device | Available Targets |
|---|---|
| X300 / X310 | X310_1G, X310_HG, X310_XG, X310_HA, X310_XA |
| N300 / N310 | N310_WX, N310_HG, N310_XG, N310_HA, N310_XA, N310_AA |
| N320 | N320_WX, N320_HG, N320_XG, N320_XQ, N320_AQ, N320_AA |
| E310 | E310_SG1, E310_SG3 |
| E320 | E320_1G, E320_XG, E320_AA |
| X410 | X410 |
| X440 | X440 |
Image Configuration YAML Format
The YAML file is the single input that completely describes your custom FPGA image. It is validated against therfnoc_imagebuilder_args schema.
Minimal Working Example
Full YAML Field Reference
The special block name
_device_ refers to the USRP device itself and is used to connect IO ports (like the hardware timestamp) and device clocks to NoC blocks. It cannot be used as a dstblk in data connections.Connection Rules
srcblkanddstblkmust be either the name of a stream endpoint, the name of a NoC block, or_device_.srcportanddstportare the port names as defined in the block descriptor YAML files.- Stream endpoints use port names
in0,in1, … (for input from a block) andout0,out1, … (for output to a block). - A single source port can only be connected to a single destination port in the static router.
Building a Custom FPGA Image
Prepare block descriptors
Ensure the
.yml descriptor file for every custom block is accessible. In-tree blocks (Radio, DDC, DUC, FFT, Replay, …) are already bundled with UHD. For out-of-tree (OOT) blocks, pass their directory with -I.Write the image configuration YAML
Create a YAML file listing your blocks, stream endpoints, connections, and clock domains. Choose a
chdr_width that matches all blocks (64-bit for X3xx/N3xx, 256-bit for X4xx).Generate and inspect the Verilog
Run Image Builder with
--generate-only first to inspect the generated files without kicking off a Vivado build:Build the bitfile
Drop The final
--generate-only to synthesize and implement the design. Use -j N to parallelize Vivado jobs:.bit file will appear in build_output/ (or the directory specified with --build-output-dir).Tips and Common Pitfalls
The
chdr_width in the image YAML must match the chdr_width specified in every block’s YAML descriptor. Mixing CHDR widths in a single image will cause an error during generation.If an out-of-tree block requires special Vivado IP (e.g., a Xilinx FFT core), include the IP’s
.xci files in the block’s Makefile.srcs and reference that makefile in the block descriptor’s fpga_includes section. Image Builder will include those sources in the Vivado project automatically.Generated File Structure
After running Image Builder, the build directory typically contains:rfnoc_image_core.sv is the synthesizable top-level that instantiates all the blocks you declared, wires the CHDR and control crossbars, and connects everything to the device BSP.