Remove second useless loop iteration in nr_ulsch_procedures()
Set the FAPI message in nr_ulschsim correctly in line with what nr_ulsch_procedures() expected. Add an AssertFatal() to verify that the assumed length of DMRS in the simulator and what is actually set in the FAPI message matches. Finally, the internal nr_get_G() code (looping over all PUSCH) does not double the DMRS because Nl == 3 || Nl == 4, so harmonize in the simulator. Signed-off-by: Robert Schmidt <robert.schmidt@openairinterface.org>
This commit is contained in:
@@ -23,7 +23,6 @@ NR_gNB_ULSCH_t new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL);
|
|||||||
@param frame_parms, Pointer to frame descriptor structure
|
@param frame_parms, Pointer to frame descriptor structure
|
||||||
@param frame, current received frame
|
@param frame, current received frame
|
||||||
@param nr_tti_rx, current received TTI
|
@param nr_tti_rx, current received TTI
|
||||||
@param G
|
|
||||||
@param ULSCH_ids, array of ULSCH ids
|
@param ULSCH_ids, array of ULSCH ids
|
||||||
@param nb_pusch, number of uplink shared channels
|
@param nb_pusch, number of uplink shared channels
|
||||||
*/
|
*/
|
||||||
@@ -32,7 +31,6 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint32_t frame,
|
uint32_t frame,
|
||||||
uint8_t nr_tti_rx,
|
uint8_t nr_tti_rx,
|
||||||
uint32_t *G,
|
|
||||||
int *ULSCH_ids,
|
int *ULSCH_ids,
|
||||||
int nb_pusch);
|
int nb_pusch);
|
||||||
|
|
||||||
|
|||||||
@@ -93,7 +93,6 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
uint32_t frame,
|
uint32_t frame,
|
||||||
uint8_t nr_tti_rx,
|
uint8_t nr_tti_rx,
|
||||||
uint32_t *G,
|
|
||||||
int *ULSCH_ids,
|
int *ULSCH_ids,
|
||||||
int nb_pusch)
|
int nb_pusch)
|
||||||
{
|
{
|
||||||
@@ -112,17 +111,29 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
NR_gNB_ULSCH_t *ulsch = &phy_vars_gNB->ulsch[ULSCH_id];
|
NR_gNB_ULSCH_t *ulsch = &phy_vars_gNB->ulsch[ULSCH_id];
|
||||||
NR_gNB_PUSCH *pusch = &phy_vars_gNB->pusch_vars[ULSCH_id];
|
NR_gNB_PUSCH *pusch = &phy_vars_gNB->pusch_vars[ULSCH_id];
|
||||||
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_process;
|
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_process;
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu = &harq_process->ulsch_pdu;
|
const nfapi_nr_pusch_pdu_t *pusch_pdu = &harq_process->ulsch_pdu;
|
||||||
|
|
||||||
nrLDPC_TB_decoding_parameters_t *TB_parameters = &TBs[pusch_id];
|
nrLDPC_TB_decoding_parameters_t *TB_parameters = &TBs[pusch_id];
|
||||||
|
|
||||||
TB_parameters->G = G[pusch_id];
|
|
||||||
|
|
||||||
if (!harq_process) {
|
if (!harq_process) {
|
||||||
LOG_E(PHY, "ulsch_decoding.c: NULL harq_process pointer\n");
|
LOG_E(PHY, "ulsch_decoding.c: NULL harq_process pointer\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t number_dmrs_symbols = count_bits64_with_mask(pusch_pdu->ul_dmrs_symb_pos, pusch_pdu->start_symbol_index, pusch_pdu->nr_of_symbols);
|
||||||
|
int factor = pusch_pdu->dmrs_config_type == pusch_dmrs_type1 ? 6 : 4;
|
||||||
|
int nb_re_dmrs = factor * pusch_pdu->num_dmrs_cdm_grps_no_data;
|
||||||
|
uint32_t G = nr_get_G(pusch_pdu->rb_size,
|
||||||
|
pusch_pdu->nr_of_symbols,
|
||||||
|
nb_re_dmrs,
|
||||||
|
number_dmrs_symbols, // number of dmrs symbols irrespective of single or double symbol dmrs
|
||||||
|
ulsch->unav_res,
|
||||||
|
pusch_pdu->qam_mod_order,
|
||||||
|
pusch_pdu->nrOfLayers);
|
||||||
|
DevAssert(G > 0);
|
||||||
|
TB_parameters->G = G;
|
||||||
|
|
||||||
|
|
||||||
// The harq_pid is not unique among the active HARQ processes in the instance so we use ULSCH_id instead
|
// The harq_pid is not unique among the active HARQ processes in the instance so we use ULSCH_id instead
|
||||||
TB_parameters->harq_unique_pid = ULSCH_id;
|
TB_parameters->harq_unique_pid = ULSCH_id;
|
||||||
|
|
||||||
|
|||||||
@@ -327,58 +327,12 @@ static int nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int
|
|||||||
{
|
{
|
||||||
DevAssert(nb_pusch > 0);
|
DevAssert(nb_pusch > 0);
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
|
|
||||||
uint32_t G[nb_pusch];
|
|
||||||
for (int pusch_id = 0; pusch_id < nb_pusch; pusch_id++) {
|
|
||||||
|
|
||||||
int ULSCH_id = ulsch_to_decode[pusch_id];
|
|
||||||
DevAssert(ULSCH_id >= 0);
|
|
||||||
{
|
|
||||||
const nfapi_nr_pusch_pdu_t *pusch_pdu = &gNB->ulsch[ULSCH_id].harq_process->ulsch_pdu;
|
|
||||||
|
|
||||||
uint16_t nb_re_dmrs;
|
|
||||||
uint16_t start_symbol = pusch_pdu->start_symbol_index;
|
|
||||||
uint16_t number_symbols = pusch_pdu->nr_of_symbols;
|
|
||||||
|
|
||||||
uint8_t number_dmrs_symbols = 0;
|
|
||||||
for (int l = start_symbol; l < start_symbol + number_symbols; l++)
|
|
||||||
number_dmrs_symbols += ((pusch_pdu->ul_dmrs_symb_pos)>>l)&0x01;
|
|
||||||
|
|
||||||
if (pusch_pdu->dmrs_config_type==pusch_dmrs_type1)
|
|
||||||
nb_re_dmrs = 6*pusch_pdu->num_dmrs_cdm_grps_no_data;
|
|
||||||
else
|
|
||||||
nb_re_dmrs = 4*pusch_pdu->num_dmrs_cdm_grps_no_data;
|
|
||||||
|
|
||||||
G[pusch_id] = nr_get_G(pusch_pdu->rb_size,
|
|
||||||
number_symbols,
|
|
||||||
nb_re_dmrs,
|
|
||||||
number_dmrs_symbols, // number of dmrs symbols irrespective of single or double symbol dmrs
|
|
||||||
gNB->ulsch[ULSCH_id].unav_res,
|
|
||||||
pusch_pdu->qam_mod_order,
|
|
||||||
pusch_pdu->nrOfLayers);
|
|
||||||
AssertFatal(G[pusch_id]>0,"G is 0 : rb_size %u, number_symbols %d, nb_re_dmrs %d, number_dmrs_symbols %d, qam_mod_order %u, nrOfLayer %u\n",
|
|
||||||
pusch_pdu->rb_size,
|
|
||||||
number_symbols,
|
|
||||||
nb_re_dmrs,
|
|
||||||
number_dmrs_symbols, // number of dmrs symbols irrespective of single or double symbol dmrs
|
|
||||||
pusch_pdu->qam_mod_order,
|
|
||||||
pusch_pdu->nrOfLayers);
|
|
||||||
LOG_D(PHY,"rb_size %d, number_symbols %d, nb_re_dmrs %d, dmrs symbol positions %d, number_dmrs_symbols %d, qam_mod_order %d, nrOfLayer %d\n",
|
|
||||||
pusch_pdu->rb_size,
|
|
||||||
number_symbols,
|
|
||||||
nb_re_dmrs,
|
|
||||||
pusch_pdu->ul_dmrs_symb_pos,
|
|
||||||
number_dmrs_symbols, // number of dmrs symbols irrespective of single or double symbol dmrs
|
|
||||||
pusch_pdu->qam_mod_order,
|
|
||||||
pusch_pdu->nrOfLayers);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
//--------------------- ULSCH decoding ---------------------
|
//--------------------- ULSCH decoding ---------------------
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
|
|
||||||
int ret_nr_ulsch_decoding = nr_ulsch_decoding(gNB, frame_parms, frame_rx, slot_rx, G, ulsch_to_decode, nb_pusch);
|
int ret_nr_ulsch_decoding = nr_ulsch_decoding(gNB, frame_parms, frame_rx, slot_rx, ulsch_to_decode, nb_pusch);
|
||||||
|
|
||||||
// CRC check per uplink shared channel
|
// CRC check per uplink shared channel
|
||||||
for (int pusch_id = 0; pusch_id < nb_pusch; pusch_id++) {
|
for (int pusch_id = 0; pusch_id < nb_pusch; pusch_id++) {
|
||||||
|
|||||||
@@ -414,7 +414,7 @@ int main(int argc, char **argv)
|
|||||||
unsigned int TBS = 8424;
|
unsigned int TBS = 8424;
|
||||||
unsigned int available_bits;
|
unsigned int available_bits;
|
||||||
uint8_t nb_re_dmrs = 6;
|
uint8_t nb_re_dmrs = 6;
|
||||||
uint8_t length_dmrs = 1;
|
uint8_t length_dmrs = 2;
|
||||||
uint8_t N_PRB_oh;
|
uint8_t N_PRB_oh;
|
||||||
uint16_t N_RE_prime,code_rate;
|
uint16_t N_RE_prime,code_rate;
|
||||||
unsigned char mod_order;
|
unsigned char mod_order;
|
||||||
@@ -429,9 +429,6 @@ int main(int argc, char **argv)
|
|||||||
nr_phy_data_tx_t phy_data = {0};
|
nr_phy_data_tx_t phy_data = {0};
|
||||||
NR_UE_ULSCH_t *ulsch_ue = &phy_data.ulsch;
|
NR_UE_ULSCH_t *ulsch_ue = &phy_data.ulsch;
|
||||||
|
|
||||||
if ((Nl==4)||(Nl==3))
|
|
||||||
nb_re_dmrs = nb_re_dmrs*2;
|
|
||||||
|
|
||||||
mod_order = nr_get_Qm_ul(Imcs, mcs_table);
|
mod_order = nr_get_Qm_ul(Imcs, mcs_table);
|
||||||
code_rate = nr_get_code_rate_ul(Imcs, mcs_table);
|
code_rate = nr_get_code_rate_ul(Imcs, mcs_table);
|
||||||
available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, 0, mod_order, Nl);
|
available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, 0, mod_order, Nl);
|
||||||
@@ -445,10 +442,15 @@ int main(int argc, char **argv)
|
|||||||
rel15_ul->qam_mod_order = mod_order;
|
rel15_ul->qam_mod_order = mod_order;
|
||||||
rel15_ul->mcs_index = Imcs;
|
rel15_ul->mcs_index = Imcs;
|
||||||
rel15_ul->pusch_data.rv_index = rvidx;
|
rel15_ul->pusch_data.rv_index = rvidx;
|
||||||
|
rel15_ul->ul_dmrs_symb_pos = nb_re_dmrs;
|
||||||
|
rel15_ul->dmrs_config_type = pusch_dmrs_type1;
|
||||||
|
rel15_ul->num_dmrs_cdm_grps_no_data = 1;
|
||||||
rel15_ul->nrOfLayers = Nl;
|
rel15_ul->nrOfLayers = Nl;
|
||||||
rel15_ul->target_code_rate = code_rate;
|
rel15_ul->target_code_rate = code_rate;
|
||||||
rel15_ul->pusch_data.tb_size = TBS>>3;
|
rel15_ul->pusch_data.tb_size = TBS>>3;
|
||||||
rel15_ul->maintenance_parms_v3.ldpcBaseGraph = get_BG(TBS, code_rate);
|
rel15_ul->maintenance_parms_v3.ldpcBaseGraph = get_BG(TBS, code_rate);
|
||||||
|
int bits = count_bits64_with_mask(rel15_ul->ul_dmrs_symb_pos, rel15_ul->start_symbol_index, rel15_ul->nr_of_symbols);
|
||||||
|
AssertFatal(length_dmrs == bits, "length_dmrs %d bits %d\n", length_dmrs, bits);
|
||||||
///////////////////////////////////////////////////
|
///////////////////////////////////////////////////
|
||||||
|
|
||||||
double modulated_input[16 * 68 * 384]; // [hna] 16 segments, 68*Zc
|
double modulated_input[16 * 68 * 384]; // [hna] 16 segments, 68*Zc
|
||||||
@@ -558,7 +560,7 @@ int main(int argc, char **argv)
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
#endif
|
#endif
|
||||||
nr_ulsch_decoding(gNB, frame_parms, frame, subframe, &G, &UE_id, 1);
|
nr_ulsch_decoding(gNB, frame_parms, frame, subframe, &UE_id, 1);
|
||||||
if (harq_process_gNB->processedSegments == harq_process_gNB->C) {
|
if (harq_process_gNB->processedSegments == harq_process_gNB->C) {
|
||||||
bool crc_valid = check_crc(harq_process_gNB->b, lenWithCrc(1, (harq_process_gNB->TBS) << 3), crcType(1, (harq_process_gNB->TBS) << 3));
|
bool crc_valid = check_crc(harq_process_gNB->b, lenWithCrc(1, (harq_process_gNB->TBS) << 3), crcType(1, (harq_process_gNB->TBS) << 3));
|
||||||
if (!crc_valid) {
|
if (!crc_valid) {
|
||||||
|
|||||||
Reference in New Issue
Block a user