usrp-users@lists.ettus.com

Discussion and technical support related to USRP, UHD, RFNoC

View all threads

Latest X310 RFNoC FPGA build

MW
Michael Wentz
Thu, Aug 25, 2016 6:19 PM

Hi,

I'm evaluating updating an X310 design from the old rfnoc-devel (before
radio-redo was merged) and recently pulled all the updates to the host
code, gr-ettus, and the FPGA source. The bitfile I get from
uhd_images_downloader works, but if I build the X310_RFNOC_HG image myself
I get an error when running uhd_usrp_probe as shown below. The only changes
I made were to the rfnoc_ce_auto_inst_x310.v file. I added in two DDCs with
.NUM_CHAINS(1), two DUCs, and a FIFO. Based on a post earlier, I think this
error is because the software expects DDCs with NUM_CHAINS(2). Is that
correct, and if so, will it be fixed soon?

I also noticed that before the merge, about 75% of the FPGA slice logic was
free (with no RFNoC blocks). Now it is about 48%, and will be even less
when I rebuild with the dual-channel DDCs. Are these numbers expected? If
so, what could I do to free up more space? My design takes up about 40% of
the slice logic so fitting it into this new image looks like it will be a
real challenge.

-Michael

-- [RFNOC] ------- Block Setup -----------

-- Setting up NoC-Shell Control for port #0 (SID: 00:06>02:60)...OK

Error: EnvironmentError: IOError: Block ctrl (CE_03_Port_60) no response
packet - AssertionError: bool(buff)

in uint64_t ctrl_iface_impl::wait_for_ack(bool)

at path/to/uhd/host/lib/rfnoc/ctrl_iface.cpp:205

Hi, I'm evaluating updating an X310 design from the old rfnoc-devel (before radio-redo was merged) and recently pulled all the updates to the host code, gr-ettus, and the FPGA source. The bitfile I get from uhd_images_downloader works, but if I build the X310_RFNOC_HG image myself I get an error when running uhd_usrp_probe as shown below. The only changes I made were to the rfnoc_ce_auto_inst_x310.v file. I added in two DDCs with .NUM_CHAINS(1), two DUCs, and a FIFO. Based on a post earlier, I think this error is because the software expects DDCs with NUM_CHAINS(2). Is that correct, and if so, will it be fixed soon? I also noticed that before the merge, about 75% of the FPGA slice logic was free (with no RFNoC blocks). Now it is about 48%, and will be even less when I rebuild with the dual-channel DDCs. Are these numbers expected? If so, what could I do to free up more space? My design takes up about 40% of the slice logic so fitting it into this new image looks like it will be a real challenge. -Michael -- [RFNOC] ------- Block Setup ----------- -- Setting up NoC-Shell Control for port #0 (SID: 00:06>02:60)...OK Error: EnvironmentError: IOError: Block ctrl (CE_03_Port_60) no response packet - AssertionError: bool(buff) in uint64_t ctrl_iface_impl::wait_for_ack(bool) at path/to/uhd/host/lib/rfnoc/ctrl_iface.cpp:205
MB
Martin Braun
Fri, Aug 26, 2016 4:45 PM

Michael,

some comments:

On 08/25/2016 11:19 AM, Michael Wentz via USRP-users wrote:

I'm evaluating updating an X310 design from the old rfnoc-devel (before
radio-redo was merged) and recently pulled all the updates to the host
code, gr-ettus, and the FPGA source. The bitfile I get from
uhd_images_downloader works, but if I build the X310_RFNOC_HG image
myself I get an error when running uhd_usrp_probe as shown below. The
only changes I made were to the rfnoc_ce_auto_inst_x310.v file. I added

Did you update NUM_CE? That's what typically causes this.

in two DDCs with .NUM_CHAINS(1), two DUCs, and a FIFO. Based on a post
earlier, I think this error is because the software expects DDCs with
NUM_CHAINS(2). Is that correct, and if so, will it be fixed soon?

That's also a possibility. The current workaround that we provide is
that you use a different NOC_ID (DDC0000000000001). There's no
auto-detection of number of ports (yet).

I also noticed that before the merge, about 75% of the FPGA slice logic
was free (with no RFNoC blocks). Now it is about 48%, and will be even
less when I rebuild with the dual-channel DDCs. Are these numbers
expected? If so, what could I do to free up more space? My design takes
up about 40% of the slice logic so fitting it into this new image looks
like it will be a real challenge.

Between old RFNoC and current rfnoc-devel (i.e. after the radio-redo
merge) there was indeed an increase in resource utilization. Jonathon is
currently working on reducing that. However, note that there are a
couple of differences:

  • We now include a DRAM FIFO block (always) on top of the radio blocks.
  • By default, we now have 2 radios per radio block (so 4 radios total)
    to work with TwinRX. You can reduce utilization further by scaling that
    back to 1 radio per block.
  • Having DDCs and DUCs in separate blocks is more resource intensive
    than having them in the radio. So, the sum of new radio + new DSP blocks
    is >> than the old radio.

