5G/NR - HARQ          

 

 

 

 

HARQ

 

 

 

 

 

What is H-ARQ ?

 

What is H-ARQ ? Why it uses the term "Hybrid" ?

 

First think about the term ARQ. ARQ stands for Automatic Repeat Request and you would have heard this a lot if you had experience of studying IP communication (I think you can google a lot of tutorials on this, so I would not explain about what is ARQ here). The "H" in HARQ means "Hybrid" which implies that HARQ is a combination of "Something" and "ARQ".

Then what would be the "Something" ? The "Something" is FEC (forward error correction). FEC is also not LTE specific technology and a kind of generic error correction mechanism. So I would like you to google something about FEC.

 

Basic concept of HARQ in NR is similar to LTE HARQ, but there is some mintor differences in terms of the details. In this page, I will try to explain NR HARQ in comparison to LTE HARQ. So if you are already familiar with LTE HARQ, it will be a great help to understand NR HARQ.

 

Asynchronous HARQ in both downlink and Uplink : In LTE HARQ, downlink use Asynchronous mechanism but Uplink uses Synchronous mechanism. In contrast, in NR both downlink and Uplink Asynchronous mechanism is used. (For the definition of Ascynchronous HARQ and Synchronous HARQ, refer to LTE HARQ). Just to give you an practical aspect of Asynchronous HARQ, it operates the multiple HARQ processes in any order. To keep track of each HARQ process even when they are not running in order, the sender and reciever in the HARQ process should know the exact HARQ process number for each transmission/reception of the HARQ data. For this, DCI carries the field called HARQ Processor number. In LTE, only the DCI for downlink scheduling (i.e, DCI 1, DCI 2 etc) carries this field (since LTE DL use Asynchronous HARQ) and the DCI for uplink schedule(i.e, DCI 0) does not carry this field(since LTE UL use Synchronous HARQ). However in NR, both Downlink Scheduling DCI (i.e, DCI 1_0, 1_1) and Uplink Scheduling DCI (i.e, DCI 0_0, 0_1) carries the field HARQ Processor Number since they both use Asychronous HARQ.

 

Flexible Timing between Data Transmission and HARQ response : In LTE the timing between data transmission and HARQ response is fixed. It is fixed as 4 ms in FDD. The timing is determined in a little bit complicated way in LTE TDD. But this timing is flexibly set in NR in combination of DCI and RRC. In NR, RRC message defined a table listing multiple possible timing between data and HARQ and DCI specifies a specific elements of the table defined in the RRC message. Refer to Resource Allocation page for the details of RRC and DCI interaction for this timing.

 

Codebook Based HARQ Bit Construction : The number of bits and the meaning of each bits in HARQ response is quite a straightforward, but in NR the number of the HARQ bits is constructed in pretty complicated way as described in HARQ-ACK Codebook page.  

 

NO ACK/NACK for PUSCH  : At the very high level view, NR PUSCH HARQ mechanism is very similar to NB IoT PUSCH mechanism. There is no explicit HARQ ACK/NACK for PUSCH. Then, how UE can figure out whther the PUSCH is successfully delivered or not ? It figures it out based on whether it gets retransmission request from gNB or not. If gNB does not send retransmission request (i.e, DCI 0_0/0_1 with NDI not toggled) for a certain period of time, UE assumes that PUSCH is successfully recieved and decoded by gNB.

 

 

 

ACK/NACK Timing in Slot Configuration

 

Even though both TDD and FDD are allowed in NR, it is likely that TDD will be used in most case of NR operation. So it would be beneficial if you have good understandings on how HARQ ACK/NACK timing is determined in TDD LTE (See here if you are not familiar with TDD LTE HARQ Timing). As you know, TDD LTE HARQ ACK/NACK timing is specified by a predefined table. But in TDD NR, HARQ ACK/NACK timing is fully configurable. You can configure HARQ ACK/NACK timing for a specific PDSCH by specifying the parameter K1.

 

As an example, let's supposed your slot configuration is DDDDU with 2.5 ms period. You can configure in such a way that HARQ ACK/NACK for all the PDSCH is transmitted at the same UL slot by specifying K1 as follows. (If you are not familiar with what is K1 and how these values can be configured and informed to UE, see here).

 

 

 

