5G/NR - SLIV  

 

 

 

SLIV(Start and Length Indicator Value)

SLIV is the Start and Length Indicator for the time domain allocation for PDSCH. One of the big difference between LTE and NR scheduling is that NR schedules not only for slot but also the symbols within the scheduled slot, whereas in LTE the schedule is done only for subframe level (not for the symbol levels within the scheduled subframe).

SLIV defines the start symbol and the number of consecutive symbols for PDSCH and PUSCH allocation using Single Number. Often, SLIV is considered to be very confusing because you need to figure out two quantities(start and length) from the single value.

How a single number SLIV value get interprented to start symbol and number of symbol ?

How the single number(SLIV) can represent the two different quantity (i.e, start symbol and number of consecutive symbols) ? It is possible because SLIV is created by a specific rule as  defined in 38.214 5.1.2.1 Resource allocation in time domain as follows.

NOTE : With this formula, you can easily figure out SLIV value if you are given the start symbol and the number of symbols, but it is not that simple to figure out start and symbol length from a given SLIV.  To figure out start and length of symbols from a given SLIV value, it would be handy to use a lookup table in this page.

    if (L-1) <= 7 then

          SLIV = 14 x (L-1) + S

    else

          SLIV = 14 x (14-L+1) + (14-1-S)

          , where 0 < L <= 14 - S

                   S = Start Symbol Index

                   L = Number of Consecutive Symbols

According to the above equation, you can create a huge tables with the possible S and L values. But not all of the combinations are taken as valid.  Only the set of combinations meeting the condition in the following table is allowed. Following table is from Release 15 specfication.

< 38.214-Table 5.1.2.1-1: Valid S and L combinations >

38.214 Release 15 Table 5.1.2.1-1 valid S and L combinations for PDSCH

 

< 38.214-Table 6.1.2.1-1: Valid S and L combinations >

38.214 Release 15 Table 6.1.2.1-1 valid S and L combinations for PUSCH

NOTE : The above table has been changed as follows in Release 16.

< 38.214 V16.4.0 -Table 5.1.2.1-1: Valid S and L combinations >

38.214 Release 16 Table 5.1.2.1-1 valid S and L combinations for PDSCH

 

< 38.214 V16.4.0 -Table 6.1.2.1-1: Valid S and L combinations >

38.214 Release 16 Table 6.1.2.1-1 valid S and L combinations for PUSCH

  • Note 1 is new in the PDSCH table : it says that S = 3 is applicable only if dmrs-TypeA-Position = 3. The Release 15 table lists S = {0,1,2,3} with no condition attached to it.
  • PDSCH Type B changed from three lengths to a range : L was {2,4,7} and it is now {2,…,13}. That one change is the largest difference between the two pairs of tables.
  • The PUSCH Type A row gained a qualifier : it now reads Type A (repetition Type A only), so the row no longer applies when repetition Type B is in use.
  • PUSCH Type B gained a second S+L limit : {1,…,14} for repetition Type A, and {1,…,27} for repetition Type B. An allocation reaching past one slot is what the wider limit allows.
  • Extended cyclic prefix follows the same pattern : the limits drop from 14 to 12, and the PUSCH repetition Type B limit becomes {1,…,23}.

NOTE : Both tables above were checked against 38.214 v19.4.0, and neither has changed since Release 16. The Release 15 pair further up the page is worth keeping, because older logs and older documents were written against it.

  • The formula is the definition : SLIV is not an index into a table, and it is computed from S and L by the two lines above.
  • The valid combination table is a separate filter : the formula produces a number for any S and L. The table then decides which of those a UE is allowed to receive.
  • Mapping type and cyclic prefix both narrow the set : one SLIV can be valid for Type B and invalid for Type A. It can also be valid under normal CP and invalid under extended.

Why the formula has two branches

Two lines of arithmetic look arbitrary until the numbers are counted. The second branch exists because of a counting problem. It takes that particular form because it has to avoid producing a number the first branch has already used.

Start with the size of the problem. A 14 symbol slot has 105 valid pairs of S and L, counting every pair where S + L is not greater than 14. Seven bits hold 128 values, so one number can carry all 105 and still leave some unused.

The first branch alone cannot do it. SLIV = 14 x (L-1) + S puts each length L into a block of 14 consecutive numbers, and there are 14 possible lengths. Fourteen blocks of 14 is 196 values, and seven bits cannot count that high.

