Platform Mapping HDL Pins

BP
Brian Padalino
Wed, Jan 8, 2020 3:51 PM

I am trying to follow the instructions from this mailing list post:

http://lists.opencpi.org/pipermail/discuss_lists.opencpi.org/2019-May/000184.html

I am trying to start with a simple port to the ADALM-PLUTO platform, but I
prefer to keep their top level names for the platform so I don't have to
modify the XDC very much.

I defined the HdlPlatform to have:

<device worker="ad9361_spi"> <signal name="SPI_CLK" platform='spi_clk'/> <signal name="SPI_DO" platform='spi_miso'/> <signal name="SPI_DI" platform='spi_mosi'/> <signal name="SPI_ENB" platform='spi_csn'/> <signal name="RESETB" platform='gpio_resetb'/> </device>

I then added, as recommended:

<!-- SPI Interface --> <signal output="spi_mosi" /> <signal input="spi_miso" /> <signal output="spi_clk" /> <signal output="spi_csn" /> <signal output="gpio_resetb" />

I then created a config called pluto_txrx which is defined as:

<HdlConfig Language="vhdl">
    <device name="ad9361_adc"/>
    <device name="ad9361_dac"/>
</HdlConfig>

But, my spi_mosi signal isn't connected to ad9361_spi_SPI_DI as I would
have expected in the generated code.

Also, it seems like the HdlPlatform defines some base platform, and the
HdlConfig is some more specific thing with the devices instantiated?

Is there a way to get the base to include the ad9361_adc and ad9361_dac for
all builds and get rid of the HdlConfig requirement?  Essentially think of
it as a part of the board proper?  I tried to look at the matchstiq_z1 as
an example, but it wasn't clear to me on how to make that happen.

Thanks,
Brian

I am trying to follow the instructions from this mailing list post: http://lists.opencpi.org/pipermail/discuss_lists.opencpi.org/2019-May/000184.html I am trying to start with a simple port to the ADALM-PLUTO platform, but I prefer to keep their top level names for the platform so I don't have to modify the XDC very much. I defined the HdlPlatform to have: <device worker="ad9361_spi"> <signal name="SPI_CLK" platform='spi_clk'/> <signal name="SPI_DO" platform='spi_miso'/> <signal name="SPI_DI" platform='spi_mosi'/> <signal name="SPI_ENB" platform='spi_csn'/> <signal name="RESETB" platform='gpio_resetb'/> </device> I then added, as recommended: <!-- SPI Interface --> <signal output="spi_mosi" /> <signal input="spi_miso" /> <signal output="spi_clk" /> <signal output="spi_csn" /> <signal output="gpio_resetb" /> I then created a config called pluto_txrx which is defined as: <HdlConfig Language="vhdl"> <device name="ad9361_adc"/> <device name="ad9361_dac"/> </HdlConfig> But, my spi_mosi signal isn't connected to ad9361_spi_SPI_DI as I would have expected in the generated code. Also, it seems like the HdlPlatform defines some base platform, and the HdlConfig is some more specific thing with the devices instantiated? Is there a way to get the base to include the ad9361_adc and ad9361_dac for all builds and get rid of the HdlConfig requirement? Essentially think of it as a part of the board proper? I tried to look at the matchstiq_z1 as an example, but it wasn't clear to me on how to make that happen. Thanks, Brian
AO
Aaron Olivarez
Wed, Jan 8, 2020 5:33 PM

You need to add ad9361_spi_ prefix so your HdlPlatform needs to look like
this:

<device worker="ad9361_spi"> <signal name="ad9361_spi_SPI_CLK" platform='spi_clk'/> <signal name="ad9361_spi_SPI_DO" platform='spi_miso'/> <signal name="ad9361_spi_SPI_DI" platform='spi_mosi'/> <signal name="ad9361_spi_SPI_ENB" platform='spi_csn'/> <signal name="ad9361_spi_RESETB" platform='gpio_resetb'/> </device>

I'm working on a port for the PLUTO and I used the approach of updating the
XDC file but yours is valid too. This is what my platform xml looks like:

<!-- This file defines the pluto HDL platform --> <HdlPlatform Language='VHDL' Spec='platform-spec'> <specproperty Name='platform' Value='pluto'/> <!-- These next two lines must be present in all platforms --> <metadata Master='true'/> <timebase Master='true'/> <!-- This platform worker provides a control plane --> <cpmaster master='true'/> <!-- Set your time server frequency --> <device Worker='time_server'> <Property Name='frequency' Value='100e6'/> </device> <sdp Name='zynq' Master='true' Count='4'/> <Property Name='axi_error' Type='bool' Arraylength='4' Volatile='true'/> <Property Name='sdpDropCount' type='uchar' volatile='true'/> <!-- debug properties --> <property name='useGP1' type='bool' parameter='1' default='false'/> <property name='debug_state' type='Ulonglong' arraylength='4' volatile='true' debug='false'/> <property name='debug_state1' type='Ulonglong' arraylength='4' volatile='true' debug='false'/> <property name='debug_state2' type='Ulonglong' arraylength='4' volatile='true' debug='false'/> <!-- Put any additional platform-specific properties here using <Property> --> <!-- Put any built-in (always present) devices here using <device> --> <!-- Put any card slots here using <slot> --> <!-- Put ad hoc signals here using <signal> --> <device worker='ad9361_adc'/> <device worker='ad9361_adc_sub'> <Property name='LVDS_P' value='false'/> </device> <device worker='ad9361_dac'/> <device worker='ad9361_dac_sub'> <Property name='LVDS_P' value='false'/> </device> <device worker='ad9361_data_sub'> <Property name='LVDS_P' value='false'/> <Signal name='DATA_CLK_N' platform=''/> <Signal name='FB_CLK_N' platform=''/> <Signal name='TX_FRAME_N' platform=''/> <Signal name='RX_FRAME_N' platform=''/> </device> <device Worker='ad9361_spi'/> <device Worker='ad9361_config'/> </HdlPlatform>

The only caveat is that those device workers in the platform xml also need
to be instanced in a platform config file or container. The platform and
card XML simply dictate what's allowed to be instanced. Every device worker
needs to be instanced in either a platform or container. Here's an example
of one my HdlConfig:

<HdlConfig Constraints="pluto_ad9361_txrx_sub_mode_2_cmos"> <device name="ad9361_spi"> <property name="CP_CLK_FREQ_HZ_p" value="100e6"/> <!-- we MUST provide to this worker the pluto's control plane clock freq value --> </device> <device name="ad9361_config"/> <device name="ad9361_data_sub"> <property name="lvds_p" value="false"/> <property name="half_duplex_p" value="false"/> <property name="single_port_p" value="true"/> <property name="swap_ports_p" value="true"/> </device> <device name="ad9361_adc"/> <device name="ad9361_adc_sub"> <property name="lvds_p" value="false"/> <property name="half_duplex_p" value="false"/> <property name="single_port_p" value="true"/> </device> <device name="ad9361_dac"/> <device name="ad9361_dac_sub"> <property name="lvds_p" value="false"/> <property name="half_duplex_p" value="false"/> <property name="single_port_p" value="true"/> </device> </HdlConfig>

Aaron

On Wed, Jan 8, 2020 at 9:52 AM Brian Padalino bpadalino@gmail.com wrote:

I am trying to follow the instructions from this mailing list post:

http://lists.opencpi.org/pipermail/discuss_lists.opencpi.org/2019-May/000184.html

I am trying to start with a simple port to the ADALM-PLUTO platform, but I
prefer to keep their top level names for the platform so I don't have to
modify the XDC very much.

I defined the HdlPlatform to have:

<device worker="ad9361_spi"> <signal name="SPI_CLK" platform='spi_clk'/> <signal name="SPI_DO" platform='spi_miso'/> <signal name="SPI_DI" platform='spi_mosi'/> <signal name="SPI_ENB" platform='spi_csn'/> <signal name="RESETB" platform='gpio_resetb'/> </device>

I then added, as recommended:

<!-- SPI Interface --> <signal output="spi_mosi" /> <signal input="spi_miso" /> <signal output="spi_clk" /> <signal output="spi_csn" /> <signal output="gpio_resetb" />

I then created a config called pluto_txrx which is defined as:

 <HdlConfig Language="vhdl">
     <device name="ad9361_adc"/>
     <device name="ad9361_dac"/>
 </HdlConfig>

But, my spi_mosi signal isn't connected to ad9361_spi_SPI_DI as I would
have expected in the generated code.

Also, it seems like the HdlPlatform defines some base platform, and the
HdlConfig is some more specific thing with the devices instantiated?

Is there a way to get the base to include the ad9361_adc and ad9361_dac for
all builds and get rid of the HdlConfig requirement?  Essentially think of
it as a part of the board proper?  I tried to look at the matchstiq_z1 as
an example, but it wasn't clear to me on how to make that happen.

Thanks,
Brian

