Jonathon (and all),
This error message has returned as I'm working with a Xilinx FFT IP core
again. I never solved it previously and I cannot seem to solve it now. The
error shows up during the 1st testbench test (Flush/Reset) as shown below.

========================================================
TESTBENCH STARTED: rfnoc_block_xfft_256_tb
========================================================
[TEST CASE   1] (t =         0 ns) BEGIN: Flush block then reset it...
*Failure: ERROR:add_1 must be in range [-1,DEPTH-1]*
Time: 16 ns  Iteration: 1

After researching this error, it seems that solutions fall in two
categories.  First, something to do with clock initializations related to
IP cores. Second, having any uninitialized inputs to an IP core.  I played
around with the testbench clocks with no success.  I also verified my
inputs to the FFT instance.  I don't see any problem.

I created a simple project to produce this error using the following steps:

   - copied "rfnoc-example" folder out of tree (UHD-4.1) and verified that
   I could create a build folder and run cmake & "make rfnoc_block_gain_tb"
   successfully (I changed the target to E310 so that it could be run with the
   Vivado 2019.1 Webpack version)
   - created a Xilinx FFT IP core xci file "xfft_256.xci" (see attached) to
   implement a 256 pt pipelined, resizable FFT
   - created a new rfnoc block definition xml file "xfft_256.xml" (see
   attached) and then ran rfnoc_create_verilog.py to create the boilerplate
   rfnoc Verilog & Testbench files
   - ran the testbench with no modifications: SUCCESS
   - modified only rfnoc_block_xfft_256.v (see attached) to add the FFT IP
   instance and modified the make/cmake process to locate & build the IP
   (using the similar modifications needed in the gain example to include a
   complex_multiplier IP)
   - ran the testbench: FAILURE (see above)

I have attached to this email the 3 relevant files: xfft_256.xci,
xfft_256.xml (rfnoc block definition file), and rfnoc_block_xfft_256.v
(modified rfnoc Verilog code with added instance to FFT).  The other files
needed to reproduce this (such as the testbench) can be auto-generated
since I didn't modify them (but I would be happy to provide mine if
helpful).  All my other changes were to the cmake/make files, and these
changes just follow the gain example (but I would be happy to provide them
and/or the full OOT directory if helpful).

Let me know if you have any suggestions or if you are able/unable to
duplicate the issue with the files provided.
Rob

On Thu, Oct 15, 2020 at 6:16 PM Rob Kossler <rkoss...@nd.edu> wrote:

> I'm just using window.v, not the various noc block wrappers.  I don't see
> any issue with it and when I run the testbench with just the Window enabled
> (and FFT IP core disabled), it works fine.
>
> I'm really struggling with this.  The results are bizarre and the
> testbench takes forever to run (ok, maybe 5 min) so it is not simple to
> change 1 thing and check the result.  I can't seem to find any issue with
> failing to drive inputs of the FFT core.  I've searched the web on this
> error and the most common response does indicate a failure to drive inputs,
> but I can't find any culprit.
>
> Could it have anything to do with something like a race condition prior to
> the first clock cycle? Or is that just nonsense.  I definitely don't have
> the experience to even know if that is a possibility.
> Rob
>
>
> On Thu, Oct 15, 2020 at 4:23 PM Jonathon Pendlum <
> jonathon.pend...@ettus.com> wrote:
>
>> The issue could be with the Window block then. Maybe it isn't getting
>> properly initialized or something changed from RFNoC 3 to RFNoC 4.
>>
>> On Thu, Oct 15, 2020 at 3:44 PM Rob Kossler <rkoss...@nd.edu> wrote:
>>
>>> OK. I'll check again.  One thing that's weird is that if I comment out
>>> either the Window or the FFT (and insert appropriate assign statements to
>>> replace the commented item), I don't get the error.  The error only occurs
>>> if both are in place.
>>> Rob
>>>
>>> On Thu, Oct 15, 2020 at 3:42 PM Jonathon Pendlum <
>>> jonathon.pend...@ettus.com> wrote:
>>>
>>>> Hey Rob,
>>>>
>>>> I've ran into that issue when simulating Xilinx IP that use DSP48s.
>>>> From what I can tell, they don't handle X and U signal states properly. Try
>>>> double checking that all your signals are all properly driven.
>>>>
>>>> Jonathon
>>>>
>>>> On Thu, Oct 15, 2020, 15:08 Rob Kossler via USRP-users <
>>>> usrp-users@lists.ettus.com> wrote:
>>>>
>>>>> Hi,
>>>>> I am getting this error (from the subject line) in a custom block I
>>>>> created that is effectively just the combination of a window block and a
>>>>> xilinx fft ip core. I am using UHD-4.0 (and Vivado 2019.1).
>>>>>
>>>>> After searching the user's list, I found some old posts from Jonathan
>>>>> Pendlum that indicated that this was a known issue related to the Xilinx
>>>>> FFT IP core.  The solution in the previous posts was to copy a "wave.do"
>>>>> file from the Ettus in-tree FFT tb folder.  I didn't find such a file in
>>>>> UHD-4.0 and so I'm wondering if there is a solution that works for 
>>>>> UHD-4.0.
>>>>> Rob
>>>>> _______________________________________________
>>>>> USRP-users mailing list
>>>>> USRP-users@lists.ettus.com
>>>>> http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
>>>>>
>>>>