The second branch fixes the count by sharing blocks. For L greater than 8 it computes 14 x (14-L+1) + (14-1-S), which produces a number inside a block already belonging to a short length. Long allocations and short ones therefore share the same 14 numbers.

Sharing works because short and long allocations cannot both be numerous. A long allocation leaves few choices of start symbol, since S + L cannot exceed 14. A length of 13 allows two start symbols and a length of 14 allows one. The block that gives 13 start symbols to L = 2 has room for the single one that L = 14 needs.

The pairing follows a simple rule. Block k holds the short length k + 1 and the long length 15 - k, so the two lengths sharing a block always add up to 16. The short length takes offsets 0 to 13 - k inside the block, and the long length takes 14 - k to 13.

Those two ranges meet exactly. No offset inside a block is used twice, and none is left empty, which is what makes the mapping reversible. A single SLIV therefore names one pair and never two.

Two consequences are worth remembering when reading a log. Valid SLIV values run from 0 to 104 with no gaps, so every integer in that range decodes to exactly one pair. Values from 105 to 127 never occur, so a SLIV above 104 indicates a decoder fault rather than an unusual allocation.

  • Seven bits is the constraint : 105 valid pairs fit inside 128 values, while one block per length would need 196.
  • Each block is shared by two lengths : one short and one long, and the two always add up to 16.
  • The two branches partition each block exactly : nothing is used twice and nothing is wasted, which is why the mapping can be reversed.
  • Valid SLIV runs from 0 to 104 : with no gaps inside that range and nothing above it.

Where the start symbol is measured from

Every worked example on this page assumes that S counts from the first symbol of the slot. That assumption holds almost always, and one configuration breaks it. Check this first when a Type B allocation starts at the wrong symbol.

38.214 states the default plainly. The starting symbol S is relative to the start of the slot, using a reference point S0 = 0. Every row of the mapping table further down this page is written on that basis.

One case moves the reference point. The UE has to be configured with referenceOfSLIVDCI-1-2. The PDSCH has to be scheduled by DCI format 1_2, with the CRC scrambled by C-RNTI, MCS-C-RNTI or CS-RNTI. K0 has to be zero, and the mapping type has to be Type B.

When all four hold, S is relative to the starting symbol S0 of the PDCCH monitoring occasion where the DCI was detected. Remove any one condition and S counts from the slot boundary again. The combination serves low latency, because a Type B allocation in the slot that granted it should begin where the grant ended.

The rule contains one tie-break. A PDCCH reception can include two candidates, from two different search space sets. The candidate that starts later in time is then the one that fixes S0.

  • S counts from the slot boundary by default : S0 = 0, and every SLIV in the table on this page assumes it.
  • Four conditions move the reference point : referenceOfSLIVDCI-1-2 configured, DCI format 1_2, K0 = 0, and mapping Type B.
  • The later PDCCH candidate wins : when two search space sets each yield a candidate, S0 comes from the one that starts later.

How the SLIV value get configured into RRC message ?

A SLIV never travels on its own. It sits in a row of a time domain resource allocation table, beside the slot offset and the mapping type, and the DCI selects the row rather than the SLIV. So the question a log raises is usually which row was chosen, and the RRC configuration below is where the rows come from.

PDSCH/PUSCH mapping type in the above table is specified in RRC message as shown below.

Following is based on 38.331 v19.3.0 (Release 19)

PDSCH-TimeDomainResourceAllocationList ::=  SEQUENCE (SIZE(1..maxNrofDL-Allocations)) OF PDSCH-TimeDomainResourceAllocation

PDSCH-TimeDomainResourceAllocation ::=   SEQUENCE {
    k0                                      INTEGER(0..32)                                                  OPTIONAL,   -- Need S
    mappingType                             ENUMERATED {typeA, typeB},
    startSymbolAndLength                    INTEGER (0..127)
}

PUSCH-TimeDomainResourceAllocationList ::=  SEQUENCE (SIZE(1..maxNrofUL-Allocations)) OF PUSCH-TimeDomainResourceAllocation

