5G NR · Time-domain resource allocation

PUSCH Mapping Type & TDRA

The complete, spec-exact answer to "which slot and which symbols does my PUSCH use?". We trace the full TS 38.214 §6.1.2 procedure: the DCI time-domain field indexes a row, the row gives K2, mapping type and a SLIV, the SLIV decodes to a start and length, and K2 plus numerology fixes the slot. Every table, every constraint, every formula — and the reverse SLIV decode too.

A / Bmapping type
K2slot offset
SLIVS & L coded
38.214§6.1.2
DCI field → row → K2, type, SLIV → slot & symbols
1 The whole pipeline

How the UE resolves time-domain resources

A single DCI field — Time domain resource assignment, up to 4 bits — kicks off this exact chain. Follow each arrow; every box is a real spec step.

DCI field m

0…15 (≤4 bit)

Row m+1

of allocation list

{K2, type, SLIV}

row contents

Decode SLIV

→ S and L

slot = f(n,K2,μ)

which slot

symbols S…S+L−1

which symbols

Source of the allocation list (TS 38.214 §6.1.2.1)If pusch-TimeDomainAllocationList is provided (in pusch-Config or pusch-ConfigCommon) → use it.   Otherwise → use the default table (Default A, below), selected by CP type.
2 The two mapping types

Type A and Type B — exact rules

Mapping type fixes where the front-loaded DM-RS sits and which (S, L) are even legal. Note the technical catch most people miss: for PUSCH mapping Type A, the start symbol is fixed at S = 0 (unlike PDSCH, where S can be 0–3).

ParameterType A (slot-based)Type B (mini-slot)
First DM-RS symbol l₀dmrs-TypeA-Position (2 or 3)first allocated symbol (relative 0)
Start S (normal CP)0 only0 … 13
Length L (normal CP)4 … 141 … 14
S + L (normal CP)4 … 141 … 14
Length L (extended CP)4 … 121 … 12
Latency gradeslotsub-slot (URLLC)
Typical useeMBB, default grantsURLLC, fast HARQ, gap-fill
Constraints from TS 38.214 Table 6.1.2.1-1

Validity checker

Legal per Table 6.1.2.1-1?
Reason
3 The codec

SLIV — encode & decode, both directions

The gNB encodes (S, L) → SLIV; the UE decodes SLIV → (S, L). Most references only show the encode. Here is the full reverse algorithm too, run live.

Encode (gNB)

SLIV
Branch
Encode (38.214 6.1.2.1)if (L−1) ≤ 7 : SLIV = 14·(L−1) + S
else : SLIV = 14·(14−L+1) + (14−1−S)

Decode (UE)

S
L
Valid?
Decode algorithmL′ = ⌊SLIV/14⌋+1 ; S′ = SLIV mod 14
if S′+L′ ≤ 14 : S=S′, L=L′
else : L = 16 − L′ , S = 13 − S′
4 The table

Default PUSCH allocation table (Default A)

When no list is configured, this is the table the DCI field indexes — TS 38.214 Table 6.1.2.1.1-2 (normal CP). The slot offset uses j, which depends on the PUSCH numerology μ. Pick a row and μ; the resolved K2, type, S, L drop straight onto the slot.

m (DCI)RowTypeK2SLSLIV
Mapping type
K2 (slots)
S , L
SLIV
5 Which slot

K2 — the slot offset (cross-numerology)

K2 says how many PUSCH slots after the scheduling PDCCH the grant lands. When the PDCCH and PUSCH use different sub-carrier spacings, the PDCCH slot number is first scaled into PUSCH slots. Set both numerologies and watch the target slot.

PUSCH slot (TS 38.214 §6.1.2.1)slotPUSCH = ⌊ n · 2μPUSCH / 2μPDCCH ⌋ + K2
6 The DM-RS anchor

dmrs-TypeA-Position

For Type A, the cell-wide RRC parameter dmrs-TypeA-Position fixes the first DM-RS symbol l₀ at pos2 or pos3. It must lie inside the allocation, which is partly why Type A needs L ≥ 4. Type B always front-loads on the first allocated symbol.

7 Put it together

One DCI, fully resolved

A grant arrives. Let's resolve it the way the UE does — field to symbols.

8 Knowledge check

Test yourself