Cheers,
M

-Michael

-- [RFNOC] ------- Block Setup -----------

-- Setting up NoC-Shell Control for port #0 (SID: 00:06>02:60)...OK

Error: EnvironmentError: IOError: Block ctrl (CE_03_Port_60) no response
packet - AssertionError: bool(buff)

in uint64_t ctrl_iface_impl::wait_for_ack(bool)

at path/to/uhd/host/lib/rfnoc/ctrl_iface.cpp:205


USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Michael, some comments: On 08/25/2016 11:19 AM, Michael Wentz via USRP-users wrote: > I'm evaluating updating an X310 design from the old rfnoc-devel (before > radio-redo was merged) and recently pulled all the updates to the host > code, gr-ettus, and the FPGA source. The bitfile I get from > uhd_images_downloader works, but if I build the X310_RFNOC_HG image > myself I get an error when running uhd_usrp_probe as shown below. The > only changes I made were to the rfnoc_ce_auto_inst_x310.v file. I added Did you update NUM_CE? That's what typically causes this. > in two DDCs with .NUM_CHAINS(1), two DUCs, and a FIFO. Based on a post > earlier, I think this error is because the software expects DDCs with > NUM_CHAINS(2). Is that correct, and if so, will it be fixed soon? That's also a possibility. The current workaround that we provide is that you use a different NOC_ID (DDC0000000000001). There's no auto-detection of number of ports (yet). > I also noticed that before the merge, about 75% of the FPGA slice logic > was free (with no RFNoC blocks). Now it is about 48%, and will be even > less when I rebuild with the dual-channel DDCs. Are these numbers > expected? If so, what could I do to free up more space? My design takes > up about 40% of the slice logic so fitting it into this new image looks > like it will be a real challenge. Between old RFNoC and current rfnoc-devel (i.e. after the radio-redo merge) there was indeed an increase in resource utilization. Jonathon is currently working on reducing that. However, note that there are a couple of differences: - We now include a DRAM FIFO block (always) on top of the radio blocks. - By default, we now have 2 radios per radio block (so 4 radios total) to work with TwinRX. You can reduce utilization further by scaling that back to 1 radio per block. - Having DDCs and DUCs in separate blocks is more resource intensive than having them in the radio. So, the sum of new radio + new DSP blocks is >> than the old radio. Cheers, M > > -Michael > > -- [RFNOC] ------- Block Setup ----------- > > -- Setting up NoC-Shell Control for port #0 (SID: 00:06>02:60)...OK > > Error: EnvironmentError: IOError: Block ctrl (CE_03_Port_60) no response > packet - AssertionError: bool(buff) > > in uint64_t ctrl_iface_impl::wait_for_ack(bool) > > at path/to/uhd/host/lib/rfnoc/ctrl_iface.cpp:205 > > > > _______________________________________________ > USRP-users mailing list > USRP-users@lists.ettus.com > http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com >
MW
Michael Wentz
Fri, Aug 26, 2016 7:44 PM

Hi Martin,

I did have NUM_CE set correctly, it ended up being NUM_CHAINS = 1 that was
the problem. Good to know that I can update the NOC ID to get around that
too.

Totally understand that by making things more modular they'll have a larger
footprint - I'll try building with fewer radios and a single DDC/DUC.

I also had a question regarding the axi_rate_change module that is in the
new DDC and DUC. When should someone include that in their design? If I am
dealing with a sample stream (no sensitivities to packetization, EOB,
timing, etc.) is it necessary?

Thanks,
Michael

On Fri, Aug 26, 2016 at 12:45 PM, Martin Braun via USRP-users <
usrp-users@lists.ettus.com> wrote:

Michael,

some comments:

On 08/25/2016 11:19 AM, Michael Wentz via USRP-users wrote:

I'm evaluating updating an X310 design from the old rfnoc-devel (before
radio-redo was merged) and recently pulled all the updates to the host
code, gr-ettus, and the FPGA source. The bitfile I get from
uhd_images_downloader works, but if I build the X310_RFNOC_HG image
myself I get an error when running uhd_usrp_probe as shown below. The
only changes I made were to the rfnoc_ce_auto_inst_x310.v file. I added

Did you update NUM_CE? That's what typically causes this.

in two DDCs with .NUM_CHAINS(1), two DUCs, and a FIFO. Based on a post
earlier, I think this error is because the software expects DDCs with
NUM_CHAINS(2). Is that correct, and if so, will it be fixed soon?

That's also a possibility. The current workaround that we provide is
that you use a different NOC_ID (DDC0000000000001). There's no
auto-detection of number of ports (yet).

