Thank you for your advice! I reconstruct my project like this:
I package my PL part as an IP “eva_pl”. And in order to assign the address for AHB, when packaging I pack my AHB interface and create an address block for it. So I can assign addresses in BD.
But I get the following error when loading overlay:
---------------------------------------------------------------------------
UnexpectedPortTypeError Traceback (most recent call last)
Input In [3], in <cell line: 3>()
1 # from pynq import allocate, Overlay
2 # import pdb; pdb.set_trace()
----> 3 eva=Overlay("/home/root/jupyter_notebooks/eva/EVA.xsa")
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynq/overlay.py:319, in Overlay.__init__(self, bitfile_name, dtbo, download, ignore_version, device, gen_cache)
315 super().__init__(bitfile_name, dtbo, partial=False, device=device)
317 self._register_drivers()
--> 319 self.device.set_bitfile_name(self.bitfile_name)
320 self.parser = self.device.parser
322 self.ip_dict = (
323 self.gpio_dict
324 ) = (
325 self.interrupt_controllers
326 ) = self.interrupt_pins = self.hierarchy_dict = dict()
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynq/pl_server/device.py:118, in Device.set_bitfile_name(self, bitfile_name)
116 def set_bitfile_name(self, bitfile_name: str) -> None:
117 self.bitfile_name = bitfile_name
--> 118 self.parser = self.get_bitfile_metadata(self.bitfile_name)
119 self.mem_dict = self.parser.mem_dict
120 self.ip_dict = self.parser.ip_dict
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynq/pl_server/embedded_device.py:690, in EmbeddedDevice.get_bitfile_metadata(self, bitfile_name, partial)
689 def get_bitfile_metadata(self, bitfile_name:str, partial:bool=False):
--> 690 parser = _get_bitstream_handler(bitfile_name).get_parser(partial=partial)
691 if parser is None:
692 raise RuntimeError("Unable to find metadata for bitstream")
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynq/pl_server/embedded_device.py:268, in BitstreamHandler.get_parser(self, partial)
266 parser = XclBin(xclbin_data=xclbin_data)
267 elif is_xsa:
--> 268 parser = RuntimeMetadataParser(Metadata(input=self._filepath))
269 if xclbin_data is None:
270 xclbin_data = _create_xclbin(parser.mem_dict)
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynqmetadata/frontends/metadata.py:41, in Metadata(input)
39 return HwhFrontend(_hwhfile=input)
40 elif str(input).endswith(".xsa"):
---> 41 return XsaFrontend(input=input)
42 elif str(input).endswith(".json"):
43 return JsonFrontend(input=input)
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynqmetadata/frontends/xsa_frontend.py:24, in XsaFrontend(input)
22 xsa = XsaParser(input)
23 xsa.load_bdc_metadata()
---> 24 md = HwhFrontend(_hwhfile=xsa.defaultHwhPaths[0])
25 md.ext["xsa"] = XsaObjectExtension(xsa=xsa)
26 for b in md.blocks.values():
File <string>:25, in __init__(self, name, type, generic_type, _parent, _children, ref, ext, _timestamp, hierarchy_name, ports, parameters, blocks, modules, busses, _hierarchies, _hwhfile, _element_tree, _root, _logical2physical_portmap, _physical2logical_portmap, _logical2physical_extern_pm, _physical2logical_extern_pm)
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynqmetadata/frontends/hwh_frontend.py:219, in HwhFrontend.__post_init__(self)
207 """
208 Performs the parsing of the hwh into the metadata model
209 * checks to see if the hwhfile is an XML string or a
(...)
216 * Performs a connectivity pass
217 """
218 if self._hwhfile != "":
--> 219 self.parse()
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynqmetadata/frontends/hwh_frontend.py:240, in HwhFrontend.parse(self)
237 self._construct_logical2physical_extern_pm()
238 self._create_external_ports()
--> 240 self.resolve_addressing()
241 self.connect_signals()
243 self.refresh()
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynqmetadata/frontends/hwh_frontend.py:611, in HwhFrontend.resolve_addressing(self)
604 def resolve_addressing(self) -> None:
605 """
606 For all the subordinate ports in the design and manager ports
607 grab all the addressing information
608 WARNING: This should only be called after all the cores and ports
609 have been populated.
610 """
--> 611 self._resolve_subordinate_addressing()
612 self._populate_subordinate_regmap()
613 self._resolve_manager_address_maps()
File /usr/local/share/pynq-venv/lib/python3.10/site-packages/pynqmetadata/frontends/hwh_frontend.py:473, in HwhFrontend._resolve_subordinate_addressing(self)
471 port.range = (int(i.get("HIGHVALUE"), 16) - port.baseaddr) + 1
472 else:
--> 473 raise UnexpectedPortTypeError(
474 f"Expected {port.ref} to be SubordinatePort when assigning base address"
475 )
UnexpectedPortTypeError: Expected EVA:eva_pl_0[block]:S_AHB[port] to be SubordinatePort when assigning base address
But if I don’t create the address block for S_AHB, it will show incomplete path in BD address editor. What is the right way to control AHB BUS in pynq?
If you don’t mind I’d like to ask another question about the bram crontroller. The bram in “eva_pl” is 512-bit width, but the AXI_HPM_FPD is 128bit width at most, so I use a smartconnect to convert it. Can I use these simple codes to write and read the first row in my bram?
bram=overlay.axi_bram_ctrl_0
for i in range(16):
bram.write(i*4, data[i])
for i in range(16):
result[i]=bram.read(i*4)
print(result[i])