Attachment: xfft_256.yml
Description: application/yaml

Attachment: xfft_256.xci
Description: Binary data

//
// Copyright 2022 Ettus Research, a National Instruments Brand
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//
// Module: rfnoc_block_xfft_256
//
// Description:
//
//   <Add block description here>
//
// Parameters:
//
//   THIS_PORTID : Control crossbar port to which this block is connected
//   CHDR_W      : AXIS-CHDR data bus width
//   MTU         : Maximum transmission unit (i.e., maximum packet size in
//                 CHDR words is 2**MTU).
//

`default_nettype none


module rfnoc_block_xfft_256 #(
  parameter [9:0] THIS_PORTID     = 10'd0,
  parameter       CHDR_W          = 64,
  parameter [5:0] MTU             = 10
)(
  // RFNoC Framework Clocks and Resets
  input  wire                   rfnoc_chdr_clk,
  input  wire                   rfnoc_ctrl_clk,
  input  wire                   ce_clk,
  // RFNoC Backend Interface
  input  wire [511:0]           rfnoc_core_config,
  output wire [511:0]           rfnoc_core_status,
  // AXIS-CHDR Input Ports (from framework)
  input  wire [(1)*CHDR_W-1:0] s_rfnoc_chdr_tdata,
  input  wire [(1)-1:0]        s_rfnoc_chdr_tlast,
  input  wire [(1)-1:0]        s_rfnoc_chdr_tvalid,
  output wire [(1)-1:0]        s_rfnoc_chdr_tready,
  // AXIS-CHDR Output Ports (to framework)
  output wire [(1)*CHDR_W-1:0] m_rfnoc_chdr_tdata,
  output wire [(1)-1:0]        m_rfnoc_chdr_tlast,
  output wire [(1)-1:0]        m_rfnoc_chdr_tvalid,
  input  wire [(1)-1:0]        m_rfnoc_chdr_tready,
  // AXIS-Ctrl Input Port (from framework)
  input  wire [31:0]            s_rfnoc_ctrl_tdata,
  input  wire                   s_rfnoc_ctrl_tlast,
  input  wire                   s_rfnoc_ctrl_tvalid,
  output wire                   s_rfnoc_ctrl_tready,
  // AXIS-Ctrl Output Port (to framework)
  output wire [31:0]            m_rfnoc_ctrl_tdata,
  output wire                   m_rfnoc_ctrl_tlast,
  output wire                   m_rfnoc_ctrl_tvalid,
  input  wire                   m_rfnoc_ctrl_tready
);

  //---------------------------------------------------------------------------
  // Signal Declarations
  //---------------------------------------------------------------------------

  // Clocks and Resets
  wire               ctrlport_clk;
  wire               ctrlport_rst;
  wire               axis_data_clk;
  wire               axis_data_rst;
  // CtrlPort Master
  wire               m_ctrlport_req_wr;
  wire               m_ctrlport_req_rd;
  wire [19:0]        m_ctrlport_req_addr;
  wire [31:0]        m_ctrlport_req_data;
  wire               m_ctrlport_resp_ack;
  wire [31:0]        m_ctrlport_resp_data;
  // Data Stream to User Logic: in
  wire [32*1-1:0]    m_in_axis_tdata;
  wire [1-1:0]       m_in_axis_tkeep;
  wire               m_in_axis_tlast;
  wire               m_in_axis_tvalid;
  wire               m_in_axis_tready;
  wire [63:0]        m_in_axis_ttimestamp;
  wire               m_in_axis_thas_time;
  wire [15:0]        m_in_axis_tlength;
  wire               m_in_axis_teov;
  wire               m_in_axis_teob;
  // Data Stream from User Logic: out
  wire [32*1-1:0]    s_out_axis_tdata;
  wire [0:0]         s_out_axis_tkeep;
  wire               s_out_axis_tlast;
  wire               s_out_axis_tvalid;
  wire               s_out_axis_tready;
  wire [63:0]        s_out_axis_ttimestamp;
  wire               s_out_axis_thas_time;
  wire [15:0]        s_out_axis_tlength;
  wire               s_out_axis_teov;
  wire               s_out_axis_teob;

  //---------------------------------------------------------------------------
  // NoC Shell
  //---------------------------------------------------------------------------

  noc_shell_xfft_256 #(
    .CHDR_W              (CHDR_W),
    .THIS_PORTID         (THIS_PORTID),
    .MTU                 (MTU)
  ) noc_shell_xfft_256_i (
    //---------------------
    // Framework Interface
    //---------------------

    // Clock Inputs
    .rfnoc_chdr_clk      (rfnoc_chdr_clk),
    .rfnoc_ctrl_clk      (rfnoc_ctrl_clk),
    .ce_clk              (ce_clk),
    // Reset Outputs
    .rfnoc_chdr_rst      (),
    .rfnoc_ctrl_rst      (),
    .ce_rst              (),
    // RFNoC Backend Interface
    .rfnoc_core_config   (rfnoc_core_config),
    .rfnoc_core_status   (rfnoc_core_status),
    // CHDR Input Ports  (from framework)
    .s_rfnoc_chdr_tdata  (s_rfnoc_chdr_tdata),
    .s_rfnoc_chdr_tlast  (s_rfnoc_chdr_tlast),
    .s_rfnoc_chdr_tvalid (s_rfnoc_chdr_tvalid),
    .s_rfnoc_chdr_tready (s_rfnoc_chdr_tready),
    // CHDR Output Ports (to framework)
    .m_rfnoc_chdr_tdata  (m_rfnoc_chdr_tdata),
    .m_rfnoc_chdr_tlast  (m_rfnoc_chdr_tlast),
    .m_rfnoc_chdr_tvalid (m_rfnoc_chdr_tvalid),
    .m_rfnoc_chdr_tready (m_rfnoc_chdr_tready),
    // AXIS-Ctrl Input Port (from framework)
    .s_rfnoc_ctrl_tdata  (s_rfnoc_ctrl_tdata),
    .s_rfnoc_ctrl_tlast  (s_rfnoc_ctrl_tlast),
    .s_rfnoc_ctrl_tvalid (s_rfnoc_ctrl_tvalid),
    .s_rfnoc_ctrl_tready (s_rfnoc_ctrl_tready),
    // AXIS-Ctrl Output Port (to framework)
    .m_rfnoc_ctrl_tdata  (m_rfnoc_ctrl_tdata),
    .m_rfnoc_ctrl_tlast  (m_rfnoc_ctrl_tlast),
    .m_rfnoc_ctrl_tvalid (m_rfnoc_ctrl_tvalid),
    .m_rfnoc_ctrl_tready (m_rfnoc_ctrl_tready),

    //---------------------
    // Client Interface
    //---------------------

    // CtrlPort Clock and Reset
    .ctrlport_clk              (ctrlport_clk),
    .ctrlport_rst              (ctrlport_rst),
    // CtrlPort Master
    .m_ctrlport_req_wr         (m_ctrlport_req_wr),
    .m_ctrlport_req_rd         (m_ctrlport_req_rd),
    .m_ctrlport_req_addr       (m_ctrlport_req_addr),
    .m_ctrlport_req_data       (m_ctrlport_req_data),
    .m_ctrlport_resp_ack       (m_ctrlport_resp_ack),
    .m_ctrlport_resp_data      (m_ctrlport_resp_data),

    // AXI-Stream Clock and Reset
    .axis_data_clk (axis_data_clk),
    .axis_data_rst (axis_data_rst),
    // Data Stream to User Logic: in
    .m_in_axis_tdata      (m_in_axis_tdata),
    .m_in_axis_tkeep      (m_in_axis_tkeep),
    .m_in_axis_tlast      (m_in_axis_tlast),
    .m_in_axis_tvalid     (m_in_axis_tvalid),
    .m_in_axis_tready     (m_in_axis_tready),
    .m_in_axis_ttimestamp (m_in_axis_ttimestamp),
    .m_in_axis_thas_time  (m_in_axis_thas_time),
    .m_in_axis_tlength    (m_in_axis_tlength),
    .m_in_axis_teov       (m_in_axis_teov),
    .m_in_axis_teob       (m_in_axis_teob),
    // Data Stream from User Logic: out
    .s_out_axis_tdata      (s_out_axis_tdata),
    .s_out_axis_tkeep      (s_out_axis_tkeep),
    .s_out_axis_tlast      (s_out_axis_tlast),
    .s_out_axis_tvalid     (s_out_axis_tvalid),
    .s_out_axis_tready     (s_out_axis_tready),
    .s_out_axis_ttimestamp (s_out_axis_ttimestamp),
    .s_out_axis_thas_time  (s_out_axis_thas_time),
    .s_out_axis_tlength    (s_out_axis_tlength),
    .s_out_axis_teov       (s_out_axis_teov),
    .s_out_axis_teob       (s_out_axis_teob)
  );

  //---------------------------------------------------------------------------
  // User Logic
  //---------------------------------------------------------------------------
  wire [23:0] fft_config_tdata = 24'd64;
  wire fft_config_tready;
  reg fft_config_tvalid;
  always @(posedge axis_data_clk) begin
    if (axis_data_rst) fft_config_tvalid <= 1'b1;
    else if (fft_config_tvalid & fft_config_tready) fft_config_tvalid <= 1'b0;
  end

  wire [7:0] fft_status_tdata;
  wire fft_status_tvalid;
  wire fft_status_tready = 1'b1;
  
  wire event_frame_started;
  wire event_tlast_unexpected;
  wire event_tlast_missing;
  wire event_fft_overflow;
  wire event_status_channel_halt;
  wire event_data_in_channel_halt;
  wire event_data_out_channel_halt;
  
  wire [7:0] fft_out_tuser;
  
  // this is copied from the Xilinx .veo template
  xfft_256 inst_xfft (
    .aclk(axis_data_clk),                                      // input wire aclk
    .aresetn(~axis_data_rst),                                  // input wire aresetn
    
    .s_axis_config_tdata(fft_config_tdata),                    // input wire [23 : 0] s_axis_config_tdata
    .s_axis_config_tvalid(fft_config_tvalid),                  // input wire s_axis_config_tvalid
    .s_axis_config_tready(fft_config_tready),                  // output wire s_axis_config_tready
    
    .s_axis_data_tdata(m_in_axis_tdata),                       // input wire [31 : 0] s_axis_data_tdata
    .s_axis_data_tvalid(m_in_axis_tvalid),                     // input wire s_axis_data_tvalid
    .s_axis_data_tready(m_in_axis_tready),                     // output wire s_axis_data_tready
    .s_axis_data_tlast(m_in_axis_tlast),                       // input wire s_axis_data_tlast
    
    .m_axis_data_tdata(s_out_axis_tdata),                      // output wire [31 : 0] m_axis_data_tdata
    .m_axis_data_tuser(fft_out_tuser),                         // output wire [7 : 0] m_axis_data_tuser
    .m_axis_data_tvalid(s_out_axis_tvalid),                    // output wire m_axis_data_tvalid
    .m_axis_data_tready(s_out_axis_tready),                    // input wire m_axis_data_tready
    .m_axis_data_tlast(s_out_axis_tlast),                      // output wire m_axis_data_tlast
    
    .m_axis_status_tdata(fft_status_tdata),                    // output wire [7 : 0] m_axis_status_tdata
    .m_axis_status_tvalid(fft_status_tvalid),                  // output wire m_axis_status_tvalid
    .m_axis_status_tready(fft_status_tready),                  // input wire m_axis_status_tready
    
    .event_frame_started(event_frame_started),                 // output wire event_frame_started
    .event_tlast_unexpected(event_tlast_unexpected),           // output wire event_tlast_unexpected
    .event_tlast_missing(event_tlast_missing),                 // output wire event_tlast_missing
    .event_fft_overflow(event_fft_overflow),                   // output wire event_fft_overflow
    .event_status_channel_halt(event_status_channel_halt),     // output wire event_status_channel_halt
    .event_data_in_channel_halt(event_data_in_channel_halt),   // output wire event_data_in_channel_halt
    .event_data_out_channel_halt(event_data_out_channel_halt)  // output wire event_data_out_channel_halt
  );

  // Nothing to do yet, so just drive control signals to default values
  assign m_ctrlport_resp_ack = 1'b0;
  assign m_in_axis_tready = 1'b0;
  assign s_out_axis_tvalid = 1'b0;

endmodule // rfnoc_block_xfft_256


`default_nettype wire
_______________________________________________
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