>
Home5G NRPHY — Physical LayerCORESET & Search Space
📶 PHY — Physical LayerIntermediate

CORESET & Search Spaces in 5G NR

Where and when the UE hunts for PDCCH — control resource sets, search spaces, CCEs and aggregation levels.

📚 3GPP-basedTS 38.211TS 38.213

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
  1. 01The Bootstrapping Problem: Why Control Resources Come First
  2. 02The Unit Hierarchy: REG, REG Bundle and CCE
  3. 03ControlResourceSet, Field by Field
  4. 04frequencyDomainResources: The 45-Bit Bitmap, Decoded
  5. 05CCE-to-REG Mapping: Interleaved and Non-Interleaved
  6. 06Precoder Granularity, DMRS Scrambling and Beam Indication
  7. 07CORESET#0: The One You Get Before You Know Anything
  8. 08How Many CORESETs, and Where They Are Scoped
  9. 09SearchSpace, Field by Field
  10. 10The Search Space Types: Type0 to Type3 and UE-Specific
  11. 11Aggregation Levels and What They Buy
  12. 12Monitoring Occasions: From Three Fields to a Set of Slots
  13. 13Monitoring Against the TDD Pattern, DRX and BWP Switching
  14. 14Multi-Slot Monitoring, Spans and the Rel-16 Capability
  15. 15Where This Hands Off to Blind Decoding
  16. 16Parameter and Range Reference
  17. 17Failure Modes, and What Each Looks Like in a Log
  18. 18ASN.1 Structures
  19. 19Worked Arithmetic
  20. 20Illustrative Message Traces
  21. 21Release Deltas: Rel-15 to Rel-18
  22. 22Reading CORESET and Search Space in Logs: A Checklist
  23. 23Glossary
  24. 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:

