Quentin,

Before proceeding, make sure you *backup your verilog implementation*
because changing to the axis-data interface will *delete the block verilog
folder* you have been working in (testbench, block code, Makefile, etc).

The information below is based on the rfnoc spec (
https://files.ettus.com/app_notes/RFNoC_Specification.pdf) section 4.2.2

You will need to change the block description YAML file to have an
axis-data interface, then run the create_verilog.py
(uhd/host/utils/rfnoc_blocktool/rfnoc_create_verilog.py) script. An example
is shown below of the minimum change needed for an axis-data interface:

[image: image.png]

After running the create_verilog script the new block will have the signals
Rob mentioned. These will be at the noc_shell module interface, with some
new clock names:

[image: image.png]

Thanks,

David


On Thu, Apr 17, 2025 at 10:17 AM Quentin Prieels <
quentin.prie...@student.uclouvain.be> wrote:

> I just read a bit more about the "Sideband-At-End" signal, and it could
> indeed be the issue. However, I don't see this signal (nor tlength,
> ttimestamp, has_time, teov, or teob) in my current block definition. This
> definition was auto-generated by *rfnoc_modtool*, similar to the one in
> the gain example. Do you know how I can enable or configure this
> Sideband-At-End in UHD 4.8?
>
> You're also right — I added a custom is_last_sample signal to mark the
> last sample of my OFDM frame, in case it doesn’t align with a true end
> symbol in RFNoC.
>
> If needed, here’s my current block definition:
>
> https://github.com/quentinprieels/TFE25-462-rnfoc-ofdm/blob/latency/rfnoc/blocks/schmidl_cox.yml
> Quentin
> On 4/17/25 18:40, Rob Kossler wrote:
>
>
> Vous n’obtenez pas souvent d’e-mail à partir de rkoss...@nd.edu. Pourquoi
> c’est important <https://aka.ms/LearnAboutSenderIdentification>
>
> OK. The AXI-Stream Data (simple) interface is the easiest for this case in
> my opinion.  Are you using "Sideband-At-End" in order to have the "tlength"
> automatically calculated?
>
> You need to set "tlast" like you mentioned. This is critical and not
> always easy. Remember that the CHDR packet can only be about 2000 samples
> whereas an OFDM packet might be longer. So, your idea about preserving the
> tlast from the input stream is probably needed.  You also probably want to
> preserve teob from the input unless you are also detecting your own end of
> burst in which case you need logic to set this on the final packet and you
> need to set tlast on the last sample because the input packets will likely
> not have tlast set on this sample.
>
> Note that in the past I have used "axi_rate_change" in a block such as
> yours (my block was a pulse detection block based on power) because in
> addition to handling a true rate change (which you don't need), it also
> takes care of re-packetizing the data.  This allows your own logic to not
> worry about RFNoC packets.  But, switching to use this module might be more
> of a headache than just handling the RFNoC packets with your own logic.
>
> For the question you asked about receiving a new CHDR packet if an output
> packet has not been produced, I think the answer is Yes, this is no problem.
> Rob
>
> On Thu, Apr 17, 2025 at 12:16 PM Quentin Prieels <
> quentin.prie...@student.uclouvain.be> wrote:
>
>> Hi Rob,
>>
>> I'm not sure. I also tried forwarding the tlast signal of the original
>> tdata samples to force the system to send a CHDR packet—even if my OFDM
>> packet wasn't finished yet—but it doesn’t seem to solve the issue.
>>
>> Another question I’ve been asking myself is:* does RFNoC allow a block
>> to receive a new incoming CHDR packet if it hasn’t yet produced an outgoing
>> packet*?
>>
>> I'm using the AXI-Stream Data (Simple) interface, so I assume the NoC
>> shell handles packet manipulation and length. I don't see where I could
>> modify this behavior...
>>
>> If you have any ideas or insights, I’d be happy to investigate further.
>>
>> Best regards,
>> Quentin
>>
>> On 4/17/25 17:58, Rob Kossler wrote:
>>
>>
>> Vous n’obtenez pas souvent d’e-mail à partir de rkoss...@nd.edu. Pourquoi
>> c’est important <https://aka.ms/LearnAboutSenderIdentification>
>>
>> Hi Quentin,
>> Perhaps your issue is related to the 'length' parameter of the RFNoC
>> packet?  If you are not correcting the packet length based on the number of
>> samples you are dropping, then you will get ill-formed packets coming out.
>> Do you think that this could be the issue?
>> Rob
>>
>> On Thu, Apr 17, 2025 at 11:40 AM Quentin Prieels <
>> quentin.prie...@student.uclouvain.be> wrote:
>>
>>> Hello everyone,
>>>
>>> I'm currently implementing a Schmidl & Cox OOT module on a USRP X310 as
>>> part of my master's thesis. (For those interested, the code is available
>>> here
>>> <https://github.com/quentinprieels/TFE25-462-rnfoc-ofdm/tree/latency> (
>>> https://github.com/quentinprieels/TFE25-462-rnfoc-ofdm/blob/latency).)
>>>
>>> The purpose of this block is to detect the beginning of an OFDM frame —
>>> specifically, just after the Schmidl & Cox preamble. I want the block to
>>> forward *only* the "valid" samples (i.e., those that are part of the
>>> actual OFDM frame). So when I call rx_stream->recv(), only actual data
>>> packets should be received by my UHD application.
>>> My first idea was to control the tvalid signal of the AXI-Stream
>>> interface: setting it to 0 when the data was not a "valid" OFDM sample,
>>> and asserting it (1) only when the data was valid. However, this seems
>>> to cause some kind of deadlock. My UHD application always times out and
>>> receives no data. Interestingly, when I output zero-valued samples instead
>>> of deasserting the tvalid signal, I can see that my synchronization
>>> mechanism is working as expected. This suggests the issue likely lies in my
>>> use of AXI signals or a misunderstanding of the RFNoC protocol.
>>>
>>> *Note*: my configured SPP (samples per packet, here 200) is smaller
>>> than the length of the actual OFDM frame, which consists of thousands of
>>> complex samples.
>>>
>>> So here's my main question:
>>> Given a continuous stream of data (currently configured as packets with
>>> 200 samples each, where every packet is valid), how can I output *only
>>> a subset* of this stream — a specific sequence of continuous samples
>>> (potentially spread across multiple packets) — such that only this valid
>>> subset is received by the UHD application? Alternatively, how can I mark
>>> only part of the stream as valid for the receiver, while discarding the
>>> rest?
>>>
>>> (For those interested in the code, this behavior corresponds to when
>>> output_select is set to 2'b01 in the following module: detector.sv
>>> <https://github.com/quentinprieels/TFE25-462-rnfoc-ofdm/blob/latency/fpga/ofdm/rfnoc_block_schmidl_cox/detector.sv>
>>> (
>>> https://github.com/quentinprieels/TFE25-462-rnfoc-ofdm/blob/latency/fpga/ofdm/rfnoc_block_schmidl_cox/detector.sv)
>>> , which controls forwarding of input data only when in the FORWARDING
>>> state.)
>>>
>>> Thank you all for your help,
>>> Quentin
>>>
>>>
>>>
>>> _______________________________________________
>>> USRP-users mailing list -- usrp-users@lists.ettus.com
>>> To unsubscribe send an email to usrp-users-le...@lists.ettus.com
>>>
>> _______________________________________________
> USRP-users mailing list -- usrp-users@lists.ettus.com
> To unsubscribe send an email to usrp-users-le...@lists.ettus.com
>
_______________________________________________
USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-le...@lists.ettus.com

Reply via email to