I also noticed that before the merge, about 75% of the FPGA slice logic
was free (with no RFNoC blocks). Now it is about 48%, and will be even
less when I rebuild with the dual-channel DDCs. Are these numbers
expected? If so, what could I do to free up more space? My design takes
up about 40% of the slice logic so fitting it into this new image looks
like it will be a real challenge.

Between old RFNoC and current rfnoc-devel (i.e. after the radio-redo
merge) there was indeed an increase in resource utilization. Jonathon is
currently working on reducing that. However, note that there are a
couple of differences:

  • We now include a DRAM FIFO block (always) on top of the radio blocks.
  • By default, we now have 2 radios per radio block (so 4 radios total)
    to work with TwinRX. You can reduce utilization further by scaling that
    back to 1 radio per block.
  • Having DDCs and DUCs in separate blocks is more resource intensive
    than having them in the radio. So, the sum of new radio + new DSP blocks
    is >> than the old radio.

Cheers,
M

-Michael

-- [RFNOC] ------- Block Setup -----------

-- Setting up NoC-Shell Control for port #0 (SID: 00:06>02:60)...OK

Error: EnvironmentError: IOError: Block ctrl (CE_03_Port_60) no response
packet - AssertionError: bool(buff)

in uint64_t ctrl_iface_impl::wait_for_ack(bool)

at path/to/uhd/host/lib/rfnoc/ctrl_iface.cpp:205


USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Hi Martin, I did have NUM_CE set correctly, it ended up being NUM_CHAINS = 1 that was the problem. Good to know that I can update the NOC ID to get around that too. Totally understand that by making things more modular they'll have a larger footprint - I'll try building with fewer radios and a single DDC/DUC. I also had a question regarding the axi_rate_change module that is in the new DDC and DUC. When should someone include that in their design? If I am dealing with a sample stream (no sensitivities to packetization, EOB, timing, etc.) is it necessary? Thanks, Michael On Fri, Aug 26, 2016 at 12:45 PM, Martin Braun via USRP-users < usrp-users@lists.ettus.com> wrote: > Michael, > > some comments: > > On 08/25/2016 11:19 AM, Michael Wentz via USRP-users wrote: > > I'm evaluating updating an X310 design from the old rfnoc-devel (before > > radio-redo was merged) and recently pulled all the updates to the host > > code, gr-ettus, and the FPGA source. The bitfile I get from > > uhd_images_downloader works, but if I build the X310_RFNOC_HG image > > myself I get an error when running uhd_usrp_probe as shown below. The > > only changes I made were to the rfnoc_ce_auto_inst_x310.v file. I added > > Did you update NUM_CE? That's what typically causes this. > > > in two DDCs with .NUM_CHAINS(1), two DUCs, and a FIFO. Based on a post > > earlier, I think this error is because the software expects DDCs with > > NUM_CHAINS(2). Is that correct, and if so, will it be fixed soon? > > That's also a possibility. The current workaround that we provide is > that you use a different NOC_ID (DDC0000000000001). There's no > auto-detection of number of ports (yet). > > > I also noticed that before the merge, about 75% of the FPGA slice logic > > was free (with no RFNoC blocks). Now it is about 48%, and will be even > > less when I rebuild with the dual-channel DDCs. Are these numbers > > expected? If so, what could I do to free up more space? My design takes > > up about 40% of the slice logic so fitting it into this new image looks > > like it will be a real challenge. > > Between old RFNoC and current rfnoc-devel (i.e. after the radio-redo > merge) there was indeed an increase in resource utilization. Jonathon is > currently working on reducing that. However, note that there are a > couple of differences: > - We now include a DRAM FIFO block (always) on top of the radio blocks. > - By default, we now have 2 radios per radio block (so 4 radios total) > to work with TwinRX. You can reduce utilization further by scaling that > back to 1 radio per block. > - Having DDCs and DUCs in separate blocks is more resource intensive > than having them in the radio. So, the sum of new radio + new DSP blocks > is >> than the old radio. > > Cheers, > M > > > > > -Michael > > > > -- [RFNOC] ------- Block Setup ----------- > > > > -- Setting up NoC-Shell Control for port #0 (SID: 00:06>02:60)...OK > > > > Error: EnvironmentError: IOError: Block ctrl (CE_03_Port_60) no response > > packet - AssertionError: bool(buff) > > > > in uint64_t ctrl_iface_impl::wait_for_ack(bool) > > > > at path/to/uhd/host/lib/rfnoc/ctrl_iface.cpp:205 > > > > > > > > _______________________________________________ > > USRP-users mailing list > > USRP-users@lists.ettus.com > > http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com > > > > > _______________________________________________ > USRP-users mailing list > USRP-users@lists.ettus.com > http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com >
MB
Martin Braun
Fri, Aug 26, 2016 9:06 PM

