>
Home5G NRMAC — Medium Access ControlScheduling
🧩 MAC — Medium Access ControlIntermediate

Scheduling: Dynamic, SPS & Configured Grant in 5G NR

Dynamic grants via DCI, semi-persistent scheduling and configured grants.

📚 3GPP-basedTS 38.321TS 38.213

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
  1. 01What Scheduling Is, and What the Scheduler Is Optimising
  2. 02The Scheduling Loop, End to End
  3. 03The Scheduler's Inputs
  4. 04CORESETs: Where a PDCCH Is Allowed to Live
  5. 05Search Spaces, Aggregation Levels and Blind Decoding
  6. 06DCI Formats, Grant Contents, and Cross-Carrier Scheduling
  7. 07Resource Allocation in Frequency: Type 0, Type 1 and the RIV
  8. 08Resource Allocation in Time: K0, K2, SLIV and Mapping Type
  9. 09Link Adaptation: MCS Tables, TBS and the Outer Loop
  10. 10Semi-Persistent Scheduling and Configured Grants
  11. 11Slot Aggregation and Repetition
  12. 12Scheduling for Latency, and Intra-UE Priority
  13. 13Scheduler Policy: Where the Specification Stops
  14. 14Parameter Reference: ASN.1, Ranges and Effects
  15. 15Failure Modes and What Each One Means
  16. 16ASN.1 Extracts
  17. 17Illustrative Message Traces
  18. 18Release Deltas: Rel-15 to Rel-18
  19. 19Reading Scheduling in Logs: A Checklist
  20. 20Glossary
  21. 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:

ObjectivePulls the decision towardsIn tension with
Cell throughputGiving resources to the UE with the best channel, at the highest MCS it can carryFairness — a UE at the cell edge may never be scheduled at all
FairnessRotating resources between UEs regardless of channel qualityThroughput — spectrum spent on a bad channel yields fewer bits
LatencyScheduling small allocations immediately, with K0 = 0 and short PDCCH monitoring periodicityUE power consumption and PDCCH capacity, both of which favour less frequent monitoring
ReliabilityLow MCS, repetition, more PRBs per bitEverything else — reliability is bought with spectral efficiency
QoS commitmentsRespecting per-flow 5QI priority, guaranteed bit rate and packet delay budgetBoth throughput and fairness, because a GBR flow must be served whether or not it is efficient to do so
Control overheadFewer, larger grants; semi-persistent resourcesLatency 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.

💡
Key Point

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.

One Turn of the Scheduling LoopOne Turn of the Scheduling LoopInputsDecideGrant and actAdaptUEgNB-DU schedulerC-RNTI 0x4601, 40 MHz at 30 kHz (106 PRB), TDD DDDSU,12 active UEs in the cell, 2 MIMO layers configured.CSI report on PUCCH (periodic, 20 ms)CQI 10 (table 1), RI = 2, PMI, CSI-RS resource 0, wideband1Long BSR MAC CELCG 1: 340 B (signalling) LCG 3: 12 288 B (best effort)2Single Entry PHR MAC CEPH = 8 dB, P_CMAX,c = 23 dBm -> room for a wider UL grant31. HARQ retransmissions first: pid 7 pending2. CQI 10 -> MCS 18, less a 1.5 dB outer-loop offset -> MCS 153. proportional-fair metric ranks this UE 2nd of 124. 100 of 106 PRB still free in slot nPDCCH: DCI 1_1 (retransmission, pid 7)AL 4, CCE 8-11, NDI unchanged, RV 24PDCCH: DCI 1_1 (new data, pid 2)AL 2, CCE 4-5, FDRA type 1 RIV 1585, MCS 15, K0 = 0, K1 index 15PDSCH x2TBS 31 752 bits on pid 2; same slot, K0 = 06PUCCH: HARQ-ACK codebook, 2 bitsslot n + 4 -- the next uplink slot in the pattern7PDCCH: DCI 0_1 (uplink grant)sized from the BSR and bounded by the PHR: 40 PRB, MCS 11, K2 = 38PUSCHLCP fills the grant: LCG 1 first, then LCG 3, then a BSR920 ms later -- the channel has changedCSI report: CQI 7, RI = 1the UE has moved into shadowing; three CQI steps downMCS 15 -> MCS 9, RI 2 -> 1: spectral efficiency4.82 -> 1.33 bits/RE. Same PRB count,about a quarter of the throughput.Steps 1-3 are the only information the scheduler has. Everything in the decision box is vendor policy -- 3GPP specifiesthe shape of the grant, never how the scheduler chose it.
Figure 1. One turn of the loop with real field values. Note the two DCIs in the same slot: retransmissions are scheduled before new data, because a HARQ process that stays occupied costs the pipeline more than the transmission costs the air interface.

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