PUSCH-TimeDomainResourceAllocation ::=  SEQUENCE {
    k2                                      INTEGER(0..32)                                  OPTIONAL,   -- Need S
    mappingType                             ENUMERATED {typeA, typeB},
    startSymbolAndLength                    INTEGER (0..127)
}

NOTE : Three things in this listing differ from the Release 15 form that this page carried for a long time. The field startSymbolAndLength is an INTEGER (0..127) rather than a BIT STRING of 7 bits. It occupies seven bits either way, so a decoder reading the older text still lands on the right value, but the type in the specification has always been an integer.

The other two are the slot offsets. Both k0 and k2 run from 0 to 32 and are OPTIONAL with Need S. Older copies of this page showed k0 as INTEGER (1..3) and k2 as INTEGER (0..7), and neither range has ever been correct. A missing k0 or k2 means the UE keeps the value it already has, which is what Need S asks for.

Everything added after Release 15 arrives in separate IEs rather than inside these two. The Release 16 forms carry repetition and multiple allocation, and they are where SLIV stops being the only way to state a time domain allocation.

Following is based on 38.331 v19.3.0 (Release 19)

PDSCH-TimeDomainResourceAllocationList-r16 ::=  SEQUENCE (SIZE(1..maxNrofDL-Allocations)) OF PDSCH-TimeDomainResourceAllocation-r16

PDSCH-TimeDomainResourceAllocation-r16 ::=  SEQUENCE {
    k0-r16                                     INTEGER(0..32)                                              OPTIONAL,   -- Need S
    mappingType-r16                            ENUMERATED {typeA, typeB},
    startSymbolAndLength-r16                   INTEGER (0..127),
    repetitionNumber-r16                       ENUMERATED {n2, n3, n4, n5, n6, n7, n8, n16} OPTIONAL, -- Cond Formats1-0_1-1_4-0_4-1_4-2
    ...,
    [[
    k0-v1710                                INTEGER(33..128)                                               OPTIONAL    -- Need S
    ]],
    [[
    repetitionNumber-v1730                  ENUMERATED {n2, n3, n4, n5, n6, n7, n8, n16}                   OPTIONAL   -- Cond Format1-2
    ]]
}

Dummy-TDRA-List ::= SEQUENCE (SIZE(1.. maxNrofDL-Allocations)) OF MultiPDSCH-TDRA-r17

MultiPDSCH-TDRA-List-r17 ::= SEQUENCE (SIZE(1.. maxNrofDL-AllocationsExt-r17)) OF MultiPDSCH-TDRA-r17

MultiPDSCH-TDRA-r17 ::= SEQUENCE {
    pdsch-TDRA-List-r17                 SEQUENCE (SIZE(1..maxNrofMultiplePDSCHs-r17)) OF PDSCH-TimeDomainResourceAllocation-r16,
    ...
}

PUSCH-TimeDomainResourceAllocationList-r16 ::=  SEQUENCE (SIZE(1..maxNrofUL-Allocations-r16)) OF PUSCH-TimeDomainResourceAllocation-r16

PUSCH-TimeDomainResourceAllocation-r16 ::=  SEQUENCE {
    k2-r16                                     INTEGER(0..32)          OPTIONAL,   -- Need S
    puschAllocationList-r16                    SEQUENCE (SIZE(1..maxNrofMultiplePUSCHs-r16)) OF PUSCH-Allocation-r16,
...
}

PUSCH-Allocation-r16 ::=  SEQUENCE {
    mappingType-r16                           ENUMERATED {typeA, typeB}                     OPTIONAL,   -- Cond NotFormat01-02-Or-TypeA
    startSymbolAndLength-r16                  INTEGER (0..127)                              OPTIONAL,   -- Cond NotFormat01-02-Or-TypeA
    startSymbol-r16                           INTEGER (0..13)                               OPTIONAL,   -- Cond RepTypeB
    length-r16                                INTEGER (1..14)                               OPTIONAL,   -- Cond RepTypeB
    numberOfRepetitions-r16                   ENUMERATED {n1, n2, n3, n4, n7, n8, n12, n16} OPTIONAL,   -- Cond Format01-02
    ...,
    [[
    numberOfRepetitionsExt-r17                ENUMERATED {n1, n2, n3, n4, n7, n8, n12, n16, n20, n24, n28, n32, spare4, spare3, spare2,
                                                          spare1}                           OPTIONAL,   -- Cond Format01-02-For-TypeA
    numberOfSlotsTBoMS-r17                    ENUMERATED {n1, n2, n4, n8, spare4, spare3, spare2, spare1}  OPTIONAL,   -- Need R
    extendedK2-r17                            INTEGER (0..128)                              OPTIONAL    -- Cond MultiPUSCH
    ]],
    [[
    ul-MutingIndicator-r19                   ENUMERATED {enabled}                           OPTIONAL,   -- Need S
    occ-Length-r19                           ENUMERATED {n2, n4}                            OPTIONAL    -- Need R
    ]]
}