StageWhat the UE knowsHow it learned itWhat it can do next
After PSS/SSS/PBCH decodeOne CORESET (CORESET#0) and one search space (searchSpaceZero)pdcch-ConfigSIB1 in the MIB, four bits each, indexing tables in TS 38.213 cl. 13Monitor Type0-PDCCH for SI-RNTI and receive SIB1
After SIB1 decodeThe common CORESET and the common search spaces of the initial DL BWPPDCCH-ConfigCommon inside initialDownlinkBWPRandom access (Type1), paging (Type2), other SI (Type0A)
After RRC (re)configurationUp to three more CORESETs and up to ten search spaces per bandwidth partPDCCH-Config inside BWP-DownlinkDedicatedOrdinary 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.

💡
Key point

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.

Figure 1. The merge the UE performs at every BWP switch. Note the decision node: an unresolvable 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-ConfigSIB1 in the MIB.
  • SIB1 acquisition, which installs PDCCH-ConfigCommon for the initial DL BWP.
  • RRC setup, resume or reestablishment, which installs PDCCH-Config for each configured dedicated BWP.
  • Any BWP switch -- by DCI BWP indicator, by bwp-InactivityTimer expiry, 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-Config per 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-Config arrives inside reconfigurationWithSync and 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.

UnitDefinitionSizeWhat it is the unit of
REOne subcarrier in one OFDM symbol1 subcarrier x 1 symbolNothing, at this layer -- the grid's atom
REGOne resource block in one OFDM symbol12 REs: 3 DMRS + 9 dataCounting. A CORESET's size is measured in REGs TS 38.211 cl. 7.3.2.2
REG bundlereg-BundleSize consecutive REGs2, 3 or 6 REGsInterleaving and precoding. The UE may assume one precoder across a bundle, so it may average DMRS across it
CCESix REGs, in 6 / reg-BundleSize bundles72 REs: 18 DMRS + 54 dataPDCCH allocation. Every PDCCH occupies a power-of-two number of CCEs
PDCCH candidateL contiguous-in-CCE-index CCEsL = 1, 2, 4, 8 or 16 CCEsBlind 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.

Figure 2. A 24-PRB, 2-symbol CORESET: 48 REGs, 24 bundles at 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

🧮
Worked calculation

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.

⚠️
Common pitfall

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.

FieldType and rangeTypicalWhat it decides
controlResourceSetIdINTEGER (0..11) -- maxNrofControlResourceSets-11 or 2 for dedicatedIdentity 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.
frequencyDomainResourcesBIT STRING (SIZE (45))8-16 bits setWhich 6-PRB groups the CORESET occupies. §4 decodes one in full.
durationINTEGER (1..3) symbols2How many consecutive OFDM symbols, starting at the search space's first monitoring symbol. Multiplies the CCE count and delays PDSCH.
cce-REG-MappingTypeCHOICE { interleaved, nonInterleaved }interleavedWhether a CCE's REGs are contiguous or spread across the CORESET. §5.
reg-BundleSizeENUMERATED {n2, n3, n6} (inside interleaved)n6Bundle size in REGs. n2/n6 at duration 1-2; n3/n6 at duration 3. Also the precoder granularity when precoderGranularity = sameAsREG-bundle.
interleaverSizeENUMERATED {n2, n3, n6} (inside interleaved)n2The block interleaver's row count R. With reg-BundleSize it fixes how far apart a CCE's bundles land.
shiftIndexINTEGER (0..274), optional (inside interleaved)the physical cell idCyclic shift n_shift applied after interleaving. Its purpose is inter-cell decorrelation; defaults to the physical cell id when absent.
precoderGranularityENUMERATED { sameAsREG-bundle, allContiguousRBs }sameAsREG-bundleHow wide a span the UE may assume one precoder over, and therefore how far it may average DMRS. §6.
pdcch-DMRS-ScramblingIDINTEGER (0..65535), optionalthe physical cell idInitialises the PDCCH DMRS sequence. Must match between gNB and UE exactly or channel estimation fails. §6.2.
tci-StatesPDCCH-ToAddListSEQUENCE (SIZE (1..64)) OF TCI-StateId, optionalone entryWhich TCI state -- i.e. which downlink beam -- the CORESET is transmitted on. §6.3.
tci-PresentInDCIENUMERATED {enabled}, optionalabsentWhether 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.

⚠️
Common pitfall

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.

Figure 3. The same CORESET in the grid. Two points people get wrong: the CORESET does not consume whole symbols across the carrier, and PDSCH in the same slot is rate-matched around it rather than starting after it.

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.
Figure 4. A real bitmap decoded. Reading it as six octets is how it appears in a hex dump; reading it as 45 bits plus padding is how the decoder sees it. Both views are needed to check a log by hand.

4.1 The decode, step by step

🧮
Worked calculation

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.

⚠️
Common pitfall

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.

Figure 5. Both mappings on the same CORESET. Non-interleaved gives one contiguous block per CCE -- ideal if the gNB knows the UE's good sub-band. Interleaved gives three separated chunks per CCE -- ideal if it does not.

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:

CCE-to-REG interleaving, 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
🧮
Worked calculation

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

interleavednonInterleaved
What a CCE looks like6/L bundles scattered across the CORESET bandwidth6 consecutive REGs -- one contiguous block per CCE
BuysFrequency diversity against notches and narrowband interferenceFrequency selectivity: the gNB can place a CCE where it knows the UE is strong
NeedsNothing -- it is the safe default with no UE knowledgeA usable estimate of the UE's per-sub-band channel, i.e. wideband CSI or a narrow beam
Interacts with precoderGranularityForces sameAsREG-bundle in practice -- allContiguousRBs is meaningless when a CCE is not contiguousPairs naturally with allContiguousRBs, which lets the UE average DMRS across the whole CORESET
Right choice forCommon CORESETs, CORESET#0, any wideband FR1 macro cell, any cell where UEs in poor coverage must be reachableNarrow analogue-beamformed FR2 CORESETs, and CORESETs dedicated to a small set of well-characterised UEs
Inter-cell behaviourshiftIndex decorrelates the mapping between neighbours, so two cells' CCE 0 do not collide slot after slotNo 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.

⚠️
Common pitfall

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:

ValueThe UE may assumeChannel estimationCosts the gNB
sameAsREG-bundleOne precoder per REG bundle -- 2, 3 or 6 REGsAveraging limited to the bundle: 6, 9 or 18 pilot REs. Noisier estimate, especially at reg-BundleSize n2Nothing. The gNB may precode each bundle differently, which is what makes per-bundle beam cycling possible
allContiguousRBsOne precoder across every set of contiguous RBs in the CORESETAveraging across the whole contiguous span -- often 48 PRBs' worth of pilots. Materially better estimate at low SINRIts 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.
⚠️
Common pitfall

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.

AspectDetailWhy it matters diagnostically
Configured set1..64 TCI-StateId values, each dereferencing a TCI-State in PDSCH-ConfigThe list is a menu, not a selection. A CORESET with two entries and no activation MAC CE received has an undefined beam in practice
ActivationOne TCI state active at a time per CORESET, set by MAC CEThe change takes effect after the HARQ-ACK for the MAC CE plus an application delay -- a window in which the two sides disagree
Quasi-colocationType D QCL: the UE derives its receive spatial filter from the referenced SSB or CSI-RSIf 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 absentThe 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.1This default is why a CORESET can work by accident and then stop when the lowest-id CORESET's beam changes
Beam failure interactionBeam failure recovery re-points the CORESET indirectly, by giving the UE a new candidate beamSee 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.

🔍
What you see in logs

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.

PropertyCORESET#0A configured CORESET
Where it comes fromcontrolResourceSetZero, 4 bits in the MIB, through TS 38.213 Tables 13-1 to 13-10A ControlResourceSet IE in SIB1 or a dedicated reconfiguration
Bandwidth24, 48 or 96 RB -- whatever the table row saysAny multiple of 6 RB, from the 45-bit bitmap
Duration1, 2 or 3 symbols, from the table row1, 2 or 3 symbols, from duration
Frequency positionAn RB offset relative to the SSB, from the table row, plus k_SSB subcarriers from the MIBAbsolute, from the bitmap and the BWP start
CCE-to-REG mappingFixed: interleaved, reg-BundleSize 6, interleaverSize 2, shiftIndex = the physical cell identity TS 38.211 cl. 7.3.2.2Whatever cce-REG-MappingType says
precoderGranularityFixed: sameAsREG-bundleEither value
DMRS scramblingFixed: the physical cell identitypdcch-DMRS-ScramblingID, or the physical cell identity if absent
BeamThe SSB the UE used to acquire the cell -- QCL is implicittci-StatesPDCCH-ToAddList plus a MAC CE activation
Also definesThe initial downlink BWP when the UE has no dedicated configuration: the initial BWP's bandwidth is CORESET#0'sNothing 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.

Figure 6. CORESET#0 relative to the SSB. The offset is in resource blocks at the CORESET#0 subcarrier spacing, and 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:

PatternArrangementWhere it is usedConsequence
1TDM: CORESET#0 in different symbols from the SSB, overlapping or adjacent in frequencyFR1 and FR2, the common caseThe Type0-PDCCH monitoring window straddles two consecutive slots starting from the SSB's slot
2FDM: CORESET#0 beside the SSB in frequency, in the same symbolsFR2 only, with 120/60 or 240/120 kHz SSB/CORESET SCS pairsCORESET#0 monitoring is confined to the SSB's own symbols, so the occasion is very short
3FDM, with CORESET#0 in the same symbols as the SSB and a different offset ruleFR2 only, 120/120 kHzSame 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.

⚠️
Common pitfall

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.

LimitValueScopeWhere it is stated
maxNrofControlResourceSets12 (ids 0..11)Per serving cellTS 38.331 -- the size of controlResourceSetToAddModList plus the reserved id 0
CORESETs the UE monitors3 per downlink BWP, plus CORESET#0Per BWP per serving cellTS 38.213 cl. 10.1 -- a UE capability floor, and the practical limit vendors configure to
maxNrofSearchSpaces40 (ids 0..39)Per serving cellTS 38.331
Search spaces the UE monitors10 per downlink BWPPer BWP per serving cellTS 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.

⚠️
Common pitfall

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.

⚠️
Common pitfall

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.

FieldType and rangeTypicalWhat it decides
searchSpaceIdINTEGER (0..39)0-3Identity 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).
controlResourceSetIdINTEGER (0..11), optional1 or 2The 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.
monitoringSlotPeriodicityAndOffsetCHOICE: sl1 | sl2 | sl4 | sl5 | sl8 | sl10 | sl16 | sl20 | sl40 | sl80 | sl160 | sl320 | sl640 | sl1280 | sl2560sl1 or sl2Slot periodicity, and for every branch except sl1 an INTEGER offset within the period. sl1 carries no offset because there is nothing to offset.
durationINTEGER (2..2559), optionalabsent (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.
monitoringSymbolsWithinSlotBIT STRING (SIZE (14)), optional1 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.
nrofCandidatesSEQUENCE 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 n0How many blind-decode attempts at each aggregation level. n0 means this aggregation level is not searched at all, which is the trap in §17.
searchSpaceTypeCHOICE { common, ue-Specific }ue-Specific for schedulingBoth the DCI formats expected and the hashing behaviour: common search spaces have Y = 0, so every UE agrees on the CCE positions.
freqMonitorLocations-r17BIT STRING (SIZE (5)), optionalabsentRel-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 presentDCI monitoredRNTIPurpose
dci-Format0-0-AndFormat1-0DCI 0_0, DCI 1_0SI-RNTI, RA-RNTI, MsgB-RNTI, TC-RNTI, P-RNTI, C-RNTIThe fallback scheduling formats. The only ones permitted in a common search space for unicast.
dci-Format2-0DCI 2_0SFI-RNTISlot format indication -- dynamic TDD. Changes which symbols are downlink, which is why it must be monitored before the symbols it describes.
dci-Format2-1DCI 2_1INT-RNTIDownlink pre-emption indication: part of an earlier PDSCH was overwritten by a URLLC transmission.
dci-Format2-2DCI 2_2TPC-PUSCH-RNTI, TPC-PUCCH-RNTIGroup TPC commands for PUSCH and PUCCH.
dci-Format2-3DCI 2_3TPC-SRS-RNTIGroup TPC for SRS, plus SRS request.
dci-Format2-4-r16DCI 2_4CI-RNTIUplink cancellation indication (Rel-16): stop transmitting on these resources.
dci-Format2-5-r16DCI 2_5AI-RNTIAvailability indication for an IAB node's soft resources.
dci-Format2-6-r16DCI 2_6PS-RNTIPower saving outside DRX Active Time: wake-up indication and SCell dormancy (companion 11 DRX).
ue-Specific / formats0-0-And-1-0DCI 0_0, DCI 1_0C-RNTI etc.Fallback formats in the UE-specific search space -- fixed sizes, robust, used during reconfiguration ambiguity.
ue-Specific / formats0-1-And-1-1DCI 0_1, DCI 1_1C-RNTI, CS-RNTI, MCS-C-RNTIThe 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.

⚠️
Common pitfall

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.

Figure 7. The two numbering systems side by side. The middle row is what is on the wire; the top row is what the specification and every engineer talk about.
TypeRNTI(s)DCI formatsConfigured byWhen monitoredRRC states
Type0-PDCCHSI-RNTI1_0searchSpaceZero in the MIB, or searchSpaceSIB1 in PDCCH-ConfigCommonIn the SIB1 window derived from searchSpaceZero, repeating every 20 ms with the SSB burstIDLE, INACTIVE, CONNECTED
Type0A-PDCCHSI-RNTI1_0searchSpaceOtherSystemInformationWithin the SI window of the SI message being acquired TS 38.331 cl. 5.2.2.3.2IDLE, INACTIVE, CONNECTED
Type1-PDCCHRA-RNTI, MsgB-RNTI, TC-RNTI1_0 (and 0_0 for MSG3 retransmission)ra-SearchSpace in PDCCH-ConfigCommonDuring ra-ResponseWindow / msgB-ResponseWindow, and until contention resolution completesAny state in which random access is running
Type2-PDCCHP-RNTI1_0pagingSearchSpace in PDCCH-ConfigCommonAt the UE's paging occasions, derived from the UE identity and PCCH-ConfigIDLE, INACTIVE (and CONNECTED, for SI change and ETWS/CMAS)
Type3-PDCCHC-RNTI, CS-RNTI, MCS-C-RNTI, INT-RNTI, SFI-RNTI, TPC-PUSCH-RNTI, TPC-PUCCH-RNTI, TPC-SRS-RNTI, CI-RNTI, PS-RNTI0_0, 1_0, and the 2_x group-common formatscommonSearchSpaceList in PDCCH-ConfigCommonPer its own periodicity and offset, continuously in CONNECTEDCONNECTED
UE-specificC-RNTI, CS-RNTI, MCS-C-RNTI0_0 and 1_0, or 0_1 and 1_1 -- selected by dci-FormatssearchSpacesToAddModList in PDCCH-ConfigPer its own periodicity, offset, duration and symbol bitmap, intersected with DRX Active TimeCONNECTED

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.

💡
Key point

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 spaceUE-specific search space
Hashing seed YY = 0, fixed. Every UE computes the same CCE positions for candidate mY is recursive in the C-RNTI: Y(n) = (A x Y(n-1)) mod D, so positions differ per UE and per slot
WhyThe message may be addressed to a group, or to a UE whose identity the network does not yet knowTwo UEs must not collide slot after slot; randomising per UE and per slot spreads the collisions
DCI formats0_0 and 1_0 only for unicast; plus the 2_x group-common formats0_0/1_0 or 0_1/1_1
Aggregation levelsPractically restricted -- the candidate counts in nrofCandidates-SFI allow only n1 or n2Full n0..n8 per level
OverbookingNever dropped. Common search spaces are allocated candidates firstDropped in increasing searchSpaceId order when the per-slot budget is exceeded
Failure impactLoss of paging, SI, random access response -- affects every UE in the cellLoss 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.

Figure 8. Two DCI payload sizes across the five aggregation levels. AL1 with a full-featured DCI 1_1 sits at R = 0.78, which is not a rate you would choose for anything you need to arrive.

11.1 The coding-rate calculation, twice

🧮
Worked calculation

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:

InputWhere it comes fromHow it is used
Wideband CQI or SINR estimateCSI report on PUCCH or PUSCH, or the SRS-based uplink estimate reciprocatedThe primary driver: map estimated PDCCH SINR to the lowest AL that meets the target PDCCH BLER, commonly 1%
PDCCH DTX / HARQ inferenceAbsence of a HARQ-ACK where one was expected implies the DCI itself may have been missedOuter-loop style correction: raise the AL for this UE after consecutive misses
Available CCEs in the CORESETThe scheduler's own CCE occupancy map for this occasionHard constraint. A UE that needs AL8 in a CORESET with 6 free CCEs is not scheduled this slot at all
Candidate availabilitynrofCandidates for that AL, and the hashing function's output for this slotHard constraint. The AL must have a non-zero candidate count and an unoccupied candidate position
Message importanceScheduler policy -- an RRC reconfiguration or a handover command matters more than a data grantMany implementations force a high AL for signalling regardless of the channel estimate
DCI payload sizeThe configured formats and optional fieldsSets 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.

🔍
What you see in logs

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.

Monitoring occasion derivation, TS 38.213 cl. 10.1
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

🧮
Worked calculation

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

🧮
Worked calculation

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.

⚠️
Common pitfall

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 duration symbols. A bit set at symbol 13 with a CORESET duration of 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 duration 2 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.

Figure 9. Three search spaces over twenty slots -- a separate example from the configuration traced in §20. 31 occasions are configured; the TDD pattern removes 6 of them and DRX leaves 13 inside Active Time. Counting the configuration tells you almost nothing about what the UE actually does.
ReducerMechanismEffect on occasionsWhere it is specified
TDD uplink symbolsA monitoring occasion whose symbols are uplink or flexible-configured-as-uplink carries no PDCCHRemoved entirely. The UE does not monitor, and the gNB cannot transmittdd-UL-DL-ConfigurationCommon / -Dedicated, TS 38.213 cl. 11.1
Dynamic SFIDCI 2_0 can mark flexible symbols as uplink for one periodRemoved for that period only. The UE must have monitored the SFI before the affected symbolsTS 38.213 cl. 11.1.1
DRXOutside Active Time the UE monitors no PDCCH at all, on any search space, except Type2 paging and Type0/0A SI at their own occasionsRemoved wholesale. Active Time is the dominant reducer in a power-saving configurationTS 38.321 cl. 5.7 -- companion 11 DRX
Measurement gapsDuring a configured gap the UE is retuned elsewhere and monitors nothing on the serving cellRemoved for the gap length, every gap repetition periodTS 38.133 -- companion 21 Measurement Gaps and SMTC
BWP switch delayBetween the DCI ordering a switch and the new BWP being usable, neither BWP is monitoredA hole of 1-3 slots at each switchTS 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.

🧮
Worked calculation

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.

⚠️
Common pitfall

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) pairMeaningSpans per 14-symbol slotTypical use
(7, 3)Spans start at least 7 symbols apart; each span is at most 3 symbols2The mildest span capability -- two monitoring opportunities per slot, one per half slot
(4, 3)At least 4 symbols apart, at most 3 long3Mid-range URLLC: sub-slot monitoring at roughly 140 us granularity at 30 kHz
(2, 2)At least 2 symbols apart, at most 2 long7The most aggressive: an occasion every two symbols, which is the practical floor for grant latency
Rel-15 baselineOne occasion per slot, in the first three symbols1Everything 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.