InputHow it arrivesCadenceWhat the scheduler does with it
CQI / PMI / RI (CSI report)On PUCCH, or multiplexed on PUSCH, per CSI-ReportConfigPeriodic (ms5ms320 typical), semi-persistent, or aperiodic on an SRS/CSI requestChooses the MCS, the number of layers and the precoder. The single most important input, and the most stale.
Buffer Status ReportShort/Long BSR MAC CE on UL-SCHRegular (periodicBSR-Timer), padding, or triggered by new higher-priority dataSizes 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 ReportPHR MAC CE on UL-SCHphr-PeriodicTimer, or on a pathloss change beyond phr-Tx-PowerFactorChangeBounds the uplink grant: a UE with 0 dB headroom cannot support a wider allocation at the same MCS, whatever the BSR says.
Scheduling RequestPUCCH, dedicated SR resourceOn 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 historyPUCCH, or absence of a retransmission grantEvery K1 or K2 opportunityDrives retransmission priority and the outer-loop offset. See the companion 05 HARQ document.
QoS profile: 5QI, priority level, PDB, GBR/MBRFrom the core network at PDU session or QoS flow setup, mapped to DRBsStatic per flowSets 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 prioritisedBitRateLogicalChannelConfig per DRBStatic per bearerGoverns how the UE fills a granted uplink transport block, not how the gNB sizes it. See the companion 09 LCP document.
SRSSRS-Config; periodic, semi-persistent or aperiodicAs configuredUplink channel sounding for uplink MCS and precoder selection, and — in TDD — a reciprocity-based estimate of the downlink.
Measurement reports and beam reportsRRC measurement reports; L1-RSRP in CSI reportsEvent-drivenBeam 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.

💡
Key Point

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.
FieldRange / valuesTypicalEffect
controlResourceSetId
0 … 11 (maxNrofControlResourceSets = 12)0 for CORESET 0; 1–2 dedicatedIdentity. 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 setEach 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 symbols2How 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 / nonInterleavedinterleavedInterleaved 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, n6n6REGs 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, n6n2The 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 … 274the physical cell identityCell-specific offset into the interleaver. Setting it identically across neighbours defeats the purpose.
precoderGranularity
sameAsREG-bundle, allContiguousRBssameAsREG-bundleallContiguousRBs 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 … 65535the physical cell identityScrambles 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.

⚠️
Common Pitfall

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.

One CORESET, Sixteen CCEs, Nineteen PDCCH CandidatesOne CORESET, Sixteen CCEs, Nineteen PDCCH Candidates48 PRB x 2 symbols = 96 REGs = 16 CCEs; nrofCandidates {AL1: n6, AL2: n6, AL4: n4, AL8: n2, AL16: n1}0123456789101112131415AL1AL1AL1AL1AL1AL1AL2AL2AL2AL2AL2AL2AL4AL4AL4AL4AL8AL8AL16['CORESET', '16 CCEs']AL 1 (6 cand.)AL 2 (6)AL 4 (4)AL 8 (2)AL 16 (1)0123456789101112131415CCE index within the CORESETEvery candidate must fit inside the CORESET, so a 16-CCE CORESET supports exactly one AL16 candidate -- and itconsumes the whole thing. The start positions come from the hashing function of TS 38.213 cl. 10.1, not from configuration.
Figure 2. A 16-CCE CORESET with a realistic candidate configuration. The candidate start positions come from the hashing function in §5.2 and change every slot, which is what stops two UEs from colliding permanently.

5.1 Common and UE-specific search spaces

Search spacesearchSpaceTypeRNTI(s)CarriesWhere configured
Type0-PDCCHcommon, dci-Format0-0-AndFormat1-0SI-RNTISIB1searchSpaceZero in pdcch-ConfigSIB1 (MIB), or searchSpaceSIB1
Type0A-PDCCHcommonSI-RNTIOther SI messages
searchSpaceOtherSystemInformation
Type1-PDCCHcommonRA-RNTI, MSGB-RNTI, TC-RNTIRandom Access Response and MSG4ra-SearchSpace in PDCCH-ConfigCommon
Type2-PDCCHcommonP-RNTIPaging
pagingSearchSpace
Type3-PDCCHcommon, with dci-Format2-02-3INT-RNTI, SFI-RNTI, TPC-*-RNTI, CI-RNTI, PS-RNTI, and C-RNTIGroup-common indications, and C-RNTI scheduling when the network wants it in a common space
commonSearchSpaceList
UE-specificue-Specific, formats0-0-And-1-0 or formats0-1-And-1-1C-RNTI, CS-RNTI, MCS-C-RNTI, SP-CSI-RNTIAll ordinary schedulingsearchSpacesToAddModList 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.