If necessary, you can configure HARQ ACK/NACK timing as flexible as shown below.

 

 

You may ask 'How far HARQ ACK/NACK can be away from the transmitted PDSCH ? It is up to the maximum K1 value settable in RRC message. As of 2018 Sep specification, the maximum K1 value is 15 as you see here )

 

 

 

How many HARQ processor ?

 

Unlike LTE, in NR the max number of HARQ processor is configurable in RRC message as shown below. If this IE is not configured, it is assumed to be 8.

 

PDSCH-ServingCellConfig ::= SEQUENCE {

    codeBlockGroupTransmission                     SetupRelease { PDSCH-CodeBlockGroupTransmission } OPTIONAL,

    xOverhead                                             ENUMERATED { xOh6, xOh12, xOh18 } OPTIONAL,

    nrofHARQ-ProcessesForPDSCH                   ENUMERATED {n2, n4, n6, n10, n12, n16} OPTIONAL,       

    pucch-Cell                                             ServCellIndex OPTIONAL, -- Cond SCellAddOnly

    [[

        maxMIMO-Layers                                 INTEGER (1..8) OPTIONAL, -- Need M

        processingType2Enabled                       BOOLEAN OPTIONAL -- Need M

    ]]

}

 

 

 

Example 01 >

 

Following is a sample trace log showing sequences of HARQ from Amarisoft.

 

 

 

RRC Parameters

: In LTE, UE and gNB was able to decode PDSCH and PUSCH purely based on DCI, but in NR to receive PDSCH and PUSCH at proper timing and to get some critical parameters from RRC message that are required for PDSCH/PUSCH decoding. Followings are those parameters in RRC.

tdd-UL-DL-ConfigurationCommon {

  referenceSubcarrierSpacing kHz30,

  pattern1 {

    dl-UL-TransmissionPeriodicity ms5,

    nrofDownlinkSlots 7,

    nrofDownlinkSymbols 2,

    nrofUplinkSlots 2,

    nrofUplinkSymbols 0

  }

},

 

pdsch-ConfigCommon setup: {

  pdsch-TimeDomainAllocationList {

    {

      mappingType typeA,

      startSymbolAndLength 40

    }

  }

}

