From cd32f1385abd0e64333f4cc746b8ed6b7b7441b1 Mon Sep 17 00:00:00 2001 From: Carlo Galiotto Date: Fri, 10 Dec 2021 11:02:16 +0100 Subject: [PATCH] sched,test: add test for CQI->MCS mapping fnc Signed-off-by: Carlo Galiotto --- lib/include/srsran/phy/phch/ra_nr.h | 12 + lib/src/phy/phch/ra_nr.c | 34 +-- srsgnb/src/stack/mac/test/CMakeLists.txt | 4 + .../mac/test/sched_nr_utilities_tests.cc | 220 ++++++++++++++++++ 4 files changed, 247 insertions(+), 23 deletions(-) create mode 100644 srsgnb/src/stack/mac/test/sched_nr_utilities_tests.cc diff --git a/lib/include/srsran/phy/phch/ra_nr.h b/lib/include/srsran/phy/phch/ra_nr.h index a15973488..155e6b7d2 100644 --- a/lib/include/srsran/phy/phch/ra_nr.h +++ b/lib/include/srsran/phy/phch/ra_nr.h @@ -150,6 +150,18 @@ SRSRAN_API int srsran_ra_ul_set_grant_uci_nr(const srsran_carrier_nr_t* carri */ SRSRAN_API uint32_t srsran_ra_nr_type1_riv(uint32_t N_rb, uint32_t start_rb, uint32_t length_rb); +/** + * @brief Returns the MCS corresponding to CQI + * + * Mapping is performed as: return the MCS that has the closest spectral efficiency to that of the CQI + * @param cqi CQI value + * @param srsran_csi_cqi_table_t CQI table index + * @param mcs_table MCS table parameter + * @param dci_format DCI format + * @param search_space_type Seach Space type + * @param rnti_type RNTI type + * @return The MCS index + */ SRSRAN_API int srsran_ra_nr_cqi_to_mcs(uint8_t cqi, srsran_csi_cqi_table_t cqi_table_idx, srsran_mcs_table_t mcs_table, diff --git a/lib/src/phy/phch/ra_nr.c b/lib/src/phy/phch/ra_nr.c index aab583d03..81a9f3c66 100644 --- a/lib/src/phy/phch/ra_nr.c +++ b/lib/src/phy/phch/ra_nr.c @@ -135,41 +135,29 @@ static const float ra_nr_beta_offset_csi_table[RA_NR_BETA_OFFSET_CSI_SIZE] = { typedef enum { ra_nr_table_1 = 0, ra_nr_table_2, ra_nr_table_3 } ra_nr_table_t; /** - * These tables map the CQI into the MCS, based on the spectral efficiency. + * The table below performs the mapping of the CQI into the closest MCS, based on the corresponding spectral efficiency. * The mapping works as follows: - * - select spectral efficiency from the CQI from tables Table 5.2.2.1-2, Table 5.2.2.1-3, Table 5.2.2.1-4, + * - select spectral efficiency from the CQI from tables Table 5.2.2.1-2, Table 5.2.2.1-3, or Table 5.2.2.1-4, * TS 38.214 V15.14.0 - * - select MCS corresponding to same spectral efficiency from Table 5.1.3.1-1, Table 5.1.3.1-2, Table 5.1.3.1-3, + * - select MCS corresponding to same spectral efficiency from Table 5.1.3.1-1, Table 5.1.3.1-2, or Table 5.1.3.1-3, * TS 38.214 V15.14.0 - * The indices C_M (e.g, 1_1, 1_3, 3_2, etc.) refer to the CQI and MCS table, respectively. - * C = 1 -> Table 5.2.2.1-2; C = 2 -> Table 5.2.2.1-3, C = 2 -> Table 5.2.2.1-4 - * M = 1 -> Table 5.1.3.1-1; M = 2 -> Table 5.1.3.1-2; M = 3 -> Table 5.1.3.1-3 + * + * The array ra_nr_cqi_to_mcs_table[CQI_table_idx][MCS_table_idx][CQI] contains the MCS corresponding to CQI, based on + * the given CQI_table_idx and MCS_table_idx tables + * CQI_table_idx: 1 -> Table 5.2.2.1-2; 2 -> Table 5.2.2.1-3, 3 -> Table 5.2.2.1-4 + * CQI_table_idx: 1 -> Table 5.1.3.1-1; 2 -> Table 5.1.3.1-2; 3 -> Table 5.1.3.1-3 */ -#if 0 -typedef const int nr_cqi_to_mcs_table[RA_NR_CQI_SIZE_TABLE]; - -static nr_cqi_to_mcs_table ra_nr_cqi_to_mcs_table_1_1 = {-1, 0, 0, 2, 4, 6, 8, 11, 13, 15, 18, 20, 22, 24, 26, 28}; -static nr_cqi_to_mcs_table ra_nr_cqi_to_mcs_table_2_1 = {-1, 0, 2, 6, 11, 13, 15, 18, 20, 22, 24, 26, 28, 28, 28, 28}; -static nr_cqi_to_mcs_table ra_nr_cqi_to_mcs_table_3_1 = {-1, 0, 0, 0, 0, 2, 4, 6, 8, 11, 13, 15, 18, 20, 22, 24}; -static nr_cqi_to_mcs_table ra_nr_cqi_to_mcs_table_1_2 = {-1, 0, 0, 1, 2, 3, 4, 5, 7, 9, 11, 13, 15, 17, 19, 21}; -static nr_cqi_to_mcs_table ra_nr_cqi_to_mcs_table_2_2 = {-1, 0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27}; -static nr_cqi_to_mcs_table ra_nr_cqi_to_mcs_table_3_2 = {-1, 0, 0, 0, 0, 1, 2, 3, 4, 5, 7, 9, 11, 13, 15, 17}; -static nr_cqi_to_mcs_table ra_nr_cqi_to_mcs_table_1_3 = {-1, 4, 8, 12, 16, 18, 20, 22, 24, 26, 28, 28, 28, 28, 28, 28}; -static nr_cqi_to_mcs_table ra_nr_cqi_to_mcs_table_2_3 = {-1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28}; -static nr_cqi_to_mcs_table ra_nr_cqi_to_mcs_table_3_3 = {-1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28}; -#endif - static int ra_nr_cqi_to_mcs_table[3][3][RA_NR_CQI_SIZE_TABLE] = { /* ROW 1 - CQI Table 1 */ {/* MCS Table 1 */ {-1, 0, 0, 2, 4, 6, 8, 11, 13, 15, 18, 20, 22, 24, 26, 28}, /* MCS Table 2 */ {-1, 0, 0, 1, 2, 3, 4, 5, 7, 9, 11, 13, 15, 17, 19, 21}, - /* MCS Table 3 */ {-1, 4, 8, 12, 16, 18, 20, 22, 24, 26, 28, 28, 28, 28, 28, 28}}, + /* MCS Table 3 */ {-1, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 28, 28}}, /* ROW 2 - CQI Table 2 */ {/* MCS Table 1 */ {-1, 0, 2, 6, 11, 13, 15, 18, 20, 22, 24, 26, 28, 28, 28, 28}, /* MCS Table 2 */ {-1, 0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27}, - /* MCS Table 3 */ {-1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28}}, - /* ROW 1 - CQI Table 3 */ + /* MCS Table 3 */ {-1, 4, 8, 12, 16, 18, 20, 22, 24, 26, 28, 28, 28, 28, 28, 28}}, + /* ROW 3 - CQI Table 3 */ {/* MCS Table 1 */ {-1, 0, 0, 0, 0, 2, 4, 6, 8, 11, 13, 15, 18, 20, 22, 24}, /* MCS Table 2 */ {-1, 0, 0, 0, 0, 1, 2, 3, 4, 5, 7, 9, 11, 13, 15, 17}, /* MCS Table 3 */ {-1, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28}}}; diff --git a/srsgnb/src/stack/mac/test/CMakeLists.txt b/srsgnb/src/stack/mac/test/CMakeLists.txt index 782c0879b..042c8f2b0 100644 --- a/srsgnb/src/stack/mac/test/CMakeLists.txt +++ b/srsgnb/src/stack/mac/test/CMakeLists.txt @@ -40,6 +40,10 @@ add_executable(sched_nr_rar_test sched_nr_rar_test.cc) target_link_libraries(sched_nr_rar_test srsgnb_mac sched_nr_test_suite srsran_common) add_nr_test(sched_nr_rar_test sched_nr_rar_test) +add_executable(sched_nr_utilities_tests sched_nr_utilities_tests.cc) +target_link_libraries(sched_nr_utilities_tests srsgnb_mac srsran_common srsran_phch) +add_nr_test(sched_nr_utilities_tests sched_nr_utilities_tests) + add_executable(sched_nr_test sched_nr_test.cc) target_link_libraries(sched_nr_test srsgnb_mac diff --git a/srsgnb/src/stack/mac/test/sched_nr_utilities_tests.cc b/srsgnb/src/stack/mac/test/sched_nr_utilities_tests.cc new file mode 100644 index 000000000..5b9efe731 --- /dev/null +++ b/srsgnb/src/stack/mac/test/sched_nr_utilities_tests.cc @@ -0,0 +1,220 @@ +// +// Created by carlo on 9/12/21. +// + +#include "srsran/common/test_common.h" +extern "C" { +#include "srsran/phy/phch/ra_nr.h" +} + +void test_cqi_to_mcs() +{ + // Sample random CQI values and test the returned MCS, for different combinations of CQI and MCS tables + // Set the parameters so that to select a given MCS table (1, 2, or 3) + + // TEST CQI Table 1 - MCS table 1 + int mcs = srsran_ra_nr_cqi_to_mcs(/* cqi */ 3, + /* cqi_table_idx */ SRSRAN_CSI_CQI_TABLE_1, + /* mcs_table */ srsran_mcs_table_64qam, + /* dci_format */ srsran_dci_format_nr_1_0, + /* search_space_type*/ srsran_search_space_type_ue, + /* rnti_type */ srsran_rnti_type_c); + TESTASSERT_EQ(2, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(5, + SRSRAN_CSI_CQI_TABLE_1, + srsran_mcs_table_64qam, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(6, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(9, + SRSRAN_CSI_CQI_TABLE_1, + srsran_mcs_table_64qam, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(15, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(12, + SRSRAN_CSI_CQI_TABLE_1, + srsran_mcs_table_64qam, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(22, mcs); + + // TEST CQI Table 2 - MCS table 2 + mcs = srsran_ra_nr_cqi_to_mcs(1, + SRSRAN_CSI_CQI_TABLE_2, + srsran_mcs_table_256qam, + srsran_dci_format_nr_1_1, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(0, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(4, + SRSRAN_CSI_CQI_TABLE_2, + srsran_mcs_table_256qam, + srsran_dci_format_nr_1_1, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(5, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(7, + SRSRAN_CSI_CQI_TABLE_2, + srsran_mcs_table_256qam, + srsran_dci_format_nr_1_1, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(11, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(11, + SRSRAN_CSI_CQI_TABLE_2, + srsran_mcs_table_256qam, + srsran_dci_format_nr_1_1, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(19, mcs); + + // TEST CQI Table 3 - MCS table 3 + mcs = srsran_ra_nr_cqi_to_mcs(2, + SRSRAN_CSI_CQI_TABLE_3, + srsran_mcs_table_qam64LowSE, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(2, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(8, + SRSRAN_CSI_CQI_TABLE_3, + srsran_mcs_table_qam64LowSE, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(14, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(13, + SRSRAN_CSI_CQI_TABLE_3, + srsran_mcs_table_qam64LowSE, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(24, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(15, + SRSRAN_CSI_CQI_TABLE_3, + srsran_mcs_table_qam64LowSE, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(28, mcs); + + // TEST CQI Table 1 - MCS table 2 + mcs = srsran_ra_nr_cqi_to_mcs(6, + SRSRAN_CSI_CQI_TABLE_1, + srsran_mcs_table_256qam, + srsran_dci_format_nr_1_1, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(4, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(14, + SRSRAN_CSI_CQI_TABLE_1, + srsran_mcs_table_256qam, + srsran_dci_format_nr_1_1, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(19, mcs); + + // TEST CQI Table 1 - MCS table 3 + mcs = srsran_ra_nr_cqi_to_mcs(7, + SRSRAN_CSI_CQI_TABLE_1, + srsran_mcs_table_qam64LowSE, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(16, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(10, + SRSRAN_CSI_CQI_TABLE_1, + srsran_mcs_table_qam64LowSE, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(22, mcs); + + // TEST CQI Table 2 - MCS table 1 + mcs = srsran_ra_nr_cqi_to_mcs(3, + SRSRAN_CSI_CQI_TABLE_2, + srsran_mcs_table_64qam, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(6, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(11, + SRSRAN_CSI_CQI_TABLE_2, + srsran_mcs_table_64qam, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(26, mcs); + + // TEST CQI Table 2 - MCS table 3 + mcs = srsran_ra_nr_cqi_to_mcs(7, + SRSRAN_CSI_CQI_TABLE_2, + srsran_mcs_table_qam64LowSE, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(22, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(10, + SRSRAN_CSI_CQI_TABLE_2, + srsran_mcs_table_qam64LowSE, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(28, mcs); + + // TEST CQI Table 3 - MCS table 1 + mcs = srsran_ra_nr_cqi_to_mcs(2, + SRSRAN_CSI_CQI_TABLE_3, + srsran_mcs_table_64qam, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(0, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(13, + SRSRAN_CSI_CQI_TABLE_3, + srsran_mcs_table_64qam, + srsran_dci_format_nr_1_0, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(20, mcs); + + // TEST CQI Table 3 - MCS table 2 + mcs = srsran_ra_nr_cqi_to_mcs(5, + SRSRAN_CSI_CQI_TABLE_3, + srsran_mcs_table_256qam, + srsran_dci_format_nr_1_1, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(1, mcs); + + mcs = srsran_ra_nr_cqi_to_mcs(14, + SRSRAN_CSI_CQI_TABLE_3, + srsran_mcs_table_256qam, + srsran_dci_format_nr_1_1, + srsran_search_space_type_ue, + srsran_rnti_type_c); + TESTASSERT_EQ(15, mcs); +} + +int main() +{ + test_cqi_to_mcs(); +} \ No newline at end of file