CORESET & Search Spaces in 5G NR
Where and when the UE hunts for PDCCH — control resource sets, search spaces, CCEs and aggregation levels.
Before a UE can be scheduled it has to know where to look for the grant. That question has two halves, and NR answers them with two separate objects. A control resource set answers where: a set of resource blocks over one, two or three OFDM symbols, plus the rules that map control channel elements onto them. A search space answers when and how hard: a monitoring periodicity, an offset, a symbol bitmap within the slot, and a candidate count per aggregation level. Neither is useful alone, and a search space that points at a CORESET the UE does not have is simply inert -- no error, no indication, just a UE that never receives a grant. This document works through both IEs field by field, decodes a real 45-bit frequencyDomainResources bitmap to a PRB set, computes the interleaved CCE-to-REG mapping by hand, derives monitoring occasions twice from real configuration, and catalogues the eleven configuration faults that produce a UE with a healthy radio and no grants.
Contents
- 01The Bootstrapping Problem: Why Control Resources Come First
- 02The Unit Hierarchy: REG, REG Bundle and CCE
- 03ControlResourceSet, Field by Field
- 04frequencyDomainResources: The 45-Bit Bitmap, Decoded
- 05CCE-to-REG Mapping: Interleaved and Non-Interleaved
- 06Precoder Granularity, DMRS Scrambling and Beam Indication
- 07CORESET#0: The One You Get Before You Know Anything
- 08How Many CORESETs, and Where They Are Scoped
- 09SearchSpace, Field by Field
- 10The Search Space Types: Type0 to Type3 and UE-Specific
- 11Aggregation Levels and What They Buy
- 12Monitoring Occasions: From Three Fields to a Set of Slots
- 13Monitoring Against the TDD Pattern, DRX and BWP Switching
- 14Multi-Slot Monitoring, Spans and the Rel-16 Capability
- 15Where This Hands Off to Blind Decoding
- 16Parameter and Range Reference
- 17Failure Modes, and What Each Looks Like in a Log
- 18ASN.1 Structures
- 19Worked Arithmetic
- 20Illustrative Message Traces
- 21Release Deltas: Rel-15 to Rel-18
- 22Reading CORESET and Search Space in Logs: A Checklist
- 23Glossary
- 24References
1. The Bootstrapping Problem: Why Control Resources Come First
Almost everything in NR is scheduled. A UE receives downlink data because a DCI told it to; it transmits uplink data because a DCI granted it resources. The DCI arrives on PDCCH. So the first question any UE must answer, before it can participate in the cell at all, is: where in the resource grid is PDCCH, and when should I look?
That question cannot be answered by a grant, because a grant is the thing being looked for. It has to be answered by configuration, and the configuration has to arrive by a path that does not itself require a grant. NR solves this in three stages, each one bootstrapping the next:
| Stage | What the UE knows | How it learned it | What it can do next |
|---|---|---|---|
| After PSS/SSS/PBCH decode | One CORESET (CORESET#0) and one search space (searchSpaceZero) | pdcch-ConfigSIB1 in the MIB, four bits each, indexing tables in TS 38.213 cl. 13 | Monitor Type0-PDCCH for SI-RNTI and receive SIB1 |
| After SIB1 decode | The common CORESET and the common search spaces of the initial DL BWP | PDCCH-ConfigCommon inside initialDownlinkBWP | Random access (Type1), paging (Type2), other SI (Type0A) |
| After RRC (re)configuration | Up to three more CORESETs and up to ten search spaces per bandwidth part | PDCCH-Config inside BWP-DownlinkDedicated | Ordinary UE-specific scheduling with the full-featured DCI formats |
Table 1. The three-stage bootstrap. Each stage's PDCCH configuration is delivered on a channel that the previous stage's PDCCH configuration made receivable.
The consequence is worth stating plainly, because it shapes every diagnosis in this document. A UE that cannot find PDCCH has no way to tell anyone. There is no negative acknowledgement for a missed monitoring occasion, no counter the UE reports, no measurement that captures it. The uplink itself depends on a grant. What the network sees is silence, and silence is indistinguishable from a UE that has gone away. This is why a misconfigured CORESET or search space presents as an unresponsive UE in perfect radio conditions, and why the fault is so often chased in the wrong layer.
The division of labour between the two objects is worth memorising because the field names do not make it obvious. CORESET = where in time and frequency, and the internal mapping of CCEs onto resource elements. Search space = which slots and symbols, how many candidates at each aggregation level, and which DCI formats to expect. A CORESET with no search space pointing at it is dead space in the grid; a search space with no valid CORESET is a monitoring instruction with nowhere to monitor.
controlResourceSetId is not signalled as an error, and the search space simply produces no candidates.1.1 What invokes this machinery
CORESET and search space configuration is re-evaluated, in whole or in part, at every one of these events -- which is a longer list than most readers expect, and each entry is a place where a stale or inconsistent configuration can take effect:
- Initial cell selection, from
pdcch-ConfigSIB1in the MIB. - SIB1 acquisition, which installs
PDCCH-ConfigCommonfor the initial DL BWP. - RRC setup, resume or reestablishment, which installs
PDCCH-Configfor each configured dedicated BWP. - Any BWP switch -- by DCI BWP indicator, by
bwp-InactivityTimerexpiry, or by RRC. The CORESETs and search spaces of the new BWP replace those of the old one wholesale; nothing carries over. See the companion 02 Radio Frame Structure document for the BWP machinery. - SCell addition or activation, each of which brings its own
PDCCH-Configper BWP; cross-carrier scheduling changes which cell's CORESET carries which cell's grants (companion 29 Carrier Aggregation). - Handover, where the target cell's
PDCCH-Configarrives insidereconfigurationWithSyncand takes effect at the same moment as the new C-RNTI. - Search space group switching (Rel-16), which flips the UE between two sets of search spaces without an RRC message.
- Beam failure recovery, after which the CORESET's TCI state may be updated by MAC CE while the CORESET itself is unchanged.
2. The Unit Hierarchy: REG, REG Bundle and CCE
PDCCH is not allocated in resource elements, and not in resource blocks either. It is allocated in control channel elements, and a CCE is built from smaller units in a fixed hierarchy that every other number in this document depends on.
| Unit | Definition | Size | What it is the unit of |
|---|---|---|---|
| RE | One subcarrier in one OFDM symbol | 1 subcarrier x 1 symbol | Nothing, at this layer -- the grid's atom |
| REG | One resource block in one OFDM symbol | 12 REs: 3 DMRS + 9 data | Counting. A CORESET's size is measured in REGs TS 38.211 cl. 7.3.2.2 |
| REG bundle | reg-BundleSize consecutive REGs | 2, 3 or 6 REGs | Interleaving and precoding. The UE may assume one precoder across a bundle, so it may average DMRS across it |
| CCE | Six REGs, in 6 / reg-BundleSize bundles | 72 REs: 18 DMRS + 54 data | PDCCH allocation. Every PDCCH occupies a power-of-two number of CCEs |
| PDCCH candidate | L contiguous-in-CCE-index CCEs | L = 1, 2, 4, 8 or 16 CCEs | Blind decoding. One decode attempt by the UE |
Table 2. The hierarchy, bottom to top. The DMRS fraction is fixed at one RE in four within every REG, which is why the usable-bits arithmetic in §11 uses 9 rather than 12 REs per REG.
reg-BundleSize n2, 8 CCEs. The REG numbering is time-first, which matters when you hand-decode a bundle: REG 0 and REG 1 are the same PRB in different symbols, not adjacent PRBs.2.1 The two arithmetic facts worth memorising
CORESET size in CCEs = N_PRB x duration / 6
48 PRB x 1 symbol = 48 REGs = 8 CCEs
48 PRB x 2 symbols = 96 REGs = 16 CCEs
24 PRB x 3 symbols = 72 REGs = 12 CCEs
96 PRB x 1 symbol = 96 REGs = 16 CCEs
Usable coded bits per CCE, QPSK: 6 REGs x 9 data REs x 2 bits/RE = 108 bits
PDCCH is always QPSK -- there is no modulation adaptation on the control channel, because there is no reliable per-UE channel report at the moment the control channel has to be sent. The only lever the gNB has is the number of CCEs (§11).
Because a CORESET's CCE count is N_PRB x duration / 6, the same CCE capacity can be bought in two shapes: wide and short, or narrow and long. They are not equivalent. A wide, one-symbol CORESET gives each CCE more frequency diversity and leaves symbols 1 and 2 free for PDSCH, but it forces the UE to buffer and process the whole carrier bandwidth in symbol 0. A narrow, three-symbol CORESET concentrates the control region in a small part of the band -- convenient for a beamformed FR2 cell -- but it delays the earliest possible PDSCH start to symbol 3 and caps the frequency diversity any single CCE can obtain.
duration = 3 is legal but rare in FR1 deployments, and it interacts badly with two other things. It forces reg-BundleSize to n3 or n6 (n2 is not permitted at duration 3), and it pushes the earliest PDSCH start symbol to 3, which removes the low-latency SLIV options that mini-slot scheduling depends on -- see the companion 32 SLIV and Time Domain Allocation document. If you see duration 3 in an FR1 configuration, it is usually there to buy CCE capacity in a narrow CORESET, and the latency cost is usually unintended.
3. ControlResourceSet, Field by Field
ControlResourceSet is a small IE -- nine fields, three of them optional -- and every one of them changes something observable. It appears in three places: controlResourceSetZero (as an index, not a structure), commonControlResourceSet inside PDCCH-ConfigCommon, and controlResourceSetToAddModList inside PDCCH-Config.
| Field | Type and range | Typical | What it decides |
|---|---|---|---|
controlResourceSetId | INTEGER (0..11) -- maxNrofControlResourceSets-1 | 1 or 2 for dedicated | Identity within the cell, and the value a SearchSpace points at. Id 0 is reserved for CORESET#0 and must not be configured explicitly. It also seeds nothing -- unlike LTE, the id is not used in the hashing function, which uses the CORESET index p. |
frequencyDomainResources | BIT STRING (SIZE (45)) | 8-16 bits set | Which 6-PRB groups the CORESET occupies. §4 decodes one in full. |
duration | INTEGER (1..3) symbols | 2 | How many consecutive OFDM symbols, starting at the search space's first monitoring symbol. Multiplies the CCE count and delays PDSCH. |
cce-REG-MappingType | CHOICE { interleaved, nonInterleaved } | interleaved | Whether a CCE's REGs are contiguous or spread across the CORESET. §5. |
reg-BundleSize | ENUMERATED {n2, n3, n6} (inside interleaved) | n6 | Bundle size in REGs. n2/n6 at duration 1-2; n3/n6 at duration 3. Also the precoder granularity when precoderGranularity = sameAsREG-bundle. |
interleaverSize | ENUMERATED {n2, n3, n6} (inside interleaved) | n2 | The block interleaver's row count R. With reg-BundleSize it fixes how far apart a CCE's bundles land. |
shiftIndex | INTEGER (0..274), optional (inside interleaved) | the physical cell id | Cyclic shift n_shift applied after interleaving. Its purpose is inter-cell decorrelation; defaults to the physical cell id when absent. |
precoderGranularity | ENUMERATED { sameAsREG-bundle, allContiguousRBs } | sameAsREG-bundle | How wide a span the UE may assume one precoder over, and therefore how far it may average DMRS. §6. |
pdcch-DMRS-ScramblingID | INTEGER (0..65535), optional | the physical cell id | Initialises the PDCCH DMRS sequence. Must match between gNB and UE exactly or channel estimation fails. §6.2. |
tci-StatesPDCCH-ToAddList | SEQUENCE (SIZE (1..64)) OF TCI-StateId, optional | one entry | Which TCI state -- i.e. which downlink beam -- the CORESET is transmitted on. §6.3. |
tci-PresentInDCI | ENUMERATED {enabled}, optional | absent | Whether DCI 1_1 scheduled from this CORESET carries a TCI field for the PDSCH. Affects the DCI size, so it must be consistent or the blind decode fails on length. |
Table 3. ControlResourceSet, TS 38.331. The interleaved branch's three fields are absent when nonInterleaved is chosen -- they are inside the CHOICE, not siblings of it.
tci-PresentInDCI is a CORESET field that changes a DCI length. Every DCI format has a size that both sides compute from configuration, and the UE blind-decodes against exactly those computed sizes. Change tci-PresentInDCI on the CORESET and DCI 1_1's size changes by three bits; if the gNB's view and the UE's view of that field diverge -- typically because a reconfiguration was applied at different times on the two sides -- every DCI 1_1 fails CRC at the UE while DCI 1_0 keeps working. Symptom: fallback scheduling only, at low throughput, with no radio problem. See the companion 31 PDCCH Blind Decoding document for the size-alignment rules.
4. frequencyDomainResources: The 45-Bit Bitmap, Decoded
frequencyDomainResources is the single field most often mis-read, because three separate things about it are non-obvious: the granularity is six PRBs and not one, the bit order is most-significant-first, and the reference point is the bandwidth part rather than the carrier.
- Granularity: each bit enables a group of six consecutive PRBs. 45 bits x 6 PRBs = 270 PRBs, which covers the widest NR carrier (275 PRBs) to within one partial group.
- Order: the first, left-most, most significant bit corresponds to the lowest-frequency group. This is the opposite of the intuition most engineers bring from hex dumps, where bit 0 is the LSB.
- Reference point: grouping starts from the first RB group of the bandwidth part in which the CORESET is configured TS 38.331, `ControlResourceSet` field description. For CORESET#0 the reference is the lowest RB of CORESET#0 itself, since no wider BWP exists yet.
- Constraint: bits corresponding to a group not fully contained in the BWP must be set to zero. A CORESET therefore cannot start at an arbitrary PRB, and cannot straddle the BWP edge.
4.1 The decode, step by step
Given: BWP 1 has locationAndBandwidth decoding to start CRB 12, 106 PRBs.
Given: frequencyDomainResources = 0x3F C0 00 00 00 00 (six octets, 45 bits + 3 pad).
Step 1 -- write out the first two octets in binary, MSB first:
0x3F = 0011 1111 -> b0=0 b1=0 b2=1 b3=1 b4=1 b5=1 b6=1 b7=1
0xC0 = 1100 0000 -> b8=1 b9=1 b10..b15 = 0
Step 2 -- bits set: b2 through b9, eight bits.
Step 3 -- group g covers BWP RB 6g .. 6g+5:
b2 -> BWP RB 12..17 b6 -> BWP RB 36..41
b3 -> BWP RB 18..23 b7 -> BWP RB 42..47
b4 -> BWP RB 24..29 b8 -> BWP RB 48..53
b5 -> BWP RB 30..35 b9 -> BWP RB 54..59
Step 4 -- contiguous, so the CORESET is BWP RB 12..59 = 48 PRBs.
Step 5 -- add the BWP start to get common resource blocks:
CRB 12 + 12 = CRB 24 .. CRB 71
Step 6 -- with duration = 2: 48 x 2 = 96 REGs = 16 CCEs
Nothing in the encoding requires the set bits to be contiguous. A bitmap of 0x21 00 00 00 00 00 -- b2 and b7 set -- gives a CORESET of two disjoint 6-PRB islands, 30 PRBs apart. That is legal and occasionally deliberate: it buys frequency diversity for a non-interleaved CORESET without widening the total allocation. It also makes the CCE count arithmetic (12 PRBs x duration / 6) easy to get wrong by eye, because the CORESET looks wider than it is.
The BWP-relative reference point is the classic decode error, and it is silent. Decode the same bitmap against CRB 0 instead of the BWP start and you place the CORESET 12 PRBs too low in the example above -- a self-consistent but wrong answer, which then makes every CCE index and every DMRS position wrong too. If your hand-decode of a CORESET disagrees with a PHY trace by a constant PRB offset, this is why: check the BWP's locationAndBandwidth first, not the bitmap.
4.2 Why groups of six
Six is not arbitrary. A CCE is six REGs, and at duration = 1 a CCE is therefore exactly six PRBs. Making the frequency granularity six PRBs guarantees that a one-symbol CORESET always contains a whole number of CCEs, with no remainder REGs to define away. At duration 2 and 3 the same bitmap yields 12 and 18 REGs per bit respectively, both multiples of six, so the property holds for every legal duration. It is also why a 45-bit bitmap suffices for a 275-PRB carrier: the last two PRBs of the widest carrier cannot form a full group, and are simply not addressable as control resources.
5. CCE-to-REG Mapping: Interleaved and Non-Interleaved
Having decided which REGs belong to the CORESET, something must say which of them make up CCE 0, which make up CCE 1, and so on. cce-REG-MappingType is that something, and the choice between its two branches is one of the few genuinely consequential PDCCH decisions a planner makes.
5.1 Why interleaving exists at all
Every other physical channel in NR can be adapted to the channel. PDSCH gets an MCS chosen from CSI feedback; PUSCH gets an MCS and a power command from measured SINR; even PUCCH has a closed power loop. PDCCH has none of that at the moment it matters. The gNB must transmit the grant before the UE has said anything about this slot, and in the worst case -- initial access, or a UE that has been silent through DRX -- before it has said anything at all. The only protections available are coding gain (more CCEs, §11) and frequency diversity.
Interleaving buys the second one. If a CCE's six REGs sit in six adjacent PRBs and the channel has a notch there, the whole CCE is lost and no amount of aggregation within that notch helps. Spread the same six REGs across the CORESET's whole bandwidth in bundles and a notch damages a fraction of the CCE, which the channel code can absorb. This is the same argument as frequency-hopping for PUSCH, applied to a channel that cannot hop because it has no feedback loop to hop away from anything.
5.2 The interleaver, computed by hand
The mapping is a block interleaver on bundle indices, followed by a cyclic shift TS 38.211 cl. 7.3.2.2:
Bundles: N_bundle = N_REG / L L = reg-BundleSize Columns: C = N_REG / (L * R) R = interleaverSize f(x) = ( r*C + c + n_shift ) mod N_bundle where x = c*R + r, r = 0..R-1, c = 0..C-1 CCE j is made of bundles f(6j/L), f(6j/L + 1), ... , f(6j/L + 6/L - 1) n_shift = shiftIndex if present, else the physical cell identity 6/L = bundles per CCE: 3 at L=2, 2 at L=3, 1 at L=6
CORESET: 24 PRB x 1 symbol = 24 REGs. reg-BundleSize n2 (L = 2), interleaverSize n3 (R = 3), shiftIndex 0.
N_bundle = 24 / 2 = 12 bundles. C = 24 / (2 x 3) = 4 columns.
Bundles per CCE = 6 / 2 = 3. CCEs = 24 / 6 = 4.
x : 0 1 2 3 4 5 6 7 8 9 10 11
c : 0 0 0 1 1 1 2 2 2 3 3 3 (c = floor(x/3))
r : 0 1 2 0 1 2 0 1 2 0 1 2 (r = x mod 3)
f(x): 0 4 8 1 5 9 2 6 10 3 7 11 (f = 4r + c)
CCE 0 = bundles f(0), f(1), f(2) = 0, 4, 8
CCE 1 = bundles f(3), f(4), f(5) = 1, 5, 9
CCE 2 = bundles f(6), f(7), f(8) = 2, 6, 10
CCE 3 = bundles f(9), f(10), f(11) = 3, 7, 11
Bundle b occupies PRB 2b and 2b+1, so CCE 0 lands on PRB 0-1, 8-9 and 16-17: three 2-PRB chunks spread across the full 24 PRBs. The non-interleaved answer for the same CORESET is CCE 0 = PRB 0-5, and nothing else.
5.3 Choosing between them
| interleaved | nonInterleaved | |
|---|---|---|
| What a CCE looks like | 6/L bundles scattered across the CORESET bandwidth | 6 consecutive REGs -- one contiguous block per CCE |
| Buys | Frequency diversity against notches and narrowband interference | Frequency selectivity: the gNB can place a CCE where it knows the UE is strong |
| Needs | Nothing -- it is the safe default with no UE knowledge | A usable estimate of the UE's per-sub-band channel, i.e. wideband CSI or a narrow beam |
Interacts with precoderGranularity | Forces sameAsREG-bundle in practice -- allContiguousRBs is meaningless when a CCE is not contiguous | Pairs naturally with allContiguousRBs, which lets the UE average DMRS across the whole CORESET |
| Right choice for | Common CORESETs, CORESET#0, any wideband FR1 macro cell, any cell where UEs in poor coverage must be reachable | Narrow analogue-beamformed FR2 CORESETs, and CORESETs dedicated to a small set of well-characterised UEs |
| Inter-cell behaviour | shiftIndex decorrelates the mapping between neighbours, so two cells' CCE 0 do not collide slot after slot | No decorrelation available -- CCE 0 is PRB 0-5 in every cell using the same CORESET geometry |
Table 4. The trade is diversity against selectivity, and the deciding question is whether the gNB knows anything useful about this UE's channel at the moment it must send the DCI.
shiftIndex defaults to the physical cell identity when absent, which is almost always the right answer. Setting it explicitly to the same value in neighbouring cells -- easy to do when a template is cloned across a cluster -- makes the interleaver identical in both, so a CCE in cell A collides with the same CCE in cell B on every slot. The result is systematic rather than random PDCCH interference: BLER that is stubbornly high for particular UEs and does not improve with aggregation level, because raising the aggregation level in both cells raises the collision footprint in both. Symptom in logs: PDCCH BLER correlated with the neighbour's load rather than with the serving RSRP.
6. Precoder Granularity, DMRS Scrambling and Beam Indication
6.1 precoderGranularity
PDCCH is demodulated from its own DMRS, carried in three of every twelve REs of every REG. Three pilots per REG is not many, so the UE wants to average across as many REGs as it legitimately can -- and the constraint on legitimately is that averaging is only valid where the transmitted precoder is constant. precoderGranularity is the network telling the UE how wide that span is:
| Value | The UE may assume | Channel estimation | Costs the gNB |
|---|---|---|---|
sameAsREG-bundle | One precoder per REG bundle -- 2, 3 or 6 REGs | Averaging limited to the bundle: 6, 9 or 18 pilot REs. Noisier estimate, especially at reg-BundleSize n2 | Nothing. The gNB may precode each bundle differently, which is what makes per-bundle beam cycling possible |
allContiguousRBs | One precoder across every set of contiguous RBs in the CORESET | Averaging across the whole contiguous span -- often 48 PRBs' worth of pilots. Materially better estimate at low SINR | Its freedom. One precoder for the whole CORESET means no per-bundle or per-UE beamforming inside it |
Table 5. precoderGranularity, TS 38.211 cl. 7.3.2.2 and TS 38.214. With allContiguousRBs the UE may additionally assume the DMRS is present in every RB of the contiguous span, including RBs carrying no PDCCH for it -- which is where the extra pilots come from.
The pairing matters more than either value alone. allContiguousRBs with nonInterleaved mapping is a coherent design: one precoder, one contiguous CORESET, maximum pilot averaging, and the gNB steering the whole control region as a unit -- exactly what an FR2 cell with analogue beamforming wants. allContiguousRBs with interleaved mapping is legal but self-defeating: you have asked the UE to assume a constant precoder across a span while deliberately scattering each CCE across that same span, so you pay the diversity cost of interleaving and give up the beamforming freedom you interleaved to exploit.
6.2 pdcch-DMRS-ScramblingID
The PDCCH DMRS sequence is a pseudo-random sequence initialised from pdcch-DMRS-ScramblingID (0..65535) when the field is present, and from the physical cell identity when it is absent. Two facts follow, and both show up in diagnosis:
- It is a CORESET-level parameter, not a cell-level one. Two CORESETs in the same cell may use different scrambling ids, and CORESET#0 always uses the physical cell identity because there is nowhere to configure anything else.
- A mismatch is total, not gradual. Channel estimation using the wrong pilot sequence does not produce a degraded estimate; it produces noise. Every PDCCH in that CORESET fails, at every aggregation level, regardless of SINR. There is no partial failure mode.
Two neighbouring cells that share a pdcch-DMRS-ScramblingID interfere in channel estimation, not merely in energy. A UE estimating the channel from a pilot sequence that a neighbour is also transmitting will produce an estimate that is a superposition of two channels, and the resulting equalisation error affects the data REs too. This is strictly worse than uncorrelated interference of the same power. It is also easy to create accidentally: leave the field absent and it follows the physical cell identity, which is unique; set it explicitly from a shared template and it is not.
6.3 tci-StatesPDCCH-ToAddList
In FR2, and increasingly in FR1 with many-antenna arrays, a CORESET is not received omnidirectionally -- it arrives on a beam, and the UE has to point its own receive beam at it. tci-StatesPDCCH-ToAddList gives the list of TCI state identities that may be activated for the CORESET; the active one is then chosen by a TCI States Indication for UE-specific PDCCH MAC CE TS 38.321 cl. 6.1.3.15, which is a MAC control element and not an RRC message.
| Aspect | Detail | Why it matters diagnostically |
|---|---|---|
| Configured set | 1..64 TCI-StateId values, each dereferencing a TCI-State in PDSCH-Config | The list is a menu, not a selection. A CORESET with two entries and no activation MAC CE received has an undefined beam in practice |
| Activation | One TCI state active at a time per CORESET, set by MAC CE | The change takes effect after the HARQ-ACK for the MAC CE plus an application delay -- a window in which the two sides disagree |
| Quasi-colocation | Type D QCL: the UE derives its receive spatial filter from the referenced SSB or CSI-RS | If the referenced source is stale -- a beam the UE can no longer hear -- the CORESET becomes unreceivable while every configured field remains valid |
| Default when absent | The UE assumes the QCL of the CORESET with the lowest controlResourceSetId in the latest slot in which it monitored one TS 38.213 cl. 10.1 | This default is why a CORESET can work by accident and then stop when the lowest-id CORESET's beam changes |
| Beam failure interaction | Beam failure recovery re-points the CORESET indirectly, by giving the UE a new candidate beam | See the companion 12 Beam Failure Recovery document. A CORESET beam problem and a beam failure are the same physical event seen from two layers |
Table 6. Beam indication on a CORESET. The configuration is RRC; the selection is MAC; the consequence is physical.
A TCI state on a CORESET that the UE cannot receive is the hardest of the failure modes in §17 to diagnose, because every layer above the physical one looks correct. RRC has acknowledged the configuration, the MAC CE was acknowledged, the CORESET's fields are all in range, and the UE's serving-cell RSRP is fine -- measured on a different beam. The tell is that the UE keeps responding to anything sent on a CORESET with a different or default TCI state, typically CORESET#0, while the dedicated CORESET produces nothing.
7. CORESET#0: The One You Get Before You Know Anything
CORESET#0 is the exception to everything in §3 and §4. It is not configured by a ControlResourceSet IE, it does not have a frequencyDomainResources bitmap, and its controlResourceSetId of 0 cannot be used by anything else. It exists because of the bootstrap problem in §1: the UE must monitor a PDCCH to receive SIB1, and SIB1 is where PDCCH configuration lives.
What the UE has instead is eight bits in the MIB. pdcch-ConfigSIB1 is a SEQUENCE of two INTEGER (0..15) fields: controlResourceSetZero and searchSpaceZero. Four bits index a row of a lookup table in TS 38.213 clause 13, selected by the SSB and CORESET#0 subcarrier spacing pair and the frequency range; the row gives the multiplexing pattern, the number of resource blocks, the number of symbols and the RB-level offset from the SSB. The other four bits index a second table giving the monitoring occasion in time. The companion 18 MIB and SIB1 IEs document owns the decode of pdcch-ConfigSIB1 and the table lookups; this section covers what the resulting CORESET is.
| Property | CORESET#0 | A configured CORESET |
|---|---|---|
| Where it comes from | controlResourceSetZero, 4 bits in the MIB, through TS 38.213 Tables 13-1 to 13-10 | A ControlResourceSet IE in SIB1 or a dedicated reconfiguration |
| Bandwidth | 24, 48 or 96 RB -- whatever the table row says | Any multiple of 6 RB, from the 45-bit bitmap |
| Duration | 1, 2 or 3 symbols, from the table row | 1, 2 or 3 symbols, from duration |
| Frequency position | An RB offset relative to the SSB, from the table row, plus k_SSB subcarriers from the MIB | Absolute, from the bitmap and the BWP start |
| CCE-to-REG mapping | Fixed: interleaved, reg-BundleSize 6, interleaverSize 2, shiftIndex = the physical cell identity TS 38.211 cl. 7.3.2.2 | Whatever cce-REG-MappingType says |
precoderGranularity | Fixed: sameAsREG-bundle | Either value |
| DMRS scrambling | Fixed: the physical cell identity | pdcch-DMRS-ScramblingID, or the physical cell identity if absent |
| Beam | The SSB the UE used to acquire the cell -- QCL is implicit | tci-StatesPDCCH-ToAddList plus a MAC CE activation |
| Also defines | The initial downlink BWP when the UE has no dedicated configuration: the initial BWP's bandwidth is CORESET#0's | Nothing beyond itself |
Table 7. CORESET#0 against a configured CORESET. Everything that would normally be a field is either a table lookup or a fixed value, because there is nowhere to signal it.
k_SSB from the MIB adds the sub-RB part -- which is why the two can be misaligned by a fraction of an RB if k_SSB is misread.7.1 The multiplexing patterns
The table row also gives one of three SS/PBCH block and CORESET multiplexing patterns, which decide how the SSB and CORESET#0 share time and frequency TS 38.213 cl. 13:
| Pattern | Arrangement | Where it is used | Consequence |
|---|---|---|---|
| 1 | TDM: CORESET#0 in different symbols from the SSB, overlapping or adjacent in frequency | FR1 and FR2, the common case | The Type0-PDCCH monitoring window straddles two consecutive slots starting from the SSB's slot |
| 2 | FDM: CORESET#0 beside the SSB in frequency, in the same symbols | FR2 only, with 120/60 or 240/120 kHz SSB/CORESET SCS pairs | CORESET#0 monitoring is confined to the SSB's own symbols, so the occasion is very short |
| 3 | FDM, with CORESET#0 in the same symbols as the SSB and a different offset rule | FR2 only, 120/120 kHz | Same as pattern 2 in effect; the difference is the offset table used |
Table 8. Multiplexing patterns. Pattern 1 is what almost every FR1 deployment uses; patterns 2 and 3 exist because at FR2 numerologies a TDM arrangement would cost too many symbols.
CORESET#0 has to fit in the carrier at the SSB's position, and this is a planning constraint rather than a configuration one. A 96-RB CORESET#0 at 30 kHz needs 34.56 MHz of contiguous spectrum around the SSB; put the SSB near the edge of a 40 MHz carrier and the offset from the table can place part of CORESET#0 outside the carrier. The UE's behaviour is then undefined in the useful sense -- it will attempt to receive resource blocks that do not exist, channel estimation is corrupted by the missing band, and SIB1 never decodes. Symptom: UEs acquire the SSB (PSS/SSS correlate, MIB decodes) and then never progress to SIB1, at good RSRP, on one particular carrier position. The fix is to move the SSB or choose a smaller controlResourceSetZero row, not to touch anything in SIB1.
7.2 Why CORESET#0 keeps mattering after SIB1
It is tempting to treat CORESET#0 as scaffolding that gets discarded once dedicated configuration arrives. It does not. CORESET#0 remains the CORESET used for Type0-PDCCH in the initial DL BWP, which means it remains in use for SI acquisition and SI change monitoring; if the UE-specific configuration does not include a common search space for paging, it remains in use for paging as well. And because its controlResourceSetId is 0, it is by definition the lowest-id CORESET, which makes it the source of the default QCL assumption described in §6.3. A CORESET#0 that has become unreceivable therefore takes more with it than SIB1.
8. How Many CORESETs, and Where They Are Scoped
The counting rules are simple to state and easy to get wrong, because the two limits that apply have different scopes.
| Limit | Value | Scope | Where it is stated |
|---|---|---|---|
maxNrofControlResourceSets | 12 (ids 0..11) | Per serving cell | TS 38.331 -- the size of controlResourceSetToAddModList plus the reserved id 0 |
| CORESETs the UE monitors | 3 per downlink BWP, plus CORESET#0 | Per BWP per serving cell | TS 38.213 cl. 10.1 -- a UE capability floor, and the practical limit vendors configure to |
maxNrofSearchSpaces | 40 (ids 0..39) | Per serving cell | TS 38.331 |
| Search spaces the UE monitors | 10 per downlink BWP | Per BWP per serving cell | TS 38.213 cl. 10.1 |
Table 9. The two scopes. Ids are unique per cell; the monitoring limits are per bandwidth part, so a cell with four BWPs may legally define more CORESETs than any one BWP can use.
The important asymmetry is this: controlResourceSetId is unique within the cell, but a CORESET is only usable in the BWP whose PDCCH-Config contains it. A dedicated CORESET is configured inside BWP-DownlinkDedicated -> pdcch-Config -> controlResourceSetToAddModList, so it belongs to that BWP. Two BWPs may each define a CORESET with id 2, and they are different CORESETs with different geometry. A search space in BWP 1 referring to controlResourceSetId 2 gets BWP 1's version, always.
This is where the most common release bug lives. PDCCH-Config carries both controlResourceSetToAddModList and controlResourceSetToReleaseList, and both are delta configuration -- the network sends only what changes. Release CORESET 2 in one reconfiguration and forget the search space that points at it, and the search space survives with a dangling reference. TS 38.331 puts the burden on the network here: the UE applies the release, and a search space whose controlResourceSetId no longer resolves produces no monitoring occasions. Nothing is reported. The scheduler keeps allocating CCEs in a CORESET the UE has stopped looking at.
8.1 The common CORESET
PDCCH-ConfigCommon may carry a single commonControlResourceSet, which is a full ControlResourceSet with an id in 1..11 -- never 0. Its purpose is to give the common search spaces a CORESET that is not CORESET#0, which matters in two situations: when the active BWP is not the initial BWP and CORESET#0 is outside it, and when the operator wants common signalling on a wider or better-placed control region than CORESET#0's table-derived geometry allows. It counts against the three-CORESETs-per-BWP budget.
8.2 What happens at a BWP switch
At a BWP switch the entire set of CORESETs and search spaces is replaced by the new BWP's set. This is not a merge and there is no inheritance: a CORESET configured only in BWP 1 does not exist while BWP 2 is active. Two practical consequences follow. First, every BWP that a UE can be switched into needs a complete, self-sufficient PDCCH-Config -- including a search space capable of carrying the DCI that would switch the UE back out again. Second, the switch is not instantaneous: the BWP switch delay TS 38.133 cl. 8.6 is a window during which the UE monitors neither BWP's CORESETs, and any DCI the gNB sends into that window is lost.
A BWP with no search space able to carry DCI 1_1 or DCI 0_1 with a BWP indicator is a one-way door. The UE switches in -- typically by bwp-InactivityTimer expiry, into the default BWP -- and then has no way to be told to come back. Recovery is by RRC reconfiguration if a common search space exists, and by nothing at all if it does not, in which case the UE sits in the wrong BWP until RLF or an inactivity release. Check the default BWP's PDCCH-Config specifically; it is the one most often left minimal.
9. SearchSpace, Field by Field
If the CORESET is the where, the SearchSpace IE is the when and the how hard. It is the larger of the two IEs and the one with more ways to be quietly wrong, because most of its fields are optional and the defaults are not always what a reader assumes.
| Field | Type and range | Typical | What it decides |
|---|---|---|---|
searchSpaceId | INTEGER (0..39) | 0-3 | Identity within the cell. Id 0 is the Type0-PDCCH search space derived from searchSpaceZero, and like controlResourceSetId 0 it should not be configured explicitly. The id also orders the overbooking drop rule: UE-specific search spaces are dropped in increasing id order (companion 31 PDCCH Blind Decoding). |
controlResourceSetId | INTEGER (0..11), optional | 1 or 2 | The link. Without a resolvable value the search space does nothing at all. Optional in ASN.1 only because a searchSpacesToAddModList entry may modify an existing search space without restating it. |
monitoringSlotPeriodicityAndOffset | CHOICE: sl1 | sl2 | sl4 | sl5 | sl8 | sl10 | sl16 | sl20 | sl40 | sl80 | sl160 | sl320 | sl640 | sl1280 | sl2560 | sl1 or sl2 | Slot periodicity, and for every branch except sl1 an INTEGER offset within the period. sl1 carries no offset because there is nothing to offset. |
duration | INTEGER (2..2559), optional | absent (means 1) | How many consecutive slots the search space is active for, starting at each periodic occasion. Absent means 1. Must be less than the periodicity. |
monitoringSymbolsWithinSlot | BIT STRING (SIZE (14)), optional | 1 bit set (symbol 0) | Which symbols within a monitored slot start a monitoring occasion. First bit = symbol 0. A set bit means the CORESET starts there and runs for duration symbols. |
nrofCandidates | SEQUENCE of aggregationLevel1/2/4/8/16, each ENUMERATED {n0,n1,n2,n3,n4,n5,n6,n8} | AL1 n4, AL2 n2, AL4 n1, AL8 n0, AL16 n0 | How many blind-decode attempts at each aggregation level. n0 means this aggregation level is not searched at all, which is the trap in §17. |
searchSpaceType | CHOICE { common, ue-Specific } | ue-Specific for scheduling | Both the DCI formats expected and the hashing behaviour: common search spaces have Y = 0, so every UE agrees on the CCE positions. |
freqMonitorLocations-r17 | BIT STRING (SIZE (5)), optional | absent | Rel-17: replicates the search space across up to five frequency locations for multi-carrier NR-U operation. |
Table 10. SearchSpace, TS 38.331. nrofCandidates and searchSpaceType are the two fields that most often differ between what a planner intended and what the UE received.
9.1 The searchSpaceType CHOICE
searchSpaceType is a CHOICE with two branches, and each branch carries its own sub-structure declaring which DCI formats to expect. This is not decoration: the declared formats fix the DCI sizes the UE will attempt, and a UE does not attempt a size it has not been told to expect.
searchSpaceType CHOICE {
common SEQUENCE {
dci-Format0-0-AndFormat1-0 SEQUENCE { ... } OPTIONAL,
dci-Format2-0 SEQUENCE { -- SFI
nrofCandidates-SFI SEQUENCE {
aggregationLevel1 ENUMERATED {n1,n2} OPTIONAL,
aggregationLevel2 ENUMERATED {n1,n2} OPTIONAL,
aggregationLevel4 ENUMERATED {n1,n2} OPTIONAL,
aggregationLevel8 ENUMERATED {n1,n2} OPTIONAL,
aggregationLevel16 ENUMERATED {n1,n2} OPTIONAL
}, ...
} OPTIONAL,
dci-Format2-1 SEQUENCE { ... } OPTIONAL,
dci-Format2-2 SEQUENCE { ... } OPTIONAL,
dci-Format2-3 SEQUENCE { ... } OPTIONAL,
dci-Format2-4-r16 SEQUENCE { ... } OPTIONAL,
dci-Format2-5-r16 SEQUENCE { ... } OPTIONAL,
dci-Format2-6-r16 SEQUENCE { ... } OPTIONAL,
...
},
ue-Specific SEQUENCE {
dci-Formats ENUMERATED {formats0-0-And-1-0, formats0-1-And-1-1},
...
}
}Listing 1. Abridged from TS 38.331 SearchSpace. Each dci-Format2-x branch is present only if that group-common DCI is to be monitored in this search space; ... marks omitted members and extension markers.
| Branch present | DCI monitored | RNTI | Purpose |
|---|---|---|---|
dci-Format0-0-AndFormat1-0 | DCI 0_0, DCI 1_0 | SI-RNTI, RA-RNTI, MsgB-RNTI, TC-RNTI, P-RNTI, C-RNTI | The fallback scheduling formats. The only ones permitted in a common search space for unicast. |
dci-Format2-0 | DCI 2_0 | SFI-RNTI | Slot format indication -- dynamic TDD. Changes which symbols are downlink, which is why it must be monitored before the symbols it describes. |
dci-Format2-1 | DCI 2_1 | INT-RNTI | Downlink pre-emption indication: part of an earlier PDSCH was overwritten by a URLLC transmission. |
dci-Format2-2 | DCI 2_2 | TPC-PUSCH-RNTI, TPC-PUCCH-RNTI | Group TPC commands for PUSCH and PUCCH. |
dci-Format2-3 | DCI 2_3 | TPC-SRS-RNTI | Group TPC for SRS, plus SRS request. |
dci-Format2-4-r16 | DCI 2_4 | CI-RNTI | Uplink cancellation indication (Rel-16): stop transmitting on these resources. |
dci-Format2-5-r16 | DCI 2_5 | AI-RNTI | Availability indication for an IAB node's soft resources. |
dci-Format2-6-r16 | DCI 2_6 | PS-RNTI | Power saving outside DRX Active Time: wake-up indication and SCell dormancy (companion 11 DRX). |
ue-Specific / formats0-0-And-1-0 | DCI 0_0, DCI 1_0 | C-RNTI etc. | Fallback formats in the UE-specific search space -- fixed sizes, robust, used during reconfiguration ambiguity. |
ue-Specific / formats0-1-And-1-1 | DCI 0_1, DCI 1_1 | C-RNTI, CS-RNTI, MCS-C-RNTI | The full-featured formats: BWP indicator, CBG fields, TCI, SRS resource indicator, antenna ports. |
Table 11. What each branch causes the UE to look for. A DCI the search space does not declare is not decoded even if it is transmitted perfectly -- the UE never attempts that size.
A UE-specific search space configured with formats0-0-And-1-0 instead of formats0-1-And-1-1 still works. Scheduling succeeds, HARQ runs, throughput is non-zero -- and every advanced feature silently does nothing, because the fields that carry it exist only in DCI 0_1 and 1_1. No BWP switching by DCI, no CBG retransmission, no dynamic TCI update, no SRS request, no multi-layer MIMO beyond what the fallback format can express. Symptom: a UE that works but never uses any of the features the licence was bought for, with no error anywhere. Check this field before believing a feature-not-working report.
10. The Search Space Types: Type0 to Type3 and UE-Specific
There are two different numbering systems in play and they do not match, which is the single largest source of confusion in this area. TS 38.213 clause 10.1 defines search space types -- Type0-PDCCH, Type0A-PDCCH, Type1-PDCCH, Type2-PDCCH, Type3-PDCCH and the UE-specific search space -- as roles. TS 38.331 defines searchSpaceType as an ASN.1 CHOICE with two branches. Type0 through Type3 all encode as common. The type number appears nowhere in the RRC message.
| Type | RNTI(s) | DCI formats | Configured by | When monitored | RRC states |
|---|---|---|---|---|---|
| Type0-PDCCH | SI-RNTI | 1_0 | searchSpaceZero in the MIB, or searchSpaceSIB1 in PDCCH-ConfigCommon | In the SIB1 window derived from searchSpaceZero, repeating every 20 ms with the SSB burst | IDLE, INACTIVE, CONNECTED |
| Type0A-PDCCH | SI-RNTI | 1_0 | searchSpaceOtherSystemInformation | Within the SI window of the SI message being acquired TS 38.331 cl. 5.2.2.3.2 | IDLE, INACTIVE, CONNECTED |
| Type1-PDCCH | RA-RNTI, MsgB-RNTI, TC-RNTI | 1_0 (and 0_0 for MSG3 retransmission) | ra-SearchSpace in PDCCH-ConfigCommon | During ra-ResponseWindow / msgB-ResponseWindow, and until contention resolution completes | Any state in which random access is running |
| Type2-PDCCH | P-RNTI | 1_0 | pagingSearchSpace in PDCCH-ConfigCommon | At the UE's paging occasions, derived from the UE identity and PCCH-Config | IDLE, INACTIVE (and CONNECTED, for SI change and ETWS/CMAS) |
| Type3-PDCCH | C-RNTI, CS-RNTI, MCS-C-RNTI, INT-RNTI, SFI-RNTI, TPC-PUSCH-RNTI, TPC-PUCCH-RNTI, TPC-SRS-RNTI, CI-RNTI, PS-RNTI | 0_0, 1_0, and the 2_x group-common formats | commonSearchSpaceList in PDCCH-ConfigCommon | Per its own periodicity and offset, continuously in CONNECTED | CONNECTED |
| UE-specific | C-RNTI, CS-RNTI, MCS-C-RNTI | 0_0 and 1_0, or 0_1 and 1_1 -- selected by dci-Formats | searchSpacesToAddModList in PDCCH-Config | Per its own periodicity, offset, duration and symbol bitmap, intersected with DRX Active Time | CONNECTED |
Table 12. Every search space type in one table. Note that Type3 is the only common search space that carries unicast C-RNTI grants, and that the UE-specific search space is the only one that can carry the full-featured DCI formats.
Type3-PDCCH is the one people forget exists, and it does two unrelated jobs. It is the common search space for the group-common DCIs -- SFI, pre-emption, group TPC, cancellation, power saving -- and it can also carry ordinary C-RNTI scheduling with DCI 0_0/1_0. That second capability is what keeps a UE reachable when its dedicated CORESET or search space is broken, which is exactly why a UE with a misconfigured UE-specific search space often shows some traffic at low rate rather than none at all. A cell with no Type3 search space loses that safety net.
10.1 Common versus UE-specific, at the level that matters
| Common search space | UE-specific search space | |
|---|---|---|
| Hashing seed Y | Y = 0, fixed. Every UE computes the same CCE positions for candidate m | Y is recursive in the C-RNTI: Y(n) = (A x Y(n-1)) mod D, so positions differ per UE and per slot |
| Why | The message may be addressed to a group, or to a UE whose identity the network does not yet know | Two UEs must not collide slot after slot; randomising per UE and per slot spreads the collisions |
| DCI formats | 0_0 and 1_0 only for unicast; plus the 2_x group-common formats | 0_0/1_0 or 0_1/1_1 |
| Aggregation levels | Practically restricted -- the candidate counts in nrofCandidates-SFI allow only n1 or n2 | Full n0..n8 per level |
| Overbooking | Never dropped. Common search spaces are allocated candidates first | Dropped in increasing searchSpaceId order when the per-slot budget is exceeded |
| Failure impact | Loss of paging, SI, random access response -- affects every UE in the cell | Loss of scheduling for one UE |
Table 13. The distinction is not cosmetic: the hashing seed, the DCI format set, the candidate limits and the drop priority all differ. The hashing function itself is covered in the companion 31 PDCCH Blind Decoding document.
11. Aggregation Levels and What They Buy
An aggregation level is the number of CCEs one PDCCH occupies: 1, 2, 4, 8 or 16. The DCI payload does not change with it. What changes is how many coded bits the payload is spread over, and therefore the effective code rate -- which is the only reliability lever the gNB has on a channel it cannot adapt.
11.1 The coding-rate calculation, twice
Usable coded bits at aggregation level L, QPSK:
bits(L) = L x 6 REGs x 9 data REs x 2 bits/RE = 108 L
Case A -- DCI 1_0 in a common search space. Payload 41 bits, 24-bit CRC: 65 bits total.
AL1: R = 65 / 108 = 0.602 -- workable only at good SINR
AL4: R = 65 / 432 = 0.150 -- comfortable cell-edge margin
AL8: R = 65 / 864 = 0.075
Gain from AL1 to AL4: 10 x log10(4) = 6.0 dB of coding gain
Case B -- DCI 1_1 in a UE-specific search space. Payload 60 bits (BWP indicator, CBG fields, TCI, antenna ports, SRS request all present), 24-bit CRC: 84 bits total.
AL1: R = 84 / 108 = 0.778 -- too high; do not schedule here
AL2: R = 84 / 216 = 0.389
AL4: R = 84 / 432 = 0.194
The same aggregation level is worth 1.1 dB less with the larger payload: 10 x log10(0.194 / 0.150) = 1.1 dB. Enabling optional DCI fields is not free -- it moves the whole aggregation-level ladder up.
That last point is worth dwelling on because it is counter-intuitive. Turning on tci-PresentInDCI, or configuring code-block-group retransmission, or adding a second BWP so that DCI 1_1 needs a BWP indicator field, all enlarge the DCI. The enlargement is a handful of bits, which sounds negligible, but it lands on a channel already running at a code rate of 0.2 to 0.8. Growing an 84-bit DCI to 90 bits at AL2 moves R from 0.389 to 0.417, and the coverage of every AL2 candidate shrinks accordingly.
11.2 How the gNB chooses
3GPP does not specify this, and vendors differ. What every implementation has to work from is the same short list of inputs:
| Input | Where it comes from | How it is used |
|---|---|---|
| Wideband CQI or SINR estimate | CSI report on PUCCH or PUSCH, or the SRS-based uplink estimate reciprocated | The primary driver: map estimated PDCCH SINR to the lowest AL that meets the target PDCCH BLER, commonly 1% |
| PDCCH DTX / HARQ inference | Absence of a HARQ-ACK where one was expected implies the DCI itself may have been missed | Outer-loop style correction: raise the AL for this UE after consecutive misses |
| Available CCEs in the CORESET | The scheduler's own CCE occupancy map for this occasion | Hard constraint. A UE that needs AL8 in a CORESET with 6 free CCEs is not scheduled this slot at all |
| Candidate availability | nrofCandidates for that AL, and the hashing function's output for this slot | Hard constraint. The AL must have a non-zero candidate count and an unoccupied candidate position |
| Message importance | Scheduler policy -- an RRC reconfiguration or a handover command matters more than a data grant | Many implementations force a high AL for signalling regardless of the channel estimate |
| DCI payload size | The configured formats and optional fields | Sets the code rate at each AL, per §11.1 |
Table 14. What feeds an aggregation-level decision. Only the last two are specified; the rest is implementation, and should be labelled as such when reading a vendor's behaviour.
The distribution of aggregation levels in a cell is one of the most informative PDCCH statistics available, and it is usually collected. A healthy loaded FR1 macro cell is dominated by AL2 and AL4 with a thin AL8 tail. A cell that is almost all AL1 is either extraordinarily well-covered or has a scheduler that is under-protecting PDCCH -- check PDCCH BLER. A cell that is almost all AL8 and AL16 is spending its entire CORESET on a handful of UEs per slot, and will show PDCCH blocking long before PRB exhaustion.
12. Monitoring Occasions: From Three Fields to a Set of Slots
Three fields between them define every moment the UE looks at this search space, and they compose in a specific order. Getting the order wrong is the commonest arithmetic error in this area.
Slot n of system frame SFN is a monitored slot for search space s if:
( SFN x N_slot_per_frame + n - o_s ) mod k_s < d_s
k_s = monitoringSlotPeriodicityAndOffset periodicity, in slots
o_s = its offset, in slots (0 when the branch is sl1)
d_s = duration, in slots (1 when duration is absent)
Within each monitored slot, one monitoring occasion begins at every
symbol whose bit is set in monitoringSymbolsWithinSlot, and runs for
the CORESET's duration symbols.Read that as three nested filters. The periodicity and offset select which slots start a burst. The duration extends each burst over consecutive slots. The symbol bitmap selects where inside each of those slots the occasions sit. The bitmap applies to every slot of the burst identically -- there is no per-slot symbol pattern.
12.1 Worked derivation one: a periodic UE-specific search space
Configuration:
30 kHz SCS, so N_slot_per_frame = 20
monitoringSlotPeriodicityAndOffset = sl4, offset 2 -> k = 4, o = 2
duration = 2 -> d = 2
monitoringSymbolsWithinSlot = 10000000100000
bit 0 set -> symbol 0
bit 8 set -> symbol 8
CORESET duration = 2 symbols
Monitored slots, taking SFN 0 (absolute slot = n):
(n - 2) mod 4 < 2 -> n = 2, 3, 6, 7, 10, 11, 14, 15, 18, 19
Occasions per monitored slot: 2 (symbols 0 and 8)
Occasions per 10 ms frame = 10 slots x 2 = 20
Occasions per second = 20 x 100 = 2000
Each occasion spans symbols 0-1 or symbols 8-9, because the CORESET runs for 2 symbols from the symbol the bitmap named.
Two occasions per slot at symbols 0 and 8 is the classic mini-slot monitoring pattern. It halves the worst-case wait for a grant from one slot (0.5 ms at 30 kHz) to half a slot, which is exactly the kind of latency reduction URLLC configurations buy -- at the cost of doubling the UE's blind-decode work per slot and doubling the PDCCH processing power. §14 covers the capability that bounds this.
12.2 Worked derivation two: a sparse common search space
Configuration:
15 kHz SCS, so N_slot_per_frame = 10
monitoringSlotPeriodicityAndOffset = sl20, offset 5 -> k = 20, o = 5
duration absent -> d = 1
monitoringSymbolsWithinSlot = 10000000000000 -> symbol 0
Absolute slot index a = SFN x 10 + n. Monitored when (a - 5) mod 20 = 0:
a = 5, 25, 45, 65, ...
Convert back to (SFN, slot):
a = 5 -> SFN 0, slot 5
a = 25 -> SFN 2, slot 5
a = 45 -> SFN 4, slot 5
So: slot 5 of every even SFN -- one occasion every 20 ms.
Latency consequence: a DCI that becomes ready at SFN 1 slot 6 waits until SFN 2 slot 5, which is 9 slots = 9 ms at 15 kHz. If the scheduler assumed this search space was monitored every slot, its grant is 9 ms stale by the time the UE sees it -- and if the grant referenced a HARQ process or a K2 offset relative to the intended slot, it is not merely late but wrong.
The offset is in slots, and it is an offset within the periodicity, not within the frame. For sl20 at 15 kHz the period is two frames, so offset 5 means absolute slot 5 -- slot 5 of the even frame. For sl20 at 30 kHz the period is one frame, so offset 5 means slot 5 of every frame. The same configured numbers give different behaviour at different numerologies, which is why a search space configuration copied between a 15 kHz and a 30 kHz cell rarely does what was intended.
12.3 monitoringSymbolsWithinSlot in detail
The 14-bit bitmap has three rules that are easy to violate:
- The first bit is symbol 0, most-significant-first, exactly like
frequencyDomainResources. - A set bit names the first symbol of an occasion, and the occasion extends for the CORESET's
durationsymbols. A bit set at symbol 13 with a CORESETdurationof 2 would run off the end of the slot; that combination is invalid and the network must not configure it. - Consecutive set bits create overlapping occasions if the CORESET is longer than one symbol. Bits set at symbols 0 and 1 with
duration2 means occasions at 0-1 and 1-2, which overlap in symbol 1. This is legal and used for span-based monitoring (§14), but it multiplies the candidate count and counts against the per-span limits.
For a search space in a common search space other than Type3, the bitmap is effectively constrained to a single set bit in the first three symbols, because the common search spaces are designed to sit at the start of a slot alongside the initial BWP's CORESET. For the UE-specific search space the whole bitmap is available and vendors use it.
13. Monitoring Against the TDD Pattern, DRX and BWP Switching
The set of occasions computed in §12 is a configured set. What the UE actually monitors is that set minus everything that removes an occasion for reasons the search space knows nothing about. There are four such reducers and they compose multiplicatively, which is how a generous-looking configuration ends up with very few live occasions.
| Reducer | Mechanism | Effect on occasions | Where it is specified |
|---|---|---|---|
| TDD uplink symbols | A monitoring occasion whose symbols are uplink or flexible-configured-as-uplink carries no PDCCH | Removed entirely. The UE does not monitor, and the gNB cannot transmit | tdd-UL-DL-ConfigurationCommon / -Dedicated, TS 38.213 cl. 11.1 |
| Dynamic SFI | DCI 2_0 can mark flexible symbols as uplink for one period | Removed for that period only. The UE must have monitored the SFI before the affected symbols | TS 38.213 cl. 11.1.1 |
| DRX | Outside Active Time the UE monitors no PDCCH at all, on any search space, except Type2 paging and Type0/0A SI at their own occasions | Removed wholesale. Active Time is the dominant reducer in a power-saving configuration | TS 38.321 cl. 5.7 -- companion 11 DRX |
| Measurement gaps | During a configured gap the UE is retuned elsewhere and monitors nothing on the serving cell | Removed for the gap length, every gap repetition period | TS 38.133 -- companion 21 Measurement Gaps and SMTC |
| BWP switch delay | Between the DCI ordering a switch and the new BWP being usable, neither BWP is monitored | A hole of 1-3 slots at each switch | TS 38.133 cl. 8.6 |
Table 15. Everything that silently removes a monitoring occasion. None of these appear in the search space configuration, and none produce a log entry at the point of removal.
13.1 The TDD interaction, precisely
A monitoring occasion on an uplink symbol is never used. That statement is obvious and its consequences are not. Consider a search space with monitoringSlotPeriodicityAndOffset = sl1 in a cell with the pattern DDDDDDDSUU: three slots in ten are wholly or partly uplink, so 20% to 30% of the configured occasions are dead. That is normally harmless -- the scheduler knows the pattern too. It becomes harmful when the periodicity and the TDD period share a factor.
monitoringSlotPeriodicityAndOffset = sl5 with a 5-slot TDD pattern DDDSU and offset 4:
monitored slots: 4, 9, 14, 19, ...
slot 4 mod 5 = 4 -> 'U' in every period
Every single configured occasion lands on an uplink slot. The search space is fully configured, references a valid CORESET, has non-zero candidates at three aggregation levels, and produces exactly zero monitoring in an infinite run.
The same configuration with offset 1 gives slots 1, 6, 11, 16 -- all 'D' -- and works perfectly. The difference is one integer.
This is the failure mode with the cleanest signature and the least obvious cause: a UE that is scheduled successfully on one search space and never on another, with both search spaces looking correct in the reconfiguration. Compute the monitored slots modulo the TDD periodicity before anything else. If monitoringSlotPeriodicityAndOffset is an integer multiple or divisor of the TDD period, the occasions are locked to fixed positions in the pattern and either always work or never do.
13.2 The DRX interaction
DRX and search spaces are two independent gates on the same activity, and the UE applies the intersection. Outside Active Time the UE does not monitor a UE-specific or Type3 search space at all, whatever its periodicity says. The important asymmetry is that DRX does not suppress Type2-PDCCH at paging occasions or Type0/Type0A at SI occasions, because those are governed by their own timing and the UE must remain reachable.
Two configuration mistakes follow from the intersection. A search space with a periodicity longer than drx-onDurationTimer may have no occasion inside Active Time at all in some cycles, so grants arrive reliably in some DRX cycles and never in others -- an intermittent fault that correlates with the DRX cycle rather than with anything radio. Conversely, a search space with sl1 periodicity is monitored on every slot of Active Time, which defeats much of the point of a long drx-InactivityTimer: the UE's PDCCH processing is the dominant power cost during Active Time, not its receiver being on. The companion 11 DRX document covers Active Time in full.
14. Multi-Slot Monitoring, Spans and the Rel-16 Capability
Rel-15 assumed one thing about PDCCH monitoring that Rel-16 had to revisit: that a UE monitors at most one occasion per slot, at or near the slot boundary. That assumption sets the minimum grant-to-data latency at roughly one slot, which is fine for eMBB and not fine for URLLC. The Rel-16 answer is span-based monitoring.
14.1 What a span is
A span is a window of consecutive OFDM symbols within a slot inside which all of a UE's monitoring occasions fall. Rel-16 defines the capability in terms of a pair (X, Y): X is the minimum separation between the first symbols of two consecutive spans, and Y is the maximum length of a span. The UE reports which pairs it supports in pdcch-Monitoring-r16 TS 38.306, and the network must configure monitoringSymbolsWithinSlot so that all occasions fit a supported pattern.
| (X, Y) pair | Meaning | Spans per 14-symbol slot | Typical use |
|---|---|---|---|
| (7, 3) | Spans start at least 7 symbols apart; each span is at most 3 symbols | 2 | The mildest span capability -- two monitoring opportunities per slot, one per half slot |
| (4, 3) | At least 4 symbols apart, at most 3 long | 3 | Mid-range URLLC: sub-slot monitoring at roughly 140 us granularity at 30 kHz |
| (2, 2) | At least 2 symbols apart, at most 2 long | 7 | The most aggressive: an occasion every two symbols, which is the practical floor for grant latency |
| Rel-15 baseline | One occasion per slot, in the first three symbols | 1 | Everything before Rel-16; still the default a UE must support |
Table 16. The (X, Y) span patterns. A UE reports the pairs it supports; (2, 2) support implies materially more PDCCH processing hardware and is not universal.
At 30 kHz SCS one symbol is about 35.7 us. A (2, 2) capability therefore offers a monitoring opportunity every ~71 us against a Rel-15 slot boundary's 500 us:
Rel-15, one occasion per slot:
average wait for the next occasion = 0.5 x 500 us = 250 us
worst case = 500 us
Rel-16 (2, 2), seven occasions per slot:
average wait = 0.5 x 71.4 us = 36 us
worst case = 71 us
For a 1 ms end-to-end URLLC budget, removing 430 us of worst-case waiting for a grant is not a refinement -- it is most of the budget.
14.2 Why the capability, rather than just configuration
Because blind decoding is expensive in silicon. Every monitoring occasion is a batch of channel estimation, descrambling and polar decoding attempts that must complete before the data the DCI points at arrives. Seven occasions per slot means seven times the peak PDCCH processing throughput, and the per-span candidate and CCE limits in TS 38.213 clause 10.1 exist to bound exactly that. This is why the limits are expressed per span for a span-capable UE and per slot for a Rel-15 UE -- the resource being rationed is decode attempts per unit time, not per slot.
Configuring span-based monitoring against a UE that did not report the capability is a real and quiet failure. The UE applies the search space configuration it was given, but its per-slot candidate limit is the Rel-15 one, so the overbooking rules drop candidates -- and it is the UE-specific search spaces that get dropped, in increasing searchSpaceId order. The result is a UE that monitors the first occasion of each slot and drops the rest, giving Rel-15 latency from a Rel-16 configuration with no error anywhere. Always check the capability report before believing a sub-slot monitoring configuration is doing anything. See the companion 26 UE Capability document.
14.3 Multi-slot span monitoring, Rel-17
Rel-17 added the opposite refinement for a different problem. In FR2-2 (52.6 to 71 GHz) with 480 or 960 kHz subcarrier spacing, a slot is 31 or 15.6 us long, and monitoring every slot would demand absurd processing rates. Rel-17 therefore allows the candidate and CCE limits to be defined over a group of slots rather than a single slot, so the UE may concentrate its decode budget in some slots of the group and skip others. The configuration mechanism is the same monitoringSlotPeriodicityAndOffset and monitoringSymbolsWithinSlot; what changes is the limit the overbooking rules apply against.
Rel-17 also added PDCCH skipping and search space set group switching as explicit power-saving tools. A DCI can tell a UE to skip PDCCH monitoring entirely for a configured duration, or to switch between two configured groups of search spaces -- a dense group while traffic is active and a sparse group while it is not -- without an RRC message and without leaving Active Time. Both appear in logs as a UE that stops monitoring for a while with no DRX transition, which is easy to misdiagnose as a lost UE.
15. Where This Hands Off to Blind Decoding
Everything to this point produces one thing: for each monitoring occasion, a list of PDCCH candidates. A candidate is a specific set of L contiguous CCE indices inside a specific CORESET at a specific occasion, and the UE will attempt to decode a DCI from each one. That list is the boundary of this document.
What produces the candidate positions from the search space configuration is the hashing function, and what bounds how many candidates the UE will actually attempt is the per-slot (or per-span) budget with its overbooking and dropping rules. Both belong to the companion 31 PDCCH Blind Decoding document, which owns them; repeating them here would only create two places to keep consistent. The hand-off is:
| This document produces | Doc 31 consumes it to produce |
|---|---|
The CORESET's CCE count N_CCE,p and the CCE-to-REG mapping | The physical resource elements each candidate occupies |
| The set of monitoring occasions (slot, symbol) per search space | The slot index n that seeds the per-slot hashing recursion |
nrofCandidates per aggregation level, M_p,L | The candidate index range m = 0 .. M_p,L - 1 fed into the hash |
searchSpaceType: common or UE-specific | The hashing seed: Y = 0 for common, the C-RNTI recursion for UE-specific |
searchSpaceId, and whether the space is common | The drop order when the per-slot candidate or CCE budget is exceeded |
| The declared DCI formats | The set of DCI sizes to attempt, and the size-alignment procedure that reduces them |
Table 17. The interface between the two documents. Everything on the left is configuration; everything on the right is per-slot computation.
One number is worth carrying across the boundary because it explains so many under-provisioning symptoms. A 16-CCE CORESET holds exactly one AL16 candidate, and that candidate consumes the whole CORESET. So a single UE in poor coverage, scheduled at AL16, blocks every other UE in that occasion. This is not a bug and there is no configuration that avoids it -- it is arithmetic. The mitigation is to size CORESETs so that AL16 is rare, or to set aggregationLevel16 to n0 and accept that the worst-coverage UEs are served through a common search space instead.
16. Parameter and Range Reference
16.1 CORESET parameters
| ASN.1 name | Range / values | Typical | Effect if wrong |
|---|---|---|---|
controlResourceSetId | INTEGER (0..11) | 1, 2 | A search space referencing an unconfigured id monitors nothing. Using 0 for a dedicated CORESET is illegal. |
frequencyDomainResources | BIT STRING (SIZE (45)) | 8 contiguous bits set | Bits outside the BWP are ignored, silently shrinking the CORESET and its CCE count. |
duration | INTEGER (1..3) | 2 | Changes the CCE count and the earliest PDSCH start symbol. At 3, reg-BundleSize n2 becomes illegal. |
cce-REG-MappingType | interleaved | nonInterleaved | interleaved | Mismatch between gNB and UE puts every CCE in the wrong place: total PDCCH failure, no partial degradation. |
reg-BundleSize | n2, n3, n6 | n6 | Wrong value changes both the interleaver output and the DMRS averaging span. |
interleaverSize | n2, n3, n6 | n2 | Must divide N_REG/L. An inconsistent combination is a configuration error the network must avoid. |
shiftIndex | INTEGER (0..274) | the physical cell id | Identical values in neighbouring cells cause systematic inter-cell PDCCH collision (§5.3). |
precoderGranularity | sameAsREG-bundle | allContiguousRBs | sameAsREG-bundle | allContiguousRBs with a non-contiguous or interleaved CORESET wastes the benefit and constrains beamforming for nothing. |
pdcch-DMRS-ScramblingID | INTEGER (0..65535) | the physical cell id | Mismatch is total failure. Shared between neighbours degrades channel estimation, not just SINR. |
tci-StatesPDCCH-ToAddList | 1..64 TCI-StateId | 1 entry | A state referencing a stale QCL source makes the CORESET unreceivable with every field still valid. |
tci-PresentInDCI | ENUMERATED {enabled}, optional | absent | Changes DCI 1_1's size by 3 bits. A mismatch breaks DCI 1_1 while DCI 1_0 keeps working. |
Table 18. ControlResourceSet reference. Typical values are what many vendors ship for an FR1 mid-band macro cell, not specification defaults -- most of these fields have no default.
16.2 Search space parameters
| ASN.1 name | Range / values | Typical | Effect if wrong |
|---|---|---|---|
searchSpaceId | INTEGER (0..39) | 1, 2, 3 | Also the drop order under overbooking: a high id is dropped first. |
controlResourceSetId | INTEGER (0..11) | 1, 2 | Dangling reference means zero monitoring occasions, silently. |
monitoringSlotPeriodicityAndOffset | sl1 .. sl2560, with an offset in 0..k-1 for every branch but sl1 | sl1 (UE-specific), sl20 (paging) | Too long and grants go stale; aligned with the TDD period and every occasion can land on an uplink slot (§13.1). |
duration | INTEGER (2..2559), optional | absent (= 1) | Must be < periodicity. Extends each burst across consecutive slots. |
monitoringSymbolsWithinSlot | BIT STRING (SIZE (14)) | bit 0 only | A bit at a symbol the CORESET does not reach, or beyond 14 - duration, is an invalid configuration. |
nrofCandidates per level | n0, n1, n2, n3, n4, n5, n6, n8 for each of AL 1/2/4/8/16 | AL1 n4, AL2 n2, AL4 n1, AL8 n0, AL16 n0 | n0 removes that aggregation level entirely. If the scheduler uses it, the DCI is transmitted and never decoded. |
searchSpaceType | CHOICE common | ue-Specific | ue-Specific | Wrong branch changes the hashing seed and the permitted DCI formats. |
dci-Formats (in ue-Specific) | formats0-0-And-1-0 | formats0-1-And-1-1 | formats0-1-And-1-1 | The fallback choice silently disables every feature that lives only in DCI 0_1/1_1 (§9.1). |
searchSpaceGroupIdList-r17 | 1..2 INTEGER (0..1), optional | absent | Rel-17 group switching. Present without a switching trigger configured does nothing. |
Table 19. SearchSpace reference. The two fields with no safe default are nrofCandidates and dci-Formats; both fail silently.
16.3 Limits and capabilities
| Limit | Value | Scope | Consequence of hitting it |
|---|---|---|---|
| CORESETs monitored | 3 + CORESET#0 | Per DL BWP per cell | Configuration beyond it is invalid; the UE's behaviour is not specified |
| Search spaces monitored | 10 | Per DL BWP per cell | As above |
maxNrofControlResourceSets | 12 | Per cell | Ids exhausted |
maxNrofSearchSpaces | 40 | Per cell | Ids exhausted |
| Candidates per slot M_max | 44 at 15 kHz, 36 at 30 kHz, 22 at 60 kHz, 20 at 120 kHz | Per slot per serving cell (Rel-15); per span for a span-capable UE | Overbooking: UE-specific search spaces dropped in increasing id order |
| Non-overlapping CCEs per slot C_max | 56 at 15 kHz, 56 at 30 kHz, 48 at 60 kHz, 32 at 120 kHz | Per slot per serving cell | As above -- the CCE limit bites before the candidate limit in a high-aggregation configuration |
| Span capability (X, Y) | (7,3), (4,3), (2,2) | Per UE, reported in pdcch-Monitoring-r16 | Configuring sub-slot monitoring without the capability gives Rel-15 behaviour silently (§14.2) |
Table 20. Limits, TS 38.213 cl. 10.1 Tables 10.1-2 and 10.1-3 and TS 38.331. Under carrier aggregation the per-slot budgets are apportioned across cells rather than multiplied -- see the companion 29 Carrier Aggregation document, and doc 31 for the apportionment arithmetic.
17. Failure Modes, and What Each Looks Like in a Log
This is the section to read first if you are here because a UE is not getting grants and the radio looks healthy. Every entry below produces that presentation, and none of them produce an error message at the point of failure.
| Failure | Detected by | What the UE does | Log signature |
|---|---|---|---|
frequencyDomainResources selects groups partly or wholly outside the active BWP | Nobody, at the time. The UE applies the rule that such bits are zero | Monitors a smaller CORESET than the gNB believes it configured, with fewer CCEs and therefore fewer valid candidate positions | gNB's CCE occupancy map and the UE's disagree. High-CCE-index candidates are never decoded, so PDCCH BLER is high only for UEs hashed into the upper part of the CORESET -- an apparently random subset of UEs |
A search space references a released or never-configured controlResourceSetId | Nobody. TS 38.331 makes it the network's responsibility | Produces no monitoring occasions for that search space. Other search spaces are unaffected | The reconfiguration containing controlResourceSetToReleaseList is the tell. Search for the released id in searchSpacesToAddModList -- if it is still there, this is your fault. UE goes silent from the exact moment the reconfiguration is complete |
nrofCandidates = n0 at the aggregation level the scheduler uses | Nobody. Both sides are internally consistent | Never attempts a decode at that aggregation level. The DCI is transmitted correctly and discarded | Perfect correlation between missed grants and the scheduler's chosen AL. If the scheduler logs the AL per grant, the histogram of successful grants has a hole exactly where the histogram of attempted grants has mass |
| Monitoring periodicity longer than the scheduler assumes | The scheduler eventually, via HARQ timeouts | Monitors correctly, at its own periodicity. Grants sent between occasions are simply lost | Grant-to-HARQ round trips that are integer multiples of the search space periodicity apart. K0/K1/K2 offsets that were valid when the DCI was formed are stale when the UE reads it |
monitoringSymbolsWithinSlot names symbols the CORESET does not occupy | Nobody -- it is an invalid configuration the network must not create | Behaviour is not specified. In practice: monitors nothing at that symbol, or monitors a CORESET that runs past the slot boundary | Occasions counted at the gNB and at the UE differ by a fixed factor. Often presents as exactly half or a third of expected grants arriving |
| CORESET#0 does not fit the carrier at the SSB's position | Nobody. The UE tries | Cannot decode SIB1. Channel estimation is corrupted by the missing band, so Type0-PDCCH fails at every aggregation level | UEs decode MIB and never progress. pdcch-ConfigSIB1 looks valid, RSRP is good, and the failure is deterministic per carrier position rather than per UE (§7.1) |
pdcch-DMRS-ScramblingID mismatch between gNB and UE | Nobody. Both sides believe they are right | Channel estimation on that CORESET produces noise. Every PDCCH in it fails, at every AL, at every SINR | Total, immediate, and confined to one CORESET. Any other CORESET -- especially CORESET#0, which always uses the physical cell id -- keeps working, which is the diagnostic |
| A TCI state on the CORESET the UE cannot receive | The UE, eventually, through beam failure detection -- but only if the BFD reference signals point at the same beam | Monitors the right symbols with the wrong receive beam. Nothing decodes | Serving RSRP healthy (measured on a different beam), PDCCH BLER 100% on one CORESET, and the UE still responsive on any CORESET using the default QCL. Correlate with the last TCI activation MAC CE (§6.3) |
| Every occasion lands on a TDD uplink slot | Nobody. The configuration is individually valid | Monitors nothing, forever, on that search space | Zero grants on one search space and normal grants on another, in the same cell, with both configurations looking correct. Compute the monitored slots modulo the TDD period (§13.1) |
| Span-based monitoring configured against a non-span-capable UE | Nobody. The UE applies Rel-15 limits | Monitors the first occasion of each slot and drops the rest under the overbooking rules | Latency behaves as Rel-15 while the configuration says otherwise. Check pdcch-Monitoring-r16 in the capability report (§14.2) |
| Default BWP has no search space able to carry a BWP-switching DCI | Nobody until the UE is stranded | Switches into the default BWP on bwp-InactivityTimer expiry and cannot be told to leave | A UE that works, goes quiet after exactly bwp-InactivityTimer, and recovers only on RRC reconfiguration or release (§8.2) |
Table 21. Eleven ways to have a healthy radio and no grants. The 'detected by' column is the important one: in ten of the eleven cases the answer is nobody, which is why these faults survive in production.
Notice the pattern in the third column. In every case the UE is behaving correctly -- it is applying the configuration it was given, exactly as specified. There is no UE bug in this table. That is why chasing these in the UE is unproductive, and why the fastest diagnosis is almost always to decode the last RRCReconfiguration the UE received and derive the monitoring set from it by hand, rather than to trust what the network's own configuration database says it sent.
17.1 A triage order
When the presentation is no grants, healthy radio, these checks in this order resolve most cases in a few minutes:
- Is any PDCCH decoding at all? If CORESET#0 or a common search space works and the dedicated one does not, the fault is in the dedicated
PDCCH-Config-- which eliminates half the table above immediately. - Does the search space's
controlResourceSetIdresolve in the active BWP? Not in the cell, not in the configuration database -- in the BWP the UE is in right now. - Compute the monitored slots and check them against the TDD pattern.
- Compare
nrofCandidatesper level against the aggregation levels the scheduler actually used. - Compare
monitoringSymbolsWithinSlot's set bits against the CORESET'sduration. - Check the CORESET's TCI state against the last activation MAC CE and against which SSB the UE most recently reported as strongest.
18. ASN.1 Structures
Abridged from TS 38.331. ... marks omitted enumeration members, omitted fields and extension markers; nothing shown has been renamed.
18.1 ControlResourceSet
ControlResourceSet ::= SEQUENCE {
controlResourceSetId ControlResourceSetId,
frequencyDomainResources BIT STRING (SIZE (45)),
duration INTEGER (1..maxCoReSetDuration),
cce-REG-MappingType CHOICE {
interleaved SEQUENCE {
reg-BundleSize ENUMERATED {n2, n3, n6},
interleaverSize ENUMERATED {n2, n3, n6},
shiftIndex INTEGER (0..
maxNrofPhysicalResourceBlocks-1)
OPTIONAL
},
nonInterleaved NULL
},
precoderGranularity ENUMERATED {sameAsREG-bundle,
allContiguousRBs},
tci-StatesPDCCH-ToAddList SEQUENCE (SIZE (1..maxNrofTCI-
StatesPDCCH)) OF TCI-StateId OPTIONAL,
tci-StatesPDCCH-ToReleaseList SEQUENCE (SIZE (1..maxNrofTCI-
StatesPDCCH)) OF TCI-StateId OPTIONAL,
tci-PresentInDCI ENUMERATED {enabled} OPTIONAL,
pdcch-DMRS-ScramblingID INTEGER (0..65535) OPTIONAL,
...
}
ControlResourceSetId ::= INTEGER (0..maxNrofControlResourceSets-1)
-- 0..11
maxCoReSetDuration INTEGER ::= 3
maxNrofControlResourceSets INTEGER ::= 12
maxNrofTCI-StatesPDCCH INTEGER ::= 64Listing 2. nonInterleaved is a NULL branch -- choosing it carries no parameters at all, which is why reg-BundleSize, interleaverSize and shiftIndex simply do not exist in a non-interleaved CORESET.
18.2 SearchSpace
SearchSpace ::= SEQUENCE {
searchSpaceId SearchSpaceId,
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,
...
}
SearchSpaceId ::= INTEGER (0..maxNrofSearchSpaces-1) -- 0..39Listing 3. Every field after searchSpaceId is OPTIONAL, because a searchSpacesToAddModList entry may modify an existing search space by restating only the changed fields. In an initial configuration their absence is a defect, not a delta.
18.3 PDCCH-Config and PDCCH-ConfigCommon
PDCCH-Config ::= SEQUENCE {
controlResourceSetToAddModList SEQUENCE (SIZE (1..3)) OF
ControlResourceSet OPTIONAL,
controlResourceSetToReleaseList SEQUENCE (SIZE (1..3)) OF
ControlResourceSetId OPTIONAL,
searchSpacesToAddModList SEQUENCE (SIZE (1..10)) OF
SearchSpace OPTIONAL,
searchSpacesToReleaseList SEQUENCE (SIZE (1..10)) OF
SearchSpaceId OPTIONAL,
downlinkPreemption SetupRelease { DownlinkPreemption }
OPTIONAL,
tpc-PUSCH SetupRelease { PUSCH-TPC-
CommandConfig } OPTIONAL,
tpc-PUCCH SetupRelease { PUCCH-TPC-
CommandConfig } OPTIONAL,
tpc-SRS SetupRelease { SRS-TPC-
CommandConfig } OPTIONAL,
...
}
PDCCH-ConfigCommon ::= SEQUENCE {
controlResourceSetZero ControlResourceSetZero OPTIONAL,
commonControlResourceSet ControlResourceSet OPTIONAL,
searchSpaceZero SearchSpaceZero OPTIONAL,
commonSearchSpaceList SEQUENCE (SIZE(1..4)) OF
SearchSpace OPTIONAL,
searchSpaceSIB1 SearchSpaceId OPTIONAL,
searchSpaceOtherSystemInformation SearchSpaceId OPTIONAL,
pagingSearchSpace SearchSpaceId OPTIONAL,
ra-SearchSpace SearchSpaceId OPTIONAL,
...
}
ControlResourceSetZero ::= INTEGER (0..15)
SearchSpaceZero ::= INTEGER (0..15)Listing 4. Note the shape of PDCCH-ConfigCommon: the common search spaces are defined in commonSearchSpaceList and then assigned roles by the four searchSpace* fields, which carry ids rather than structures. A search space defined but assigned no role is never monitored.
PDCCH-ConfigCommon assigning roles by id is a second dangling-reference opportunity, distinct from the one in §8. pagingSearchSpace pointing at an id that is not in commonSearchSpaceList means the cell has no paging search space: every UE in RRC_IDLE in that cell is unpageable. It affects every UE at once, so it is usually caught in commissioning -- but it is caught as no terminating calls in one cell, which is rarely traced back to a search space id.
19. Worked Arithmetic
Four calculations that come up when checking a real configuration. The bitmap decode is in §4.1, the interleaver in §5.2, the coding rates in §11.1 and the TDD collision in §13.1; these are the remaining ones.
19.1 CORESET capacity, and how many UEs fit
CORESET 1: frequencyDomainResources gives 48 PRBs, duration = 2.
REGs = 48 x 2 = 96
CCEs = 96 / 6 = 16 CCEs
REs = 96 x 12 = 1152 resource elements
Data REs = 96 x 9 = 864
QPSK coded bits = 864 x 2 = 1728 bits of control per occasion
How many UEs fit in one occasion, by aggregation level mix:
all at AL1: 16 / 1 = 16 UEs, but the hashing function will not offer
a collision-free assignment for more than about 8-10
all at AL2: 16 / 2 = 8 UEs
all at AL4: 16 / 4 = 4 UEs
one at AL16: 16 / 16 = 1 UE, and the CORESET is full
Realistic mix -- 2 UEs at AL8, 2 at AL4, 4 at AL2:
16 + 8 + 8 = 32 CCEs required against 16 available: two of these UEs are not scheduled this occasion, whatever the PDSCH capacity.
19.2 Occasions per second, and the monitoring load
30 kHz SCS: 20 slots per 10 ms frame, 2000 slots per second.
Search space A: sl1, duration absent, symbol bitmap bit 0 only
monitored slots per second = 2000
occasions per slot = 1
2000 occasions/s
Search space B: sl4 offset 2, duration 2, bitmap bits 0 and 8
monitored slots per period = 2 of every 4 -> 1000 slots/s
occasions per slot = 2
2000 occasions/s
Identical monitoring load, and completely different latency:
A: worst-case wait for an occasion = 1 slot = 500 us
B: worst-case wait = 2 slots and 8 symbols
(the gap from symbol 9 of slot 3 to symbol 0 of slot 6)
= about 1.2 ms
Load and latency are separate axes. Bursty monitoring buys nothing unless the burst is where the traffic is.
19.3 What one CORESET costs in spectral efficiency
Cell: 106 PRBs at 30 kHz (40 MHz), 14 symbols per slot.
Slot capacity = 106 x 14 = 1484 PRB-symbols
CORESET 1: 48 PRB x 2 symbols = 96 PRB-symbols per occasion.
At sl1 with one occasion per slot, in every slot:
96 / 1484 = 6.5% of the slot's resource elements
At sl1 with two occasions per slot (symbols 0 and 8):
192 / 1484 = 12.9%
Plus CORESET#0 at 48 PRB x 2 symbols, monitored 2 slots in every 40 (20 ms Type0 periodicity at 30 kHz):
96 x 2 / (1484 x 40) = 0.32% -- negligible
So the dedicated CORESET is the whole cost, and sub-slot monitoring doubles it. 13% of the carrier spent on control is a real number and it is the price of low grant latency. Note that these REs are not wholly wasted when unused: PDSCH is rate-matched around the CCEs actually transmitted, not around the whole CORESET, so a lightly loaded CORESET costs less than its footprint.
19.4 Do the candidates fit the per-slot budget?
30 kHz SCS: M_max = 36 candidates, C_max = 56 non-overlapping CCEs per slot TS 38.213 cl. 10.1, Tables 10.1-2 and 10.1-3.
Configuration, all monitored in the same slot:
SS#1 common, on CORESET#0 (8 CCEs): AL4 n1, AL8 n1 = 2 cand.
SS#2 UE-specific, on CORESET 1 (16 CCEs):
AL1 n6, AL2 n6, AL4 n2, AL8 n2, AL16 n1 = 17 cand.
SS#3 UE-specific, on CORESET 1:
AL1 n8, AL2 n8, AL4 n4 = 20 cand.
Total candidates = 2 + 17 + 20 = 39 against M_max = 36
Over budget by 3.
Non-overlapping CCEs: bounded by the CORESET sizes, 8 + 16 = 24 against C_max = 56, so the CCE limit is not the binding one here.
The UE drops UE-specific search spaces in increasing searchSpaceId order until it fits, so SS#3 is dropped entirely -- 20 candidates removed to save 3. SS#1, being common, is never dropped. The exact dropping rules are in the companion 31 PDCCH Blind Decoding document; the point here is the granularity. Overbooking is resolved by discarding whole search spaces, not individual candidates, so being 3 over budget can cost 20 candidates.
20. Illustrative Message Traces
Illustrative trace. Field names and encodings follow 3GPP; the values are constructed for this document and are not a capture from any deployed or lab network.
One UE, C-RNTI 0x4C11, in a 40 MHz FR1 TDD cell at 30 kHz subcarrier spacing, physical cell identity 217, TDD pattern DDDDDDDSUU. The same configuration is carried through all five listings.
20.1 A decoded PDCCH-Config: two CORESETs, three search spaces
10:22:41.117 [RRC-DL] RRCReconfiguration
criticalExtensions/rrcReconfiguration
secondaryCellGroup ................ absent
masterCellGroup/spCellConfig/spCellConfigDedicated
initialDownlinkBWP ............... (bwp-Id 0, from SIB1)
downlinkBWP-ToAddModList
BWP-Downlink
bwp-Id ........................ 1
bwp-Common/genericParameters
locationAndBandwidth ......... 28875 -- start CRB 12, 106 PRB
subcarrierSpacing ............ kHz30
bwp-Dedicated/pdcch-Config/setup
controlResourceSetToAddModList
ControlResourceSet [0]
controlResourceSetId ....... 1
frequencyDomainResources ... 0x3FC0000000 -- 8 bits: b2..b9
-- BWP RB 12..59
duration ................... 2 -- 96 REG = 16 CCE
cce-REG-MappingType
interleaved
reg-BundleSize ........... n6
interleaverSize .......... n2
shiftIndex ............... 217 -- = physCellId
precoderGranularity ........ sameAsREG-bundle
pdcch-DMRS-ScramblingID .... 217
tci-StatesPDCCH-ToAddList
TCI-StateId .............. 0
tci-PresentInDCI ........... absent
ControlResourceSet [1]
controlResourceSetId ....... 2
frequencyDomainResources ... 0x0038000000 -- 3 bits: b10..b12
-- BWP RB 60..77
duration ................... 1 -- 18 REG = 3 CCE
cce-REG-MappingType
nonInterleaved ........... NULL
precoderGranularity ........ allContiguousRBs
pdcch-DMRS-ScramblingID .... 1042
tci-StatesPDCCH-ToAddList
TCI-StateId .............. 3Listing 5. The CORESET half. CORESET 1 is the workhorse: wide, two symbols, interleaved, 16 CCEs. CORESET 2 is a narrow non-interleaved 3-CCE CORESET on a different beam -- and note it has its own scrambling id.
searchSpacesToAddModList
SearchSpace [0]
searchSpaceId .............. 1
controlResourceSetId ....... 1
monitoringSlotPeriodicityAndOffset
sl1 ....................... NULL -- every slot
duration ................... absent -- = 1 slot
monitoringSymbolsWithinSlot 10000000000000 -- symbol 0 only
nrofCandidates
aggregationLevel1 ........ n6
aggregationLevel2 ........ n6
aggregationLevel4 ........ n2
aggregationLevel8 ........ n2
aggregationLevel16 ....... n0 -- AL16 not searched
searchSpaceType
ue-Specific
dci-Formats .............. formats0-1-And-1-1
SearchSpace [1]
searchSpaceId .............. 2
controlResourceSetId ....... 1
monitoringSlotPeriodicityAndOffset
sl4 ....................... 2 -- k=4, o=2
duration ................... 2 -- slots 2,3 of 4
monitoringSymbolsWithinSlot 10000000100000 -- symbols 0 and 8
nrofCandidates
aggregationLevel1 ........ n4
aggregationLevel2 ........ n2
aggregationLevel4 ........ n1
aggregationLevel8 ........ n0
aggregationLevel16 ....... n0
searchSpaceType
ue-Specific
dci-Formats .............. formats0-1-And-1-1
SearchSpace [2]
searchSpaceId .............. 3
controlResourceSetId ....... 2
monitoringSlotPeriodicityAndOffset
sl10 ...................... 0
monitoringSymbolsWithinSlot 10000000000000
nrofCandidates
aggregationLevel1 ........ n1
aggregationLevel2 ........ n1
aggregationLevel4 ........ n0
aggregationLevel8 ........ n0
aggregationLevel16 ....... n0
searchSpaceType
common
dci-Format2-0 ............ (SFI, nrofCandidates-SFI AL4 n1)Listing 6. The search space half. Three spaces, two CORESETs. SS#1 is dense and always-on; SS#2 adds a sub-slot occasion at symbol 8 in half the slots; SS#3 is the SFI monitor on the narrow CORESET.
20.2 The bitmap decoded to a PRB set
10:22:41.118 [PHY-CFG] CORESET 1 installed
frequencyDomainResources ... 0x3FC0000000
octet 1 = 0x3F = 0011 1111 -> b0=0 b1=0 b2..b7 = 1
octet 2 = 0xC0 = 1100 0000 -> b8=1 b9=1 b10..b15 = 0
octets 3-6 = 0x00 -> b16..b44 = 0 (+3 pad bits)
bits set ................... b2, b3, b4, b5, b6, b7, b8, b9 (8)
BWP reference .............. locationAndBandwidth 28875
-> RB_start = 12, L_RB = 106
group g -> BWP RB 6g..6g+5, offset by RB_start:
b2 -> BWP RB 12..17 -> CRB 24..29
b3 -> BWP RB 18..23 -> CRB 30..35
b4 -> BWP RB 24..29 -> CRB 36..41
b5 -> BWP RB 30..35 -> CRB 42..47
b6 -> BWP RB 36..41 -> CRB 48..53
b7 -> BWP RB 42..47 -> CRB 54..59
b8 -> BWP RB 48..53 -> CRB 60..65
b9 -> BWP RB 54..59 -> CRB 66..71
CORESET extent ............. CRB 24..71, contiguous, 48 PRB
N_REG = 48 x 2 ............. 96
N_CCE = 96 / 6 ............. 16
bundles = 96 / 6 ........... 16 -- reg-BundleSize n6
bundles per CCE = 6/6 ...... 1 -- CCE == bundle at L=6
interleaver: R=2, C = 96/(6x2) = 8, n_shift = 217
f(x) = (r*8 + c + 217) mod 16
CCE 0 -> bundle f(0) = (0 + 0 + 217) mod 16 = 9
CCE 1 -> bundle f(1) = (8 + 0 + 217) mod 16 = 1
CCE 2 -> bundle f(2) = (0 + 1 + 217) mod 16 = 10
CCE 3 -> bundle f(3) = (8 + 1 + 217) mod 16 = 2
... -- pairs alternate by 8
-- note: at reg-BundleSize n6 the interleaver permutes whole CCEs,
-- so a CCE is still 6 contiguous REGs; the diversity comes from
-- where in the CORESET that block of 6 lands, not from splitting itListing 7. A hand-decode of the same field, carried through to the interleaver. The last comment is the point most often missed: reg-BundleSize n6 with duration 2 means a bundle is 3 PRBs x 2 symbols, one whole CCE, so interleaving relocates CCEs rather than fragmenting them.
20.3 Deriving the monitoring occasions
10:22:41.119 [PHY-CFG] monitoring occasion derivation, SFN 128
N_slot_per_frame = 20 -- 30 kHz
TDD pattern = D D D D D D D S U U -- 10-slot period
SearchSpace 1 : sl1, d=1, symbols {0}
monitored slots ......... every slot, 0..19
occasions/slot .......... 1 (symbols 0-1, CORESET duration 2)
on UL slots 8,9,18,19 ... configured but never used (4 dropped)
live occasions/frame .... 16
SearchSpace 2 : sl4, o=2, d=2, symbols {0, 8}
(n - 2) mod 4 < 2 ....... n = 2,3, 6,7, 10,11, 14,15, 18,19
occasions/slot .......... 2 (symbols 0-1 and 8-9)
on UL slots 18,19 ....... 4 occasions dropped
live occasions/frame .... 16
SearchSpace 3 : sl10, o=0, d=1, symbols {0}
(n - 0) mod 10 = 0 ...... n = 0, 10
occasions/slot .......... 1 (symbol 0, CORESET 2 duration 1)
live occasions/frame .... 2
total configured/frame ... 20 + 20 + 2 = 42
total live/frame ......... 16 + 16 + 2 = 34
DRX: drx-onDurationTimer 8 slots from slot 0 of every even SFN
-> in an even SFN, occasions inside Active Time:
SS1: slots 0..7 = 8
SS2: slots 2,3,6,7 x 2 symbols = 8
SS3: slot 0 = 1
-- 17 of 42
-- 42 configured, 34 usable against the TDD pattern, 17 inside
-- Active Time. Configuration count is not monitoring count.Listing 8. The full derivation for the configuration in §20.1. The 42-to-17 reduction is entirely from mechanisms the search space configuration does not mention.
20.4 A successful grant
10:22:43.502 [PHY-DL] SFN 176 slot 4 sym 0 monitoring occasion
CORESET ................ 1 (CRB 24..71, 16 CCE)
search space ........... 1 (ue-Specific)
Y_p,n .................. 0x1A73 (C-RNTI 0x4C11 recursion)
candidates attempted ... AL1 x6, AL2 x6, AL4 x2, AL8 x2
= 16 attempts, 2 DCI sizes each
PDCCH found at ......... AL2, candidate m=3, CCE 6-7
DCI format ............. 1_1 (60 bits + 24 CRC)
CRC scrambled by ....... C-RNTI 0x4C11
effective code rate .... 84 / 216 = 0.389
measured PDCCH SINR .... 14.2 dB
10:22:43.502 [MAC-DL] DCI 1_1 decoded
bwp-Indicator .......... 1 (no switch)
freq domain alloc ...... type1, RIV -> 40 PRB from PRB 8
time domain alloc ...... row 2 -> K0=0, S=2, L=12
mcs .................... 19
harq process ........... 3
pdsch-to-HARQ_feedback . k1 = 4 -> PUCCH in slot 8
-- PDSCH starts at symbol 2 of this slot, i.e. immediately
-- after the 2-symbol CORESET. This is why CORESET
-- duration bounds the earliest SLIV start.Listing 9. A grant found at AL2 on the second candidate index tried. The SLIV S=2 is not a coincidence -- it is the first symbol after the CORESET, which is the tightest legal start for this CORESET duration.
20.5 A UE that stops getting grants
10:31:08.440 [RRC-DL] RRCReconfiguration (transaction 2)
masterCellGroup/spCellConfig/spCellConfigDedicated
downlinkBWP-ToAddModList/BWP-Downlink(bwp-Id 1)
bwp-Dedicated/pdcch-Config/setup
controlResourceSetToReleaseList
ControlResourceSetId ........ 1 -- CORESET 1 released
controlResourceSetToAddModList
ControlResourceSet
controlResourceSetId ....... 3 -- replacement, new id
frequencyDomainResources ... 0x3FC0000000
duration ................... 2
cce-REG-MappingType/interleaved
reg-BundleSize ............ n6
interleaverSize ........... n2
precoderGranularity ........ sameAsREG-bundle
pdcch-DMRS-ScramblingID .... 217
-- searchSpacesToAddModList ABSENT: no search space was updated
10:31:08.446 [RRC-UL] RRCReconfigurationComplete (transaction 2)
-- the UE accepts it. Nothing here is malformed.
10:31:08.448 [PHY-CFG] CORESET set for BWP 1 recomputed
CORESET 2 .............. present
CORESET 3 .............. present (new)
CORESET 1 .............. RELEASED
search space 1 -> controlResourceSetId 1 ... UNRESOLVED
search space 2 -> controlResourceSetId 1 ... UNRESOLVED
search space 3 -> controlResourceSetId 2 ... ok
-- SS1 and SS2 produce no monitoring occasions
-- CORESET 3 has no search space pointing at it
10:31:08.500 [PHY-DL] SFN 292 slot 0 occasions this slot: 1
-- SS3 only (SFI on CORESET 2). No C-RNTI candidates.
10:31:09.000 [SCHED] DL data queued for C-RNTI 0x4C11, 12 kB
10:31:09.001 [SCHED] PDCCH allocated: CORESET 3, AL2, CCE 4-5
10:31:09.001 [PHY-DL] DCI 1_1 transmitted, CRC scrambled 0x4C11
-- transmitted into a CORESET the UE is not monitoring
10:31:09.005 [MAC] no HARQ-ACK for process 5 at k1
10:31:09.500 [SCHED] retransmission, AL4 -- same CORESET
10:31:10.001 [SCHED] retransmission, AL8 -- same CORESET
-- raising the aggregation level cannot help: the problem
-- is not SINR, it is that nobody is listening
10:31:12.440 [MAC] dl-DataSplitThreshold buffer full, discard
10:31:16.000 [RRC] UE-inactivity supervision -> releaseListing 10. The dangling-reference failure end to end. Note the scheduler's response: it raises the aggregation level, which is the correct reaction to PDCCH loss and is completely ineffective here. Serving RSRP and SINR were unchanged throughout.
Three things in that trace are worth internalising. First, RRCReconfigurationComplete was sent -- the UE had no basis to reject anything, because a search space with an unresolved controlResourceSetId is not a protocol error. Second, the escalation to AL8 is a false signal: it makes the log look like a coverage problem. Third, the last working message from the UE is the RRCReconfigurationComplete itself, so the timestamp of the fault is exactly the timestamp of a successful RRC procedure -- which is where you should look first when a UE goes quiet.
21. Release Deltas: Rel-15 to Rel-18
| Release | Change | Why it matters when reading a configuration |
|---|---|---|
| Rel-15 | ControlResourceSet and SearchSpace as described in §3 and §9; CORESET#0 from pdcch-ConfigSIB1; search space types Type0 to Type3 and UE-specific; one monitoring occasion per slot as the practical norm | The baseline. Everything in §1 through §13 is Rel-15 unless marked otherwise. |
| Rel-16 | Span-based PDCCH monitoring: pdcch-Monitoring-r16 capability with (X, Y) pairs (7,3), (4,3) and (2,2); per-span candidate and CCE limits | The per-slot budget is no longer the only budget. A sub-slot monitoring configuration is meaningless without the matching capability (§14.2). |
| Rel-16 | Search space set group switching: searchSpaceSwitchingTimer, and DCI 2_0 carrying a search space group indication | A UE can change its monitoring pattern with no RRC message. A UE that stops monitoring is not necessarily in DRX and not necessarily lost. |
| Rel-16 | New group-common DCI formats and their search space branches: dci-Format2-4-r16 (uplink cancellation, CI-RNTI), dci-Format2-5-r16 (IAB availability, AI-RNTI), dci-Format2-6-r16 (power saving, PS-RNTI) | Three more RNTIs that can legitimately appear in a common search space, and three more DCI sizes contributing to the size-alignment count. |
| Rel-16 | Cross-carrier scheduling refinements and CORESET pool indexing (coresetPoolIndex) for multi-TRP operation | Two CORESETs with different coresetPoolIndex values can schedule the same cell from different transmission points, with separate HARQ bookkeeping. |
| Rel-17 | Multi-slot PDCCH monitoring for 480 and 960 kHz subcarrier spacing: candidate and CCE limits defined over a group of slots | At FR2-2 numerologies the per-slot limit is unusable. A UE may legitimately monitor in some slots of a group and not others. |
| Rel-17 | PDCCH skipping and enhanced search space group switching, both DCI-triggered | Another way for monitoring to stop without a DRX transition or an RRC message. |
| Rel-17 | freqMonitorLocations-r17 -- a search space replicated across up to five frequency locations | For wideband NR-U operation. One SearchSpace IE can now describe monitoring in several sub-bands. |
| Rel-17 | RedCap: reduced-bandwidth UEs with their own initial BWP, and CORESET#0 constrained to fit a 20 MHz (FR1) receiver | Two UE classes in one cell may monitor different CORESETs for the same common signalling. |
| Rel-17 | Unified TCI framework -- a single indicated TCI state applying to PDCCH, PDSCH and uplink together | The CORESET's beam may now be set by the unified indication rather than by tci-StatesPDCCH-ToAddList plus its MAC CE, so the old activation trace may be absent. |
| Rel-18 | LTM (L1/L2-triggered mobility): candidate cell configurations, including their PDCCH-Config, pre-provisioned and activated by MAC CE or DCI | The CORESET and search space set can change without an RRCReconfiguration at all. The configuration in the last RRC message may not be the one in force. |
| Rel-18 | Network energy saving: cell DTX/DRX, spatial element adaptation, and coarser PDCCH monitoring patterns | The network may now be asleep during a configured monitoring occasion. Absence of a grant is no longer evidence about the UE. |
| Rel-18 | Further multi-carrier scheduling: one DCI scheduling PDSCH on two cells | A CORESET on one cell can now carry a grant whose resources are on two others. |
Table 22. CORESET and search space changes by release. Feature presence must be confirmed against the UE capability exchange -- see the companion 26 UE Capability document -- because almost every Rel-16 and Rel-17 entry here is optional.
The Rel-17 and Rel-18 entries share a theme that changes how these logs must be read. In Rel-15, the monitoring configuration in force was exactly the one in the last RRCReconfiguration. From Rel-16 onward it can be changed by DCI (search space group switching, PDCCH skipping) or by MAC CE (TCI activation, LTM cell switch). Reconstructing what a UE was monitoring at a given instant now requires the RRC configuration and every subsequent group-switch DCI and MAC CE. If your tooling only captures RRC, it is telling you what the UE was configured with, not what it was doing.
22. Reading CORESET and Search Space in Logs: A Checklist
- Find the active BWP first. Every CORESET and search space is scoped to a downlink BWP, and ids are reused across BWPs. A configuration dump that does not say which BWP is active is not actionable. Look for the last DCI BWP indicator, the last
bwp-InactivityTimerexpiry, or thefirstActiveDownlinkBWP-Idin the reconfiguration. - Resolve every search space's
controlResourceSetIdagainst that BWP's CORESET list. Do it mechanically, one at a time. An unresolved reference is the single most common fault and it produces no error anywhere. CheckcontrolResourceSetToReleaseListin every reconfiguration since setup, not just the most recent one. - Decode
frequencyDomainResourcesby hand and check it against the BWP. Count the set bits, multiply by six, add the BWP start. Confirm the result lies wholly inside the BWP -- bits for groups outside it are treated as zero, which silently shrinks the CORESET and its CCE count. - Compute
N_CCE= PRBs xduration/ 6, and compare it against the aggregation levels in use. If the highest configured aggregation level needs more CCEs than the CORESET holds, those candidates do not exist. A 16-CCE CORESET has exactly one AL16 candidate and it consumes the whole CORESET. - Derive the monitored slots, then take them modulo the TDD period. (SFN x N_slot + n - offset) mod periodicity < duration. If the periodicity shares a factor with the TDD period, the occasions are locked to fixed positions in the pattern -- check whether those positions are downlink (§13.1).
- Check
monitoringSymbolsWithinSlotagainst the CORESET'sduration. A set bit at symbol s means the CORESET occupies symbols s to s +duration- 1. A bit above 14 -durationis invalid, and a bit at a symbol the TDD pattern makes uplink is dead. - Compare
nrofCandidatesper aggregation level against the aggregation levels the scheduler actually chose. Ann0at the level the scheduler uses is a silent, total failure for every grant at that level. This is the check that most often finds the fault when some grants arrive and others do not. - Confirm
dci-Formatsisformats0-1-And-1-1if any advanced feature is expected. Withformats0-0-And-1-0the UE works, at low rate, with every optional feature silently inert. - Sum the candidates across every search space sharing a monitoring occasion and compare against M_max for the numerology. Over budget means whole UE-specific search spaces are dropped, in increasing id order -- so the symptom is intermittent and correlates with which search spaces coincide in that slot. Doc 31 has the exact rules.
- Check the CORESET's TCI state against the last TCI activation MAC CE and against the UE's most recent beam report. A CORESET on a beam the UE cannot hear looks perfect in every configuration field.
- Check
pdcch-DMRS-ScramblingIDandshiftIndexagainst the neighbours', not just against the UE. Identical values across neighbours produce systematic interference that does not respond to aggregation level. - Finally, confirm the capability. Span-based monitoring, PDCCH skipping, search space group switching and the Rel-17 multi-slot limits are all optional. A configuration using them against a UE that did not report them degrades silently to Rel-15 behaviour.
23. Glossary
| Term | Expansion | Meaning in this document |
|---|---|---|
| CORESET | Control Resource Set | A set of 6-PRB groups over 1-3 OFDM symbols in which PDCCH may be transmitted, plus the CCE-to-REG mapping, precoding and DMRS rules for it. Configured by ControlResourceSet (§3). |
| CORESET#0 | -- | The CORESET derived from controlResourceSetZero in the MIB rather than configured by an IE. The only CORESET a UE knows before it has read anything (§7). |
| REG | Resource Element Group | One PRB in one OFDM symbol: 12 REs, of which 3 carry PDCCH DMRS. The counting unit for CORESET size. |
| REG bundle | -- | reg-BundleSize consecutive REGs. The unit of both interleaving and precoder granularity, which is why one field governs two apparently unrelated things (§2, §6.1). |
| CCE | Control Channel Element | Six REGs: 72 REs, 54 of them data, 108 QPSK coded bits. The PDCCH allocation quantum. |
| Search space | -- | A SearchSpace IE: a CORESET reference, a monitoring periodicity, offset, duration and symbol bitmap, candidate counts per aggregation level, and a DCI format declaration (§9). |
| Monitoring occasion | -- | One (slot, starting symbol) pair at which the UE attempts to decode PDCCH in a given search space. Derived in §12. |
| Aggregation level | AL | The number of CCEs one PDCCH occupies: 1, 2, 4, 8 or 16. The only reliability lever available on PDCCH (§11). |
| PDCCH candidate | -- | A specific set of L CCE indices in a specific CORESET at a specific occasion. The unit of blind decoding; positions come from the hashing function in doc 31. |
| Type0 / 0A / 1 / 2 / 3-PDCCH | -- | Search space roles defined in TS 38.213 cl. 10.1 for SIB1, other SI, random access response, paging and common signalling respectively. All encode as searchSpaceType common (§10). |
nrofCandidates | -- | Per-aggregation-level blind-decode count, n0 to n8. n0 means the level is not searched at all. |
| Span | -- | A window of consecutive symbols containing all of a UE's monitoring occasions, characterised by a Rel-16 (X, Y) capability pair (§14). |
| Overbooking | -- | Configuring more candidates in a slot than the per-slot budget allows, resolved by dropping whole UE-specific search spaces in increasing searchSpaceId order. Owned by doc 31. |
shiftIndex | -- | The cyclic shift n_shift in the CCE-to-REG interleaver. Defaults to the physical cell identity, and exists for inter-cell decorrelation (§5.3). |
precoderGranularity | -- | How wide a span the UE may assume one precoder over, and therefore how far it may average PDCCH DMRS (§6.1). |
| TCI state | Transmission Configuration Indication state | A QCL relationship telling the UE which receive beam to use for the CORESET. Configured in RRC, activated by MAC CE (§6.3). |
| N_CCE,p | -- | The number of CCEs in CORESET p: PRBs x duration / 6. Appears in the hashing function in doc 31 and bounds every candidate. |
24. References
- 3GPP TS 38.331 -- RRC protocol specification.
ControlResourceSetandControlResourceSetId;SearchSpaceandSearchSpaceId;PDCCH-Config;PDCCH-ConfigCommonincludingcontrolResourceSetZero,searchSpaceZero,commonControlResourceSet,commonSearchSpaceList,searchSpaceSIB1,searchSpaceOtherSystemInformation,pagingSearchSpaceandra-SearchSpace;BWP-DownlinkCommonandBWP-DownlinkDedicated;PDCCH-ServingCellConfig; clause 5.2.2.3.2 (SI acquisition and the search spaces it uses); the field descriptions forfrequencyDomainResources,monitoringSymbolsWithinSlotandnrofCandidates, which carry constraints not visible in the ASN.1. - 3GPP TS 38.213 -- Physical layer procedures for control. Clause 10.1 (UE procedure for determining PDCCH assignment: search space types, monitoring occasion derivation, the candidate hashing function, per-slot and per-span candidate and CCE limits in Tables 10.1-2 and 10.1-3, and the overbooking rules); clause 10.2 (PDCCH validation for DL SPS and configured grants); clause 11.1 (slot configuration, and the interaction between monitoring occasions and uplink symbols); clause 13 (initial access:
pdcch-ConfigSIB1, the CORESET#0 and Type0-PDCCH tables, and the SS/PBCH-CORESET multiplexing patterns). - 3GPP TS 38.211 -- Physical channels and modulation. Clause 7.3.2 (PDCCH): 7.3.2.1 (scrambling), 7.3.2.2 (CCE-to-REG mapping, the REG numbering convention, the interleaver f(x), REG bundles and precoder granularity), 7.3.2.3 (PDCCH DMRS sequence generation and its initialisation from
pdcch-DMRS-ScramblingID); clause 7.4.1.3 (PDCCH DMRS mapping to resource elements). - 3GPP TS 38.212 -- Multiplexing and channel coding. Clause 7.3.1 (DCI formats and their field-by-field composition, which fixes the payload sizes used in the coding-rate arithmetic in §11.1); clause 7.3.2 (DCI size alignment); clause 7.3.3 (CRC attachment, the 24-bit CRC and RNTI scrambling); clause 5.3.1 (polar coding and rate matching for PDCCH).
- 3GPP TS 38.214 -- Physical layer procedures for data. Clause 5.1 (PDSCH reception, including the rate matching around a CORESET that makes the footprint arithmetic in §19.3 correct).
- 3GPP TS 38.321 -- MAC protocol specification. Clause 5.7 (DRX and Active Time, which gates every monitoring occasion); clause 6.1.3.15 (TCI States Indication for UE-specific PDCCH MAC CE).
- 3GPP TS 38.306 -- UE radio access capabilities.
pdcch-Monitoring-r16and the (X, Y) span pairs; the per-BWP CORESET and search space counts a UE must support; the Rel-17 multi-slot monitoring capabilities. - 3GPP TS 38.133 -- Requirements for support of radio resource management. Clause 8.6 (BWP switch delay, i.e. the window in which no CORESET is monitored); the measurement gap definitions that remove monitoring occasions.
- 3GPP TS 38.300 -- NR overall description. Clause 6 (the downlink physical layer structure and where PDCCH sits in it); clause 9.2 (the procedures that depend on common search spaces).
Companion documents in this set
- 02 Radio Frame Structure -- slots, symbols, the common resource block grid and the bandwidth part machinery that every CORESET is positioned against.
- 03 Random Access -- Type1-PDCCH in use: the RAR window, RA-RNTI and the search space the UE monitors before it has a C-RNTI.
- 08 Scheduling -- the survey-level view of CORESETs, search spaces and DCI formats, and the resource-allocation machinery that the grants found here carry.
- 11 DRX -- Active Time, which is the dominant reducer of monitoring occasions in any power-saving configuration (§13.2).
- 12 Beam Failure Recovery -- what happens when the beam a CORESET's TCI state points at stops working.
- 17 System Information / 18 MIB and SIB1 IEs --
pdcch-ConfigSIB1, the CORESET#0 andsearchSpaceZerotable lookups, and the SI windows that Type0 and Type0A monitor within. - 19 Paging -- Type2-PDCCH: paging occasions, P-RNTI, and the
pagingSearchSpacereference. - 21 Measurement Gaps and SMTC -- gaps, which remove monitoring occasions without appearing anywhere in the search space configuration.
- 26 UE Capability --
pdcch-Monitoring-r16, the span pairs, and everything else that must be confirmed before a Rel-16 or Rel-17 monitoring configuration means anything. - 29 Carrier Aggregation -- per-cell CORESETs, cross-carrier scheduling, and the apportionment of the per-slot candidate budget across serving cells.
- 31 PDCCH Blind Decoding -- the candidate hashing function, the per-slot and per-span budgets, and the overbooking and dropping rules. This document produces the input; that one consumes it (§15).
- 32 SLIV and Time Domain Allocation -- why a CORESET's
durationbounds the earliest PDSCH start symbol, and what that costs in latency. - 33 DMRS -- the PDCCH DMRS structure that
precoderGranularityandpdcch-DMRS-ScramblingIDgovern, and the channel estimation that depends on both. - 34 Link Adaptation -- the aggregation-level and MCS selection loops, and the outer-loop correction that responds to PDCCH loss.
- 35 Physical Channels -- where PDCCH sits among the other physical channels, and the resource-element-level mapping of all of them.