Commit Graph

10314 Commits

Author SHA1 Message Date
Wade Fife
0e50a37b5e fpga: x400: sim: Add 10 GbE with wide CHDR
Adds simulation coverage for 10 GbE with 512-bit CHDR bus.
2023-06-11 12:58:25 -05:00
Wade Fife
f0ed58f751 fpga: lib: Fix IPv4 CHDR TUSER width
Fix the TUSER width for some buses in eth_ipv4_chdr_adapter. This
allows wider CHDR widths to be used with 10 GbE.
2023-06-11 12:58:25 -05:00
Martin Anderseck
ffb0644d4f rfnoc: Fix doxygen comments in rfnoc_graph 2023-06-10 09:59:34 -05:00
Martin Anderseck
30a2374222 lib: mb_controller: Minor fixes to logging, formatting 2023-06-10 09:59:34 -05:00
Martin Braun
cd5254c8cf mpm: rfdc: Enhance converter checks
This adds two changes:
- We assert that tile 0 / block 0 is always enabled for both ADC and
  DAC, even if not required by the daughterboard or RFNoC configuration
  to ensure it can be used as a reference in MTS.
- The converter-enable check also logs more info on the tiles like this:

```
tile/block | ADC | DAC | Notes
-----------+-----+-----+------
0/0        |  1  |  1  | RX Channel 2. TX Channel 0. MTS ref tile.
0/1        |  1  |  1  | RX Channel 1. TX Channel 3.
0/2        |  0  |  1  | TX Channel 1.
0/3        |  0  |  1  | TX Channel 2.
1/0        |  1  |  1  | RX Channel 3. TX Channel 4.
1/1        |  1  |  1  | RX Channel 0. TX Channel 7.
1/2        |  0  |  1  | TX Channel 5.
1/3        |  0  |  1  | TX Channel 6.
2/0        |  1  |  0  | RX Channel 6.
2/1        |  1  |  0  | RX Channel 5.
2/2        |  0  |  0  |
2/3        |  0  |  0  |
3/0        |  1  |  0  | RX Channel 7.
3/1        |  1  |  0  | RX Channel 4.
3/2        |  0  |  0  |
3/3        |  0  |  0  |
```
2023-06-09 13:40:38 -05:00
Martin Braun
1415cc1ebb mpm: Add LogRuntimeError class
This inherits RuntimeError and saves from logging and throwing in
separate steps. Instead of

```python
log.error("Error X occured!")
raise RuntimeError("Error X occured!")
```
do
```python
raise LogRuntimeError(log, "Error X occured!")
```
2023-06-09 13:40:38 -05:00
Wade Fife
ad3d614426 fpga: lib: Fix Vivado warnings 2023-06-09 09:01:04 -05:00
Martin Anderseck
7382cde9a4 MPM: Demote sync_tiles() error to warning
This demotes the sync_tiles() error to a warning to be consistent with
what the code does. We only raise a RuntimeError if the tile latencies
are not equal for all tiles, which is a little bit later. This is where
an error log was added now.
sync_tiles() may fail with some rare user configurations but it won't
make the device unusable for all use-cases. Therefore a warning is okay
in that place while bad latencies lead to an error.
2023-06-07 20:29:02 -05:00
Martin Braun
04b1f73631 mpm: x4xx: Move SPLL sync before RFDC config
This changes the clock-configuration order of operations such that all
SPLL-related settings are applied first (including syncing R-dividers to
PPS), and only then are MMCM and RFDC configured.

Previously, syncing R-dividers would happen after everything was
configured.
2023-06-07 07:51:21 -05:00
Martin Braun
c0ca74f206 mpm: x4xx: Improve SPLL comments 2023-06-07 07:51:21 -05:00
Martin Braun
50f7d064ea mpm: x4xx: Enable DBs to have updateable_components
This adds an updateable_components overridable dictionary into the
daughterboards base class.