FieldRange / valuesEffect
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 offsetWhich slots contain monitoring occasions. sl1 is every slot — the lowest latency and the highest UE power cost.
duration
2 … 2559 slotsHow 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, n8How 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:

PDCCH candidate-to-CCE mapping
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, 2

Three 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:

µSCSMax PDCCH candidates M_maxMax non-overlapping CCEs C_maxComment
015 kHz4456The most generous — slots are long
130 kHz3656The FR1 mid-band workhorse
260 kHz2248Halves again
3120 kHz2032FR2. 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.

PDCCH blind decoding procedureWhat the UE Does in Every PDCCH Monitoring OccasionTS 38.213 cl. 10.1; the per-slot budget in Tables 10.1-2 and 10.1-3Monitoring occasionreached (periodicity,offset, duration,symbols)Apply the per-slot budget:candidates <= M_max,non-overlapping CCEs<= C_max. Drop searchspaces if exceeded.For each search space,aggregation level andcandidate m: computethe CCE set from thehash function Y_p,nFor each DCI size in thebudget (<= 4 per cell,<= 3 with C-RNTI):demodulate those CCEsand check the CRCCRC passesfor anyRNTI?Grant found. The RNTIsays what kind:C-RNTI = scheduling,CS-RNTI = SPS orconfigured grant,SFI/INT/CI = group-commonRead FDRA, TDRA, MCSand the HARQ fields;receive PDSCH at K0 ortransmit PUSCH at K2Nothing scheduled.Sleep until thenext occasion.yesno, for everycandidate and sizeThe UE has no idea whether anything was sent to it. It decodes every candidate at every size it is configured for and findsout from the CRC -- which is why the per-slot candidate and CCE limits exist, and why exceeding them silently drops searchspaces rather than failing.
Figure 3. The blind-decode procedure. The budget check happens before any decoding, and dropping a search space to fit is normal specified behaviour — not an error condition.
🧮
Worked Calculation

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.

⚠️
Common Pitfall

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

FormatPurposeRNTISearch spacePayload (bits, excl. 24-bit CRC)Introduced
0_0Uplink grant, fallbackC-RNTI, CS-RNTI, MCS-C-RNTI, TC-RNTICommon and UE-specificSize-aligned to 1_0 by paddingRel-15
0_1Uplink grant, full featuredC-RNTI, CS-RNTI, MCS-C-RNTI, SP-CSI-RNTIUE-specific≈40 … 90, configuration-dependentRel-15
0_2Uplink grant with configurable field sizes, for low latencyC-RNTI, CS-RNTI, MCS-C-RNTIUE-specificSmaller than 0_1 by configurationRel-16
1_0Downlink assignment, fallbackC-RNTI, CS-RNTI, MCS-C-RNTI, TC-RNTI, P-RNTI, SI-RNTI, RA-RNTI, MSGB-RNTICommon and UE-specificComputable exactly: 41 at 106 PRB (§6.2)Rel-15
1_1Downlink assignment, full featuredC-RNTI, CS-RNTI, MCS-C-RNTIUE-specific≈45 … 100, configuration-dependentRel-15
1_2Downlink assignment with configurable field sizesC-RNTI, CS-RNTI, MCS-C-RNTIUE-specificSmaller than 1_1 by configurationRel-16
2_0Slot format indication; Rel-16 adds available RB sets, channel occupancy duration and search-space group switchingSFI-RNTICommonConfigurable, dci-PayloadSizeRel-15
2_1Pre-emption indication — which resources were overwrittenINT-RNTICommon14 bits per configured serving cellRel-15
2_2TPC commands for PUCCH and PUSCHTPC-PUSCH-RNTI, TPC-PUCCH-RNTICommonConfigurableRel-15
2_3TPC commands for SRSTPC-SRS-RNTICommonConfigurableRel-15
2_4Uplink cancellation indicationCI-RNTICommonConfigurable, dci-PayloadSizeForCIRel-16
2_5IAB soft resource availability indicationAI-RNTICommonConfigurableRel-16
2_6Power saving information outside DRX Active Time (wake-up indication)PS-RNTICommonConfigurableRel-16
2_7Paging early indicationPEI-RNTICommonConfigurableRel-17
3_0 / 3_1Sidelink schedulingSL-RNTI, SL-CS-RNTIUE-specificRel-16
4_0 / 4_1 / 4_2Multicast (MBS) PDSCH schedulingG-RNTI, G-CS-RNTICommon and UE-specificRel-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.

📘
Spec Detail

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

DCI Format 1_0 with C-RNTI: the Exact 41-Bit LayoutDCI Format 1_0 with C-RNTI: the Exact 41-Bit Layout106-PRB bandwidth part, so the FDRA field is ceil(log2(106 x 107 / 2)) = 13 bitsbit76543210Oct 1IDFrequency domain resource assignment, bits 12..6Oct 2FDRA bits 5..0TDRA3..2Oct 3TDRA1..0VRBModulation and coding schemeOct 4NDIRVHARQ process numberDAIOct 5DAITPCPUCCHPUCCH res.indicatorK1 ind.2..1Oct 6K1end of the DCI at bit 41 -- the 24-bit CRC, scrambled by the RNTI, followsThis is the fallback format, and it is the only DCI whose size you can compute from the bandwidth part alone. DCI 0_0 ispadded to the same size so the two share a candidate. Everything larger -- 1_1, 0_1, 1_2, 0_2 -- has a size that dependson a dozen configuration choices, which is exactly why the fallback formats exist.
Figure 4. DCI 1_0 with C-RNTI, laid out bit by bit for a 106-PRB bandwidth part. Every field width here is fixed by the specification except the FDRA, which follows from the bandwidth part size alone.
FieldBitsMeaning
Identifier for DCI formats10 = 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 = 106FDRA type 1 only — a resource indication value (§7.2).
Time domain resource assignment4Row index into pdsch-TimeDomainAllocationList, giving K0, mapping type and SLIV (§8).
VRB-to-PRB mapping10 = non-interleaved, 1 = interleaved.
Modulation and coding scheme5Index into the MCS table (§9).
New data indicator1HARQ toggle — see the companion 05 HARQ document.
Redundancy version2Circular-buffer start offset.
HARQ process number40 … 15.
Downlink assignment index2Counter DAI for the dynamic HARQ-ACK codebook.
TPC command for scheduled PUCCH2−1, 0, +1, +3 dB.
PUCCH resource indicator3Which of up to eight PUCCH resources carries the HARQ-ACK.
PDSCH-to-HARQ_feedback timing indicator3Index 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

MechanismASN.1DCI fieldEffect
Cross-carrier schedulingCrossCarrierSchedulingConfigschedulingCellInfo = own {cif-Presence} or other {schedulingCellId, cif-InSchedulingCell}Carrier indicator, 0 or 3 bitsOne 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 schedulingBWP-Downlink / BWP-Uplink lists, firstActiveDownlinkBWP-Id, defaultDownlinkBWP-Id, bwp-InactivityTimerBandwidth part indicator, 0/1/2 bitsA 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.

⚠️
Common Pitfall

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.

Frequency-Domain Resource Allocation: Bitmap or IntervalFrequency-Domain Resource Allocation: Bitmap or Interval106-PRB bandwidth part, rbg-Size config1 -> P = 8 PRB, so 14 resource block groups00-718-15216-23324-31432-39540-47648-55756-63864-71972-791080-871188-951296-10313104-10500111110000110RIV 1585 -> 93 contiguous PRB starting at PRB 4['RBG index', 'and PRBs']['Type 0', '14-bit bitmap']['Type 1', 'RIV']012345678910111213Resource block group (and the PRBs it covers)Type 0 can allocate non-contiguous groups but never a partial group; Type 1 can start anywhere but must becontiguous. Neither can do both, which is why dynamicSwitch exists and costs one bit in the DCI.
Figure 5. The same bandwidth part encoded both ways. Type 0 can express gaps; Type 1 can express arbitrary edges. Neither can do both, which is why 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 config1P with config2Bitmap width at the upper end of the range
1 – 362418 bits (config1) / 9 bits (config2)
37 – 724818 / 9
73 – 14481618 / 9
145 – 275161618 / 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:

TS 38.214 cl. 5.1.2.2.2 -- resource indication value
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 ) )  bits
🧮
Worked Calculation

N = 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.