🧮
Worked calculation

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.

⚠️
Common pitfall

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 producesDoc 31 consumes it to produce
The CORESET's CCE count N_CCE,p and the CCE-to-REG mappingThe physical resource elements each candidate occupies
The set of monitoring occasions (slot, symbol) per search spaceThe slot index n that seeds the per-slot hashing recursion
nrofCandidates per aggregation level, M_p,LThe candidate index range m = 0 .. M_p,L - 1 fed into the hash
searchSpaceType: common or UE-specificThe hashing seed: Y = 0 for common, the C-RNTI recursion for UE-specific
searchSpaceId, and whether the space is commonThe drop order when the per-slot candidate or CCE budget is exceeded
The declared DCI formatsThe 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.

💡
Key point

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 nameRange / valuesTypicalEffect if wrong
controlResourceSetIdINTEGER (0..11)1, 2A search space referencing an unconfigured id monitors nothing. Using 0 for a dedicated CORESET is illegal.
frequencyDomainResourcesBIT STRING (SIZE (45))8 contiguous bits setBits outside the BWP are ignored, silently shrinking the CORESET and its CCE count.
durationINTEGER (1..3)2Changes the CCE count and the earliest PDSCH start symbol. At 3, reg-BundleSize n2 becomes illegal.
cce-REG-MappingTypeinterleaved | nonInterleavedinterleavedMismatch between gNB and UE puts every CCE in the wrong place: total PDCCH failure, no partial degradation.
reg-BundleSizen2, n3, n6n6Wrong value changes both the interleaver output and the DMRS averaging span.
interleaverSizen2, n3, n6n2Must divide N_REG/L. An inconsistent combination is a configuration error the network must avoid.
shiftIndexINTEGER (0..274)the physical cell idIdentical values in neighbouring cells cause systematic inter-cell PDCCH collision (§5.3).
precoderGranularitysameAsREG-bundle | allContiguousRBssameAsREG-bundleallContiguousRBs with a non-contiguous or interleaved CORESET wastes the benefit and constrains beamforming for nothing.
pdcch-DMRS-ScramblingIDINTEGER (0..65535)the physical cell idMismatch is total failure. Shared between neighbours degrades channel estimation, not just SINR.
tci-StatesPDCCH-ToAddList1..64 TCI-StateId1 entryA state referencing a stale QCL source makes the CORESET unreceivable with every field still valid.
tci-PresentInDCIENUMERATED {enabled}, optionalabsentChanges 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 nameRange / valuesTypicalEffect if wrong
searchSpaceIdINTEGER (0..39)1, 2, 3Also the drop order under overbooking: a high id is dropped first.
controlResourceSetIdINTEGER (0..11)1, 2Dangling reference means zero monitoring occasions, silently.
monitoringSlotPeriodicityAndOffsetsl1 .. sl2560, with an offset in 0..k-1 for every branch but sl1sl1 (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).
durationINTEGER (2..2559), optionalabsent (= 1)Must be < periodicity. Extends each burst across consecutive slots.
monitoringSymbolsWithinSlotBIT STRING (SIZE (14))bit 0 onlyA bit at a symbol the CORESET does not reach, or beyond 14 - duration, is an invalid configuration.
nrofCandidates per leveln0, n1, n2, n3, n4, n5, n6, n8 for each of AL 1/2/4/8/16AL1 n4, AL2 n2, AL4 n1, AL8 n0, AL16 n0n0 removes that aggregation level entirely. If the scheduler uses it, the DCI is transmitted and never decoded.
searchSpaceTypeCHOICE common | ue-Specificue-SpecificWrong branch changes the hashing seed and the permitted DCI formats.
dci-Formats (in ue-Specific)formats0-0-And-1-0 | formats0-1-And-1-1formats0-1-And-1-1The fallback choice silently disables every feature that lives only in DCI 0_1/1_1 (§9.1).
searchSpaceGroupIdList-r171..2 INTEGER (0..1), optionalabsentRel-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

LimitValueScopeConsequence of hitting it
CORESETs monitored3 + CORESET#0Per DL BWP per cellConfiguration beyond it is invalid; the UE's behaviour is not specified
Search spaces monitored10Per DL BWP per cellAs above
maxNrofControlResourceSets12Per cellIds exhausted
maxNrofSearchSpaces40Per cellIds exhausted
Candidates per slot M_max44 at 15 kHz, 36 at 30 kHz, 22 at 60 kHz, 20 at 120 kHzPer slot per serving cell (Rel-15); per span for a span-capable UEOverbooking: UE-specific search spaces dropped in increasing id order
Non-overlapping CCEs per slot C_max56 at 15 kHz, 56 at 30 kHz, 48 at 60 kHz, 32 at 120 kHzPer slot per serving cellAs 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-r16Configuring 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.

FailureDetected byWhat the UE doesLog signature
frequencyDomainResources selects groups partly or wholly outside the active BWPNobody, at the time. The UE applies the rule that such bits are zeroMonitors a smaller CORESET than the gNB believes it configured, with fewer CCEs and therefore fewer valid candidate positionsgNB'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 controlResourceSetIdNobody. TS 38.331 makes it the network's responsibilityProduces no monitoring occasions for that search space. Other search spaces are unaffectedThe 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 usesNobody. Both sides are internally consistentNever attempts a decode at that aggregation level. The DCI is transmitted correctly and discardedPerfect 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 assumesThe scheduler eventually, via HARQ timeoutsMonitors correctly, at its own periodicity. Grants sent between occasions are simply lostGrant-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 occupyNobody -- it is an invalid configuration the network must not createBehaviour is not specified. In practice: monitors nothing at that symbol, or monitors a CORESET that runs past the slot boundaryOccasions 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 positionNobody. The UE triesCannot decode SIB1. Channel estimation is corrupted by the missing band, so Type0-PDCCH fails at every aggregation levelUEs 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 UENobody. Both sides believe they are rightChannel estimation on that CORESET produces noise. Every PDCCH in it fails, at every AL, at every SINRTotal, 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 receiveThe UE, eventually, through beam failure detection -- but only if the BFD reference signals point at the same beamMonitors the right symbols with the wrong receive beam. Nothing decodesServing 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 slotNobody. The configuration is individually validMonitors nothing, forever, on that search spaceZero 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 UENobody. The UE applies Rel-15 limitsMonitors the first occasion of each slot and drops the rest under the overbooking rulesLatency 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 DCINobody until the UE is strandedSwitches into the default BWP on bwp-InactivityTimer expiry and cannot be told to leaveA 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.

💡
Key point

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:

  1. 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.
  2. Does the search space's controlResourceSetId resolve in the active BWP? Not in the cell, not in the configuration database -- in the BWP the UE is in right now.
  3. Compute the monitored slots and check them against the TDD pattern.
  4. Compare nrofCandidates per level against the aggregation levels the scheduler actually used.
  5. Compare monitoringSymbolsWithinSlot's set bits against the CORESET's duration.
  6. 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 ::= 64

Listing 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..39

Listing 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.

⚠️
Common pitfall

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

🧮
Worked calculation

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

🧮
Worked calculation

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

🧮
Worked calculation

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?

🧮
Worked calculation

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

🔍
ABOUT THESE TRACES

Illustrative trace. Field names and encodings follow 3GPP; the values are constructed for this document and are not a capture from any deployed or lab network.

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

[RRC] RRCReconfiguration -- controlResourceSetToAddModList
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 .............. 3

Listing 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.

[RRC] RRCReconfiguration -- searchSpacesToAddModList
      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

[PHY] CORESET 1 frequency decode
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 it

Listing 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

[PHY] monitoring occasion derivation
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

[PHY/MAC] a grant, found and decoded
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

[RRC/PHY/SCHED] a released CORESET and two orphaned search spaces
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 -> release

Listing 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.

🔍
What you see in logs

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

ReleaseChangeWhy it matters when reading a configuration
Rel-15ControlResourceSet 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 normThe baseline. Everything in §1 through §13 is Rel-15 unless marked otherwise.
Rel-16Span-based PDCCH monitoring: pdcch-Monitoring-r16 capability with (X, Y) pairs (7,3), (4,3) and (2,2); per-span candidate and CCE limitsThe per-slot budget is no longer the only budget. A sub-slot monitoring configuration is meaningless without the matching capability (§14.2).
Rel-16Search space set group switching: searchSpaceSwitchingTimer, and DCI 2_0 carrying a search space group indicationA 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-16New 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-16Cross-carrier scheduling refinements and CORESET pool indexing (coresetPoolIndex) for multi-TRP operationTwo CORESETs with different coresetPoolIndex values can schedule the same cell from different transmission points, with separate HARQ bookkeeping.
Rel-17Multi-slot PDCCH monitoring for 480 and 960 kHz subcarrier spacing: candidate and CCE limits defined over a group of slotsAt FR2-2 numerologies the per-slot limit is unusable. A UE may legitimately monitor in some slots of a group and not others.
Rel-17PDCCH skipping and enhanced search space group switching, both DCI-triggeredAnother way for monitoring to stop without a DRX transition or an RRC message.
Rel-17freqMonitorLocations-r17 -- a search space replicated across up to five frequency locationsFor wideband NR-U operation. One SearchSpace IE can now describe monitoring in several sub-bands.
Rel-17RedCap: reduced-bandwidth UEs with their own initial BWP, and CORESET#0 constrained to fit a 20 MHz (FR1) receiverTwo UE classes in one cell may monitor different CORESETs for the same common signalling.
Rel-17Unified TCI framework -- a single indicated TCI state applying to PDCCH, PDSCH and uplink togetherThe 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-18LTM (L1/L2-triggered mobility): candidate cell configurations, including their PDCCH-Config, pre-provisioned and activated by MAC CE or DCIThe 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-18Network energy saving: cell DTX/DRX, spatial element adaptation, and coarser PDCCH monitoring patternsThe network may now be asleep during a configured monitoring occasion. Absence of a grant is no longer evidence about the UE.
Rel-18Further multi-carrier scheduling: one DCI scheduling PDSCH on two cellsA 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.

