I know this is an older thread, but I too am struggling to bring a block that 
someone else designed for us in 2015.4 to work in 2017.4. I dug around but I 
don't see any of our custom blocks using clear_tx_seqnum in their sub-modules 
or their config registers. They do use the config registers quite a bit to set 
things up, so I am thinking that it might be related to this.

Is there a list of other changes that might have happened in RFNoC so I can 
comb through it? I am guessing I am getting tripped up on something like this, 
but it would help to narrow down the places to look.

I did try to change .control to 1'b0 in axi_wrapper.v on line 203 (as 
recommended in this thread), but that didn't seem to help anything.

TIA


 
 On Wed, May 2, 2018 at 4:15 PM, Brian Padalino <bpadalino at gmail.com> wrote:
 > Hey Ashish,
 >> On Wed, May 2, 2018 at 7:02 PM Ashish Chaudhari <ashish.chaudhari at 
 >> ettus.com>
 > wrote:
 >>>> Hi Brian,
 >>>> >> > Moreover, it seems like axi_wrapper.v uses clear_tx_seqnum to pass
 >> >> > out
 >> >> > config bus messages, so now that clear_tx_seqnum is set I am not able
 >> >> > to
 >> >> > use
 >> >> > the config bus from the axi_wrapper.
 >> >>
 >> >> I think this is a side effect of the assumption that data cannot flow
 >> >> through the block when it is not in a graph. The AXI-Stream config bus
 >> >> uses clear_tx_seqnum to hold itself in reset to you cannot use that
 >> >> either when the data-path is disabled. Do you need to use the config
 >> >> bus before you connect your block downstream? If so, you can try (as a
 >> >> debugging step) to tied the clear signal to 0 here:
 >> >>
 >> >>
 >> >> https://github.com/EttusResearch/fpga/blob/rfnoc-devel/usrp3/lib/rfnoc/axi_wrapper.v#L200.
 >> >> If that makes your block work then it would confirm that the
 >> >> aforementioned assumption is breaking your block. If so, we will go
 >> >> back re-evaluate if we need to apply the clear_tx_seqnum to just the
 >> >> data path and leave the control path alone.
 >> >
 >> >
 >> > I re-created the old strobe methodology and fed that version into
 >> > axi_wrapper and it fixed my issue, so it's definitely the thing that was
 >> > gating me.
 >>>> OK, so I looked though the code and clear_tx_seqnum should not be
 >> clearing the the config FIFO. That is the only place where it bleeds
 >> into the control path. The primary purpose of that signal was to clear
 >> the data path only. We will push the following patch into master (and
 >> rfnoc-devel) to remedy that issue. In the meanwhile can you check if
 >> that fixes your issue? You should not need to revert back to the
 >> strobe approach or change anything in software.
 >>>> diff --git a/usrp3/lib/rfnoc/axi_wrapper.v b/usrp3/lib/rfnoc/axi_wrapper.v
 >> index f438587..1193692 100755
 >> --- a/usrp3/lib/rfnoc/axi_wrapper.v
 >> +++ b/usrp3/lib/rfnoc/axi_wrapper.v
 >> @@ -197,7 +197,7 @@ module axi_wrapper
 >> generate
 >> for (k = 0; k < NUM_AXI_CONFIG_BUS; k = k + 1) begin
 >> axi_fifo #(.WIDTH(33), .SIZE(CONFIG_BUS_FIFO_DEPTH))
 >> config_stream
 >> - (.clk(clk), .reset(reset), .clear(clear_tx_seqnum),
 >> + (.clk(clk), .reset(reset), .clear(1'b0),
 >> .i_tdata({(set_addr ==
 >> (SR_AXI_CONFIG_BASE+2*k+1)),set_data}),
 >> .i_tvalid(set_stb & ((set_addr ==
 >> (SR_AXI_CONFIG_BASE+2*k))|(set_addr == (SR_AXI_CONFIG_BASE+2*k+1)))),
 >> .i_tready(),
 >>>> It bleeds over in some other places too. I had an old simple TX graph that
 > I was using that would write from DmaFIFO -> Radio, and that stopped
 > working. No little red LED to show I was transmitting and no output power.
 >> Looking at radio_datapath_core.v, there is an input for clear_tx and
 > clear_tx which both feed clear signals in the tx_control_gen3.
 >> Feeding the strobed version of the clear fixed the issue of no transmission
 > from my simple TX or my siggen block.
 >>>>>>> >> > The most frustrating part is that simulation does not exhibit this
 >> >> > behavior,
 >> >> > so I can't trust my simulation and have to rely on the ILA to give me
 >> >> > insight into these issues.
 >> >>
 >> >> The RFNOC_CONNECT macro in the simulation infrastructure is emulating
 >> >> the software initialization and graph connect operations atomically so
 >> >> you unfortunately don't see similar behavior as software. This is one
 >> >> of those things where we are trying to emulate software as much as
 >> >> possible while still trying to keep the simulation stuff lightweight,
 >> >> which leads to some disparity in behavior.
 >> >
 >> >
 >> > But it isn't doing it as much as possible, or at least not in the same
 >> > way
 >> > the C++ has it exposed.
 >> >
 >> > Is the preferred flow then:
 >> >
 >> > - Get the appropriate control and blockid's of the blocks to connect
 >> > - Connect all the blocks in the way they are expected to be connected
 >> > - Apply any argument calls to the blocks after the connect() calls
 >> > have
 >> > been made
 >> > - Send issue_stream_cmd() in the case of RX blocks
 >> > Can you write a simple C++ program which uses the Radio -> Window -> FFT
 >> > ->
 >> > Host, and uses the default window and attach it to a reply?
 >> >
 >> > In cases of TX blocks like the siggen where all setting and enabling is
 >> > done
 >> > through settings registers, is there anything special that needs to be
 >> > done
 >> > to transmit samples?
 >>>> As I mentioned above, you don't need to change software if you apply the
 >> patch.
 >>>> >> > Can someone tell me how clear_tx_seqnum should be working and how it
 >> >> > should
 >> >> > be used? Should it be a single strobe? Should it be a long lasting
 >> >> > signal?
 >> >> > Can I use it to indicate to my block that it should be in reset?
 >> >>
 >> >> clear_tx_seqnum used to be a single cycle strobe in the ce_clk domain
 >> >> but it is now a long lasting signal in the ce_clk domain.
 >> >> clear_tx_seqnum will be asserted for at least one clock cycle, with no
 >> >> upper-bound on the deassertion time. You can use it hold your control
 >> >> and data-path logic in a quiescent state without having to change the
 >> >> software-configured settings like settings reg values, etc.
 >> >
 >> >
 >> > I'm not sure the helpfulness of this change at all, in all honesty.
 >> >
 >> > If no packets are flowing through the block, why does the signal need to
 >> > be
 >> > asserted at all? It seems like it was used as a reset/clear in the
 >> > past,
 >> > and now it's meant as a hold?
 >>>> By quiescent I meant "idle between applications". It's still a
 >> reset/clear signal that tells noc_shell, axi_wrapper and the client
 >> logic to move its state machines (and any relevant registers) to the
 >> idle state to await packets from a new stream. In noc_shell, this
 >> signal resets all flow control information. In axi_wrapper it resets
 >> the CHDR framer and deframer. Depending on what's in the client logic
 >> in the noc_block, you may or may not care about this signal. For
 >> example, if you have a simple multiply-by-const block as the client
 >> logic, then the clear_tx_seqnum signal can pretty much be ignored
 >> because you don't care if a the next packet/sample is from a new
 >> stream. For an FIR filter, you do care because you need to zero out
 >> your accumulators when a stream is restarted. In rfnoc, we make a
 >> distinction between reset and clear. A "reset" is meant to reset
 >> everything in a module to the power-up state. A "clear" only resets
 >> things that are not software controlled, like settings regs. The
 >> expectation is that you can configure your block, clear it to re-arm
 >> packet processing engines, etc and still preserve the settings you
 >> configured.
 >>> Thanks for the explanation. Can you give a use case when this might happen?
 > Can you time division multiplex blocks in the FPGA for processing with
 > multiple, different streams without reconfiguring the whole flowgraph?
 > Under what circumstances does clear_tx_seqnum get deasserted, and where in
 > the stream lifecycle does that happen? I've been putting my own reset
 > register to strobe at the beginning of the constructor for my block. Is
 > this best practice?
 >> I'm really curious what the lifecycle of the block is supposed to be both
 > from a hardware/stream point of view as well as well as the concept of host
 > software and flowgraph lifecycle. If clear_tx_seqnum is high, should
 > configuration and settings changes be disallowed or allowed?
 >> Thanks,
 > Brian
_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Reply via email to