Releases: EttusResearch/uhd
Release list
UHD 4.11.0.0-rc1
UHD 4.11.0.0 Release Candidate 1
- Highlights / Main Changes
- Add support for the new USRP B310, a PCIe/Thunderbolt-based device which
supports 2x2 RF channels at up to 100 MHz bandwidth per channel. - Update underlying OE version on embedded devices to Scarthgap (5.0 LTS).
Note that some of the MPM updates require this update. - Migrated the MPM RPC transport layer from mprpc (msgpack-RPC) to gRPC/Protobuf,
impacting all embedded devices running MPM.
- Add support for the new USRP B310, a PCIe/Thunderbolt-based device which
- New Features
- X440:
- The X440_X4_200 image now uses fabric resamplers instead of RFDC
resamplers, which ensures repeatable phase offsets between devices and
reboots. Note that this feature is currently mutually exclusive with dual
rate support, and it increases the resource utilization. To revert to the
previous image with non-repeatable phase offsets, a custom image must be
built. By default, it is set to false (i.e., same as old behavior),
except for the X440_X4_200 image. - A new BSP parameter (USE_FABRIC_RESAMPLERS) is introduced to toggle this
new feature.
- The X440_X4_200 image now uses fabric resamplers instead of RFDC
- X4xx: The ref_locked sensor no longer queries the sticky bits; instead, it
only reports the current lock state. The ref_stable sensor is added to
include the sticky bits. - Python:
- The ref_clk_calibration feature is now accessible in the Python API.
- Streamers:
- Added get_stream_info() API call to streamers, which allows reading out
internal information about streamer objects.
- Added get_stream_info() API call to streamers, which allows reading out
- RFNoC:
- Added support for RFNoC 2.0 control operations, including block
read/write, poll, and burst read/write operations. - Control packet sequence number width was increased to 8 bits, which
improves stability in environments with high packet loss or reordering
(e.g., in WSL containers). Note that this is a break in the protocol version;
Wireshark dissectors have been updated (but old dissectors will no
longer work). - RFNoC control packets no longer require unnecessary dummy data words,
improving control interface efficiency. - Improve ability to control the block CHDR width (aside from the regular
CHDR width). - Allow parallel initialization of RFNoC-based devices for faster session
start when using multiple USRPs in a multi_usrp or rfnoc_graph object. - Wideband DDC/DUC:
- Updated the RFNoC DDC and DUC blocks to support bandwidths > 200 MHz.
With this update, users can add the DDC and DUC blocks to their custom
FPGA images for bandwidths up to 1600 MHz (2000 MSps).
- Updated the RFNoC DDC and DUC blocks to support bandwidths > 200 MHz.
- Shipping FPGA images:
- Added DDC and DUC functionality for all channels to the following
shipping FPGA images:- x410_X4_400
- x410_CG_400
- x420_X4_1000
- x420_CG_1000
- x440_X4_1600
- x440_CG_1600
For custom designs based on one of these updated rfnoc_image_core.yml
files, please note that the new addition of the DDC/DUC blocks to FPGA
images will have an impact on how much custom logic can fit into these
designs. If needed the DDC/DUC blocks can be removed to revert to the
previous behavior.
- Added DDC and DUC functionality for all channels to the following
- Added support for RFNoC 2.0 control operations, including block
- MPM-based devices can now be initialized in parallel within a MultiUSRP
session. - X420:
- Added support for the 400 MHz FPGA variants, including the X420_CG_400
and X420_X4_400 images. - Added fabric-resampler support to the X420 FPGA designs.
- Added support for the 400 MHz FPGA variants, including the X420_CG_400
- GPS:
- Added support for UBLOX communication.
- Improved compatibility with GPS receivers by accepting additional
constellation messages and handling device-specific message timing.
- Embedded devices: Migrated thermal/fan sensor handling to hwmon/sysfs. This
requires the embedded OS to be at least Scarthgap.
- X440:
- Bug Fixes
- Fixed an X420 power-up issue caused by glitchy power readouts.
- Improved X4xx clock initialization and reference-lock handling, including
recovery from reference-clock glitches between UHD sessions. - X4xx ADC self-calibration now honors skip_adc_selfcal during clock
reconfiguration. - Fixed device filtering for image loading and other callers of
device-specific find_t implementations, including serial-based image
updates. - Improved GPS message parsing and receive-buffer handling.
- Corrected the exit status reported by uhd_images_downloader on errors.
- RFNoC now reports the detected and expected RFNoC versions when a version
mismatch is encountered. - Fixed
rfnoc_modtool make-yaml; it produced an incorrect make_var entry. - Many other, minor bug fixes (see commit list for details).
- API Changes
- All usage of boost::optional within the library has been removed. Public APIs
that used boost::optional are retained, but marked as deprecated. - Some logging APIs that previously used boost::posix_time are now
declared deprecated, and alternatives that use standard C++ constructs have
been introduced. - MPM device initialization is parallel by default. The serialize_init=1
device argument restores serial initialization. - Added an option to resynchronize X4xx SPLL R-dividers after reference-lock
loss using reset_spll_r_divider=1 in the synchronization arguments. This
is intended for advanced users only. - Minor DDC/DUC C++ API changes as part of the Wideband DDC/DUC update.
- All usage of boost::optional within the library has been removed. Public APIs
- FPGA
- Many improvements to resource utilization for improved build success rate
and compilation time. - Enabled usage of VHDL 2008.
- Many improvements to resource utilization for improved build success rate
- Codebase Management
- Fully removed Boost.Thread, Boost.Date_Time, and Boost.Chrono dependencies
for libuhd. Other Boost usage has been reduced. - Improved compatibility with newer compiler versions (e.g., gcc16).
- MPM RPC transport migrated from mprpc (msgpack-RPC) to gRPC/Protobuf.
The mprpc Python dependency is replaced by grpcio. On Linux, the host
build-time dependencies are libgrpc++-dev, libprotobuf-dev, and
protobuf-compiler-grpc. On Windows, there are no prebuilt distro packages,
so gRPC and Protobuf (including the grpc_cpp_plugin code-generation plugin)
must be obtained either by building from source (https://github.com/grpc/grpc)
or via a package manager such as vcpkg. - Improved build reproducibility by removing the build-directory path from
embedded build information.
- Fully removed Boost.Thread, Boost.Date_Time, and Boost.Chrono dependencies
- Validated OS Environments
(Versions for build and runtime dependencies can be determined from the
docker container definitions in the UHD repository at .ci/docker/...)- Linux:
- Ubuntu: jammy (22.04), noble (24.04), resolute (26.04)
- Fedora: 41, 42, 43
- Windows: 10 22H2, 11 24H2
- MacOS: Sequoia (15.7)
- Linux:
UHD 4.10.0.0
UHD 4.10.0.0 Release
- Highlights / Main Changes
- Support for USRP X420
- Addition of timed complex gain feature, which allows setting a complex gain
value to fix phase and amplitude of signals from radio blocks
- New Features
- CMake:
- Create UHD::uhd package for improved integration in downstream build
processes. The init_usrp example is used to showcase this feature. - Improved options for RFNoC OOT modules to write unit tests.
- Create UHD::uhd package for improved integration in downstream build
- Add helper routines to up- and download data (reliably) from and to the
DRAM block - X310: Allow daughterboards to set dboard clock rate
- Improve finding of MPM-based devices by making parts of the find call
asynchronous and allowing to skip reachability checks. - RFNoC:
- Added new optional feature to all Radio blocks - Timed complex gain:
- Allows specifying complex gain coefficients to be applied to all
TX and/or RX samples of a radio channel at the specified time. - Enabled by default for all TX and RX channels of the radio blocks,
but can be disabled at FPGA build time via theEN_COMP_GAIN_TX
andEN_COMP_GAIN_RXparameters of the radio blocks. - NOTE: For the x440_X4_400 default FPGA design provided with UHD,
enabling this feature for all 8 RX and TX channels necessitated
restricting the existing crossbar connections between the replay
blocks and the radio blocks. As a result, only blocks with the same
indices can be connected (e.g. replay0<->radio0 and replay1<->radio1
only) when using this pre-built USRP FPGA image.
- Allows specifying complex gain coefficients to be applied to all
- Blocks may now drive the front-panel GPIO pins on all RFNoC-capable
devices. New IO signatures are added, and all device BSPs have IO ports
for accessing the GPIOs. Device controls are updated such that the user
can choose the source for GPIOs dynamically in this case (i.e., the
radio blocks and other GPIO sources are still available). In some cases,
the device BSP HDL had to be significantly refactored. - Add names and descriptions for block's and module's YAML files, so that
other tools may read information about those in an automated fashion - Allow
mtustream argument, which overrides the MTU value that is
derived from the link information. - Action handling is now moved to its own thread (there is one action
handling thread per graph). This allows actions to be handled
asynchronously, e.g., when triggering actions from async message handlers. - Add radio_state IO signature, so that other blocks can monitor the ATR
state of radio blocks. - All RFNoC devices can now take an
mtustream argument (which overrides
the detected link MTU) and aforce_mtudevice argument (which skips
automatic MTU detection and forces a fixed value). These are helpful in
scenarios where a specific network topology interferes with path MTU
discovery, and for remote streaming when the MTU for a remote stream link
cannot be inferred from UHD. - rfnoc_modtool has improved support for generating unit tests.
- Add PPS IO signature for all targets
- Add stream command to start receiving when a transmit occurs
- Null source/sink: Add finite mode.
- Add UX1/UX2/UX4 QSFP configurations for X4xx
- Added new optional feature to all Radio blocks - Timed complex gain:
- CMake:
- API Changes
- meta_range_t and uhd::dict can now be initialized from initializer lists
- Add rfnoc_graph::get_chdr_xport_adapters()
- Python API now allows creating SubdevSpec from a string
- Some public APIs that used
boost::optionalnow also work withstd::optional - Unit tests for RFNoC blocks (in-tree and out-of-tree) no longer require a
dummy implementation of~make_args_t() uhd::cast::to_str()was added anduhd::cast::from_str()was extended to
be a full replacement forboost::lexical_cast
- Examples
- Overhauled many of the examples to improve documentation, as well as some
minor conveniences or bug fixes - Added continuous streaming to tx_samples_from_file
- Improved gpio example.
- Overhauled many of the examples to improve documentation, as well as some
- Bug Fixes
- Fix static UHD library builds
- Fix compatibility with Boost 1.89
- RFNoC:
- Fix slicing notation in rfnoc_image_builder
- Fix building of GRC files with empty default target (this would affect
builds of X410 and X440 device bitfiles from GNU Radio) - Fix installation of OOT modules in Python venvs
- Fix time alignment of first sample
- Unit tests in RFNoC OOT modules now preload their DLLs to ensure the
correct library version is loaded - Fix generation of GNU Radio C++ block controllers
- rfnoc_modtool: Fix creation of spurious unit tests, fix package_data for
Python module installation - rfnoc_modtool: Fix connection check for invalid ports
- Fix alignment of first sample coming from radio block.
- Fix bug in ctrlport_endpoint which could cause the software to believe
the associated RFNoC block's command FIFO was full when packets were lost - Add parameter to skip waiting for ACKs in async messages
- E31x: Fix GPIO control
- E3xx/B2xx: Fix rounding bug for RF PLL tuning
- B2xx: Fix image loading via b200_image_loader when multiple devices are
attached - X410: Fix tuning when power calibration and non-default gain profiles are
used. - Power calibration tools: Fix settings for E320, allow non-default sampling
rate, other minor fixes - FPGA
- Fix various simulation-related bugs
- USRP Simulator: Update to match current UHD.
- multi_usrp:
- Improved bank name check in multi_usrp::{set,get}_gpio_attr()
- CMake:
- Allow absolute paths for install dirs in pkg-config
- Fix target include path for Python module
- USRP1: Fix converter name in property tree
- FPGA:
- Fix various simulation/testbench issues.
- Improve resource utilization in various places.
- MPM:
- Fix file descriptor leaks by using with/open everywhere.
- Fix double-free issue in rpclib.
- Remove tolerance for non-existing EEPROMs.
- Examples: Properly report errors when opening a file failed.
- Python: When installing into venvs, no longer force a reinstallation of
dependencies.
- Dependencies changes
- Increase minimum required versions
- Boost to 1.71
- DPDK to 19.11
- Changed minimum CMake versions for various non-UHD projects, e.g.
firmware builds, to stay compatible with CMake 4
- Increase minimum required versions
- Documentation
- Restructured the UHD manual, improved chapter structure, improved getting
started content, added RFNoC specification. - Fixed some external links
- Many smaller improvements (typos, duplicate entries removed, formatting,
etc.)
- Restructured the UHD manual, improved chapter structure, improved getting
- Codebase Management
- Increased C++ version to 20 for UHD library, examples, and utilities
- Removed Boost in multiple locations and replaced with standard library
calls - Fix numerous (mostly harmless) compiler and Doxygen warnings
- Improve CMake linking instructions
- Validated OS Environments
(Versions for build and runtime dependencies can be determined from the
docker container definitions in the UHD repository at .ci/docker/...)- Linux:
- Ubuntu: jammy (22.04), noble (24.04), questing (25.10)
- Fedora: 40, 41, 42
- Windows: 10 22H2, 11 24H2
- MacOS: Sequoia (15.6)
- Linux:
UHD 4.10.0.0-RC4
UHD 4.10.0.0 Release Candidate 4
- Highlights / Main Changes
- Support for USRP X420
- Addition of timed complex gain feature, which allows setting a complex gain
value to fix phase and amplitude of signals from radio blocks
- New Features
- CMake:
- Create UHD::uhd package for improved integration in downstream build
processes. The init_usrp example is used to showcase this feature. - Improved options for RFNoC OOT modules to write unit tests.
- Create UHD::uhd package for improved integration in downstream build
- Add helper routines to up- and download data (reliably) from and to the
DRAM block - X310: Allow daughterboards to set dboard clock rate
- Improve finding of MPM-based devices by making parts of the find call
asynchronous and allowing to skip reachability checks. - RFNoC:
- Added new optional feature to all Radio blocks - Timed complex gain:
- Allows specifying complex gain coefficients to be applied to all
TX and/or RX samples of a radio channel at the specified time. - Enabled by default for all TX and RX channels of the radio blocks,
but can be disabled at FPGA build time via theEN_COMP_GAIN_TX
andEN_COMP_GAIN_RXparameters of the radio blocks. - NOTE: For the x440_X4_400 default FPGA design provided with UHD,
enabling this feature for all 8 RX and TX channels necessitated
restricting the existing crossbar connections between the replay
blocks and the radio blocks. As a result, only blocks with the same
indices can be connected (e.g. replay0<->radio0 and replay1<->radio1
only) when using this pre-built USRP FPGA image.
- Allows specifying complex gain coefficients to be applied to all
- Blocks may now drive the front-panel GPIO pins on all RFNoC-capable
devices. New IO signatures are added, and all device BSPs have IO ports
for accessing the GPIOs. Device controls are updated such that the user
can choose the source for GPIOs dynamically in this case (i.e., the
radio blocks and other GPIO sources are still available). In some cases,
the device BSP HDL had to be significantly refactored. - Add names and descriptions for block's and module's YAML files, so that
other tools may read information about those in an automated fashion - Allow
mtustream argument, which overrides the MTU value that is
derived from the link information. - Action handling is now moved to its own thread (there is one action
handling thread per graph). This allows actions to be handled
asynchronously, e.g., when triggering actions from async message handlers. - Add radio_state IO signature, so that other blocks can monitor the ATR
state of radio blocks. - All RFNoC devices can now take an
mtustream argument (which overrides
the detected link MTU) and aforce_mtudevice argument (which skips
automatic MTU detection and forces a fixed value). These are helpful in
scenarios where a specific network topology interferes with path MTU
discovery, and for remote streaming when the MTU for a remote stream link
cannot be inferred from UHD. - rfnoc_modtool has improved support for generating unit tests.
- Add PPS IO signature for all targets
- Add stream command to start receiving when a transmit occurs
- Null source/sink: Add finite mode.
- Add UX1/UX2/UX4 QSFP configurations for X4xx
- Added new optional feature to all Radio blocks - Timed complex gain:
- CMake:
- API Changes
- meta_range_t and uhd::dict can now be initialized from initializer lists
- Add rfnoc_graph::get_chdr_xport_adapters()
- Python API now allows creating SubdevSpec from a string
- Some public APIs that used
boost::optionalnow also work withstd::optional - Unit tests for RFNoC blocks (in-tree and out-of-tree) no longer require a
dummy implementation of~make_args_t() uhd::cast::to_str()was added anduhd::cast::from_str()was extended to
be a full replacement forboost::lexical_cast
- Examples
- Overhauled many of the examples to improve documentation, as well as some
minor conveniences or bug fixes - Added continuous streaming to tx_samples_from_file
- Improved gpio example.
- Overhauled many of the examples to improve documentation, as well as some
- Bug Fixes
- Fix static UHD library builds
- Fix compatibility with Boost 1.89
- RFNoC:
- Fix slicing notation in rfnoc_image_builder
- Fix building of GRC files with empty default target (this would affect
builds of X410 and X440 device bitfiles from GNU Radio) - Fix installation of OOT modules in Python venvs
- Fix time alignment of first sample
- Unit tests in RFNoC OOT modules now preload their DLLs to ensure the
correct library version is loaded - Fix generation of GNU Radio C++ block controllers
- rfnoc_modtool: Fix creation of spurious unit tests, fix package_data for
Python module installation - rfnoc_modtool: Fix connection check for invalid ports
- Fix alignment of first sample coming from radio block.
- Fix bug in ctrlport_endpoint which could cause the software to believe
the associated RFNoC block's command FIFO was full when packets were lost - Add parameter to skip waiting for ACKs in async messages
- E31x: Fix GPIO control
- E3xx/B2xx: Fix rounding bug for RF PLL tuning
- B2xx: Fix image loading via b200_image_loader when multiple devices are
attached - X410: Fix tuning when power calibration and non-default gain profiles are
used. - Power calibration tools: Fix settings for E320, allow non-default sampling
rate, other minor fixes - FPGA
- Fix various simulation-related bugs
- USRP Simulator: Update to match current UHD.
- multi_usrp:
- Improved bank name check in multi_usrp::{set,get}_gpio_attr()
- CMake:
- Allow absolute paths for install dirs in pkg-config
- Fix target include path for Python module
- USRP1: Fix converter name in property tree
- FPGA:
- Fix various simulation/testbench issues.
- Improve resource utilization in various places.
- MPM:
- Fix file descriptor leaks by using with/open everywhere.
- Fix double-free issue in rpclib.
- Remove tolerance for non-existing EEPROMs.
- Examples: Properly report errors when opening a file failed.
- Python: When installing into venvs, no longer force a reinstallation of
dependencies.
- Dependencies changes
- Increase minimum required versions
- Boost to 1.71
- DPDK to 19.11
- Changed minimum CMake versions for various non-UHD projects, e.g.
firmware builds, to stay compatible with CMake 4
- Increase minimum required versions
- Documentation
- Restructured the UHD manual, improved chapter structure, improved getting
started content, added RFNoC specification. - Fixed some external links
- Many smaller improvements (typos, duplicate entries removed, formatting,
etc.)
- Restructured the UHD manual, improved chapter structure, improved getting
- Codebase Management
- Increased C++ version to 20 for UHD library, examples, and utilities
- Removed Boost in multiple locations and replaced with standard library
calls - Fix numerous (mostly harmless) compiler and Doxygen warnings
- Improve CMake linking instructions
- Validated OS Environments
(Versions for build and runtime dependencies can be determined from the
docker container definitions in the UHD repository at .ci/docker/...)- Linux:
- Ubuntu: jammy (22.04), noble (24.04), questing (25.10)
- Fedora: 40, 41, 42
- Windows: 10 22H2, 11 24H2
- MacOS: Sequoia (15.6)
- Linux:
UHD 4.10.0.0-RC3
UHD 4.10.0.0 Release Candidate 3
- Highlights / Main Changes
- Support for USRP X420
- Addition of timed complex gain feature, which allows setting a complex gain
value to fix phase and amplitude of signals from radio blocks
- New Features
- CMake:
- Create UHD::uhd package for improved integration in downstream build
processes. The init_usrp example is used to showcase this feature. - Improved options for RFNoC OOT modules to write unit tests.
- Create UHD::uhd package for improved integration in downstream build
- Add helper routines to up- and download data (reliably) from and to the
DRAM block - X310: Allow daughterboards to set dboard clock rate
- Improve finding of MPM-based devices by making parts of the find call
asynchronous and allowing to skip reachability checks. - RFNoC:
- Added new optional feature to all Radio blocks - Timed complex gain:
- Allows specifying complex gain coefficients to be applied to all
TX and/or RX samples of a radio channel at the specified time. - Enabled by default for all TX and RX channels of the radio blocks,
but can be disabled at FPGA build time via theEN_COMP_GAIN_TX
andEN_COMP_GAIN_RXparameters of the radio blocks. - NOTE: For the x440_X4_400 default FPGA design provided with UHD,
enabling this feature for all 8 RX and TX channels necessitated
restricting the existing crossbar connections between the replay
blocks and the radio blocks. As a result, only blocks with the same
indices can be connected (e.g. replay0<->radio0 and replay1<->radio1
only) when using this pre-built USRP FPGA image.
- Allows specifying complex gain coefficients to be applied to all
- Blocks may now drive the front-panel GPIO pins on all RFNoC-capable
devices. New IO signatures are added, and all device BSPs have IO ports
for accessing the GPIOs. Device controls are updated such that the user
can choose the source for GPIOs dynamically in this case (i.e., the
radio blocks and other GPIO sources are still available). In some cases,
the device BSP HDL had to be significantly refactored. - Add names and descriptions for block's and module's YAML files, so that
other tools may read information about those in an automated fashion - Allow
mtustream argument, which overrides the MTU value that is
derived from the link information. - Action handling is now moved to its own thread (there is one action
handling thread per graph). This allows actions to be handled
asynchronously, e.g., when triggering actions from async message handlers. - Add radio_state IO signature, so that other blocks can monitor the ATR
state of radio blocks. - All RFNoC devices can now take an
mtustream argument (which overrides
the detected link MTU) and aforce_mtudevice argument (which skips
automatic MTU detection and forces a fixed value). These are helpful in
scenarios where a specific network topology interferes with path MTU
discovery, and for remote streaming when the MTU for a remote stream link
cannot be inferred from UHD. - rfnoc_modtool has improved support for generating unit tests.
- Add PPS IO signature for all targets
- Add stream command to start receiving when a transmit occurs
- Null source/sink: Add finite mode.
- Add UX1/UX2/UX4 QSFP configurations for X4xx
- Added new optional feature to all Radio blocks - Timed complex gain:
- CMake:
- API Changes
- meta_range_t and uhd::dict can now be initialized from initializer lists
- Add rfnoc_graph::get_chdr_xport_adapters()
- Python API now allows creating SubdevSpec from a string
- Some public APIs that used
boost::optionalnow also work withstd::optional - Unit tests for RFNoC blocks (in-tree and out-of-tree) no longer require a
dummy implementation of~make_args_t() uhd::cast::to_str()was added anduhd::cast::from_str()was extended to
be a full replacement forboost::lexical_cast
- Examples
- Overhauled many of the examples to improve documentation, as well as some
minor conveniences or bug fixes - Added continuous streaming to tx_samples_from_file
- Improved gpio example.
- Overhauled many of the examples to improve documentation, as well as some
- Bug Fixes
- Fix static UHD library builds
- Fix compatibility with Boost 1.89
- RFNoC:
- Fix slicing notation in rfnoc_image_builder
- Fix building of GRC files with empty default target (this would affect
builds of X410 and X440 device bitfiles from GNU Radio) - Fix installation of OOT modules in Python venvs
- Fix time alignment of first sample
- Unit tests in RFNoC OOT modules now preload their DLLs to ensure the
correct library version is loaded - Fix generation of GNU Radio C++ block controllers
- rfnoc_modtool: Fix creation of spurious unit tests, fix package_data for
Python module installation - rfnoc_modtool: Fix connection check for invalid ports
- Fix alignment of first sample coming from radio block.
- Fix bug in ctrlport_endpoint which could cause the software to believe
the associated RFNoC block's command FIFO was full when packets were lost - Add parameter to skip waiting for ACKs in async messages
- E31x: Fix GPIO control
- E3xx/B2xx: Fix rounding bug for RF PLL tuning
- B2xx: Fix image loading via b200_image_loader when multiple devices are
attached - X410: Fix tuning when power calibration and non-default gain profiles are
used. - Power calibration tools: Fix settings for E320, allow non-default sampling
rate, other minor fixes - FPGA
- Fix various simulation-related bugs
- USRP Simulator: Update to match current UHD.
- multi_usrp:
- Improved bank name check in multi_usrp::{set,get}_gpio_attr()
- CMake:
- Allow absolute paths for install dirs in pkg-config
- Fix target include path for Python module
- USRP1: Fix converter name in property tree
- FPGA:
- Fix various simulation/testbench issues.
- Improve resource utilization in various places.
- MPM:
- Fix file descriptor leaks by using with/open everywhere.
- Fix double-free issue in rpclib.
- Remove tolerance for non-existing EEPROMs.
- Examples: Properly report errors when opening a file failed.
- Python: When installing into venvs, no longer force a reinstallation of
dependencies.
- Dependencies changes
- Increase minimum required versions
- Boost to 1.71
- DPDK to 19.11
- Changed minimum CMake versions for various non-UHD projects, e.g.
firmware builds, to stay compatible with CMake 4
- Increase minimum required versions
- Documentation
- Restructured the UHD manual, improved chapter structure, improved getting
started content, added RFNoC specification. - Fixed some external links
- Many smaller improvements (typos, duplicate entries removed, formatting,
etc.)
- Restructured the UHD manual, improved chapter structure, improved getting
- Codebase Management
- Increased C++ version to 20 for UHD library, examples, and utilities
- Removed Boost in multiple locations and replaced with standard library
calls - Fix numerous (mostly harmless) compiler and Doxygen warnings
- Improve CMake linking instructions
- Validated OS Environments
(Versions for build and runtime dependencies can be determined from the
docker container definitions in the UHD repository at .ci/docker/...)- Linux:
- Ubuntu: jammy (22.04), noble (24.04), questing (25.10)
- Fedora: 40, 41, 42
- Windows: 10 22H2, 11 24H2
- MacOS: Sequoia (15.6)
- Linux:
UHD 4.10.0.0-RC1
UHD 4.10.0.0 Release Candidate 1
-
Known Issues
- The utilities uhd_images_downloader and usrp_update_fs fail to locate the filesystem images.
Users must manually download the file system images from:
https://files.ettus.com/binaries/cache/<usrp family>/meta-ettus-v4.10.0.0-rc1
where <usrp family> is one of: e3xx, n3xx, or x4xx.
- The utilities uhd_images_downloader and usrp_update_fs fail to locate the filesystem images.
-
Highlights / Main Changes
- Support for USRP X420
- Addition of timed complex gain feature, which allows setting a complex gain
value to fix phase and amplitude of signals from radio blocks
-
New Features
- CMake:
- Create UHD::uhd package for improved integration in downstream build
processes. The init_usrp example is used to showcase this feature. - Improved options for RFNoC OOT modules to write unit tests.
- Create UHD::uhd package for improved integration in downstream build
- Add helper routines to up- and download data (reliably) from and to the
DRAM block - X310: Allow daughterboards to set dboard clock rate
- Improve finding of MPM-based devices by making parts of the find call
asynchronous and allowing to skip reachability checks. - RFNoC:
- Added new optional feature to all Radio blocks - Timed complex gain:
- Allows specifying complex gain coefficients to be applied to all
TX and/or RX samples of a radio channel at the specified time. - Enabled by default for all TX and RX channels of the radio blocks,
but can be disabled at FPGA build time via theEN_COMP_GAIN_TX
andEN_COMP_GAIN_RXparameters of the radio blocks. - NOTE: For the x440_X4_400 default FPGA design provided with UHD,
enabling this feature for all 8 RX and TX channels necessitated
restricting the existing crossbar connections between the replay
blocks and the radio blocks. As a result, only blocks with the same
indices can be connected (e.g. replay0<->radio0 and replay1<->radio1
only) when using this pre-built USRP FPGA image.
- Allows specifying complex gain coefficients to be applied to all
- Blocks may now drive the front-panel GPIO pins on all RFNoC-capable
devices. New IO signatures are added, and all device BSPs have IO ports
for accessing the GPIOs. Device controls are updated such that the user
can choose the source for GPIOs dynamically in this case (i.e., the
radio blocks and other GPIO sources are still available). In some cases,
the device BSP HDL had to be significantly refactored. - Add names and descriptions for block's and module's YAML files, so that
other tools may read information about those in an automated fashion - Allow
mtustream argument, which overrides the MTU value that is
derived from the link information. - Action handling is now moved to its own thread (there is one action
handling thread per graph). This allows actions to be handled
asynchronously, e.g., when triggering actions from async message handlers. - Add radio_state IO signature, so that other blocks can monitor the ATR
state of radio blocks. - All RFNoC devices can now take an
mtustream argument (which overrides
the detected link MTU) and aforce_mtudevice argument (which skips
automatic MTU detection and forces a fixed value). These are helpful in
scenarios where a specific network topology interferes with path MTU
discovery, and for remote streaming when the MTU for a remote stream link
cannot be inferred from UHD. - rfnoc_modtool has improved support for generating unit tests.
- Add PPS IO signature for all targets
- Add stream command to start receiving when a transmit occurs
- Null source/sink: Add finite mode.
- Add UX1/UX2/UX4 QSFP configurations for X4xx
- Added new optional feature to all Radio blocks - Timed complex gain:
- CMake:
-
API Changes
- meta_range_t and uhd::dict can now be initialized from initializer lists
- Add rfnoc_graph::get_chdr_xport_adapters()
- Python API now allows creating SubdevSpec from a string
- Some public APIs that used
boost::optionalnow also work withstd::optional - Unit tests for RFNoC blocks (in-tree and out-of-tree) no longer require a
dummy implementation of~make_args_t() uhd::cast::to_str()was added anduhd::cast::from_str()was extended to
be a full replacement forboost::lexical_cast
-
Examples
- Overhauled many of the examples to improve documentation, as well as some
minor conveniences or bug fixes - Added continuous streaming to tx_samples_from_file
- Improved gpio example.
- Overhauled many of the examples to improve documentation, as well as some
-
Bug Fixes
- Fix static UHD library builds
- Fix compatibility with Boost 1.89
- RFNoC:
- Fix slicing notation in rfnoc_image_builder
- Fix building of GRC files with empty default target (this would affect
builds of X410 and X440 device bitfiles from GNU Radio) - Fix installation of OOT modules in Python venvs
- Fix time alignment of first sample
- Unit tests in RFNoC OOT modules now preload their DLLs to ensure the
correct library version is loaded - Fix generation of GNU Radio C++ block controllers
- rfnoc_modtool: Fix creation of spurious unit tests, fix package_data for
Python module installation - rfnoc_modtool: Fix connection check for invalid ports
- Fix alignment of first sample coming from radio block.
- Fix bug in ctrlport_endpoint which could cause the software to believe
the associated RFNoC block's command FIFO was full when packets were lost - Add parameter to skip waiting for ACKs in async messages
- E31x: Fix GPIO control
- E3xx/B2xx: Fix rounding bug for RF PLL tuning
- B2xx: Fix image loading via b200_image_loader when multiple devices are
attached - X410: Fix tuning when power calibration and non-default gain profiles are
used. - Power calibration tools: Fix settings for E320, allow non-default sampling
rate, other minor fixes - FPGA
- Fix various simulation-related bugs
- USRP Simulator: Update to match current UHD.
- multi_usrp:
- Improved bank name check in multi_usrp::{set,get}_gpio_attr()
- CMake:
- Allow absolute paths for install dirs in pkg-config
- Fix target include path for Python module
- USRP1: Fix converter name in property tree
- FPGA:
- Fix various simulation/testbench issues.
- Improve resource utilization in various places.
- MPM:
- Fix file descriptor leaks by using with/open everywhere.
- Fix double-free issue in rpclib.
- Remove tolerance for non-existing EEPROMs.
- Examples: Properly report errors when opening a file failed.
- Python: When installing into venvs, no longer force a reinstallation of
dependencies.
-
Dependencies changes
- Increase minimum required versions
- Boost to 1.71
- DPDK to 19.11
- Changed minimum CMake versions for various non-UHD projects, e.g.
firmware builds, to stay compatible with CMake 4
- Increase minimum required versions
-
Documentation
- Restructured the UHD manual, improved chapter structure, improved getting
started content, added RFNoC specification. - Fixed some external links
- Many smaller improvements (typos, duplicate entries removed, formatting,
etc.)
- Restructured the UHD manual, improved chapter structure, improved getting
-
Codebase Management
- Increased C++ version to 20 for UHD library, examples, and utilities
- Removed Boost in multiple locations and replaced with standard library
calls - Fix numerous (mostly harmless) compiler and Doxygen warnings
- Improve CMake linking instructions
-
Validated OS Environments
(Versions for build and runtime dependencies can be determined from the
docker container definitions in the UHD repository at .ci/docker/...)- Linux:
- Ubuntu: jammy (22.04), noble (24.04), questing (25.10)
- Fedora: 40, 41, 42
- Windows: 10 22H2, 11 24H2
- MacOS: Sequoia (15.6)
- Linux:
UHD 4.9.0.1
UHD 4.9.0.1
Changes compared to UHD 4.9.0.0:
- Dependency changes
- Support Boost 1.89.0
- Drop support for boost below 1.71.0
- Fixes
- Fix static build of libuhd
- Notes
- We suggest to only update to this version if the boost 1.89.0 compability
is required. Apart from the Boost build fixes, there are no other changes
in this UHD release.
- We suggest to only update to this version if the boost 1.89.0 compability
UHD 4.9.0.0
UHD 4.9.0.0
-
Highlights / Main Changes
- Support for USRP B206mini-i
- Support for OBX daughterboard
-
New Features
- OBX daughterboard and B206mini support added.
- X3x0: Add support for the gps_iface feature. This allows sending arbitrary
commands to the GPS module. - rfnoc_modtool: Add a new subcommand,
make-yaml, that generates a block
YAML file from some user inputs. When callingrfnoc_modtool addwithout
a valid block YAML file, the tool will now automatically callmake-yamlto
generate a new YAML file. - Added support for processing multiple samples per cycle in FFT block.
- LabVIEW/USRP: New repository containing example applications which
demonstrate how to use NI LabVIEW with USRP devices via the UHD APIs.
(https://github.com/ni/labview-usrp-examples) - Improved RFNoC OOT Block support:
New repository containing official RFNoC OOT Blocks
(https://github.com/EttusResearch/rfnoc-oot-blocks)- Added new RFNoC Aurora Block for TX and RX remote streaming applications
to and from Aurora capable compute nodes like FPGA Coprocessors.
- Added new RFNoC Aurora Block for TX and RX remote streaming applications
- Enhanced the UHD Windows installer to automatically install Windows
driver packages into the OS, eliminating this manual post-installation
step for B-Series USB devices.
-
API Changes
uhd::math::gcdanduhd::math::lcmare removed from the public
headers. Usestd::gcdandstd::lcminstead if C++17 is available,
orboost::math::gcdandboost::math::lcmif not.- When calling
recv()on an RX streamer connected to an RFNoC device, we
no longer artificially inflate the timeout value. The old behaviour was
in some cases abused to detect overruns, but this is not a reliable method
and is now explicitly declared unsupported.
-
Bug Fixes
- RFNoC
- Calling
recv()on an RX streamer connected to an RFNoC device with a
zero timeout value now correctly returns immediately. - rfnoc-gain: Moved the fpga/ subdirectory under rfnoc/. This way, the
directory structure inside the OOT module is identical to the directory
structure after installation.
- Calling
- X410:
- Fixed NCO reset mechanism that caused ADC self-cal errors to occur during
reopening of a UHD session when timed tune commands were previously used.
- Fixed NCO reset mechanism that caused ADC self-cal errors to occur during
- RFNoC
-
Removals / Deprecations
- Removed tools/uhd_dump. This tool is obsolete, the USRP X3x0 is not even
compatible with it any more. Dumps can be recorded and analyzed with wireshark
and the UHD dissectors in here. - Removed network_relay example.
- Removed tools/uhd_dump. This tool is obsolete, the USRP X3x0 is not even
-
Validated OS Environments
(Versions for build and runtime dependencies can be determined from the
docker container definitions in the UHD repository at .ci/docker/...))- Linux:
- Ubuntu: focal (20.04), jammy (22.04), noble (24.04), plucky (25.04)
- Fedora: 40, 41, 42
- Windows: 10 22H2, 11 23H2
- MacOS: Sequoia (15.2)
Binary installer installers for Windows and Linux Fedora are available at https://files.ettus.com/binaries/uhd/uhd_004.009.000.000-release/,
and for Linux Ubuntu through a Personal Package Archive (PPA) at https://launchpad.net/~ettusresearch/+archive/ubuntu/uhd. - Linux:
UHD 4.9.0.0-RC2
UHD 4.9.0.0 Release Candidate 2
- Highlights / Main Changes
- Support for USRP B206mini-i
- Support for OBX daughterboard
- New Features
- OBX daughterboard and B206mini support added.
- X3x0: Add support for the gps_iface feature. This allows sending arbitrary
commands to the GPS module. - rfnoc_modtool: Add a new subcommand,
make-yaml, that generates a block
YAML file from some user inputs. When callingrfnoc_modtool addwithout
a valid block YAML file, the tool will now automatically callmake-yamlto
generate a new YAML file. - Added support for processing multiple samples per cycle in FFT block.
- LabVIEW/USRP: New repository containing example applications which
demonstrate how to use NI LabVIEW with USRP devices via the UHD APIs.
(https://github.com/ni/labview-usrp-examples) - Improved RFNoC OOT Block support:
New repository containing official RFNoC OOT Blocks
(https://github.com/EttusResearch/rfnoc-oot-blocks)- Added new RFNoC Aurora Block for TX and RX remote streaming applications
to and from Aurora capable compute nodes like FPGA Coprocessors.
- Added new RFNoC Aurora Block for TX and RX remote streaming applications
- Enhanced the UHD Windows installer to automatically install Windows
driver packages into the OS, eliminating this manual post-installation
step for B-Series USB devices.
- API Changes
uhd::math::gcdanduhd::math::lcmare removed from the public
headers. Usestd::gcdandstd::lcminstead if C++17 is available,
orboost::math::gcdandboost::math::lcmif not.- When calling
recv()on an RX streamer connected to an RFNoC device, we
no longer artificially inflate the timeout value. The old behaviour was
in some cases abused to detect overruns, but this is not a reliable method
and is now explicitly declared unsupported.
- Bug Fixes
- RFNoC
- Calling
recv()on an RX streamer connected to an RFNoC device with a
zero timeout value now correctly returns immediately. - rfnoc-gain: Moved the fpga/ subdirectory under rfnoc/. This way, the
directory structure inside the OOT module is identical to the directory
structure after installation.
- Calling
- X410:
- Fixed NCO reset mechanism that caused ADC self-cal errors to occur during
reopening of a UHD session when timed tune commands were previously used.
- Fixed NCO reset mechanism that caused ADC self-cal errors to occur during
- RFNoC
- Removals / Deprecations
- Removed tools/uhd_dump. This tool is obsolete, the USRP X3x0 is not even
compatible with it any more. Dumps can be recorded and analyzed with wireshark
and the UHD dissectors in here. - Removed network_relay example.
- Removed tools/uhd_dump. This tool is obsolete, the USRP X3x0 is not even
- Validated OS Environments
(Versions for build and runtime dependencies can be determined from the
docker container definitions in the UHD repository at .ci/docker/...))- Linux:
- Ubuntu: focal (20.04), jammy (22.04), noble (24.04), plucky (25.04)
- Fedora: 40, 41, 42
- Windows: 10 22H2, 11 23H2
- MacOS: Sequoia (15.2)
- Linux:
UHD 4.9.0.0-RC1
UHD 4.9.0.0 Release Candidate 1
-
Highlights / Main Changes
- Support for USRP B206mini-i
- Support for OBX daughterboard
-
New Features
- OBX daughterboard and B206mini support added.
- X3x0: Add support for the gps_iface feature. This allows sending arbitrary
commands to the GPS module. - rfnoc_modtool: Add a new subcommand,
make-yaml, that generates a block
YAML file from some user inputs. When callingrfnoc_modtool addwithout
a valid block YAML file, the tool will now automatically callmake-yamlto
generate a new YAML file. - Added support for processing multiple samples per cycle in FFT block.
- LabVIEW/USRP: New repository containing example applications which
demonstrate how to use NI LabVIEW with USRP devices via the UHD APIs.
(https://github.com/ni/labview-usrp-examples)
-
API Changes
uhd::math::gcdanduhd::math::lcmare removed from the public
headers. Usestd::gcdandstd::lcminstead if C++17 is available,
orboost::math::gcdandboost::math::lcmif not.- When calling
recv()on an RX streamer connected to an RFNoC device, we
no longer artificially inflate the timeout value. The old behaviour was
in some cases abused to detect overruns, but this is not a reliable method
and is now explicitly declared unsupported.
-
Bug Fixes
- RFNoC
- Calling
recv()on an RX streamer connected to an RFNoC device with a
zero timeout value now correctly returns immediately. - rfnoc-gain: Moved the fpga/ subdirectory under rfnoc/. This way, the
directory structure inside the OOT module is identical to the directory
structure after installation.
- Calling
- X410:
- Fixed NCO reset mechanism that caused ADC self-cal errors to occur during
reopening of a UHD session when timed tune commands were previously used.
- Fixed NCO reset mechanism that caused ADC self-cal errors to occur during
- RFNoC
-
Removals / Deprecations
- Removed tools/uhd_dump. This tool is obsolete, the USRP X3x0 is not even
compatible with it any more. Dumps can be recorded and analyzed with wireshark
and the UHD dissectors in here. - Removed network_relay example.
- Removed tools/uhd_dump. This tool is obsolete, the USRP X3x0 is not even
-
Validated OS Environments
(Versions for build and runtime dependencies can be determined from the
docker container definitions in the UHD repository at .ci/docker/...)- Linux:
- Ubuntu: focal (20.04), jammy (22.04), noble (24.04), plucky (25.04)
- Fedora: 40, 41, 42
- Windows: 10 22H2, 11 23H2
- MacOS: Sequoia (15.2)
Binary installer installers for Linux and Windows are available at
https://files.ettus.com/binaries/uhd/uhd_004.009.000.000-rc1 - Linux:
UHD 4.8.0.0
UHD 4.8.0.0
Highlights / Main Changes
- Addition of rfnoc_modtool and further improvements to RFNoC Image Builder
toolsets. This further improves the ability to design RFNoC blocks and
create custom FPGA bitfiles. - Replaced RFNoC FFT block with a new version
- Improved Windows installation capabilities including distribution
of binary Python bindings for Windows though PyPI
New Features
- Image Builder
- Add GRC support. This allows designing RFNoC bitfiles from GNU Radio
Companion (GRC). - Improve clock connection checks and checks for duplicate connections.
- Improve IO port compat check (e.g., check if wire widths match).
- Allow default clocks in domain checks.
- Simplify image core YAMLs by better usage of RADIO_NIPC parameter.
- Improve parameter resolution.
- Improve error messages for missing YAML files.
- Add --SYNTH and --CHECK options.
- Add support for building an FPGA image using multiple parallel jobs and
unique seeds with repeat_fpga_build.py and the --fpga-jobs option. - Add 'q' (or 'quote') filter to YAML files to allow quoting strings.
- Add GRC support. This allows designing RFNoC bitfiles from GNU Radio
- rfnoc-gain (OOT RFNoC example)
- Overhaul directory structure, and rename to rfnoc-gain from
rfnoc-example. - Simplify dynamic loading of OOT DLLs by using the new modules.d feature.
- Add CE clock support to gain block. This enables the example on X4x0.
- Add a GNU Radio subdirectory with examples of how to run the gain block
in GNU Radio.
- Overhaul directory structure, and rename to rfnoc-gain from
- Add rfnoc_modtool. This is a command line utility to help design OOT RFNoC
blocks and replaces the previously available blocktool. - RFNoC
- Add tune requests. This allows tuning a complete graph as known from
multi_usrp instead of single blocks individually. - Replace FFT block with a new version supporting larger FFT sizes and
cyclic prefix insertion and removal.
- Add tune requests. This allows tuning a complete graph as known from
- multi_usrp
- Add Python bindings for get_user_settings_iface()
- General UHD
- Add modules.d support
- Add uhd::find_uhd_command() API call
- Remove old-style Boost.Asio usage for compatibility with future versions
of Boost.
- Embedded Filesystem
- Support for USB Audio devices on E31X, E320, N3XX and X4XX
- Windows binary installer
- Simplified the Windows installer experience by reducing the number of
individual downloads from 4 (for USB devices) to 2, by including
libusb.dll and USB driver installer files into NSIS-built installer
binaries. - Add new cmake feature option called ENABLE_EXTEND_WIN_PACKAGING,
which defaults to off. Enabling this feature will cause a number
of convenience components to be included into the Windows deployment
package (aka. installer).
Enabling this feature has no effect on other platforms. - Added binary Python bindings for Windows installable through PyPI
(pip install uhd)
- Simplified the Windows installer experience by reducing the number of
- Documentation
- Add documentation about relationship of MTU, samples per packet and
atomic item size
- Add documentation about relationship of MTU, samples per packet and
Dependencies changes
- Increase minimum required versions
- CMake to 3.12
- Boost to 1.66
Bug Fixes
- General UHD
- Fix compatibility with DPDK >= 22.11
- Fix compiler warnings for better compatibility with C++17 and 20.
- Add logic for loading uhd.dll from the correct path for Windows with
Python3.8+. - Add logic to warn about potential incompatibilities when importing
Python bindings. - Remove duplicate results from find
- Release GIL when calling find from Python which improves response time
for large setups.
- Python support
- On Windows now also enable building python support if minimum supported
python version is detected. - Changed version number format for build Windows binaries to common
major.api.abi.patch format.
- On Windows now also enable building python support if minimum supported
- MPM
- Allow images without RF frontend (will only be initialized if FPGA
reports availability) - Fix usrp_update_fs to work for all embedded devices (and not just X4xx)
- Allow images without RF frontend (will only be initialized if FPGA
- E320: Ensure consistent sequencing when powering on/off GPSDO
- N310/N300: Fix LO query API for lowband LO
- RFNoC
- RFNoC DDC/DUC block (used in all Gen-3 USRPs and X410): Fix fractional
frequency offset. - Fix AIS/spp calculation (e.g., for connecting FFT blocks).
- Fix USE_IMPL rendering for the addsub block.
- RFNoC DDC/DUC block (used in all Gen-3 USRPs and X410): Fix fractional
- Image Builder
- Fix colors
- Fix error message for missing control SEP
- Improve error reporting for invalid connections
- Accept ~ and ~user on command line
- Fix deprecated usage of yaml.load()
- Ensure correct device tree files generation when choosing a custom build
directory
- rfnoc_modtool
- Fix generation of noc_shells
Validated OS Environments
(Versions for build and runtime dependencies can be determined from the
docker container definitions in the UHD repository at .ci/docker/...)
- Linux:
- Ubuntu: bionic (18.04), focal (20.04), jammy (22.04), noble (24.04)
- Fedora: 39, 40, 41
- Windows: 10 21H2, 11 21H2
- MacOS: Monterey (12.6)