On 08/26/2016 12:44 PM, Michael Wentz wrote:

Hi Martin,

I did have NUM_CE set correctly, it ended up being NUM_CHAINS = 1 that
was the problem. Good to know that I can update the NOC ID to get around
that too.

Totally understand that by making things more modular they'll have a
larger footprint - I'll try building with fewer radios and a single DDC/DUC.

I also had a question regarding the axi_rate_change module that is in
the new DDC and DUC. When should someone include that in their design?
If I am dealing with a sample stream (no sensitivities to packetization,
EOB, timing, etc.) is it necessary?

No, this module is to facilitate writing blocks that actually change
rates. There is never a requirement to use it, but if you have a block
that takes N input packets for every 1 output packet, this module will
take care of handling the headers etc.

Cheers,
M

On 08/26/2016 12:44 PM, Michael Wentz wrote: > Hi Martin, > > I did have NUM_CE set correctly, it ended up being NUM_CHAINS = 1 that > was the problem. Good to know that I can update the NOC ID to get around > that too. > > Totally understand that by making things more modular they'll have a > larger footprint - I'll try building with fewer radios and a single DDC/DUC. > > I also had a question regarding the axi_rate_change module that is in > the new DDC and DUC. When should someone include that in their design? > If I am dealing with a sample stream (no sensitivities to packetization, > EOB, timing, etc.) is it necessary? No, this module is to facilitate writing blocks that actually change rates. There is never a requirement to use it, but if you have a block that takes N input packets for every 1 output packet, this module will take care of handling the headers etc. Cheers, M
MW
Michael Wentz
Fri, Aug 26, 2016 10:21 PM

Regarding rate changes, are there issues I could have trying to manage that
in my component? For example, if I decimate by 10, the valid out is asserted
once for every 10 valid inputs, and I keep the input/output packet sizes
identical by counting the number of valid outputs and asserting tlast when
the counter reaches 364 (assuming samples from the radio). I've tested
blocks that do this in sim and hardware and they appear to work but now I'm
wondering if there's more to a rate change than I thought?

Thanks,
Michael

On Friday, August 26, 2016, Martin Braun via USRP-users <
usrp-users@lists.ettus.com> wrote:

On 08/26/2016 12:44 PM, Michael Wentz wrote:

Hi Martin,

I did have NUM_CE set correctly, it ended up being NUM_CHAINS = 1 that
was the problem. Good to know that I can update the NOC ID to get around
that too.

Totally understand that by making things more modular they'll have a
larger footprint - I'll try building with fewer radios and a single

DDC/DUC.

I also had a question regarding the axi_rate_change module that is in
the new DDC and DUC. When should someone include that in their design?
If I am dealing with a sample stream (no sensitivities to packetization,
EOB, timing, etc.) is it necessary?

No, this module is to facilitate writing blocks that actually change
rates. There is never a requirement to use it, but if you have a block
that takes N input packets for every 1 output packet, this module will
take care of handling the headers etc.

Cheers,
M


USRP-users mailing list
USRP-users@lists.ettus.com javascript:;
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Regarding rate changes, are there issues I could have trying to manage that in my component? For example, if I decimate by 10, the valid out is asserted once for every 10 valid inputs, and I keep the input/output packet sizes identical by counting the number of valid outputs and asserting tlast when the counter reaches 364 (assuming samples from the radio). I've tested blocks that do this in sim and hardware and they appear to work but now I'm wondering if there's more to a rate change than I thought? Thanks, Michael On Friday, August 26, 2016, Martin Braun via USRP-users < usrp-users@lists.ettus.com> wrote: > On 08/26/2016 12:44 PM, Michael Wentz wrote: > > Hi Martin, > > > > I did have NUM_CE set correctly, it ended up being NUM_CHAINS = 1 that > > was the problem. Good to know that I can update the NOC ID to get around > > that too. > > > > Totally understand that by making things more modular they'll have a > > larger footprint - I'll try building with fewer radios and a single > DDC/DUC. > > > > I also had a question regarding the axi_rate_change module that is in > > the new DDC and DUC. When should someone include that in their design? > > If I am dealing with a sample stream (no sensitivities to packetization, > > EOB, timing, etc.) is it necessary? > > No, this module is to facilitate writing blocks that actually change > rates. There is never a requirement to use it, but if you have a block > that takes N input packets for every 1 output packet, this module will > take care of handling the headers etc. > > Cheers, > M > > _______________________________________________ > USRP-users mailing list > USRP-users@lists.ettus.com <javascript:;> > http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com >
JP
Jonathon Pendlum
Thu, Sep 15, 2016 6:10 PM

Hi Michael,

Rating changes in RFNoC can be very easy or fairly difficult depending on
what you want.

If you don't care about VITA time or EOB, rate changes are pretty simple.
You need to generate the header s_axis_data_tuser (since you cannot use
SIMPLE_MODE), but generating it is not difficult to do. You can use
cvita_hdr_encoder.v or cvita_hdr_modify.v along with m_axis_data_tuser.

However, most people care about VITA time and others care about EOB. When
you have those fields in a rate change block, there are several corner
cases that make things difficult (for example, what should happen when
decimating by 10 but you receive a packet with only 9 samples?) To make it
easier on the user, I wrote axi_rate_change.v. AXI rate change handles both
the header and the packet sizing for the user. All you have to do is
process the sample data with your algorithm.

Jonathon

On Fri, Aug 26, 2016 at 5:21 PM, Michael Wentz via USRP-users <
usrp-users@lists.ettus.com> wrote:

Regarding rate changes, are there issues I could have trying to
manage that in my component? For example, if I decimate by 10, the valid
out is asserted once for every 10 valid inputs, and I keep the
input/output packet sizes identical by counting the number of valid outputs
and asserting tlast when the counter reaches 364 (assuming samples from the
radio). I've tested blocks that do this in sim and hardware and they appear
to work but now I'm wondering if there's more to a rate change than I
thought?

Thanks,
Michael

On Friday, August 26, 2016, Martin Braun via USRP-users <
usrp-users@lists.ettus.com> wrote:

On 08/26/2016 12:44 PM, Michael Wentz wrote:

Hi Martin,

I did have NUM_CE set correctly, it ended up being NUM_CHAINS = 1 that
was the problem. Good to know that I can update the NOC ID to get around
that too.

Totally understand that by making things more modular they'll have a
larger footprint - I'll try building with fewer radios and a single

DDC/DUC.

I also had a question regarding the axi_rate_change module that is in
the new DDC and DUC. When should someone include that in their design?
If I am dealing with a sample stream (no sensitivities to packetization,
EOB, timing, etc.) is it necessary?

No, this module is to facilitate writing blocks that actually change
rates. There is never a requirement to use it, but if you have a block
that takes N input packets for every 1 output packet, this module will
take care of handling the headers etc.

Cheers,
M


USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Hi Michael, Rating changes in RFNoC can be very easy or fairly difficult depending on what you want. If you don't care about VITA time or EOB, rate changes are pretty simple. You need to generate the header s_axis_data_tuser (since you cannot use SIMPLE_MODE), but generating it is not difficult to do. You can use cvita_hdr_encoder.v or cvita_hdr_modify.v along with m_axis_data_tuser. However, most people care about VITA time and others care about EOB. When you have those fields in a rate change block, there are several corner cases that make things difficult (for example, what should happen when decimating by 10 but you receive a packet with only 9 samples?) To make it easier on the user, I wrote axi_rate_change.v. AXI rate change handles both the header and the packet sizing for the user. All you have to do is process the sample data with your algorithm. Jonathon On Fri, Aug 26, 2016 at 5:21 PM, Michael Wentz via USRP-users < usrp-users@lists.ettus.com> wrote: > Regarding rate changes, are there issues I could have trying to > manage that in my component? For example, if I decimate by 10, the valid > out is asserted once for every 10 valid inputs, and I keep the > input/output packet sizes identical by counting the number of valid outputs > and asserting tlast when the counter reaches 364 (assuming samples from the > radio). I've tested blocks that do this in sim and hardware and they appear > to work but now I'm wondering if there's more to a rate change than I > thought? > > Thanks, > Michael > > > On Friday, August 26, 2016, Martin Braun via USRP-users < > usrp-users@lists.ettus.com> wrote: > >> On 08/26/2016 12:44 PM, Michael Wentz wrote: >> > Hi Martin, >> > >> > I did have NUM_CE set correctly, it ended up being NUM_CHAINS = 1 that >> > was the problem. Good to know that I can update the NOC ID to get around >> > that too. >> > >> > Totally understand that by making things more modular they'll have a >> > larger footprint - I'll try building with fewer radios and a single >> DDC/DUC. >> > >> > I also had a question regarding the axi_rate_change module that is in >> > the new DDC and DUC. When should someone include that in their design? >> > If I am dealing with a sample stream (no sensitivities to packetization, >> > EOB, timing, etc.) is it necessary? >> >> No, this module is to facilitate writing blocks that actually change >> rates. There is never a requirement to use it, but if you have a block >> that takes N input packets for every 1 output packet, this module will >> take care of handling the headers etc. >> >> Cheers, >> M >> >> _______________________________________________ >> USRP-users mailing list >> USRP-users@lists.ettus.com >> http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com >> > > _______________________________________________ > USRP-users mailing list > USRP-users@lists.ettus.com > http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com > >
MW
Michael Wentz
Fri, Sep 16, 2016 1:00 AM

Jonathon,

