This change updates the RFNoC specification to increase the SeqNum
field from 6 bits to 8 bits. This helps reduce control packet response
sequence number aliasing in cases where packets may be dropped or
reordered. To make this change while keeping the implementation
efficient, the control packet fields have been rearranged to place the
most critical information first and to avoid splitting fields across
word boundaries.
Additionally, compared to the previous version of the specification (as
of UHD 4.10), a new ReqSize field has been added. This field represents
the read request size.
The DataLength field that briefly existed in the change history has
been removed. In the new version, NumData represents the number of data
words present in the control packet (the same meaning as in the
original RFNoC specification), while ReqSize indicates the number of
words requested to be read. This means that a large read request can be
issued without including dummy data in the request (e.g., ReqSize = 15
while NumData = 0).
See separate commits for the corresponding FPGA and host code changes.
This PR fixes a bug in the goto cleanup waterfall within rx_samples_c.
Previously, the free_rx_streamer label was positioned above the
free_rx_metadata label. Because C executes sequentially, if an error
occurred after the metadata was successfully created (for example,
during uhd_usrp_set_rx_rate or uhd_usrp_get_rx_stream), the code would
jump to free_rx_metadata, fall through to free_usrp, and exit. It
completely skipped free_rx_streamer, silently leaking the streamer
memory and leaving the hardware handles dangling.
Changes:
- Reordered the cleanup labels to strictly follow the reverse-chronological
order of resource creation (Metadata -> Streamer -> USRP).
- Updated the corresponding EXECUTE_OR_GOTO jump targets for the stream
setup functions to match the new waterfall order.
The axi_fifo_2clk module uses a generic FIFO macro from Xilinx. This allows
custom widths and depths to be specified. It removes the need for combinatorial
logic to connect multiple smaller IP blocks to form a wider data path FIFO.
While in all GPIO code, 12 is the offset from Port A to Port B, the
SPI engine for X4xx used to have 16 since the last rework of this
code, directly reflecting addresses from the FPGA. This commit fixes
this.
UHD creates two gRPC clients per MPM session (main rpc + claimer)
against the same address with identical ChannelArguments. Under
gRPC's default global subchannel pool they share one HTTP/2 transport,
so destroying any one client (an old claimer from reset_claim_loop(),
a discovery probe, or a freed prior session) can tear down the
connection under the active claimer. Its next Reclaim then fails
with error "Socket closed", the claim loop exits, MPM expires the
claim, and the main client's next RPC fails with "Invalid token"
-- causing tests like PhaseCoherence to fail.
Fix: set GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL=1 in the rpc_client_impl
constructor so each channel owns its own subchannel/transport.
Destroying any client now tears down only its own connection; the
active claimer's transport and claim are untouched. This eliminates
both the Socket closed and the follow-up Invalid token.
Also add MPM_CLIENT client-id/thread-id diagnostic debug/trace logs.
Fix an issue in which the most-significant word could be overwritten
with cached data when ctrlport_reg_rw is used in coherent mode. Also
fix per-word byte-enable handling for wide registers.
Fix the coherent-read cache width in ctrlport_reg_ro to match the
padded register width.
Thanks to GitHub user NobleBrutus for pointing out the coherency bug
and suggesting a fix.
add helper to clear pending db ADCSelfCal host tasks
clear any existing ADC SelfCal tasks in init() when
skip_adc_selfcal is enabled
prevent restart_tiles() from re-scheduling
ADC SelfCal tasks when skip_adc_selfcal=1
log when ADC self-cal task scheduling is intentionally skipped
The following IP blocks are removed:
- lib/ip/complex_multiplier: This was only used in rfnoc-gain (but not
anymore).
- lib/ip/dds: This had been designed out a while ago.
- x300/ip/input_sample_fifo: This was also unused.
Unused IP is a drag on builds and Vivado upgrades.
This removes the option to use IP in-tree, because the IP in use is not
useful for UHD overall, and it doesn't have much utility for the example
either. By removing it from the example, we allow for the IP to be
deleted.
- Some devices don't automatically cycle through the UART buffer in the background, so may have stale data when the user wants to read GPS sensors. This signals that a flush needs to happen so that stale data isn't used for determining GPS lock, time, etc.
Added two different behaviours for AXIS BFM when reset is asserted:
- TRUNCATE_PACKET: ignores the TREADY from the DUT and progresses
through the rest of the data in the current packet.
This was and still is the default behaviour.
- DISCARD_PACKET : discards the rest of the packet in-flight and
moves to the next one. This prevents partial
packets from the master persisting after a reset.
GetDboardSampleRate and GetDboardSampleRate rpc methods are not
dispatching per dboard because of missing db_idx field in the proto
definition. This means rpc is setting these rates for only single
dboard.
This change fixes dboard based dispatching for these rpc methods
from host client.
When running `rfnoc_modtool make-yaml`, the generated YAML will contain
an incorrect make_var entry under fpga_includes. This fixes it to
contain the blockname rather than the module name.
host:
Replace the msgpack-RPC (rpclib) client with a gRPC-based
implementation. Add auto-generated C++ client and Python bindings
from protobuf definitions. Remove rpclib dependency and integrate
FindgRPC into CMake.
mpm:
Replace the msgpack-RPC server with a gRPC server generated from
protobuf definitions. Add pb_utils.py for type conversion between
Python and protobuf. Update rpc_server.py to dispatch calls via
gRPC stubs. Update mpm_shell to use gRPC. Replace pyudev with sysfs
scan in uio device discovery.
Bump MPM compatibility number to 7.0 and RPC version to 2.
This change requires new depedencies. E.g. for Ubuntu 24.04 or 25.10:
libgrpc++-dev, libprotobuf-dev, protobuf-compiler-grpc, python3-grpcio
- Add section on external clocking in X4xx manual
- Add links to the new section
- Fix some minor typos in clocking-related sections
- Clarified that full reinit occurs when a ref-lock-loss event is
registered
This is a safety precaution, until parallel initialization has been
vetted for all MPM devices, we print a warning for parallel init and
make it an opt-in features (the `init_threads` argument needs to be
passed as a device argument to use parallel initialization).
Note this feature has been tested on X440 with positive results.