This warning turned out to be scientifically inaccurate. The actual
auto-coercion of the spp value to the CHDR width is left in place, as it
improves streaming under certain conditions, but we no longer warn if
a user-selected spp value is not aligned with the CHDR width.
Unless the user specifies an spp value in a Tx streamer by means of
a stream argument, the Tx streamer now holds additional logic that
aligns the spp value with the CHDR width. For example, in an X410 100
GbE image, the CHDR width is typically 512 bits, which corresponds to 16
samples (sc16), so spp will default to value that's a multiple of 16.
Previously, the default was to simply use the maximum MTU. However,
there have been circumstances observed where using a non-aligned spp
value causes suboptimal behaviour.
For example, when the CHDR width is 512 bits, and the discovered MTU is
8016 bytes, the default spp value would be 1988 samples per packet.
However, a value of 1984 samples per packet causes the CHDR packet to be
of a length that is a multiple of 64 bytes (== 512 bits) which can
improve performance.
This change does not affect applications where the spp size is already
manually configured, and has almost no influence on use cases where the
CHDR width is 64, because that just means the optimal number of samples
per packet should be even.
Under the hood, the following changes were made:
- The CHDR width is passed into the streamer as a reserved key
(__chdr_width) from the infrastructure.
- After connecting the Tx streamer to the graph, when the MTU is known,
we add a check for the spp value to make it an integer multiple of the
CHDR width if not specifically given (like a "soft atomic item size").
Co-authored-by: Jörg Hofrichter <joerg.hofrichter@emerson.com>
This allows querying the CHDR width for a given device in an RFNoC
graph. The mb_index parameter is mostly for future proofing, given that
the CHDR width must be constant between devices.
Previously, the value from --tx_spp was only used if --tx_spb was not
also provided (basically, it was a default for --tx_spb).
Now, the value from --tx_spp is used as a stream argument for the Tx
streamer. If both --tx_spp and --tx_spb are provided, then
benchmark_rate will split the full burst size (--tx_spb) into packets of
size --tx_spp. Previously, if both parameters were given, and --tx_spb
was bigger than --tx_spp, the actual packet size was determined by the
maximum packet size available at the interface or the --tx_spb value,
whichever was smaller.
This commit also aligns the usage of --tx_sample_align. Previously, it
was only implemented for the multi-streamer use case. Now it works the
same between the multi- and single-streamer use cases, and the
diagnostic output now shows SPP and SPB values for both. If both
--tx_spb and --tx_sample_align are given, we potentially have a conflict,
which the tool now warns about.
When using --random, --tx_sample_align now also applies to all burst
sizes.
Add the patch version number to poetry version. Because UHD uses
the patch number for adding branch information on development branches
we need to save the patch number in some different variable for later
access.
Depending on the build folder poetry build might use build.py
instead of the intended build package which leads to an import error
for "BuildBackendException". To prevent confusion rename the script
to something UHD specific.
This moves the calibration Python utilities into the
uhd Python module (because they have dependencies to
uhd). Also the poetry script adds them as scripts to
the uhd module.
The install Python module is not executed on Windows
systems.
usrpctl, rfnoc image builder and rfnoc modtool are
not affected.
The existing regex that filters the required HDL sources from
Makefile.srcs had an issue where it would identify VHDL files as Verilog
files (because the string 'file.v' is a substring of 'file.vhdl').
The CMake regex engine does not have support for word boundaries, so we
use the greediness of the regex algorithm and search for .vhd(l) first.
Introduce a new parameter --base-dir BASE_DIR.
If the parameters --build-dir BUILD_DIR / --build-ip-dir BUILD_IP_DIR
/ --build-ouput-dir BUILD_OUTPUT_DIR are not set explicitly, they will
be set to these values per default:
- BUILD_DIR=<BASE_DIR>/build-<IMAGE_CORE_NAME>
- BUILD_IP_DIR=<BASE_DIR>/build-ip
- BUILD_OUTPUT_DIR=<BASE_DIR>/build
BASE_DIR defaults to the current directory if the parameter --base-dir
is not set. This means that per default, the build(...) directories
are generated in the current directory.
The directories which are used for the build are printed before
executing the build. However, the build generates hundrets of
lines of output which typically exceeds the scrollback length
of the terminal. Hence, print the directories again after the
build finished.
This example demonstates the cyclic prefix (CP) insertion and removal
capability of the new FFT block. It is intended to be used in cabled
RF loopback. Multiple OFDM symbols with configurable CP length are
transmitted and received. Each OFDM symbols contains a single tone
so that transmitted and received signal can be compared.
The interface of the FFT block controller was extended to include functions for
querying the capabilities and setting cyclic prefix insertion / removal values.
-> Extend the existing fft_block_test (for FFT_BLOCK, RFNoC ID 0xFF700000)
to cover the additional functions.
Also add a new test fft_block_test_v2 which tests the interface of the new
FFT block (FFT_BLOCK_V2, RFNoC ID 0xFF700002).
This replaces the legacy RFNoC FFT block with a new one of the same
name that includes a superset of the original features. New features
include cyclic prefix insertion or removal and FFT sizes up to 64k.
The underlying Xilinx CORDIC IP uses 2 bits for the whole part of its
(X,Y) inputs and its magnitude output. So, having 17 bits means we have
enough precision to represent the entire range of an sc16. The 16-bit
CORDIC is insufficient to cover this entire range.
When instantiating an addsub block, the quotes would get munged,
rendering the parameter as such:
.USE_IMPL(Verilog)
The correct rendering should be:
.USE_IMPL("Verilog")
This leads to Vivado complaining about how the expression `Verilog` is
not known (it should be a string constant).
We fix this by using the recently introduced 'q' filter.
Discussed in https://github.com/EttusResearch/uhd/issues/809.
This sets classifiers in pyproject.toml. Most of them
are static except for the development status. The status
is set to 2 (pre alpha) as a default. Only if UHD_RELEASE_MODE
is set it changes to 4 (beta) if we are on a release canditate tag
or 5 (release) if we are on release tag. If we aren't on any tag
or the tag does not meet the correct formatting we stay on 2
and a warning is issued.
Use new optional feature -DENABLE_EXTEND_WIN_PACKAGING=ON
when building UHD Windows installer. Feature enables packaging
of convinience components into a single NSIS build installer
that is intended for distribution to end users.
Simplifying the Windows installer experience by reducing the
number of individual downloads from 4 (for USB devices) to 2.
Including the libusb.dll into the installer will remove a common
onboarding error.
This change introduces a now, optional cmake feature called
-DENABLE_EXTEND_WIN_PACKAGING=ON, that 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.
The changes to the NSIS itself are trivial and limited to another
license dialog (for libusb redistribution). Most changes were in
the cmake code used by cpack (for which NSIS is the utilized Windows
cpack generator option).
These additional components now controlled via the feature
component are currently:
- incl. of MSVC Runtime binaries into ${RUNTIME_DIR}
- incl. of libusb.dll into ${RUNTIME_DIR}
- incl. of erllc_uhd_winusb_driver into ${PKG_DATA_DIR}/usbdriver
Starting with Boost 1.66 and the corresponding ASIO version, there were
some changes introduced based on the C++ Networking TS. This includes
changes like replacing io_service with io_context, deprecating some
functions, etc. Starting with Boost 1.87, the old style is no longer
supported.
This commit updates all usage of ASIO in a way that makes UHD compatible
with future versions of ASIO. However, this makes UHD no longer
compatible with Boost 1.65 and below.
Summary of changes:
- Replace asio::io_service with asio::io_context
- Replace asio::io_service::strand with
asio::strand<asio::io_context::executor_type>
- This implies using asio::post() instead of asio::strand::post()
- Replace asio::buffer_cast<T>(buf) with static_cast<T>(buf.data())
- Update resolve(query) with new API
- Replace references to endpoint_iterator with resolver::results_type
- Replace ip::address::from_string() with ip::make_address()
Co-authored-by: Jörg Hofrichter <joerg.hofrichter@emerson.com>
Passing samples in packets adds additional constraints. This change
adds documentation for MTU, SPP, AIS, and how they're related.
Co-authored-by: Martin Braun <martin.braun@ettus.com>
Co-authored-by: Wade Fife <wade.fife@ettus.com>
This patch doesn't actually modify the Verilog source files, but as
rfnoc_modtool generates .sv files, and we recommend that, rfnoc-gain is
aligned with this recommendation.