How to Bind Driver to RTL in PYNQ3?

I just upgraded my ZCU111 from PYNQv2.7 to PYNQv3.0.1 and @baileyji and I are having issues getting an RTL driver to bind correctly. I am using a bitstream compiled with Vivado 2022.1.

In my overlay I have an RTL block axis2mm inside a hierarchy capture.

In PYNQ2.7 the axis2mm RTL block shows up as an IP inside the hierarchy along with some HLS IP:

>> ol.capture.description['ip'].keys()
>> dict_keys(['filter_iq_0', 'filter_iq_1', 'axis2mm', 'filter_phase_0', 'filter_phase_1'])

The axis2mm IP is automatically bound to pynq.DefaultIP and we use the read write methods for MMIO.

In PYNQ3.0.1 it’s not showing up in ol.capture.description['ip'] it’s now in ['hierarchies']

>> ol.capture.description['hierarchies']
>> dict_keys(['axis2mm', 'switchboard'])

Note switchboard is an intended sub-hierarchy and inside switchboard is an HLS IP which PYNQ correctly detects. The core issue appears to be ol.capture.description['hierarchies']['axis2mm'] has no IP.

>>{'ip': {},
 'memories': {},
 'hierarchies': {},
 'interrupts': {},
 'gpio': {},
 'fullpath': 'capture/axis2mm',
 'device': <pynq.pl_server.embedded_device.EmbeddedDevice at 0xffffb46a9d50>,
 'driver': <function pynq.overlay.DocumentHierarchy(description)>,
 'overlay': <pynq.overlay.Overlay at 0xffff987727a0>}

Is there a workaround or new way to bind a driver to an RTL IP in PYNQ3?

1 Like

Hi Jenny,

Can you try running the following command on your ZCU111 and seeing if it helps your problem?

python3 -m pip install pynqmetadata --upgrade

After upgrading you might need to restart the board, or run the following in a jupyter notebook to clear any cached metadata:

from pynq import PL

All the best,

Hi Shane,

Thanks for your response. I tried your command and it looks like pynqmetadata is already up to date.

root@pynq:/# python3 -m pip install pynqmetadata --upgrade
Requirement already satisfied: pynqmetadata in /usr/local/share/pynq-venv/lib/python3.10/site-packages (0.3.1)
Requirement already satisfied: pydantic in /usr/local/share/pynq-venv/lib/python3.10/site-packages (from pynqmetadata) (1.9.1)
Requirement already satisfied: jsonschema>=3.2.0 in /usr/local/share/pynq-venv/lib/python3.10/site-packages (from pynqmetadata) (4.9.0)
Requirement already satisfied: attrs>=17.4.0 in /usr/lib/python3/dist-packages (from jsonschema>=3.2.0->pynqmetadata) (21.2.0)
Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /usr/local/share/pynq-venv/lib/python3.10/site-packages (from jsonschema>=3.2.0->pynqmetadata) (0.18.1)
Requirement already satisfied: typing-extensions>= in /usr/local/share/pynq-venv/lib/python3.10/site-packages (from pydantic->pynqmetadata) (4.3.0)

Power cycled the board just in case and no dice. I’m still seeing the RTL block as a hierarchy with no IP.

Hiya Jenny,

Thanks for trying this. Would you mind sending me your HWH file so that I can take a look, either on here or DM’ing it to me?

No sure it will help but, would you mind also trying uninstalling and reinstalling pynqmetadata on your ZCU111 from within a Jupyter terminal (or a root ssh terminal where you have sourced /etc/profile.d/

All the best,


I’ve included my ZCU111 bitstream and hwh. No luck on uninstalling and reinstalling pynqmetadata. Thanks for taking a look!

-Jenny (6.1 MB)

1 Like

Thank you @stf for solving this! In case anyone has issues this worked for me:
In a jupyter notebook terminal run:

python3 -m pip uninstall pynqmetadata
python3 -m pip cache purge
python3 -m pip install pynqmetadata

Then either reboot the board or run:

from pynq import PL

Now I see the RTL IP showing up as an IP inside the hierarchy as expected. :slight_smile: