5G NR PDSCH From Bits to Resource Elements: MCS, TBS, Processing, Allocation and the Four Special Cases
A step-by-step tour of the PDSCH: how the MCS tables work, how the transport block size is computed, the physical-layer processing chain, frequency and time allocation types, resource block bundling, pre-emption, reserved resources and slot-aggregation repetition.
The story of one transport block
The easiest way to understand the PDSCH is to follow one transport block (TB) from the MAC scheduler to the antenna and ask, at every step, "what decision is being made here and who makes it?"
- The scheduler chooses how many bits to send this slot → that needs the MCS and the resource allocation, which together fix the TBS.
- The PHY protects and shapes the bits → the processing chain (CRC, LDPC, rate matching, scrambling, modulation, layers).
- The PHY places the symbols on the grid → frequency and time allocation, then subtracts anything that must be avoided (reserved resources).
- Some things can go wrong or need help → PRB bundling (help the UE estimate the channel), pre-emption (URLLC stole some of your REs), repetition (send the whole TB again for coverage).
Hold that four-step story and every subsection below has a home.
Step 1 — MCS: one 5-bit index, two decisions
The MCS index (I_MCS) in the DCI selects a row in a table that gives both the modulation order Q_m (bits per RE) and the target code rate R (fraction of transmitted bits that are information). Their product, Q_m × R, is the spectral efficiency in bits per RE.
NR has three PDSCH MCS tables (TS 38.214 §5.1.3.1):
| Table | Name in RRC | Max modulation | Usable indices | Reserved indices | When used |
|---|---|---|---|---|---|
| 5.1.3.1-1 | (default, "qam64") | 64QAM | 0–28 | 29–31 | Default; always for DCI 1_0 |
| 5.1.3.1-2 | qam256 | 256QAM | 0–27 | 28–31 | High-SNR throughput, DCI 1_1 with C-RNTI |
| 5.1.3.1-3 | qam64LowSE | 64QAM | 0–28 | 29–31 | URLLC: lower code rates, higher reliability; selected via MCS-C-RNTI |
A few anchor rows from Table 1 to get a feel for the range:
| I_MCS | Q_m | Code rate R (×1024) | Spectral efficiency |
|---|---|---|---|
| 0 | 2 (QPSK) | 120 | 0.2344 |
| 9 | 2 (QPSK) | 679 | 1.3262 |
| 10 | 4 (16QAM) | 340 | 1.3281 |
| 16 | 4 (16QAM) | 658 | 2.5703 |
| 17 | 6 (64QAM) | 438 | 2.5664 |
| 28 | 6 (64QAM) | 948 | 5.5547 |
Note the deliberate overlap at the modulation boundaries (MCS 9 vs 10, 16 vs 17): a high-code-rate QPSK and a low-code-rate 16QAM give the same efficiency, and the scheduler picks whichever works better for the channel.
Why reserved indices? MCS 29–31 (Table 1) carry only the modulation order, no code rate. They are used for retransmissions: the UE already knows the TBS from the initial transmission, so the DCI needs only to say "same TB, this modulation, this RV". That saves the scheduler from having to reproduce an allocation that yields exactly the same TBS.
How does the UE know which table? From RRC (mcs-Table in PDSCH-Config) plus which DCI format and RNTI were used. DCI 1_0 always uses Table 1, so fallback scheduling is always safe.
Step 2 — Transport block size: a deterministic recipe, not a lookup
In LTE the TBS came from a huge 2-D table (MCS × number of PRBs). NR replaced that with a formula (TS 38.214 §5.1.3.2) so that any combination of RBs, symbols, layers, DM-RS overhead and code rate yields a well-shaped size. Here is the recipe in plain steps:
(a) Count usable REs in one RB:
N'_RE = 12 × N_symb − N_DMRS − N_oh
- N_symb = number of scheduled OFDM symbols
- N_DMRS = DM-RS REs per RB in the allocation (depends on DM-RS type, length, additional positions, CDM groups without data)
- N_oh = 0, 6, 12 or 18 (
xOverheadin RRC; accounts for CSI-RS/PT-RS/etc. Default 0)
(b) Cap and scale to the allocation:
N_RE = min(156, N'_RE) × n_PRB
The cap of 156 stops an extreme configuration from over-estimating capacity.
(c) Information bits, uncoded:
N_info = N_RE × R × Q_m × ν (ν = number of layers)
(d) Quantise so the size is "nice":
- If N_info ≤ 3824: round to a coarse grid (n = max(3, ⌊log₂N_info⌋ − 6); N'_info = max(24, 2^n × ⌊N_info / 2^n⌋)) then pick the smallest TBS ≥ N'_info from a 93-entry table (Table 5.1.3.2-1, values 24 … 3824).
- If N_info > 3824: round with n = ⌊log₂(N_info − 24)⌋ − 5, then compute TBS directly so that after adding the 24-bit CRC and segmenting into C code blocks, every code block has an equal, byte-aligned size:
- if R ≤ 1/4: C = ⌈(N'_info + 24)/3816⌉, TBS = 8·C·⌈(N'_info + 24)/(8·C)⌉ − 24
- else if N'_info > 8424: C = ⌈(N'_info + 24)/8424⌉, TBS = 8·C·⌈(N'_info + 24)/(8·C)⌉ − 24
- else: TBS = 8·⌈(N'_info + 24)/8⌉ − 24
Why this shape? Byte alignment (multiples of 8) helps MAC PDU packing; equal code-block sizes make the LDPC decoder's job uniform; and the "smallest TBS ≥ N'_info" rule ensures the retransmission with a different allocation can still carry the same TB. The thresholds 3816 / 8424 come from the LDPC base graph limits (below).
A worked example: 20 PRBs, 12 symbols, DM-RS type 1 single symbol (N_DMRS = 12), xOverhead 0, MCS 16 of Table 1 (Q_m = 4, R = 658/1024), 2 layers. N'_RE = 12×12 − 12 = 132; N_RE = 132 × 20 = 2640; N_info = 2640 × 0.6426 × 4 × 2 = 13,572. Since > 3824: n = ⌊log₂(13548)⌋ − 5 = 13 − 5 = 8; N'_info = max(3840, 256 × round(13548/256)) = 256 × 53 = 13,568. R > 1/4 and N'_info > 8424 → C = ⌈13592/8424⌉ = 2; TBS = 8·2·⌈13592/16⌉ − 24 = 16 × 850 − 24 = 13,576 bits.
Step 3 — The physical-layer processing chain
TS 38.212 §7.2 (coding) and TS 38.211 §7.3.1 (modulation and mapping):
Transport block (A bits)
│
├─ 1. TB CRC: 24 bits (CRC24A) if A > 3824, else 16 bits (CRC16)
├─ 2. LDPC base graph selection
├─ 3. Code block segmentation (+ CRC24B per code block if more than one)
├─ 4. LDPC encoding
├─ 5. Rate matching (circular buffer, redundancy version) + bit interleaving
├─ 6. Code block concatenation → codeword
├─ 7. Scrambling (sequence from RNTI + dataScramblingIdentityPDSCH or PCI)
├─ 8. Modulation (QPSK / 16QAM / 64QAM / 256QAM)
├─ 9. Layer mapping (1 codeword → up to 4 layers; 2 codewords → 5–8 layers)
├─ 10. Antenna port mapping (precoding — implementation-defined, transparent to UE)
├─ 11. Mapping to VRBs, then VRB → PRB
└─ 12. Mapping to REs (avoiding DM-RS, PT-RS, CSI-RS, reserved resources)
Base graph selection (step 2) is the NR-specific piece. LDPC has two base graphs:
- BG2 — for small or low-rate blocks: chosen when A ≤ 292, or A ≤ 3824 and R ≤ 0.67, or R ≤ 0.25. Max code block K = 3840.
- BG1 — everything else (large, high-rate blocks). Max code block K = 8448.
The segmentation limits (8448 − 24 = 8424 and 3840 − 24 = 3816) are exactly the constants in the TBS formula. The whole design is self-consistent: the TBS is chosen so it segments cleanly for the base graph that will encode it.
Redundancy versions (step 5). The LDPC output sits in a circular buffer; RV 0/1/2/3 select four different starting points. RV 0 sends mostly systematic bits (decodable alone); RV 2 and 3 send mostly parity. The default retransmission order 0 → 2 → 3 → 1 gives the best incremental-redundancy gain.
Scrambling (step 7) is per codeword and per UE. Its purpose is interference randomisation between cells and UEs, not secrecy.
Step 4 — Frequency-domain resource allocation
The DCI must say which PRBs in the active BWP. Two types (TS 38.214 §5.1.2.2):
Type 0 — bitmap of Resource Block Groups (RBGs). The BWP is split into RBGs; one bit per RBG. Flexible (non-contiguous), but the bitmap costs bits, so RBG size grows with BWP size:
| BWP size (PRBs) | RBG size, config 1 | RBG size, config 2 |
|---|---|---|
| 1–36 | 2 | 4 |
| 37–72 | 4 | 8 |
| 73–144 | 8 | 16 |
| 145–275 | 16 | 16 |
Type 1 — Resource Indicator Value (RIV). One number encoding a start PRB and a length of contiguous PRBs. Compact; always used by DCI 1_0. Requires ⌈log₂(N(N+1)/2)⌉ bits for a BWP of N PRBs.
Type 1 allocations are stated in VRBs; the 1-bit VRB-to-PRB mapping field chooses non-interleaved (VRB n → PRB n) or interleaved (a block interleaver of 2- or 4-RB bundles spreads them across the BWP for frequency diversity). Type 0 is always non-interleaved.
RRC can configure Type 0, Type 1, or dynamicSwitch (a DCI bit chooses per grant; DCI 1_1 only).
Step 5 — Time-domain resource allocation
The 4-bit TDRA field indexes a row in a table; each row contains:
- K0 — slot offset between the PDCCH and the PDSCH (0 = same slot; larger for cross-slot scheduling, e.g. power saving).
- Mapping type A or B — decides where the DM-RS goes (see the reference-signal article): Type A = slot-based, DM-RS at symbol 2 or 3; Type B = "mini-slot", DM-RS on the first symbol of the allocation.
- SLIV — Start and Length Indicator Value, one number encoding the start symbol S and length L.
Constraints (Rel-15, normal CP): Type A allows S ∈ {0…3}, L ∈ {3…14}, S + L ≤ 14. Type B allows S ∈ {0…12}, L ∈ {2, 4, 7}, S + L ≤ 14. Rel-16 relaxed Type B to any L from 2 to 13.
If RRC does not configure a pdsch-TimeDomainAllocationList, the UE uses one of three default tables (A, B, C) from TS 38.214 §5.1.2.1.1, selected by the SSB/CORESET#0 multiplexing pattern and the DCI type. Default Table A is the workhorse: mostly Type A, K0 = 0, S = 2, L = 12 — i.e. "everything after a 2-symbol PDCCH".
Special case 1 — Resource block bundling (PRG)
The problem. The gNB applies a precoder to the PDSCH, and the UE estimates the effective channel (channel × precoder) from the DM-RS. If the gNB were free to change precoder from RB to RB, the UE could only estimate per RB — noisy. If the gNB promises to keep the same precoder across a Precoding Resource block Group (PRG), the UE can average DM-RS across the group and get a much cleaner estimate.
The mechanism (TS 38.214 §5.1.2.3). PRG size P' ∈ {2, 4, wideband}. "Wideband" means one precoder across the whole scheduled allocation (the UE is then not expected to be scheduled non-contiguous RBs). Configuration is either static (RRC fixes one value) or dynamic (RRC gives two sets and the 1-bit PRB bundling size indicator in DCI 1_1 chooses per grant).
The trade-off. Bigger PRG → better channel estimation but less precoding flexibility (frequency-selective precoding gains are lost). The gNB can choose per UE and even per grant.
Special case 2 — Pre-emption (URLLC punctures eMBB)
The problem. A URLLC packet arrives mid-slot, but an eMBB UE has already been scheduled across the whole slot. Waiting is not an option for 1 ms latency budgets. So the gNB transmits the URLLC data on top of the already-scheduled eMBB PDSCH — those REs now carry someone else's bits.
The mechanism (TS 38.213 §11.2, DCI format 2_1). After the fact, the gNB sends a pre-emption indication with INT-RNTI: per serving cell, a 14-bit bitmap describing the previous monitoring period. RRC chooses the bitmap geometry:
- Set 0: 14 time partitions × 1 frequency part (full BWP)
- Set 1: 7 time partitions × 2 frequency parts (upper / lower half of the BWP)
A "1" means "that time–frequency chunk was pre-empted". The eMBB UE discards the soft bits it stored for those REs, so its HARQ combining is not corrupted by the foreign symbols; the missing bits are recovered by a normal retransmission (which with CBG-based retransmission can be limited to the damaged code block groups).
Why it matters: without the indication, the eMBB decoder would treat the URLLC symbols as heavily corrupted versions of its own bits and could poison the HARQ buffer for several retransmissions.
Special case 3 — Reserved resources (rate matching around things)
The PDSCH cannot use every RE in its allocation. TS 38.214 §5.1.4 lists what it must avoid — collectively, the rate-matching rules. The PDSCH is "rate matched around" these REs: the coded bits skip them, rather than being punctured.
Always avoided (implicit):
- The REs of PDSCH DM-RS, and any configured PT-RS.
- The REs of SSBs at the positions indicated by ssb-PositionsInBurst.
- REs of configured CSI-RS (NZP and ZP) that overlap the allocation.
- The CORESET / PDCCH that carries the scheduling DCI.
Configured explicitly (RateMatchPattern in RRC):
- Bitmap patterns: an RB-level bitmap × a symbol-level bitmap (one slot or two) × a periodicity — a fully general "do not use these REs" template. Patterns can be put into two groups; the 2-bit rate matching indicator in DCI 1_1 enables/disables each group dynamically.
- LTE CRS pattern (
lte-CRS-ToMatchAround): the NR PDSCH avoids the REs an overlapping LTE carrier uses for its cell-specific reference signals. This is what makes Dynamic Spectrum Sharing possible without the LTE CRS wrecking NR data. - CORESET rate matching: PDSCH can be told not to use the REs of a configured CORESET (e.g. so a UE-specific PDSCH does not collide with another UE's PDCCH).
- Aperiodic ZP-CSI-RS triggered by DCI 1_1: punch a hole for interference measurement.
Think of reserved resources as a mask that is applied after the allocation: allocation says "here", rate matching says "except there".
Special case 4 — Repetition (slot aggregation)
For coverage-limited UEs the simplest tool is to transmit the same TB several times. Rel-15 provides pdsch-AggregationFactor ∈ {2, 4, 8} (TS 38.214 §5.1.2.1): the PDSCH is repeated in that many consecutive slots, using the same symbol allocation in each, restricted to single-layer transmission. The UE soft-combines all copies before decoding.
The redundancy version rotates across the repetitions, starting from the RV in the DCI:
| RV in DCI | RV in slot n, n+1, n+2, n+3 |
|---|---|
| 0 | 0, 2, 3, 1 |
| 2 | 2, 3, 1, 0 |
| 3 | 3, 1, 0, 2 |
| 1 | 1, 0, 2, 3 |
So aggregation is not just repetition — it is incremental redundancy across slots, which decodes better than sending RV 0 four times. Rel-16 extended the idea with multi-TRP repetition schemes (the same TB from two transmission points, TDM or FDM), but the Rel-15 slot aggregation is the concept to anchor on.
Common confusions
- "The MCS index sets the throughput." Only together with the number of REs and layers. The TBS formula is what actually sets the bits.
- "TBS comes from a table." Only for small TBs (≤ 3824). Above that it is computed.
- "RV 1 is the second retransmission." The recommended order is 0, 2, 3, 1; RV 1 is typically last.
- "Type 1 allocation cannot give frequency diversity." It can, via the interleaved VRB-to-PRB mapping.
- "Pre-emption is signalled before the eMBB PDSCH." It is signalled after, in the next DCI 2_1 monitoring occasion; the UE reacts by flushing soft bits.
- "Rate matching and puncturing are the same." Rate matching skips REs during mapping (the decoder knows there is no information there); puncturing (as in pre-emption) overwrites REs the decoder thought were valid.
- "Slot aggregation sends identical copies." The RV changes each slot.
Spec pointers
- TS 38.214 §5.1.3.1 — MCS tables; §5.1.3.2 — TBS determination
- TS 38.212 §7.2 — DL-SCH CRC, LDPC base graph, segmentation, rate matching
- TS 38.211 §7.3.1 — scrambling, modulation, layer mapping, VRB/PRB mapping
- TS 38.214 §5.1.2.1 — time-domain allocation and slot aggregation; §5.1.2.2 — frequency-domain allocation types; §5.1.2.3 — PRB bundling; §5.1.4 — rate matching / reserved resources
- TS 38.213 §11.2 — pre-emption indication (DCI 2_1)
- TS 38.331 — PDSCH-Config, RateMatchPattern, pdsch-AggregationFactor
Recap
MCS picks modulation and code rate; allocation picks REs; the TBS formula turns those into a clean, byte-aligned, LDPC-friendly block size. The chain protects the bits (CRC, LDPC, RV), randomises them (scrambling), and maps them to layers and REs — skipping DM-RS, SSB, CSI-RS, the scheduling PDCCH, LTE CRS and any configured pattern. PRB bundling helps the UE estimate the channel, pre-emption tells it which REs were stolen by URLLC, and slot aggregation repeats the block with rotating RVs for coverage.
Interview questions
The questions below are drawn from this topic and phrased the way they tend to come up. Try each one out loud before revealing the answer.
18 questions
- Modulation order and target code rate, from which the transport block size follows.
- No. It is computed by a deterministic procedure from the number of resource elements, layers, modulation order and code rate, then quantised to a permitted value.
- LTE's table did not scale to NR's range of bandwidths, numerologies and layer counts. A formula covers the whole space without an impractically large table.
- So it aligns with LDPC code block segmentation and byte boundaries, and so both ends compute exactly the same value.
- Type 0 is a bitmap over resource block groups and can be non-contiguous. Type 1 signals a starting block and a length and must be contiguous.
- When it wants frequency diversity or needs to work around resources reserved for something else. The cost is more DCI bits.
- It is compact and needs no configuration to interpret, which is exactly what a fallback requires.
- The starting symbol and length within the slot, signalled as an index into a configured table, together with the slot offset K0.
- Type A starts near the beginning of the slot and is slot-based. Type B can start at any symbol and be short, which is what makes mini-slot scheduling possible.
- A precoding resource block group — the set of blocks over which the precoder is guaranteed constant, so the UE may average channel estimates across them.
- Averaging DM-RS across blocks improves the estimate, but only if the precoder did not change. The PRG size tells the UE how far it may safely average.
- A URLLC transmission punctures an ongoing eMBB allocation. The affected UE is told afterwards by a pre-emption indication in DCI format 2_1, so it can discard the corrupted soft bits.
- Without it, corrupted soft values would be combined with the retransmission and poison the HARQ combining, making recovery harder than starting fresh.
- Resource elements the PDSCH must rate match around — used for coexistence with LTE, for SSBs, or for other signals that must not be overwritten.
- Repeating the same transport block across consecutive slots to gain energy for a coverage-limited UE, at the cost of throughput.
- CRC, code block segmentation with per-block CRC, LDPC encoding, rate matching, concatenation, scrambling, modulation, layer mapping, precoding, then mapping to resource elements.
- Overhead is subtracted — DM-RS, and a configured allowance for other signals — so the count used in the TBS calculation reflects what is actually available for data.
- One DCI conveys an MCS, a frequency allocation and a time allocation; from those both ends compute the same transport block size, and the physical layer chain turns those bits into resource elements.
Related Articles
5G NR Waveforms: CP-OFDM and DFT-s-OFDM, and When the Uplink Should Use Which
Why NR uses CP-OFDM everywhere but keeps DFT-s-OFDM as an uplink option, what PAPR really costs, and how the network chooses per UE.
5G NR Transmitter and Receiver Chain: Following the Bits From MAC to Antenna and Back
A block-by-block walk through the NR physical-layer transmit chain and its mirror-image receiver, explaining what each stage does and why it sits where it does.
5G NR Synchronisation Signals (PSS and SSS): How a Phone Finds a Cell From Nothing
PSS and SSS explained from the UE's point of view: what each signal gives the receiver, how the PCI is built from them, and why NR has 1008 cell identities.