You need to add ad9361_spi_ prefix so your HdlPlatform needs to look like this: <device worker="ad9361_spi"> <signal name="ad9361_spi_SPI_CLK" platform='spi_clk'/> <signal name="ad9361_spi_SPI_DO" platform='spi_miso'/> <signal name="ad9361_spi_SPI_DI" platform='spi_mosi'/> <signal name="ad9361_spi_SPI_ENB" platform='spi_csn'/> <signal name="ad9361_spi_RESETB" platform='gpio_resetb'/> </device> I'm working on a port for the PLUTO and I used the approach of updating the XDC file but yours is valid too. This is what my platform xml looks like: <!-- This file defines the pluto HDL platform --> <HdlPlatform Language='VHDL' Spec='platform-spec'> <specproperty Name='platform' Value='pluto'/> <!-- These next two lines must be present in all platforms --> <metadata Master='true'/> <timebase Master='true'/> <!-- This platform worker provides a control plane --> <cpmaster master='true'/> <!-- Set your time server frequency --> <device Worker='time_server'> <Property Name='frequency' Value='100e6'/> </device> <sdp Name='zynq' Master='true' Count='4'/> <Property Name='axi_error' Type='bool' Arraylength='4' Volatile='true'/> <Property Name='sdpDropCount' type='uchar' volatile='true'/> <!-- debug properties --> <property name='useGP1' type='bool' parameter='1' default='false'/> <property name='debug_state' type='Ulonglong' arraylength='4' volatile='true' debug='false'/> <property name='debug_state1' type='Ulonglong' arraylength='4' volatile='true' debug='false'/> <property name='debug_state2' type='Ulonglong' arraylength='4' volatile='true' debug='false'/> <!-- Put any additional platform-specific properties here using <Property> --> <!-- Put any built-in (always present) devices here using <device> --> <!-- Put any card slots here using <slot> --> <!-- Put ad hoc signals here using <signal> --> <device worker='ad9361_adc'/> <device worker='ad9361_adc_sub'> <Property name='LVDS_P' value='false'/> </device> <device worker='ad9361_dac'/> <device worker='ad9361_dac_sub'> <Property name='LVDS_P' value='false'/> </device> <device worker='ad9361_data_sub'> <Property name='LVDS_P' value='false'/> <Signal name='DATA_CLK_N' platform=''/> <Signal name='FB_CLK_N' platform=''/> <Signal name='TX_FRAME_N' platform=''/> <Signal name='RX_FRAME_N' platform=''/> </device> <device Worker='ad9361_spi'/> <device Worker='ad9361_config'/> </HdlPlatform> The only caveat is that those device workers in the platform xml also need to be instanced in a platform config file or container. The platform and card XML simply dictate what's allowed to be instanced. Every device worker needs to be instanced in either a platform or container. Here's an example of one my HdlConfig: <HdlConfig Constraints="pluto_ad9361_txrx_sub_mode_2_cmos"> <device name="ad9361_spi"> <property name="CP_CLK_FREQ_HZ_p" value="100e6"/> <!-- we MUST provide to this worker the pluto's control plane clock freq value --> </device> <device name="ad9361_config"/> <device name="ad9361_data_sub"> <property name="lvds_p" value="false"/> <property name="half_duplex_p" value="false"/> <property name="single_port_p" value="true"/> <property name="swap_ports_p" value="true"/> </device> <device name="ad9361_adc"/> <device name="ad9361_adc_sub"> <property name="lvds_p" value="false"/> <property name="half_duplex_p" value="false"/> <property name="single_port_p" value="true"/> </device> <device name="ad9361_dac"/> <device name="ad9361_dac_sub"> <property name="lvds_p" value="false"/> <property name="half_duplex_p" value="false"/> <property name="single_port_p" value="true"/> </device> </HdlConfig> Aaron On Wed, Jan 8, 2020 at 9:52 AM Brian Padalino <bpadalino@gmail.com> wrote: > I am trying to follow the instructions from this mailing list post: > > > > http://lists.opencpi.org/pipermail/discuss_lists.opencpi.org/2019-May/000184.html > > I am trying to start with a simple port to the ADALM-PLUTO platform, but I > prefer to keep their top level names for the platform so I don't have to > modify the XDC very much. > > I defined the HdlPlatform to have: > > <device worker="ad9361_spi"> > <signal name="SPI_CLK" platform='spi_clk'/> > <signal name="SPI_DO" platform='spi_miso'/> > <signal name="SPI_DI" platform='spi_mosi'/> > <signal name="SPI_ENB" platform='spi_csn'/> > <signal name="RESETB" platform='gpio_resetb'/> > </device> > > I then added, as recommended: > > <!-- SPI Interface --> > <signal output="spi_mosi" /> > <signal input="spi_miso" /> > <signal output="spi_clk" /> > <signal output="spi_csn" /> > <signal output="gpio_resetb" /> > > I then created a config called pluto_txrx which is defined as: > > <HdlConfig Language="vhdl"> > <device name="ad9361_adc"/> > <device name="ad9361_dac"/> > </HdlConfig> > > But, my spi_mosi signal isn't connected to ad9361_spi_SPI_DI as I would > have expected in the generated code. > > Also, it seems like the HdlPlatform defines some base platform, and the > HdlConfig is some more specific thing with the devices instantiated? > > Is there a way to get the base to include the ad9361_adc and ad9361_dac for > all builds and get rid of the HdlConfig requirement? Essentially think of > it as a part of the board proper? I tried to look at the matchstiq_z1 as > an example, but it wasn't clear to me on how to make that happen. > > Thanks, > Brian >
JK
James Kulp
Wed, Jan 8, 2020 6:20 PM

Its nice to see all this planetary exploration (pluto is a planet again,
right?)

I think it is "best practice" to aspire to leave the constraints file
alone as much as possible, that is why we allow the mapping attributes
using "platform" etc.  But sometimes you can't win and in some case we
end up with a constraints file per platform configuration.

Having more modular constraints files is a roadmap item for sure.

On 1/8/20 12:33 PM, Aaron Olivarez wrote:

You need to add ad9361_spi_ prefix so your HdlPlatform needs to look like
this:

<device worker="ad9361_spi"> <signal name="ad9361_spi_SPI_CLK" platform='spi_clk'/> <signal name="ad9361_spi_SPI_DO" platform='spi_miso'/> <signal name="ad9361_spi_SPI_DI" platform='spi_mosi'/> <signal name="ad9361_spi_SPI_ENB" platform='spi_csn'/> <signal name="ad9361_spi_RESETB" platform='gpio_resetb'/> </device>

I'm working on a port for the PLUTO and I used the approach of updating the
XDC file but yours is valid too. This is what my platform xml looks like:

<!-- This file defines the pluto HDL platform --> <HdlPlatform Language='VHDL' Spec='platform-spec'> <specproperty Name='platform' Value='pluto'/> <!-- These next two lines must be present in all platforms --> <metadata Master='true'/> <timebase Master='true'/> <!-- This platform worker provides a control plane --> <cpmaster master='true'/> <!-- Set your time server frequency --> <device Worker='time_server'> <Property Name='frequency' Value='100e6'/> </device>
<sdp Name='zynq' Master='true' Count='4'/>
<Property Name='axi_error' Type='bool' Arraylength='4' Volatile='true'/>
<Property Name='sdpDropCount' type='uchar' volatile='true'/>

<!-- debug properties -->
<property name='useGP1' type='bool' parameter='1' default='false'/>
<property name='debug_state' type='Ulonglong' arraylength='4'

volatile='true' debug='false'/>
<property name='debug_state1' type='Ulonglong' arraylength='4' volatile='true' debug='false'/>
<property name='debug_state2' type='Ulonglong' arraylength='4' volatile='true' debug='false'/>

<!-- Put any additional platform-specific properties here using

<Property> -->
<!-- Put any built-in (always present) devices here using <device> -->
<!-- Put any card slots here using <slot> -->
<!-- Put ad hoc signals here using <signal> -->

<device worker='ad9361_adc'/>
<device worker='ad9361_adc_sub'>
  <Property name='LVDS_P' value='false'/>
</device>

<device worker='ad9361_dac'/>
<device worker='ad9361_dac_sub'>
  <Property name='LVDS_P' value='false'/>
</device>

<device worker='ad9361_data_sub'>
  <Property name='LVDS_P' value='false'/>
  <Signal name='DATA_CLK_N' platform=''/>
  <Signal name='FB_CLK_N' platform=''/>
  <Signal name='TX_FRAME_N' platform=''/>
  <Signal name='RX_FRAME_N' platform=''/>
</device>

<device Worker='ad9361_spi'/>
<device Worker='ad9361_config'/>
</HdlPlatform>

The only caveat is that those device workers in the platform xml also need
to be instanced in a platform config file or container. The platform and
card XML simply dictate what's allowed to be instanced. Every device worker
needs to be instanced in either a platform or container. Here's an example
of one my HdlConfig:

<HdlConfig Constraints="pluto_ad9361_txrx_sub_mode_2_cmos"> <device name="ad9361_spi"> <property name="CP_CLK_FREQ_HZ_p" value="100e6"/> <!-- we MUST provide to this worker the pluto's control plane clock freq value --> </device> <device name="ad9361_config"/> <device name="ad9361_data_sub"> <property name="lvds_p" value="false"/> <property name="half_duplex_p" value="false"/> <property name="single_port_p" value="true"/> <property name="swap_ports_p" value="true"/> </device> <device name="ad9361_adc"/> <device name="ad9361_adc_sub"> <property name="lvds_p" value="false"/> <property name="half_duplex_p" value="false"/> <property name="single_port_p" value="true"/> </device> <device name="ad9361_dac"/> <device name="ad9361_dac_sub"> <property name="lvds_p" value="false"/> <property name="half_duplex_p" value="false"/> <property name="single_port_p" value="true"/> </device> </HdlConfig>

