Demonstrate Savannah, a framework for efficient real-time mmWave baseband processing on COSMOS SB2, using IBM 28 GHz PAAMs and USRP N310 SDRs — running both simulation and over-the-air RRU modes.
Savannah is a framework for efficient mmWave baseband processing with minimal and heterogeneous resources. This tutorial shows how to run Savannah on the COSMOS SB2 testbed using two USRP N310 SDRs connected to two IBM 28 GHz Phased Array Antenna Modules (PAAMs).
The experiment covers two execution modes: a simulation mode (Savannah-mc) where the full baseband DSP pipeline runs without live radio traffic, and an RRU mode where gNodeB and UE communicate over the air through the PAAMs. An optional ACC100 DPDK BBDev section documents hardware LDPC acceleration for reference.
The COSMOS team contributes UHD support for the Agora software base, DSP pipeline updates (equalization, demodulation), and ACC100 BBDEV acceleration integration for decoding. The Savannah software itself is distributed under the RENEW license as Savannah.zip in the page attachments.
This tutorial is associated with the following publications — please cite them when publishing results obtained using the PAAMs deployed in COSMOS:
After completing this tutorial you will be able to:
uhd_find_devices.| Difficulty | Advanced |
| Estimated time | 90 min |
| Domain / sandbox | sb2.cosmos-lab.org |
| Topic group | mmwave-paam |
| Last verified | Not re-tested (migrated 2026-06-20) |
Background knowledge
Account & access
Software
Savannah.zip attachment from this page (available under the RENEW license) — already extracted in the Savannah.ndz image.Devices / nodes
| Resource | Role | Qty | Notes |
|---|---|---|---|
srv1-lg1 |
Baseband processing server (runs Savannah gNodeB + UE) | 1 | Intel server with AVX-512 and ACC100 card slot; image loaded here |
sdr1-s1-lg1 |
USRP N310 SDR (connected to rfdev2-1) | 1 | 10G data link to srv1-lg1 via DATA1 |
sdr1-md1 |
USRP N310 SDR (connected to rfdev2-2) | 1 | 10G data link to srv1-lg1 via DATA2 |
rfdev2-1 |
IBM 28 GHz PAAM (TX side) | 1 | Connected to sdr1-s1-lg1 RF2/RF3 ports |
rfdev2-2 |
IBM 28 GHz PAAM (RX side) | 1 | Connected to sdr1-md1 RF2/RF3 ports |
Disk images
| Image | Load onto | Provides |
|---|---|---|
Savannah.ndz |
srv1-lg1 |
Ubuntu 20.04; UHD 4.1.0; PAAM control software; PAAM CFO calibration; Savannah framework (pre-built) |
Software components
| Component | Version | Source |
|---|---|---|
| Ubuntu | 20.04 | preinstalled in Savannah.ndz |
| UHD (USRP Hardware Driver) | 4.1.0 | preinstalled in Savannah.ndz |
| Intel oneAPI (setvars.sh) | TODO: verify | preinstalled in Savannah.ndz at /opt/intel/oneapi/ |
| FlexRAN LDPC library | TODO: verify | preinstalled in Savannah.ndz |
| Savannah / Agora mmwave | as of Sep 2024 | Savannah.zip attachment (RENEW license); pre-extracted in image at ~/Savannah/agora-mmwave/ |
| PAAM Control API | TODO: verify | preinstalled in Savannah.ndz |
Spectrum / RF / special
rfdev2-1 (TX) and rfdev2-2 (RX).