Where the Grants and the Data Actually LandWhere the Grants and the Data Actually Land30 kHz SCS, TDD DDDSU. K0 = DCI-to-PDSCH, K1 = PDSCH-to-HARQ-ACK, K2 = DCI-to-PUSCH -- all in slotsDslot 0Dslot 1Dslot 2Sslot 3Uslot 4Dslot 5Dslot 6Dslot 7Sslot 8Uslot 9DCI 1_1DCI 0_1DCI 1_1DCI 1_1DCI 1_1DCI 0_1PDSCHK0 = 0PDSCHK0 = 0PDSCHK0 = 0PDSCHK0 = 0ACKslots 0,2ACKslots 5,6PUSCHK2 = 3PUSCHK2 = 2slot typePDCCHPDSCHPUCCHPUSCH0123456789Slot within two TDD periodsK1 = 4 from slot 0, K1 = 2 from slot 2; K2 = 3 from the slot-1 grant, K2 = 2 from the slot-7 grant.Every one of these offsets is chosen from a configured table, and the only hard constraint is that the target slotactually points the right way.
Figure 6. Two TDD periods with the grants and the data they point at. K0 = 0 here, so PDSCH is in the same slot as its PDCCH; the uplink grants in slots 1 and 7 point three and two slots forward respectively, because slots 4 and 9 are the only uplink slots.
ElementWhereRangeEffect
Row indexDCI, 0–4 bitsUp to 16 rows in pdsch-TimeDomainAllocationList / pusch-TimeDomainAllocationListSelects 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 slotsDCI-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 slotsDCI-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
sametypeA or typeBType 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
same0 … 127The 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.

TS 38.214 cl. 5.1.2.1 -- start and length indicator value
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)
🧮
Worked Calculation

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