When the allocation is not a SLIV

A field named startSymbolAndLength implies that a start and a length always arrive folded together. From Release 16 that stopped being true, and the exception matters for anyone reading an uplink configuration.

PUSCH-Allocation-r16 offers two ways to state the same thing. It carries startSymbolAndLength-r16 as before. It also carries startSymbol-r16 as an INTEGER (0..13) together with length-r16 as an INTEGER (1..14), and the conditions make exactly one of the two present.

Which one appears depends on the repetition type. The condition Cond RepTypeB attaches to startSymbol and length, so PUSCH repetition Type B states S and L directly. Clause 6.1.2.1 of 38.214 says the same thing in words rather than in ASN.1.

The reason is the S + L limit of the Release 16 PUSCH table above. Repetition Type B allows S + L up to 27 under normal cyclic prefix, and no SLIV can express that. The formula folds S and L into a 14 symbol slot, so an allocation reaching past the slot has nowhere to fold.

Two other extensions are worth noting while the listing is open. The field k0-v1710 extends the PDSCH slot offset from 32 up to 128, which the higher subcarrier spacings need. And MultiPDSCH-TDRA-r17 holds a list of PDSCH allocations, so one row can schedule several PDSCHs at once.

  • SLIV is one encoding rather than the only one : from Release 16 a PUSCH allocation can carry the start and the length as two separate integers.
  • Repetition Type B is the case that needs it : its S + L limit reaches 27, and a seven bit SLIV cannot reach past one slot.
  • The list forms grew as well : MultiPDSCH-TDRA-r17 puts several PDSCH allocations behind a single table row.

SLIV Mapping Table

The table below runs the mapping in the reverse direction. Turning a pair into a number is one line of arithmetic, while turning a number back into a pair needs either the inverse arithmetic or a lookup. All 105 valid pairs are present, so any SLIV that a log shows can be found directly.

Applying the equation shown above and  38.214-Table 5.1.2.1-1, I have created a big table as below.

Following is the SLIV values that I calculated according to the formnula described above. You can use SLIV value as a key value to find out a unique pair of (S, L) in a look-up table. (NOTE : If you clicked on the linked page, you will get an example of PDSCH scheduling for a specific SLIV that I created using Matlab 5G Toolbox)

S

L

L-1

Last
Symbol

SLIV

Valid Mapping Type
(Normal CP)
PDSCH

Valid Mapping Type
(Normal CP)
PUSCH

0

1

0

0

0

Type B

2

1

1

14

Type B

Type B

3

2

2

28

Type A

Type B

4

3

3

42

Type A,Type B

Type A,Type B

5

4

4

56

Type A

Type A,Type B

6

5

5

70

Type A

Type A,Type B

7

6

6

84

Type A,Type B

Type A,Type B

8

7

7

98

Type A

Type A,Type B

9

8

8

97

Type A

Type A,Type B

10

9

9

83

Type A

Type A,Type B

11

10

10

69

Type A

Type A,Type B

12

11

11

55

Type A

Type A,Type B

13

12

12

41

Type A

Type A,Type B

14

13

13

27

Type A

Type A,Type B

1

1

0

1

1

Type B

2

1

2

15

TypeB

Type B

3

2

3

29

Type A

Type B

4

3

4

43

Type A,Type B

Type B

5

4

5

57

Type A

Type B

6

5

6

71

Type A

Type B

7

6

7

85

Type A,Type B

Type B

8

7

8

99

Type A

Type B

9

8

9

96

Type A

Type B

10

9

10

82

Type A

Type B

11

10

11

68

Type A

Type B

12

11

12

54

Type A

Type B

13

12

13

40

Type A

Type B

2

1

0

2

2

Type B

2

1

3

16