Aaron

On Wed, Jan 8, 2020 at 9:52 AM Brian Padalino bpadalino@gmail.com wrote:

I am trying to follow the instructions from this mailing list post:

http://lists.opencpi.org/pipermail/discuss_lists.opencpi.org/2019-May/000184.html

I am trying to start with a simple port to the ADALM-PLUTO platform, but I
prefer to keep their top level names for the platform so I don't have to
modify the XDC very much.

I defined the HdlPlatform to have:

<device worker="ad9361_spi"> <signal name="SPI_CLK" platform='spi_clk'/> <signal name="SPI_DO" platform='spi_miso'/> <signal name="SPI_DI" platform='spi_mosi'/> <signal name="SPI_ENB" platform='spi_csn'/> <signal name="RESETB" platform='gpio_resetb'/> </device>

I then added, as recommended:

<!-- SPI Interface --> <signal output="spi_mosi" /> <signal input="spi_miso" /> <signal output="spi_clk" /> <signal output="spi_csn" /> <signal output="gpio_resetb" />

I then created a config called pluto_txrx which is defined as:

 <HdlConfig Language="vhdl">
     <device name="ad9361_adc"/>
     <device name="ad9361_dac"/>
 </HdlConfig>

But, my spi_mosi signal isn't connected to ad9361_spi_SPI_DI as I would
have expected in the generated code.

Also, it seems like the HdlPlatform defines some base platform, and the
HdlConfig is some more specific thing with the devices instantiated?

Is there a way to get the base to include the ad9361_adc and ad9361_dac for
all builds and get rid of the HdlConfig requirement?  Essentially think of
it as a part of the board proper?  I tried to look at the matchstiq_z1 as
an example, but it wasn't clear to me on how to make that happen.

Thanks,
Brian

Its nice to see all this planetary exploration (pluto is a planet again, right?) I think it is "best practice" to aspire to leave the constraints file alone as much as possible, that is why we allow the mapping attributes using "platform" etc.  But sometimes you can't win and in some case we end up with a constraints file per platform configuration. Having more modular constraints files is a roadmap item for sure. On 1/8/20 12:33 PM, Aaron Olivarez wrote: > You need to add ad9361_spi_ prefix so your HdlPlatform needs to look like > this: > > <device worker="ad9361_spi"> > <signal name="ad9361_spi_SPI_CLK" platform='spi_clk'/> > <signal name="ad9361_spi_SPI_DO" platform='spi_miso'/> > <signal name="ad9361_spi_SPI_DI" platform='spi_mosi'/> > <signal name="ad9361_spi_SPI_ENB" platform='spi_csn'/> > <signal name="ad9361_spi_RESETB" platform='gpio_resetb'/> > </device> > > I'm working on a port for the PLUTO and I used the approach of updating the > XDC file but yours is valid too. This is what my platform xml looks like: > > <!-- This file defines the pluto HDL platform --> > <HdlPlatform Language='VHDL' Spec='platform-spec'> > <specproperty Name='platform' Value='pluto'/> > <!-- These next two lines must be present in all platforms --> > <metadata Master='true'/> > <timebase Master='true'/> > <!-- This platform worker provides a control plane --> > <cpmaster master='true'/> > <!-- Set your time server frequency --> > <device Worker='time_server'> > <Property Name='frequency' Value='100e6'/> > </device> > > <sdp Name='zynq' Master='true' Count='4'/> > <Property Name='axi_error' Type='bool' Arraylength='4' Volatile='true'/> > <Property Name='sdpDropCount' type='uchar' volatile='true'/> > > <!-- debug properties --> > <property name='useGP1' type='bool' parameter='1' default='false'/> > <property name='debug_state' type='Ulonglong' arraylength='4' > volatile='true' debug='false'/> > <property name='debug_state1' type='Ulonglong' arraylength='4' > volatile='true' debug='false'/> > <property name='debug_state2' type='Ulonglong' arraylength='4' > volatile='true' debug='false'/> > > <!-- Put any additional platform-specific properties here using > <Property> --> > <!-- Put any built-in (always present) devices here using <device> --> > <!-- Put any card slots here using <slot> --> > <!-- Put ad hoc signals here using <signal> --> > > > <device worker='ad9361_adc'/> > <device worker='ad9361_adc_sub'> > <Property name='LVDS_P' value='false'/> > </device> > > <device worker='ad9361_dac'/> > <device worker='ad9361_dac_sub'> > <Property name='LVDS_P' value='false'/> > </device> > > <device worker='ad9361_data_sub'> > <Property name='LVDS_P' value='false'/> > <Signal name='DATA_CLK_N' platform=''/> > <Signal name='FB_CLK_N' platform=''/> > <Signal name='TX_FRAME_N' platform=''/> > <Signal name='RX_FRAME_N' platform=''/> > </device> > > <device Worker='ad9361_spi'/> > <device Worker='ad9361_config'/> > > </HdlPlatform> > > The only caveat is that those device workers in the platform xml also need > to be instanced in a platform config file or container. The platform and > card XML simply dictate what's allowed to be instanced. Every device worker > needs to be instanced in either a platform or container. Here's an example > of one my HdlConfig: > > <HdlConfig Constraints="pluto_ad9361_txrx_sub_mode_2_cmos"> > <device name="ad9361_spi"> > <property name="CP_CLK_FREQ_HZ_p" value="100e6"/> <!-- we MUST provide > to this worker the pluto's control plane clock freq value --> > </device> > <device name="ad9361_config"/> > <device name="ad9361_data_sub"> > <property name="lvds_p" value="false"/> > <property name="half_duplex_p" value="false"/> > <property name="single_port_p" value="true"/> > <property name="swap_ports_p" value="true"/> > </device> > <device name="ad9361_adc"/> > <device name="ad9361_adc_sub"> > <property name="lvds_p" value="false"/> > <property name="half_duplex_p" value="false"/> > <property name="single_port_p" value="true"/> > </device> > <device name="ad9361_dac"/> > <device name="ad9361_dac_sub"> > <property name="lvds_p" value="false"/> > <property name="half_duplex_p" value="false"/> > <property name="single_port_p" value="true"/> > </device> > </HdlConfig> > > Aaron > > On Wed, Jan 8, 2020 at 9:52 AM Brian Padalino <bpadalino@gmail.com> wrote: > >> I am trying to follow the instructions from this mailing list post: >> >> >> >> http://lists.opencpi.org/pipermail/discuss_lists.opencpi.org/2019-May/000184.html >> >> I am trying to start with a simple port to the ADALM-PLUTO platform, but I >> prefer to keep their top level names for the platform so I don't have to >> modify the XDC very much. >> >> I defined the HdlPlatform to have: >> >> <device worker="ad9361_spi"> >> <signal name="SPI_CLK" platform='spi_clk'/> >> <signal name="SPI_DO" platform='spi_miso'/> >> <signal name="SPI_DI" platform='spi_mosi'/> >> <signal name="SPI_ENB" platform='spi_csn'/> >> <signal name="RESETB" platform='gpio_resetb'/> >> </device> >> >> I then added, as recommended: >> >> <!-- SPI Interface --> >> <signal output="spi_mosi" /> >> <signal input="spi_miso" /> >> <signal output="spi_clk" /> >> <signal output="spi_csn" /> >> <signal output="gpio_resetb" /> >> >> I then created a config called pluto_txrx which is defined as: >> >> <HdlConfig Language="vhdl"> >> <device name="ad9361_adc"/> >> <device name="ad9361_dac"/> >> </HdlConfig> >> >> But, my spi_mosi signal isn't connected to ad9361_spi_SPI_DI as I would >> have expected in the generated code. >> >> Also, it seems like the HdlPlatform defines some base platform, and the >> HdlConfig is some more specific thing with the devices instantiated? >> >> Is there a way to get the base to include the ad9361_adc and ad9361_dac for >> all builds and get rid of the HdlConfig requirement? Essentially think of >> it as a part of the board proper? I tried to look at the matchstiq_z1 as >> an example, but it wasn't clear to me on how to make that happen. >> >> Thanks, >> Brian >>
BP
Brian Padalino
Wed, Jan 8, 2020 6:21 PM

On Wed, Jan 8, 2020 at 12:34 PM Aaron Olivarez aaron@olivarez.info wrote:

You need to add ad9361_spi_ prefix so your HdlPlatform needs to look like
this:

<device worker="ad9361_spi"> <signal name="ad9361_spi_SPI_CLK" platform='spi_clk'/> <signal name="ad9361_spi_SPI_DO" platform='spi_miso'/> <signal name="ad9361_spi_SPI_DI" platform='spi_mosi'/> <signal name="ad9361_spi_SPI_ENB" platform='spi_csn'/> <signal name="ad9361_spi_RESETB" platform='gpio_resetb'/> </device>

When I tried, this I received the following error:

For file pluto.xml: Signal "ad9361_spi_SPI_CLK" is not defined for device
type "ad9361_spi"

