The HARQ-ACK codebook is one of those NR topics that can look much harder than it really is. The equations in 38.213 are detailed, but the basic question is simple:
The codebook answers that question. It defines the number, order, and meaning of the HARQ-ACK bits that the UE sends on PUCCH or multiplexes onto PUSCH.
- Start with the simplest HARQ feedback
- Why NR needs a codebook
- How the codebook is built and sent
- Type 1, Type 2, and Type 3
- DAI: counter DAI, total DAI, and missed DCI
- How many HARQ-ACK bits are generated?
- CBG-based feedback
- Important RRC and DCI parameters
- Detailed worked examples: RRC, DCI, and UCI
- Common illustrative PUCCH configuration
- Example 1: one DCI, one PDSCH, and one-bit PUCCH
- Example 2: three DCIs and three PDSCHs share one PUCCH
- Example 3: Type 1 keeps candidate positions
- Example 4: two CBG DCIs create eight HARQ-ACK bits
- Example 5: HARQ-ACK is sent on PUSCH
- Example 6: Type-3 one-shot report
- Common points of confusion
- Reference
Start with the Simplest HARQ Feedback
Suppose the gNB sends one PDSCH containing one transport block (TB). The UE tries to decode the TB and produces one result:
ACK (bit value 1) if the TB is decoded correctly.NACK (bit value 0) if the TB is not decoded correctly.
The feedback timing is controlled by the PDSCH-to-HARQ_feedback timing value, commonly called K1. The value comes from the corresponding DCI field or from an RRC-configured dl-DataToUL-ACK list. In plain language, K1 tells the UE which uplink slot is used to report the result of that PDSCH.
If only one TB result is due in that uplink occasion, the payload can be just one HARQ-ACK bit. The difficult part begins when several results point to the same reporting occasion.
Why NR Needs a Codebook
One PUCCH or PUSCH transmission may need to carry feedback for more than one downlink event. For example:
- several PDSCH receptions in different slots can use K1 values that point to the same uplink slot;
- carrier aggregation can bring feedback from multiple serving cells together;
- a PDSCH can contain one or two TBs, depending on the configured number of codewords;
- CBG-based retransmission can require several feedback bits for one TB;
- SPS PDSCH receptions and an SPS release can also create HARQ-ACK information.
Both the UE and gNB therefore need the same deterministic ordering rule. Otherwise, a bit sequence such as ACK, NACK, ACK would be ambiguous. The codebook rules tell both sides which serving cell, PDCCH monitoring occasion, PDSCH occasion, TB, or CBG each position represents.
A useful mental model is an ordered checklist:
candidate or detected downlink events → ordered HARQ-ACK positions → PUCCH/PUSCH transmission
How It Works from PDSCH to Uplink Feedback
The gNB schedules downlink data. A DCI normally identifies the PDSCH resources, HARQ process, new-data indicator, redundancy version, and feedback timing. SPS PDSCH is a notable case in which a PDSCH can arrive without a new scheduling PDCCH.The UE decodes the applicable TB or CBGs. It records ACK or NACK for each feedback unit. With ordinary TB-based feedback, there is one result per TB. With CBG-based feedback, there is one result per configured code block group position.The UE finds the reporting occasion. K1 maps the PDSCH or related DCI event to a particular uplink slot.The UE selects the applicable codebook rule. A semi-static configuration leads to Type 1, a dynamic configuration leads to Type 2, and a one-shot request can trigger Type 3.The UE places the results in the specified order. Depending on the type, that order is based on configured candidate PDSCH occasions, detected assignments and DAI values, or serving-cell/HARQ-process indexes.The UE sends the UCI. HARQ-ACK is carried on PUCCH unless the multiplexing rules place it on a simultaneous PUSCH. The gNB applies the same ordering rules to interpret every bit.
The PUCCH and PUSCH subclauses in 38.213 are not separate codebook types. They are two transmission cases for the same basic Type-1 or Type-2 codebook concept, with some channel-specific details.
Codebook Determination Type: Type 1, Type 2, and Type 3
Type |
How it is selected |
Main idea |
Type 1 |
pdsch-HARQ-ACK-Codebook = semiStatic |
Build a semi-static set of candidate PDSCH reception occasions. The payload size is driven mainly by what could have been scheduled for that feedback occasion. |
Type 2 |
pdsch-HARQ-ACK-Codebook = dynamic (or the enhanced dynamic configuration) |
Build the payload from downlink assignments that the UE actually detects. Counter DAI and total DAI help the UE and gNB keep the dynamic ordering aligned. |
Type 3 |
One-shot HARQ-ACK request in DCI, with the corresponding RRC configuration |
Report a one-shot snapshot ordered by serving cell and HARQ process number. Enhanced Type 3 can restrict the requested cells and processes. |
Type 1: Semi-Static Codebook
Type 1 first works out the set of candidate PDSCH reception occasions that could map to the same feedback occasion. This set is derived from configuration such as the time-domain resource allocations and K1 values. A codebook position can therefore exist even when no PDSCH was actually scheduled in that candidate occasion.
- The size and positions are predictable from the configuration.
- Unused or missed candidate positions are normally represented by NACK according to the detailed rules.
- It can use more bits than the number of PDSCHs that were actually scheduled, but it does not depend as heavily on detecting every scheduling DCI to determine the payload layout.
Type 2: Dynamic Codebook
Type 2 follows the downlink assignments that the UE actually detects for the reporting occasion. Its payload can therefore be smaller when only a few PDSCHs are scheduled. The tradeoff is that the gNB and UE must keep a consistent count of those assignments.
- Counter DAI tracks the running number of applicable downlink assignments.
- Total DAI, where applicable, indicates the total count at a scheduling point.
- These DAI values help expose a missed DCI and keep the bit positions aligned across monitoring occasions and serving cells.
Type 3: One-Shot Codebook
Type 3 is a one-shot status report. When the UE detects a DCI whose One-shot HARQ-ACK request is set to 1, it reports the available HARQ-ACK state for the configured or indicated serving cells and HARQ process numbers. The basic ordering is by serving-cell index and then HARQ-process index, with TB/CBG positions added as applicable.
This is useful when the gNB wants a broader HARQ status snapshot instead of only the feedback tied to the normal Type-1 or Type-2 reporting occasion. Type 3 is not a beam-feedback or TCI-state codebook; beam management uses other reporting and control mechanisms.
DAI: How the UE and gNB Keep a Dynamic Codebook Aligned
DAI means Downlink Assignment Indicator. Despite the name, DAI is not the ACK/NACK result and it is not the HARQ process number. It is counting information carried in DCI so that the UE and gNB agree on the number and order of downlink assignments represented in a dynamic Type-2 HARQ-ACK codebook.
The shortest useful definition is:
DAI Compared with the Other DCI Fields
Field |
Question answered by the field |
HARQ process number | “Which stop-and-wait HARQ process owns this TB?” |
K1 | “In which uplink slot should the UE report the result?” |
PRI | “Which configured PUCCH resource should the UE use?” |
DAI | “Which numbered downlink assignment is this in the feedback sequence, and how large should that sequence be?” |
For example, HARQ process 5 does not automatically go into codebook position 5. If it is the second applicable assignment for a particular PUCCH occasion, its feedback normally occupies the position identified by that assignment sequence, not by the HARQ process ID.
Counter DAI (C-DAI)
Counter DAI is the running count. For the conventional case of one PDSCH scheduled by each DCI, it behaves like assignment number 1, assignment number 2, assignment number 3, and so on. More precisely, 38.213 counts applicable {serving cell, PDCCH monitoring occasion} pairs in a defined traversal:
- process PDCCH monitoring occasions from earlier to later;
- within the same monitoring occasion, process serving cells in ascending cell-index order;
- when more than one applicable DCI/PDSCH belongs to the same cell and monitoring occasion, process them in ascending PDSCH starting-time order.
That exact definition matters for carrier aggregation and newer multi-PDSCH scheduling. In a simple single-cell trace with one DCI/PDSCH per monitoring occasion, however, it is safe to read C-DAI as the running DCI-assignment count.
Why a 2-Bit DAI Counts 1, 2, 3, 4 and Then Wraps
The two DAI bits are codepoints for a count that wraps every four assignments. They are interpreted as follows:
DAI bits |
Logical count |
Later wrapped counts |
00 | 1 | 5, 9, 13, ... |
01 | 2 | 6, 10, 14, ... |
10 | 3 | 7, 11, 15, ... |
11 | 4 | 8, 12, 16, ... |
So six consecutive assignments carry the codepoints 00, 01, 10, 11, 00, 01. The UE combines the codepoint with the earlier DAI history to unwrap the count. It should not treat 00 as an ordinary binary value of zero.
How C-DAI Exposes a Missed Scheduling DCI
Consider three assignments whose feedback all goes to the same PUCCH:
DCI |
C-DAI |
gNB sent it? |
UE detected it? |
A | 1 (00) | yes | yes |
B | 2 (01) | yes | no |
C | 3 (10) | yes | yes |
The UE sees C-DAI jump from 1 to 3. It therefore knows that assignment position 2 is missing, even though it does not know the PDSCH details contained in the missed DCI. The UE preserves alignment by placing NACK in that missing position. If A and C both decoded successfully, the report is:
[A, missing B, C] = [ACK, NACK, ACK] = [1, 0, 1]
This is the main reason DAI is so important. Without the count, the UE might send [ACK, ACK]. The gNB could then interpret the second ACK as the result for B instead of C.
Total DAI (T-DAI)
Total DAI gives the total number of applicable assignment pairs accumulated up to the current PDCCH monitoring occasion. When total DAI is present in several DCIs in the same monitoring occasion, those DCIs carry the same total value. This is especially useful with carrier aggregation, where several serving cells can contribute feedback to one PUCCH.
Assume two serving cells and one PDCCH monitoring occasion. The gNB schedules one PDSCH on each cell:
DCI |
Serving cell |
C-DAI |
T-DAI |
Meaning |
A | Cell 0 | 1 (00) | 2 (01) | first of two |
B | Cell 1 | 2 (01) | 2 (01) | second of two |
If the UE receives DCI A but misses DCI B, A’s T-DAI still says that the total has reached two. The UE can therefore retain a second codebook position and report NACK there. C-DAI says “where am I in the sequence?”; T-DAI says “how many assignments exist up to this monitoring occasion?”
In a common DCI 1_1 dynamic-codebook configuration:
- with one configured DL serving cell, the DAI field is often 2 bits carrying only C-DAI;
- with multiple configured DL serving cells, the DAI field is commonly 4 bits: the 2 MSBs carry C-DAI and the 2 LSBs carry T-DAI;
- other features, such as enhanced dynamic codebooks, multiple codebooks, PDSCH groups, or joint feedback across CORESET pools, can change the width and interpretation. Always derive the field layout from the applicable 38.212 rules and RRC configuration.
What About DAI in an Uplink DCI?
DAI can also appear in an uplink grant such as DCI 0_1 or DCI 0_2 when HARQ-ACK may be multiplexed on the scheduled PUSCH. Do not confuse this with the counter DAI carried in the downlink scheduling DCIs:
- DAI in DCI 1_x accompanies downlink assignment(s) and helps build/order the dynamic HARQ-ACK codebook.
- DAI in DCI 0_x accompanies a PUSCH grant and tells the UE which HARQ-ACK amount/state the gNB expects to be multiplexed on that PUSCH. In the usual dynamic-codebook case it acts as an uplink total-DAI indication, with detailed behavior depending on the configured codebook and PDSCH groups.
This is why a trace may show DAI in both a downlink grant and an uplink grant. They participate in the same HARQ-ACK coordination, but they are viewed from different sides of the exchange.
Practical DAI Checklist for Reading a Log
- Group only the DCIs whose K1 values point to the same HARQ-ACK reporting occasion and codebook.
- Determine the DAI field width from the DCI format and RRC configuration. Split C-DAI and T-DAI when the field contains both.
- Convert each 2-bit codepoint using 00→1, 01→2, 10→3, 11→4, then unwrap modulo 4 using the earlier values.
- Follow the specification ordering across PDCCH monitoring occasions and serving cells; do not sort by HARQ process number.
- Look for a counter jump or a total larger than the number of detected assignments. A gap becomes a NACK placeholder.
- After the logical codebook is complete, determine its UCI size, PUCCH resource set, last-DCI PRI, and final PUCCH/PUSCH transmission.
How Many HARQ-ACK Bits Are Generated?
There is no single “one bit per PDSCH” formula for every NR case. A practical way to reason about the payload size is to ask the following questions in order.
What is the feedback unit? - Without CBG feedback: normally one bit per TB.
- With CBG feedback: one bit per CBG position for each applicable TB, including padding positions required by the configured maximum.
How many TBs can the PDSCH carry? - The configured maxNrofCodeWordsScheduledByDCI determines whether one or two codewords/TBs have to be considered.
- NR uses one codeword for up to four transmission layers and can use two codewords when more than four layers are transmitted. The antenna configuration by itself does not tell us the number of TBs; the actual transmission rank and codeword configuration matter.
- If spatial bundling is configured, feedback for two TBs can be bundled into one result according to the applicable rule.
Which downlink occasions belong to this uplink report? - Type 1 counts the applicable candidate PDSCH occasions derived from configuration.
- Type 2 counts the applicable detected assignments, using DAI to maintain the sequence.
- Type 3 walks through the configured or indicated serving cells and HARQ processes.
Are there special events? - A PDSCH received without a corresponding PDCCH generates one corresponding HARQ-ACK bit.
- A detected PDCCH indicating an SPS PDSCH release also generates one corresponding HARQ-ACK bit.
- SPS receptions, carrier aggregation, multicast, different priority indexes, and enhanced codebook options add ordering rules that must be checked in the applicable release of 38.213.
CBG-Based HARQ-ACK
Normally, the whole TB is the feedback unit: the UE sends one ACK only if the complete TB passes its CRC. With Code Block Group (CBG) retransmission, the TB is divided into groups so that the gNB can retransmit only the groups that were not decoded correctly.
- The RRC field codeBlockGroupTransmission enables the feature for the serving cell.
- maxCodeBlockGroupsPerTransportBlock configures a maximum of 2, 4, 6, or 8 CBG positions per TB.
- The actual number of CBGs depends on the number of code blocks in the TB and the grouping procedure in 38.214.
- A CBG is ACK only when every code block in that group was received correctly. If at least one code block in the group failed, that CBG is NACK.
- If the actual number of CBGs is smaller than the configured maximum, the remaining codebook positions are filled with NACK as specified in 38.213.
- For a CBG retransmission, a CBG that was decoded successfully in an earlier transmission remains ACK in the feedback state.
The CBG procedure changes the granularity of each feedback item. It does not replace Type 1 or Type 2; CBG bits are placed into the applicable codebook using the corresponding ordering rules.
Important Parameters and Where They Come From
The algorithm is specified mainly in 38.213 clause 9.1, while most long-term configuration comes from RRC in 38.331 and per-transmission information comes from DCI. Similar-looking names across those specifications can be confusing, so the following table focuses on each field’s job.
Parameter / indication |
Source |
What it controls |
PhysicalCellGroupConfig |
semiStatic selects Type 1; dynamic selects Type 2. |
|
PDSCH-ServingCellConfig |
Enables CBG-based PDSCH transmission and feedback for the serving cell. |
|
maxCodeBlockGroupsPerTransportBlock |
PDSCH-CodeBlockGroupTransmission |
Maximum CBG positions per TB: 2, 4, 6, or 8. |
|
Calculated from the TB |
Actual number of CBGs for the TB, determined from its number of code blocks. |
harq-ACK-SpatialBundlingPUCCH / PUSCH |
PhysicalCellGroupConfig |
Controls spatial bundling of HARQ-ACK for multiple TBs on the indicated uplink channel. |
PDSCH-to-HARQ_feedback timing indicator (K1) |
DCI, using an RRC-configured dl-DataToUL-ACK list |
Selects the uplink reporting timing and therefore which results meet in one codebook. |
Applicable DCI formats |
Maintains the assignment count and ordering for a dynamic Type-2 codebook. |
|
maxNrofCodeWordsScheduledByDCI |
PDSCH-Config |
Indicates whether the codebook must account for up to one or two TBs/codewords. |
nrofHARQ-ProcessesForPDSCH |
PDSCH-ServingCellConfig |
Configures the number of downlink HARQ processes; it is especially relevant to the Type-3 process-indexed report. |
One-shot HARQ-ACK request |
DCI, enabled by the related RRC configuration |
A value of 1 triggers a Type-3 HARQ-ACK codebook. |
CBG transmission information (CBGTI) |
DCI 1_1 when applicable |
Indicates which CBGs are transmitted in a CBG-based PDSCH transmission. |
Detailed Worked Examples: RRC, DCI, and UCI/PUCCH
The examples below use deliberately small configurations so that the codebook can be followed by hand. They are not complete RRC messages or complete DCI payloads; only the fields that matter to HARQ-ACK are shown.
Common Illustrative PUCCH Configuration
Most examples use the following simplified RRC configuration. The exact PRBs, symbols, hopping, scrambling IDs, power-control fields, and spatial relation are omitted.
PhysicalCellGroupConfig:
pdsch-HARQ-ACK-Codebook = dynamic // Type-2 codebook
PDSCH-Config:
maxNrofCodeWordsScheduledByDCI = n1 // one TB per PDSCH here
PDSCH-ServingCellConfig:
codeBlockGroupTransmission = absent // TB-based feedback
PUCCH-Config:
dl-DataToUL-ACK = { 4, 3, 2, 1 }
resourceSetToAddModList:
set 0: resourceList = { 10 } // O_UCI <= 2 bits
set 1: resourceList = { 20 }, maxPayloadSize = 20
resourceToAddModList:
resource 10: format1 // chosen in our 1- or 2-bit example
resource 20: format2 // chosen in our 3- to 20-bit examples
Because dl-DataToUL-ACK has four entries, the illustrative DCI 1_1 uses a 2-bit PDSCH-to-HARQ_feedback timing indicator:
DCI field |
Selected list entry |
K1 |
00 | first | 4 slots |
01 | second | 3 slots |
10 | third | 2 slots |
11 | fourth | 1 slot |
In the examples, PRI means the PUCCH resource indicator. Also, do not hard-code DAI as a 2-bit field in an implementation. Two counter-DAI bits are common for a single DL serving cell. Under configurations such as multiple DL serving cells or inclusion of total DAI, DCI 1_1 can instead carry four DAI bits: counter DAI plus total DAI.
Example 1: One DCI, One PDSCH, and One-Bit PUCCH
The gNB sends one DCI 1_1 in slot 100 and schedules a one-TB PDSCH in the same slot. Only the fields relevant to this example are shown.
Slot |
Message |
Relevant content |
100 |
DCI 1_1 |
HARQ process = 3, NDI = 1, RV = 0, DAI running value = 1, K1 field = 00 → K1 = 4, PRI = 0 |
100 |
PDSCH |
One TB for HARQ process 3. Assume that the UE decodes it successfully. |
104 |
PUCCH |
Type-2 HARQ-ACK payload = [ACK] = [1]. |
The logical HARQ-ACK payload size is OACK = 1. With no SR or CSI to add, OUCI = 1. Because this is at most two bits, the UE chooses PUCCH resource set 0. PRI = 0 points to the first resource in that set, resource 10, which this example configured as PUCCH Format 1.
The DAI value is shown as a logical running value. In the common 2-bit counter-DAI representation, logical values 1, 2, 3, and 4 are encoded cyclically as 00, 01, 10, and 11. The exact DAI field width depends on the DCI format and configuration.
Example 2: Three DCIs and Three PDSCHs Share One PUCCH
This is the important codebook case. The gNB sends three separate DCI 1_1 messages. Assume K0 = 0, so each DCI schedules its PDSCH in the same slot as the DCI. Each DCI uses NDI = 1 and RV = 0 for a new transmission. Different K1 values make all three results arrive at slot 204; assume the last DCI, DCI C, has PRI = 0.
DCI / slot |
HARQ ID |
K1 field |
Feedback slot |
Counter DAI |
Decode |
Codebook position |
A / 200 | 3 | 00 → 4 | 204 | 1 (00) | ACK | bit 0 = 1 |
B / 201 | 7 | 01 → 3 | 204 | 2 (01) | NACK | bit 1 = 0 |
C / 202 | 1 | 10 → 2 | 204 | 3 (10) | ACK | bit 2 = 1 |
For this single-serving-cell example, the Type-2 order follows the detected assignments across the PDCCH monitoring occasions. The logical codebook is therefore:
HARQ-ACK codebook = [A, B, C] = [ACK, NACK, ACK] = [1, 0, 1]
Now follow the PUCCH decision in the correct order:
- The codebook contains three HARQ-ACK bits, so OACK = 3.
- If there is no simultaneous SR or CSI, OUCI = 3.
- Three bits do not fit resource set 0, whose limit is two. The UE therefore selects resource set 1.
- The PUCCH resource indicator from the last applicable DCI—DCI C in this case—selects a resource within set 1. If PRI = 0, it selects the first entry, resource 20.
- Resource 20 is configured as PUCCH Format 2, so the UE channel-codes and transmits the three UCI bits on that resource in slot 204.
If a positive scheduling request is also due in slot 204, the applicable SR information is combined with the HARQ-ACK according to the UCI multiplexing rule. In a simple one-SR case, the logical UCI becomes [HARQ-ACK bits, SR bit] = [1, 0, 1, 1], so OUCI becomes 4. Resource set 1 still applies.
Example 3: Type 1 Keeps Candidate Positions Even with Only Two DCIs
Change the common RRC setting to pdsch-HARQ-ACK-Codebook = semiStatic. Assume the Type-1 procedure uses the configured PDSCH time-domain allocations and K1 list to produce four candidate occasions for PUCCH slot 304:
MA = {A0, A1, A2, A3}
The gNB transmits only two scheduling DCIs: one for A0 and one for A2. A0 decodes as ACK and A2 decodes as NACK. No PDSCH is scheduled for A1 or A3.
Candidate |
What happened |
Type-1 bit |
A0 | DCI + PDSCH, decoded | ACK = 1 |
A1 | not scheduled | NACK placeholder = 0 |
A2 | DCI + PDSCH, failed | NACK = 0 |
A3 | not scheduled | NACK placeholder = 0 |
The result is [1, 0, 0, 0], not a two-bit [1, 0] report. OACK is 4, so this example again selects resource set 1 and, with PRI = 0 in the last applicable DCI, resource 20 / PUCCH Format 2. DAI can still be present in a DCI, but it is not what creates the Type-1 candidate positions.
Example 4: Two DCIs with CBG Feedback Create Eight HARQ-ACK Bits
Now enable CBG feedback and keep the dynamic Type-2 codebook:
PhysicalCellGroupConfig:
pdsch-HARQ-ACK-Codebook = dynamic
PDSCH-ServingCellConfig:
codeBlockGroupTransmission = setup:
maxCodeBlockGroupsPerTransportBlock = n4
DCI A in slot 400 schedules HARQ process 2 with K1 = 2. DCI B in slot 401 schedules HARQ process 5 with K1 = 1. Both results therefore use PUCCH slot 402. Each applicable DCI 1_1 carries the HARQ process number, DAI, K1, PRI, and CBG transmission information (CBGTI). For this simplified initial-transmission example, assume CBGTI indicates that all four groups are transmitted.
PDSCH |
Actual CBGs |
Decode results |
Four reported positions |
A | 4 | ACK, ACK, NACK, ACK | [1, 1, 0, 1] |
B | 3 | ACK, NACK, ACK | [1, 0, 1, 0] |
PDSCH B has only three actual CBGs, but the configured maximum is four, so its last position is filled with NACK. With DCI A followed by DCI B, the Type-2 payload is:
[A-CBG0..3, B-CBG0..3] = [1, 1, 0, 1, 1, 0, 1, 0]
OACK = 8. Resource set 1 is selected, and the last applicable DCI’s PRI selects resource 20 / PUCCH Format 2 in this configuration. Notice how just two DCIs produced eight HARQ-ACK information bits.
Example 5: The Codebook Is Due on PUCCH, but It Is Sent on PUSCH
Return to Example 2, whose logical Type-2 codebook is [1, 0, 1] in slot 204. Suppose the gNB also sends DCI 0_1 scheduling a PUSCH that overlaps the intended PUCCH in slot 204, and assume the priorities and timing satisfy the UCI-on-PUSCH multiplexing rules.
PUSCH-Config:
uci-OnPUSCH = setup:
betaOffsets = semiStatic:
betaOffsetACK-Index1 = ... // up to 2 HARQ-ACK bits
betaOffsetACK-Index2 = ... // more than 2 and up to 11 bits
betaOffsetACK-Index3 = ... // more than 11 bits
scaling = ...
- The HARQ-ACK codebook itself does not change: it is still [1, 0, 1].
- The UE resolves the PUCCH/PUSCH overlap and multiplexes those UCI bits onto the scheduled PUSCH.
- Because OACK = 3, the semi-static configuration uses the category associated with betaOffsetACK-Index2. The beta offset helps determine how many PUSCH resources are used to protect the HARQ-ACK bits.
- The UE does not also transmit the original HARQ-ACK PUCCH in this assumed case. UL-SCH data and HARQ-ACK UCI share the PUSCH according to the 38.212 multiplexing procedure.
If dynamic beta offsets are configured instead, the applicable DCI 0_1/0_2 field selects the beta-offset entry. DCI 0_1 can also contain a DAI field used by the PUSCH HARQ-ACK procedure. These are uplink-grant controls; they do not replace the downlink DAI values that built the Type-2 ordering.
Example 6: Type-3 One-Shot Report
Assume two serving cells, one TB per PDSCH, eight DL HARQ processes per cell, and no CBG feedback. RRC enables pdsch-HARQ-ACK-OneShotFeedback. A DCI sets the One-shot HARQ-ACK request field to 1, provides K1 leading to slot 504, and provides PRI = 0.
Suppose the stored results are:
- Cell 0, processes 0..7: [ACK, ACK, NACK, ACK, NACK, NACK, ACK, ACK]
- Cell 1, processes 0..7: [NACK, ACK, ACK, NACK, ACK, ACK, NACK, ACK]
The basic Type-3 ordering walks serving cells in ascending index and, within each cell, HARQ processes in ascending index:
[1,1,0,1,0,0,1,1, 0,1,1,0,1,1,0,1]
OACK = 16, so resource set 1 is selected in the common configuration. PRI = 0 selects resource 20 / PUCCH Format 2. For a process whose applicable HARQ-ACK information is not available, the detailed Type-3 procedure supplies the specified NACK value. Enhanced Type 3 can limit the requested serving cells and process numbers, reducing the payload.
Common Points of Confusion
Codebook does not mean compression. The payload is still a sequence of HARQ-ACK information bits.Type 1 is not selected by DAI. It is selected by the semi-static RRC setting and derives positions from candidate occasions. DAI is central to Type 2.Type 3 is not beam feedback. It is a one-shot, serving-cell/HARQ-process-oriented status report.CBG feedback is a granularity option. It can be used within the applicable codebook construction; it is not a replacement for Type 1 or Type 2.PUCCH and PUSCH do not define different codebook families. They are different uplink carriers of the HARQ-ACK UCI, with separate detailed procedures.One PDSCH is not always one bit. Two TBs or CBG-based reporting can create more than one HARQ-ACK bit for a single PDSCH reception.
Reference
- 3GPP TS 38.213 / ETSI TS 138 213, clause 9.1: HARQ-ACK codebook determination
- 3GPP TS 38.212 / ETSI TS 138 212: UCI channel coding and multiplexing on PUCCH/PUSCH
- 3GPP TS 38.331: RRC definitions for PhysicalCellGroupConfig, PDSCH-ServingCellConfig, and related fields
- 3GPP TS 38.214 / ETSI TS 138 214: PDSCH procedures and CBG determination
- ShareTechnote: 5G/NR Code Block Group (CBG)
- ShareTechnote: 5G/NR PUCCH