|
|
|
@ -126,74 +126,6 @@ void sched_nr_cfg_serialized_test()
|
|
|
|
|
printf("Total time taken per slot: %f usec\n", final_avg_usec);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* @brief Test whether the SSB grant gets scheduled with the correct periodicity.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void sched_nr_ssb_test()
|
|
|
|
|
{
|
|
|
|
|
const uint32_t ssb_periodicity = 5;
|
|
|
|
|
uint32_t max_nof_ttis = 1000, nof_sectors = 4;
|
|
|
|
|
task_job_manager tasks;
|
|
|
|
|
|
|
|
|
|
sched_nr_interface::sched_cfg_t cfg;
|
|
|
|
|
cfg.auto_refill_buffer = true;
|
|
|
|
|
|
|
|
|
|
std::vector<sched_nr_interface::cell_cfg_t> cells_cfg = get_default_cells_cfg(nof_sectors);
|
|
|
|
|
|
|
|
|
|
sched_nr_sim_base sched_tester(cfg, cells_cfg, "Serialized Test");
|
|
|
|
|
|
|
|
|
|
sched_nr_interface::ue_cfg_t uecfg = get_default_ue_cfg(nof_sectors);
|
|
|
|
|
uecfg.fixed_dl_mcs = 15;
|
|
|
|
|
uecfg.fixed_ul_mcs = 15;
|
|
|
|
|
sched_tester.add_user(0x46, uecfg, slot_point{0, 0}, 0);
|
|
|
|
|
|
|
|
|
|
std::vector<long> count_per_cc(nof_sectors, 0);
|
|
|
|
|
for (uint32_t nof_slots = 0; nof_slots < max_nof_ttis; ++nof_slots) {
|
|
|
|
|
slot_point slot_rx(0, nof_slots % 10240);
|
|
|
|
|
slot_point slot_tx = slot_rx + TX_ENB_DELAY;
|
|
|
|
|
tasks.start_slot(slot_rx, nof_sectors);
|
|
|
|
|
sched_tester.new_slot(slot_tx);
|
|
|
|
|
for (uint32_t cc = 0; cc < cells_cfg.size(); ++cc) {
|
|
|
|
|
sched_nr_interface::dl_sched_res_t dl_res;
|
|
|
|
|
sched_nr_interface::ul_sched_t ul_res;
|
|
|
|
|
auto tp1 = std::chrono::steady_clock::now();
|
|
|
|
|
TESTASSERT(sched_tester.get_sched()->get_dl_sched(slot_tx, cc, dl_res) == SRSRAN_SUCCESS);
|
|
|
|
|
TESTASSERT(sched_tester.get_sched()->get_ul_sched(slot_tx, cc, ul_res) == SRSRAN_SUCCESS);
|
|
|
|
|
auto tp2 = std::chrono::steady_clock::now();
|
|
|
|
|
count_per_cc[cc] += std::chrono::duration_cast<std::chrono::nanoseconds>(tp2 - tp1).count();
|
|
|
|
|
sched_nr_cc_output_res_t out{slot_tx, cc, &dl_res, &ul_res};
|
|
|
|
|
sched_tester.update(out);
|
|
|
|
|
tasks.finish_cc(slot_rx, dl_res, ul_res);
|
|
|
|
|
/*
|
|
|
|
|
* Verify that, with correct SSB periodicity, dl_res has:
|
|
|
|
|
* 1) SSB grant
|
|
|
|
|
* 2) 4 LSBs of SFN in packed MIB message are correct
|
|
|
|
|
* 3) SSB index is 0
|
|
|
|
|
*/
|
|
|
|
|
if (slot_tx.to_uint() % ssb_periodicity == 0) {
|
|
|
|
|
TESTASSERT(dl_res.dl_sched.ssb.size() == 1);
|
|
|
|
|
auto& ssb_item = dl_res.dl_sched.ssb.back();
|
|
|
|
|
TESTASSERT(ssb_item.pbch_msg.sfn_4lsb == ((uint8_t)slot_tx.sfn() & 0b1111));
|
|
|
|
|
TESTASSERT(ssb_item.pbch_msg.ssb_idx == 0);
|
|
|
|
|
}
|
|
|
|
|
/// Verify that, outside SSB periodicity, dl_res HAS NO SSB grant
|
|
|
|
|
else
|
|
|
|
|
TESTASSERT(dl_res.dl_sched.ssb.size() == 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tasks.print_results();
|
|
|
|
|
TESTASSERT(tasks.pdsch_count == (int)(max_nof_ttis * nof_sectors * 0.6));
|
|
|
|
|
|
|
|
|
|
double final_avg_usec = 0;
|
|
|
|
|
for (uint32_t cc = 0; cc < cells_cfg.size(); ++cc) {
|
|
|
|
|
final_avg_usec += count_per_cc[cc];
|
|
|
|
|
}
|
|
|
|
|
final_avg_usec = final_avg_usec / 1000.0 / max_nof_ttis;
|
|
|
|
|
printf("Total time taken per slot: %f usec\n", final_avg_usec);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void sched_nr_cfg_parallel_cc_test()
|
|
|
|
|
{
|
|
|
|
|
uint32_t nof_sectors = 4;
|
|
|
|
@ -266,5 +198,4 @@ int main()
|
|
|
|
|
|
|
|
|
|
srsenb::sched_nr_cfg_serialized_test();
|
|
|
|
|
srsenb::sched_nr_cfg_parallel_cc_test();
|
|
|
|
|
srsenb::sched_nr_ssb_test();
|
|
|
|
|
}
|
|
|
|
|