Which I think makes sense.  The signal name is defined as SPI_CLK in the
ad9361_spi.xml file.

Looking through the generated code, I don't think things are still
correct.  But maybe I am looking too early in the process?

I'm working on a port for the PLUTO and I used the approach of updating
the XDC file but yours is valid too. This is what my platform xml looks
like:

<!-- This file defines the pluto HDL platform --> <HdlPlatform Language='VHDL' Spec='platform-spec'> <specproperty Name='platform' Value='pluto'/> <!-- These next two lines must be present in all platforms --> <metadata Master='true'/> <timebase Master='true'/> <!-- This platform worker provides a control plane --> <cpmaster master='true'/> <!-- Set your time server frequency --> <device Worker='time_server'> <Property Name='frequency' Value='100e6'/> </device> <sdp Name='zynq' Master='true' Count='4'/> <Property Name='axi_error' Type='bool' Arraylength='4' Volatile='true'/> <Property Name='sdpDropCount' type='uchar' volatile='true'/> <!-- debug properties --> <property name='useGP1' type='bool' parameter='1' default='false'/> <property name='debug_state' type='Ulonglong' arraylength='4' volatile='true' debug='false'/> <property name='debug_state1' type='Ulonglong' arraylength='4' volatile='true' debug='false'/> <property name='debug_state2' type='Ulonglong' arraylength='4' volatile='true' debug='false'/> <!-- Put any additional platform-specific properties here using <Property> --> <!-- Put any built-in (always present) devices here using <device> --> <!-- Put any card slots here using <slot> --> <!-- Put ad hoc signals here using <signal> --> <device worker='ad9361_adc'/> <device worker='ad9361_adc_sub'> <Property name='LVDS_P' value='false'/> </device> <device worker='ad9361_dac'/> <device worker='ad9361_dac_sub'> <Property name='LVDS_P' value='false'/> </device> <device worker='ad9361_data_sub'> <Property name='LVDS_P' value='false'/> <Signal name='DATA_CLK_N' platform=''/> <Signal name='FB_CLK_N' platform=''/> <Signal name='TX_FRAME_N' platform=''/> <Signal name='RX_FRAME_N' platform=''/> </device> <device Worker='ad9361_spi'/> <device Worker='ad9361_config'/> </HdlPlatform>

Thanks!  This is great!  Were you planning on open sourcing this, or just
for your own little project?

The only caveat is that those device workers in the platform xml also need
to be instanced in a platform config file or container. The platform and
card XML simply dictate what's allowed to be instanced. Every device worker
needs to be instanced in either a platform or container. Here's an example
of one my HdlConfig:

<HdlConfig Constraints="pluto_ad9361_txrx_sub_mode_2_cmos"> <device name="ad9361_spi"> <property name="CP_CLK_FREQ_HZ_p" value="100e6"/> <!-- we MUST provide to this worker the pluto's control plane clock freq value --> </device> <device name="ad9361_config"/> <device name="ad9361_data_sub"> <property name="lvds_p" value="false"/> <property name="half_duplex_p" value="false"/> <property name="single_port_p" value="true"/> <property name="swap_ports_p" value="true"/> </device> <device name="ad9361_adc"/> <device name="ad9361_adc_sub"> <property name="lvds_p" value="false"/> <property name="half_duplex_p" value="false"/> <property name="single_port_p" value="true"/> </device> <device name="ad9361_dac"/> <device name="ad9361_dac_sub"> <property name="lvds_p" value="false"/> <property name="half_duplex_p" value="false"/> <property name="single_port_p" value="true"/> </device> </HdlConfig>

This is also very good to know.  I only had the ad9361_adc and ad9361_dac
in there before.  What is interesting is that when I have the ad9361_adc
before the ad9361_adc_sub in the XML, I get the following error:

For file ../../pluto/pluto_txrx.xml: Platform device 'ad9361_adc_sub' is
already in the platform configuration

Should I be adding a new "assembly" which defines all this stuff as opposed
to a different "configuration"?

Thanks for all the guidance.

Brian

On Wed, Jan 8, 2020 at 12:34 PM Aaron Olivarez <aaron@olivarez.info> wrote: > You need to add ad9361_spi_ prefix so your HdlPlatform needs to look like > this: > > <device worker="ad9361_spi"> > <signal name="ad9361_spi_SPI_CLK" platform='spi_clk'/> > <signal name="ad9361_spi_SPI_DO" platform='spi_miso'/> > <signal name="ad9361_spi_SPI_DI" platform='spi_mosi'/> > <signal name="ad9361_spi_SPI_ENB" platform='spi_csn'/> > <signal name="ad9361_spi_RESETB" platform='gpio_resetb'/> > </device> > When I tried, this I received the following error: For file pluto.xml: Signal "ad9361_spi_SPI_CLK" is not defined for device type "ad9361_spi" Which I think makes sense. The signal name is defined as SPI_CLK in the ad9361_spi.xml file. Looking through the generated code, I don't think things are still correct. But maybe I am looking too early in the process? > > I'm working on a port for the PLUTO and I used the approach of updating > the XDC file but yours is valid too. This is what my platform xml looks > like: > > <!-- This file defines the pluto HDL platform --> > <HdlPlatform Language='VHDL' Spec='platform-spec'> > <specproperty Name='platform' Value='pluto'/> > <!-- These next two lines must be present in all platforms --> > <metadata Master='true'/> > <timebase Master='true'/> > <!-- This platform worker provides a control plane --> > <cpmaster master='true'/> > <!-- Set your time server frequency --> > <device Worker='time_server'> > <Property Name='frequency' Value='100e6'/> > </device> > > <sdp Name='zynq' Master='true' Count='4'/> > <Property Name='axi_error' Type='bool' Arraylength='4' Volatile='true'/> > <Property Name='sdpDropCount' type='uchar' volatile='true'/> > > <!-- debug properties --> > <property name='useGP1' type='bool' parameter='1' default='false'/> > <property name='debug_state' type='Ulonglong' arraylength='4' > volatile='true' debug='false'/> > <property name='debug_state1' type='Ulonglong' arraylength='4' > volatile='true' debug='false'/> > <property name='debug_state2' type='Ulonglong' arraylength='4' > volatile='true' debug='false'/> > > <!-- Put any additional platform-specific properties here using > <Property> --> > <!-- Put any built-in (always present) devices here using <device> --> > <!-- Put any card slots here using <slot> --> > <!-- Put ad hoc signals here using <signal> --> > > > <device worker='ad9361_adc'/> > <device worker='ad9361_adc_sub'> > <Property name='LVDS_P' value='false'/> > </device> > > <device worker='ad9361_dac'/> > <device worker='ad9361_dac_sub'> > <Property name='LVDS_P' value='false'/> > </device> > > <device worker='ad9361_data_sub'> > <Property name='LVDS_P' value='false'/> > <Signal name='DATA_CLK_N' platform=''/> > <Signal name='FB_CLK_N' platform=''/> > <Signal name='TX_FRAME_N' platform=''/> > <Signal name='RX_FRAME_N' platform=''/> > </device> > > <device Worker='ad9361_spi'/> > <device Worker='ad9361_config'/> > > </HdlPlatform> > Thanks! This is great! Were you planning on open sourcing this, or just for your own little project? > > The only caveat is that those device workers in the platform xml also need > to be instanced in a platform config file or container. The platform and > card XML simply dictate what's allowed to be instanced. Every device worker > needs to be instanced in either a platform or container. Here's an example > of one my HdlConfig: > > <HdlConfig Constraints="pluto_ad9361_txrx_sub_mode_2_cmos"> > <device name="ad9361_spi"> > <property name="CP_CLK_FREQ_HZ_p" value="100e6"/> <!-- we MUST provide > to this worker the pluto's control plane clock freq value --> > </device> > <device name="ad9361_config"/> > <device name="ad9361_data_sub"> > <property name="lvds_p" value="false"/> > <property name="half_duplex_p" value="false"/> > <property name="single_port_p" value="true"/> > <property name="swap_ports_p" value="true"/> > </device> > <device name="ad9361_adc"/> > <device name="ad9361_adc_sub"> > <property name="lvds_p" value="false"/> > <property name="half_duplex_p" value="false"/> > <property name="single_port_p" value="true"/> > </device> > <device name="ad9361_dac"/> > <device name="ad9361_dac_sub"> > <property name="lvds_p" value="false"/> > <property name="half_duplex_p" value="false"/> > <property name="single_port_p" value="true"/> > </device> > </HdlConfig> > This is also very good to know. I only had the ad9361_adc and ad9361_dac in there before. What is interesting is that when I have the ad9361_adc before the ad9361_adc_sub in the XML, I get the following error: For file ../../pluto/pluto_txrx.xml: Platform device 'ad9361_adc_sub' is already in the platform configuration Should I be adding a new "assembly" which defines all this stuff as opposed to a different "configuration"? Thanks for all the guidance. Brian
DH
Davis Hoover
Wed, Jan 8, 2020 6:51 PM

For the platform XML:

  • for: device element: signal subelement: name attribute: value should
    match the signal names from the OWD (as you surmised)
  • for: device element: signal subelement: platform attribute: is only
    necessary if a) the device pin is not connected to the slot/FPGA, in which
    case its value should be an empty string, or b) the code-generated HDL
    top-level design's signal names do not match the signal names in the
    constraint file, in which case the value should be set to the value from
    the corresponding constraint file signal