pusch-ConfigCommon setup: {

  pusch-TimeDomainAllocationList {

    {

      k2 4,

      mappingType typeA,

      startSymbolAndLength 27

    },

    {

      k2 4,

      mappingType typeA,

      startSymbolAndLength 27

    }

  },                                        

 

dl-DataToUL-ACK {

  8,

  6,

  4,

  12

}

 

pucch-Config setup: {

  resourceSetToAddModList {

    {

      pucch-ResourceSetId 0,

      resourceList {

        0,

        1,

        2,

        3,

        4,

        5,

        6,

        7

      }

    },

    {

      pucch-ResourceSetId 1,

      resourceList {

        8,

        9,

        10,

        11,

        12,

        13,

        14,

        15

      }

    }

  },

  resourceToAddModList {

    {

      pucch-ResourceId 0,

      startingPRB 0,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 50,

      format format1: {

        initialCyclicShift 0,

        nrofSymbols 14,

        startingSymbolIndex 0,

        timeDomainOCC 0

      }

    },

    {

      pucch-ResourceId 1,

      startingPRB 0,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 50,

      format format1: {

        initialCyclicShift 4,

        nrofSymbols 14,

        startingSymbolIndex 0,

        timeDomainOCC 0

      }

    },

    {

      pucch-ResourceId 2,

      startingPRB 0,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 50,

      format format1: {

        initialCyclicShift 8,

        nrofSymbols 14,

        startingSymbolIndex 0,

        timeDomainOCC 0

      }

    },

    {

      pucch-ResourceId 3,

      startingPRB 0,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 50,

      format format1: {

        initialCyclicShift 0,

        nrofSymbols 14,

        startingSymbolIndex 0,

        timeDomainOCC 1

      }

    },

    {

      pucch-ResourceId 4,

      startingPRB 0,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 50,

      format format1: {

        initialCyclicShift 4,

        nrofSymbols 14,

        startingSymbolIndex 0,

        timeDomainOCC 1

      }

    },

    {

      pucch-ResourceId 5,

      startingPRB 0,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 50,

      format format1: {

        initialCyclicShift 8,

        nrofSymbols 14,

        startingSymbolIndex 0,

        timeDomainOCC 1

      }

    },

    {

      pucch-ResourceId 6,

      startingPRB 0,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 50,

      format format1: {

        initialCyclicShift 0,

        nrofSymbols 14,

        startingSymbolIndex 0,

        timeDomainOCC 2

      }

    },

    {

      pucch-ResourceId 7,

      startingPRB 0,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 50,

      format format1: {

        initialCyclicShift 4,

        nrofSymbols 14,

        startingSymbolIndex 0,

        timeDomainOCC 2

      }

    },

    {

      pucch-ResourceId 8,

      startingPRB 50,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 0,

      format format4: {

        nrofSymbols 14,

        occ-Length n4,

        occ-Index n0,

        startingSymbolIndex 0

      }

    },

    {

      pucch-ResourceId 9,

      startingPRB 50,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 0,

      format format4: {

        nrofSymbols 14,

        occ-Length n4,

        occ-Index n1,

        startingSymbolIndex 0

      }

    },

    {

      pucch-ResourceId 10,

      startingPRB 50,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 0,

      format format4: {

        nrofSymbols 14,

        occ-Length n4,

        occ-Index n2,

        startingSymbolIndex 0

      }

    },

    {

      pucch-ResourceId 11,

      startingPRB 50,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 0,

      format format4: {

        nrofSymbols 14,

        occ-Length n4,

        occ-Index n3,

        startingSymbolIndex 0

      }

    },

    {

      pucch-ResourceId 12,

      startingPRB 1,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 49,

      format format4: {

        nrofSymbols 14,

        occ-Length n4,

        occ-Index n0,

        startingSymbolIndex 0

      }

    },

    {

      pucch-ResourceId 13,

      startingPRB 1,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 49,

      format format4: {

        nrofSymbols 14,

        occ-Length n4,

        occ-Index n1,

        startingSymbolIndex 0

      }

    },

    {

      pucch-ResourceId 14,

      startingPRB 1,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 49,

      format format4: {

        nrofSymbols 14,

        occ-Length n4,

        occ-Index n2,

        startingSymbolIndex 0

      }

    },

    {

      pucch-ResourceId 15,

      startingPRB 1,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 49,

      format format4: {

        nrofSymbols 14,

        occ-Length n4,

        occ-Index n3,

        startingSymbolIndex 0

      }

    },

    {

      pucch-ResourceId 16,

      startingPRB 49,

      intraSlotFrequencyHopping enabled,

      secondHopPRB 1,

      format format1: {

        initialCyclicShift 4,

        nrofSymbols 14,

        startingSymbolIndex 0,

        timeDomainOCC 1

      }

    }

  },

  format1 setup: {

  },

  format4 setup: {

    maxCodeRate zeroDot25

  },

  schedulingRequestResourceToAddModList {

    {

      schedulingRequestResourceId 1,

      schedulingRequestID 0,

      periodicityAndOffset sl40: 8,

      resource 16

    }

 

pdcch-ConfigCommon setup: {

  commonControlResourceSet {

    controlResourceSetId 1,

    frequencyDomainResources '111100000000000000000000000000000000000000000'B,

    duration 1,

    cce-REG-MappingType nonInterleaved: NULL,

    precoderGranularity sameAsREG-bundle

  },

  commonSearchSpaceList {

    {

      searchSpaceId 1,

      controlResourceSetId 1,

      monitoringSlotPeriodicityAndOffset sl1: NULL,

      monitoringSymbolsWithinSlot '10000000000000'B,

      nrofCandidates {

        aggregationLevel1 n0,

        aggregationLevel2 n0,

        aggregationLevel4 n1,

        aggregationLevel8 n0,

        aggregationLevel16 n0

      },

      searchSpaceType common: {

        dci-Format0-0-AndFormat1-0 {

        }

      }

    }

  },

},

 

pdcch-Config setup: {

  searchSpacesToAddModList {

    {

      searchSpaceId 2,

      controlResourceSetId 1,

      monitoringSlotPeriodicityAndOffset sl1: NULL,

      monitoringSymbolsWithinSlot '10000000000000'B,

      nrofCandidates {

        aggregationLevel1 n1,

        aggregationLevel2 n1,

        aggregationLevel4 n1,

        aggregationLevel8 n0,

        aggregationLevel16 n0

      },

      searchSpaceType ue-Specific: {

        dci-Formats formats0-0-And-1-0

      }

    },

    {

      searchSpaceId 3,

      controlResourceSetId 1,

      monitoringSlotPeriodicityAndOffset sl1: NULL,

      monitoringSymbolsWithinSlot '10000000000000'B,

      nrofCandidates {

        aggregationLevel1 n1,

        aggregationLevel2 n1,

        aggregationLevel4 n1,

        aggregationLevel8 n0,

        aggregationLevel16 n0

      },

      searchSpaceType ue-Specific: {

        dci-Formats formats0-1-And-1-1

      }

    }

  }

},

 

 

 

 

To analyze HARQ process, the first thing you need to do is to identify a specific HARQ number and follow through all the steps with the same HARQ process number. In this example, I marked HARQ process number with different color.

 

[1] PDCCH - SFN : 754.16
From: test.log
Info: 192.168.1.41:9001, v2019-05-13
Time: 16:15:50.136
Message: ss_id=3 cce_index=2 al=2 dci=1_1
 
Data:
    rb_alloc=0x0  
    mcs1=24  
    ndi1=1  
    rv_idx1=0  
    harq_process=0   
    dai=0  
    tpc_command=1  
    pucch_rsc=0   // According to RRC, this indicate PUCCH format 1 with the config shown here.
    harq_feedback_timing=3 // According to dl-DataToUL-ACK, this indicate K1 = 12  
    antenna_ports=0  
    srs_request=0  
    dmrs_seq_init=0

 

 

[2] PDSCH - SFN : 754.16

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.136

Message: harq=0 prb=0 symb=1:13 CW0: tb_len=84 mod=6 rv_idx=0 cr=0.75 retx=0

 

 

[3] PUCCH  - SFN : 755.8

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.146

Message: format=1 prb=0,50 symb=0:14 cs=0 occ=0 data=1 epre=-86.3

 

 

[4] PDCCH  - SFN : 756.0

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.148

Message: ss_id=3 cce_index=2 al=2 dci=1_1

 

Data:

    rb_alloc=0x14

    mcs1=24

    ndi1=0

    rv_idx1=0

    harq_process=0

    dai=0

    tpc_command=1

    pucch_rsc=0 // According to RRC, this indicate PUCCH format 1 with the config shown here

    harq_feedback_timing=0 // According to dl-DataToUL-ACK, this indicate K1 = 8

    antenna_ports=0

    srs_request=0

    dmrs_seq_init=0

 

 

[5] PDSCH  - SFN : 756.0

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.148

Message: harq=0 prb=20 symb=1:13 CW0: tb_len=84 mod=6 rv_idx=0 cr=0.75 retx=0

 

 

[6] PUCCH  - SFN : 756.8

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.156

Message: format=1 prb=49,1 symb=0:14 cs=4 occ=1 sr=1 data=1 epre=-84.8

 

 

[7] PDCCH  - SFN : 757.2

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.159

Message: ss_id=3 cce_index=0 al=2 dci=1_1

 

Data:

    rb_alloc=0x0

    mcs1=24

    ndi1=1

    rv_idx1=0

    harq_process=0

    dai=0

    tpc_command=1

    pucch_rsc=0 // According to RRC, this indicate PUCCH format 1 with the config shown here

    harq_feedback_timing=1 // According to dl-DataToUL-ACK, this indicate K1 = 6

    antenna_ports=0

    srs_request=0

    dmrs_seq_init=0

 

 

[8] PDSCH  - SFN : 757.2

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.159

Message: harq=0 prb=0 symb=1:13 CW0: tb_len=84 mod=6 rv_idx=0 cr=0.75 retx=0

 

 

[9] PDCCH  - SFN : 757.3

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.160

Message: ss_id=3 cce_index=2 al=2 dci=1_1

 

Data:

    rb_alloc=0x0

    mcs1=24

    ndi1=1

    rv_idx1=0

    harq_process=1

    dai=0

    tpc_command=1

    pucch_rsc=0 // According to RRC, this indicate PUCCH format 1 with the config shown here

    harq_feedback_timing=1 // According to dl-DataToUL-ACK, this indicate K1 = 6

    antenna_ports=0

    srs_request=0

    dmrs_seq_init=0

 

 

[10] PDSCH  - SFN : 757.3

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.160

Message: harq=1 prb=0 symb=1:13 CW0: tb_len=84 mod=6 rv_idx=0 cr=0.75 retx=0

 

 

[11] PDCCH  - SFN : 757.4

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.160

Message: ss_id=3 cce_index=0 al=2 dci=0_1

 

Data:

    rb_alloc=0x62

    time_domain_rsc=0

    mcs=16

    ndi=1

    rv_idx=0

    harq_process=0

    dai=0

    tpc_command=1

    antenna_ports=0

    srs_request=0

    dmrs_seq_init=0

    ul_sch_indicator=1

 

 

[12] PDCCH  - SFN : 757.5

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.161

Message: ss_id=3 cce_index=0 al=2 dci=1_1

 

Data:

    rb_alloc=0x0

    mcs1=24

    ndi1=1

    rv_idx1=0

    harq_process=2

    dai=1

    tpc_command=1

    pucch_rsc=1 // According to RRC, this indicate PUCCH format 1 with the config shown here

    harq_feedback_timing=2 // According to dl-DataToUL-ACK, this indicate K1 = 4

    antenna_ports=0

    srs_request=0

    dmrs_seq_init=0

 

 

[13] PDSCH  - SFN : 757.5

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.161

Message: harq=2 prb=0 symb=1:13 CW0: tb_len=84 mod=6 rv_idx=0 cr=0.75 retx=0

 

 

[14] PDCCH  - SFN : 757.6

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.161

Message: ss_id=3 cce_index=2 al=2 dci=1_1

 

Data:

    rb_alloc=0x0

    mcs1=24

    ndi1=1

    rv_idx1=0

    harq_process=3

    dai=0

    tpc_command=1

    pucch_rsc=0 // According to RRC, this indicate PUCCH format 1 with the config shown here

    harq_feedback_timing=3 // According to dl-DataToUL-ACK, this indicate K1 = 12

    antenna_ports=0

    srs_request=0

    dmrs_seq_init=0

 

 

[15] PDSCH  - SFN : 757.6

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.161

Message: harq=3 prb=0 symb=1:13 CW0: tb_len=84 mod=6 rv_idx=0 cr=0.75 retx=0

 

 

[16] PUSCH  - SFN : 757.8

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.166

Message: harq=0 prb=47:2 symb=0:14 CW0: tb_len=101 mod=4 rv_idx=0 cr=0.64 retx=0 crc=OK snr=28.8 epre=-83.3 ack=1

 

 

[17] PDSCH  - SFN : 757.16

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.166

Message: ss_id=3 cce_index=2 al=2 dci=1_1

 

Data:

    rb_alloc=0x0

    mcs1=24

    ndi1=0

    rv_idx1=0

    harq_process=0

    dai=0

    tpc_command=1

    pucch_rsc=0 // According to RRC, this indicate PUCCH format 1 with the config shown here

    harq_feedback_timing=3 // According to dl-DataToUL-ACK, this indicate K1 = 12

    antenna_ports=0

    srs_request=0

    dmrs_seq_init=0

 

 

[18] PDSCH  - SFN : 757.16

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.166

Message: harq=0 prb=0 symb=1:13 CW0: tb_len=84 mod=6 rv_idx=0 cr=0.75 retx=0

 

 

[19] PUCCH  - SFN : 757.9

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.167

Message: format=1 prb=0,50 symb=0:14 cs=4 occ=0 data=11 epre=-85.5

 

 

[20] PUCCH  - SFN : 757.18

From: test.log

Info: 192.168.1.41:9001, v2019-05-13

Time: 16:15:50.171

Message: format=1 prb=0,50 symb=0:14 cs=0 occ=0 data=1 epre=-85.0

 

 

 

Reference

 

[1] 5G NR User Plane Protocol , What’s new Over LTE in 5G NR