The fixed hardware connections in SB2 are:
sdr1-s1-lg1 RF2 TX/RX → rfdev2-1 IC0/TX/Hsdr1-s1-lg1 RF2 RX2 → rfdev2-1 IC1/RX/Hsdr1-s1-lg1 RF3 TX/RX → rfdev2-1 IC0/TX/Vsdr1-s1-lg1 RF3 RX2 → rfdev2-1 IC1/RX/Vsdr1-md1 RF2 TX/RX → rfdev2-2 IC0/TX/Hsdr1-md1 RF2 RX2 → rfdev2-2 IC1/RX/Hsdr1-md1 RF3 TX/RX → rfdev2-2 IC0/TX/Vsdr1-md1 RF3 RX2 → rfdev2-2 IC1/RX/Vsrv1-lg1 connects to sdr1-s1-lg1 via the DATA1 10G interface and to sdr1-md1 via DATA2. The USRP management addresses are on the 10.113.2.x subnet; data-plane addresses are 10.114.2.x (DATA1) and 10.115.2.x (DATA2). All resources are controlled from console.sb2.cosmos-lab.org.
Open four separate SSH sessions to the console before beginning.
Log into the sandbox console:
ssh <username>@console.sb2.cosmos-lab.org
In terminal 1, turn off all resources used in the experiment:
omf tell -a offh -t sdr1-s1-lg1,sdr1-md1,rfdev2-1,rfdev2-2,srv1-lg1
Load the Savannah.ndz image onto the server:
omf load -i Savannah.ndz -t srv1-lg1 -r 0
Turn all required resources on and check their status:
omf tell -a on -t sdr1-s1-lg1,sdr1-md1,rfdev2-1,rfdev2-2,srv1-lg1
omf stat -t all
SSH to the server with -Y to enable GUI forwarding (used for live demo display):
ssh -Y root@srv1-lg1
In all SSH sessions to srv1-lg1, source the Intel oneAPI environment:
source /opt/intel/oneapi/setvars.sh --force --config="/opt/intel/oneapi/renew-config.txt"
These steps are performed in terminal 1 on srv1-lg1.
Set up the 10G data interfaces DATA1 and DATA2:
ifconfig DATA1 10.114.2.11 netmask 255.255.255.0 mtu 9000 up
ifconfig DATA2 10.115.2.11 netmask 255.255.255.0 mtu 9000 up
Increase kernel socket buffer sizes:
sudo sysctl -w net.core.rmem_max=536870912
sudo sysctl -w net.core.wmem_max=536870912
After running the above, confirm the interfaces have the correct addresses:
root@srv1-lg1:~# ifconfig DATA1
DATA1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::1e34:daff:fe42:d4c prefixlen 64 scopeid 0x20<link>
ether 1c:34:da:42:0d:4c txqueuelen 1000 (Ethernet)
RX packets 21092 bytes 1881634 (1.8 MB)
RX errors 0 dropped 19183 overruns 0 frame 0
TX packets 686 bytes 204975 (204.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@srv1-lg1:~# ifconfig DATA2
DATA2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::1e34:daff:fe42:d4d prefixlen 64 scopeid 0x20<link>
ether 1c:34:da:42:0d:4d txqueuelen 1000 (Ethernet)
RX packets 21091 bytes 1881530 (1.8 MB)
RX errors 0 dropped 19184 overruns 0 frame 0
TX packets 690 bytes 226549 (226.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Run uhd_find_devices to confirm both USRP N310s are reachable:
[INFO] [UHD] linux; GNU C++ version 9.4.0; Boost_107100; UHD_4.1.0.HEAD-0-g25d617ca
--------------------------------------------------
-- UHD Device 3
--------------------------------------------------
Device Address:
serial: 315A35A
addr: 10.114.2.21
claimed: False
fpga: XG
mgmt_addr: 10.113.2.21
mgmt_addr: 10.114.2.21
product: n310
type: n3xx
--------------------------------------------------
-- UHD Device 4
--------------------------------------------------
Device Address:
serial: 3176DF7
addr: 10.115.2.31
claimed: False
fpga: XG
mgmt_addr: 10.113.2.31
mgmt_addr: 10.115.2.31
product: n310
type: n3xx
If either N310 does not appear, see Troubleshooting.
These commands are run in terminal 2 from the console (console.sb2.cosmos-lab.org). The source tutorial uses am1.orbit-lab.org:5054 as the AM proxy endpoint; this should be routed via the COSMOS AM proxy.
Run the following four curl commands to configure both PAAM boards:
<user_name>@console:~$ curl "http://am1.orbit-lab.org:5054/array_mgmt/configure?dev_name=rfdev2-1.sb2.cosmos-lab.org&ics=0&num_elements=16&txrx=tx&pol=h&theta=0&phi=0"
<user_name>@console:~$ curl "http://am1.orbit-lab.org:5054/array_mgmt/configure?dev_name=rfdev2-1.sb2.cosmos-lab.org&ics=0&num_elements=16&txrx=tx&pol=v&theta=0&phi=0"
<user_name>@console:~$ curl "http://am1.orbit-lab.org:5054/array_mgmt/configure?dev_name=rfdev2-2.sb2.cosmos-lab.org&ics=1&num_elements=16&txrx=rx&pol=h&theta=0&phi=0"
<user_name>@console:~$ curl "http://am1.orbit-lab.org:5054/array_mgmt/configure?dev_name=rfdev2-2.sb2.cosmos-lab.org&ics=1&num_elements=16&txrx=rx&pol=v&theta=0&phi=0"
Each command should return an XML response indicating successful configuration, for example:
<?xml version="1.0" encoding="UTF-8"?>
<response status="OK">
<action service="array_mgmt" name="configure" ipaddr="10.113.2.52">
<step name="open" duration="3.780022"/>
<step name="initializaition" duration="0.125465"/>
<step name="enabling" duration="0.022732"/>
<step name="steering" duration="0.006349" theta="0" phi = "0" ipaddr = "10.113.2.52" />
<state PAAM_ID="0x23" LO_switch="PLL" if_sw1="0xF" if_sw2="0xF" if_sw3="0xF" if_sw4="0xF" txrx="rx" polarization="v" />
<adc>
<conv index="0" name="1v2" tADC="114" tVolt="0.279" tCurr="0.139"/>
<conv index="1" name="1v5" tADC="214" tVolt="0.523" tCurr="1.046"/>
<conv index="2" name="1v8" tADC="4" tVolt="0.010" tCurr="0.005"/>
<conv index="3" name="2v7_0" tADC="13" tVolt="0.032" tCurr="0.064"/>
<conv index="4" name="2v7_1" tADC="183" tVolt="0.447" tCurr="0.894"/>
<conv index="5" name="2v7_2" tADC="18" tVolt="0.044" tCurr="0.088"/>
<conv index="6" name="2v7_3" tADC="40" tVolt="0.098" tCurr="0.196"/>
<conv index="7" name="3v3_pll" tADC="303" tVolt="0.740" tCurr="0.370"/>
<conv index="8" name="5v_uzed" tADC="276" tVolt="0.674" tCurr="0.674"/>
<conv index="9" name="12v" tADC="140" tVolt="0.342" tCurr="1.140"/>
<conv index="10" name="0V" tADC="0" tVolt="0.000"/>
<conv index="11" name="1V8" tADC="735" tVolt="1.796"/>
</adc>
<step name="status" duration="0.069065"/>
<step name="close" duration="0.100179"/>
</action>
</response>
Important: For every terminal opened on srv1-lg1, ensure the Intel oneAPI environment is sourced before running any Savannah commands:
source /opt/intel/oneapi/setvars.sh --force --config="/opt/intel/oneapi/renew-config.txt"
All Savannah executables and configuration files are located at ~/Savannah/agora-mmwave/. The default configuration used is tddconfig-sim-ul-fr2-mu3-100Mhz.json. Alternative configurations are available in Savannah/agora-mmwave/files/config/ci.


Key CMake flags and their meaning:
TIME_EXCLUSIVE — should always be True for best performance; suppresses non-timing metric calculations.LDPC_TYPE — selects the LDPC decoder: FlexRAN (software) or ACC100 (hardware accelerator).LDPC_ENQ_BULK — when True, delays OFDM symbols until the last uplink symbol before pushing into the ACC100 accelerator.MAT_OP_TYPE — selects the matrix operation compute scheme: AVX512 (recommended when supported), ARMA_VEC (vectorized via Armadillo, for non-AVX512 systems), or ARMA_CUBE (research/evaluation only, not performance-optimized).SINGLE_THREAD — when True, merges the worker thread and main scheduling thread (worker count limited to 1). When False, uses a multi-thread model (worker threads + 1 scheduling/main thread), matching Agora's default behavior.RADIO_TYPE — SIMULATION for simulation mode; PURE_UHD for over-the-air RRU mode.Verify the CMake flags in ~/Savannah/agora-mmwave/build. For simulation mode, RADIO_TYPE must be SIMULATION:
# you are expect to see the following results:
root@srv1-lg1:~/Savannah/agora-mmwave/build# cmake ../
-- Using GNU compiler, compiler ID GNU
-- Debugging is disabled
-- CMAKE_CXX_FLAGS: -std=c++17 -Wall -g -march=native -m64 -O3 -Ofast -DNDEBUG
-- CURRENT DIRECTORY: /root/Savannah/agora-mmwave
-- CMAKE_CURRENT_SOURCE_DIR: /root/Savannah/agora-mmwave
-- Processor supports AVX-512
-- Using FlexRAN's (i.e., not Agora's) AVX512 encoder
--
-- ----- Configuration values -----
-- DEBUG: OFF
-- RADIO_TYPE: SIMULATION
-- LOG_LEVEL: info
-- USE_SPDLOG: True
-- ENABLE_MAC: False
-- ENABLE_CSV_LOG: False
-- ENABLE_MAT_LOG: False
-- USE_AVX2_ENCODER: False
-- ENABLE_HDF5: False
-- TIME_EXCLUSIVE: TRUE
-- LDPC_TYPE: FlexRAN
-- LDPC_ENQ_BULK: False
-- MAT_OP_TYPE: AVX512
-- SINGLE_THREAD: False
-- --------------------------------
--
-- Enabled SIMULATION radio type
-- Enabled SW Intel FlexRAN LDPC Decoding
-- LDPC: Sequential Enqueue Mode
-- Time-exlusive: Report only timing but not other characteristics
-- MAT_OP_TYPE: Enable AVX512 matrix operation
-- SINGLE_THREAD: Enable worker thread (use multi-thread model)
-- Using spdlog async logger as the default logger
-- Build spdlog: 1.11.0
-- Build type: Release
-- Disabled Csv/Mat Logger
-- Logging level = info.
-- Configuring done
-- Generating done
-- Build files have been written to: /root/Savannah/agora-mmwave/build
In terminal 1, generate the binary files:
root@srv1-lg1:~/Savannah/agora-mmwave/# ./savannah.sh -g -s
In terminal 1, bring up the UE (it enters standby mode waiting for the gNodeB):
root@srv1-lg1:~/Savannah/agora-mmwave/# ./savannah.sh -u -s
In terminal 2, bring up the gNodeB:
root@srv1-lg1:~/Savannah/agora-mmwave/# ./savannah.sh -x -s -r
Both gNodeB and UE should start running. On the gNodeB side, you will see per-frame timing output like:
[14:539488][I] Main [frame 5878 + 0.3376 ms]: Completed LDPC decoding (16 UL symbols)
[14:539508][I] Frame 5878 Summary: FFT (32 tasks): 0.0206114 ms (~0.00478991 + 0.00756673 + 0.00548272 ms), CSI (4 tasks): 0.0030098 ms (~0.000714161 + 0.00095141 + 0.00116174 ms), Beamweights (1 tasks): 0.00130209 ms (~4.04698e-05 + 0.0012592 + 0 ms), Equal (16 tasks): 0.0268793 ms (~0.00325447 + 0.0104146 + 0.0101594 ms), Demul (32 tasks): 0.0224507 ms (~5.13671e+12 + 0 + 0 ms), Decode (32 tasks): 0.228612 ms (~0.000104702 + 0.219754 + 0 ms), Total: 0.302866 ms
The total elapsed time for processing frame 5878 is 0.3376 ms, within the 5G FR2 Numerology-3 frame deadline of 0.375 ms.
Stop early with Ctrl+C, or let the program run to completion (default: 200,000 frames). Upon completion, you will see final statistics:
Uplink totals (tasks, frames): CSI (23524, 5881.00), [14:540519][Beamweights (5881, 5881.00), FFT (188186, 5880.81), Demul (188172, 15.00), Decode (188166, 5880.19)
Thread 0 performed (tasks, fraction of tasks): FFT (47136, 25.05%), CSI (6067, 25.79%), Beamweights (1584, 26.93%), Equal (23283, 24.75%), Demul (46566, 24.75%), Decode (47216, 25.09%), FFT (47136, 25.05%),
Thread 1 performed (tasks, fraction of tasks): FFT (46389, 24.65%), CSI (5707, 24.26%), Beamweights (1480, 25.17%), Equal (23770, 25.26%), I] Agora: printing stats and saving to file
Demul (47540, 25.26%), [14:540523][Decode (46632, 24.78%), FFT (46389, 24.65%),
Thread 2 performed (tasks, fraction of tasks): FFT (48401, 25.72%), CSI (5826, 24.77%), Beamweights (1257, 21.37%), Equal (23214, 24.67%), Demul (46428, 24.67%), Decode (46919, 24.93%), FFT (48401, 25.72%), I] Stats: total processed frames 5880
Thread 3 performed (tasks, fraction of tasks): FFT (46260, 24.58%), CSI (5924, 25.18%), Beamweights (1560, 26.53%), Equal (23822, 25.32%), Demul (47644, 25.32%), Decode (47405, 25.19%), FFT (46260, 24.58%),
[14:540621][I] Stats: Saving master timestamps to ./files/experiment/timeresult.txt
[14:563553][I] Stats: Printing detailed results to ./files/experiment/timeresult_detail.txt
[14:578927][I] UE 0: Uplink bit errors (BER) 0/79689632 (0.000000), block errors (BLER) 0/82324 (0.000000)
[14:578935][I] UE 1: Uplink bit errors (BER) 0/79689632 (0.000000), block errors (BLER) 0/82324 (0.000000)
[14:578936][I] Agora: terminating
=================================
CORE LIST SUMMARY
=================================
Total Number of Cores: 48 : 48
|| Core ID: 3 || Requested: 24 || ThreadType: Master || ThreadId: 140397163316672
|| Core ID: 5 || Requested: 25 || ThreadType: TXRX || ThreadId: 140396821804800
|| Core ID: 7 || Requested: 26 || ThreadType: TXRX || ThreadId: 140396799424256
|| Core ID: 9 || Requested: 27 || ThreadType: Worker || ThreadId: 140396855375616
|| Core ID: 11 || Requested: 28 || ThreadType: Worker || ThreadId: 140396846982912
|| Core ID: 13 || Requested: 29 || ThreadType: Worker || ThreadId: 140396838590208
|| Core ID: 15 || Requested: 30 || ThreadType: Worker || ThreadId: 140396830197504
=================================
In simulation mode, BER and BLER should be exactly 0% (no channel noise is applied).
Note: Ensure you have completed the PAAM configuration in the Setup section before running RRU mode.
Switch the CMake RADIO_TYPE flag from SIMULATION to PURE_UHD:
# you are expect to see the following results:
root@srv1-lg1:~/Savannah/agora-mmwave/build# cmake ../ -DRADIO_TYPE=PURE_UHD
-- Using GNU compiler, compiler ID GNU
-- Debugging is disabled
-- CMAKE_CXX_FLAGS: -std=c++17 -Wall -g -march=native -m64 -O3 -Ofast -DNDEBUG
-- CURRENT DIRECTORY: /root/Savannah/agora-mmwave
-- CMAKE_CURRENT_SOURCE_DIR: /root/Savannah/agora-mmwave
-- Processor supports AVX-512
-- Using FlexRAN's (i.e., not Agora's) AVX512 encoder
--
-- ----- Configuration values -----
-- DEBUG: OFF
-- RADIO_TYPE: PURE_UHD
-- LOG_LEVEL: info
-- USE_SPDLOG: True
-- ENABLE_MAC: False
-- ENABLE_CSV_LOG: False
-- ENABLE_MAT_LOG: False
-- USE_AVX2_ENCODER: False
-- ENABLE_HDF5: False
-- TIME_EXCLUSIVE: TRUE
-- LDPC_TYPE: FlexRAN
-- LDPC_ENQ_BULK: False
-- MAT_OP_TYPE: AVX512
-- SINGLE_THREAD: False
-- --------------------------------
--
-- Enabled Pure UHD radio type
-- Enabled SW Intel FlexRAN LDPC Decoding
-- LDPC: Sequential Enqueue Mode
-- Time-exlusive: Report only timing but not other characteristics
-- MAT_OP_TYPE: Enable AVX512 matrix operation
-- SINGLE_THREAD: Enable worker thread (use multi-thread model)
-- Using spdlog async logger as the default logger
-- Build spdlog: 1.11.0
-- Build type: Release
-- Disabled Csv/Mat Logger
-- Logging level = info.
-- Enabled PURE_UHD radio
-- Found UHD: /usr/local/lib/libuhd.so (Required is at least version "3.15.0")
-- Using UHD Version: 4.1.0.HEAD-0-g25d617ca
-- Found Boost: /usr/lib/x86_64-linux-gnu/cmake/Boost-1.71.0/BoostConfig.cmake (found suitable version "1.71.0", minimum required is "1.65") found components: program_options system thread
-- Using Boost Version: 1.71.0
-- pure_uhd_lib library initialized
-- Configuring done
-- Generating done
-- Build files have been written to: /root/Savannah/agora-mmwave/build
Confirm that UHD is linked (Using UHD Version: 4.1.0.HEAD-0-g25d617ca), then recompile:
root@srv1-lg1:~/Savannah/agora-mmwave/build# make -j
In terminal 1, generate the binary files:
root@srv1-lg1:~/Savannah/agora-mmwave/# ./savannah.sh -g -r
In terminal 1, bring up the gNodeB (it enters standby mode waiting for the UE to send beacons):
root@srv1-lg1:~/Savannah/agora-mmwave/# ./savannah.sh -x -r -r
In terminal 2, bring up the UE:
root@srv1-lg1:~/Savannah/agora-mmwave/# ./savannah.sh -u -r
Both gNodeB and UE should start running. The per-frame timing output is similar to simulation mode, but with additional host-USRP jitter causing slightly higher total elapsed times.
Upon completion, the BER/BLER output will show non-zero values for the first few frames due to initial synchronization overhead:
[53:029073][I] UE 0: Uplink bit errors (BER) 32491/2639736 (0.012308), block errors (BLER) 67/2727 (0.024569)
The default USRP and PAAM gain settings yield approximately 26 dB SNR, resulting in very low steady-state BER and BLER. To vary the SNR, modify the gain settings in Savannah/agora-mmwave/files/experiments/ul-usrp.json.
To enable EVM and SNR metrics per frame, disable the TIME_EXCLUSIVE CMake flag (set it to False) and recompile. Note that these calculations introduce additional computation overhead and will affect real-time performance.
After recompiling with TIME_EXCLUSIVE=False, you will see output like:
[15:462812][I] Main [frame 5309 + 0.63 ms]: Completed demodulation
[15:462817][I] Frame 5309 Constellation:
EVM 7.1707
, SNR 11.4444
True SNR is: 27.0316
Notice: The COSMOS testbed currently does not have an ACC100 card installed in the servers. The following is provided as reference for users who have installed the card on their own system.
The Savannah.zip attachment contains a README file called BBDev_testcase.md with detailed instructions on:
The mcs_enc_dec_pair folder inside Savannah.zip contains encoding and decoding test cases for different MCS configurations, specifically for 5G mmWave FR2 Numerology-3 100 MHz. A program test_bbdev_perf.c based on DPDK's bbdev program and expected encoding/decoding test results are included.
To run Savannah in single-core accelerated mode (Savannah-sc), update the CMake flags:
LDPC_TYPE to ACC100SINGLE_THREAD to TrueAfter compiling, the framework links to the ACC100 hardware LDPC decoder. The experimental steps are otherwise identical to Savannah-mc mode.
uhd_find_devices returns both USRP N310s with their serial numbers and data-plane addresses (10.114.2.x and 10.115.2.x).curl configuration commands return <response status="OK"> XML with valid ADC readings.0.000000 at the end of the run.omf tell -a offh -t sdr1-s1-lg1,sdr1-md1,rfdev2-1,rfdev2-2,srv1-lg1
Do not run omf save unless you have made changes to the image that you wish to preserve.
| Symptom | Likely cause | Fix |
|---|---|---|
uhd_find_devices returns fewer than 2 devices |
DATA1 or DATA2 interface not configured, or MTU not set | Verify with ifconfig DATA1 / ifconfig DATA2; re-run the ifconfig and sysctl setup commands |
PAAM curl returns error or no response |
PAAM board not powered on, or wrong AM proxy URL | Confirm omf tell -a on completed for rfdev2-1/rfdev2-2; verify omf stat; check the AM proxy address |
cmake fails to find UHD when building for PURE_UHD |
oneAPI environment not sourced | Run source /opt/intel/oneapi/setvars.sh --force --config="/opt/intel/oneapi/renew-config.txt" in the terminal before running cmake |
| gNodeB or UE does not start after the other | Startup order issue | In RRU mode, start gNodeB first (it waits for UE beacons); in simulation mode, start UE first (it waits for gNodeB) |
| High BER in RRU mode beyond initial frames | Low SNR / gain settings | Adjust gain values in Savannah/agora-mmwave/files/experiments/ul-usrp.json; default settings target ~26 dB SNR |
| Processing time exceeds 0.375 ms deadline | Insufficient CPU resources or wrong build flags | Ensure TIME_EXCLUSIVE=True and MAT_OP_TYPE=AVX512; confirm no other workloads are running on srv1-lg1 |
Author(s): COSMOS team (Zhenzhou Qi, Chung-Hsuan Tung, Zhihui Gao, Tingjun Chen — Duke University) · Last verified: Not re-tested (migrated 2026-06-20) · Tested image/release: Savannah.ndz / UHD 4.1.0 · Tags: mmwave, paam, usrp, n310, savannah, agora, 5g, fr2, ldpc, acc100