Thanks for the feedback, it's clear to me what axi_rate_change.v provides
now. In my components so far I haven't done anything that cares about time
or EOB so I just did something like what's in the old version of the
keep_one_in_n block:

// Output CHDR packet header data, same as input except SRC / DST SID
fields.
assign s_axis_data_tuser =
{m_axis_data_tuser[127:96],m_axis_data_tuser[79:64],next_dst,m_axis_data_tuser[63:0]};

That seems to be working. Interestingly, I had gone without that and used
SIMPLE_MODE in the AXI wrapper, and that also worked, but only in the
receive path (transmit had problems).

-Michael

On Thu, Sep 15, 2016 at 2:10 PM, Jonathon Pendlum <
jonathon.pendlum@ettus.com> wrote:

Hi Michael,

Rating changes in RFNoC can be very easy or fairly difficult depending on
what you want.

If you don't care about VITA time or EOB, rate changes are pretty simple.
You need to generate the header s_axis_data_tuser (since you cannot use
SIMPLE_MODE), but generating it is not difficult to do. You can use
cvita_hdr_encoder.v or cvita_hdr_modify.v along with m_axis_data_tuser.

However, most people care about VITA time and others care about EOB. When
you have those fields in a rate change block, there are several corner
cases that make things difficult (for example, what should happen when
decimating by 10 but you receive a packet with only 9 samples?) To make it
easier on the user, I wrote axi_rate_change.v. AXI rate change handles both
the header and the packet sizing for the user. All you have to do is
process the sample data with your algorithm.

Jonathon

On Fri, Aug 26, 2016 at 5:21 PM, Michael Wentz via USRP-users <
usrp-users@lists.ettus.com> wrote:

Regarding rate changes, are there issues I could have trying to
manage that in my component? For example, if I decimate by 10, the valid
out is asserted once for every 10 valid inputs, and I keep the
input/output packet sizes identical by counting the number of valid outputs
and asserting tlast when the counter reaches 364 (assuming samples from the
radio). I've tested blocks that do this in sim and hardware and they appear
to work but now I'm wondering if there's more to a rate change than I
thought?

Thanks,
Michael

On Friday, August 26, 2016, Martin Braun via USRP-users <
usrp-users@lists.ettus.com> wrote:

On 08/26/2016 12:44 PM, Michael Wentz wrote:

Hi Martin,

I did have NUM_CE set correctly, it ended up being NUM_CHAINS = 1 that
was the problem. Good to know that I can update the NOC ID to get

around

that too.

Totally understand that by making things more modular they'll have a
larger footprint - I'll try building with fewer radios and a single

DDC/DUC.

I also had a question regarding the axi_rate_change module that is in
the new DDC and DUC. When should someone include that in their design?
If I am dealing with a sample stream (no sensitivities to

packetization,

EOB, timing, etc.) is it necessary?

No, this module is to facilitate writing blocks that actually change
rates. There is never a requirement to use it, but if you have a block
that takes N input packets for every 1 output packet, this module will
take care of handling the headers etc.

Cheers,
M


USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Jonathon, Thanks for the feedback, it's clear to me what axi_rate_change.v provides now. In my components so far I haven't done anything that cares about time or EOB so I just did something like what's in the old version of the keep_one_in_n block: // Output CHDR packet header data, same as input except SRC / DST SID fields. assign s_axis_data_tuser = {m_axis_data_tuser[127:96],m_axis_data_tuser[79:64],next_dst,m_axis_data_tuser[63:0]}; That seems to be working. Interestingly, I had gone without that and used SIMPLE_MODE in the AXI wrapper, and that also worked, but only in the receive path (transmit had problems). -Michael On Thu, Sep 15, 2016 at 2:10 PM, Jonathon Pendlum < jonathon.pendlum@ettus.com> wrote: > Hi Michael, > > Rating changes in RFNoC can be very easy or fairly difficult depending on > what you want. > > If you don't care about VITA time or EOB, rate changes are pretty simple. > You need to generate the header s_axis_data_tuser (since you cannot use > SIMPLE_MODE), but generating it is not difficult to do. You can use > cvita_hdr_encoder.v or cvita_hdr_modify.v along with m_axis_data_tuser. > > However, most people care about VITA time and others care about EOB. When > you have those fields in a rate change block, there are several corner > cases that make things difficult (for example, what should happen when > decimating by 10 but you receive a packet with only 9 samples?) To make it > easier on the user, I wrote axi_rate_change.v. AXI rate change handles both > the header and the packet sizing for the user. All you have to do is > process the sample data with your algorithm. > > > > Jonathon > > > > On Fri, Aug 26, 2016 at 5:21 PM, Michael Wentz via USRP-users < > usrp-users@lists.ettus.com> wrote: > >> Regarding rate changes, are there issues I could have trying to >> manage that in my component? For example, if I decimate by 10, the valid >> out is asserted once for every 10 valid inputs, and I keep the >> input/output packet sizes identical by counting the number of valid outputs >> and asserting tlast when the counter reaches 364 (assuming samples from the >> radio). I've tested blocks that do this in sim and hardware and they appear >> to work but now I'm wondering if there's more to a rate change than I >> thought? >> >> Thanks, >> Michael >> >> >> On Friday, August 26, 2016, Martin Braun via USRP-users < >> usrp-users@lists.ettus.com> wrote: >> >>> On 08/26/2016 12:44 PM, Michael Wentz wrote: >>> > Hi Martin, >>> > >>> > I did have NUM_CE set correctly, it ended up being NUM_CHAINS = 1 that >>> > was the problem. Good to know that I can update the NOC ID to get >>> around >>> > that too. >>> > >>> > Totally understand that by making things more modular they'll have a >>> > larger footprint - I'll try building with fewer radios and a single >>> DDC/DUC. >>> > >>> > I also had a question regarding the axi_rate_change module that is in >>> > the new DDC and DUC. When should someone include that in their design? >>> > If I am dealing with a sample stream (no sensitivities to >>> packetization, >>> > EOB, timing, etc.) is it necessary? >>> >>> No, this module is to facilitate writing blocks that actually change >>> rates. There is never a requirement to use it, but if you have a block >>> that takes N input packets for every 1 output packet, this module will >>> take care of handling the headers etc. >>> >>> Cheers, >>> M >>> >>> _______________________________________________ >>> USRP-users mailing list >>> USRP-users@lists.ettus.com >>> http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com >>> >> >> _______________________________________________ >> USRP-users mailing list >> USRP-users@lists.ettus.com >> http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com >> >> >
JP
Jonathon Pendlum
Fri, Sep 16, 2016 3:43 PM