On X410, because some of the FPGA compatibility stems from DB-specific
components, they are moved into class ZBX.
2023-06-06 16:11:36 -05:00
Martin Braun
9b59aaab4e ci: Default to internal fileserver for FPGA images 2023-06-06 13:38:47 -05:00
Martin Anderseck
c9cdbd4948 fixup! MPM: X4xx: Change reset strategy to cover all X4xx 2023-06-06 08:02:55 -05:00
Aki Tomita
4a2f8070c7 ci: Fix the chocolately version to use 2023-06-05 13:18:33 -05:00
Marian Koop
e24aaffdf4 multi_usrp: rfnoc: Added warning when handling tune_request
New warning informs user if a tune_request requests lo_offset
and rfnoc device does not contain DSP to apply this request.
Additionally the requestsed lo_offset is ignored and the radio
is tuned to the target frequency (fe_freq + offset_freq).
2023-06-05 07:49:41 -05:00
Martin Anderseck
63b587ab9d MPM: X4xx: Change reset strategy to cover all X4xx
This change fixes issues with the reset strategy for devices that don't
use default clocking parameters. That used to cause issues when
restarting the tiles and made those devices have some bigger variations
in power measurements. For X410 this should not change the behavior
compared to uhd master.
2023-06-02 12:35:15 -05:00
Martin Braun
bb7f974ff2 fpga: ci: Include modified manifest in artifacts 2023-05-31 10:21:33 -07:00
Javier Valenzuela
a80f8a8250 mpm: x4xx: Make sysref_delay part of clock policy 2023-05-31 10:17:30 -07:00
Marian Koop
6ea98bc6e2 uhd: multi_usrp: Support multiple timekeepers on rfnoc devices
Extended get/set_time_* implementations to support multiple
timekeepers running at the same clock rates.
Puplic get function now use private implementations that are
aware of multiple timekeepers and continue to check only for
tk 0.
Public set functions were extended to update all timekeepers
to a similar timespec. This best effort may still result in
some asynch variance.
The function set_time_unknown_pps was extended to verify all
time registers, incl. multiple TK per mboard. This
verification code is very similar, but less sophisticated
then code found in mb_controller::synchronize >> sync_tks
and may take a long time if many devices are in the same
MultiUsrp session.

Changes were made in response to X440 test failure for test
failure on ch 4 in test test_examples_txrx_loopback_to_file.
2023-05-27 08:06:45 -05:00
Martin Braun
c45efbd57d mpm: x4xx: Add logging for metal and rfdc versions 2023-05-26 16:26:12 -05:00
Grant Meyerhoff
6e44588305 Revert "mpm: x4xx: Separate RFDC clock and tile reset"
This reverts commit 85c741bc71.
2023-05-26 07:39:35 -05:00
Ryan Marlow
adceebe070 fpga: lib: Add ctrl_port_to_wb_i2c module
This module wraps i2c_master_top to provide a CtrlPort Interface.
2023-05-25 07:08:07 -05:00
michael-west
c52683e5fc UBX: Shift IF for RX frequencies <100 MHz
The filter for the IF is centered at 2440 MHz with a bandwidth of 84
MHz.  This means that the LO for the IF is in the pass band for
frequencies under 42 MHz.  The IF was being shifted 60 MHz for
frequencies under 100 MHz, but this was causing distortion in the filter
response from being too close to the filter edge.  This change shifts
the IF for frequencies under 42 MHz such that the LO is at the edge of
the pass band and uses the standard 2440 MHz IF for frequencies between
42 MHz and 100 MHz.

Signed-off-by: michael-west <michael.west@ettus.com>
2023-05-24 20:10:43 -05:00
Martin Braun
a2b752c0a4 lib: Mark select x400_dboard_iface methods as const 2023-05-24 16:54:04 -05:00
Javier Valenzuela
472eb77038 mpm: x4xx: add multiple latency detect iterations
This implements feedback from Xilinx who recommend several measurements
of the tile latency to get a better worst-case estimate.
2023-05-24 08:07:05 -05:00
Martin Braun
85c741bc71 mpm: x4xx: Separate RFDC clock and tile reset
This adds X4xxRfdcCtrl.reset_tiles(), which resets all enabled tiles and
sets their registers and settings back to initial defaults. The same
functionality was previously implemented in reset_rfdc(), but we want to
be able to reset the RFDC clocks without clearing all registers.

During device initialization, however, we retain this reset of all tiles
by modifying the initialization sequence.
2023-05-24 08:06:12 -05:00
Martin Braun
f3ec9fd368 mpm: x4xx: Add additional args parsing in init()
Before this change, we indiscriminately first set the sync source in
init(), then the master clock rate again (it is already set in
set_sync_source(), albeit to a potentially older value).

This adds checks to the args to see if things have actually changed, and
sets all settings in one go.
2023-05-24 08:06:12 -05:00
Martin Braun
009cb8b4c5 mpm: x4xx: Separate RFDC reset from its configuration 2023-05-24 08:06:12 -05:00
Martin Braun
ec88e86e1a images: Update X410 manifest
This includes bitfiles with compat number 8.0.
2023-05-23 14:25:47 +02:00
Javier Valenzuela
c1d268917e mpm/fpga: x4xx: Major updates in preparation for future devices
FPGA:
- Split up MB registers that control daughterboard specific settings so
  that daughterboards 0 and 1 could have different setings, in
  preparation for future devices that require different settings.
  This requires a compat number bump to 8.0.