So your ad9361_spi element of your platform XML should probably look
something like:

<device worker="ad9361_spi"> <signal name="SPI_CLK" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_DO" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_DI" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_ENB" platform='enter_signal_name_from_constraint_file'/> <signal name="RESETB" platform='enter_signal_name_from_constraint_file'/> </device>

Also, in your original post it sounded like you were adding signal elements
as subelements of the platform element, where the signal elements' name
attribute had values of ad9361_spi*. Such content is incorrect and maybe
part of the confusion. Device worker signals are automatically exposed at
the top level of the HDL design.

For the "Platform device 'ad9361_adc_sub' is already in the platform
configuration" error, I suspect you are running into a consequence of
auto-instantiation of subdevice workers. I'd recommend instancing the
device/subdevice workers in the platform config XML in the following order
(this is based off of the order within
projects/assets/hdl/platforms/zed/cfg_1rx_1tx_fmcomms_2_3_lpc_lvds.xml,
which is known to build successfully):

<device name="ad9361_spi"><device name="ad9361_data_sub"><device name="ad9361_config"><device name="ad9361_adc_sub"/><device name="ad9361_dac_sub"/><device name="ad9361_adc0"/><device name="ad9361_dac0"/>

On Wed, Jan 8, 2020 at 1:22 PM Brian Padalino bpadalino@gmail.com wrote:

On Wed, Jan 8, 2020 at 12:34 PM Aaron Olivarez aaron@olivarez.info
wrote:

You need to add ad9361_spi_ prefix so your HdlPlatform needs to look like
this:

<device worker="ad9361_spi"> <signal name="ad9361_spi_SPI_CLK" platform='spi_clk'/> <signal name="ad9361_spi_SPI_DO" platform='spi_miso'/> <signal name="ad9361_spi_SPI_DI" platform='spi_mosi'/> <signal name="ad9361_spi_SPI_ENB" platform='spi_csn'/> <signal name="ad9361_spi_RESETB" platform='gpio_resetb'/> </device>

When I tried, this I received the following error:

For file pluto.xml: Signal "ad9361_spi_SPI_CLK" is not defined for device
type "ad9361_spi"

Which I think makes sense.  The signal name is defined as SPI_CLK in the
ad9361_spi.xml file.

Looking through the generated code, I don't think things are still
correct.  But maybe I am looking too early in the process?

I'm working on a port for the PLUTO and I used the approach of updating
the XDC file but yours is valid too. This is what my platform xml looks
like:

<!-- This file defines the pluto HDL platform --> <HdlPlatform Language='VHDL' Spec='platform-spec'> <specproperty Name='platform' Value='pluto'/> <!-- These next two lines must be present in all platforms --> <metadata Master='true'/> <timebase Master='true'/> <!-- This platform worker provides a control plane --> <cpmaster master='true'/> <!-- Set your time server frequency --> <device Worker='time_server'> <Property Name='frequency' Value='100e6'/> </device> <sdp Name='zynq' Master='true' Count='4'/> <Property Name='axi_error' Type='bool' Arraylength='4'

Volatile='true'/>

<Property Name='sdpDropCount' type='uchar' volatile='true'/> <!-- debug properties --> <property name='useGP1' type='bool' parameter='1' default='false'/> <property name='debug_state' type='Ulonglong' arraylength='4' volatile='true' debug='false'/> <property name='debug_state1' type='Ulonglong' arraylength='4' volatile='true' debug='false'/> <property name='debug_state2' type='Ulonglong' arraylength='4' volatile='true' debug='false'/> <!-- Put any additional platform-specific properties here using <Property> --> <!-- Put any built-in (always present) devices here using <device> --> <!-- Put any card slots here using <slot> --> <!-- Put ad hoc signals here using <signal> --> <device worker='ad9361_adc'/> <device worker='ad9361_adc_sub'> <Property name='LVDS_P' value='false'/> </device> <device worker='ad9361_dac'/> <device worker='ad9361_dac_sub'> <Property name='LVDS_P' value='false'/> </device> <device worker='ad9361_data_sub'> <Property name='LVDS_P' value='false'/> <Signal name='DATA_CLK_N' platform=''/> <Signal name='FB_CLK_N' platform=''/> <Signal name='TX_FRAME_N' platform=''/> <Signal name='RX_FRAME_N' platform=''/> </device> <device Worker='ad9361_spi'/> <device Worker='ad9361_config'/> </HdlPlatform>

Thanks!  This is great!  Were you planning on open sourcing this, or just
for your own little project?

The only caveat is that those device workers in the platform xml also
need
to be instanced in a platform config file or container. The platform and
card XML simply dictate what's allowed to be instanced. Every device
worker
needs to be instanced in either a platform or container. Here's an
example
of one my HdlConfig:

<HdlConfig Constraints="pluto_ad9361_txrx_sub_mode_2_cmos"> <device name="ad9361_spi"> <property name="CP_CLK_FREQ_HZ_p" value="100e6"/> <!-- we MUST

provide

to this worker the pluto's control plane clock freq value -->
</device>
<device name="ad9361_config"/>
<device name="ad9361_data_sub">
<property name="lvds_p" value="false"/>
<property name="half_duplex_p" value="false"/>
<property name="single_port_p" value="true"/>
<property name="swap_ports_p" value="true"/>
</device>
<device name="ad9361_adc"/>
<device name="ad9361_adc_sub">
<property name="lvds_p" value="false"/>
<property name="half_duplex_p" value="false"/>
<property name="single_port_p" value="true"/>
</device>
<device name="ad9361_dac"/>
<device name="ad9361_dac_sub">
<property name="lvds_p" value="false"/>
<property name="half_duplex_p" value="false"/>
<property name="single_port_p" value="true"/>
</device>
</HdlConfig>

This is also very good to know.  I only had the ad9361_adc and ad9361_dac
in there before.  What is interesting is that when I have the ad9361_adc
before the ad9361_adc_sub in the XML, I get the following error:

For file ../../pluto/pluto_txrx.xml: Platform device 'ad9361_adc_sub' is
already in the platform configuration

Should I be adding a new "assembly" which defines all this stuff as opposed
to a different "configuration"?

Thanks for all the guidance.

Brian