Hey Michael,

SIMPLE_MODE instantiates a header FIFO in AXI Wrapper to store the headers
for you and it is assumed you produce a packet for every packet consumed in
a 1:1 ratio. If your block does a rate change, then either the header FIFO
will underflow (interpolating block) or overflow (decimating block) because
the FIFO is not being filled / emptied in a 1:1 ratio.

Jonathon

On Thu, Sep 15, 2016 at 8:00 PM, Michael Wentz mchlwntz@gmail.com wrote:

Jonathon,

Thanks for the feedback, it's clear to me what axi_rate_change.v provides
now. In my components so far I haven't done anything that cares about time
or EOB so I just did something like what's in the old version of the
keep_one_in_n block:

// Output CHDR packet header data, same as input except SRC / DST SID
fields.
assign s_axis_data_tuser = {m_axis_data_tuser[127:96],m_
axis_data_tuser[79:64],next_dst,m_axis_data_tuser[63:0]};

That seems to be working. Interestingly, I had gone without that and used
SIMPLE_MODE in the AXI wrapper, and that also worked, but only in the
receive path (transmit had problems).

-Michael

On Thu, Sep 15, 2016 at 2:10 PM, Jonathon Pendlum <
jonathon.pendlum@ettus.com> wrote:

Hi Michael,

Rating changes in RFNoC can be very easy or fairly difficult depending on
what you want.

If you don't care about VITA time or EOB, rate changes are pretty simple.
You need to generate the header s_axis_data_tuser (since you cannot use
SIMPLE_MODE), but generating it is not difficult to do. You can use
cvita_hdr_encoder.v or cvita_hdr_modify.v along with m_axis_data_tuser.

However, most people care about VITA time and others care about EOB. When
you have those fields in a rate change block, there are several corner
cases that make things difficult (for example, what should happen when
decimating by 10 but you receive a packet with only 9 samples?) To make it
easier on the user, I wrote axi_rate_change.v. AXI rate change handles both
the header and the packet sizing for the user. All you have to do is
process the sample data with your algorithm.

Jonathon

On Fri, Aug 26, 2016 at 5:21 PM, Michael Wentz via USRP-users <
usrp-users@lists.ettus.com> wrote:

Regarding rate changes, are there issues I could have trying to
manage that in my component? For example, if I decimate by 10, the valid
out is asserted once for every 10 valid inputs, and I keep the
input/output packet sizes identical by counting the number of valid outputs
and asserting tlast when the counter reaches 364 (assuming samples from the
radio). I've tested blocks that do this in sim and hardware and they appear
to work but now I'm wondering if there's more to a rate change than I
thought?

Thanks,
Michael

On Friday, August 26, 2016, Martin Braun via USRP-users <
usrp-users@lists.ettus.com> wrote:

On 08/26/2016 12:44 PM, Michael Wentz wrote:

Hi Martin,

I did have NUM_CE set correctly, it ended up being NUM_CHAINS = 1 that
was the problem. Good to know that I can update the NOC ID to get

around

that too.

