Time-Domain Resource Allocation & SLIV in 5G NR
How the DCI points to symbols in time — K0/K2 slot offsets, PDSCH/PUSCH mapping type A/B, and the SLIV that packs start symbol S and length L into one field.
LTE transmitted for exactly one subframe. There was no time-domain allocation field in a DL assignment because there was nothing to say: the transmission started after the control region and ran to the end of the subframe. NR gave that up. The start symbol S and the length L became free parameters chosen per grant, and that single decision is what makes both a two-symbol URLLC transmission and a fourteen-symbol coverage-limited one expressible in the same frame structure. SLIV is the compact encoding that makes the freedom fit: a triangular packing of all 105 legal (S, L) pairs into a single seven-bit integer, folded through the middle so that the half of the rectangle which is illegal anyway is reused. This document derives that encoding, works it forward and backward by hand, and then spends most of its length on the practical consequences -- that a SLIV taken from the wrong branch decodes to a plausible wrong answer, that a perfectly legal SLIV becomes unschedulable the moment the TDD pattern changes underneath it, and that a mapping type A allocation which excludes its own DMRS symbol fails in a way that looks exactly like a radio problem.
Contents
- 01Why NR Lets the Time Domain Float
- 02S and L: What the Scheduler Actually Chooses
- 03The SLIV Encoding, and Why It Is Piecewise
- 04The Encoding Space, Seen Whole
- 05Decoding a SLIV: the Algorithm and Its One Trap
- 06Where the SLIV Lives: the TDRA Row and the List
- 07The DCI Field Is an Index, Not a SLIV
- 08The Default Tables, and Why Initial Access Needs Them
- 09Mapping Type A and Mapping Type B
- 10Valid (S, L) Combinations, and Why They Are Restricted
- 11k0, k2, and the Processing-Time Floors
- 12A Full Worked Chain: DCI to Absolute Symbols
- 13Interaction with the TDD Pattern
- 14Slot Aggregation and PUSCH Repetition Type A
- 15PUSCH Repetition Type B: Nominal versus Actual
- 16Multi-PDSCH and Multi-PUSCH Scheduling
- 17Parameter and Range Reference
- 18Failure Modes and What Each One Means
- 19Configuration Reference (ASN.1)
- 20Four More Worked Calculations
- 21Illustrative Message Traces
- 22Release Deltas: Rel-15 to Rel-18
- 23Reading Time-Domain Allocation in Logs: A Checklist
- 24Glossary
- 25References
1. Why NR Lets the Time Domain Float
In LTE, a downlink assignment told the UE which resource blocks to receive and said nothing whatsoever about when. It did not need to. A PDSCH occupied one subframe, beginning immediately after the control region and ending at the last symbol, and every transmission in the cell shared that 1 ms cadence. The transmission time interval was a constant of the system. That constant bought enormous simplification -- and it put a floor of roughly 1 ms under every latency budget, and a ceiling of one subframe over every energy accumulation.
NR removed the constant. The start symbol and the length became fields in a grant, selected from a table the network configures. Everything in this document exists because of that one decision, and the decision was driven by two requirements pulling in opposite directions:
- Latency. A URLLC transmission wants to start at the next symbol boundary after the grant is decoded, not at the next slot boundary, and it wants to be short enough that the receiver can decode it and turn around inside a millisecond. Two symbols at 30 kHz SCS is about 71 µs. Waiting for a slot boundary would add up to 500 µs of pure dead time to a budget measured in single milliseconds.
- Coverage. A cell-edge UE wants the opposite: every symbol in the slot, all fourteen of them, because received energy is the only thing standing between it and a decoding failure. It would happily take several slots' worth (§14), and it certainly does not want the scheduler wasting three symbols at the top of the slot on a control region it is not using.
One frame structure has to serve both, in the same cell, in adjacent slots, on the same carrier. The mechanism NR chose is to make the time-domain allocation a per-grant pair of integers, and then to spend considerable specification effort making that pair cheap to signal. The cheapness is the SLIV.
| LTE | NR | |
|---|---|---|
| Time-domain granularity | One subframe (1 ms), fixed | Any 1 to 14 consecutive symbols within one slot |
| Signalled in the grant? | No. Implied by the subframe and the PCFICH control region size | Yes. A row index into a configured table, which yields S and L |
| Start position | First symbol after the control region -- the same for every UE | S, chosen per grant; 0 to 3 for mapping type A, 0 to 12 for type B |
| Shortest transmission | 1 ms (11 to 13 symbols of PDSCH) | 2 symbols PDSCH, 1 symbol PUSCH -- 18 µs at 120 kHz SCS |
| Reference for the DMRS position | Fixed symbols within the subframe | Slot boundary (type A) or the start of the allocation (type B) |
| Cost of the flexibility | -- | A 7-bit SLIV per table row, a 0 to 4 bit index per grant, and a configured table that both ends must agree on |
Table 1. What NR gave up and what it bought. The right-hand column is this document; the companion 02 Radio Frame Structure document owns the slot and symbol numbering both columns assume.
Two integers, S and L, decide when a transmission starts and how long it lasts. Everything else in this document -- the encoding, the tables, the DCI field, the mapping types, the offsets, the repetition rules -- is machinery for getting those two integers from the scheduler to the UE cheaply and unambiguously. When you are debugging a time-domain problem, the question is always which S and which L did each end believe, and the two ends can differ for six or seven distinct reasons (§18).
2. S and L: What the Scheduler Actually Chooses
The definitions are short and worth stating exactly, because almost every hand-decoding error is a definitional one rather than an arithmetic one TS 38.214 cl. 5.1.2.1:
| Symbol | Name | Counted from | Range | What it must satisfy |
|---|---|---|---|---|
| S | Starting symbol index | The first symbol of the slot, index 0, not from the end of the CORESET and not from the start of the BWP | 0 to 13 in principle; restricted per mapping type (§10) | S + L <= 14 for normal CP |
| L | Number of consecutive symbols | S itself, inclusive -- the allocation is symbols S through S+L-1 | 1 to 14; restricted per mapping type and per channel (§10) | L >= 1, and L drawn from the mapping type's permitted set |
Table 2. S and L, for normal cyclic prefix. For extended CP the slot has 12 symbols and the constraint becomes S + L <= 12; see §3.
Three properties of this pair matter more than they look:
- The allocation is contiguous in time. There is no bitmap, no gap, no comb. This is the opposite of the frequency domain, where FDRA type 0 is an RBG bitmap and a single grant can be scattered across the carrier. In time you get one run of symbols, full stop.
- The allocation cannot cross a slot boundary. S + L <= 14 is not a convenience, it is structural: the DMRS position, the HARQ process association and the transport block are all defined per slot. A transmission that needs more symbols than the slot has left uses repetition (§14, §15), which is several transmissions, not one long one.
- Neither S nor L says anything about which slot. The SLIV is purely intra-slot. The slot is chosen by
k0ork2(§11), and the two pieces of information travel together in the same table row but are encoded completely separately.
Reading a SLIV as though S were counted from the end of the CORESET is the single commonest hand-decoding error, and it is silent: a CORESET of two symbols plus "S = 0" reads as symbol 2, which is exactly where a typical type A allocation with S = 2 starts anyway. The mistake only becomes visible on a grant where the CORESET is three symbols, or where S is nonzero, and then it produces a consistent two- or three-symbol offset across every allocation in the log. If every allocation you decode looks shifted by the same amount, suspect this before suspecting the network.
3. The SLIV Encoding, and Why It Is Piecewise
The encoding is specified in the forward direction only, as two branches TS 38.214 cl. 5.1.2.1:
SLIV encoding, normal cyclic prefix:
if (L - 1) <= 7:
SLIV = 14 * (L - 1) + S
else:
SLIV = 14 * (14 - L + 1) + (14 - 1 - S)
subject to L >= 1 and S + L <= 14
S starting symbol index within the slot, counted from 0
L number of consecutive symbols, counted from S inclusive
SLIV the value carried in startSymbolAndLength, INTEGER (0..127)The obvious question is why this is not simply SLIV = 14 * L + S, which would be a clean two-field pack and would need eight bits. The answer is that half of the (S, L) rectangle is not merely unused but illegal, and the fold reuses it.
3.1 Counting the legal pairs
For each length L there are exactly 15 − L legal starting positions, because S may run from 0 up to 14 − L inclusive. Summing over all lengths:
Legal pairs = sum over L = 1 .. 14 of (15 - L)
= 14 + 13 + 12 + ... + 2 + 1
= 14 x 15 / 2
= 105
A naive pack of L (4 bits) and S (4 bits) costs 8 bits and expresses 256 code points, of which 105 are legal -- 41% efficiency.
105 code points need ceil(log2 105) = 7 bits. The SLIV encoding achieves exactly 7 bits with no gaps: the value range is 0 to 104 and every one of those 105 values is used by exactly one legal (S, L) pair.
3.2 What the fold does
Branch 1 lays lengths L = 1 through 8 out in rows of 14, in the natural order: L = 1 occupies SLIVs 0 to 13, L = 2 occupies 14 to 26, and so on. Each of those rows is short -- L = 2 only has 13 legal starting positions, so SLIV 27 would be the next value in the row if it existed, and it does not. Those leftover values at the end of each row are precisely where branch 2 puts the long allocations, in reverse order of both L and S. L = 14 has exactly one legal pair and it lands on SLIV 27, the hole at the end of the L = 2 row. L = 13 has two, and they land on 40 and 41, the holes at the end of the L = 3 row.
That is the whole trick, and it is why the second branch has the shape it does. The (14 − L + 1) term walks the rows backward from the top; the (14 − 1 − S) term walks the positions backward within a row, so that the shortest legal run of positions is packed against the far end. Read the next section's figure once and the formula stops needing to be remembered.
For extended cyclic prefix the slot has 12 symbols, and the constraint becomes S + L <= 12 -- but the multiplier in both branches stays 14, and the branch test becomes (L − 1) <= 6 TS 38.214 cl. 5.1.2.1. The consequence is that the extended-CP mapping is not a dense packing: it has gaps, and some SLIV values in 0..127 are simply unreachable. Do not carry a normal-CP decoder over to an extended-CP cell and expect it to be exact. Extended CP is only defined for 60 kHz SCS, so in practice this bites in FR2 and in some 60 kHz FR1 deployments and nowhere else.
4. The Encoding Space, Seen Whole
This is the figure worth spending a minute on. It is the entire encoding, drawn once: the 14 × 14 rectangle of (S, L) pairs, the legal triangle in the lower left, the illegal triangle in the upper right, and the fold between L = 8 and L = 9 where the branch changes.
4.1 Reading the figure
- Bottom row, L = 1. Fourteen legal pairs, SLIVs 0 to 13, one per starting symbol. This row exists but is not usable for PDSCH -- neither mapping type permits L = 1 for PDSCH (§10). PUSCH mapping type B does.
- Below the fold (L = 1 to 8). SLIV increases left to right and jumps by 14 per row.
SLIV mod 14is S andSLIV div 14is L − 1. Simple. - Above the fold (L = 9 to 14). SLIV increases right to left, and the rows are stacked in reverse. The single cell at L = 14, S = 0 is SLIV 27, sitting in the hole after SLIV 26.
- The upper-right triangle. 91 illegal pairs, no code point. This is where the 105 values fit into a 7-bit field instead of an 8-bit one.
4.2 Working the encoding forward
Four encodes, chosen so that two land in each branch. These are the values that appear in every trace and figure in this document:
(S = 2, L = 12) -- a typical slot-based PDSCH under a 2-symbol CORESET.
L - 1 = 11, and 11 > 7, so branch 2.
SLIV = 14 x (14 - 12 + 1) + (14 - 1 - 2)
= 14 x 3 + 11 = 42 + 11 = 53
(S = 0, L = 14) -- the whole slot, used for PUSCH and for PDSCH in slots with no downlink control.
L - 1 = 13 > 7, so branch 2.
SLIV = 14 x (14 - 14 + 1) + (14 - 1 - 0)
= 14 x 1 + 13 = 27
(S = 6, L = 2) -- a two-symbol mini-slot in the middle of the slot.
L - 1 = 1 <= 7, so branch 1.
SLIV = 14 x 1 + 6 = 20
(S = 8, L = 4) -- a four-symbol mini-slot late in the slot.
L - 1 = 3 <= 7, so branch 1.
SLIV = 14 x 3 + 8 = 50
The branch test is on L, never on S, and it is L − 1 <= 7, that is L <= 8. Testing L <= 7 instead -- an easy slip, and the value that is correct for extended CP -- moves the eight-symbol allocations into the wrong branch and breaks the packing: L = 8 would then encode to 105 through 111, values that no legal normal-CP allocation can produce, while SLIVs 98 to 104 would become unreachable. A decoder built with that off-by-one silently mis-decodes exactly the eight-symbol allocations and nothing else, which is a nasty intermittent to chase.
5. Decoding a SLIV: the Algorithm and Its One Trap
The spec gives the encoder. Everyone reading a log needs the decoder, and the decoder is not stated anywhere -- it has to be inverted. The inversion is easy but the branch selection is not obvious, because the branch condition in the encoder is on L, and L is exactly what you do not have yet.
The resolution is to assume branch 1, compute the pair it implies, and test that pair for legality. If it is legal, it is the answer, because the encoding is injective. If it is not legal, branch 2 was used:
SLIV decoding, normal cyclic prefix:
q = SLIV div 14 # integer division
r = SLIV mod 14
L' = q + 1 # what branch 1 would have meant
S' = r
if S' + L' <= 14: # branch 1 was used
S = S'
L = L'
else: # branch 2 was used
L = 15 - q # = 14 - q + 1
S = 13 - r # = 14 - 1 - r
allocation occupies symbols S, S+1, ... , S+L-15.1 Working the encoding backward
SLIV = 53 -- from the everyday PDSCH row.
q = 53 div 14 = 3, r = 53 mod 14 = 11
trial: L' = 4, S' = 11 -> S' + L' = 15 > 14, illegal
so branch 2: L = 15 - 3 = 12, S = 13 - 11 = 2
allocation = symbols 2 through 13
SLIV = 20 -- a mini-slot.
q = 1, r = 6
trial: L' = 2, S' = 6 -> 8 <= 14, legal
so branch 1: S = 6, L = 2
allocation = symbols 6 and 7
SLIV = 27 -- the whole slot, and the single most confusing value in the table.
q = 1, r = 13
trial: L' = 2, S' = 13 -> 15 > 14, illegal
so branch 2: L = 15 - 1 = 14, S = 13 - 13 = 0
allocation = the whole slot, symbols 0 through 13
SLIV = 41 -- one of the two 13-symbol allocations.
q = 2, r = 13
trial: L' = 3, S' = 13 -> 16 > 14, illegal
so branch 2: L = 15 - 2 = 13, S = 13 - 13 = 0
allocation = symbols 0 through 12
5.2 The round trip
A decode is worth nothing unless it re-encodes to the value you started from. This is free to check and it catches every branch error:
Decode 53 -> (S = 2, L = 12).
Re-encode (2, 12): L - 1 = 11 > 7 -> branch 2
SLIV = 14 x (14 - 12 + 1) + (14 - 1 - 2) = 42 + 11 = 53 round trip OK
Decode 20 -> (S = 6, L = 2).
Re-encode (6, 2): L - 1 = 1 <= 7 -> branch 1
SLIV = 14 x 1 + 6 = 20 round trip OK
Decode 27 -> (S = 0, L = 14).
Re-encode (0, 14): L - 1 = 13 > 7 -> branch 2
SLIV = 14 x 1 + 13 = 27 round trip OK
Now the failure case, on purpose. Take SLIV 53 and force branch 1:
S = 53 mod 14 = 11, L = 53 div 14 + 1 = 4
S + L = 15 > 14 -> this pair is illegal, so it cannot be right.
Re-encoding (11, 4) gives 14 x 3 + 11 = 53, which also round-trips -- because the encoder was never given a legal input. The round trip only protects you if you also check S + L <= 14.
Applying the wrong branch always yields a pair whose sum exceeds 14, and never yields an out-of-range S or L on its own. Both numbers look individually reasonable -- S = 11 is a legal starting symbol, L = 4 is a legal mapping type B length -- so nothing about the pair screams wrong. SLIV 53 mis-read as branch 1 reads as a four-symbol mini-slot starting at symbol 11 when it is in fact a twelve-symbol slot-based allocation starting at symbol 2. That is not a small error; it is the opposite kind of transmission. The free self-test is the sum: if S + L > 14, you took the wrong branch. Build that check into any decoder or spreadsheet you write, and never trust a hand decode that did not perform it.
6. Where the SLIV Lives: the TDRA Row and the List
A SLIV never travels alone. It is one field of a three-field structure that also carries the slot offset and the mapping type, and that structure is one entry in a configured list. The DCI selects a list entry; the entry carries everything needed to place the transmission.
| Field | In | Range | Absent means | What it decides |
|---|---|---|---|---|
k0 | PDSCH row | 0 to 32 slots | k0 = 0, i.e. same slot as the DCI | Which slot the PDSCH is in, relative to the slot carrying the DCI |
k2 | PUSCH row | 0 to 32 slots | A default derived from the numerology (§11) | Which slot the PUSCH is in, relative to the slot carrying the DCI |
mappingType | both | typeA or typeB | Mandatory field | Whether the DMRS is referenced to the slot boundary or to the start of the allocation, and which (S, L) pairs are legal (§9, §10) |
startSymbolAndLength | both | INTEGER (0..127) | Mandatory field | The SLIV. Everything in §3 to §5 |
Table 3. One row of PDSCH-TimeDomainResourceAllocation or PUSCH-TimeDomainResourceAllocation. The three fields are independent: the same SLIV with a different k0 is a different transmission, and the same SLIV with a different mappingType is a different channel structure even though it occupies identical symbols.
6.1 The lists, and which one wins
The rows are gathered into pdsch-TimeDomainAllocationList and pusch-TimeDomainAllocationList, each of up to 16 entries in Rel-15 (maxNrofDL-Allocations and maxNrofUL-Allocations are both 16). Each list can appear in two places, and there is a strict precedence TS 38.214 cl. 5.1.2.1.1 and 6.1.2.1.1:
| Priority | Where the list is | Broadcast or dedicated | Applies to |
|---|---|---|---|
| 1 (highest) | pdsch-Config / pusch-Config inside BWP-DownlinkDedicated / BWP-UplinkDedicated | Dedicated (RRC) | Grants in a UE-specific search space, and -- once configured -- also grants in a common search space for that UE |
| 2 | pdsch-ConfigCommon / pusch-ConfigCommon inside BWP-DownlinkCommon / BWP-UplinkCommon, broadcast in SIB1 | Common (SIB1 or dedicated ServingCellConfigCommon) | Grants in a common search space when no dedicated list exists |
| 3 (lowest) | Nowhere -- the default tables in TS 38.214 | Neither; hard-coded in the spec | Everything before the UE has any configuration at all (§8) |
Table 4. Precedence for resolving a TDRA index. Note that a dedicated list, once present, generally displaces the common one even for common-search-space grants -- which is why an RRC reconfiguration can change the meaning of a DCI field value without the field itself changing.
The three-level precedence is a real source of confusion in logs captured across an RRC setup. A UE decoding TDRA index 2 in a Type1 common search space before RRCSetup is indexing the default table; the same index in the same search space after RRCSetup may be indexing a dedicated list with entirely different contents. If a log shows the same TDRA index resolving to different symbols at different times, check whether a dedicated list arrived in between before assuming anything is broken.
7. The DCI Field Is an Index, Not a SLIV
This is the piece of the mechanism that most often surprises people reading a DCI dump: the Time domain resource assignment field in a scheduling DCI does not contain a SLIV, does not contain S, does not contain L, and does not contain k0 or k2. It contains a row number.
| DCI format | TDRA field width | Indexes | Notes |
|---|---|---|---|
| 1_0 (DL, fallback) | 4 bits, always | The applicable default PDSCH table, or the common list if one is configured | Fixed width because a fallback DCI must be decodable before the UE knows the list size |
| 0_0 (UL, fallback) | 4 bits, always | The applicable default PUSCH table, or the common list | Same reasoning |
| 1_1 (DL, non-fallback) | 0 to 4 bits | pdsch-TimeDomainAllocationList | Width = ceil(log2 I) where I is the number of configured rows; a single-row list means a zero-bit field |
| 0_1 (UL, non-fallback) | 0 to 4 bits | pusch-TimeDomainAllocationList | Same. Rel-16 multi-PUSCH lists extend this to up to 6 bits (§16) |
| 1_2 / 0_2 (Rel-16 URLLC) | 0 to 4 bits | Separate pdsch-TimeDomainAllocationListForDCI-Format1-2 and pusch-TimeDomainAllocationListForDCI-Format0-2 | Deliberately separate lists so a compact DCI can carry a short field without constraining the normal one |
Table 5. TDRA field widths, TS 38.212 cl. 7.3.1.1.2 and 7.3.1.2.2. The companion 08 Scheduling document covers the rest of each DCI format's field set; this table covers only the one field.
The DCI field carries no timing information of its own. Four bits, at most, and often fewer -- sometimes zero. Every scrap of actual timing lives in the configured list, which is signalled once by RRC and then never repeated. This indirection is deliberate and it is the reason the field is so cheap: a scheduler that needs sixteen distinct time-domain shapes pays four bits per grant instead of the fourteen bits it would cost to send k0, mappingType and SLIV explicitly. It is also the reason that a DCI dump alone is not decodable. Without the list, TDRA = 2 is a number with no meaning, and no amount of staring at the DCI will recover the symbols.
7.1 The off-by-one that catches everybody
TS 38.214 phrases the lookup as "the row index m + 1", where m is the value of the TDRA field. The field is zero-based; the tables in the spec are one-based. Field value 0 selects row 1. Field value 15 selects row 16. Most vendor logs print the field value, some print the row number, and a few print both with the same label.
Hand-decoding 0xAA 0x34 0x5C from the figure: the second octet is 0011 0100. Payload bits 8 through 15 map onto those eight positions left to right, so bits 12, 13 and 14 are the fifth, sixth and seventh characters: 0, 1, 0. TDRA field = binary 010 = 2, therefore row 3 of the list. Get the bit order backwards and you read 010 as 0, 1, 0 reversed = 010 -- identical, which is luck. Try it with TDRA = 3 (011) and the reversed read gives 6, an index that may not even exist in the list.
8. The Default Tables, and Why Initial Access Needs Them
A UE performing initial access has read MIB and SIB1 and nothing else. It has to receive SIB1 itself, then the RAR, then MSG4 -- three PDSCHs and one PUSCH -- before any dedicated configuration exists. Something has to tell it where in the slot those transmissions are, and that something is a table hard-coded in TS 38.214 that both ends already know.
There are three default PDSCH tables and one default PUSCH table, each with a normal-CP and an extended-CP variant:
| Table | Spec table | When it applies | Character |
|---|---|---|---|
| Default PDSCH A | TS 38.214 Table 5.1.2.1.1-2 (normal CP), 5.1.2.1.1-3 (extended CP) | SS/PBCH-block-and-CORESET multiplexing pattern 1 -- which is everything in FR1 and most of FR2 -- when no pdsch-TimeDomainAllocationList is configured in pdsch-ConfigCommon | 16 rows, k0 = 0 in every one. A mix of mapping type A rows with S in {0, 1, 2, 3} and mapping type B rows with L in {2, 4, 7} |
| Default PDSCH B | TS 38.214 Table 5.1.2.1.1-4 | Multiplexing pattern 2, which only exists in FR2 | Type B heavy, with nonzero k0 rows, because in pattern 2 the SSB and CORESET#0 are frequency-multiplexed within the same slots |
| Default PDSCH C | TS 38.214 Table 5.1.2.1.1-5 | Multiplexing pattern 3, also FR2 only | Similar in spirit to B; the two exist because patterns 2 and 3 leave different symbols free |
| Default PUSCH A | TS 38.214 Table 6.1.2.1.1-2 (normal CP), 6.1.2.1.1-3 (extended CP) | Whenever no pusch-TimeDomainAllocationList applies -- there is only one default PUSCH table | 16 rows, k2 in {1, 2, 3}. Type A rows all have S = 0; type B rows start at symbol 2 or 4 |
Table 6. The default tables and their applicability, TS 38.214 Tables 5.1.2.1.1-1 and 6.1.2.1.1-1. Which of A, B or C applies is decided by the RNTI, the search space type and the SSB-to-CORESET#0 multiplexing pattern -- the companion 30 CORESET and Search Space document owns that pattern.
8.1 A representative portion of Default PDSCH table A
This is TS 38.214 Table 5.1.2.1.1-2, Default PDSCH time domain resource allocation A for normal CP, rows 1 through 8. The table is indexed by dmrs-TypeA-Position, which is broadcast in MIB, because the start symbol of a mapping type A allocation has to contain the DMRS (§9). Every row has k0 = 0:
| Row | Mapping type | k0 | S (pos2) | L (pos2) | S (pos3) | L (pos3) |
|---|---|---|---|---|---|---|
| 1 | typeA | 0 | 2 | 12 | 3 | 11 |
| 2 | typeA | 0 | 2 | 10 | 3 | 9 |
| 3 | typeA | 0 | 2 | 9 | 3 | 8 |
| 4 | typeA | 0 | 2 | 7 | 3 | 6 |
| 5 | typeA | 0 | 2 | 5 | 3 | 4 |
| 6 | typeB | 0 | 9 | 4 | 10 | 4 |
| 7 | typeB | 0 | 4 | 4 | 6 | 4 |
| 8 | typeB | 0 | 5 | 7 | 5 | 7 |
Table 7. Rows 1 to 8 of Default PDSCH table A, normal CP. "pos2" and "pos3" are the two values of dmrs-TypeA-Position. Rows 9 to 16 continue with further type B and type A entries; they are not reproduced here. Row 1 with dmrs-TypeA-Position = pos2 is (S = 2, L = 12) -- SLIV 53, the value worked in §4 and §5, and by a wide margin the most common allocation you will see.
Every row of Default PDSCH table A has k0 = 0. That means a UE at initial access can never be scheduled a PDSCH in a later slot than the DCI: SIB1, the RAR and MSG4 are always same-slot. This is a useful sanity check when reading an early-attach log -- a DCI in slot 7 scheduling a PDSCH in slot 9 cannot be using the default table, so either a common list is configured in pdsch-ConfigCommon or you have mis-attributed the DCI.
Rows 1 through 5 of Default table A pair a fixed S with a shrinking L: (2, 12), (2, 10), (2, 9), (2, 7), (2, 5). The scheduler's only degree of freedom at initial access is how much of the slot to use, not where to start. That is deliberate -- the start is pinned by dmrs-TypeA-Position, and the length is what lets the gNB trade coverage against slot occupancy for a UE whose channel it knows nothing about yet.
9. Mapping Type A and Mapping Type B
mappingType is one enumerated bit in the TDRA row and it changes more than any other field in this document. It decides where the demodulation reference signal goes, and therefore what the receiver can do with a short allocation. Two allocations occupying byte-for-byte identical symbols behave completely differently depending on this bit.
9.1 Type A: slot-based
Mapping type A is the LTE-shaped case. The DMRS sits at a fixed position referenced to the slot boundary -- symbol 2 or symbol 3, selected by dmrs-TypeA-Position in MIB and repeated in ServingCellConfigCommon TS 38.211 cl. 7.4.1.1.2. The allocation is expected to be long, to start near the top of the slot, and to run to or near the end of it.
dmrs-TypeA-Position = pos2 and pos3. The bottom row is the failure: S = 3 with the DMRS at symbol 2 puts the reference signal outside the allocation, so the UE has nothing to estimate the channel from. This is why S is restricted to {0, 1, 2, 3} and why S = 3 is only usable when the DMRS is at symbol 3.The restriction on S follows directly. The DMRS symbol has to be inside the allocation, and the DMRS symbol is at index 2 or 3 of the slot. If S were 5, the allocation would start three symbols after its own reference signal and the receiver would have no channel estimate. So S is capped at 3, and at 3 only when dmrs-TypeA-Position = pos3.
9.2 Type B: non-slot-based, the mini-slot
Mapping type B references the DMRS to the first symbol of the allocation, not to the slot. That single change is what makes the mini-slot possible: an allocation can begin anywhere, because it carries its own reference signal with it.
| Mapping type A | Mapping type B | |
|---|---|---|
| Common name | Slot-based | Non-slot-based, mini-slot, sub-slot |
| DMRS reference point | The slot boundary. First DMRS at symbol 2 or 3 of the slot, from dmrs-TypeA-Position | The first symbol of the allocation, always |
| PDSCH S range (normal CP) | {0, 1, 2, 3} | 0 to 12 |
| PDSCH L range (normal CP) | 3 to 14 | {2, 4, 7} in Rel-15 |
| PUSCH S range (normal CP) | 0 only | 0 to 13 |
| PUSCH L range (normal CP) | 4 to 14 | 1 to 14 |
| Typical use | Everything ordinary: eMBB traffic, SIB1, RAR, MSG4, the whole default table A type A block | URLLC, low-latency scheduling, unlicensed operation where a transmission must start the instant the channel is won, and PUSCH repetition type B (§15) |
| Why it exists | It maximises DMRS sharing: one DMRS position serves every UE in the slot, so the reference-signal overhead is amortised | It removes the slot-boundary wait, at the cost of a DMRS per allocation instead of a DMRS per slot |
| Overhead consequence | Low. One or two DMRS symbols in fourteen | High. A 2-symbol type B PDSCH spends one of its two symbols on DMRS -- 50% overhead |
Table 8. Mapping type A against mapping type B. The overhead row is the reason mini-slots are a latency tool and not a throughput tool.
A two-symbol type B PDSCH carries its DMRS in one of those two symbols. Half the allocation is reference signal. That is an acceptable price for cutting hundreds of microseconds off a control-loop deadline and a terrible price for bulk data, which is exactly why schedulers configure both mapping types in the same TDRA list and pick per grant. If you see a cell using L = 2 type B for ordinary traffic, someone has configured a URLLC row and left it as the only row -- the spectral efficiency loss is large and it will show up as low throughput with no radio problem whatsoever.
The DMRS position rules themselves -- how many additional DMRS symbols a given L gets, the dmrs-AdditionalPosition enumeration, and the configuration types 1 and 2 -- belong to the companion 33 DMRS document, which owns them. What matters here is only which reference point the mapping type selects, because that is what constrains S.
10. Valid (S, L) Combinations, and Why They Are Restricted
The SLIV encoding can express all 105 pairs. The spec then forbids most of them, per channel and per mapping type, in TS 38.214 Table 5.1.2.1-1 for PDSCH and Table 6.1.2.1-1 for PUSCH. A SLIV whose (S, L) is outside the applicable row of those tables is not merely unusual -- the UE is not required to receive it, and behaviour is undefined.
| Channel | Mapping type | CP | S | L | S + L |
|---|---|---|---|---|---|
| PDSCH | typeA | normal | 0, 1, 2, 3 | 3 to 14 | 3 to 14 |
| PDSCH | typeA | extended | 0, 1, 2, 3 | 3 to 12 | 3 to 12 |
| PDSCH | typeB | normal | 0 to 12 | 2, 4, 7 | 2 to 14 |
| PDSCH | typeB | extended | 0 to 10 | 2, 4, 6 | 2 to 12 |
| PUSCH | typeA | normal | 0 | 4 to 14 | 4 to 14 |
| PUSCH | typeA | extended | 0 | 4 to 12 | 4 to 12 |
| PUSCH | typeB | normal | 0 to 13 | 1 to 14 | 1 to 14 |
| PUSCH | typeB | extended | 0 to 11 | 1 to 12 | 1 to 12 |
Table 9. Valid S and L, TS 38.214 Table 5.1.2.1-1 (PDSCH) and Table 6.1.2.1-1 (PUSCH). For PDSCH type A, S = 3 is applicable only when dmrs-TypeA-Position = pos3.
10.1 Reading the four asymmetries
- PDSCH type A: S is capped at 3. Because the DMRS is at slot symbol 2 or 3 and must be inside the allocation (§9.1). Nothing else constrains it.
- PDSCH type A: L starts at 3. A two-symbol slot-based PDSCH would spend a symbol on DMRS and have one symbol of data starting at the top of the slot -- there is no use case, and type B covers short allocations properly.
- PDSCH type B: L is drawn from {2, 4, 7} only. This is the restriction people trip over. It is not a range, it is a set. L = 3, L = 5, L = 6 and everything above 7 are not legal Rel-15 type B PDSCH lengths. The three values were chosen to cover a symbol pair, a quarter slot and a half slot; later releases widen the set for specific features, so confirm against the release and the UE capability before assuming a value is available.
- PUSCH type A: S = 0, full stop. An uplink slot-based transmission always starts at the first symbol of the slot. There is no uplink control region to skip, so there is nothing for a nonzero S to buy. Meanwhile PUSCH type B is the least restricted case in the whole table: any S from 0 to 13, any L from 1 to 14. A single-symbol PUSCH is legal and is used for very short uplink control-plus-data bursts.
Because PUSCH mapping type A pins S = 0, the only PUSCH SLIVs that are legal for type A are those with S = 0: SLIVs 42 (L=4), 56 (L=5), 70 (L=6), 84 (L=7), 98 (L=8), 97 (L=9), 83 (L=10), 69 (L=11), 55 (L=12), 41 (L=13) and 27 (L=14). Eleven values out of 105. If a pusch-TimeDomainAllocationList row says mappingType typeA and its SLIV is not one of those eleven, the row is malformed and the UE's behaviour on receiving a grant for it is unspecified -- most implementations drop the grant silently.
A configuration tool that generates SLIVs from S and L without consulting the mapping-type table will happily emit typeA rows with S = 2 for PUSCH, or typeB PDSCH rows with L = 3. Both encode to perfectly valid SLIV integers, both pass ASN.1 validation because startSymbolAndLength is just INTEGER (0..127), and both are accepted by RRC without complaint. The failure appears only when a grant referencing that row is sent, and it appears as a missing transmission -- a PDSCH the UE never acknowledges, or a PUSCH the gNB never receives. There is no error message anywhere in the chain.
11. k0, k2, and the Processing-Time Floors
The SLIV places a transmission within a slot. k0 and k2 say which slot, counted forward from the slot in which the scheduling DCI was received:
| Offset | Direction | Definition | Range | Counted on which SCS |
|---|---|---|---|---|
k0 | Downlink | PDSCH slot = (DCI slot) + k0. Same slot when k0 = 0, which is the normal case for eMBB | 0 to 32 | The PDSCH subcarrier spacing. With cross-numerology scheduling the DCI slot index is first scaled to the PDSCH numerology |
k2 | Uplink | PUSCH slot = (DCI slot) + k2. Never usefully 0 -- the UE has to decode the grant and prepare a transport block first | 0 to 32 | The PUSCH subcarrier spacing, similarly scaled |
Table 10. The two slot offsets, TS 38.214 cl. 5.1.2.1 and 6.1.2.1. k1 -- PDSCH to HARQ feedback -- is a third offset of the same family and belongs to the companion 05 HARQ document.
k0 differs. The bottom row is a different SLIV and a different offset, which is the ordinary case for uplink. Slot numbering is 30 kHz SCS in the DDDSU pattern used throughout, so slot 9 is the uplink slot and slots 5 through 9 span 2.5 ms.11.1 Why k2 cannot be small
k0 may be zero because the gNB knows in advance what it is going to transmit; it can prepare the PDSCH and the PDCCH in the same slot. k2 cannot, because between the DCI and the PUSCH the UE has to blind-decode the PDCCH, parse the DCI, look up the TDRA row, assemble a MAC PDU, encode it and get it to the transmitter. That interval has a hard floor called N2, the PUSCH preparation time, and its downlink counterpart N1 bounds k1 the same way.
| µ | SCS | N1 (symbols) | N2 (symbols) | N2 in slots | Practical floor on k2 |
|---|---|---|---|---|---|
| 0 | 15 kHz | 8 | 10 | 0.71 | 1 |
| 1 | 30 kHz | 10 | 12 | 0.86 | 1, and 2 in most deployments |
| 2 | 60 kHz | 17 | 23 | 1.64 | 2 or 3 |
| 3 | 120 kHz | 20 | 36 | 2.57 | 3 or 4 |
Table 11. UE processing capability 1, front-loaded DMRS only, from TS 38.214 Table 5.3-1 and Table 6.4-1. Capability 2 (processingType2Enabled) roughly halves these. The companion 05 HARQ document owns N1, N2 and the timing-capability negotiation; these values are reproduced here only because they bound k2.
N2 is counted in symbols, not slots, so it shrinks in absolute time as the numerology rises but grows in slots. At 15 kHz, N2 = 10 symbols is 0.71 of a slot and k2 = 1 works. At 120 kHz, N2 = 36 symbols is 2.57 slots and k2 = 1 is physically impossible no matter how the scheduler is configured. A TDRA list copied from a 30 kHz cell into a 120 kHz cell without adjusting k2 produces uplink grants the UE simply cannot honour -- and the UE's response is to not transmit, with no error indication TS 38.214 cl. 6.4.
There is a second floor on k2 that has nothing to do with processing time: the target slot has to actually contain uplink symbols. In a TDD cell the scheduler is choosing from a sparse set of candidate slots, and that is §13.
12. A Full Worked Chain: DCI to Absolute Symbols
Everything above assembles into a five-step lookup. This is the chain to run in your head, or on paper, whenever a log gives you a TDRA field value and you need to know what actually happened on the air:
Given: 30 kHz SCS (µ = 1, 20 slots per frame, 0.5 ms per slot), C-RNTI 0x4C11, a DCI 1_1 decoded in SFN 412, slot 7, TDRA field = 2, and an eight-row pdsch-TimeDomainAllocationList whose row 3 is {k0 0, typeA, SLIV 53}.
Step 1 -- field to row. Field value m = 2, so row index m + 1 = row 3.
Step 2 -- row contents. k0 = 0, mappingType = typeA, startSymbolAndLength = 53.
Step 3 -- decode the SLIV. q = 53 div 14 = 3, r = 53 mod 14 = 11. Trial L' = 4, S' = 11; 11 + 4 = 15 > 14, so branch 2:
L = 15 - 3 = 12, S = 13 - 11 = 2
Step 4 -- legality. typeA, normal CP: S must be in {0,1,2,3} (2 is), L must be 3..14 (12 is), S + L = 14 <= 14. Valid. And with dmrs-TypeA-Position = pos2 the DMRS at symbol 2 is the first symbol of the allocation. Valid.
Step 5 -- absolute placement. PDSCH slot = 7 + k0 = slot 7, symbols 2 through 13.
absolute slot number = 412 x 20 + 7 = 8247
slot 7 starts at 412 x 10 + 7 x 0.5 = 4123.5 ms after SFN 0
one symbol at 30 kHz ~ 0.5 / 14 = 35.7 µs
PDSCH occupies 4123.5 + 2 x 0.0357 = 4123.571 ms to 4124.000 ms
12.1 The same chain for an uplink grant
Given: same cell and numerology, DDDSU pattern so slot s carries uplink when s mod 5 = 4. A DCI 0_1 decoded in SFN 412, slot 1, TDRA field = 1, and a pusch-TimeDomainAllocationList whose row 2 is {k2 3, typeA, SLIV 27}.
Row = 1 + 1 = row 2 -> k2 = 3, typeA, SLIV 27.
Decode 27: q = 1, r = 13. Trial L' = 2, S' = 13; 15 > 14, branch 2:
L = 15 - 1 = 14, S = 13 - 13 = 0
Legality for PUSCH typeA: S must be 0 (it is), L must be 4..14 (14 is). Valid.
PUSCH slot = 1 + 3 = slot 4. 4 mod 5 = 4, so slot 4 is an uplink slot. Valid.
Is k2 = 3 above the N2 floor? At µ = 1, N2 = 12 symbols ~ 0.86 slots. Three slots is ample.
Result: SFN 412, slot 4, symbols 0 through 13 -- the entire uplink slot, 0.5 ms of PUSCH starting 4122.0 ms after SFN 0.
Note what k2 = 1 or 2 would have given: slot 2 (downlink) or slot 3 (the special slot, mostly downlink). Neither can carry a 14-symbol PUSCH. In a DDDSU pattern the scheduler's choice of k2 for a DCI in slot 1 is effectively forced to 3.
13. Interaction with the TDD Pattern
A SLIV is validated against the mapping-type table and against nothing else. It knows about symbols; it knows nothing about their direction. In a TDD cell the direction of every symbol is fixed semi-statically by tdd-UL-DL-ConfigurationCommon and optionally narrowed by tdd-UL-DL-ConfigurationDedicated, and a downlink allocation that reaches into an uplink symbol is not a slightly-wrong allocation -- it is an allocation the UE is not required to receive at all.
13.1 What the spec actually says, and what the UE actually does
| Situation | Spec position | What the UE does in practice | What you see |
|---|---|---|---|
| PDSCH overlaps a symbol indicated uplink by the semi-static pattern | The UE does not expect to be scheduled such a PDSCH TS 38.213 cl. 11.1. Behaviour is not specified | Discards the grant, or receives only the downlink part and fails the CRC. Either way it sends no HARQ feedback | PDCCH decoded, PDSCH scheduled, no ACK and no NACK -- pure DTX on the expected PUCCH occasion |
| PDSCH overlaps a symbol indicated flexible | Legal. Flexible symbols may be used for either direction | Receives normally, unless a dynamic SFI (DCI 2_0) has already declared those symbols uplink | Nothing unusual. This is the intended use of flexible symbols |
| PDSCH overlaps flexible symbols that a later DCI 2_0 declares uplink | The SFI takes precedence; the UE cancels the reception TS 38.213 cl. 11.1.1 | Drops the PDSCH | Same DTX signature, but correlated with an SFI in the same or a preceding slot |
| PUSCH overlaps a symbol indicated downlink | The UE does not expect to be scheduled such a PUSCH | Does not transmit | gNB sees no energy; UL HARQ retransmission or a scheduler timeout. Looks exactly like a coverage hole |
| PUSCH partially overlaps -- some symbols valid | Not a partial transmission. The whole PUSCH is dropped | Does not transmit at all | Same as above. There is no such thing as a truncated PUSCH here |
Table 12. TDD overlap cases. The important column is the last one: every downlink case produces DTX and every uplink case produces silence, and both are indistinguishable from a radio problem unless you check the pattern.
"The UE does not expect" is spec language for the network must not do this, and if it does, all bets are off. There is no error code, no counter, no indication in either direction. The gNB scheduled a PDSCH and got nothing back. Its outer-loop link adaptation reacts by lowering the MCS -- the companion 34 Link Adaptation document covers that loop -- so a TDD/SLIV collision degrades into a cell that appears to have poor coverage on some slots and fine coverage on others. The give-away is that the failures are perfectly periodic with the TDD pattern period.
13.2 How a working configuration breaks
The TDRA list and the TDD pattern are configured independently, in different IEs, often by different tools and sometimes by different teams. Nothing validates one against the other. A list that is entirely correct for DDDSU becomes partly unusable the moment the pattern is retuned to DDDDDDDSUU or the special slot's split is changed from 10:2:2 to 6:4:4.
This is a genuine field failure and it is worth stating concretely. A cell runs DDDSU at 30 kHz with a 10:2:2 special slot, and its pusch-TimeDomainAllocationList contains a row {k2 2, typeB, SLIV 26} -- S = 12, L = 2, the two uplink symbols at the end of the special slot. Capacity work then changes the special slot to 12 DL : 2 flexible : 0 UL, moving the uplink boundary. SLIV 26 now lands on two flexible symbols with no uplink symbols left in the slot at all. Every grant using that row produces a PUSCH the UE never sends. The TDRA list was not touched, RRC reports no error, and the symptom is a rise in uplink HARQ retransmissions confined to grants that happen to select that one row -- perhaps 1 in 8 of them, depending on scheduler policy. Diagnosing it means decoding the SLIV and overlaying it on the current pattern, by hand, which is the recipe in §23.
The companion 02 Radio Frame Structure document owns the TDD pattern itself -- dl-UL-TransmissionPeriodicity, nrofDownlinkSlots, nrofDownlinkSymbols, the special-slot split and the dynamic SFI. This section only covers where it collides with a SLIV.
14. Slot Aggregation and PUSCH Repetition Type A
One slot of symbols is sometimes not enough energy. The oldest answer in NR is slot aggregation: transmit the same transport block in K consecutive slots, using the same SLIV in each one, with a different redundancy version per repetition. This is Rel-15, it is configured rather than dynamically indicated, and it is called repetition type A on the uplink.
| Parameter | Where | Values | Effect |
|---|---|---|---|
pdsch-AggregationFactor | PDSCH-Config | n2, n4, n8 | The PDSCH transport block is repeated in that many consecutive slots, same SLIV each time |
pusch-AggregationFactor | PUSCH-Config | n2, n4, n8 | Same for PUSCH. This is repetition type A |
repetitionNumber (Rel-16) | Per row of PDSCH-TimeDomainResourceAllocation-r16 | n2, n3, n4, n7, n8, n16 | Per-row PDSCH repetition, so the scheduler can pick the repetition count dynamically instead of having one value for the whole BWP |
numberOfRepetitions (Rel-16) | Per row of PUSCH-Allocation-r16 | n1, n2, n3, n4, n7, n8, n12, n16 | Per-row PUSCH repetition count, used by both type A and type B |
Table 13. Repetition controls. The Rel-15 aggregation factors are per-BWP and apply to every grant; the Rel-16 per-row counts are selectable per grant through the TDRA index, which is a large practical improvement.
14.1 What type A does at a slot it cannot use
Type A repetition is rigid. Repetition i occupies slot n + i at symbols S through S + L − 1, and if slot n + i cannot carry that allocation -- because the TDD pattern makes those symbols the wrong direction, or because a higher-priority transmission occupies them -- the repetition is simply not transmitted. The repetition counter still advances. The UE does not defer it to the next usable slot.
pusch-AggregationFactor = n4 in a DDDSU cell at 30 kHz. Uplink slots are those with s mod 5 = 4, i.e. one slot in five. A grant for slot 4 with aggregation factor 4 nominally uses slots 4, 5, 6 and 7 -- of which 5, 6 and 7 are downlink slots.
repetition 1 slot 4 uplink -> transmitted
repetition 2 slot 5 downlink -> dropped
repetition 3 slot 6 downlink -> dropped
repetition 4 slot 7 downlink -> dropped
Effective repetition factor: 1. The configuration bought nothing at all, and consumed a scheduling decision claiming it had bought a 6 dB coverage improvement.
This is why slot aggregation is largely an FDD tool, and why Rel-16 introduced repetition type B (§15) and Rel-17 introduced available-slot counting, which skips unusable slots instead of burning repetitions on them.
An aggregation factor greater than 1 in a TDD cell should always be checked against the pattern period. The arithmetic is trivial -- how many of the next K slots are the right direction -- and the answer is very often "one". Vendors who ship pusch-AggregationFactor = n2 as a default do so because it is harmless in FDD; in a DDDSU cell it is harmless in a different sense, in that it does nothing whatsoever.
15. PUSCH Repetition Type B: Nominal versus Actual
Rel-16 added a second repetition scheme for PUSCH that is built on mapping type B and works in symbols rather than slots. Instead of repeating a slot position, it repeats an L-symbol block back to back, starting at S and continuing across slot boundaries. This is repetition type B, and understanding it requires one distinction that is the subtle part of the whole feature.
15.1 Nominal and actual
- A nominal repetition is what the scheduler asked for. Nominal repetition n, for n = 0 to
numberOfRepetitions− 1, occupies the L symbols starting at symbol S + n·L, counted continuously from the start of the first slot. Nominal repetitions are contiguous with each other and cheerfully cross slot boundaries. - An actual repetition is what is transmitted. Each nominal repetition is cut into actual repetitions at every slot boundary it crosses and around every symbol that is invalid -- a downlink or flexible symbol from the TDD pattern, a symbol carrying SSB or SIB1, or a symbol marked by the Rel-16
invalidSymbolPattern. - An actual repetition of a single symbol is omitted entirely when its nominal repetition was longer than one symbol TS 38.214 cl. 6.1.2.1. A one-symbol fragment carries its own DMRS and nothing else, so transmitting it would be pure overhead.
Given: S = 4, L = 6, numberOfRepetitions = 4, mapping type B, 14-symbol slots, starting in slot n.
Nominal repetitions, in symbols counted from the start of slot n:
nominal 1: 4 .. 9 (S + 0 x L = 4)
nominal 2: 10 .. 15 (S + 1 x L = 10)
nominal 3: 16 .. 21
nominal 4: 22 .. 27
Slot boundary at symbol 14. Nominal 2 spans it, so it splits:
actual 1: slot n, symbols 10 .. 13 (4 symbols)
actual 2: slot n+1, symbols 0 .. 1 (2 symbols)
Converting to per-slot symbol indices:
actual 1: slot n, symbols 4 .. 9 from nominal 1
actual 2: slot n, symbols 10 .. 13 from nominal 2
actual 3: slot n+1, symbols 0 .. 1 from nominal 2
actual 4: slot n+1, symbols 2 .. 7 from nominal 3
actual 5: slot n+1, symbols 8 .. 13 from nominal 4
Four nominal repetitions have become five actual transmissions, each with its own DMRS, and two of them are shorter than L.
Now mark slot n+1 symbol 6 invalid. Nominal 3 covered symbols 2 .. 7 of slot n+1, so it splits again:
actual 4a: slot n+1, symbols 2 .. 5 (4 symbols) -> transmitted
actual 4b: slot n+1, symbol 7 (1 symbol) -> omitted
Five actual transmissions, one dropped fragment, from four nominal repetitions. The transport block is unchanged throughout; only the redundancy versions and the DMRS overhead move.
| Repetition type A | Repetition type B | |
|---|---|---|
| Introduced | Rel-15 (as slot aggregation) | Rel-16 |
| Mapping type | typeA or typeB | typeB only |
| Repetition granularity | One repetition per slot, same symbols each slot | Back-to-back L-symbol blocks, ignoring slot boundaries |
| Crosses a slot boundary? | No -- each repetition is wholly within one slot | Yes, and the crossing is what creates actual repetitions |
| Unusable slot or symbol | Repetition dropped, counter still consumed | Nominal repetition segmented; only the affected fragment is lost |
| Count signalled by | pusch-AggregationFactor (per BWP) or numberOfRepetitions (per row) | numberOfRepetitions in the TDRA row |
| S and L signalled by | A SLIV in the TDRA row | Either a SLIV or the separate startSymbol-r16 and length-r16 fields, which exist precisely because type B's (S, L) space is not constrained the way the SLIV tables assume |
| Latency character | Coarse -- one repetition per slot minimum | Fine -- repetitions land as fast as symbols allow, which is the whole point for URLLC in TDD |
Table 14. The two repetition types. The last row is why type B exists: in a TDD cell with one uplink slot in five, type A can only repeat once every 2.5 ms, while type B can repeat four times inside a single uplink slot.
When a log prints a repetition count, establish whether it is nominal or actual before comparing it against the configuration. A configured numberOfRepetitions of 4 producing 5 or 6 PUSCH transmissions in the trace is correct behaviour, not a bug, and a configured 4 producing 3 is also possible when a fragment was omitted. Counters that mix the two -- some vendors count actual repetitions against a nominal threshold -- generate alarms that mean nothing.
16. Multi-PDSCH and Multi-PUSCH Scheduling
The last extension of the mechanism removes the assumption that one DCI schedules one transmission. A single row of a TDRA list can carry several SLIVs, and a single DCI can then schedule several PDSCHs or PUSCHs at once, each in its own slot with its own start and length.
16.1 Why it exists
Slot duration halves with every numerology step, and PDCCH does not get cheaper. At the subcarrier spacings Rel-17 opened up above 52.6 GHz, per-slot scheduling stops being physically sensible:
| SCS | µ | Slot duration | One symbol | Slots per ms | Scheduling consequence |
|---|---|---|---|---|---|
| 15 kHz | 0 | 1 ms | 71.4 µs | 1 | One PDCCH per millisecond. Comfortable |
| 30 kHz | 1 | 500 µs | 35.7 µs | 2 | The FR1 workhorse |
| 120 kHz | 3 | 125 µs | 8.9 µs | 8 | FR2. PDCCH monitoring already dominates UE power |
| 480 kHz | 5 | 31.25 µs | 2.2 µs | 32 | A DCI every 31 µs is not achievable for blind decoding or for scheduler compute |
| 960 kHz | 6 | 15.625 µs | 1.1 µs | 64 | Multi-slot scheduling is mandatory, not an optimisation |
Table 15. Slot and symbol durations by numerology. The bottom two rows are Rel-17 additions for the 52.6 to 71 GHz range; the companion 02 Radio Frame Structure document derives them.
| Feature | Release | IE | Limit | TDRA field |
|---|---|---|---|---|
| Multi-PUSCH scheduling | Rel-16 | PUSCH-TimeDomainResourceAllocation-r16 containing a puschAllocationList-r16 | Up to 8 PUSCHs per DCI 0_1; list up to 64 rows | Up to 6 bits |
| Multi-PDSCH scheduling | Rel-17 | PDSCH-TimeDomainResourceAllocationList-r17, whose rows carry multiple SLIVs | Up to 8 PDSCHs per DCI; list up to 64 rows | Up to 6 bits |
Table 16. Multi-transmission scheduling. Both were driven by high subcarrier spacings -- multi-PUSCH originally for 60 kHz unlicensed operation, where it also reduces the number of channel-access attempts, and multi-PDSCH for 480 and 960 kHz.
A multi-PDSCH row is not "one allocation repeated". Each scheduled PDSCH has its own SLIV and its own HARQ process, and the DCI's HARQ process number field identifies the first of a consecutive run. The consequences reach well outside this document: the HARQ codebook has to accommodate several PDSCHs acknowledged together, and a single DCI loss now costs up to eight transport blocks instead of one. The companion 05 HARQ document covers the codebook side.
When a log shows a single DCI followed by several PDSCHs in consecutive slots, distinguish multi-PDSCH from slot aggregation by looking at the HARQ process numbers and the transport block sizes. Slot aggregation repeats one transport block on one HARQ process with different redundancy versions; multi-PDSCH carries different transport blocks on consecutive HARQ processes, all with RV 0. They look identical in a symbol-level view and are completely different mechanisms.
17. Parameter and Range Reference
| Parameter | Where configured | Range / values | Common value | Effect if wrong |
|---|---|---|---|---|
startSymbolAndLength | PDSCH-TimeDomainResourceAllocation / PUSCH-TimeDomainResourceAllocation | INTEGER (0..127) | 53 for the type A PDSCH row; 27 for the full-slot PUSCH row | Values 105 to 127 are unreachable by the normal-CP encoder and their interpretation is undefined. Values that decode to an (S, L) outside the mapping-type table are accepted by RRC and fail silently on air |
mappingType | same | typeA, typeB | typeA for eMBB rows | Wrong mapping type changes the DMRS reference point, so the receiver looks for the reference signal in the wrong symbol. Total decode failure, not degradation |
k0 | PDSCH-TimeDomainResourceAllocation | INTEGER (0..32) | 0 | Too large wastes latency; too large for the HARQ round trip breaks k1 feasibility. Absent means 0 |
k2 | PUSCH-TimeDomainResourceAllocation | INTEGER (0..32) | 2 or 3 at 30 kHz | Below the N2 floor, the UE does not transmit. Landing on a non-uplink slot, the UE does not transmit |
pdsch-TimeDomainAllocationList | PDSCH-Config (dedicated) or pdsch-ConfigCommon (broadcast) | 1 to 16 rows (Rel-15); 1 to 64 in the Rel-17 extension | 4 to 8 rows | Shortening the list narrows the DCI field. A DCI generated against the old length indexes past the end (§18) |
pusch-TimeDomainAllocationList | PUSCH-Config or pusch-ConfigCommon | 1 to 16 rows (Rel-15); 1 to 64 in the Rel-16 extension | 2 to 8 rows | Same |
dmrs-TypeA-Position | MIB, and ServingCellConfigCommon | pos2, pos3 | pos2 | Determines which type A start symbols are usable, and which column of the default table applies. A mismatch between MIB and dedicated configuration makes every type A allocation undecodable |
pdsch-AggregationFactor | PDSCH-Config | n2, n4, n8 | absent | In TDD, repetitions land in downlink-unavailable slots and are dropped, so the configured gain is not realised (§14) |
pusch-AggregationFactor | PUSCH-Config | n2, n4, n8 | absent | Same, and worse: in DDDSU only one repetition in five is transmittable |
numberOfRepetitions | PUSCH-Allocation-r16, per TDRA row | n1, n2, n3, n4, n7, n8, n12, n16 | n1 or n4 | For type B, nominal count -- the actual count differs (§15) |
repetitionNumber | PDSCH-TimeDomainResourceAllocation-r16, per row | n2, n3, n4, n7, n8, n16 | absent | Per-row PDSCH repetition; ignore the BWP-wide aggregation factor when this is present |
invalidSymbolPattern | PUSCH-Config (Rel-16) | A symbol bitmap plus a periodicity | absent | Symbols it marks are excluded from type B actual repetitions. Configuring it without understanding §15 changes the effective repetition count |
tdd-UL-DL-ConfigurationCommon | ServingCellConfigCommon | Pattern periodicity plus DL/UL slot and symbol counts | DDDSU at 30 kHz | Not a SLIV parameter, but it is the other half of every TDD failure in §13. Owned by the companion 02 Radio Frame Structure document |
Table 17. Time-domain allocation parameters. Typical values are what many vendors ship and are not spec requirements.
18. Failure Modes and What Each One Means
The characteristic property of this whole area is that almost nothing reports an error. A SLIV is an integer; RRC validates the integer's range and nothing else. Every failure below manifests as a missing transmission, and the diagnostic work is entirely in distinguishing them from each other and from a genuine radio problem.
| Failure | Detected by | What the UE does | Log signature and what it points at |
|---|---|---|---|
| SLIV hand-decoded with the wrong branch | Nobody -- it is a human error, not a protocol one | Nothing; the UE decoded correctly. Only your analysis is wrong | Your decoded (S, L) has S + L > 14. Apply the sum check (§5.2). Symptom: your model of the log disagrees with the PHY trace by a consistent amount on long allocations only |
| TDRA index points past the end of a shortened list | UE MAC/PHY, on DCI interpretation | Discards the DCI as an invalid grant; no HARQ feedback, no PUSCH | PDCCH decode logged, no PDSCH or PUSCH follows. Correlate against the most recent RRCReconfiguration -- a list shortened from 8 rows to 4 narrows the field from 3 bits to 2 and changes the DCI size, so the UE may not even find the DCI. See §18.1 |
| SLIV overlaps the TDD uplink portion (downlink grant) | UE, by comparing against tdd-UL-DL-Configuration* | Does not receive the PDSCH. Sends neither ACK nor NACK | DTX on the PUCCH occasion, perfectly periodic with the TDD pattern. Outer-loop link adaptation drives the MCS down. Looks like coverage (§13) |
| SLIV overlaps a downlink symbol (uplink grant) | UE, same comparison | Does not transmit the PUSCH at all -- not even the valid symbols | gNB sees nothing. UL HARQ retransmission or scheduler timeout. Indistinguishable from a power problem without the pattern |
| Type A allocation whose S excludes the DMRS symbol | In principle the configuration tool; in practice nobody | Attempts reception with no channel estimate; CRC fails every time | 100% BLER on every grant using that row, at any SINR, with correct PDCCH decoding. A row-correlated 100% failure rate is the fingerprint (§9.1) |
| Type B allocation with an L the UE does not support | UE capability check, or nothing | Undefined. Commonly the grant is dropped | Row-correlated failures again. Check UE-NR-Capability for the relevant feature before blaming the air interface -- the companion 26 UE Capability document covers the exchange |
k2 smaller than the UE's N2 | UE, at grant processing time TS 38.214 cl. 6.4 | Ignores the uplink grant | Grants issued, nothing transmitted, and the failure is 100% for the affected rows. Check the SCS against the N2 table in §11.1. Very common when a configuration is ported between numerologies |
| SLIV that would cross a slot boundary | The encoder -- it cannot be expressed | n/a. S + L > 14 has no SLIV, so this grant cannot be sent | If your decode produces one, you took the wrong branch. If a configuration tool reports one, it has a bug. There is no on-air manifestation because the encoding makes it unrepresentable |
| Aggregation factor colliding with the TDD pattern | Nobody | Transmits the repetitions that land on usable slots and drops the rest | Effective repetition count below the configured one, with no counter recording the difference. Coverage gain absent despite configuration (§14.1) |
| Type B nominal count compared against actual transmissions | Nobody -- an analysis error | Nothing wrong; the UE segmented correctly | Repetition counters that do not match the configuration by a small amount in either direction. Establish nominal versus actual before raising anything (§15) |
dmrs-TypeA-Position mismatch between MIB and dedicated config | UE, only as a decode failure | Looks for DMRS in the wrong symbol; every type A grant fails | Type A grants fail, type B grants succeed. That split is almost diagnostic on its own |
Table 18. Time-domain allocation failure modes. Note that four of the eleven are analysis errors rather than network faults -- this is an area where the tooling is more often wrong than the network.
18.1 The list-length trap, in detail
This one deserves expansion because it fails in a way that looks nothing like a time-domain problem. The TDRA field width in DCI 1_1 is ceil(log2 I) where I is the number of configured rows. Change I and the field width changes; change the field width and the total DCI size changes; change the total DCI size and the UE is blind-decoding for a payload length that no longer matches what the gNB is transmitting.
A cell reduces pdsch-TimeDomainAllocationList from 8 rows to 5 rows in an RRCReconfiguration.
before: I = 8 -> TDRA field = ceil(log2 8) = 3 bits
after: I = 5 -> TDRA field = ceil(log2 5) = 3 bits
No size change, so no blind-decode problem -- but rows 6, 7 and 8 no longer exist, and field values 5, 6 and 7 now index past the end. A scheduler still emitting TDRA = 6 produces a grant the UE discards.
Now reduce from 5 rows to 4:
after: I = 4 -> TDRA field = ceil(log2 4) = 2 bits
The DCI 1_1 payload is now one bit shorter. Until both ends apply the reconfiguration at the same slot, the UE is testing candidates at the wrong size and finds nothing at all -- not a bad grant, no grant. The companion 31 PDCCH Blind Decoding document covers why a DCI-size mismatch produces total silence rather than a detectable error.
19. Configuration Reference (ASN.1)
The Rel-15 structures are small, which is part of the point -- the whole time-domain flexibility of NR is three fields repeated up to sixteen times. Abridged from TS 38.331; ... marks omitted extension markers and unrelated fields:
-- ---------- downlink ----------
PDSCH-TimeDomainResourceAllocationList ::= SEQUENCE
(SIZE(1..maxNrofDL-Allocations)) OF PDSCH-TimeDomainResourceAllocation
PDSCH-TimeDomainResourceAllocation ::= SEQUENCE {
k0 INTEGER (0..32) OPTIONAL,
-- Need S; absent means 0
mappingType ENUMERATED { typeA, typeB },
startSymbolAndLength INTEGER (0..127)
}
maxNrofDL-Allocations INTEGER ::= 16
-- ---------- uplink ----------
PUSCH-TimeDomainResourceAllocationList ::= SEQUENCE
(SIZE(1..maxNrofUL-Allocations)) OF PUSCH-TimeDomainResourceAllocation
PUSCH-TimeDomainResourceAllocation ::= SEQUENCE {
k2 INTEGER (0..32) OPTIONAL,
-- Need S
mappingType ENUMERATED { typeA, typeB },
startSymbolAndLength INTEGER (0..127)
}
maxNrofUL-Allocations INTEGER ::= 16Listing 1. The Rel-15 core. Note that startSymbolAndLength is typed only as INTEGER (0..127): ASN.1 cannot express "a legal SLIV for this mapping type", which is why every constraint in §10 has to be checked by the configuration tool and is checked by nothing in the protocol.
Where the lists hang, and the repetition controls beside them:
PDSCH-Config ::= SEQUENCE {
dataScramblingIdentityPDSCH INTEGER (0..1023) OPTIONAL,
dmrs-DownlinkForPDSCH-MappingTypeA SetupRelease { DMRS-DownlinkConfig }
OPTIONAL,
dmrs-DownlinkForPDSCH-MappingTypeB SetupRelease { DMRS-DownlinkConfig }
OPTIONAL,
...
pdsch-TimeDomainAllocationList SetupRelease {
PDSCH-TimeDomainResourceAllocationList }
OPTIONAL,
pdsch-AggregationFactor ENUMERATED { n2, n4, n8 } OPTIONAL,
...
}
PDSCH-ConfigCommon ::= SEQUENCE {
pdsch-TimeDomainAllocationList PDSCH-TimeDomainResourceAllocationList
OPTIONAL,
...
}
PUSCH-Config ::= SEQUENCE {
...
pusch-TimeDomainAllocationList SetupRelease {
PUSCH-TimeDomainResourceAllocationList }
OPTIONAL,
pusch-AggregationFactor ENUMERATED { n2, n4, n8 } OPTIONAL,
...
}Listing 2. The enclosing IEs. There are two independent DMRS configurations, one per mapping type -- which is the configuration-level statement of §9. The companion 33 DMRS document owns DMRS-DownlinkConfig.
The Rel-16 uplink extension, which is where per-row repetition and the separate start/length fields appear:
PUSCH-TimeDomainResourceAllocation-r16 ::= SEQUENCE {
k2-r16 INTEGER (0..32) OPTIONAL,
puschAllocationList-r16 SEQUENCE (SIZE(1..maxNrofMultiplePUSCHs-r16))
OF PUSCH-Allocation-r16,
...
}
PUSCH-Allocation-r16 ::= SEQUENCE {
mappingType-r16 ENUMERATED { typeA, typeB } OPTIONAL,
startSymbolAndLength-r16 INTEGER (0..127) OPTIONAL,
startSymbol-r16 INTEGER (0..13) OPTIONAL,
length-r16 INTEGER (1..14) OPTIONAL,
numberOfRepetitions-r16 ENUMERATED { n1, n2, n3, n4, n7, n8,
n12, n16 } OPTIONAL,
...
}
maxNrofMultiplePUSCHs-r16 INTEGER ::= 8
-- and on the downlink side, per-row PDSCH repetition:
PDSCH-TimeDomainResourceAllocation-r16 ::= SEQUENCE {
k0-r16 INTEGER (0..32) OPTIONAL,
mappingType-r16 ENUMERATED { typeA, typeB },
startSymbolAndLength-r16 INTEGER (0..127),
repetitionNumber-r16 ENUMERATED { n2, n3, n4, n7, n8, n16 }
OPTIONAL,
...
}Listing 3. Rel-16 extensions, abridged. startSymbol-r16 and length-r16 coexist with startSymbolAndLength-r16 because repetition type B needs (S, L) pairs the SLIV validity tables do not admit -- the two encodings are alternatives, and exactly one is present per allocation.
The existence of startSymbol-r16 and length-r16 as separate integers is the clearest evidence that the SLIV is an encoding convenience, not a semantic construct. When the constraint set changed, 3GPP did not extend the SLIV -- it added a plain pair of fields. If you are writing a decoder, handle both: a Rel-16 type B repetition row may carry either, and a tool that only looks for startSymbolAndLength will silently see a row with no time-domain information at all.
20. Four More Worked Calculations
20.1 Every legal Rel-15 type B PDSCH SLIV
Because the type B PDSCH length set is {2, 4, 7}, the set of legal SLIVs is small enough to enumerate. Having it written down turns a validation question into a lookup:
L = 2: branch 1, SLIV = 14 x 1 + S, S = 0 .. 12
-> SLIV 14 .. 26 (13 values)
L = 4: branch 1, SLIV = 14 x 3 + S, S = 0 .. 10
-> SLIV 42 .. 52 (11 values)
L = 7: branch 1, SLIV = 14 x 6 + S, S = 0 .. 7
-> SLIV 84 .. 91 (8 values)
Total: 32 legal type B PDSCH SLIVs out of 105. Every one is in branch 1, because L <= 7 always.
Consequence: a PDSCH-TimeDomainResourceAllocation with mappingType typeB and a SLIV outside 14-26, 42-52 or 84-91 is malformed. SLIV 53, the everyday type A value, is not a legal type B value -- so a row that has the right SLIV and the wrong mapping type is detectable by inspection.
20.2 What the TDRA field width costs and wastes
Field width = ceil(log2 I), I = number of configured rows.
I = 1 -> 0 bits. Row implicit; no TDRA field in the DCI at all
I = 2 -> 1 bit
I = 3 -> 2 bits. Field value 3 indexes past the end of the list
I = 5 -> 3 bits. Field values 5, 6, 7 all index past the end
I = 8 -> 3 bits. Perfectly packed
I = 16 -> 4 bits. Perfectly packed, and the Rel-15 maximum
Explicit signalling of the same information would cost 6 bits for k0, 1 bit for mappingType and 7 bits for the SLIV = 14 bits per grant. At 16 rows the index costs 4. On a cell scheduling 2000 grants per second per UE-group, the indirection saves 10 bits x 2000 = 20 kbit/s of PDCCH payload per scheduling stream -- which is why the mechanism is an index and not a value (§7).
Configure a power of two. Any other list length leaves code points that a buggy scheduler can emit and the UE must discard.
20.3 What a mini-slot actually saves
Given: 120 kHz SCS (µ = 3). Slot = 125 µs, symbol = 8.93 µs. A grant is decoded such that the UE could in principle receive from symbol 6 onward.
Slot-based, mapping type A. S is capped at 3, so the earliest expressible start in the next slot is symbol 0 of that slot. Wait from symbol 6 to the slot boundary: 8 symbols x 8.93 = 71.4 µs of dead time, then L = 14 gives 125 µs of transmission.
time from ready to last symbol = 71.4 + 125 = 196.4 µs
Mini-slot, mapping type B, S = 6, L = 4. SLIV = 14 x 3 + 6 = 48.
no wait; 4 symbols x 8.93 = 35.7 µs of transmission
time from ready to last symbol = 35.7 µs
Saving: 160.7 µs, or 82%. At 30 kHz the same arithmetic gives 285.7 + 500 = 785.7 µs against 142.9 µs -- a saving of 643 µs, which on a 1 ms end-to-end budget is the difference between meeting it and not.
The price: the 4-symbol type B PDSCH carries one DMRS symbol in four, so 25% of its resource elements are reference signal against roughly 7% for the 14-symbol type A case.
20.4 Validating a TDRA list against a TDD pattern
This is the check that §13 says nobody performs. It takes about a minute per list and it is the single highest-yield sanity check in this document:
Given: DDDSU at 30 kHz. Slot s mod 5: 0, 1, 2 downlink; 3 special (10 DL : 2 flexible : 2 UL); 4 uplink. A pusch-TimeDomainAllocationList of four rows, and a DCI in a slot with s mod 5 = 1:
row 1: k2 3, typeA, SLIV 27 -> S=0 L=14, target slot mod 5 = 4
row 2: k2 2, typeB, SLIV 26 -> S=12 L=2, target slot mod 5 = 3
row 3: k2 3, typeB, SLIV 20 -> S=6 L=2, target slot mod 5 = 4
row 4: k2 2, typeA, SLIV 55 -> S=0 L=12, target slot mod 5 = 3
Row by row:
row 1: slot mod 5 = 4 is fully uplink. Symbols 0-13 available. Valid
row 2: slot mod 5 = 3, uplink symbols are 12 and 13. Allocation is 12-13. Valid, exactly
row 3: slot mod 5 = 4, symbols 6-7 uplink. Valid
row 4: slot mod 5 = 3, allocation is symbols 0-11, of which 0-9 are downlink and 10-11 flexible. Invalid -- the UE will not transmit
Three of four rows usable, and the fourth fails 100% of the time. If the scheduler picks rows round-robin, a quarter of uplink grants vanish and the cell looks like it has an uplink coverage problem at 25% of the expected rate.
21. Illustrative Message Traces
Illustrative trace. Field names and encodings follow 3GPP; the values are constructed for this document and are not a capture from any deployed or lab network.
All five traces belong to one scenario: a 100 MHz TDD cell at 30 kHz SCS, DDDSU with a 2.5 ms period and a 10:2:2 special slot, and one UE with C-RNTI 0x4C11. Slot s carries uplink when s mod 5 = 4 and is the special slot when s mod 5 = 3. The first four traces are within a few milliseconds of each other in frame SFN 412; the last is twenty-six seconds later, after a configuration change.
21.1 The configured list, as decoded from RRCReconfiguration
RRCReconfiguration
secondaryCellGroup / spCellConfig / spCellConfigDedicated
downlinkBWP-ToAddModList[0] / bwp-Dedicated / pdsch-Config
pdsch-TimeDomainAllocationList setup, 8 entries
[0] k0 0 mappingType typeA startSymbolAndLength 27 -- S=0 L=14
[1] k0 0 mappingType typeA startSymbolAndLength 55 -- S=0 L=12
[2] k0 0 mappingType typeA startSymbolAndLength 53 -- S=2 L=12
[3] k0 0 mappingType typeB startSymbolAndLength 20 -- S=6 L=2
[4] k0 0 mappingType typeB startSymbolAndLength 50 -- S=8 L=4
[5] k0 0 mappingType typeB startSymbolAndLength 89 -- S=5 L=7
[6] k0 1 mappingType typeA startSymbolAndLength 53 -- next slot
[7] k0 2 mappingType typeA startSymbolAndLength 53 -- slot after
pdsch-AggregationFactor .......... absent
dmrs-DownlinkForPDSCH-MappingTypeA setup (dmrs-AdditionalPosition pos1)
dmrs-DownlinkForPDSCH-MappingTypeB setup (dmrs-AdditionalPosition pos0)
uplinkBWP-ToAddModList[0] / bwp-Dedicated / pusch-Config
pusch-TimeDomainAllocationList setup, 4 entries
[0] k2 3 mappingType typeA startSymbolAndLength 27 -- S=0 L=14
[1] k2 2 mappingType typeB startSymbolAndLength 26 -- S=12 L=2
[2] k2 3 mappingType typeB startSymbolAndLength 20 -- S=6 L=2
[3] k2 4 mappingType typeA startSymbolAndLength 27 -- S=0 L=14
pusch-AggregationFactor .......... absent
-- 8 DL rows -> DCI 1_1 TDRA field = ceil(log2 8) = 3 bits
-- 4 UL rows -> DCI 0_1 TDRA field = ceil(log2 4) = 2 bits
-- both list lengths are powers of two, so no field value is wastedListing 4. Both TDRA lists for one UE, with the SLIVs decoded inline. Rows [2], [6] and [7] are the same SLIV at three different k0 values -- this is the normal way a scheduler buys itself slack for HARQ timing without changing the symbol allocation.
21.2 A downlink grant, decoded end to end
10:22:41.1070 [PHY-DL] PDCCH candidate hit, SFN 412 slot 7
CORESET 1 AL 4 candidate 0 DCI size 41 bits
CRC descrambled with C-RNTI 0x4C11 -> DCI format 1_1
raw payload 0xAA 0x34 0x5C 0x81 0x40 0x00 (41 bits + pad)
10:22:41.1070 [MAC-DL] DCI 1_1 fields
Identifier for DCI formats ...... 1 -- downlink
Frequency domain resource assg .. 0x2A3 -- 11 bits
Time domain resource assignment . 2 -- 3 bits
-> row index 2 + 1 = 3
-> list entry [2]: k0 0, typeA, SLIV 53
-> SLIV 53: q=3 r=11, trial (S'=11,L'=4) sum 15 > 14
-> branch 2: L = 15-3 = 12, S = 13-11 = 2
VRB-to-PRB mapping .............. 0 -- non-interleaved
Modulation and coding scheme .... 11
New data indicator .............. 1
Redundancy version .............. 0
HARQ process number ............. 4
PDSCH-to-HARQ_feedback timing ... 2 -- k1 = 2
10:22:41.1070 [PHY-DL] PDSCH scheduled
slot ....... 412/7 (DCI slot 7 + k0 0)
symbols .... 2 .. 13 (S=2, L=12)
mapping .... typeA, DMRS at symbol 2 = first symbol of alloc
check ...... slot 7 mod 5 = 2 -> full downlink slot. OK
check ...... typeA, S=2 in {0,1,2,3}, L=12 in 3..14. OK
10:22:41.1074 [PHY-DL] PDSCH CRC pass, TB 35208 bits, HARQ 4Listing 5. A full downlink decode of the SLIV worked by hand in §4, §5 and §12. Note that the log prints the field value (2), the row index (3) and the list entry ([2], zero-based) -- three different numbers for the same thing, which is exactly how this gets misread.
21.3 A mini-slot grant in the same cell
10:22:41.1100 [PHY-DL] PDCCH hit, SFN 412 slot 13, CORESET 1, AL 8
DCI 1_1, C-RNTI 0x4C11
10:22:41.1100 [MAC-DL] Time domain resource assignment ... 3
-> row 4 -> list entry [3]: k0 0, typeB, SLIV 20
-> SLIV 20: q=1 r=6, trial (S'=6,L'=2) sum 8 <= 14
-> branch 1: S = 6, L = 2
MCS ............................. 9
HARQ process number ............. 1
PDSCH-to-HARQ_feedback timing ... 0 -- k1 = 0
10:22:41.1100 [PHY-DL] PDSCH slot 412/13 symbols 6 .. 7
mapping .... typeB, DMRS at symbol 6 (first symbol of alloc)
overhead ... 1 of 2 symbols is DMRS
TB size .... 1544 bits (vs 35208 for the L=12 grant above)
10:22:41.1101 [PHY-DL] PDSCH CRC pass after 71 us
10:22:41.1103 [PHY-UL] PUCCH ACK, slot 412/13 symbols 12..13, k1 = 0
-- slot 13 is the special slot (13 mod 5 = 3): symbols 0..9 downlink,
-- 10..11 flexible, 12..13 uplink. The 2-symbol PDSCH fits the downlink
-- part and the PUCCH fits the uplink part, so k1 = 0 works. With SLIV
-- 27 (L=14) there would be no room for either and k1 >= 1 is forced.Listing 6. The same UE, same cell, three slots later: a two-symbol type B allocation inside the special slot, with same-slot HARQ feedback. The transport block is 23 times smaller and the round trip is a slot shorter. Both grants are legal, and the scheduler chose between them purely by TDRA index.
21.4 PUSCH repetition type B segmenting
10:22:41.1115 [MAC-UL] DCI 0_1, C-RNTI 0x4C11, SFN 412 slot 16
Time domain resource assignment ... 1
-> row 2 -> PUSCH-TimeDomainResourceAllocation-r16
k2 3, puschAllocationList[0]:
mappingType ......... typeB
startSymbol ......... 4
length .............. 6
numberOfRepetitions . n4
-- startSymbol/length signalled directly, not as a SLIV
10:22:41.1115 [MAC-UL] repetition type B expansion
first slot = 16 + k2 3 = slot 19 (19 mod 5 = 4, uplink)
nominal 1 symbols 4 .. 9 -> slot 19 sym 4.. 9
nominal 2 symbols 10 .. 15 -> CROSSES slot boundary
nominal 3 symbols 16 .. 21
nominal 4 symbols 22 .. 27
invalidSymbolPattern ......... absent
10:22:41.1116 [MAC-UL] actual repetitions
actual 1 slot 19 sym 4 .. 9 6 sym RV 0 from nominal 1
actual 2 slot 19 sym 10 .. 13 4 sym RV 2 from nominal 2
actual 3 slot 20 sym 0 .. 1 2 sym RV 2 from nominal 2
actual 4 slot 20 sym 2 .. 7 6 sym RV 3 from nominal 3
actual 5 slot 20 sym 8 .. 13 6 sym RV 1 from nominal 4
-- 4 nominal -> 5 actual. This is correct, not an error.
10:22:41.1130 [PHY-UL] WARNING slot 20 mod 5 = 0 -> downlink slot
actual 3, 4, 5 fall in a downlink slot -> NOT transmitted
transmitted: actual 1, actual 2 only (10 of 24 symbols)Listing 7. Type B segmentation working correctly and then colliding with the TDD pattern. Nominal 2 splits at the slot boundary exactly as §15 predicts -- and then three of the five actual repetitions land in slot 20, which is a downlink slot. The configuration is internally consistent and still delivers 42% of the intended energy.
21.5 A SLIV colliding with the special slot
10:23:07.5008 [MAC-UL] DCI 0_1, C-RNTI 0x4C11, SFN 552 slot 6
Time domain resource assignment ... 1
-> row 2 -> list entry [1]: k2 2, typeB, SLIV 26
-> SLIV 26: q=1 r=12, trial (S'=12,L'=2) sum 14 <= 14
-> branch 1: S = 12, L = 2
PUSCH slot = 6 + 2 = slot 8 (8 mod 5 = 3 -> special slot)
10:23:07.5009 [MAC-UL] TDD check against tdd-UL-DL-ConfigurationCommon
pattern .......... DDDSU, periodicity ms2p5
special slot ..... nrofDownlinkSymbols 12
nrofUplinkSymbols 0
slot 8 symbols ... 0..11 downlink, 12..13 flexible
allocation ....... symbols 12..13
-> flexible symbols, no dynamic SFI received this period
-> UE does not transmit PUSCH (TS 38.213 cl. 11.1)
-> no error indication sent; grant silently discarded
10:23:07.5023 [MAC-UL] gNB: no PUSCH energy on slot 552/8 sym 12..13
10:23:07.5023 [MAC-UL] gNB: UL HARQ process 2 -> NACK, schedule retx
10:23:07.5108 [MAC-UL] gNB: retx also TDRA 1 -> same collision
10:23:07.5208 [MAC-UL] gNB: retx also TDRA 1 -> same collision
-- The list was correct for nrofUplinkSymbols 2. A capacity change to
-- nrofDownlinkSymbols 12 / nrofUplinkSymbols 0 removed the two uplink
-- symbols this row depends on -- the same two symbols that carried the
-- PUCCH in 21.3, twenty-six seconds earlier. Row [1] now fails 100% of
-- the time and nothing in RRC, MAC or PHY reports the inconsistency.Listing 8. The §13.2 failure, as it appears. Note the retransmissions reusing the same TDRA row, so the failure repeats forever -- a scheduler that varies the row on retransmission would mask this into an intermittent, which is considerably harder to find.
22. Release Deltas: Rel-15 to Rel-18
| Release | Change | Why it matters when reading time-domain allocation |
|---|---|---|
| Rel-15 | SLIV encoding; mapping types A and B; k0 and k2; TDRA lists of up to 16 rows; the three default PDSCH tables and one default PUSCH table; pdsch- and pusch-AggregationFactor | The baseline. §2 through §14 are entirely Rel-15 |
| Rel-16 | PUSCH repetition type B, with nominal and actual repetitions, numberOfRepetitions per TDRA row, and invalidSymbolPattern | A repetition count in a log no longer equals the number of transmissions (§15). This is the single largest interpretive change in the whole area |
| Rel-16 | Per-row PDSCH repetition via repetitionNumber-r16 | PDSCH repetition becomes dynamically selectable, so two consecutive grants to the same UE can have different repetition factors |
| Rel-16 | Multi-PUSCH scheduling -- puschAllocationList-r16, up to 8 PUSCHs per DCI 0_1; extended list up to 64 rows | One DCI, several PUSCHs, each with its own SLIV. TDRA field grows to 6 bits (§16) |
| Rel-16 | DCI formats 0_2 and 1_2 with their own TDRA lists (pusch-TimeDomainAllocationListForDCI-Format0-2 and the PDSCH equivalent) | A cell can have two different TDRA lists in use simultaneously for the same UE. Always check which DCI format the grant came from |
| Rel-16 | Separate startSymbol-r16 / length-r16 fields alongside startSymbolAndLength-r16 | A TDRA row may carry no SLIV at all (§19). A decoder that only looks for startSymbolAndLength will read the row as empty |
| Rel-17 | Multi-PDSCH scheduling -- one DCI, up to 8 PDSCHs, one SLIV each; list up to 64 rows | Driven by 480 and 960 kHz SCS where per-slot scheduling is not achievable. Distinguish from aggregation by HARQ process numbers (§16) |
| Rel-17 | Available-slot counting for PUSCH and PDSCH repetition, and TB processing over multiple slots (TBoMS) | Repetitions can now skip unusable slots instead of being dropped in them, so the effective repetition factor in a TDD cell finally matches the configured one (§14.1) |
| Rel-17 | Extended k0 and k2 handling for the 52.6-71 GHz range, and 480 / 960 kHz numerologies | Slot durations of 31 and 16 µs make k2 values that look large in slots very small in time (§16.1) |
| Rel-18 | Further multi-cell and multi-carrier scheduling from a single DCI; refinements to repetition and to dynamic waveform switching | The TDRA row is no longer necessarily about one cell. Confirm the scheduling cell before applying k0 or k2 |
| Rel-18 | Subband non-overlapping full duplex work, which changes what "uplink symbol" means in a TDD pattern | The §13 collision analysis has to account for symbols that are downlink in one subband and uplink in another |
Table 19. Time-domain allocation changes by release. Every one of these is gated on UE capability -- the companion 26 UE Capability document covers confirming that a feature is actually available before reading a log as though it were.
23. Reading Time-Domain Allocation in Logs: A Checklist
- Find the TDRA lists first, before looking at any grant. Search the log for
pdsch-TimeDomainAllocationListandpusch-TimeDomainAllocationListin the most recentRRCReconfiguration, and for the common versions in SIB1. Without them, every TDRA field value in the log is meaningless (§7). If neither is present, the UE is on a default table and you need to know the multiplexing pattern to pick which one (§8). - Decode every SLIV in the list once, and write the (S, L) pairs beside the rows. The recipe: q = SLIV div 14, r = SLIV mod 14; if r + q + 1 <= 14 then S = r and L = q + 1; otherwise L = 15 − q and S = 13 − r. Then check S + L <= 14 on the answer. Every subsequent step reads from this annotated list.
- Establish which number the log is printing. Field value, row index (field + 1), or zero-based list position? Three conventions are in common use and vendors mix them within one log. Cross-check by decoding one grant whose symbols the PHY layer also prints.
- Check the mapping type against S and L using the table in §10. A type A PDSCH with S > 3, a type B PDSCH with L outside {2, 4, 7}, or a type A PUSCH with S != 0 is a malformed row and will fail every time it is used -- which shows up as a row-correlated 100% error rate, not as degradation.
- Overlay each row on the TDD pattern. For each row compute the target slot from
k0ork2, take that slot's position in the pattern period, and check whether symbols S through S + L − 1 are the right direction. This is the check nobody performs and it finds real faults (§20.4). Do it again after any pattern or special-slot change. - Check
k2against N2 for the numerology. At 30 kHz,k2= 1 is marginal andk2= 0 is impossible; at 120 kHz you need 3 or more (§11.1). Configurations ported between cells of different SCS are the usual cause. - When a PDSCH produces neither ACK nor NACK, suspect the time domain before suspecting the radio. DTX with a successfully decoded PDCCH is the fingerprint of a TDD collision, an SFI override, or a mapping-type or DMRS-position problem. Correlate the failures against the pattern period -- if they are periodic, it is configuration, not coverage.
- For repetition, establish nominal versus actual before comparing counts. Type A: repetitions equal slots, and unusable slots are dropped while still consuming the count. Type B: nominal count is configured, actual count is derived, and they are routinely different (§15). A mismatch is not evidence of a fault.
- Distinguish multi-PDSCH from aggregation by HARQ process numbers and transport block sizes. Several PDSCHs on consecutive HARQ processes with RV 0 is multi-PDSCH; one HARQ process with cycling RVs is aggregation (§16).
- Re-encode your decode. Take the (S, L) you derived, run it back through the encoder, and confirm you get the SLIV you started with -- and that S + L <= 14. Two lines of arithmetic, and it eliminates the commonest analysis error in this document (§5.2).
24. Glossary
| Term | Expansion | Meaning in this document |
|---|---|---|
| SLIV | Start and Length Indicator Value | The 7-bit triangular packing of (S, L) carried in startSymbolAndLength. Range 0 to 104 for normal CP; the field is typed 0 to 127 |
| S | Starting symbol | Index of the first allocated OFDM symbol, counted from the first symbol of the slot, 0-based |
| L | Length | Number of consecutive allocated symbols, counting S itself |
| TDRA | Time Domain Resource Allocation | Both the configured table of {k0 or k2, mappingType, SLIV} rows and the DCI field that indexes it |
k0 | -- | Slot offset from the DCI's slot to the PDSCH's slot, 0 to 32 |
k2 | -- | Slot offset from the DCI's slot to the PUSCH's slot, 0 to 32 |
k1 | -- | Slot offset from the PDSCH to its HARQ feedback. Not part of the TDRA row; owned by the companion 05 HARQ document |
| Mapping type A | Slot-based mapping | DMRS position referenced to the slot boundary, at symbol 2 or 3. Restricts S to {0, 1, 2, 3} |
| Mapping type B | Non-slot-based mapping | DMRS position referenced to the first symbol of the allocation. Permits S anywhere in the slot; this is what makes mini-slots possible |
| Mini-slot | -- | Informal name for a short mapping type B allocation. Not a term in the specifications, but universal in practice |
| Nominal repetition | -- | In PUSCH repetition type B, one of the numberOfRepetitions L-symbol blocks laid end to end from S, ignoring slot boundaries |
| Actual repetition | -- | The transmitted fragment of a nominal repetition after cutting at slot boundaries and around invalid symbols. Single-symbol fragments of a multi-symbol nominal repetition are dropped |
| Invalid symbol | -- | A symbol that a type B actual repetition may not use: wrong direction per the TDD pattern, carrying SSB or SIB1, or marked by invalidSymbolPattern |
| N1 / N2 | PDSCH processing time / PUSCH preparation time | UE capability floors, in symbols, that bound how small k1 and k2 can be. Owned by the companion 05 HARQ document |
| Default table | -- | One of the four (S, L, k0/k2) tables hard-coded in TS 38.214, used before any TDRA list is configured -- notably during initial access |
| The fold | -- | Informal name used in this document for the L = 8 / L = 9 boundary where the SLIV encoding switches branches |
25. References
- 3GPP TS 38.214 -- Physical layer procedures for data. Clause 5.1.2.1 (PDSCH resource allocation in time domain: the SLIV formula, Table 5.1.2.1-1 for valid S and L), clause 5.1.2.1.1 (applicable PDSCH time domain resource allocation, Table 5.1.2.1.1-1, and the default tables 5.1.2.1.1-2 to 5.1.2.1.1-5), clause 5.1.2.1.2 (PDSCH slot aggregation), clause 5.3 (UE PDSCH processing procedure time, N1), clause 6.1.2.1 (PUSCH resource allocation in time domain, Table 6.1.2.1-1, repetition type A and type B), clause 6.1.2.1.1 (applicable PUSCH time domain resource allocation and default table 6.1.2.1.1-2), clause 6.1.2.3 (UE procedure for determining valid symbols), clause 6.4 (UE PUSCH preparation procedure time, N2).
- 3GPP TS 38.212 -- Multiplexing and channel coding. Clause 7.3.1.1 (DCI formats 0_0, 0_1, 0_2 -- the uplink Time domain resource assignment field and its width), clause 7.3.1.2 (DCI formats 1_0, 1_1, 1_2 -- the downlink field), clause 7.3.1.0 for the field ordering used in the bit-layout figure.
- 3GPP TS 38.213 -- Physical layer procedures for control. Clause 11.1 (UE procedure for determining slot configuration -- the semi-static TDD pattern and what the UE does not expect to be scheduled), clause 11.1.1 (dynamic slot format indication, DCI 2_0 and flexible symbols).
- 3GPP TS 38.211 -- Physical channels and modulation. Clause 7.4.1.1 (PDSCH DMRS, including the mapping type A and type B reference points and
dmrs-TypeA-Position), clause 6.4.1.1 (PUSCH DMRS), clause 4.3 (frames, subframes and slots). - 3GPP TS 38.331 -- RRC protocol specification.
PDSCH-TimeDomainResourceAllocation,PDSCH-TimeDomainResourceAllocationList,PUSCH-TimeDomainResourceAllocation,PUSCH-TimeDomainResourceAllocationList,PUSCH-Allocation-r16,PDSCH-Config,PDSCH-ConfigCommon,PUSCH-Config,PUSCH-ConfigCommon,TDD-UL-DL-ConfigCommon,TDD-UL-DL-ConfigDedicated,MIB(dmrs-TypeA-Position). - 3GPP TS 38.306 -- UE radio access capability parameters, for the capability gating on repetition type B, multi-PDSCH and multi-PUSCH scheduling, and processing capability 2.
- 3GPP TS 38.300 -- NR overall description. Clause 5.1 for the frame structure context and clause 10 for the scheduling overview.
Companion documents in this set
- 02 Radio Frame Structure -- slots, symbols, the cyclic prefix, the SFN and slot numbering that S indexes into, and the TDD pattern that §13 collides with. That document owns everything about the frame; this one only places allocations inside it.
- 03 Random Access -- the RAR and MSG3 grants, which use the default tables of §8 because no dedicated list exists yet.
- 05 HARQ --
k1, the third offset of thek0/k2family; N1 and N2 in full; the HARQ codebook that multi-PDSCH complicates; and slot aggregation from the retransmission side. - 06 Channel Mapping -- how a transport block reaches PDSCH and PUSCH, which is what a SLIV allocates room for.
- 08 Scheduling -- the survey-level view: DCI formats field by field, frequency-domain allocation, the MCS and TBS tables, and the scheduler itself. This document goes underneath its section 8 and nowhere else.
- 11 DRX -- Active Time, which decides whether the UE is monitoring for the DCI that carries the TDRA index at all.
- 26 UE Capability -- confirming that repetition type B, multi-PDSCH scheduling, processing capability 2 and the extended numerologies are actually supported before reading a log as though they were.
- 30 CORESET and Search Space -- the CORESET whose symbols S is not counted from (§2), and the SS/PBCH-to-CORESET#0 multiplexing pattern that selects which default PDSCH table applies (§8).
- 31 PDCCH Blind Decoding -- why a change in TDRA field width changes the DCI size, and why a DCI-size mismatch produces total silence rather than an error (§18.1).
- 33 DMRS -- the reference-signal structure this document keeps deferring to:
dmrs-TypeA-Position,dmrs-AdditionalPosition, configuration types 1 and 2, and the exact symbol positions for each mapping type and length. - 34 Link Adaptation -- the outer loop that reacts to the DTX a time-domain collision produces by lowering the MCS, which is how a configuration fault comes to look like a coverage fault.
- 35 Physical Channels -- where PDSCH, PUSCH, PDCCH and PUCCH sit relative to each other in the resource grid, and the resource-element-level mapping of all of them.