Scheduling: Dynamic, SPS & Configured Grant in 5G NR
Dynamic grants via DCI, semi-persistent scheduling and configured grants.
Every downlink and uplink transmission in NR except the synchronisation signal, the broadcast of SIB1, and a small set of pre-configured periodic resources happens because the gNB said so, in a message called a grant. The UE has no autonomy at all in the uplink beyond a scheduling request; it cannot transmit data on its own initiative, and it cannot receive data it has not been told to look for. Scheduling is the process that produces those grants, slot by slot, and it is the single largest determinant of what a cell actually delivers.
Contents
- 01What Scheduling Is, and What the Scheduler Is Optimising
- 02The Scheduling Loop, End to End
- 03The Scheduler's Inputs
- 04CORESETs: Where a PDCCH Is Allowed to Live
- 05Search Spaces, Aggregation Levels and Blind Decoding
- 06DCI Formats, Grant Contents, and Cross-Carrier Scheduling
- 07Resource Allocation in Frequency: Type 0, Type 1 and the RIV
- 08Resource Allocation in Time: K0, K2, SLIV and Mapping Type
- 09Link Adaptation: MCS Tables, TBS and the Outer Loop
- 10Semi-Persistent Scheduling and Configured Grants
- 11Slot Aggregation and Repetition
- 12Scheduling for Latency, and Intra-UE Priority
- 13Scheduler Policy: Where the Specification Stops
- 14Parameter Reference: ASN.1, Ranges and Effects
- 15Failure Modes and What Each One Means
- 16ASN.1 Extracts
- 17Illustrative Message Traces
- 18Release Deltas: Rel-15 to Rel-18
- 19Reading Scheduling in Logs: A Checklist
- 20Glossary
- 21References
1. What Scheduling Is, and What the Scheduler Is Optimising
Every downlink and uplink transmission in NR except the synchronisation signal, the broadcast of SIB1, and a small set of pre-configured periodic resources happens because the gNB said so, in a message called a grant. The UE has no autonomy at all in the uplink beyond a scheduling request; it cannot transmit data on its own initiative, and it cannot receive data it has not been told to look for. Scheduling is the process that produces those grants, slot by slot, and it is the single largest determinant of what a cell actually delivers.
What makes it hard is that the scheduler is solving several problems at once with one instrument. In any given slot it must decide which UEs get resources, how much each gets, where in frequency, with what modulation and coding, and when the corresponding data appears — and the objectives conflict:
| Objective | Pulls the decision towards | In tension with |
|---|---|---|
| Cell throughput | Giving resources to the UE with the best channel, at the highest MCS it can carry | Fairness — a UE at the cell edge may never be scheduled at all |
| Fairness | Rotating resources between UEs regardless of channel quality | Throughput — spectrum spent on a bad channel yields fewer bits |
| Latency | Scheduling small allocations immediately, with K0 = 0 and short PDCCH monitoring periodicity | UE power consumption and PDCCH capacity, both of which favour less frequent monitoring |
| Reliability | Low MCS, repetition, more PRBs per bit | Everything else — reliability is bought with spectral efficiency |
| QoS commitments | Respecting per-flow 5QI priority, guaranteed bit rate and packet delay budget | Both throughput and fairness, because a GBR flow must be served whether or not it is efficient to do so |
| Control overhead | Fewer, larger grants; semi-persistent resources | Latency and adaptivity — a configured grant cannot follow the channel |
Table 1. What a scheduler is trading. None of these objectives, and no weighting between them, appears anywhere in a 3GPP specification — see §13.
3GPP standardises the grant, not the decision. Every field this document describes exists so that two implementations can agree on what a grant means; nothing describes how the gNB chose it. That boundary is the most useful thing to keep in mind when reading scheduling logs: if a behaviour is encodable in a DCI, no amount of specification reading will tell you why it happened, and if it is not encodable, no vendor setting can produce it.
2. The Scheduling Loop, End to End
One turn of the loop is: collect measurements and requests from the UE, decide, transmit a DCI on PDCCH, transmit or receive the data at the offset the DCI specified, collect the HARQ answer, and feed it back into the next decision. The period is one slot — 0.5 ms at 30 kHz — and the loop runs independently for the downlink and the uplink.
Two properties of this loop cause most of the confusion when reading logs. First, everything is offset in time: the DCI, the data and the feedback are in three different slots, related by K0, K1 and K2, and a log sorted by timestamp interleaves three different transactions. Second, the inputs are stale. A CSI report describes the channel as it was when the reference signal was measured, several milliseconds before the grant it influences is transmitted, which at vehicular speeds is long enough for the channel to have changed completely. Link adaptation is therefore always a prediction, and the outer loop in §9 exists precisely to correct for how wrong that prediction turns out to be.
3. The Scheduler's Inputs
| Input | How it arrives | Cadence | What the scheduler does with it |
|---|---|---|---|
| CQI / PMI / RI (CSI report) | On PUCCH, or multiplexed on PUSCH, per CSI-ReportConfig | Periodic (ms5 … ms320 typical), semi-persistent, or aperiodic on an SRS/CSI request | Chooses the MCS, the number of layers and the precoder. The single most important input, and the most stale. |
| Buffer Status Report | Short/Long BSR MAC CE on UL-SCH | Regular (periodicBSR-Timer), padding, or triggered by new higher-priority data | Sizes the uplink grant. A UE with no BSR gets no uplink grant unless the scheduler probes it. See the companion 10 BSR, PHR, SR document. |
| Power Headroom Report | PHR MAC CE on UL-SCH | phr-PeriodicTimer, or on a pathloss change beyond phr-Tx-PowerFactorChange | Bounds the uplink grant: a UE with 0 dB headroom cannot support a wider allocation at the same MCS, whatever the BSR says. |
| Scheduling Request | PUCCH, dedicated SR resource | On demand, gated by sr-ProhibitTimer | "I have data and no grant." Carries no size information at all — the first grant is a guess, and the BSR follows in it. |
| HARQ-ACK / NDI history | PUCCH, or absence of a retransmission grant | Every K1 or K2 opportunity | Drives retransmission priority and the outer-loop offset. See the companion 05 HARQ document. |
| QoS profile: 5QI, priority level, PDB, GBR/MBR | From the core network at PDU session or QoS flow setup, mapped to DRBs | Static per flow | Sets the weighting between UEs and between logical channels. The packet delay budget is what turns a fairness problem into a deadline problem. |
Logical channel priority and prioritisedBitRate | LogicalChannelConfig per DRB | Static per bearer | Governs how the UE fills a granted uplink transport block, not how the gNB sizes it. See the companion 09 LCP document. |
| SRS | SRS-Config; periodic, semi-persistent or aperiodic | As configured | Uplink channel sounding for uplink MCS and precoder selection, and — in TDD — a reciprocity-based estimate of the downlink. |
| Measurement reports and beam reports | RRC measurement reports; L1-RSRP in CSI reports | Event-driven | Beam selection and the decision to hand the UE over rather than keep scheduling it. |
Table 2. Everything the scheduler knows. Notice that none of it describes the future, and that two of the most important inputs — CQI and BSR — are the UE's own reports about conditions that have already changed by the time they are acted on.
A scheduling request carries no size information. It is one bit on a PUCCH resource: "grant me something". The gNB therefore issues a small speculative grant, the UE fills it with a BSR plus whatever data fits, and only then does the gNB learn how much is actually queued. This is why uplink latency for the first packet of a burst is dominated by SR → grant → BSR → grant, and why sr-ProhibitTimer and the initial grant size are two of the highest-leverage uplink latency parameters in a deployment.
4. CORESETs: Where a PDCCH Is Allowed to Live
A control resource set is a rectangle of the resource grid — a set of PRBs, over one, two or three consecutive OFDM symbols — inside which PDCCH may be transmitted. It exists because the UE cannot search the whole carrier for control information: the search has to be bounded, and the CORESET is the bound.
4.1 The unit hierarchy
- A REG (resource element group) is one PRB in one OFDM symbol: 12 resource elements, of which 3 carry PDCCH DMRS and 9 carry control information TS 38.211 cl. 7.3.2.2.
- A CCE (control channel element) is 6 REGs — so 72 resource elements, 54 of them usable. This is the allocation quantum for PDCCH.
- A CORESET's size in CCEs is (number of PRBs × duration) / 6. A CORESET of 48 PRBs over 2 symbols is 96 REGs, hence 16 CCEs.
- A PDCCH occupies 1, 2, 4, 8 or 16 CCEs — its aggregation level. More CCEs means a lower effective code rate for the same DCI payload, which is how the network trades control-channel capacity for control-channel reliability.
| Field | Range / values | Typical | Effect |
|---|---|---|---|
controlResourceSetId | 0 … 11 (maxNrofControlResourceSets = 12) | 0 for CORESET 0; 1–2 dedicated | Identity. Id 0 is special: it comes from pdcch-ConfigSIB1 in the MIB and is the only CORESET a UE knows before reading SIB1 — see the companion 18 MIB and SIB1 IEs document. |
frequencyDomainResources | BIT STRING (SIZE (45)) | 8–16 bits set | Each bit enables a group of 6 consecutive PRBs, so 45 bits covers 270 PRBs. Groups are aligned to 6-PRB boundaries from CRB 0 — a CORESET cannot start at an arbitrary PRB. |
duration | 1 … 3 symbols | 2 | How many symbols the CORESET spans. Longer means more CCEs in the same bandwidth, but eats symbols the PDSCH could have used. |
cce-REG-MappingType | interleaved / nonInterleaved | interleaved | Interleaved spreads a CCE's REGs across the CORESET bandwidth for frequency diversity. Non-interleaved keeps them contiguous, which is what you want when the CORESET is beamformed or precoded per bundle. |
reg-BundleSize | n2, n3, n6 | n6 | REGs are precoded and interleaved in bundles of this size. For duration = 1 or 2 the choices are n2 and n6; for duration = 3 they are n3 and n6. |
interleaverSize | n2, n3, n6 | n2 | The block-interleaver row count. Together with shiftIndex it decorrelates the CCE-to-REG mapping between neighbouring cells, so two cells' PDCCHs do not collide systematically. |
shiftIndex | 0 … 274 | the physical cell identity | Cell-specific offset into the interleaver. Setting it identically across neighbours defeats the purpose. |
precoderGranularity | sameAsREG-bundle, allContiguousRBs | sameAsREG-bundle | allContiguousRBs lets the UE assume one precoder across the whole contiguous CORESET, which improves DMRS-based channel estimation but constrains the gNB's beamforming. |
pdcch-DMRS-ScramblingID | 0 … 65535 | the physical cell identity | Scrambles the PDCCH DMRS. Two cells sharing it will interfere in channel estimation, not just in energy. |
Table 3. ControlResourceSet fields, TS 38.331 and TS 38.211 cl. 7.3.2. Up to three dedicated CORESETs may be configured per bandwidth part, plus CORESET 0 and a common CORESET.
The CORESET is a hard capacity limit on how many UEs can be scheduled in a slot, and it is easy to under-provision. A 16-CCE CORESET can carry at most sixteen aggregation-level-1 PDCCHs, but the hashing function (§5.2) rarely offers a collision-free assignment for more than about half that, and any UE in poor coverage needs AL8 or AL16 — one of which consumes the whole CORESET. Symptom of an under-provisioned CORESET: throughput that saturates well below the PDSCH's capability, with PDCCH blocking rather than PRB exhaustion as the cause. It is invisible unless you count CCE occupancy.
5. Search Spaces, Aggregation Levels and Blind Decoding
A CORESET says where PDCCH may appear in the grid. A search space says when the UE looks, how hard it looks, and what kind of DCI it expects. The two are separate objects because several search spaces with different periodicities and different DCI expectations can share one CORESET.
5.1 Common and UE-specific search spaces
| Search space | searchSpaceType | RNTI(s) | Carries | Where configured |
|---|---|---|---|---|
| Type0-PDCCH | common, dci-Format0-0-AndFormat1-0 | SI-RNTI | SIB1 | searchSpaceZero in pdcch-ConfigSIB1 (MIB), or searchSpaceSIB1 |
| Type0A-PDCCH | common | SI-RNTI | Other SI messages | searchSpaceOtherSystemInformation |
| Type1-PDCCH | common | RA-RNTI, MSGB-RNTI, TC-RNTI | Random Access Response and MSG4 | ra-SearchSpace in PDCCH-ConfigCommon |
| Type2-PDCCH | common | P-RNTI | Paging | pagingSearchSpace |
| Type3-PDCCH | common, with dci-Format2-0 … 2-3 | INT-RNTI, SFI-RNTI, TPC-*-RNTI, CI-RNTI, PS-RNTI, and C-RNTI | Group-common indications, and C-RNTI scheduling when the network wants it in a common space | commonSearchSpaceList |
| UE-specific | ue-Specific, formats0-0-And-1-0 or formats0-1-And-1-1 | C-RNTI, CS-RNTI, MCS-C-RNTI, SP-CSI-RNTI | All ordinary scheduling | searchSpacesToAddModList in PDCCH-Config, up to 10 per bandwidth part |
Table 4. Search space types, TS 38.213 cl. 10.1. The type names are procedural labels, not ASN.1 fields — the encoding is just common or ue-Specific plus which DCI formats are enabled.
| Field | Range / values | Effect |
|---|---|---|
searchSpaceId | 0 … 39 (maxNrofSearchSpaces = 40) | Identity. Id 0 is the Type0-PDCCH search space derived from the MIB. The ordering matters: when the blind-decode budget is exceeded, the UE drops UE-specific search spaces in increasing id order. |
monitoringSlotPeriodicityAndOffset | sl1, sl2, sl4, sl5, sl8, sl10, sl16, sl20, sl40, sl80, sl160, sl320, sl640, sl1280, sl2560, each with an offset | Which slots contain monitoring occasions. sl1 is every slot — the lowest latency and the highest UE power cost. |
duration | 2 … 2559 slots | How many consecutive slots from the offset are monitored. Absent means one slot. Used to create bursts of monitoring inside a long period. |
monitoringSymbolsWithinSlot | BIT STRING (SIZE (14)) | Which symbols inside a monitored slot start a monitoring occasion. More than one bit set gives several PDCCH opportunities per slot — the basis of sub-slot scheduling for URLLC. |
nrofCandidates | One value per aggregation level 1/2/4/8/16, each n0, n1, n2, n3, n4, n5, n6, n8 | How many candidates the UE must try at each aggregation level. This is the direct driver of the blind-decode budget in §5.3. |
Table 5. SearchSpace fields, TS 38.331. monitoringSymbolsWithinSlot is the one most people forget exists, and it is what makes mini-slot scheduling reachable.
5.2 The hashing function
Candidate m at aggregation level L does not sit at a fixed CCE offset. Its position is computed from a per-UE, per-slot hash, so that two UEs whose candidates collide in one slot will not collide in the next TS 38.213 cl. 10.1:
CCEs of candidate m at aggregation level L, in CORESET p, slot n:
L * { ( Y_p,n + floor( m * N_CCE,p / (L * M_p,L) ) + n_CI )
mod floor( N_CCE,p / L ) } + i for i = 0 .. L-1
N_CCE,p total CCEs in CORESET p
M_p,L number of candidates configured at level L
n_CI carrier indicator, 0 unless cross-carrier scheduling
Common search space: Y_p,n = 0 (fixed -- every UE agrees)
UE-specific search space: Y_p,n = ( A_p * Y_p,n-1 ) mod D
D = 65537, Y_p,-1 = n_RNTI (non-zero)
A_p = 39827, 39829 or 39839
for p mod 3 = 0, 1, 2Three things follow. A common search space has Y = 0, so every UE computes the same candidate positions — necessary, because the DCI is addressed to a group. A UE-specific search space is seeded with the C-RNTI, so positions differ per UE and advance every slot. And because the recursion is deterministic, both the UE and the gNB can compute the same positions without any signalling — which also means a wrong C-RNTI produces a UE that searches entirely the wrong CCEs and finds nothing, with no error anywhere.
5.3 The blind-decode budget
The UE does not know whether anything was sent to it. It demodulates every candidate at every DCI size it is configured for and finds out from the CRC. That is expensive, so TS 38.213 caps it per slot per serving cell:
| µ | SCS | Max PDCCH candidates M_max | Max non-overlapping CCEs C_max | Comment |
|---|---|---|---|---|
| 0 | 15 kHz | 44 | 56 | The most generous — slots are long |
| 1 | 30 kHz | 36 | 56 | The FR1 mid-band workhorse |
| 2 | 60 kHz | 22 | 48 | Halves again |
| 3 | 120 kHz | 20 | 32 | FR2. Twenty candidates per slot is not much to work with, which is why FR2 CORESETs are usually wide and aggregation levels high |
Table 6. Per-slot, per-serving-cell PDCCH monitoring limits, TS 38.213 Tables 10.1-2 and 10.1-3. With carrier aggregation the limits scale with the number of configured cells, up to a UE capability.
Given: µ = 1 (30 kHz), so M_max = 36 and C_max = 56.
CORESET 1: 48 PRB × 2 symbols = 96 REGs = 16 CCEs
CORESET 0: 48 PRB × 1 symbol = 48 REGs = 8 CCEs
Search space 2 (UE-specific, on CORESET 1), nrofCandidates
AL1 n6, AL2 n6, AL4 n4, AL8 n2, AL16 n1 = 19 candidates
dci-Formats = formats0-1-And-1-1 → 2 DCI sizes
Search space 1 (common, on CORESET 0), nrofCandidates
AL2 n2, AL4 n2, AL8 n1 = 5 candidates
dci-Format0-0-AndFormat1-0 → 1 size (0_0 is padded to 1_0)
Candidates: 19 + 5 = 24 ≤ 36 ✓
DCI sizes: 2 + 1 = 3, all monitored with C-RNTI — exactly at the limit of 3 sizes with C-RNTI (4 in total per cell) ✓
Non-overlapping CCEs: bounded by the CORESET sizes, 16 + 8 = 24 ≤ 56 ✓
Actual decode attempts: 19 × 2 + 5 × 1 = 43 per slot
Note the AL16 candidate. It needs 16 CCEs and CORESET 1 has exactly 16, so there is precisely one possible position for it and it occupies the entire CORESET. Configure aggregationLevel16 = n2 on this CORESET and the second candidate is unusable.
Add a third UE-specific search space with AL1 n8, AL2 n8 — twelve more candidates — and the total becomes 36, exactly at the limit. Add one more and the UE silently stops monitoring the highest-numbered UE-specific search spaces until it fits TS 38.213 cl. 10.1. Nothing is reported. The symptom is a UE that misses grants only in slots where several search spaces coincide, which looks like intermittent PDCCH coverage and is actually arithmetic. Always add up nrofCandidates across every search space that shares a monitoring occasion.
6. DCI Formats, Grant Contents, and Cross-Carrier Scheduling
6.1 The catalogue
| Format | Purpose | RNTI | Search space | Payload (bits, excl. 24-bit CRC) | Introduced |
|---|---|---|---|---|---|
| 0_0 | Uplink grant, fallback | C-RNTI, CS-RNTI, MCS-C-RNTI, TC-RNTI | Common and UE-specific | Size-aligned to 1_0 by padding | Rel-15 |
| 0_1 | Uplink grant, full featured | C-RNTI, CS-RNTI, MCS-C-RNTI, SP-CSI-RNTI | UE-specific | ≈40 … 90, configuration-dependent | Rel-15 |
| 0_2 | Uplink grant with configurable field sizes, for low latency | C-RNTI, CS-RNTI, MCS-C-RNTI | UE-specific | Smaller than 0_1 by configuration | Rel-16 |
| 1_0 | Downlink assignment, fallback | C-RNTI, CS-RNTI, MCS-C-RNTI, TC-RNTI, P-RNTI, SI-RNTI, RA-RNTI, MSGB-RNTI | Common and UE-specific | Computable exactly: 41 at 106 PRB (§6.2) | Rel-15 |
| 1_1 | Downlink assignment, full featured | C-RNTI, CS-RNTI, MCS-C-RNTI | UE-specific | ≈45 … 100, configuration-dependent | Rel-15 |
| 1_2 | Downlink assignment with configurable field sizes | C-RNTI, CS-RNTI, MCS-C-RNTI | UE-specific | Smaller than 1_1 by configuration | Rel-16 |
| 2_0 | Slot format indication; Rel-16 adds available RB sets, channel occupancy duration and search-space group switching | SFI-RNTI | Common | Configurable, dci-PayloadSize | Rel-15 |
| 2_1 | Pre-emption indication — which resources were overwritten | INT-RNTI | Common | 14 bits per configured serving cell | Rel-15 |
| 2_2 | TPC commands for PUCCH and PUSCH | TPC-PUSCH-RNTI, TPC-PUCCH-RNTI | Common | Configurable | Rel-15 |
| 2_3 | TPC commands for SRS | TPC-SRS-RNTI | Common | Configurable | Rel-15 |
| 2_4 | Uplink cancellation indication | CI-RNTI | Common | Configurable, dci-PayloadSizeForCI | Rel-16 |
| 2_5 | IAB soft resource availability indication | AI-RNTI | Common | Configurable | Rel-16 |
| 2_6 | Power saving information outside DRX Active Time (wake-up indication) | PS-RNTI | Common | Configurable | Rel-16 |
| 2_7 | Paging early indication | PEI-RNTI | Common | Configurable | Rel-17 |
| 3_0 / 3_1 | Sidelink scheduling | SL-RNTI, SL-CS-RNTI | UE-specific | — | Rel-16 |
| 4_0 / 4_1 / 4_2 | Multicast (MBS) PDSCH scheduling | G-RNTI, G-CS-RNTI | Common and UE-specific | — | Rel-17 |
Table 7. Every DCI format in NR, TS 38.212 cl. 7.3.1. Payload sizes exclude the 24-bit CRC and are approximate except for 1_0, which is exactly computable. Formats 2_x carry no grant at all — they are group-addressed indications.
The fallback formats 0_0 and 1_0 exist because a DCI can only be decoded if the UE already knows its size, and size depends on configuration. During a reconfiguration the UE's and the gNB's ideas of the configuration differ for a few milliseconds. 1_0's size depends on nothing but the bandwidth part size, and 0_0 is padded to match it, so the pair remains decodable across any ambiguity. That is also why they are the only formats allowed in a common search space, and why a burst of 1_0-scheduled traffic in a log usually means something has just been reconfigured, not that the network prefers the fallback.
6.2 The one DCI you can compute exactly
| Field | Bits | Meaning |
|---|---|---|
| Identifier for DCI formats | 1 | 0 = uplink (format 0_0), 1 = downlink (format 1_0). This is how the UE tells apart two DCIs of identical size. |
| Frequency domain resource assignment | ⌈log₂(N(N+1)/2)⌉ = 13 at N = 106 | FDRA type 1 only — a resource indication value (§7.2). |
| Time domain resource assignment | 4 | Row index into pdsch-TimeDomainAllocationList, giving K0, mapping type and SLIV (§8). |
| VRB-to-PRB mapping | 1 | 0 = non-interleaved, 1 = interleaved. |
| Modulation and coding scheme | 5 | Index into the MCS table (§9). |
| New data indicator | 1 | HARQ toggle — see the companion 05 HARQ document. |
| Redundancy version | 2 | Circular-buffer start offset. |
| HARQ process number | 4 | 0 … 15. |
| Downlink assignment index | 2 | Counter DAI for the dynamic HARQ-ACK codebook. |
| TPC command for scheduled PUCCH | 2 | −1, 0, +1, +3 dB. |
| PUCCH resource indicator | 3 | Which of up to eight PUCCH resources carries the HARQ-ACK. |
| PDSCH-to-HARQ_feedback timing indicator | 3 | Index into dl-DataToUL-ACK, i.e. K1. |
Table 8. DCI 1_0 field by field, total 41 bits at a 106-PRB bandwidth part. Add the 24-bit CRC and the PDCCH is carrying 65 bits, which at aggregation level 2 (108 usable resource elements, QPSK) is a code rate of about 0.30.
6.3 What the full-featured formats add
DCI 1_1 and 0_1 add everything the fallback formats deliberately leave out: a second transport block for two-codeword MIMO, antenna port and TCI state selection, SRS resource indication and precoding information for the uplink, rate-matching and ZP-CSI-RS indicators, code block group fields, the bandwidth part indicator, the carrier indicator, and the Rel-16 priority indicator. The cost is that the size becomes a function of about a dozen configuration choices, which is why they are only allowed in a UE-specific search space where the UE's configuration is unambiguous.
6.4 Cross-carrier and cross-bandwidth-part scheduling
| Mechanism | ASN.1 | DCI field | Effect |
|---|---|---|---|
| Cross-carrier scheduling | CrossCarrierSchedulingConfig → schedulingCellInfo = own {cif-Presence} or other {schedulingCellId, cif-InSchedulingCell} | Carrier indicator, 0 or 3 bits | One serving cell's PDCCH schedules another's PDSCH/PUSCH. Lets a cell with no usable PDCCH (an FR2 SCell in a deep fade, or a cell with no CORESET configured) still be scheduled. The carrier indicator also enters the hashing function as n_CI, so candidate positions differ per scheduled carrier. |
| Cross-bandwidth-part scheduling | BWP-Downlink / BWP-Uplink lists, firstActiveDownlinkBWP-Id, defaultDownlinkBWP-Id, bwp-InactivityTimer | Bandwidth part indicator, 0/1/2 bits | A DCI can switch the active bandwidth part and schedule in the new one in the same message. There is a switching delay during which the UE can neither receive nor transmit — see the companion 02 Radio Frame Structure document. |
Table 9. Cross-carrier and cross-BWP scheduling. Both change where the grant applies without changing the format.
A bandwidth part indicator that switches the active BWP also invalidates everything indexed within the old one: the CORESETs, the search spaces, the TDRA and MCS tables, the PUCCH resources and the SPS configuration are all per-BWP. A UE that switches BWP mid-burst therefore stops monitoring the search spaces the scheduler was using, and if the new BWP's PDCCH-Config is thinner than the old one, PDCCH capacity for that UE silently collapses. bwp-InactivityTimer firing and returning the UE to defaultDownlinkBWP-Id produces the same effect with no DCI in the log at all.
7. Resource Allocation in Frequency: Type 0, Type 1 and the RIV
A grant has to name a set of PRBs in a field of fixed width. NR offers two encodings with different strengths, selected by resourceAllocation in PDSCH-Config / PUSCH-Config — or, with dynamicSwitch, by a bit in the DCI.
dynamicSwitch exists.7.1 Type 0: the resource block group bitmap
PRBs are grouped into resource block groups of P consecutive PRBs, and the DCI carries one bit per group. The group size depends on the bandwidth part size and on rbg-Size TS 38.214 Table 5.1.2.2.1-1:
| Bandwidth part size (PRBs) | P with rbg-Size config1 | P with config2 | Bitmap width at the upper end of the range |
|---|---|---|---|
| 1 – 36 | 2 | 4 | 18 bits (config1) / 9 bits (config2) |
| 37 – 72 | 4 | 8 | 18 / 9 |
| 73 – 144 | 8 | 16 | 18 / 9 |
| 145 – 275 | 16 | 16 | 18 / 18 |
Table 10. Resource block group sizes. The number of groups is ⌈(N_BWP_size + (N_BWP_start mod P)) / P⌉, so a bandwidth part that does not start on a P boundary gets one extra, partly unusable group.
Type 0's strength is discontiguity: a scheduler can hand a UE groups 2–6 and 11–12 in one grant, which matters when the rest of the band is already committed. Its weakness is granularity — with P = 16 the smallest allocation is 16 PRBs, so a 20-byte VoIP packet on a 100 MHz carrier wastes most of what it is given.
7.2 Type 1: the resource indication value
Type 1 encodes a contiguous interval — a start and a length — as a single integer, chosen so that every legal (start, length) pair maps to a distinct value and the field is exactly ⌈log₂(N(N+1)/2)⌉ bits wide TS 38.214 cl. 5.1.2.2.2:
Encoding (N = N_BWP_size, L = number of PRBs, S = starting PRB):
if (L - 1) <= floor(N / 2):
RIV = N * (L - 1) + S
else:
RIV = N * (N - L + 1) + (N - 1 - S)
Decoding:
L' = floor(RIV / N) S' = RIV - L' * N
if (L' + 1) + S' <= N: L = L' + 1 S = S'
else: L = N - L' + 1 S = N - 1 - S'
Field width = ceil( log2( N * (N + 1) / 2 ) ) bitsN = 106 PRB (40 MHz at 30 kHz). Field width = ⌈log₂(106 × 107 / 2)⌉ = ⌈log₂(5671)⌉ = 13 bits.
Encode 30 PRBs starting at PRB 12.
L − 1 = 29 ≤ ⌊106/2⌋ = 53, so the first branch applies:
RIV = 106 × 29 + 12 = 3074 + 12 = 3086 = 0 1100 0000 1110
Decode RIV = 3086.
L' = ⌊3086/106⌋ = 29, S' = 3086 − 3074 = 12
(29 + 1) + 12 = 42 ≤ 106 → L = 30, S = 12 ✓
Decode RIV = 1585 — the wrapped branch.
L' = ⌊1585/106⌋ = 14, S' = 1585 − 1484 = 101
(14 + 1) + 101 = 116 > 106, so the second branch:
L = 106 − 14 + 1 = 93 PRBs, S = 106 − 1 − 101 = PRB 4
Check by re-encoding: L − 1 = 92 > 53, so
RIV = 106 × (106 − 93 + 1) + (106 − 1 − 4) = 1484 + 101 = 1585 ✓
The second branch is the source of essentially every hand-decoding error: a naive ⌊RIV/N⌋ + 1 gives "15 PRBs at PRB 101", which is off the end of the bandwidth part — and that impossibility is the check that tells you to use the other branch.
An RIV decoded with the wrong bandwidth part size is not merely off by a little; it lands somewhere unrelated, because N appears as the multiplier. If a decoded allocation is implausible — negative, off the end, or suspiciously round — check N first. Common causes: decoding a DCI 1_0 in a common search space against the dedicated bandwidth part instead of the initial one, or against the carrier bandwidth instead of the BWP.
8. Resource Allocation in Time: K0, K2, SLIV and Mapping Type
The time-domain allocation is not carried field by field in the DCI. Instead the DCI carries a 4-bit (or 0–4 bit) row index into a table the network configured in advance, and each row holds the slot offset, the mapping type and a start and length indicator value that packs the starting symbol and the symbol count into one integer.
| Element | Where | Range | Effect |
|---|---|---|---|
| Row index | DCI, 0–4 bits | Up to 16 rows in pdsch-TimeDomainAllocationList / pusch-TimeDomainAllocationList | Selects the whole time-domain allocation in one field. With no configured list, a default table from TS 38.214 applies — which is why a UE can be scheduled before any dedicated configuration exists. |
k0 | PDSCH-TimeDomainResourceAllocation | 0 … 32 slots | DCI-to-PDSCH offset. 0 = same-slot; ≥1 = cross-slot, which lets the UE power down its wideband receiver until the PDSCH slot. |
k2 | PUSCH-TimeDomainResourceAllocation | 0 … 32 slots | DCI-to-PUSCH offset. Must be at least the UE's PUSCH preparation time, and in TDD must land on a slot with uplink symbols. |
mappingType | same | typeA or typeB | Type A is slot-based: DMRS at a fixed symbol relative to the slot start, S ∈ {0…3}, L ∈ {3…14}. Type B is the mini-slot form: DMRS relative to the allocation start, S anywhere in the slot, and for PDSCH L ∈ {2, 4, 7}. |
startSymbolAndLength | same | 0 … 127 | The SLIV. Packs S and L; see the arithmetic below. |
Table 11. Time-domain allocation, TS 38.214 cl. 5.1.2.1 (downlink) and 6.1.2.1 (uplink). The row-index indirection is what keeps the DCI small.
SLIV encoding (normal cyclic prefix):
if (L - 1) <= 7: SLIV = 14 * (L - 1) + S
else: SLIV = 14 * (14 - L + 1) + (14 - 1 - S)
with S + L <= 14, L >= 1
Decoding:
if floor(SLIV / 14) + 1 <= 14 - (SLIV mod 14):
L = floor(SLIV / 14) + 1 S = SLIV mod 14
else:
L = 14 - floor(SLIV / 14) + 1 S = 14 - 1 - (SLIV mod 14)Encode a PDSCH occupying symbols 2 to 13 — S = 2, L = 12.
L − 1 = 11 > 7, so the second branch:
SLIV = 14 × (14 − 12 + 1) + (14 − 1 − 2) = 14 × 3 + 11 = 53
Decode SLIV = 53.
⌊53/14⌋ = 3, 53 mod 14 = 11
3 + 1 = 4 ≤ 14 − 11 = 3? No. Second branch:
L = 14 − 3 + 1 = 12, S = 14 − 1 − 11 = 2 ✓
A mini-slot: S = 6, L = 2, mapping type B.
L − 1 = 1 ≤ 7 → SLIV = 14 × 1 + 6 = 20
Note the structure: the same 7-bit field encodes both a 12-symbol slot-based allocation and a 2-symbol mini-slot, and the branch is decided by the length rather than signalled. SLIV values are not monotonic in either S or L, which is why they are usually read from the configured table rather than computed.
9. Link Adaptation: MCS Tables, TBS and the Outer Loop
Link adaptation is the choice of modulation order, code rate and layer count for a given allocation. It runs in two nested loops. The inner loop maps the UE's CQI report to an MCS index; the outer loop corrects that mapping using the HARQ feedback that came back, and it exists because the inner loop is systematically wrong.
9.1 The three MCS tables
| Table | TS 38.214 | Highest modulation | Spectral efficiency range (bits/RE) | Design BLER target | Selected by |
|---|---|---|---|---|---|
| 64QAM | Table 5.1.3.1-1 | 64QAM (Q_m = 6) | 0.2344 … 5.5547 | ≈10⁻¹ | The default when mcs-Table is absent |
| 256QAM | Table 5.1.3.1-2 | 256QAM (Q_m = 8) | 0.2344 … 7.4063 | ≈10⁻¹ | mcs-Table = qam256 and a DCI 1_1 in a UE-specific search space |
| 64QAM low-SE | Table 5.1.3.1-3 | 64QAM (Q_m = 6) | 0.0586 … 4.5234 | ≈10⁻⁵ | mcs-Table = qam64LowSE, or any DCI whose CRC was scrambled by MCS-C-RNTI |
Table 12. The three PDSCH MCS tables. The low-SE table is not "a table for bad channels" — it is a table designed for a 10⁻⁵ residual error target, which is why it starts at a code rate of 30/1024 and why URLLC uses it.
MCS-C-RNTI is a second C-RNTI, assigned alongside the ordinary one, whose only function is to select the low-SE MCS table for the DCIs it scrambles. It lets a scheduler switch a single UE between a 10⁻¹ target and a 10⁻⁵ target per grant, with no reconfiguration — which is how a UE can carry eMBB and URLLC traffic simultaneously. In a log, two different RNTIs scheduling the same UE is not an error; it is the reliability switch.
9.2 From MCS to transport block size
Transport block size is derived, never signalled. Both ends compute it from the allocation, the MCS and the configured overhead, and quantise the result so they always agree TS 38.214 cl. 5.1.3.2. The full procedure is in the companion 05 HARQ document; here is a smaller one, worked end to end.
Given: 30 kHz SCS, 30 PRB, 1 layer, MCS 9 from the 64QAM table (QPSK, Q_m = 2, R = 679/1024 = 0.6631), 12 OFDM symbols of PDSCH, one front-loaded DMRS symbol with two CDM groups without data (N_DMRS = 12 RE/PRB), xOverhead absent so N_oh = 0.
N_RE' = 12 × 12 − 12 − 0 = 132 RE per PRB
N_RE = min(156, 132) × 30 = 3960 RE
N_info = 3960 × 0.6631 × 2 × 1 = 5252 bits
N_info > 3824, so quantise:
n = ⌊log₂(5252 − 24)⌋ − 5 = 12 − 5 = 7, 2⁷ = 128
N_info' = max(3840, 128 × round(5228 / 128)) = 128 × 41 = 5248
R = 0.663 > 1/4 and N_info' = 5248 ≤ 8424, so:
TBS = 8 × ⌈(5248 + 24) / 8⌉ − 24 = 8 × 659 − 24 = 5248 bits = 656 bytes
Sanity checks. Coded bits available = 3960 × 2 = 7920. Payload plus the 24-bit transport block CRC = 5272. Effective code rate = 5272/7920 = 0.666 against a target of 0.663 — a 0.5 % quantisation cost.
Base graph. TBS = 5248 > 3824 and R = 0.663 > 0.25, so LDPC base graph 1 with K_cb = 8448. B = 5272 ≤ 8448, so one code block and no code-block CRC.
9.3 The outer loop
Nothing in any 3GPP specification describes outer-loop link adaptation. It is universal anyway, because the inner loop cannot work without it. The CQI a UE reports is a prediction made from a reference signal measured milliseconds earlier, using a UE-internal receiver model the network cannot see, and reported against a nominal 10 % BLER that different UEs interpret differently. The result is a systematic bias, different per UE and per environment.
The standard fix is a per-UE offset applied to the CQI-derived MCS, adjusted from the HARQ feedback: decrease it on a NACK by a step Δ_down, increase it on an ACK by a much smaller Δ_up, with the ratio chosen so the loop settles at the target BLER. For a 10 % target, Δ_up ≈ Δ_down/9. The offset is commonly clipped to a few dB in each direction and reset on handover.
| Symptom in a log | Likely outer-loop cause | What to look at |
|---|---|---|
| MCS consistently several steps below what the CQI implies | The offset has saturated negative — the UE reports optimistically, or interference is bursty and unpredicted | First-transmission BLER. If it is at target, the loop is doing its job and the CQI is simply wrong. |
| First-transmission BLER far below the target (say 1 %) | The offset is too conservative, or Δ_up is too small to recover after a burst | Throughput left on the table. Every ACKed first transmission at 1 % BLER is spectrum that could have carried a higher MCS. |
| MCS oscillating widely slot to slot | Δ_down too large, or the loop is being driven by CBG-level rather than TB-level feedback | Whether codeBlockGroupTransmission is configured — CBG feedback changes what a "NACK" means. |
| MCS resets to a mid value periodically | Loop reset on handover, on beam change, or on bwp-InactivityTimer expiry | Correlate against mobility events rather than against radio conditions. |
Table 13. Reading the outer loop from its symptoms. Because it is not specified, its behaviour is the clearest fingerprint of a particular scheduler implementation.
10. Semi-Persistent Scheduling and Configured Grants
Dynamic scheduling costs one PDCCH per transport block. For traffic that is small, periodic and predictable — a voice codec producing 20 bytes every 20 ms, an industrial sensor, a video conference's audio stream — the PDCCH can cost more resource than the data. NR therefore allows a resource to be granted once and used repeatedly: semi-persistent scheduling in the downlink, configured grants in the uplink.
| DL SPS | UL configured grant Type 1 | UL configured grant Type 2 | |
|---|---|---|---|
| Configured by | SPS-Config in BWP-DownlinkDedicated | ConfiguredGrantConfig with rrc-ConfiguredUplinkGrant | ConfiguredGrantConfig without rrc-ConfiguredUplinkGrant |
| Activated by | A DCI 1_1 scrambled by cs-RNTI that passes the validation pattern | The RRC message itself — active as soon as it is applied | A DCI 0_1 scrambled by cs-RNTI that passes validation |
| Confirmed by | Nothing | Nothing | Configured Grant Confirmation MAC CE TS 38.321 cl. 6.1.3.7 |
| Periodicity | ms10, ms20, ms32, ms40, ms64, ms80, ms128, ms160, ms320, ms640; Rel-16 periodicityExt reaches down to one slot | sym2, sym7, sym1x14 … sym5120x14 — symbol-granular | Same as Type 1 |
| HARQ processes | nrofHARQ-Processes 1 … 8 | nrofHARQ-Processes 1 … 16 | Same |
| Process ID | Derived from the slot number and the periodicity | Derived from CURRENT_symbol and the periodicity | Same |
| Released by | A DCI 1_1 with cs-RNTI and the release pattern | An RRC reconfiguration | A DCI 0_1 with cs-RNTI and the release pattern, confirmed by the same MAC CE |
| Number configurable | Rel-15: one per BWP. Rel-16: up to 8 | Rel-15: one per BWP. Rel-16: up to 12 per BWP | Same as Type 1 |
Table 14. The three flavours. Type 1 is the only one that needs no DCI at all, which makes it the choice where even a PDCCH is too much latency or too much overhead.
10.1 The validation pattern
An activation DCI carries no data and schedules nothing immediately. Its HARQ, redundancy-version and MCS fields are repurposed as a fixed pattern the UE checks before treating the DCI as an activation rather than an ordinary grant TS 38.213 cl. 10.2:
| Field | For activation | For release | Why |
|---|---|---|---|
| HARQ process number | all zero | all zero | There is no process to name yet — the process ID is derived from timing. |
| Redundancy version | all zero | all zero | Same reason. An activation is not a transmission. |
| Modulation and coding scheme | the value to use for every occasion | all ones | On activation the MCS is real configuration. On release it is a sentinel. |
| Frequency domain resource assignment | the PRBs to use for every occasion | all ones (Type 0 and Type 1) | Same: real on activation, sentinel on release. |
Table 15. Abridged from TS 38.213 Tables 10.2-1 to 10.2-4. A DCI addressed to cs-RNTI that matches neither pattern is discarded, silently — which is the hardest SPS failure to diagnose.
A DCI scrambled by cs-RNTI that fails validation produces nothing at all: no activation, no grant, no error, no counter. If SPS or a configured grant "never starts", the check to make is whether the activation DCI's HARQ, RV, MCS and FDRA fields exactly match the validation pattern for the configured resourceAllocation type. A scheduler that sets FDRA type 0 while the UE is configured for type 1 will produce a release pattern that the UE reads as an activation attempt with an invalid allocation, or vice versa.
10.2 What it costs
The saving is real but bounded. A configured grant cannot follow the channel: its MCS and PRB count are fixed until the network reactivates it, so it must be sized for the worst case the UE is expected to see. For a 20-byte voice packet that is cheap insurance; for anything with a variable rate it is not. configuredGrantTimer bounds how long a configured-grant HARQ process is considered occupied, and Rel-16's cg-RetransmissionTimer (introduced for NR-U) lets the UE retransmit on a later configured occasion without waiting for a grant — the one place in NR where uplink retransmission happens without the gNB asking.
11. Slot Aggregation and Repetition
When one transmission cannot close the link budget and waiting for HARQ feedback costs too much latency, the answer is to send the same transport block several times without waiting. NR has three mechanisms for this and they are frequently confused with HARQ retransmission, which they are not — repetition happens whether or not the first copy would have decoded.
| Mechanism | ASN.1 | Values | Behaviour |
|---|---|---|---|
| PDSCH slot aggregation | pdsch-AggregationFactor in PDSCH-Config | n2, n4, n8 | The same transport block is transmitted in that many consecutive slots, with the same allocation, cycling the redundancy version through 0, 2, 3, 1 TS 38.214 Table 5.1.2.1-2. One HARQ-ACK is reported, after the last repetition. |
| PUSCH slot aggregation (repetition Type A) | pusch-AggregationFactor in PUSCH-Config; Rel-16 also numberOfRepetitions per TDRA row | n2, n4, n8 (Rel-16: up to 16 via the TDRA row) | The uplink equivalent, slot-aligned. Every repetition uses the same symbol allocation within its slot, so a slot with too few uplink symbols is skipped. |
| PUSCH repetition Type B | numberOfRepetitions in the Rel-16 PUSCH-TimeDomainResourceAllocation | 1 … 16 | Nominal repetitions are placed back to back, not slot-aligned, and are segmented around slot boundaries and invalid symbols into actual repetitions. Gives sub-slot repetition granularity, at the cost of actual repetitions that differ in length from each other. |
Table 16. Repetition mechanisms. All three trade spectral efficiency for reliability without adding a round trip — the opposite trade from HARQ.
Aggregation and HARQ retransmission look identical in a naive trace: several transmissions of one transport block with cycling redundancy versions. The distinguishing feature is that repetitions have no PDCCH of their own and no feedback between them. If you can see a DCI before each transmission, it is HARQ. If you see one DCI and four transmissions, it is aggregation — and the four are one HARQ attempt, so a NACK afterwards means all four failed together. Counting them as four failed attempts overstates the BLER by a factor of four.
12. Scheduling for Latency, and Intra-UE Priority
A slot at 30 kHz is 0.5 ms, and a full dynamic scheduling round trip is several slots. For a 1 ms end-to-end budget that is already too slow, so NR provides a set of mechanisms whose common theme is not waiting for the next slot boundary.
12.1 Mini-slots and sub-slot monitoring
Mapping type B allocations can start at any symbol and last as few as two symbols for PDSCH, or one for PUSCH — a mini-slot. To use them the UE has to be able to find a grant mid-slot, which is what monitoringSymbolsWithinSlot provides: setting several bits creates several PDCCH monitoring occasions inside one slot. See the companion 02 Radio Frame Structure document for the symbol-level picture.
12.2 Downlink pre-emption
When a URLLC transmission has to go out now and the resources are already carrying an eMBB transport block, the scheduler simply overwrites them. The victim UE would then soft-combine corrupted symbols into its HARQ buffer and poison every subsequent retransmission of that block — so it has to be told. DCI 2_1, scrambled by INT-RNTI, carries a bitmap of pre-empted resources.
| Mechanism | DCI / RNTI | Configuration | What it says |
|---|---|---|---|
| Downlink pre-emption indication | DCI 2_1, INT-RNTI | DownlinkPreemption in PDCCH-Config: int-RNTI, timeFrequencySet (set0 / set1), dci-PayloadSize, int-ConfigurationPerServingCell | A 14-bit field per configured serving cell. set0 divides the reference region into 14 parts in time and 1 in frequency; set1 into 7 in time and 2 in frequency. "These resources did not carry your data." |
| Uplink cancellation indication | DCI 2_4, CI-RNTI | UplinkCancellation-r16 in PDCCH-Config: ci-RNTI, dci-PayloadSizeForCI, and per cell a timeFrequencyRegion giving duration, granularity and frequency region | "Stop transmitting in these resources." Sent before the transmission, unlike DCI 2_1 which is sent after. Lets a URLLC UE use uplink resources an eMBB UE was granted. |
Table 17. The two pre-emption mechanisms, and the direction of each. DCI 2_1 is retrospective — it repairs damage. DCI 2_4 is prospective — it prevents it.
Latency mechanisms interact badly if they are configured independently. A UE with monitoringSymbolsWithinSlot set for seven occasions per slot is monitoring seven times as often, which multiplies its candidate count against the same M_max budget in §5.3 — so enabling sub-slot monitoring can silently drop the UE-specific search space that carries its ordinary eMBB grants. Enabling mini-slot scheduling without re-checking the blind-decode budget is one of the most common URLLC configuration mistakes.
12.3 Intra-UE prioritisation
Rel-16 introduced the problem of one UE having two things to send at once with different reliability requirements — and no way to choose. Three separate mechanisms now exist:
- Physical-layer priority: a 1-bit priority indicator in DCI 0_1 and 1_1 (
priorityIndicatorDCI-0-1,priorityIndicatorDCI-1-1), splitting uplink transmissions into two priority classes. When a low-priority PUSCH and a high-priority PUCCH collide, the high-priority one wins and the other is dropped. - Logical channel priority:
priority(1 … 16) inLogicalChannelConfig, which governs how the UE fills a granted transport block. This is the logical channel prioritisation procedure — see the companion 09 LCP document. - Uplink control information multiplexing: whether HARQ-ACK, SR and CSI of different priorities may share one PUCCH at all, or must be dropped in favour of the highest.
13. Scheduler Policy: Where the Specification Stops
Everything up to here is specified. What follows is not, and it is worth being explicit about the boundary, because a great deal of scheduling folklore is presented as though it were standardised. 3GPP does not define a scheduling algorithm. It does not define fairness, it does not define how QoS weights are combined, and it does not define outer-loop link adaptation. Two conforming gNBs can behave completely differently in the same conditions.
| Policy | Metric it maximises | Behaviour | Where it is chosen |
|---|---|---|---|
| Round robin | Nothing — it just rotates | Every UE gets its turn regardless of channel. Predictable, trivially fair in time, and poor in throughput because a UE in a fade gets the same air time as one in good coverage. | Sometimes for signalling-only bearers, or as a fallback |
| Max C/I | Instantaneous throughput | Always schedules the UE with the best channel. Maximises cell throughput and starves the cell edge entirely. | Essentially never deployed alone; useful as an upper bound |
| Proportional fair | Ratio of achievable rate now to average rate delivered so far | Schedules a UE when its channel is good relative to its own average, so every UE is served in its own good moments. The standard compromise, and the behaviour most commercial schedulers approximate. | The default in most deployments |
| Delay- or deadline-aware | Remaining packet delay budget | Weights a flow up as its deadline approaches, so a low-priority packet about to expire outranks a high-priority one with time to spare. | Layered on top of proportional fair for delay-critical 5QIs |
| QoS-weighted | A weighted combination of the above, per 5QI | The practical form: proportional fair inside a priority class, strict priority between classes, with GBR flows given a guaranteed share first. | Vendor-specific, usually tunable |
Table 18. Scheduler policies. None of these names appears in a 3GPP specification. They are engineering vocabulary, and the mapping from a vendor's tunable parameters to one of these is a question for that vendor's documentation.
Because policy is unspecified, the only way to reason about a scheduler from a log is to observe it. Two questions answer most of it. First: given two UEs with known CQI and known buffer, which one got the resource? Repeat over a few hundred slots and the policy becomes visible. Second: does a retransmission ever lose to new data? Almost no scheduler lets it, and the ones that do have a good reason. Neither question requires access to the scheduler's source, and neither can be answered from the specification.
14. Parameter Reference: ASN.1, Ranges and Effects
| ASN.1 name | Where | Range / values | Typical | Effect |
|---|---|---|---|---|
controlResourceSetToAddModList | PDCCH-Config | 1 … 3 ControlResourceSet | 1–2 | Dedicated CORESETs per BWP, on top of CORESET 0 and the common one. |
frequencyDomainResources | ControlResourceSet | BIT STRING (45), each bit = 6 PRBs | 8–16 bits set | CORESET bandwidth, and hence its CCE count and PDCCH capacity (§4). |
duration | ControlResourceSet | 1 … 3 symbols | 2 | Trades PDCCH capacity against symbols available for PDSCH. |
searchSpacesToAddModList | PDCCH-Config | 1 … 10 SearchSpace | 2–4 | UE-specific search spaces per BWP. Their searchSpaceId order decides which are dropped when the budget is exceeded. |
monitoringSlotPeriodicityAndOffset | SearchSpace | sl1 … sl2560 with offset | sl1 or sl2 | PDCCH monitoring rate — the dominant term in both scheduling latency and UE power consumption. |
nrofCandidates | SearchSpace | per AL 1/2/4/8/16: n0 … n8 | {6,6,4,2,1} | Blind-decode load. Sum across search spaces must respect M_max (§5.3). |
monitoringSymbolsWithinSlot | SearchSpace | BIT STRING (14) | one bit set | More than one bit gives sub-slot monitoring, at a proportional cost in candidates. |
resourceAllocation | PDSCH-Config / PUSCH-Config | resourceAllocationType0, resourceAllocationType1, dynamicSwitch | type1 | Which FDRA encoding the DCI carries (§7). |
rbg-Size | PDSCH-Config | config1, config2 | config1 | Resource block group granularity for FDRA type 0. |
pdsch-TimeDomainAllocationList | PDSCH-Config | 1 … 16 rows of {k0, mappingType, startSymbolAndLength} | 4–8 rows | Every time-domain allocation the scheduler can express. A row the scheduler needs but the list lacks simply cannot be signalled. |
mcs-Table | PDSCH-Config / PUSCH-Config | qam256, qam64LowSE | qam256 | Which MCS table applies to DCI 1_1/0_1 in a UE-specific search space (§9.1). |
pdsch-AggregationFactor | PDSCH-Config | n2, n4, n8 | absent | Blind slot repetition (§11). |
SPS-Config → periodicity | BWP-DownlinkDedicated | ms10 … ms640; Rel-16 periodicityExt in slots | ms20 | Downlink SPS interval. Must match the traffic's period or the saving evaporates. |
ConfiguredGrantConfig → periodicity | BWP-UplinkDedicated | sym2 … sym5120x14 | sym20x14 (10 ms at 30 kHz) | Uplink configured grant interval, symbol-granular. |
configuredGrantTimer | ConfiguredGrantConfig | 1 … 64 (units of periodicity) | typically a few periods | How long a configured-grant HARQ process stays occupied before it may be reused. |
DownlinkPreemption → timeFrequencySet | PDCCH-Config | set0, set1 | set0 | Granularity of the DCI 2_1 bitmap: 14×1 or 7×2 in time × frequency. |
CrossCarrierSchedulingConfig | ServingCellConfig | own {cif-Presence} or other {schedulingCellId, cif-InSchedulingCell} | own, cif-Presence false | Whether another cell's PDCCH schedules this one, and the 3-bit carrier indicator (§6.4). |
Table 19. Scheduling-relevant configuration. The three with the largest practical blast radius are nrofCandidates (silent search-space drops), pdsch-TimeDomainAllocationList (allocations the scheduler cannot express) and SPS-Config periodicity (a saving that only exists if it matches the traffic).
15. Failure Modes and What Each One Means
| Failure | Detected by | What happens | Diagnostic pointer |
|---|---|---|---|
| PDCCH not decoded (blind decode fails) | Nobody directly | The UE misses the grant entirely. In the downlink the PDSCH is transmitted and lost; the dynamic HARQ-ACK codebook reveals the gap through the counter DAI. In the uplink nothing is transmitted. | PDCCH BLER, aggregation level distribution, and CCE occupancy. If AL is already 8 or 16, the CORESET is not the problem — coverage is. |
| Blind-decode budget exceeded | Nobody | The UE stops monitoring UE-specific search spaces in increasing searchSpaceId order until it fits, with no signalling | Add up nrofCandidates across every search space sharing a monitoring occasion and compare against M_max for the numerology (§5.3). Symptom: missed grants only in slots where search spaces coincide. |
| CORESET too small for the offered load | Nobody | PDCCH blocking: UEs with data and good channels are not scheduled because no CCE combination is free | Throughput saturating below the PDSCH capability with PRBs still available. Count CCE occupancy per slot, not PRB occupancy (§4). |
| DCI size ambiguity after reconfiguration | Neither side, immediately | The UE decodes with the old sizes, the gNB transmits with the new ones — so nothing decodes for a few slots | This is what the fallback formats exist to survive. A burst of DCI 1_0 immediately after an RRCReconfiguration is the expected recovery, not a fault (§6.1). |
| RIV decoded against the wrong bandwidth part size | Nobody | The allocation is read as a completely different, usually impossible, set of PRBs | Implausible allocations — off the end of the BWP, or negative. Check N before anything else, and check whether the DCI was in a common or a UE-specific search space (§7.2). |
| No TDRA row expresses the allocation the scheduler wants | gNB | The scheduler falls back to a row that does exist, so allocations cluster on a few shapes | A time-domain allocation histogram with only two or three values in it. Look at pdsch-TimeDomainAllocationList — not at the scheduler. |
| SPS / configured grant activation DCI fails validation | Nobody at all | The DCI is discarded. Nothing activates, nothing is reported, no counter moves. | Compare the activation DCI's HARQ, RV, MCS and FDRA fields against the validation pattern for the configured resourceAllocation type (§10.1). This is the hardest failure in this table to see. |
| Configured grant fires when the UE has nothing to send | UE | The UE transmits padding, or skips the grant if skipUplinkTxDynamic allows it | Wasted uplink capacity, and interference to neighbours. Check the periodicity against the actual traffic period. |
| Bandwidth part switch mid-burst | UE and gNB, but asynchronously | During the switching delay the UE can neither receive nor transmit; afterwards it is monitoring a different set of search spaces | Correlate throughput dips against bwp-InactivityTimer expiry and bandwidth part indicator values, not against radio conditions (§6.4). |
| Pre-emption without a DCI 2_1 | Nobody | The victim UE soft-combines corrupted symbols and its retransmissions fail repeatedly | A HARQ process that fails on every redundancy version despite good reported CQI. Check whether DownlinkPreemption is configured at all (§12.2). |
| Outer loop saturated | Nobody | MCS is pinned several steps below what the CQI implies, or first-transmission BLER sits far from target | Compare CQI-implied MCS against granted MCS, and BLER against the table's target (§9.3). |
Table 20. Scheduling failure modes. The recurring theme is that almost nothing here is reported: PDCCH has no failure indication, the blind-decode budget is enforced silently, and an invalid activation DCI is simply dropped.
Three of these failures — budget exceeded, activation validation, and wrong-N RIV decoding — produce no error, no counter and no log line anywhere. They are found only by arithmetic: add up the candidates, check the validation fields, recompute the RIV. Any scheduling investigation that has ruled out radio conditions should do those three calculations before looking anywhere else.
16. ASN.1 Extracts
Scheduling configuration lives in PDCCH-Config and PDCCH-ConfigCommon (where PDCCH may be and when to look), PDSCH-Config / PUSCH-Config (how allocations are encoded), and the SPS and configured-grant structures. Abridged from TS 38.331; ... marks omitted fields and extension markers.
ControlResourceSet ::= SEQUENCE {
controlResourceSetId ControlResourceSetId, -- INTEGER (0..11)
frequencyDomainResources BIT STRING (SIZE (45)),
duration INTEGER (1..3),
cce-REG-MappingType CHOICE {
interleaved SEQUENCE {
reg-BundleSize ENUMERATED { n2, n3, n6 },
interleaverSize ENUMERATED { n2, n3, n6 },
shiftIndex INTEGER (0..274) OPTIONAL },
nonInterleaved NULL
},
precoderGranularity ENUMERATED { sameAsREG-bundle,
allContiguousRBs },
tci-StatesPDCCH-ToAddList SEQUENCE (SIZE (1..64)) OF TCI-StateId
OPTIONAL,
tci-PresentInDCI ENUMERATED { enabled } OPTIONAL,
pdcch-DMRS-ScramblingID INTEGER (0..65535) OPTIONAL,
...
}
SearchSpace ::= SEQUENCE {
searchSpaceId SearchSpaceId, -- INTEGER (0..39)
controlResourceSetId ControlResourceSetId OPTIONAL,
monitoringSlotPeriodicityAndOffset CHOICE {
sl1 NULL, sl2 INTEGER (0..1), sl4 INTEGER (0..3),
sl5 INTEGER (0..4), sl8 INTEGER (0..7), sl10 INTEGER (0..9),
sl16 INTEGER (0..15), sl20 INTEGER (0..19),
sl40 INTEGER (0..39), sl80 INTEGER (0..79),
sl160 INTEGER (0..159), sl320 INTEGER (0..319),
sl640 INTEGER (0..639), sl1280 INTEGER (0..1279),
sl2560 INTEGER (0..2559)
} OPTIONAL,
duration INTEGER (2..2559) OPTIONAL,
monitoringSymbolsWithinSlot BIT STRING (SIZE (14)) OPTIONAL,
nrofCandidates SEQUENCE {
aggregationLevel1 ENUMERATED { n0,n1,n2,n3,n4,n5,n6,n8 },
aggregationLevel2 ENUMERATED { n0,n1,n2,n3,n4,n5,n6,n8 },
aggregationLevel4 ENUMERATED { n0,n1,n2,n3,n4,n5,n6,n8 },
aggregationLevel8 ENUMERATED { n0,n1,n2,n3,n4,n5,n6,n8 },
aggregationLevel16 ENUMERATED { n0,n1,n2,n3,n4,n5,n6,n8 }
} OPTIONAL,
searchSpaceType CHOICE {
common SEQUENCE {
dci-Format0-0-AndFormat1-0 SEQUENCE { ... } OPTIONAL,
dci-Format2-0 SEQUENCE { ... } OPTIONAL,
dci-Format2-1 SEQUENCE { ... } OPTIONAL,
dci-Format2-2 SEQUENCE { ... } OPTIONAL,
dci-Format2-3 SEQUENCE { ... } OPTIONAL },
ue-Specific SEQUENCE {
dci-Formats ENUMERATED { formats0-0-And-1-0,
formats0-1-And-1-1 } }
} OPTIONAL
}Listing 1. Where PDCCH may be, and when the UE looks. nrofCandidates is the field that decides the blind-decode load, and it is the one most often set without checking the budget in §5.3.
PDSCH-Config ::= SEQUENCE {
dataScramblingIdentityPDSCH INTEGER (0..1023) OPTIONAL,
dmrs-DownlinkForPDSCH-MappingTypeA SetupRelease { DMRS-DownlinkConfig }
OPTIONAL,
tci-StatesToAddModList SEQUENCE (SIZE (1..128)) OF TCI-State
OPTIONAL,
vrb-ToPRB-Interleaver ENUMERATED { n2, n4 } OPTIONAL,
resourceAllocation ENUMERATED { resourceAllocationType0,
resourceAllocationType1,
dynamicSwitch },
pdsch-TimeDomainAllocationList SetupRelease {
PDSCH-TimeDomainResourceAllocationList }
OPTIONAL,
rbg-Size ENUMERATED { config1, config2 },
mcs-Table ENUMERATED { qam256, qam64LowSE } OPTIONAL,
maxNrofCodeWordsScheduledByDCI ENUMERATED { n1, n2 } OPTIONAL,
prb-BundlingType CHOICE { ... },
pdsch-AggregationFactor ENUMERATED { n2, n4, n8 } OPTIONAL,
...
}
SPS-Config ::= SEQUENCE {
periodicity ENUMERATED { ms10, ms20, ms32, ms40, ms64, ms80,
ms128, ms160, ms320, ms640, ... },
nrofHARQ-Processes INTEGER (1..8),
n1PUCCH-AN PUCCH-ResourceId OPTIONAL,
mcs-Table ENUMERATED { qam64LowSE } OPTIONAL,
...,
[[ sps-ConfigIndex-r16 SPS-ConfigIndex-r16 OPTIONAL,
harq-ProcID-Offset-r16 INTEGER (0..15) OPTIONAL,
periodicityExt-r16 INTEGER (1..5120) OPTIONAL ]]
}
ConfiguredGrantConfig ::= SEQUENCE {
frequencyHopping ENUMERATED { intraSlot, interSlot } OPTIONAL,
cg-DMRS-Configuration DMRS-UplinkConfig,
mcs-Table ENUMERATED { qam256, qam64LowSE } OPTIONAL,
resourceAllocation ENUMERATED { resourceAllocationType0,
resourceAllocationType1,
dynamicSwitch },
nrofHARQ-Processes INTEGER (1..16),
repK ENUMERATED { n1, n2, n4, n8 },
repK-RV ENUMERATED { s1-0231, s2-0303, s3-0000 } OPTIONAL,
periodicity ENUMERATED { sym2, sym7, sym1x14, sym2x14,
sym4x14, ... , sym5120x14 },
configuredGrantTimer INTEGER (1..64) OPTIONAL,
rrc-ConfiguredUplinkGrant SEQUENCE {
timeDomainOffset INTEGER (0..5119),
timeDomainAllocation INTEGER (0..15),
frequencyDomainAllocation BIT STRING (SIZE (18)),
mcsAndTBS INTEGER (0..31),
...
} OPTIONAL,
...
}Listing 2. How allocations are encoded, and the two recurring-resource structures. The presence or absence of rrc-ConfiguredUplinkGrant is the only thing that distinguishes a Type 1 configured grant from a Type 2 one.
17. 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.
17.1 The configuration the scheduler is working within
RRCReconfiguration
cellGroupConfig
spCellConfig / spCellConfigDedicated
initialDownlinkBWP
pdcch-Config
controlResourceSetToAddModList
ControlResourceSet [1]
controlResourceSetId ........ 1
frequencyDomainResources .... 111111110000...0 -- 8 bits set
-- = 48 PRB
duration .................... 2 -- 16 CCEs
cce-REG-MappingType
interleaved
reg-BundleSize ............ n6
interleaverSize ........... n2
shiftIndex ................ 214 -- = the PCI
precoderGranularity ......... sameAsREG-bundle
pdcch-DMRS-ScramblingID ..... 214
searchSpacesToAddModList
SearchSpace [2]
searchSpaceId ............... 2
controlResourceSetId ........ 1
monitoringSlotPeriodicityAndOffset sl1
monitoringSymbolsWithinSlot . 11000000000000 -- symbols 0-1
nrofCandidates
aggregationLevel1 ......... n6
aggregationLevel2 ......... n6
aggregationLevel4 ......... n4
aggregationLevel8 ......... n2
aggregationLevel16 ........ n1 -- 19 candidates
searchSpaceType
ue-Specific
dci-Formats .............. formats0-1-And-1-1 -- 2 DCI sizes
pdsch-Config
resourceAllocation ............ resourceAllocationType1
rbg-Size ...................... config1
mcs-Table ..................... qam256
pdsch-TimeDomainAllocationList
[0] k0 0 mappingType typeA startSymbolAndLength 53 -- S=2 L=12
[1] k0 0 mappingType typeB startSymbolAndLength 20 -- S=6 L=2
[2] k0 1 mappingType typeA startSymbolAndLength 53
[3] k0 0 mappingType typeA startSymbolAndLength 27 -- S=0 L=14
maxNrofCodeWordsScheduledByDCI n1Listing 3. The CORESET, search space and PDSCH configuration used throughout §5 and §17. Row [0] is the SLIV worked out in §8; row [1] is the mini-slot.
17.2 A downlink grant, decoded field by field
10:14:22.0000 [PHY-DL] PDCCH search, SFN 412 slot 7, CORESET 1
candidates tried .......... 19 (AL1 x6, AL2 x6, AL4 x4,
AL8 x2, AL16 x1)
DCI sizes tried ........... 2 (1_1 = 57, 0_1 = 49 bits)
decode attempts ........... 38
hit: AL 2, candidate m=1, CCEs 4-5
10:14:22.0000 [PHY-DL] DCI 1_1, CRC descrambled with C-RNTI 0x4601
Identifier for DCI formats ......... 1 -- downlink
Carrier indicator .................. (absent)
Bandwidth part indicator ........... 0 -- no switch
Frequency domain resource assign ... 1585
-- FDRA type 1, N_BWP = 106, 13-bit field
-- L' = 1585/106 = 14, S' = 101
-- (14+1)+101 = 116 > 106 -> wrapped branch
-- L = 106-14+1 = 93 PRB, S = 106-1-101 = PRB 4
Time domain resource assignment .... 0
-- row 0: k0 = 0, typeA, SLIV 53 -> S = 2, L = 12
VRB-to-PRB mapping ................. 0 -- nonInterleaved
Modulation and coding scheme ....... 15
-- mcs-Table qam256, DCI 1_1, UE-specific SS
-- -> Table 5.1.3.1-2 row 15: Qm 6, R 666/1024
New data indicator ................. 1
Redundancy version ................. 0
HARQ process number ................ 2
Downlink assignment index .......... 1
TPC command for scheduled PUCCH .... 1 -- 0 dB
PUCCH resource indicator ........... 1
PDSCH-to-HARQ timing indicator ..... 1
-- dl-DataToUL-ACK[1] = 2 -> HARQ-ACK in slot 9
Antenna port(s) .................... 0
Transmission configuration indication 2
DMRS sequence initialisation ....... 0
10:14:22.0000 [MAC-DL] PDSCH scheduled
PRB 4-96 (93 PRB), symbols 2-13, 1 layer
N_RE ....................... 132 x 93 = 12276
N_info ..................... 12276 x 0.6504 x 6 = 47915
TBS computed ............... 48168 bits (6021 bytes)
effective code rate ........ 0.656
LDPC base graph ............ 1, 6 code blocksListing 4. One DCI 1_1, with the RIV decode carried out inline. Note that the wrapped RIV branch is used here — a naive decode would give "15 PRBs at PRB 101", which is off the end of a 106-PRB bandwidth part.
17.3 An uplink grant driven by BSR and PHR
10:14:23.5000 [MAC-UL] Long BSR MAC CE received (LCID 62)
LCG bitmap ................. 0x0A -- LCG 1 and LCG 3
Buffer Size LCG 1 .......... index 8 -> 40 .. 47 B
Buffer Size LCG 3 .......... index 45 -> ~11-12 kB
10:14:23.5000 [MAC-UL] Single Entry PHR MAC CE received (LCID 57)
PH ......................... index 46 -> 8 .. 9 dB
P_CMAX,f,c ................. index 39 -> 23 dBm
10:14:23.5020 [SCHED] uplink decision for C-RNTI 0x4601
buffer to serve ............ 11.8 kB
SRS-based MCS estimate ..... 13
outer-loop offset (UL) ..... -1.0 dB -> MCS 11
PH allows widening to ...... 48 PRB at MCS 11
free PRB in slot 4 ......... 44
-> 41 PRB, MCS 11, 1 layer
10:14:23.5030 [PHY-DL] DCI 0_1, C-RNTI 0x4601, SFN 412 slot 1
Identifier for DCI formats ......... 0 -- uplink
Frequency domain resource assign ... 4265
-- L' = 4265/106 = 40, S' = 25
-- (40+1)+25 = 66 <= 106 -> first branch
-- L = 41 PRB, S = PRB 25
Time domain resource assignment .... 2
-- row 2: k2 = 3, typeA, SLIV 27 -> S = 0, L = 14
Frequency hopping flag ............. 0
Modulation and coding scheme ....... 11
New data indicator ................. 1
Redundancy version ................. 0
HARQ process number ................ 5
TPC command for scheduled PUSCH .... 1 -- 0 dB
SRS resource indicator ............. 0
Precoding info and no. of layers ... 0
Antenna ports ...................... 0
DMRS sequence initialisation ....... 0
10:14:23.5045 [MAC-UL] PUSCH SFN 412 slot 4 (slot 1 + k2 = 4)
41 PRB, 14 symbols, MCS 11 (16QAM, R 378/1024)
N_RE = min(156, 156) x 41 = 6396 -> TBS 9480 bits
= 1185 bytes
LCP fills: LCG 1 (44 B), then LCG 3 (1129 B), then
a padding BSR reporting 10.6 kB still queuedListing 5. The BSR and PHR arriving, the decision they drive, and the grant that results. The PHR is what bounds the allocation: without it the scheduler would have to assume the worst case.
17.4 SPS activation and release
10:20:00.0000 [RRC] SPS-Config applied
periodicity ................ ms20
nrofHARQ-Processes ......... 4
n1PUCCH-AN ................. 3
cs-RNTI .................... 0x3F02
-- configured, but NOT active
10:20:01.2000 [PHY-DL] DCI 1_1, CRC descrambled with CS-RNTI 0x3F02
New data indicator ......... 0
HARQ process number ........ 0000 -- validation
Redundancy version ........ 00 -- validation
Modulation and coding scheme 9 -- real value
Frequency domain resource ... RIV 742 -> 8 PRB @ PRB 0
Time domain resource ....... row 0 -> k0 0, S 2, L 12
10:20:01.2000 [MAC-DL] validation pattern matched -> SPS ACTIVATION
stored assignment: 8 PRB, MCS 9, S=2 L=12
N_info = 1056 x 0.6631 x 2 = 1400, quantised to 1392,
then up to the next Table 5.1.3.2-1 entry:
TBS ........................ 1416 bits (177 bytes)
first occasion ............. SFN 500 slot 4
10:20:01.2400 [MAC-DL] SPS PDSCH occasion 1, no PDCCH
HARQ pid derived from the slot number .... 0
10:20:01.2450 [PHY-UL] PUCCH HARQ-ACK on resource 3 -> ACK
10:20:01.2600 [MAC-DL] SPS PDSCH occasion 2, +20 ms, HARQ pid 1
... 148 occasions, 0 PDCCH transmissions ...
10:20:04.2000 [PHY-DL] DCI 1_1, CS-RNTI 0x3F02
HARQ process number ........ 0000
Redundancy version ........ 00
Modulation and coding scheme 11111 -- all ones
Frequency domain resource ... all ones
10:20:04.2000 [MAC-DL] release pattern matched -> SPS RELEASED
remaining SPS occasions cleared
-- PDCCH cost over 3 seconds: 2 DCIs for 149 transport blocks.
-- Dynamically scheduled, the same traffic would have cost 149.Listing 6. Two DCIs for 149 transport blocks. The last two lines are the whole argument for SPS — and also the whole argument against it, since none of those 149 transmissions could adapt to the channel.
17.5 A grant that never arrives
11:02:17.0000 [RRC] RRCReconfiguration applied
searchSpacesToAddModList: SearchSpace [4] added
searchSpaceId ............ 4
controlResourceSetId ..... 1
monitoringSlotPeriodicityAndOffset sl1
monitoringSymbolsWithinSlot 11111110000000
-- 7 occasions per slot!
nrofCandidates AL1 n8, AL2 n4
searchSpaceType ue-Specific formats0-1-And-1-1
11:02:17.0000 [PHY-DL] PDCCH budget check, mu = 1: M_max = 36
SearchSpace 2 ..... 19 candidates
SearchSpace 4 ..... 12 candidates x 7 occasions = 84
total ............. 103 > 36
11:02:17.0000 [PHY-DL] dropping UE-specific search spaces in increasing
searchSpaceId order until the budget is met
-> SearchSpace 4 retained (lower id first),
SearchSpace 2 DROPPED
-- no signalling, no error, no counter
11:02:17.0010 [SCHED] (gNB) DCI 1_1 for C-RNTI 0x4601 placed in
SearchSpace 2, AL 2, CCE 4-5
11:02:17.0010 [PHY-DL] (UE) SearchSpace 2 not monitored -> nothing found
11:02:17.0013 [MAC-DL] (gNB) PDSCH transmitted, no HARQ-ACK expected
until slot 9
11:02:17.0020 [PHY-UL] (UE) PUCCH: nothing to report for this occasion
11:02:17.0020 [MAC-DL] (gNB) HARQ-ACK absent -> treated as NACK
retransmit pid 2, RV 2, same search space
-- and it will be missed again, indefinitely
-- Downlink throughput for this UE: ~0. Radio conditions: excellent.
-- CQI 13, no PDCCH BLER, no HARQ failures reported by either side.Listing 7. A search space added for mini-slot monitoring pushes the candidate count past M_max, and the UE silently stops monitoring the search space that carried its ordinary grants. Every radio metric looks perfect. This is the failure mode §5.3 and §15 both warn about.
The trace above is the reason to add up nrofCandidates by hand after any change to PDCCH-Config. There is no counter for "search space dropped", no RRC failure, and no radio symptom — the UE is behaving exactly as specified. The only visible evidence is that the gNB places DCIs in a search space the UE is not monitoring, which requires you to have both sides of the log and to know the budget for the numerology.
18. Release Deltas: Rel-15 to Rel-18
| Release | Change | Why it matters when reading scheduling |
|---|---|---|
| Rel-15 | CORESETs and search spaces; DCI 0_0/0_1/1_0/1_1 and 2_0–2_3; FDRA types 0 and 1; TDRA tables with K0/K2 and SLIV; three MCS tables; SPS and configured grants Type 1 and Type 2; slot aggregation; bandwidth parts; cross-carrier scheduling | The baseline. Everything in §§4–11 is Rel-15. |
| Rel-16 | DCI 0_2 and 1_2 with configurable field sizes, and separate dl-DataToUL-ACK, TDRA and MCS configuration for them | Two DCI sizes can now schedule the same channel with different field widths. A decoder that assumes one layout per format will misparse. |
| Rel-16 | DCI 2_4 / CI-RNTI uplink cancellation; UplinkCancellation-r16 | The uplink can now be pre-empted prospectively, so a granted PUSCH that never appears is not necessarily a UE failure (§12.2). |
| Rel-16 | Physical-layer priority indicator in DCI 0_1/1_1; intra-UE prioritisation and UCI multiplexing rules | A dropped PUCCH or PUSCH can now be correct behaviour, decided by a single bit (§12.3). |
| Rel-16 | PUSCH repetition Type B; up to 16 repetitions; numberOfRepetitions in the TDRA row | Repetitions are no longer slot-aligned or equal in length, so counting transmissions per transport block needs care (§11). |
| Rel-16 | Multiple SPS and configured-grant configurations per BWP (up to 8 and 12); periodicityExt down to one slot; harq-ProcID-Offset | Several recurring resources can coexist, each with its own HARQ process range. A configured-grant process ID is no longer derivable without knowing which configuration fired. |
| Rel-16 | NR-U: DCI 2_0 extended with available RB sets, channel occupancy duration and search-space group switching; DCI 2_5 for IAB | PDCCH monitoring can now change group dynamically, so the search spaces a UE monitors are not constant across a trace. |
| Rel-17 | DCI 2_7 / PEI-RNTI paging early indication; DCI 4_0/4_1/4_2 for multicast; 480 and 960 kHz numerologies | New RNTIs and formats in common search spaces, and blind-decode budgets at numerologies the tables in §5.3 do not cover. |
| Rel-17 | Coverage enhancement: PUSCH repetition with TBS determination over multiple slots, joint channel estimation | A transport block can span slots, so "one grant, one slot" no longer holds. |
| Rel-18 | Multi-cell scheduling with a single DCI; further MBS and NTN work; network energy saving with dynamic adaptation of transmission patterns | One DCI can now carry grants for more than one serving cell, so the one-to-one relationship between a DCI and a cell is gone. |
Table 21. Scheduling changes by release. Confirm feature presence against the UE capability exchange — see the companion 26 UE Capability document — before assuming a DCI format or field exists.
19. Reading Scheduling in Logs: A Checklist
1. Establish the bandwidth part before decoding anything. N_BWP_size is the multiplier in the RIV formula and the divisor in the RBG calculation. A DCI 1_0 in a common search space is decoded against the initial bandwidth part, not the active one (§7.2).
2. Identify the DCI format from the RNTI and the search space, not from the size. Two formats of the same size are told apart by the "identifier for DCI formats" bit; two formats in different search spaces may share a size by design (§6.1).
3. Add up `nrofCandidates` across every search space that shares a monitoring occasion, multiply by the occasions per slot, and compare against M_max for the numerology. This one calculation explains a whole class of "missing grant" problems and nothing reports it (§5.3).
4. Count CCE occupancy, not PRB occupancy, when throughput saturates. PDCCH blocking and PRB exhaustion look identical from a throughput graph and have completely different fixes (§4).
5. Recompute the RIV in both branches. If ⌊RIV/N⌋ + 1 gives an allocation that runs off the end of the bandwidth part, you are in the wrapped branch — that impossibility is the branch test (§7.2).
6. Resolve the TDRA row index against the configured list, and check the list is wide enough. Allocations clustering on two or three shapes usually means the list is short, not that the scheduler is unimaginative (§8).
7. Compare granted MCS against CQI-implied MCS. A persistent gap is the outer loop, and whether that is correct depends on the first-transmission BLER, not on the gap (§9.3).
8. For SPS and configured grants, check the validation pattern field by field. An activation that fails validation produces no error and no counter, so "SPS never started" is almost always this (§10.1).
9. Distinguish repetition from retransmission by counting DCIs. One DCI and four transmissions is aggregation and one HARQ attempt; four DCIs and four transmissions is four HARQ attempts (§11).
10. Before blaming radio, check the three silent failures: blind-decode budget exceeded, activation validation mismatch, and RIV decoded against the wrong N. None of them produces a log line, and all three are pure arithmetic (§15).
20. Glossary
| Term | Expansion | Meaning in this document |
|---|---|---|
| CORESET | Control Resource Set | A rectangle of PRBs × 1–3 symbols in which PDCCH may be transmitted. Sized in CCEs (§4). |
| REG | Resource Element Group | One PRB in one OFDM symbol: 12 REs, 3 of them PDCCH DMRS. |
| CCE | Control Channel Element | 6 REGs. The allocation quantum for PDCCH. |
| Aggregation level | — | How many CCEs one PDCCH occupies: 1, 2, 4, 8 or 16. The control-channel reliability knob. |
| Search space | — | When the UE looks for PDCCH, at which aggregation levels, with how many candidates, and for which DCI formats (§5). |
| Blind decoding | — | Demodulating every candidate at every configured DCI size and letting the CRC decide. Bounded by M_max and C_max (§5.3). |
| DCI | Downlink Control Information | The payload of a PDCCH. Carries the grant, or a group-common indication (§6). |
| FDRA | Frequency Domain Resource Assignment | The DCI field naming the PRBs. Type 0 is an RBG bitmap, Type 1 an RIV (§7). |
| RBG | Resource Block Group | P consecutive PRBs, one bit of the type 0 bitmap. P is 2, 4, 8 or 16. |
| RIV | Resource Indication Value | A single integer encoding a contiguous (start, length) pair, in two branches (§7.2). |
| SLIV | Start and Length Indicator Value | A single integer encoding a starting symbol and a symbol count, in two branches (§8). |
| TDRA | Time Domain Resource Allocation | The configured table of {K0 or K2, mapping type, SLIV} rows the DCI indexes into. |
| K0 / K1 / K2 | — | Slot offsets: DCI→PDSCH, PDSCH→HARQ-ACK, DCI→PUSCH. |
| Mapping type A / B | — | Slot-based versus mini-slot allocation, distinguished by where DMRS sits and what starting symbols are legal (§8). |
| MCS | Modulation and Coding Scheme | A 5-bit index into one of three tables giving modulation order and target code rate (§9.1). |
| OLLA | Outer Loop Link Adaptation | A per-UE MCS offset driven by HARQ feedback. Universal, and specified nowhere (§9.3). |
| SPS | Semi-Persistent Scheduling | A recurring downlink assignment, activated by a DCI addressed to cs-RNTI (§10). |
| Configured grant | — | The uplink counterpart. Type 1 is activated by RRC, Type 2 by a DCI. |
cs-RNTI | Configured Scheduling RNTI | The RNTI that scrambles SPS and configured-grant activation and release DCIs. |
MCS-C-RNTI | — | A second C-RNTI whose only effect is to select the low-spectral-efficiency MCS table, i.e. a 10⁻⁵ BLER target (§9.1). |
| Pre-emption | — | Overwriting one UE's granted resources with another's transmission; signalled retrospectively by DCI 2_1 or prospectively by DCI 2_4 (§12.2). |
21. References
- 3GPP TS 38.213 — Physical layer procedures for control. Clause 10.1 (UE procedure for determining PDCCH candidates: the search space definitions, the hashing function, and Tables 10.1-2 and 10.1-3 giving the per-slot monitoring limits), clause 10.2 (validation of DCIs activating and releasing SPS and configured grants), clause 11.1 (slot format indication and DCI 2_0), clause 11.2 (pre-emption indication and DCI 2_1), clause 11.2A (uplink cancellation and DCI 2_4), clause 9 (HARQ-ACK reporting and PUCCH resources).
- 3GPP TS 38.212 — Multiplexing and channel coding. Clause 7.3.1 (every DCI format, field by field, including 0_0 to 0_2, 1_0 to 1_2 and 2_0 to 2_7), clause 7.3.1.0 (the DCI size budget), clause 7.3.2 (PDCCH coding and CRC scrambling by RNTI).
- 3GPP TS 38.214 — Physical layer procedures for data. Clause 5.1.2 (PDSCH resource allocation in time and frequency: K0, mapping type, SLIV, FDRA types 0 and 1, Table 5.1.2.2.1-1 for RBG sizes), clause 5.1.3 (modulation order, target code rate and transport block size determination; Tables 5.1.3.1-1 to 5.1.3.1-3 for the MCS tables), clause 5.1.7 (code block group based transmission), clause 5.2.2 (CSI reporting, and Tables 5.2.2.1-2 to 5.2.2.1-4 for the CQI tables), clause 6.1.2 (PUSCH resource allocation, K2, repetition Types A and B).
- 3GPP TS 38.211 — Physical channels and modulation. Clause 7.3.2 (PDCCH: REG and CCE definitions, the CCE-to-REG mapping and the interleaver), clause 7.4.1.3 (PDCCH DMRS).
- 3GPP TS 38.321 — MAC protocol specification. Clause 5.4.1 (configured uplink grants and the HARQ process ID derivation), clause 5.8.1 (reception of a downlink assignment on the configured downlink assignment), clause 5.13 (activation and deactivation handling), clause 6.1.3.7 (
Configured Grant ConfirmationMAC CE). - 3GPP TS 38.331 — RRC protocol specification.
PDCCH-Config,PDCCH-ConfigCommon,ControlResourceSet,SearchSpace,PDSCH-Config,PUSCH-Config,PDSCH-TimeDomainResourceAllocationList,SPS-Config,ConfiguredGrantConfig,DownlinkPreemption,UplinkCancellation,CrossCarrierSchedulingConfig,BWP-Downlink,BWP-Uplink. - 3GPP TS 38.300 — NR overall description. Clause 10 (scheduling and rate control, including the explicit statement that the scheduling algorithm is implementation-specific).
- 3GPP TS 23.501 — System architecture. Clause 5.7 (5QI characteristics: priority level, packet delay budget, packet error rate) — the QoS inputs of §3.
Companion documents in this set
- 02 Radio Frame Structure — slots, symbols, bandwidth parts and the TDD patterns that every K0/K1/K2 offset is counted in, plus the mini-slot picture behind §12.1.
- 03 Random Access — the RAR uplink grant, which is a stripped-down grant carried in a MAC RAR rather than a DCI.
- 04 Timing Advance —
timeAlignmentTimerexpiry clears every configured grant and SPS assignment. - 05 HARQ — the NDI, RV, DAI and CBG fields of the DCIs in §6, the K1 timing of §8, and the transport block size arithmetic of §9.2.
- 06 Channel Mapping — how DL-SCH and UL-SCH relate to PDSCH and PUSCH, and where PDCCH sits.
- 07 MAC PDU and Control Elements — the BSR, PHR and Configured Grant Confirmation control elements of §3 and §10.
- 09 LCP — how the UE decides what goes into an uplink transport block once the scheduler has sized it.
- 10 BSR, PHR, SR — the three uplink reports that are the scheduler's only view of the uplink.
- 11 DRX — PDCCH monitoring is suspended outside Active Time, which interacts directly with
monitoringSlotPeriodicityAndOffset. - 17 System Information / 18 MIB and SIB1 IEs — where CORESET 0 and search space 0 come from, before any dedicated configuration exists.
- 26 UE Capability — processing capability 2, supported DCI formats, and the carrier-aggregation limits that scale the budgets in §5.3.