HDL Device Naming

The term HDL Device is used here to refer to an instance of an HDL platform in an OpenCPI system (and not a device attached to an FPGA inside the platform). HDL devices have unique names within the system. HDL devices host HDL containers for execution. Each name starts with a prefix indicating how the device is discovered and controlled by OpenCPI software.

The control schemes currently supported are:

PCI
FPGA devices/boards accessible by PCI Express
Ether
FPGA devices accessible via link-layer Ethernet
LSim
FPGA devices that are in fact simulators (see the HDL Simulation Platforms topic)
UDP
FPGA devices that are accessible via IP/UDP
PL
FPGA device in a Zynq SoC accessible via the on-chip AXI interconnect

The full device name is of the form:

<control-scheme>:<address-for-control-scheme>

As a convenience, if there is no known prefix in the name, then if there are 5 colons in the device name, it is assumed to be an Ether device name. Otherwise it is assumed to be a PCI device name.

PCI-based HDL devices

HDL platform devices on the PCI express bus/fabric are identified by the syntax common to many PCI utilities such as lspci on Linux, namely:

<domain>:<bus>:<slot>.<function>

An example is:

0000:05:00.0

Since it is common to have “domain”, “slot”, and “function” all being zero, if the address field in the device is simply a number with no colons, it is assumed to be the bus number with the other fields being zero. Thus “pci:5” implies “pci:0000:05:00.0”. Since an identifier with no prefix and not having 5 colons is assumed to be a PCI device, the identifier “4”, is assumed to be “pci:0000:04:00.0”.

A common example of a PCIe device is the PicoEVB development board.

Ethernet-based HDL Devices

HDL devices that are attached to Ethernet and operate at the link (or MAC) layer (OSI layer 2) use the ether prefix. This prefix implies access without using any routing or transport protocols such as IP/UDP or IP/TCP. It is the fastest and lowest latency way to use a network, with the drawback that it cannot be “routed” through IP routers, but can only be “switched” by L2 Ethernet bridges and switches. The syntax for naming such devices is:

Ether:[<interface>/]<mac-address>

The MAC-address is the typical 6 hexadecimal bytes separated by colons, such as:

c8:2a:14:28:61:86

The optional <interface> value is the name of a network interface on the computer accessing the device. Typical examples are en0 or eth0. Newer Linux systems use more complex (but predictable) names that relate to busses and slots, e.g. enp14s0 for PCI-based network interfaces. It is optional when there is only one such device. On systems with multiple interfaces it indicates which one should be used to reach the device. This is needed since there is no routing at this level of the network stack: you must use the right network interface to reach the addressed device.

The available network interfaces can usually be identified by the ifconfig Linux command. There is a more special purpose sub-command of the ocpihdl utility that lists only the network interfaces available and usable for OpenCPI (the ethers command to ocpihdl).

Simulator Device Naming

OpenCPI runs HDL simulators in a way that makes them look like any other device to software. When they are available (installed for OpenCPI), they are discoverable like any other device. They are accessed by name according to this syntax:

LSim:<simulator>

Current simulators are modelsim, xsim and isim. Such simulators are discovered automatically, and can be listed with the ocpihdl search command, along with hardware FPGA platform devices.