Commit graph

858 commits

Author SHA1 Message Date
Martin Anderseck
c64b9e36cd mpm: Improve fall-back behavior for dual-rate
This fixes the behavior that a non-valid dual-rate config could fall
back to a single-rate configuration with two different converter rates.
With this it also fixes the behavior that with those same master clock
rates we wouldn't run mult-tile sync (as this depends on the converter
rate).
2023-11-06 14:04:11 -06:00
Javier Valenzuela
034dc0803b mpm: x400: make PRC a multiple of both rfdc rates 2023-11-02 08:30:45 -05:00
Javier Valenzuela
7b762b36d0 mpm: x400: Align FPGA revision 2023-10-30 11:22:00 -05:00
Javier Valenzuela
de2eaf3d1a mpm: x400: match HDL PPS updates 2023-10-27 09:20:14 -05:00
Martin Anderseck
42c6828aeb mpm: Disable MTS completely for dual rate
Since in dual rate we cannot use multi-tile sync over all tiles we
disable it completely for all tiles. For 1600 MHz bitfiles this isn't an
issue at all because the two remaining channels have different converter
rates anyway. For 400 MHz bitfiles the channels with the same rate will
not be synced, either, but will most probably have a fixed phase
difference.

Co-authored-by: Martin Braun <martin.braun@ettus.com>
2023-10-25 13:56:34 -05:00
Martin Braun
f215af2ccd x4xx: Add support for auto clock ID
- Update X410 and X440 BSP YAML files to properly index clocks
- Update image core files to declare clock indices
- Update get_clocks() in MPM to return the correct values

This does not include changes to the x400_radio_control block registry.
This change by itself will thus not change behaviour.
2023-10-20 07:30:16 -05:00
Martin Anderseck
68d8734f9c mpm: Add LUT for def. MCR per DSP bandwidth
This change adds a lookup table for the default master clock rate based
on the DSP bandwidth of the FPGA image for X440. Since the default
master clock rate currently is 368.64 MHz and we don't want to change
this for backwards compatibility, we need to have a way to handle lower
bandwidth FPGA images. This is what the LUT provides.
2023-10-19 13:41:25 -05:00
Virendra Kakade
36f6c11ef3 mpmd: fix timekeeper misalignment
Change the syrnchronization order to be following:
- Run the MTS (multi-tile sync) procedure
- Run the timekeeper alignment to next_pps edge
- Run the post timekeeper alignment steps (none for now)

This ensures that any effects caused due to delay adjustments which are
part of the MTS procedure do not affect timekeeper alignment.
Without this change timekeepers on two X4xx devices would be mis-aligned
slightly in a multi-device scenario.

Note that setting all timekeepers to a common time_spec on the next_pps
as a part of post-initialization application code will still align them perfectly.

Signed-off-by: Virendra Kakade <virendra.kakade@ni.com>
2023-10-09 11:01:28 -07:00
Grant Meyerhoff
2b47a83bfa x4xx_bist: replace set_clock_source for x440
set_clock_source for x440 now errors due to potentially decreased spurious performance, the correct way to change clock source now with a new device initialization
2023-09-06 10:09:36 -05:00
Grant Meyerhoff
a3d78ee810 x4xx: get bool for force_reinit arg 2023-09-06 10:09:36 -05:00
Grant Meyerhoff
5da051fffa x4xx: pass reboot mpm command to host on new clock config for x440 2023-09-06 10:09:36 -05:00
Grant Meyerhoff
78156eabfa mpm: move pop_host_tasks to PeriphManagerBase
Move pop_host_tasks function call from just x4xx to all MPM devices so it can be safely called from mpmd_mboard_impl
2023-09-06 10:09:36 -05:00
michael-west
f2b5e9cd1e MPM: Normalize name for gps_locked sensor
Change all references to "gps_lock" to "gps_locked" for consistency
across the code base.  Fixes incorrect use of "gps_lock" for the sensor
name on X4xx.

Signed-off-by: michael-west <michael.west@ettus.com>
2023-08-31 15:19:12 -05:00
Aki Tomita
b70f546ffa mpm: Add revE support to zbx_update_cpld 2023-07-28 11:28:31 -05:00
Martin Braun
efce8fcff9 fixup! mpm: Add LogRuntimeError class 2023-07-11 13:49:34 -05:00
Martin Anderseck
55fd43cc27 SelfCal: Add startup_tile() for cal_mode selection
To follow Xilinx' recommendations for self-cal usage this adds
startup_tile() to the cal_mode selection and we query if the cal_mode
was set properly. Since we do this, on the host side we allow the full
first Nyquist zone to be used for self-cal.
2023-07-07 12:35:55 -07:00
Martin Braun
55379ae7fe mpm: x440: Move clock info logging out of policy
The logging of the final clock settings object is moved into
X4xxClockManager so that no intermediate clock objects are logged.
2023-07-07 12:35:55 -07:00
Javier Valenzuela
ff722cb9c8 mpm: x4xx: add intermediate clocking setting
- Move the configuration of SPLL and MMCM into its own method
- In set_master_clock_rate(), call this with intermediate clock settings
  if we decide that going direct from one clock setting to another would
  cause harm/failures