TableTS 38.214Highest modulationSpectral efficiency range (bits/RE)Design BLER targetSelected by
64QAMTable 5.1.3.1-164QAM (Q_m = 6)0.2344 … 5.5547≈10⁻¹The default when mcs-Table is absent
256QAMTable 5.1.3.1-2256QAM (Q_m = 8)0.2344 … 7.4063≈10⁻¹mcs-Table = qam256 and a DCI 1_1 in a UE-specific search space
64QAM low-SETable 5.1.3.1-364QAM (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.

🧮
Worked Calculation

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 logLikely outer-loop causeWhat to look at
MCS consistently several steps below what the CQI impliesThe offset has saturated negative — the UE reports optimistically, or interference is bursty and unpredictedFirst-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 burstThroughput 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 feedbackWhether codeBlockGroupTransmission is configured — CBG feedback changes what a "NACK" means.
MCS resets to a mid value periodicallyLoop reset on handover, on beam change, or on bwp-InactivityTimer expiryCorrelate 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.

Semi-Persistent Scheduling and Configured Grant Type 2Semi-Persistent Scheduling and Configured Grant Type 2UEgNBRRC has already configured SPS-Config (ms20, 4 HARQ processes) andConfiguredGrantConfig without rrc-ConfiguredUplinkGrant (= Type 2).cs-RNTI 0x3F02. Neither is active yet.PDCCH: DCI 1_1, CRC scrambled by CS-RNTINDI = 0, HARQ process number = 0000, RV = 00 -> an SPS *activation*, not a grant1validation fields all zero -> activation.Store FDRA, TDRA, MCS, antenna ports asthe recurring assignment.SPS PDSCH (occasion 1)no PDCCH -- the stored assignment fires. HARQ pid derived from the slot number.2PUCCH HARQ-ACK on n1PUCCH-ANand the next occasion fires 20 ms later, with no PDCCH at allPDCCH: DCI 1_1, CS-RNTI -> SPS releaseHARQ process = 0000, RV = 00, MCS = 11111, FDRA all ones3uplink: configured grant Type 2PDCCH: DCI 0_1, CRC scrambled by CS-RNTIsame validation pattern -> activate the configured uplink grant4Configured Grant Confirmation MAC CETS 38.321 cl. 6.1.3.7 -- the uplink direction *does* confirm; the downlink does not5PUSCH on the configured occasionno grant needed; HARQ pid from the CURRENT_symbol formulaPDCCH: DCI 0_1, CS-RNTI -> releaseand the UE confirms the release with the same MAC CE6configuredGrantTimerThe activation DCI carries no data and schedules nothing: its HARQ, RV and MCS fields are repurposed as a validationpattern (TS 38.213 cl. 10.2). Type 1 uplink configured grants skip steps 4-6 entirely -- rrc-ConfiguredUplinkGrant makesthem active the moment the RRC message is applied, with no DCI ever involved.
Figure 7. Activation, operation and release for both directions. The asymmetry in step 5 is worth remembering: the uplink confirms activation with a MAC control element, the downlink does not confirm at all.
DL SPSUL configured grant Type 1UL configured grant Type 2
Configured bySPS-Config in BWP-DownlinkDedicatedConfiguredGrantConfig with rrc-ConfiguredUplinkGrantConfiguredGrantConfig without rrc-ConfiguredUplinkGrant
Activated byA DCI 1_1 scrambled by cs-RNTI that passes the validation patternThe RRC message itself — active as soon as it is appliedA DCI 0_1 scrambled by cs-RNTI that passes validation
Confirmed byNothingNothingConfigured Grant Confirmation MAC CE TS 38.321 cl. 6.1.3.7
Periodicityms10, ms20, ms32, ms40, ms64, ms80, ms128, ms160, ms320, ms640; Rel-16 periodicityExt reaches down to one slotsym2, sym7, sym1x14sym5120x14 — symbol-granularSame as Type 1
HARQ processesnrofHARQ-Processes 1 … 8nrofHARQ-Processes 1 … 16Same
Process IDDerived from the slot number and the periodicityDerived from CURRENT_symbol and the periodicitySame
Released byA DCI 1_1 with cs-RNTI and the release patternAn RRC reconfigurationA DCI 0_1 with cs-RNTI and the release pattern, confirmed by the same MAC CE
Number configurableRel-15: one per BWP. Rel-16: up to 8Rel-15: one per BWP. Rel-16: up to 12 per BWPSame 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:

FieldFor activationFor releaseWhy
HARQ process numberall zeroall zeroThere is no process to name yet — the process ID is derived from timing.
Redundancy versionall zeroall zeroSame reason. An activation is not a transmission.
Modulation and coding schemethe value to use for every occasionall onesOn activation the MCS is real configuration. On release it is a sentinel.
Frequency domain resource assignmentthe PRBs to use for every occasionall 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.

⚠️
Common Pitfall

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.

MechanismASN.1ValuesBehaviour
PDSCH slot aggregationpdsch-AggregationFactor in PDSCH-Confign2, n4, n8The 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 rown2, 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 BnumberOfRepetitions in the Rel-16 PUSCH-TimeDomainResourceAllocation1 … 16Nominal 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.

🔍
What You See In Logs

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.

Pre-emption: a URLLC Mini-Slot Inside an eMBB AllocationPre-emption: a URLLC Mini-Slot Inside an eMBB Allocation30 kHz SCS; DCI 2_1 carries a 14-bit bitmap per serving cell, granularity set by timeFrequencySetSlotsslot nslot n+1PDCCHDCI 1_1UE ADCIUE BDCI 2_1+ 1_1UE AeMBB PDSCHPDSCH, 100 PRB, TBS 31 752, 4 code blocks in 4 CBGsUE BURLLCmini-slot,type B, L=2UE ArecoveryCBG 2 retransmitted, CBGTI 00100246810121416182022242628OFDM symbol across two slotsUE A's symbols 5-6 are overwritten. Without DCI 2_1 the UE would soft-combine the corrupted symbols into its bufferand poison every subsequent retransmission. The indication tells it which resources to treat as never having carriedits data -- see the companion 05 HARQ document for the CBG mechanics.
Figure 8. A two-symbol URLLC mini-slot inside a twelve-symbol eMBB allocation, and the indication that lets the victim recover. Without it the victim's retransmission would be combined with corrupted soft bits and fail repeatedly.
MechanismDCI / RNTIConfigurationWhat it says
Downlink pre-emption indicationDCI 2_1, INT-RNTIDownlinkPreemption in PDCCH-Config: int-RNTI, timeFrequencySet (set0 / set1), dci-PayloadSize, int-ConfigurationPerServingCellA 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 indicationDCI 2_4, CI-RNTIUplinkCancellation-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.

⚠️
Common Pitfall

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) in LogicalChannelConfig, 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.

PolicyMetric it maximisesBehaviourWhere it is chosen
Round robinNothing — it just rotatesEvery 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/IInstantaneous throughputAlways 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 fairRatio of achievable rate now to average rate delivered so farSchedules 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-awareRemaining packet delay budgetWeights 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-weightedA weighted combination of the above, per 5QIThe 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.