Totally understand that by making things more modular they'll have a
larger footprint - I'll try building with fewer radios and a single

DDC/DUC.

I also had a question regarding the axi_rate_change module that is in
the new DDC and DUC. When should someone include that in their design?
If I am dealing with a sample stream (no sensitivities to

packetization,

EOB, timing, etc.) is it necessary?

No, this module is to facilitate writing blocks that actually change
rates. There is never a requirement to use it, but if you have a block
that takes N input packets for every 1 output packet, this module will
take care of handling the headers etc.

Cheers,
M


USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Hey Michael, SIMPLE_MODE instantiates a header FIFO in AXI Wrapper to store the headers for you and it is assumed you produce a packet for every packet consumed in a 1:1 ratio. If your block does a rate change, then either the header FIFO will underflow (interpolating block) or overflow (decimating block) because the FIFO is not being filled / emptied in a 1:1 ratio. Jonathon On Thu, Sep 15, 2016 at 8:00 PM, Michael Wentz <mchlwntz@gmail.com> wrote: > Jonathon, > > Thanks for the feedback, it's clear to me what axi_rate_change.v provides > now. In my components so far I haven't done anything that cares about time > or EOB so I just did something like what's in the old version of the > keep_one_in_n block: > > // Output CHDR packet header data, same as input except SRC / DST SID > fields. > assign s_axis_data_tuser = {m_axis_data_tuser[127:96],m_ > axis_data_tuser[79:64],next_dst,m_axis_data_tuser[63:0]}; > > That seems to be working. Interestingly, I had gone without that and used > SIMPLE_MODE in the AXI wrapper, and that also worked, but only in the > receive path (transmit had problems). > > -Michael > > On Thu, Sep 15, 2016 at 2:10 PM, Jonathon Pendlum < > jonathon.pendlum@ettus.com> wrote: > >> Hi Michael, >> >> Rating changes in RFNoC can be very easy or fairly difficult depending on >> what you want. >> >> If you don't care about VITA time or EOB, rate changes are pretty simple. >> You need to generate the header s_axis_data_tuser (since you cannot use >> SIMPLE_MODE), but generating it is not difficult to do. You can use >> cvita_hdr_encoder.v or cvita_hdr_modify.v along with m_axis_data_tuser. >> >> However, most people care about VITA time and others care about EOB. When >> you have those fields in a rate change block, there are several corner >> cases that make things difficult (for example, what should happen when >> decimating by 10 but you receive a packet with only 9 samples?) To make it >> easier on the user, I wrote axi_rate_change.v. AXI rate change handles both >> the header and the packet sizing for the user. All you have to do is >> process the sample data with your algorithm. >> >> >> >> Jonathon >> >> >> >> On Fri, Aug 26, 2016 at 5:21 PM, Michael Wentz via USRP-users < >> usrp-users@lists.ettus.com> wrote: >> >>> Regarding rate changes, are there issues I could have trying to >>> manage that in my component? For example, if I decimate by 10, the valid >>> out is asserted once for every 10 valid inputs, and I keep the >>> input/output packet sizes identical by counting the number of valid outputs >>> and asserting tlast when the counter reaches 364 (assuming samples from the >>> radio). I've tested blocks that do this in sim and hardware and they appear >>> to work but now I'm wondering if there's more to a rate change than I >>> thought? >>> >>> Thanks, >>> Michael >>> >>> >>> On Friday, August 26, 2016, Martin Braun via USRP-users < >>> usrp-users@lists.ettus.com> wrote: >>> >>>> On 08/26/2016 12:44 PM, Michael Wentz wrote: >>>> > Hi Martin, >>>> > >>>> > I did have NUM_CE set correctly, it ended up being NUM_CHAINS = 1 that >>>> > was the problem. Good to know that I can update the NOC ID to get >>>> around >>>> > that too. >>>> > >>>> > Totally understand that by making things more modular they'll have a >>>> > larger footprint - I'll try building with fewer radios and a single >>>> DDC/DUC. >>>> > >>>> > I also had a question regarding the axi_rate_change module that is in >>>> > the new DDC and DUC. When should someone include that in their design? >>>> > If I am dealing with a sample stream (no sensitivities to >>>> packetization, >>>> > EOB, timing, etc.) is it necessary? >>>> >>>> No, this module is to facilitate writing blocks that actually change >>>> rates. There is never a requirement to use it, but if you have a block >>>> that takes N input packets for every 1 output packet, this module will >>>> take care of handling the headers etc. >>>> >>>> Cheers, >>>> M >>>> >>>> _______________________________________________ >>>> USRP-users mailing list >>>> USRP-users@lists.ettus.com >>>> http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com >>>> >>> >>> _______________________________________________ >>> USRP-users mailing list >>> USRP-users@lists.ettus.com >>> http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com >>> >>> >> >