Hello! I am having trouble using a USRP X410 to capture some high-rate data. I would appreciate any insight or help. Below is a diagram of how our x410 is connected to our host device.
``` *---------------------* *---------------------* ``` ``` | | NIC QSFP Port 0 | | QSFP28 Port 1 | | ``` ``` | | ens1f0np0 <>---------------<> sfp1 | | ``` ``` | | 192.168.20.1 | | 192.168.20.2 | | ``` ``` | |-----------------| |-----------------| | ``` ``` | H | NIC QSFP Port 1 | | QSFP28 Port 0 | X | ``` ``` | O | ens1f1np1 <>---------------<> sfp0 | 4 | ``` ``` | S | 192.168.10.1 | | 192.168.10.2 | 1 | ``` ``` | T |-----------------| *-----------* |-----------------| 0 | ``` ``` | | Ethernet Port 1 | |Router | | Ethernet Port | | ``` ``` | | eno8403 <>-|192.168.1.1|-<> eth0 | | ``` ``` | | 192.168.1.20 | | | | 192.168.1.19 | | ``` ``` *---------------------* *-----------* *---------------------* ``` When I run $ uhd_find_devices ``` [INFO] [UHD] linux; GNU C++ version 9.4.0; Boost_107100; DPDK_19.11; UHD_4.6.0.HEAD-0-g50fa3baa ``` ``` -------------------------------------------------- ``` ``` -- UHD Device 0 ``` ``` -------------------------------------------------- ``` ``` Device Address: ``` ``` serial: [serial number] ``` ``` addr: 192.168.20.2 ``` ``` claimed: False ``` ``` fpga: CG_400 ``` ``` mgmt_addr: 192.168.1.19 ``` ``` mgmt_addr: 192.168.10.2 ``` ``` mgmt_addr: 192.168.20.2 ``` ``` name: [name] ``` ``` product: x410 ``` ``` type: x4xx ``` I am using two images for the FPGA, each of which has different capabilities: \- UC_200, which on the wiki lists Port 0 as "unused" and can achieve up to 250 Msps per channel. \- CG_400, which lists both ports on the wiki as "100 GbE" and can achieve up to 500 Msps per channel. I am using UHD's C++ API to instruct the x410. My capture process tries to call "recv" as soon as possible without waiting to write the previous buffer to a file. The psudocode is as follows: \- Initialize "circular" buffer of arrays. Each array is "spb" samples long, and there are N such buffers. \- Start a "writing" thread that writes data from a queue to a file. \- Set the number of samples I need (nsamps_requested), set the current number of samples to 0 (nsamps), \- set the current buffer index to 0 (buff_idx) \- set up rx_streamer to start 0.1 seconds in the future and issue STREAM_MODE_START_CONTINUOUS command. While (nsamps <= nsamps_requested || not_error) -Get a pointer to the buffer at buff_idx -num_rx_samps <- recv(buffer...) -check metadata returned object -add the buffer to the queue, increment the buffer index \- stop streaming When I use the process above, I can get very long captures using the UC_200 image, with 250 Msps, and by parsing the args "addr=192.168.20.2,mgmt_addr=192.168.1.19" when creating the multiusrp pointer. When I switch to the CG_400 image, I can barely record a few seconds worth of data. I parse the args "addr=192.168.10.2,second_addr=192.168.20.2,mgmt_addr=192.168.1.19". I changed the logger level to get a better idea of what might be going on, below are some outputs for spb at 5000: ``` [DEBUG] [RFNOC::MGMT] Established a route from EPID=4 (SW) to EPID=3 ``` ``` [DEBUG] [RFNOC::MGMT] Throttling stream endpoint to 100% (0x0) ``` ``` [DEBUG] [RFNOC::MGMT] Initiated RX stream setup for EPID=3 ``` ``` [DEBUG] [RFNOC::MGMT] Finished RX stream setup for EPID=3 ``` ``` [DEBUG] [0/Radio#0] spp value 2032 exceeds MTU of 8016! Coercing to 1988 ``` ``` .... ``` ``` [DEBUG] [RxStreamer#0] Received overrun message on port 0 ``` After the last logger message, I catc this in my "check metadata returned object" step and stop the loop. When this happens, I sometimes get 0 samples back, and sometimes get less than the samples per buffer I feed the recv command. I also found that while waiting for the issued command to take effect, instead of adding empty buffers to my queue, I check for ERROR_CODE_TIMEOUT and just continue the while loop. I would imagine if I can handle half the rate at 250 Msps for minutes of continuous capture, going to 500 Msps I could get more than a couple seconds. Is this because the UC_200 image has 4GiB of DRAM and the CG_400 doesn't list any on the wiki? Is there something better I can be doing about the spb (I tried larger and smaller, with some luck around 50000 spb)? Am I properly configuring the x410 to use both QSFP28 ports for the CG_400 image? Thanks! Zack
_______________________________________________ USRP-users mailing list -- usrp-users@lists.ettus.com To unsubscribe send an email to usrp-users-le...@lists.ettus.com