- Add registers for additional RFDC information, including the
  block/tile mapping of the individual channels, and information about
  resampling capabilities
- Identify sections of code that would be specific to X410/ZBX and move
  them to their own headers, so it's trivial to add device-specific
  sections of code instead for other devices in the future.
  - This includes constraints for clocks and I/O pins.
- Remove ability to do timed ctrlport transactions to the MB CPLD, this
  was unused and possibly broken.
- Move daughterboard-specific code into its own code location
  (dboards/zbx)
- Move X410-specific register documentation to its own location
  (doc/X410)
- Refactor Makefiles to split out X410/ZBX specific components and allow
  switching between device types
- Add 512-bit AXI interconnects
- Make number of timekeepers configurable (X410 keeps the single
  timekeeper)

MPM:
- Required compat is bumped to 8.0
- Now supports new registers for detecting DSP capabilities and
  multi-rate settings for the daughterboards
- Adds MMCM controls (currently unused)

Co-authored-by: Wade Fife <wade.fife@ni.com>
Co-authored-by: Ryan Marlow <ryan@lmarlow.com>
Co-authored-by: Martin Braun <martin.braun@ettus.com>
Co-authored-by: Humberto Jimenez <humberto.jimenez@ni.com>
2023-05-23 09:06:17 +02:00
Javier Valenzuela
e2a79712a7 fpga: x4xx: Refactor MB CPLD code for future devices 2023-05-23 09:05:27 +02:00
Martin Braun
7a394fd996 rfnoc: Improve Doxygen for sync calls
Improves the documentation for rfnoc_graph::synchronize_devices() and
mb_controller::synchronize().
2023-05-22 18:28:16 -05:00
Martin Braun
eb95d7f166 rfnoc: Fix sync calls for multi-timekeeper operation
Introduces the following changes:
- When mb_controller::synchronize() is called, *all* timekeepers are
  synchronized to the same PPS, not just the first one
- On failure, logging prints the TK index as well as the motherboard
  index
- If a single motherboard is initialized, we also check for multiple
  timekeepers, and if more than one timekeeper is present, we do
  a regular synchronization on that device to internal PPS instead
  of simply resetting the timekeeper to zero.
- If multiple boards with multiple timekeepers each are initialized in
  a session with unsynchronized USRPs (e.g., the 'internal' clock source
  is used) then we make sure that timekeepers within a motherboard are
  still synchronous.

Co-authored-by: Marian Koop <marian.koop@ni.com>
2023-05-22 18:28:16 -05:00
Martin Braun
5d98ef2b62 mpm: x4xx: Enable MMCM configuration based on policy 2023-05-22 18:27:23 -05:00
Martin Braun
f5bf1eec9c mpm: x4xx: Enable MPM sync API for X410
This will dynamically set tile latencies, but in a way that multiple
devices stay synchronized.
2023-05-22 18:27:23 -05:00
Martin Braun
63ba6b1c49 mpm: x4xx: Separate RFDC and MMCM resets
Resetting MMCM and RFDC separately will become a requirement once we
start to also program the MMCM. As of now, it is merely a refactoring,
and we continue to use default MMCM settings.
2023-05-22 18:27:23 -05:00
Martin Braun
8120db602a mpm: x4xx: Shut down tiles on tear_down()
- Adds startup_tiles() and shutdown_tiles()
- The latter is called on tear_down() to be compliant with Xilinx'
  documentation on bitstream reconfiguration
2023-05-22 18:27:23 -05:00
Martin Braun
776d5564ef fpga: ci: Add X410_UC_200 to default bitfiles
This bitfile is part of the default manifest.
2023-05-22 17:18:54 -05:00
Martin Braun
cdc8158112 mpm: utils: Add LogWrapper
This is a debugging utility for MPM, where gdb-based debugging sometimes
leads to issues with timing. To use it, replace class instantiations
such as:
```python
c = SomeClass(arg1, arg2)
```
with
```python
c = LogWrapper(
    parent_log.getChild("SomeClass"), "info", SomeClass(arg1, arg2))
```

The class can be used as before, but the MPM log will include calls with
arguments, return values, and execution times, like this:

