diff --git a/lib/include/srslte/phy/enb/enb_dl_nr.h b/lib/include/srslte/phy/enb/enb_dl_nr.h index 44e7ad276..64c8b0bc9 100644 --- a/lib/include/srslte/phy/enb/enb_dl_nr.h +++ b/lib/include/srslte/phy/enb/enb_dl_nr.h @@ -24,6 +24,7 @@ extern "C" { typedef struct SRSLTE_API { srslte_pdsch_args_t pdsch; uint32_t nof_tx_antennas; + uint32_t nof_max_prb; } srslte_enb_dl_nr_args_t; typedef struct SRSLTE_API { diff --git a/lib/src/phy/ch_estimation/dmrs_pdsch.c b/lib/src/phy/ch_estimation/dmrs_pdsch.c index 979f0f957..f6f3b8def 100644 --- a/lib/src/phy/ch_estimation/dmrs_pdsch.c +++ b/lib/src/phy/ch_estimation/dmrs_pdsch.c @@ -440,6 +440,8 @@ static uint32_t srslte_dmrs_pdsch_seed(const srslte_carrier_nr_t* carrier, const srslte_pdsch_dmrs_cfg_t* dmrs_cfg = grant->mapping == srslte_pdsch_mapping_type_A ? &cfg->dmrs_cfg_typeA : &cfg->dmrs_cfg_typeB; + slot_idx = slot_idx % SRSLTE_NSLOTS_PER_FRAME_NR(carrier->numerology); + // Calculate scrambling IDs uint32_t n_id = carrier->id; uint32_t n_scid = (grant->n_scid) ? 1 : 0; @@ -763,4 +765,4 @@ int srslte_dmrs_pdsch_estimate(srslte_dmrs_pdsch_t* q, chest_res->nof_re = count; return SRSLTE_SUCCESS; -} \ No newline at end of file +} diff --git a/lib/src/phy/enb/enb_dl_nr.c b/lib/src/phy/enb/enb_dl_nr.c index cc1d7361a..dc48e08b0 100644 --- a/lib/src/phy/enb/enb_dl_nr.c +++ b/lib/src/phy/enb/enb_dl_nr.c @@ -50,14 +50,14 @@ int srslte_enb_dl_nr_init(srslte_enb_dl_nr_t* q, cf_t* output[SRSLTE_MAX_PORTS], return SRSLTE_ERROR; } - if (enb_dl_alloc_prb(q, SRSLTE_MAX_PRB_NR) < SRSLTE_SUCCESS) { + if (enb_dl_alloc_prb(q, args->nof_max_prb) < SRSLTE_SUCCESS) { ERROR("Error allocating\n"); return SRSLTE_ERROR; } srslte_ofdm_cfg_t fft_cfg = {}; - fft_cfg.nof_prb = 100; - fft_cfg.symbol_sz = srslte_symbol_sz(100); + fft_cfg.nof_prb = args->nof_max_prb; + fft_cfg.symbol_sz = srslte_symbol_sz(args->nof_max_prb); fft_cfg.keep_dc = true; for (uint32_t i = 0; i < q->nof_tx_antennas; i++) { diff --git a/lib/src/phy/phch/pdsch_nr.c b/lib/src/phy/phch/pdsch_nr.c index 566a01ba2..4a79b211f 100644 --- a/lib/src/phy/phch/pdsch_nr.c +++ b/lib/src/phy/phch/pdsch_nr.c @@ -648,7 +648,7 @@ static uint32_t srslte_pdsch_nr_grant_info(const srslte_pdsch_cfg_nr_t* cfg, len = srslte_print_check(str, str_len, len, ",Nl=%d", grant->nof_layers); // Append scrambling ID - len = srslte_print_check(str, str_len, len, ",n_scid=%d", grant->n_scid); + len = srslte_print_check(str, str_len, len, ",n_scid=%d,", grant->n_scid); // Append TB info for (uint32_t i = 0; i < SRSLTE_MAX_TB; i++) { diff --git a/lib/src/phy/ue/ue_dl_nr.c b/lib/src/phy/ue/ue_dl_nr.c index 25b0f9112..3f9f963e8 100644 --- a/lib/src/phy/ue/ue_dl_nr.c +++ b/lib/src/phy/ue/ue_dl_nr.c @@ -178,4 +178,4 @@ int srslte_ue_dl_nr_pdsch_info(const srslte_ue_dl_nr_t* q, len += srslte_pdsch_nr_rx_info(&q->pdsch, cfg, grant, res, &str[len], str_len - len); return len; -} \ No newline at end of file +} diff --git a/lib/test/phy/phy_dl_nr_test.c b/lib/test/phy/phy_dl_nr_test.c index 2a6f1501e..fd82d3423 100644 --- a/lib/test/phy/phy_dl_nr_test.c +++ b/lib/test/phy/phy_dl_nr_test.c @@ -28,6 +28,8 @@ static srslte_carrier_nr_t carrier = { }; +#define MAX_PRB 100 + static uint32_t n_prb = 0; // Set to 0 for steering static uint32_t mcs = 30; // Set to 30 for steering static srslte_pdsch_cfg_nr_t pdsch_cfg = {}; @@ -86,7 +88,7 @@ int main(int argc, char** argv) uint8_t* data_rx[SRSLTE_MAX_CODEWORDS] = {}; cf_t* buffer = NULL; - buffer = srslte_vec_cf_malloc(SRSLTE_SF_LEN_PRB(carrier.nof_prb)); + buffer = srslte_vec_cf_malloc(SRSLTE_SF_LEN_PRB(MAX_PRB)); if (buffer == NULL) { ERROR("Error malloc\n"); goto clean_exit; @@ -94,13 +96,14 @@ int main(int argc, char** argv) srslte_ue_dl_nr_args_t ue_dl_args = {}; ue_dl_args.nof_rx_antennas = 1; - ue_dl_args.nof_max_prb = carrier.nof_prb; + ue_dl_args.nof_max_prb = MAX_PRB; ue_dl_args.pdsch.sch.disable_simd = true; ue_dl_args.pdsch.measure_evm = true; ue_dl_args.pdsch.measure_time = true; srslte_enb_dl_nr_args_t enb_dl_args = {}; enb_dl_args.nof_tx_antennas = 1; + enb_dl_args.nof_max_prb = MAX_PRB; enb_dl_args.pdsch.sch.disable_simd = true; // Set default PDSCH configuration diff --git a/srsenb/hdr/phy/nr/cc_worker.h b/srsenb/hdr/phy/nr/cc_worker.h index 83feb2a7b..db3a3c537 100644 --- a/srsenb/hdr/phy/nr/cc_worker.h +++ b/srsenb/hdr/phy/nr/cc_worker.h @@ -32,7 +32,6 @@ namespace nr { typedef struct { uint32_t nof_carriers; - uint32_t max_prb; srslte_enb_dl_nr_args_t dl; } phy_nr_args_t; @@ -49,7 +48,7 @@ public: phy_nr_state() { args.nof_carriers = 1; - args.max_prb = 100; + args.dl.nof_max_prb = 100; args.dl.nof_tx_antennas = 1; args.dl.pdsch.measure_evm = true; args.dl.pdsch.measure_time = true; @@ -77,6 +76,7 @@ private: uint32_t cc_idx = 0; std::array tx_buffer = {}; std::array rx_buffer = {}; + uint32_t buffer_sz = 0; phy_nr_state* phy_state; srslte_enb_dl_nr_t enb_dl = {}; srslte::log* log_h = nullptr; diff --git a/srsenb/src/phy/nr/cc_worker.cc b/srsenb/src/phy/nr/cc_worker.cc index 4740131cd..570008545 100644 --- a/srsenb/src/phy/nr/cc_worker.cc +++ b/srsenb/src/phy/nr/cc_worker.cc @@ -20,6 +20,7 @@ */ #include "srsenb/hdr/phy/nr/cc_worker.h" +#include "srslte/common/common.h" #include "srslte/phy/enb/enb_dl_nr.h" #include "srslte/phy/phch/ra_nr.h" #include "srslte/phy/ue/ue_dl_nr_data.h" @@ -32,10 +33,10 @@ cc_worker::cc_worker(uint32_t cc_idx_, srslte::log* log, phy_nr_state* phy_state cf_t* buffer_c[SRSLTE_MAX_PORTS] = {}; // Allocate buffers - uint32_t sf_len = SRSLTE_SF_LEN_PRB(phy_state->args.max_prb); + buffer_sz = SRSLTE_SF_LEN_PRB(phy_state->args.dl.nof_max_prb); for (uint32_t i = 0; i < phy_state_->args.dl.nof_tx_antennas; i++) { - tx_buffer[i] = srslte_vec_cf_malloc(sf_len); - rx_buffer[i] = srslte_vec_cf_malloc(sf_len); + tx_buffer[i] = srslte_vec_cf_malloc(buffer_sz); + rx_buffer[i] = srslte_vec_cf_malloc(buffer_sz); buffer_c[i] = tx_buffer[i]; } @@ -49,12 +50,9 @@ cc_worker::cc_worker(uint32_t cc_idx_, srslte::log* log, phy_nr_state* phy_state ERROR("Error init soft-buffer\n"); return; } - data.resize(SRSLTE_SCH_NR_MAX_NOF_CB_LDPC * SRSLTE_LDPC_MAX_LEN_ENCODED_CB); - srslte_random_t r = srslte_random_init(1234); - for (uint32_t i = 0; i < SRSLTE_SCH_NR_MAX_NOF_CB_LDPC * SRSLTE_LDPC_MAX_LEN_ENCODED_CB; i++) { - data[i] = srslte_random_uniform_int_dist(r, 0, UINT8_MAX); - } - srslte_random_free(r); + data.resize(SRSLTE_SCH_NR_MAX_NOF_CB_LDPC * SRSLTE_LDPC_MAX_LEN_ENCODED_CB / 8); + srslte_vec_u8_zero(data.data(), SRSLTE_SCH_NR_MAX_NOF_CB_LDPC * SRSLTE_LDPC_MAX_LEN_ENCODED_CB / 8); + snprintf((char*)data.data(), SRSLTE_SCH_NR_MAX_NOF_CB_LDPC * SRSLTE_LDPC_MAX_LEN_ENCODED_CB / 8, "hello world!"); } cc_worker::~cc_worker() @@ -84,7 +82,7 @@ bool cc_worker::set_carrier(const srslte_carrier_nr_t* carrier) void cc_worker::set_tti(uint32_t tti) { - dl_slot_cfg.idx = tti; + dl_slot_cfg.idx = TTI_ADD(tti, FDD_HARQ_DELAY_UL_MS); } cf_t* cc_worker::get_tx_buffer(uint32_t antenna_idx) @@ -155,4 +153,4 @@ bool cc_worker::work_dl() } } // namespace nr -} // namespace srsenb \ No newline at end of file +} // namespace srsenb diff --git a/srsenb/src/phy/nr/sf_worker.cc b/srsenb/src/phy/nr/sf_worker.cc index 41bc4f224..5b0de8804 100644 --- a/srsenb/src/phy/nr/sf_worker.cc +++ b/srsenb/src/phy/nr/sf_worker.cc @@ -66,6 +66,7 @@ uint32_t sf_worker::get_buffer_len() void sf_worker::set_tti(uint32_t tti) { + log_h->step(tti); for (auto& w : cc_workers) { w->set_tti(tti); } diff --git a/srsenb/src/phy/phy_common.cc b/srsenb/src/phy/phy_common.cc index 6d895fe1b..bbd30bf5e 100644 --- a/srsenb/src/phy/phy_common.cc +++ b/srsenb/src/phy/phy_common.cc @@ -127,8 +127,10 @@ void phy_common::worker_end(void* tx_sem_id, srslte::rf_buffer_t& buffer, srslte nr_tx_buffer_ready = true; semaphore.release(); return; - } else if (nr_tx_buffer_ready) { - // ... otherwise, append NR baseband from saved buffer if available + } + + // ... otherwise, append NR base-band from saved buffer if available + if (nr_tx_buffer_ready) { uint32_t j = 0; for (uint32_t i = 0; i < SRSLTE_MAX_CHANNELS; i++) { if (buffer.get(i) == nullptr) { diff --git a/srsenb/src/phy/txrx.cc b/srsenb/src/phy/txrx.cc index a0821112d..3e601a113 100644 --- a/srsenb/src/phy/txrx.cc +++ b/srsenb/src/phy/txrx.cc @@ -185,6 +185,7 @@ void txrx::run_thread() // Launch NR worker only if available if (nr_worker != nullptr) { + nr_worker->set_tti(tti); worker_com->semaphore.push(nr_worker); nr_workers->start_worker(nr_worker); } diff --git a/srsue/hdr/phy/nr/cc_worker.h b/srsue/hdr/phy/nr/cc_worker.h index bff0e0d13..a51dbdab3 100644 --- a/srsue/hdr/phy/nr/cc_worker.h +++ b/srsue/hdr/phy/nr/cc_worker.h @@ -76,6 +76,7 @@ private: uint32_t cc_idx = 0; std::array rx_buffer = {}; std::array tx_buffer = {}; + uint32_t buffer_sz = 0; phy_nr_state* phy_state = nullptr; srslte_ue_dl_nr_t ue_dl = {}; srslte::log* log_h = nullptr; diff --git a/srsue/src/main.cc b/srsue/src/main.cc index e5b918ae3..2be8bb912 100644 --- a/srsue/src/main.cc +++ b/srsue/src/main.cc @@ -426,7 +426,7 @@ static int parse_args(all_args_t* args, int argc, char* argv[]) ("vnf.type", bpo::value(&args->phy.vnf_args.type)->default_value("ue"), "VNF instance type [gnb,ue]") ("vnf.addr", bpo::value(&args->phy.vnf_args.bind_addr)->default_value("localhost"), "Address to bind VNF interface") ("vnf.port", bpo::value(&args->phy.vnf_args.bind_port)->default_value(3334), "Bind port") - ("nr.nof_carriers", bpo::value(&args->phy.nof_nr_carriers)->default_value(1), "Number of NR carriers") + ("nr.nof_carriers", bpo::value(&args->phy.nof_nr_carriers)->default_value(0), "Number of NR carriers") ("nr.nof_prb", bpo::value(&args->phy.nr_nof_prb)->default_value(50), "NR carrier bandwidth") ("nr.freq", bpo::value(&args->phy.nr_freq_hz)->default_value(2630e6), "NR carrier bandwidth") ; diff --git a/srsue/src/phy/nr/cc_worker.cc b/srsue/src/phy/nr/cc_worker.cc index 9d7fd644a..3b7343d55 100644 --- a/srsue/src/phy/nr/cc_worker.cc +++ b/srsue/src/phy/nr/cc_worker.cc @@ -31,10 +31,10 @@ cc_worker::cc_worker(uint32_t cc_idx_, srslte::log* log, phy_nr_state* phy_state cf_t* buffer_c[SRSLTE_MAX_PORTS] = {}; // Allocate buffers - uint32_t sf_len = SRSLTE_SF_LEN_PRB(phy_state->args.dl.nof_max_prb); + buffer_sz = SRSLTE_SF_LEN_PRB(phy_state->args.dl.nof_max_prb) * 5; for (uint32_t i = 0; i < phy_state_->args.dl.nof_rx_antennas; i++) { - rx_buffer[i] = srslte_vec_cf_malloc(sf_len); - tx_buffer[i] = srslte_vec_cf_malloc(sf_len); + rx_buffer[i] = srslte_vec_cf_malloc(buffer_sz); + tx_buffer[i] = srslte_vec_cf_malloc(buffer_sz); buffer_c[i] = rx_buffer[i]; } @@ -93,7 +93,7 @@ cf_t* cc_worker::get_rx_buffer(uint32_t antenna_idx) uint32_t cc_worker::get_buffer_len() { - return rx_buffer.size(); + return buffer_sz; } bool cc_worker::work_dl() diff --git a/srsue/src/phy/nr/sf_worker.cc b/srsue/src/phy/nr/sf_worker.cc index d1eaf8498..1c8aa3deb 100644 --- a/srsue/src/phy/nr/sf_worker.cc +++ b/srsue/src/phy/nr/sf_worker.cc @@ -57,6 +57,7 @@ uint32_t sf_worker::get_buffer_len() void sf_worker::set_tti(uint32_t tti) { + log_h->step(tti); for (auto& w : cc_workers) { w->set_tti(tti); } diff --git a/srsue/src/phy/sync.cc b/srsue/src/phy/sync.cc index bd3aaf96b..a1099f04d 100644 --- a/srsue/src/phy/sync.cc +++ b/srsue/src/phy/sync.cc @@ -65,7 +65,8 @@ void sync::init(srslte::radio_interface_phy* _radio, worker_com = _worker_com; prach_buffer = _prach_buffer; - nof_rf_channels = worker_com->args->nof_lte_carriers * worker_com->args->nof_rx_ant; + nof_rf_channels = + (worker_com->args->nof_lte_carriers + worker_com->args->nof_nr_carriers) * worker_com->args->nof_rx_ant; if (nof_rf_channels == 0 || nof_rf_channels > SRSLTE_MAX_CHANNELS) { Error("SYNC: Invalid number of RF channels (%d)\n", nof_rf_channels); return; @@ -507,6 +508,7 @@ void sync::run_camping_in_sync_state(lte::sf_worker* lte_worker, // Start NR worker only if present if (nr_worker != nullptr) { + nr_worker->set_tti(tti); nr_worker_pool->start_worker(nr_worker); } }