💡
Key Point

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 nameWhereRange / valuesTypicalEffect
controlResourceSetToAddModList
PDCCH-Config
1 … 3 ControlResourceSet1–2Dedicated CORESETs per BWP, on top of CORESET 0 and the common one.
frequencyDomainResources
ControlResourceSet
BIT STRING (45), each bit = 6 PRBs8–16 bits setCORESET bandwidth, and hence its CCE count and PDCCH capacity (§4).
duration
ControlResourceSet
1 … 3 symbols2Trades PDCCH capacity against symbols available for PDSCH.
searchSpacesToAddModList
PDCCH-Config
1 … 10 SearchSpace2–4UE-specific search spaces per BWP. Their searchSpaceId order decides which are dropped when the budget is exceeded.
monitoringSlotPeriodicityAndOffset
SearchSpace
sl1sl2560 with offsetsl1 or sl2PDCCH monitoring rate — the dominant term in both scheduling latency and UE power consumption.
nrofCandidates
SearchSpace
per AL 1/2/4/8/16: n0n8{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 setMore than one bit gives sub-slot monitoring, at a proportional cost in candidates.
resourceAllocation
PDSCH-Config / PUSCH-ConfigresourceAllocationType0, resourceAllocationType1, dynamicSwitchtype1Which FDRA encoding the DCI carries (§7).
rbg-Size
PDSCH-Config
config1, config2config1Resource block group granularity for FDRA type 0.
pdsch-TimeDomainAllocationList
PDSCH-Config
1 … 16 rows of {k0, mappingType, startSymbolAndLength}4–8 rowsEvery 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-Configqam256, qam64LowSEqam256Which MCS table applies to DCI 1_1/0_1 in a UE-specific search space (§9.1).
pdsch-AggregationFactor
PDSCH-Config
n2, n4, n8absentBlind slot repetition (§11).
SPS-Configperiodicity
BWP-DownlinkDedicated
ms10 … ms640; Rel-16 periodicityExt in slotsms20Downlink SPS interval. Must match the traffic's period or the saving evaporates.
ConfiguredGrantConfigperiodicity
BWP-UplinkDedicated
sym2sym5120x14sym20x14 (10 ms at 30 kHz)Uplink configured grant interval, symbol-granular.
configuredGrantTimer
ConfiguredGrantConfig
1 … 64 (units of periodicity)typically a few periodsHow long a configured-grant HARQ process stays occupied before it may be reused.
DownlinkPreemptiontimeFrequencySet
PDCCH-Config
set0, set1set0Granularity 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 falseWhether 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

FailureDetected byWhat happensDiagnostic pointer
PDCCH not decoded (blind decode fails)Nobody directlyThe 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 exceededNobodyThe UE stops monitoring UE-specific search spaces in increasing searchSpaceId order until it fits, with no signallingAdd 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 loadNobodyPDCCH blocking: UEs with data and good channels are not scheduled because no CCE combination is freeThroughput saturating below the PDSCH capability with PRBs still available. Count CCE occupancy per slot, not PRB occupancy (§4).
DCI size ambiguity after reconfigurationNeither side, immediatelyThe UE decodes with the old sizes, the gNB transmits with the new ones — so nothing decodes for a few slotsThis 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 sizeNobodyThe allocation is read as a completely different, usually impossible, set of PRBsImplausible 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 wantsgNBThe scheduler falls back to a row that does exist, so allocations cluster on a few shapesA 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 validationNobody at allThe 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 sendUEThe UE transmits padding, or skips the grant if skipUplinkTxDynamic allows itWasted uplink capacity, and interference to neighbours. Check the periodicity against the actual traffic period.
Bandwidth part switch mid-burstUE and gNB, but asynchronouslyDuring the switching delay the UE can neither receive nor transmit; afterwards it is monitoring a different set of search spacesCorrelate throughput dips against bwp-InactivityTimer expiry and bandwidth part indicator values, not against radio conditions (§6.4).
Pre-emption without a DCI 2_1NobodyThe victim UE soft-combines corrupted symbols and its retransmissions fail repeatedlyA HARQ process that fails on every redundancy version despite good reported CQI. Check whether DownlinkPreemption is configured at all (§12.2).
Outer loop saturatedNobodyMCS is pinned several steps below what the CQI implies, or first-transmission BLER sits far from targetCompare 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.

💡
Key Point

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

🔍
About These 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

[RRC-DL-DCCH] RRCReconfiguration -- pdcch-Config and pdsch-Config
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  n1

Listing 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

[PHY/MAC] downlink grant
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 blocks

Listing 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

[MAC/PHY] uplink grant from 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 queued

Listing 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

[MAC/PHY] SPS activation, operation 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

[RRC/PHY] blind-decode budget exceeded
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

ReleaseChangeWhy it matters when reading scheduling
Rel-15CORESETs 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 schedulingThe baseline. Everything in §§4–11 is Rel-15.
Rel-16DCI 0_2 and 1_2 with configurable field sizes, and separate dl-DataToUL-ACK, TDRA and MCS configuration for themTwo DCI sizes can now schedule the same channel with different field widths. A decoder that assumes one layout per format will misparse.
Rel-16DCI 2_4 / CI-RNTI uplink cancellation; UplinkCancellation-r16The uplink can now be pre-empted prospectively, so a granted PUSCH that never appears is not necessarily a UE failure (§12.2).
Rel-16Physical-layer priority indicator in DCI 0_1/1_1; intra-UE prioritisation and UCI multiplexing rulesA dropped PUCCH or PUSCH can now be correct behaviour, decided by a single bit (§12.3).
Rel-16PUSCH repetition Type B; up to 16 repetitions; numberOfRepetitions in the TDRA rowRepetitions are no longer slot-aligned or equal in length, so counting transmissions per transport block needs care (§11).
Rel-16Multiple SPS and configured-grant configurations per BWP (up to 8 and 12); periodicityExt down to one slot; harq-ProcID-OffsetSeveral 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-16NR-U: DCI 2_0 extended with available RB sets, channel occupancy duration and search-space group switching; DCI 2_5 for IABPDCCH monitoring can now change group dynamically, so the search spaces a UE monitors are not constant across a trace.
Rel-17DCI 2_7 / PEI-RNTI paging early indication; DCI 4_0/4_1/4_2 for multicast; 480 and 960 kHz numerologiesNew RNTIs and formats in common search spaces, and blind-decode budgets at numerologies the tables in §5.3 do not cover.
Rel-17Coverage enhancement: PUSCH repetition with TBS determination over multiple slots, joint channel estimationA transport block can span slots, so "one grant, one slot" no longer holds.
Rel-18Multi-cell scheduling with a single DCI; further MBS and NTN work; network energy saving with dynamic adaptation of transmission patternsOne 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

TermExpansionMeaning in this document
CORESETControl Resource SetA rectangle of PRBs × 1–3 symbols in which PDCCH may be transmitted. Sized in CCEs (§4).
REGResource Element GroupOne PRB in one OFDM symbol: 12 REs, 3 of them PDCCH DMRS.
CCEControl Channel Element6 REGs. The allocation quantum for PDCCH.
Aggregation levelHow many CCEs one PDCCH occupies: 1, 2, 4, 8 or 16. The control-channel reliability knob.
Search spaceWhen the UE looks for PDCCH, at which aggregation levels, with how many candidates, and for which DCI formats (§5).
Blind decodingDemodulating every candidate at every configured DCI size and letting the CRC decide. Bounded by M_max and C_max (§5.3).
DCIDownlink Control InformationThe payload of a PDCCH. Carries the grant, or a group-common indication (§6).
FDRAFrequency Domain Resource AssignmentThe DCI field naming the PRBs. Type 0 is an RBG bitmap, Type 1 an RIV (§7).
RBGResource Block GroupP consecutive PRBs, one bit of the type 0 bitmap. P is 2, 4, 8 or 16.
RIVResource Indication ValueA single integer encoding a contiguous (start, length) pair, in two branches (§7.2).
SLIVStart and Length Indicator ValueA single integer encoding a starting symbol and a symbol count, in two branches (§8).
TDRATime Domain Resource AllocationThe configured table of {K0 or K2, mapping type, SLIV} rows the DCI indexes into.
K0 / K1 / K2Slot offsets: DCI→PDSCH, PDSCH→HARQ-ACK, DCI→PUSCH.
Mapping type A / BSlot-based versus mini-slot allocation, distinguished by where DMRS sits and what starting symbols are legal (§8).
MCSModulation and Coding SchemeA 5-bit index into one of three tables giving modulation order and target code rate (§9.1).
OLLAOuter Loop Link AdaptationA per-UE MCS offset driven by HARQ feedback. Universal, and specified nowhere (§9.3).
SPSSemi-Persistent SchedulingA recurring downlink assignment, activated by a DCI addressed to cs-RNTI (§10).
Configured grantThe uplink counterpart. Type 1 is activated by RRC, Type 2 by a DCI.
cs-RNTI
Configured Scheduling RNTIThe 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-emptionOverwriting 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.213Physical 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.212Multiplexing 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.214Physical 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.211Physical 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.321MAC 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 Confirmation MAC CE).
  • 3GPP TS 38.331RRC 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.300NR overall description. Clause 10 (scheduling and rate control, including the explicit statement that the scheduling algorithm is implementation-specific).
  • 3GPP TS 23.501System 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 AdvancetimeAlignmentTimer expiry 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.