Co-authored-by: Martin Braun <martin.braun@ettus.com>
2023-07-07 12:35:55 -07:00
Martin Braun
8acae88919 mpm: x4xx: Explicitly pass MCR values to set_sync_source()
Before this commit, set_sync_source() would require the master clock
rate to be set after reclocking, but would pull it out of the
X4xxClockManager object (using the _master_clock_rates attribute). Now,
the new master clock rate is passed to set_sync_source() via the args
argument.

Note that it is still possible (for backward compat) to not provide
a new MCR, in which case the assumption is that the current MCR still
remains valid.
2023-07-07 12:35:55 -07:00
Martin Braun
b6ef88e534 mpm: x4xx: Add master_clock_rates argument to _set_ref_clock_freq()
This avoids unnecessary statefulness of this function and fixes an issue
where during init(), external reference clock frequencies would be
validated against the wrong master clock rates.
2023-07-07 12:35:55 -07:00
Martin Braun
eaba13f86b mpm: x4xx: Add intermediate clock settings to clock policy
This allows the clock policy to determine intermediate clock settings
when going from one MCR setting to another. This can avoid MMCM lock
issues.
2023-07-07 12:35:55 -07:00
Martin Braun
5100c6e01f mpm: x4xx: Add rfdc rate as a sensor to X4xx dboards
This enables querying the converter rate through the sensor API:

```python
>>> U = uhd.usrp.MultiUSRP("type=x4xx")
>>> print(U.get_tx_sensor('rfdc_rate').to_real())
3000000000.0
```
2023-07-07 12:35:55 -07:00
Javier Valenzuela
987f545d94 mpm: x4xx: filter MCR list 2023-07-07 12:35:55 -07:00
Martin Anderseck
b3b5e69b02 SelfCal: Trigger if clocking has changed
This change ensures that ADC selfcal is triggered during session start
if the clocking was reconfigured. So it saves time if several
consecutive sessions are opened with always the same settings.
It also makes the ADC self cal run if in an open session either
set_clock_source(), set_time_source() or set_sync_source() are called
and a clock reconfiguration was triggered by that.
2023-07-07 12:35:55 -07:00
Martin Braun
cd754412e7 mpm: x4xx: Remove internal_temp_sensor
This sensor is undefined and not connected. It probably got into the
codebase by accident or copy&paste.
2023-06-30 10:42:30 -05:00
Martin Anderseck
7f62283fb4 MPM: Updated default MCR for X440
This changes the default master clock rate for X440 to 368.64 MHz which
results in a converter rate of 2.94912 GSps which is in line with what
X410 uses.
2023-06-27 15:35:39 -05:00
Martin Braun
63a13c786c mpm: x4xx: Optimize clock configuration at init
Changes:
- X410 Honors the force_reinit flag now (like N310). When given, it will
  force a reinit of all clocking settings.
- When master_clock_rate is not given, and nothing else changes, then
  clocking configuration will be skipped. This shaves approx. 3s of
  startup time and avoids issues that can occur during clocking
  configuration.
- If anything changes, incl. clock/time source, then full clock
  configuration is still done.
- Multi-tile sync is done in all cases, as that happens outside of init()
2023-06-22 07:14:34 -05:00
Martin Anderseck
dae45a7081 mpm: Update X440 clock policy
This adds all clocking restrictions that are necessary for a stable
operation of the flex-rate feature of X440.
2023-06-21 09:22:41 -05:00
Martin Braun
371c4c139c mpm: Add support for X440/FBX
Co-authored-by: Lars Amsel <lars.amsel@ni.com>
Co-authored-by: Martin Anderseck <martin.anderseck@ni.com>
Co-authored-by: Virendra Kakade <virendra.kakade@ni.com>
Co-authored-by: Javier Valenzuela <javier.valenzuela@ni.com>
2023-06-12 10:27:29 -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
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 Anderseck
c9cdbd4948 fixup! MPM: X4xx: Change reset strategy to cover all X4xx 2023-06-06 08:02:55 -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
Javier Valenzuela
a80f8a8250 mpm: x4xx: Make sysref_delay part of clock policy 2023-05-31 10:17:30 -07: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
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
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
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
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