Type B

Type B

3

2

4

30

Type A

Type B

4

3

5

44

Type A,Type B

Type B

5

4

6

58

Type A

Type B

6

5

7

72

Type A

Type B

7

6

8

86

Type A,Type B

Type B

8

7

9

100

Type A

Type B

9

8

10

95

Type A

Type B

10

9

11

81

Type A

Type B

11

10

12

67

Type A

Type B

12

11

13

53

Type A

Type B

3

1

0

3

3

Type B

2

1

4

17

Type B

Type B

3

2

5

31

Type A

Type B

4

3

6

45

Type A,Type B

Type B

5

4

7

59

Type A

Type B

6

5

8

73

Type A

Type B

7

6

9

87

Type A,Type B

Type B

8

7

10

101

Type A

Type B

9

8

11

94

Type A

Type B

10

9

12

80

Type A

Type B

11

10

13

66

Type A

Type B

4

1

0

4

4

Type B

2

1

5

18

TypeB

Type B

3

2

6

32

Type B

4

3

7

46

Type B

Type B

5

4

8

60

Type B

6

5

9

74

Type B

7

6

10

88

Type B

Type B

8

7

11

102

Type B

9

8

12

93

Type B

10

9

13

79

Type B

5

1

0

5

5

Type B

2

1

6

19

TypeB

Type B

3

2

7

33

Type B

4

3

8

47

Type B

Type B

5

4

9

61

Type B

6

5

10

75

Type B

7

6

11

89

Type B

Type B

8

7

12

103

Type B

9

8

13

92

Type B

6

1

0

6

6

Type B

2

1

7

20

TypeB

Type B

3

2

8

34

Type B

4

3

9

48

Type B

Type B

5

4

10

62

Type B

6

5

11

76

Type B

7

6

12

90

Type B

Type B

8

7

13

104

Type B

7

1

0

7

7

Type B

2

1

8

21

Type B

Type B

3

2

9

35

Type B

4

3

10

49

Type B

Type B

5

4

11

63

Type B

6

5

12

77

Type B

7

6

13

91

Type B

Type B

8

1

0

8

8

Type B

2

1

9

22

Type B

Type B

3

2

10

36

Type B

4

3

11

50

Type B

Type B

5

4

12

64

Type B

6

5

13

78

Type B

9

1

0

9

9

Type B

2

1

10

23

Type B

Type B

3

2

11

37

Type B

4

3

12

51

Type B

Type B

5

4

13

65

Type B

10

1

0

10

10

Type B

2

1

11

24

Type B

Type B

3

2

12

38

Type B

4

3

13

52

Type B

Type B

11

1

0

11

11

Type B

2

1

12

25

Type B

Type B

3

2

13

39

Type B

12

1

0

12

12

Type B

2

1

13

26

Type B

Type B

13

1

0

13

13

Type B

One column needs a caution. The Valid Mapping Type (Normal CP) PDSCH column follows the Release 15 table further up this page, where mapping Type B accepted L from the set {2, 4, 7} only. Under Release 16 and later, Type B accepts L from 2 to 13, which makes 62 more rows valid for PDSCH Type B than the column marks.

The PUSCH column needs no such caution. Neither the S limits nor the L limits for PUSCH changed between the two releases, so the column still agrees with the current table for repetition Type A.

  • Every SLIV from 0 to 104 appears exactly once : 105 rows and no repeated value, which is what makes the SLIV usable as a lookup key.
  • The PDSCH column is a Release 15 column : 62 further rows are valid for PDSCH mapping Type B under Release 16 and later.
  • The PUSCH column is still current : nothing changed for PUSCH repetition Type A between Release 15 and Release 16.
  • Last Symbol is S + L - 1 : the column is there because an allocation ending on symbol 13 is the last one that fits inside a normal slot.

Reference

[1] 38.214 v19.4.0 : NR - Physical layer procedures for data. Clause 5.1.2.1 was read for the PDSCH formula, the reference point for S and Table 5.1.2.1-1. Clause 6.1.2.1 was read for the PUSCH equivalents and Table 6.1.2.1-1.

[2] 38.331 v19.3.0 : NR - Radio Resource Control (RRC) protocol specification. The PDSCH and PUSCH TimeDomainResourceAllocation IEs and their Release 16 and later forms were read.