🔄
Release delta

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

  1. 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-InactivityTimer expiry, or the firstActiveDownlinkBWP-Id in the reconfiguration.
  2. Resolve every search space's controlResourceSetId against 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. Check controlResourceSetToReleaseList in every reconfiguration since setup, not just the most recent one.
  3. Decode frequencyDomainResources by 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.
  4. Compute N_CCE = PRBs x duration / 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.
  5. 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).
  6. Check monitoringSymbolsWithinSlot against the CORESET's duration. A set bit at symbol s means the CORESET occupies symbols s to s + duration - 1. A bit above 14 - duration is invalid, and a bit at a symbol the TDD pattern makes uplink is dead.
  7. Compare nrofCandidates per aggregation level against the aggregation levels the scheduler actually chose. An n0 at 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.
  8. Confirm dci-Formats is formats0-1-And-1-1 if any advanced feature is expected. With formats0-0-And-1-0 the UE works, at low rate, with every optional feature silently inert.
  9. 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.
  10. 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.
  11. Check pdcch-DMRS-ScramblingID and shiftIndex against the neighbours', not just against the UE. Identical values across neighbours produce systematic interference that does not respond to aggregation level.
  12. 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

TermExpansionMeaning in this document
CORESETControl Resource SetA 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).
REGResource Element GroupOne 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).
CCEControl Channel ElementSix 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 levelALThe 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 stateTransmission Configuration Indication stateA 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. ControlResourceSet and ControlResourceSetId; SearchSpace and SearchSpaceId; PDCCH-Config; PDCCH-ConfigCommon including controlResourceSetZero, searchSpaceZero, commonControlResourceSet, commonSearchSpaceList, searchSpaceSIB1, searchSpaceOtherSystemInformation, pagingSearchSpace and ra-SearchSpace; BWP-DownlinkCommon and BWP-DownlinkDedicated; PDCCH-ServingCellConfig; clause 5.2.2.3.2 (SI acquisition and the search spaces it uses); the field descriptions for frequencyDomainResources, monitoringSymbolsWithinSlot and nrofCandidates, 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-r16 and 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 and searchSpaceZero table lookups, and the SI windows that Type0 and Type0A monitor within.
  • 19 Paging -- Type2-PDCCH: paging occasions, P-RNTI, and the pagingSearchSpace reference.
  • 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 duration bounds the earliest PDSCH start symbol, and what that costs in latency.
  • 33 DMRS -- the PDCCH DMRS structure that precoderGranularity and pdcch-DMRS-ScramblingID govern, 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.