For the platform XML: * for: device element: signal subelement: name attribute: value should match the signal names from the OWD (as you surmised) * for: device element: signal subelement: platform attribute: is only necessary if a) the device pin is not connected to the slot/FPGA, in which case its value should be an empty string, or b) the code-generated HDL top-level design's signal names do not match the signal names in the constraint file, in which case the value should be set to the value from the corresponding constraint file signal So your ad9361_spi element of your platform XML should probably look something like: <device worker="ad9361_spi"> <signal name="SPI_CLK" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_DO" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_DI" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_ENB" platform='enter_signal_name_from_constraint_file'/> <signal name="RESETB" platform='enter_signal_name_from_constraint_file'/> </device> Also, in your original post it sounded like you were adding signal elements as subelements of the platform element, where the signal elements' name attribute had values of ad9361_spi*. Such content is incorrect and maybe part of the confusion. Device worker signals are automatically exposed at the top level of the HDL design. For the "Platform device 'ad9361_adc_sub' is already in the platform configuration" error, I suspect you are running into a consequence of auto-instantiation of subdevice workers. I'd recommend instancing the device/subdevice workers in the platform config XML in the following order (this is based off of the order within projects/assets/hdl/platforms/zed/cfg_1rx_1tx_fmcomms_2_3_lpc_lvds.xml, which is known to build successfully): <device name="ad9361_spi"><device name="ad9361_data_sub"><device name="ad9361_config"><device name="ad9361_adc_sub"/><device name="ad9361_dac_sub"/><device name="ad9361_adc0"/><device name="ad9361_dac0"/> On Wed, Jan 8, 2020 at 1:22 PM Brian Padalino <bpadalino@gmail.com> wrote: > On Wed, Jan 8, 2020 at 12:34 PM Aaron Olivarez <aaron@olivarez.info> > wrote: > > > You need to add ad9361_spi_ prefix so your HdlPlatform needs to look like > > this: > > > > <device worker="ad9361_spi"> > > <signal name="ad9361_spi_SPI_CLK" platform='spi_clk'/> > > <signal name="ad9361_spi_SPI_DO" platform='spi_miso'/> > > <signal name="ad9361_spi_SPI_DI" platform='spi_mosi'/> > > <signal name="ad9361_spi_SPI_ENB" platform='spi_csn'/> > > <signal name="ad9361_spi_RESETB" platform='gpio_resetb'/> > > </device> > > > > When I tried, this I received the following error: > > For file pluto.xml: Signal "ad9361_spi_SPI_CLK" is not defined for device > type "ad9361_spi" > > Which I think makes sense. The signal name is defined as SPI_CLK in the > ad9361_spi.xml file. > > Looking through the generated code, I don't think things are still > correct. But maybe I am looking too early in the process? > > > > > > I'm working on a port for the PLUTO and I used the approach of updating > > the XDC file but yours is valid too. This is what my platform xml looks > > like: > > > > <!-- This file defines the pluto HDL platform --> > > <HdlPlatform Language='VHDL' Spec='platform-spec'> > > <specproperty Name='platform' Value='pluto'/> > > <!-- These next two lines must be present in all platforms --> > > <metadata Master='true'/> > > <timebase Master='true'/> > > <!-- This platform worker provides a control plane --> > > <cpmaster master='true'/> > > <!-- Set your time server frequency --> > > <device Worker='time_server'> > > <Property Name='frequency' Value='100e6'/> > > </device> > > > > <sdp Name='zynq' Master='true' Count='4'/> > > <Property Name='axi_error' Type='bool' Arraylength='4' > Volatile='true'/> > > <Property Name='sdpDropCount' type='uchar' volatile='true'/> > > > > <!-- debug properties --> > > <property name='useGP1' type='bool' parameter='1' default='false'/> > > <property name='debug_state' type='Ulonglong' arraylength='4' > > volatile='true' debug='false'/> > > <property name='debug_state1' type='Ulonglong' arraylength='4' > > volatile='true' debug='false'/> > > <property name='debug_state2' type='Ulonglong' arraylength='4' > > volatile='true' debug='false'/> > > > > <!-- Put any additional platform-specific properties here using > > <Property> --> > > <!-- Put any built-in (always present) devices here using <device> --> > > <!-- Put any card slots here using <slot> --> > > <!-- Put ad hoc signals here using <signal> --> > > > > > > <device worker='ad9361_adc'/> > > <device worker='ad9361_adc_sub'> > > <Property name='LVDS_P' value='false'/> > > </device> > > > > <device worker='ad9361_dac'/> > > <device worker='ad9361_dac_sub'> > > <Property name='LVDS_P' value='false'/> > > </device> > > > > <device worker='ad9361_data_sub'> > > <Property name='LVDS_P' value='false'/> > > <Signal name='DATA_CLK_N' platform=''/> > > <Signal name='FB_CLK_N' platform=''/> > > <Signal name='TX_FRAME_N' platform=''/> > > <Signal name='RX_FRAME_N' platform=''/> > > </device> > > > > <device Worker='ad9361_spi'/> > > <device Worker='ad9361_config'/> > > > > </HdlPlatform> > > > > Thanks! This is great! Were you planning on open sourcing this, or just > for your own little project? > > > > > > The only caveat is that those device workers in the platform xml also > need > > to be instanced in a platform config file or container. The platform and > > card XML simply dictate what's allowed to be instanced. Every device > worker > > needs to be instanced in either a platform or container. Here's an > example > > of one my HdlConfig: > > > > <HdlConfig Constraints="pluto_ad9361_txrx_sub_mode_2_cmos"> > > <device name="ad9361_spi"> > > <property name="CP_CLK_FREQ_HZ_p" value="100e6"/> <!-- we MUST > provide > > to this worker the pluto's control plane clock freq value --> > > </device> > > <device name="ad9361_config"/> > > <device name="ad9361_data_sub"> > > <property name="lvds_p" value="false"/> > > <property name="half_duplex_p" value="false"/> > > <property name="single_port_p" value="true"/> > > <property name="swap_ports_p" value="true"/> > > </device> > > <device name="ad9361_adc"/> > > <device name="ad9361_adc_sub"> > > <property name="lvds_p" value="false"/> > > <property name="half_duplex_p" value="false"/> > > <property name="single_port_p" value="true"/> > > </device> > > <device name="ad9361_dac"/> > > <device name="ad9361_dac_sub"> > > <property name="lvds_p" value="false"/> > > <property name="half_duplex_p" value="false"/> > > <property name="single_port_p" value="true"/> > > </device> > > </HdlConfig> > > > > This is also very good to know. I only had the ad9361_adc and ad9361_dac > in there before. What is interesting is that when I have the ad9361_adc > before the ad9361_adc_sub in the XML, I get the following error: > > For file ../../pluto/pluto_txrx.xml: Platform device 'ad9361_adc_sub' is > already in the platform configuration > > Should I be adding a new "assembly" which defines all this stuff as opposed > to a different "configuration"? > > Thanks for all the guidance. > > Brian >
BP
Brian Padalino
Wed, Jan 8, 2020 7:09 PM

On Wed, Jan 8, 2020 at 1:52 PM Davis Hoover dhoover@geontech.com wrote:

For the platform XML:

  • for: device element: signal subelement: name attribute: value should
    match the signal names from the OWD (as you surmised)
  • for: device element: signal subelement: platform attribute: is only
    necessary if a) the device pin is not connected to the slot/FPGA, in which
    case its value should be an empty string, or b) the code-generated HDL
    top-level design's signal names do not match the signal names in the
    constraint file, in which case the value should be set to the value from
    the corresponding constraint file signal

So your ad9361_spi element of your platform XML should probably look
something like:

<device worker="ad9361_spi"> <signal name="SPI_CLK" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_DO" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_DI" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_ENB" platform='enter_signal_name_from_constraint_file'/> <signal name="RESETB" platform='enter_signal_name_from_constraint_file'/> </device>

Also, in your original post it sounded like you were adding signal elements
as subelements of the platform element, where the signal elements' name
attribute had values of ad9361_spi*. Such content is incorrect and maybe
part of the confusion. Device worker signals are automatically exposed at
the top level of the HDL design.

Thank you.  This helps clear up some confusion I had.  I was declaring a
signal outside of the device, which seems incorrect.  The platform
attribute in the device element inside the HdlPlatform node is the only
thing required to perform the mapping.

It seems the HdlConfig instantiates the elements and I still need to have a
base configuration as well as my txrx configuration which is "fixed" on the
PCB - no slots.  Understandable.

For the "Platform device 'ad9361_adc_sub' is already in the platform
configuration" error, I suspect you are running into a consequence of
auto-instantiation of subdevice workers. I'd recommend instancing the
device/subdevice workers in the platform config XML in the following order
(this is based off of the order within
projects/assets/hdl/platforms/zed/cfg_1rx_1tx_fmcomms_2_3_lpc_lvds.xml,
which is known to build successfully):

<device name="ad9361_spi"><device name="ad9361_data_sub"><device name="ad9361_config"><device name="ad9361_adc_sub"/><device name="ad9361_dac_sub"/><device name="ad9361_adc0"/><device name="ad9361_dac0"/>

I figured this out via trial and error.

I am still a little lost regarding the "top level" and when that gets
made.  I see this pluto_txrx_rv entity/component that gets created.  Is
that my top level?  I can't imagine it is.

My ultimate goal is to target the FSK application to the pluto.  I found
the assemblies in the assets/hdl/assemblies/fsk_modem and added one for my
pluto device.  Is this how I go about targeting this to make a top level?

Is there a simpler way to build a top level?  Is that the purpose of the
matchstiq_z1 empty assembly?

Thanks,
Brian

On Wed, Jan 8, 2020 at 1:52 PM Davis Hoover <dhoover@geontech.com> wrote: > For the platform XML: > * for: device element: signal subelement: name attribute: value should > match the signal names from the OWD (as you surmised) > * for: device element: signal subelement: platform attribute: is only > necessary if a) the device pin is not connected to the slot/FPGA, in which > case its value should be an empty string, or b) the code-generated HDL > top-level design's signal names do not match the signal names in the > constraint file, in which case the value should be set to the value from > the corresponding constraint file signal > > So your ad9361_spi element of your platform XML should probably look > something like: > > <device worker="ad9361_spi"> > <signal name="SPI_CLK" > platform='enter_signal_name_from_constraint_file'/> > <signal name="SPI_DO" > platform='enter_signal_name_from_constraint_file'/> > <signal name="SPI_DI" > platform='enter_signal_name_from_constraint_file'/> > <signal name="SPI_ENB" > platform='enter_signal_name_from_constraint_file'/> > <signal name="RESETB" > platform='enter_signal_name_from_constraint_file'/> > </device> > > Also, in your original post it sounded like you were adding signal elements > as subelements of the platform element, where the signal elements' name > attribute had values of ad9361_spi*. Such content is incorrect and maybe > part of the confusion. Device worker signals are automatically exposed at > the top level of the HDL design. > Thank you. This helps clear up some confusion I had. I was declaring a signal outside of the device, which seems incorrect. The platform attribute in the device element inside the HdlPlatform node is the only thing required to perform the mapping. It seems the HdlConfig instantiates the elements and I still need to have a base configuration as well as my txrx configuration which is "fixed" on the PCB - no slots. Understandable. > > For the "Platform device 'ad9361_adc_sub' is already in the platform > configuration" error, I suspect you are running into a consequence of > auto-instantiation of subdevice workers. I'd recommend instancing the > device/subdevice workers in the platform config XML in the following order > (this is based off of the order within > projects/assets/hdl/platforms/zed/cfg_1rx_1tx_fmcomms_2_3_lpc_lvds.xml, > which is known to build successfully): > > <device name="ad9361_spi"><device name="ad9361_data_sub"><device > name="ad9361_config"><device name="ad9361_adc_sub"/><device > name="ad9361_dac_sub"/><device name="ad9361_adc0"/><device > name="ad9361_dac0"/> > I figured this out via trial and error. I am still a little lost regarding the "top level" and when that gets made. I see this pluto_txrx_rv entity/component that gets created. Is that my top level? I can't imagine it is. My ultimate goal is to target the FSK application to the pluto. I found the assemblies in the assets/hdl/assemblies/fsk_modem and added one for my pluto device. Is this how I go about targeting this to make a top level? Is there a simpler way to build a top level? Is that the purpose of the matchstiq_z1 empty assembly? Thanks, Brian
AO
Aaron Olivarez
Wed, Jan 8, 2020 7:18 PM