```
[MPM.PeriphManager.rfdcctl] [INFO] set_if(1, 0, True, 1058240000.0)
[MPM.PeriphManager.rfdcctl] [INFO] --> True [Execution time: 0.108 ms]
```
2023-05-22 13:30:35 -05:00
Martin Braun
387c2ab581 mpm: x4xx: rfdc: Pull fabric words value from registers
This replaces a hard-coded table of fabric word values (the number of
SPCs from the gearbox FIFO) with a value read back from the RFDC
registers.
2023-05-22 09:09:32 -05:00
Martin Braun
b586a615b5 mpm: x4xx: Refactor x4xx_rfdc_ctrl
Move the converters into more manageable data structures for easier
future access when we need to do more complex settings with the RFDCs.
2023-05-22 09:09:32 -05:00
Martin Anderseck
628b5744d9 MPM: Disable PRC to DB if not required
This change adds a flag to the clock policy that tells the sample PLL to
enable or disable the PLL ref clock (PRC) that goes to the
daughterboards. While for X410 the PRC is required, future USRPs may not
want the clock signal to propagate to the board.
2023-05-22 08:14:23 -05:00
Martin Braun
b1f2858250 mpm: x4xx: rfdc: Add get_converter_rate() API 2023-05-20 11:12:51 -05:00
Martin Braun
d398a02da7 mpm: x4xx: Prepare clock management for multi-mcr
This by itself does not enable dual-rate (or multi-mcr), but it
refactors the code to enable it in the future. Additional changes may be
required.

X4xxClockMgr is renamed to X4xxClockManager.
2023-05-20 11:12:51 -05:00
Martin Braun
e398d13d67 examples: Remove default --ref and --pps values
This changes the behaviour of the examples in a way that leaving
out the --ref argument will not force it to be 'internal'. Previously,
the following command:

    rx_samples_to_file --args type=xxx,clock_source=external

would still use the internal reference, because the default value for
--ref was internal, and no other value for --ref was provided. Even
worse, the following command:

    rx_samples_to_file --args \
        type=xxx,clock_source=external,time_source=external

might throw errors/warnings, because internal clock source plus external
time source is generally not supported, and the example would force the
clock source to be internal unless `--ref internal` was also provided.

For all cases that `clock_source` or `time_source` were not given as
a device argument, this is a no-op because `internal` is the default
value anyway.

In two examples, this includes minor code changes:
- In rfnoc_radio_loopback, if both --ref and --pps were given, we now
  use set_sync_source() to speed up setting the reference sources. On
  the N310/N300 series in particular, this saves a few seconds at
  initialization over the previous implementation (which set clock and
  time reference separately).
- In test_dboard_coercion, the code would fail without a default value
  for --ref, so we no longer require such a default value.
2023-05-19 08:52:20 -05:00
Martin Braun
cf1b65143d mpm: x4xx: Let RFDC control use clock policy
Before this change, x4xx_rfdc_ctrl.py had various backdoors to read out
required settings. Now that we have the clock policy object, we can
simply read them out from there.

This obviates some code paths (get_rfdc_resampling_factor(),
get_default_mcr(), set_rfdc_reset_cb()).
2023-05-17 13:16:27 -05:00
Martin Braun
3246aec020 mpm: x4xx: Check for tear_down()'s existence
On tear_down() (this is most commonly seen by users when updating the
FPGA image), we add a check to verify that subcomponents of the X4xx are
actually initialized, to avoid displaying a non-fatal error message that
looks like this:

[ERROR] [MPM.RPCServer] Error in update_component while resetting:
    'NoneType' object has no attribute 'tear_down'

The most common/easy way to trigger this error is by loading MPM with
a bitfile that has an invalid compat number (which would stop MPM from
initializing the RFDC controls) and then running `uhd_image_loader`
(which would force a tear_down()). In that circumstance, MPM would try
to call tear_down() on an uninitialized object.
2023-05-17 13:14:35 -05:00
Martin Braun
040d4bb0df mpm: x4xx: Factor clock control out of X4xxClockManager
This splits up x4xx_clk_mgr.py into PLL controls (which go into
x4xx_clock_ctrl.py) and just clock management (which stays in
x4xx_clk_mgr.py).
2023-05-16 18:18:56 -05:00
Martin Braun
8fdbcac6f0 mpm: x4xx: Trust the clock policy's default MCR
This removes a duplicate get_default_mcr() implementation.
2023-05-16 10:47:11 -05:00
Martin Braun
f22b392a00 mpm: x4xx: Rename 'both' argument to 'all'
All call sites that use 'both' as an argument for channel numbers now
use 'all', in preparation for daughterboards that have more than
2 channels.
2023-05-16 10:47:11 -05:00