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, current received frame
|
||||
@param nr_tti_rx, current received TTI
|
||||
@param G
|
||||
@param ULSCH_ids, array of ULSCH ids
|
||||
@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,
|
||||
uint32_t frame,
|
||||
uint8_t nr_tti_rx,
|
||||
uint32_t *G,
|
||||
int *ULSCH_ids,
|
||||
int nb_pusch);
|
||||
|
||||
|
||||
@@ -93,7 +93,6 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint32_t frame,
|
||||
uint8_t nr_tti_rx,
|
||||
uint32_t *G,
|
||||
int *ULSCH_ids,
|
||||
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_PUSCH *pusch = &phy_vars_gNB->pusch_vars[ULSCH_id];
|
||||
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];
|
||||
|
||||
TB_parameters->G = G[pusch_id];
|
||||
|
||||
if (!harq_process) {
|
||||
LOG_E(PHY, "ulsch_decoding.c: NULL harq_process pointer\n");
|
||||
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
|
||||
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);
|
||||
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 ---------------------
|
||||
//----------------------------------------------------------
|
||||
|
||||
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
|
||||
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 available_bits;
|
||||
uint8_t nb_re_dmrs = 6;
|
||||
uint8_t length_dmrs = 1;
|
||||
uint8_t length_dmrs = 2;
|
||||
uint8_t N_PRB_oh;
|
||||
uint16_t N_RE_prime,code_rate;
|
||||
unsigned char mod_order;
|
||||
@@ -429,9 +429,6 @@ int main(int argc, char **argv)
|
||||
nr_phy_data_tx_t phy_data = {0};
|
||||
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);
|
||||
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);
|
||||
@@ -445,10 +442,15 @@ int main(int argc, char **argv)
|
||||
rel15_ul->qam_mod_order = mod_order;
|
||||
rel15_ul->mcs_index = Imcs;
|
||||
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->target_code_rate = code_rate;
|
||||
rel15_ul->pusch_data.tb_size = TBS>>3;
|
||||
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
|
||||
@@ -558,7 +560,7 @@ int main(int argc, char **argv)
|
||||
printf("\n");
|
||||
exit(-1);
|
||||
#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) {
|
||||
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) {
|
||||
|
||||
Reference in New Issue
Block a user