The top level is made when you build the assembly. The work I'm doing is
going to be open sourced and I'm targeting the same example applications.
The issue I've run into is that 7010 is smaller than 7020 and hitting
resource boundaries when implementing fsk_modem assembly.

On Wed, Jan 8, 2020 at 1:10 PM Brian Padalino bpadalino@gmail.com wrote:

On Wed, Jan 8, 2020 at 1:52 PM Davis Hoover dhoover@geontech.com wrote:

For the platform XML:

  • for: device element: signal subelement: name attribute: value should
    match the signal names from the OWD (as you surmised)
  • for: device element: signal subelement: platform attribute: is only
    necessary if a) the device pin is not connected to the slot/FPGA, in
    which
    case its value should be an empty string, or b) the code-generated HDL
    top-level design's signal names do not match the signal names in the
    constraint file, in which case the value should be set to the value from
    the corresponding constraint file signal

So your ad9361_spi element of your platform XML should probably look
something like:

<device worker="ad9361_spi"> <signal name="SPI_CLK" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_DO" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_DI" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_ENB" platform='enter_signal_name_from_constraint_file'/> <signal name="RESETB" platform='enter_signal_name_from_constraint_file'/> </device>

Also, in your original post it sounded like you were adding signal
elements
as subelements of the platform element, where the signal elements' name
attribute had values of ad9361_spi*. Such content is incorrect and maybe
part of the confusion. Device worker signals are automatically exposed at
the top level of the HDL design.

Thank you.  This helps clear up some confusion I had.  I was declaring a
signal outside of the device, which seems incorrect.  The platform
attribute in the device element inside the HdlPlatform node is the only
thing required to perform the mapping.

It seems the HdlConfig instantiates the elements and I still need to have a
base configuration as well as my txrx configuration which is "fixed" on the
PCB - no slots.  Understandable.

For the "Platform device 'ad9361_adc_sub' is already in the platform
configuration" error, I suspect you are running into a consequence of
auto-instantiation of subdevice workers. I'd recommend instancing the
device/subdevice workers in the platform config XML in the following
order
(this is based off of the order within
projects/assets/hdl/platforms/zed/cfg_1rx_1tx_fmcomms_2_3_lpc_lvds.xml,
which is known to build successfully):

<device name="ad9361_spi"><device name="ad9361_data_sub"><device name="ad9361_config"><device name="ad9361_adc_sub"/><device name="ad9361_dac_sub"/><device name="ad9361_adc0"/><device name="ad9361_dac0"/>

I figured this out via trial and error.

I am still a little lost regarding the "top level" and when that gets
made.  I see this pluto_txrx_rv entity/component that gets created.  Is
that my top level?  I can't imagine it is.

My ultimate goal is to target the FSK application to the pluto.  I found
the assemblies in the assets/hdl/assemblies/fsk_modem and added one for my
pluto device.  Is this how I go about targeting this to make a top level?

Is there a simpler way to build a top level?  Is that the purpose of the
matchstiq_z1 empty assembly?

Thanks,
Brian

The top level is made when you build the assembly. The work I'm doing is going to be open sourced and I'm targeting the same example applications. The issue I've run into is that 7010 is smaller than 7020 and hitting resource boundaries when implementing fsk_modem assembly. On Wed, Jan 8, 2020 at 1:10 PM Brian Padalino <bpadalino@gmail.com> wrote: > On Wed, Jan 8, 2020 at 1:52 PM Davis Hoover <dhoover@geontech.com> wrote: > > > For the platform XML: > > * for: device element: signal subelement: name attribute: value should > > match the signal names from the OWD (as you surmised) > > * for: device element: signal subelement: platform attribute: is only > > necessary if a) the device pin is not connected to the slot/FPGA, in > which > > case its value should be an empty string, or b) the code-generated HDL > > top-level design's signal names do not match the signal names in the > > constraint file, in which case the value should be set to the value from > > the corresponding constraint file signal > > > > So your ad9361_spi element of your platform XML should probably look > > something like: > > > > <device worker="ad9361_spi"> > > <signal name="SPI_CLK" > > platform='enter_signal_name_from_constraint_file'/> > > <signal name="SPI_DO" > > platform='enter_signal_name_from_constraint_file'/> > > <signal name="SPI_DI" > > platform='enter_signal_name_from_constraint_file'/> > > <signal name="SPI_ENB" > > platform='enter_signal_name_from_constraint_file'/> > > <signal name="RESETB" > > platform='enter_signal_name_from_constraint_file'/> > > </device> > > > > Also, in your original post it sounded like you were adding signal > elements > > as subelements of the platform element, where the signal elements' name > > attribute had values of ad9361_spi*. Such content is incorrect and maybe > > part of the confusion. Device worker signals are automatically exposed at > > the top level of the HDL design. > > > > Thank you. This helps clear up some confusion I had. I was declaring a > signal outside of the device, which seems incorrect. The platform > attribute in the device element inside the HdlPlatform node is the only > thing required to perform the mapping. > > It seems the HdlConfig instantiates the elements and I still need to have a > base configuration as well as my txrx configuration which is "fixed" on the > PCB - no slots. Understandable. > > > > > > For the "Platform device 'ad9361_adc_sub' is already in the platform > > configuration" error, I suspect you are running into a consequence of > > auto-instantiation of subdevice workers. I'd recommend instancing the > > device/subdevice workers in the platform config XML in the following > order > > (this is based off of the order within > > projects/assets/hdl/platforms/zed/cfg_1rx_1tx_fmcomms_2_3_lpc_lvds.xml, > > which is known to build successfully): > > > > <device name="ad9361_spi"><device name="ad9361_data_sub"><device > > name="ad9361_config"><device name="ad9361_adc_sub"/><device > > name="ad9361_dac_sub"/><device name="ad9361_adc0"/><device > > name="ad9361_dac0"/> > > > > I figured this out via trial and error. > > I am still a little lost regarding the "top level" and when that gets > made. I see this pluto_txrx_rv entity/component that gets created. Is > that my top level? I can't imagine it is. > > My ultimate goal is to target the FSK application to the pluto. I found > the assemblies in the assets/hdl/assemblies/fsk_modem and added one for my > pluto device. Is this how I go about targeting this to make a top level? > > Is there a simpler way to build a top level? Is that the purpose of the > matchstiq_z1 empty assembly? > > Thanks, > Brian >
DH
Davis Hoover
Wed, Jan 8, 2020 7:28 PM

Some more background info if it helps:

When you build from a hdl/platform/<foo> directory, it builds the platform
worker and all platform configs. For Vivado the worker and configs are
built as .edfs. A platform config can (and should, if device workers are
instantiated, in order to keep the device worker and its constraints
"together") reference a constraints file.

Then you build from a hdl/assemblies/<my_assembly> directory. An assembly
is built, again as an .edf if Vivado is used. Then a container is built,
which is synonymous with the top-level HDL design. Unless the assembly
makefile overrides the default, a default container is built which uses the
base config. A custom container can also be built, which can instantiate
device workers directly, and/or it can reference a platform config. A
container can also have a constraints file (or it can simply point to a
platform config which may already have its own constraints file)

So the FSK assembly uses custom containers, each of which follow the
platform-config-containing-constraints-and-device-workers paradigm. For
Vivado this yields a hierarchy of:

  • container/bitstream
    • assembly .edf
      • application worker .edf
      • application worker .edf
      • ...
    • platform config .edf (w/ constraints file)
      • device worker .edf
      • device worker .edf
      • ...

On Wed, Jan 8, 2020 at 2:18 PM Aaron Olivarez aaron@olivarez.info wrote:

The top level is made when you build the assembly. The work I'm doing is
going to be open sourced and I'm targeting the same example applications.
The issue I've run into is that 7010 is smaller than 7020 and hitting
resource boundaries when implementing fsk_modem assembly.

On Wed, Jan 8, 2020 at 1:10 PM Brian Padalino bpadalino@gmail.com wrote:

On Wed, Jan 8, 2020 at 1:52 PM Davis Hoover dhoover@geontech.com wrote:

For the platform XML:

  • for: device element: signal subelement: name attribute: value should
    match the signal names from the OWD (as you surmised)
  • for: device element: signal subelement: platform attribute: is only
    necessary if a) the device pin is not connected to the slot/FPGA, in
    which
    case its value should be an empty string, or b) the code-generated HDL
    top-level design's signal names do not match the signal names in the
    constraint file, in which case the value should be set to the value from
    the corresponding constraint file signal

So your ad9361_spi element of your platform XML should probably look
something like:

<device worker="ad9361_spi"> <signal name="SPI_CLK" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_DO" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_DI" platform='enter_signal_name_from_constraint_file'/> <signal name="SPI_ENB" platform='enter_signal_name_from_constraint_file'/> <signal name="RESETB" platform='enter_signal_name_from_constraint_file'/> </device>

Also, in your original post it sounded like you were adding signal
elements
as subelements of the platform element, where the signal elements' name
attribute had values of ad9361_spi*. Such content is incorrect and maybe
part of the confusion. Device worker signals are automatically exposed
at
the top level of the HDL design.

Thank you.  This helps clear up some confusion I had.  I was declaring a
signal outside of the device, which seems incorrect.  The platform
attribute in the device element inside the HdlPlatform node is the only
thing required to perform the mapping.

It seems the HdlConfig instantiates the elements and I still need to have
a
base configuration as well as my txrx configuration which is "fixed" on
the
PCB - no slots.  Understandable.

For the "Platform device 'ad9361_adc_sub' is already in the platform
configuration" error, I suspect you are running into a consequence of
auto-instantiation of subdevice workers. I'd recommend instancing the
device/subdevice workers in the platform config XML in the following
order
(this is based off of the order within
projects/assets/hdl/platforms/zed/cfg_1rx_1tx_fmcomms_2_3_lpc_lvds.xml,
which is known to build successfully):

<device name="ad9361_spi"><device name="ad9361_data_sub"><device name="ad9361_config"><device name="ad9361_adc_sub"/><device name="ad9361_dac_sub"/><device name="ad9361_adc0"/><device name="ad9361_dac0"/>

I figured this out via trial and error.

I am still a little lost regarding the "top level" and when that gets
made.  I see this pluto_txrx_rv entity/component that gets created.  Is
that my top level?  I can't imagine it is.

My ultimate goal is to target the FSK application to the pluto.  I found
the assemblies in the assets/hdl/assemblies/fsk_modem and added one for my
pluto device.  Is this how I go about targeting this to make a top level?

Is there a simpler way to build a top level?  Is that the purpose of the
matchstiq_z1 empty assembly?

Thanks,
Brian

Some more background info if it helps: When you build from a hdl/platform/<foo> directory, it builds the platform worker and all platform configs. For Vivado the worker and configs are built as .edfs. A platform config can (and should, if device workers are instantiated, in order to keep the device worker and its constraints "together") reference a constraints file. Then you build from a hdl/assemblies/<my_assembly> directory. An assembly is built, again as an .edf if Vivado is used. Then a container is built, which is synonymous with the top-level HDL design. Unless the assembly makefile overrides the default, a default container is built which uses the base config. A custom container can also be built, which can instantiate device workers directly, and/or it can reference a platform config. A container can also have a constraints file (or it can simply point to a platform config which may already have its own constraints file) So the FSK assembly uses custom containers, each of which follow the platform-config-containing-constraints-and-device-workers paradigm. For Vivado this yields a hierarchy of: * container/bitstream * assembly .edf * application worker .edf * application worker .edf * ... * platform config .edf (w/ constraints file) * device worker .edf * device worker .edf * ... On Wed, Jan 8, 2020 at 2:18 PM Aaron Olivarez <aaron@olivarez.info> wrote: > The top level is made when you build the assembly. The work I'm doing is > going to be open sourced and I'm targeting the same example applications. > The issue I've run into is that 7010 is smaller than 7020 and hitting > resource boundaries when implementing fsk_modem assembly. > > On Wed, Jan 8, 2020 at 1:10 PM Brian Padalino <bpadalino@gmail.com> wrote: > >> On Wed, Jan 8, 2020 at 1:52 PM Davis Hoover <dhoover@geontech.com> wrote: >> >> > For the platform XML: >> > * for: device element: signal subelement: name attribute: value should >> > match the signal names from the OWD (as you surmised) >> > * for: device element: signal subelement: platform attribute: is only >> > necessary if a) the device pin is not connected to the slot/FPGA, in >> which >> > case its value should be an empty string, or b) the code-generated HDL >> > top-level design's signal names do not match the signal names in the >> > constraint file, in which case the value should be set to the value from >> > the corresponding constraint file signal >> > >> > So your ad9361_spi element of your platform XML should probably look >> > something like: >> > >> > <device worker="ad9361_spi"> >> > <signal name="SPI_CLK" >> > platform='enter_signal_name_from_constraint_file'/> >> > <signal name="SPI_DO" >> > platform='enter_signal_name_from_constraint_file'/> >> > <signal name="SPI_DI" >> > platform='enter_signal_name_from_constraint_file'/> >> > <signal name="SPI_ENB" >> > platform='enter_signal_name_from_constraint_file'/> >> > <signal name="RESETB" >> > platform='enter_signal_name_from_constraint_file'/> >> > </device> >> > >> > Also, in your original post it sounded like you were adding signal >> elements >> > as subelements of the platform element, where the signal elements' name >> > attribute had values of ad9361_spi*. Such content is incorrect and maybe >> > part of the confusion. Device worker signals are automatically exposed >> at >> > the top level of the HDL design. >> > >> >> Thank you. This helps clear up some confusion I had. I was declaring a >> signal outside of the device, which seems incorrect. The platform >> attribute in the device element inside the HdlPlatform node is the only >> thing required to perform the mapping. >> >> It seems the HdlConfig instantiates the elements and I still need to have >> a >> base configuration as well as my txrx configuration which is "fixed" on >> the >> PCB - no slots. Understandable. >> >> >> > >> > For the "Platform device 'ad9361_adc_sub' is already in the platform >> > configuration" error, I suspect you are running into a consequence of >> > auto-instantiation of subdevice workers. I'd recommend instancing the >> > device/subdevice workers in the platform config XML in the following >> order >> > (this is based off of the order within >> > projects/assets/hdl/platforms/zed/cfg_1rx_1tx_fmcomms_2_3_lpc_lvds.xml, >> > which is known to build successfully): >> > >> > <device name="ad9361_spi"><device name="ad9361_data_sub"><device >> > name="ad9361_config"><device name="ad9361_adc_sub"/><device >> > name="ad9361_dac_sub"/><device name="ad9361_adc0"/><device >> > name="ad9361_dac0"/> >> > >> >> I figured this out via trial and error. >> >> I am still a little lost regarding the "top level" and when that gets >> made. I see this pluto_txrx_rv entity/component that gets created. Is >> that my top level? I can't imagine it is. >> >> My ultimate goal is to target the FSK application to the pluto. I found >> the assemblies in the assets/hdl/assemblies/fsk_modem and added one for my >> pluto device. Is this how I go about targeting this to make a top level? >> >> Is there a simpler way to build a top level? Is that the purpose of the >> matchstiq_z1 empty assembly? >> >> Thanks, >> Brian >>
BP
Brian Padalino
Wed, Jan 8, 2020 7:29 PM

On Wed, Jan 8, 2020 at 2:18 PM Aaron Olivarez aaron@olivarez.info wrote:

The top level is made when you build the assembly. The work I'm doing is
going to be open sourced and I'm targeting the same example applications.
The issue I've run into is that 7010 is smaller than 7020 and hitting
resource boundaries when implementing fsk_modem assembly.

Do you need to modify the opencpi git repository location where the
fsk_modem asset lives to target your newly created pluto target?

Or can that be done out of tree?

Thanks,
Brian

On Wed, Jan 8, 2020 at 2:18 PM Aaron Olivarez <aaron@olivarez.info> wrote: > The top level is made when you build the assembly. The work I'm doing is > going to be open sourced and I'm targeting the same example applications. > The issue I've run into is that 7010 is smaller than 7020 and hitting > resource boundaries when implementing fsk_modem assembly. > Do you need to modify the opencpi git repository location where the fsk_modem asset lives to target your newly created pluto target? Or can that be done out of tree? Thanks, Brian
DH
Davis Hoover
Wed, Jan 8, 2020 7:38 PM

If you have a BSP-specific project, the current best practice is to copy
the assembly XML in your BSP project, and define a custom container there.
Reference:
https://github.com/opencpi/av.bsp.e310/tree/develop/hdl/assemblies/fsk_modem

On Wed, Jan 8, 2020 at 2:29 PM Brian Padalino bpadalino@gmail.com wrote:

On Wed, Jan 8, 2020 at 2:18 PM Aaron Olivarez aaron@olivarez.info wrote:

The top level is made when you build the assembly. The work I'm doing is
going to be open sourced and I'm targeting the same example applications.
The issue I've run into is that 7010 is smaller than 7020 and hitting
resource boundaries when implementing fsk_modem assembly.

Do you need to modify the opencpi git repository location where the
fsk_modem asset lives to target your newly created pluto target?

Or can that be done out of tree?

Thanks,
Brian

If you have a BSP-specific project, the current best practice is to copy the assembly XML in your BSP project, and define a custom container there. Reference: https://github.com/opencpi/av.bsp.e310/tree/develop/hdl/assemblies/fsk_modem On Wed, Jan 8, 2020 at 2:29 PM Brian Padalino <bpadalino@gmail.com> wrote: > On Wed, Jan 8, 2020 at 2:18 PM Aaron Olivarez <aaron@olivarez.info> wrote: > >> The top level is made when you build the assembly. The work I'm doing is >> going to be open sourced and I'm targeting the same example applications. >> The issue I've run into is that 7010 is smaller than 7020 and hitting >> resource boundaries when implementing fsk_modem assembly. >> > > Do you need to modify the opencpi git repository location where the > fsk_modem asset lives to target your newly created pluto target? > > Or can that be done out of tree? > > Thanks, > Brian >