NR SA TimeDomainAllocationList
This tutorial is about configuration for PDSCH/PUSCH-TimeDomainAlloationList in RRC message. With default configuration, this IE is automatically configured by the callbox based on the TDD pattern specified in the configuration file. Even though it is possible to configure k1, k2 manually, it is not strongly recommended since it is challenging to configure it without colliding with internal auto-configuration algorithm. However, I will show you how to configure it manually anyway in Test2 for your reference
This tutorial is based on 2021-11-19 release. The autoconfiguration algorithm may evolve (change) in a future release. The tutorial will be updated if the algorithm changes
In this tutorial, it is assumed that you are faimiliar with basic operations of Amari Callbox operation. So in this tutorial, I will explain only about the configuration and analyzing the test result in the WebGUI log.
TimeDomainAllocationList are the list of parameters that configures k0, k1, k2. The simplified definition of k0, k1, k2 are as follows :
- k0 : The gap (in number of slots) between DCI and corresponding PDSCH transmission. k0 = 0 or omit indicates that PDSCH is transmitted in the same slot as DCI. (details)
- k1 : The gap (in number of slots) between PDSCH and the corresponding PUCCH (Ack/Nack) (details)
- k2 : The gap (in number of slots) between DCI(UL Grant) and corresponding PUSCH transmission (details)
- SLIV : Start and Length Indicator Value representing the starting symbol and number of symbols for PDSCH and PUSCH (details)
Table of Contents
- NR SA TimeDomainAllocationList
- Introduction
- Summary of the Tutorial
- Test Setup
- Key Configuration Parameters
- Configuration
- Perform the Test
- Test 1 : Using default configuration
- Test 2 : Manual configuration of k1,k2,msg3_k2
- Test 3 : Changing PDSCH mapping type(TypeB, n_symb)
- Test 4 : Changing PDSCH mapping type(TypeB) and SLIV
- Test 5 : Changing PUSCH mapping type(TypeB) and SLIV
- RRC / NAS Signaling
Introduction
The configuration of PDSCH/PUSCH-TimeDomainAllocationList in the context of 5G NR (New Radio) RRC (Radio Resource Control) signaling is a fundamental aspect of physical layer scheduling and resource allocation within cellular networks. This configuration governs the timing relationships and resource mapping for both downlink (PDSCH: Physical Downlink Shared Channel) and uplink (PUSCH: Physical Uplink Shared Channel) transmissions. At its core, the TimeDomainAllocationList defines critical parameters such as k0, k1, and k2, which determine the scheduling offsets and timing gaps between control information (DCI) and data transmissions, as well as the timing of associated uplink feedback (PUCCH: Physical Uplink Control Channel). In practical 5G test environments, such as with the Amari Callbox system, these allocations are typically auto-configured by the system based on the underlying TDD (Time Division Duplex) pattern, ensuring optimal operation and avoiding parameter conflicts. However, manual configuration may be required in certain testing or development scenarios, which introduces complexity due to the intricate interplay with internal scheduling algorithms. Mastery of these configurations is essential for advanced network validation, troubleshooting, and performance optimization, reflecting the close relationship between RRC configuration, physical layer resource allocation, and end-to-end radio system behavior. This tutorial delves into the manual configuration process, discusses the implications of parameter selection, and provides guidance for interpreting results within the WebGUI of the Amari Callbox, with a specific focus on the release as of November 2021 and awareness of possible algorithmic evolution in future releases.
-
Context and Background
- The tutorial focuses on the technical configuration of TimeDomainAllocationList parameters (k0, k1, k2) within the RRC layer, critical for controlling the timing and structure of downlink and uplink transmissions in 5G NR.
- These parameters directly influence how data and control information are mapped onto physical resources, affecting system latency, throughput, and reliability.
- The tutorial uses the Amari Callbox platform, a widely used 5G test system, highlighting real-world application and practical analysis via its WebGUI interface.
-
Relevance and Importance
- Understanding and configuring TimeDomainAllocationList is essential for advanced 5G system testing, performance tuning, and protocol validation.
- Manual configuration, although not generally recommended due to potential conflicts with automatic algorithms, provides deeper insight into 5G NR scheduling mechanisms and enables specialized test scenarios.
- The knowledge gained is valuable for engineers working on network equipment testing, UE development, and radio protocol analysis.
-
Learning Outcomes
- Learners will gain a comprehensive understanding of k0, k1, and k2 timing parameters and their impact on 5G NR scheduling.
- The tutorial will guide users through the process of manually configuring the TimeDomainAllocationList in the Amari Callbox WebGUI environment.
- Learners will develop the ability to analyze test results and interpret system behavior resulting from different configuration settings.
- Insights into the evolution and adaptability of autoconfiguration algorithms across software releases will be provided.
-
Prerequisite Knowledge
- Familiarity with basic Amari Callbox operations is assumed; the tutorial will focus exclusively on advanced configuration and analysis topics.
- Understanding of 5G NR architecture, RRC signaling, and the physical channel structure (PDSCH, PUSCH, PUCCH) is recommended for maximum comprehension.
- Prior experience with test systems and interpreting log outputs within a WebGUI environment will be beneficial.
Summary of the Tutorial
This tutorial provides a comprehensive overview of low layer NR TDD slot allocation testing using a gNB simulator (Callbox) and UE setup. The procedures focus on verifying TDD slot allocations, k1/k2 values, mapping types, and SLIV configurations through both default and manual settings. Below is a structured summary of the test methodologies and procedures described in the tutorial.
-
Test Setup:
- Utilizes a basic setup with a Callbox and UE for low layer testing.
- The provided SIM card is used as-is, with configuration changes possible via a referenced Configuration Guide.
-
Key Configuration Parameters:
- Critical parameters include k1, k2, mapping_type, start_symb, n_symb, msg3_k2, and tdd_ul_dl_config.
- TDD pattern parameters such as ref_subcarrier_spacing, pattern1 and pattern2 (each with period, dl_slots, ul_slots, dl_symbols, ul_symbols) are important for test configuration.
-
General Test Execution Steps:
- Configure the gNB using gnb-sa-tdla.cfg (derived from default gnb-sa.cfg).
- Default MME (mme-ims.cfg) and IMS (ims.default.cfg) configurations are used.
- Perform NR SA attach; verify correct SRS and slot allocations via log analysis.
-
Test 1: Using Default Configuration
- Apply the default gnb-sa.cfg settings without modifications.
- Select TDD pattern using NR_TDD_CONFIG; set duplex mode (NR_TDD) to 1 (TDD), and NR_TDD_CONFIG to 2 (a sample Amarisoft configuration).
- k1 is not set manually; gNB determines it automatically.
- Verify in logs:
- TimeDomainAllocationList is automatically configured (usually two elements: full slot and partial slot).
- Downlink/Uplink slot and symbol counts are determined by tdd-UL-DL-ConfigurationCommon (e.g., 5ms period, 7 DL slots, 2 UL slots, etc.).
- k1 values are automatically set based on TDD pattern; manual override is not recommended.
- Error messages on the eNB screen assist troubleshooting if configuration issues arise.
-
Test 2: Manual Configuration of k1, k2, msg3_k2
- Demonstrates manual setting of k1, k2, and msg3_k2 in gnb-sa-tdla.cfg.
- Uses the same TDD pattern as Test 1 (NR_TDD_CONFIG set to 2).
- Manual configuration is for demonstration; users are cautioned against manual changes unless fully understood.
- After manual k1 configuration, k2 and msg3_k2 must be set accordingly.
- Log analysis:
- TimeDomainAllocationList and SLIV elements are still auto-determined by gNB; manual changes are discouraged.
- For pusch-TimeDomainAllocationList, three elements are configured: two for regular PUSCH, one for msg3 PUSCH.
- The k2 value in RRC is calculated using msg3_k2 and a 3GPP-defined delta (rrc_k2 = msg3_k2 - Delta).
- Configuration is verified for errors using the eNB screen.
-
Test 3: Changing PDSCH Mapping Type (TypeB, n_symb)
- Demonstrates configuration of PDSCH mapping type B for mini-slot operation (2, 4, or 7 symbols).
- Manual setting of mapping_type, start_symb, and n_symb in the PDSCH configuration.
- SLIV (Start Symbol and Length Indicator Value) is manually configured via these parameters.
- Logs are checked to confirm TimeDomainAllocationList and mappingType reflect the configured values.
- Errors are validated on the eNB screen.
-
Test 4: Changing PDSCH Mapping Type (TypeB) and SLIV
- Extends Test 3 by configuring both mapping type B and SLIV via mapping_type, start_symb, and n_symb.
- Confirms via logs that TimeDomainAllocationList and mappingType are set as specified in the configuration.
- Ensures no configuration errors are present on the eNB screen.
-
Test 5: Changing PUSCH Mapping Type (TypeB) and SLIV
- Demonstrates manual configuration of PUSCH mapping type B and SLIV using mapping_type, start_symb, and n_symb in PUSCH parameters.
- Checks that the TDAL (Time Domain Allocation List) elements are automatically determined by the gNB, but mappingType and SLIV are applied as configured.
- Ensures error-free configuration by checking the eNB screen.
General Methodology:
- Each test consists of modifying configuration files as required, applying the configuration, performing NR SA attach, and verifying the resulting configuration via log analysis (TimeDomainAllocationList, mappingType, k1/k2 values, etc.).
- Emphasis is placed on understanding the consequences of manual versus automatic configuration, especially for timing-related parameters (k1, k2, msg3_k2, SLIV, mappingType).
- Always confirm the absence of configuration errors via the eNB screen and use provided log outputs for validation.
Test Setup
Test setup for this tutorial is as shown below. This is just for low layer testing, you may not need any complicated IP layer setup.
- SIM Card used in this tutorial is the one delivered with the system as it is.
- If you want to change the configuration, The tutorial Configuration Guide would help
Antennas are fitted to the first SDR card only, RF 1 which is sdr 0, and the other cards in the chassis are left bare. One card is all this needs, since everything below runs on a single 20 MHz cell, and the UE reaches it over the air rather than through cabling.
The UE is an ordinary handset. Nothing in these tests depends on which one it is, because what is being checked is what the gNB puts into SIB1 and into the dedicated configuration, not anything the UE reports back.

Key Configuration Parameters
Followings are important configuration parameters for this tutorial. You may click on the items for the descriptions from Amarisoft documents.
- k1
- k2
- mapping_type
- start_symb
- n_symb
- msg3_k2
- pusch.mapping_type : the pusch side of the three above, exercised in Test 5
- pusch.start_symb
- pusch.n_symb
- tdd_ul_dl_config : In this link, you can get the descriptions for all the parameters listed below
- ref_subcarrier_spacing
- pattern1
- period
- dl_slots
- ul_slots
- dl_symbols
- ul_symbols
- pattern2
- period
- dl_slots
- ul_slots
- dl_symbols
- ul_symbols
Configuration
I have used gnb-sa-tdla.cfg which is copied and modified from gnb-sa.cfg. The details of specific parameters to be tested will be shown under each test.

I am using the default mme (mme-ims.cfg), ims (ims.default.cfg) config as shown below.

Perform the Test
Testing process is simple. You only have to do NR SA attach (See NR SA Attach tutorial if you are not familiar with the process). The important part is to check the log and verify if you get the SRS as configured.
Test 1 : Using default configuration
Set the configuration in gnb-sa-tdla.cfg as follows. This test uses the contents of gnb-sa.cfg as it is (without changing any contents in it).
In the configuration file, you can select any specific tdd pattern with the parameter NR_TDD_CONFIG. To apply TDD configuration, you first need to configure the duplex mode (NR_TDD) to 1 (TDD). And then I set NR_TDD_CONFIG to 2 which is one of default sample configuration provided by Amarisoft sample configuration.
k1 in pdsch configuration is not set in this test meaning that k1 is automatically determined by gNB software.
The branch that NR_TDD_CONFIG 2 selects is pattern1 with period 5 in ms, dl_slots 7, dl_symbols 6, ul_slots 2 and ul_symbols 4. The rest of the defines are the stock ones, FR2 at 0 so this is FR1, N_ANTENNA_DL 2 and N_ANTENNA_UL 1, NR_BANDWIDTH 20 and NR_LONG_PUCCH_FORMAT 2.
In the pdsch block both timing lines are still comments, the k0 delay from DCI to PDSCH and the k1 delay from PDSCH to the ACK or NACK, so neither is being overridden. mapping_type is "typeA", which is where Tests 3 and 4 will start from, and dmrs_add_pos 1, dmrs_type 1, dmrs_max_len 1, mcs_table "qam256", rar_mcs 2 and si_mcs 6 stay as they are through all five tests. The mcs line at the bottom is commented out, so the MCS is left to the downlink channel quality estimate.

Make it sure that you don't see any errors in enb screen. If your configuration has any problem, you may get pretty useful error message which may be helpful for troubleshooting.
A clean start is the version banner, then a single RF0 line, then the (enb) prompt with nothing in between. In this run RF0 reads sample_rate=23.040 MHz, dl_freq=3489.420 MHz, ul_freq=3489.420 MHz, band n78, dl_ant=2 and ul_ant=1, so the 20 MHz cell with 2x2 downlink came up on the values the file asked for, and dl_freq matching ul_freq is what TDD looks like on this line.
The kind of mistake this tutorial can produce, a k1 array that breaks the internal rules or a SLIV that cannot exist, is reported right here instead of the prompt, and the message usually names the parameter. That is why it is worth a look after each of these edits rather than only once something later goes wrong. The same check comes back after every test below, so I will not walk through this output again there.

You can confirm how TimeDomainAllocationList is configured in RRC from the log as shown below. Number of elements and SLIV is automatically determined and set by the gNB(Callbox). It is not advisable to change it manually. Usually two elements are configured, one with full slots and the other one with partial slot. MappingType can be changed by configuration file if want.
The list has exactly two entries in this run, both with mappingType typeA, which is what pdsch mapping_type is set to in the file, and startSymbolAndLength 40 on the first with 57 on the second. Neither number appears anywhere in the configuration file. They came out of the gNB.
These two are the baseline for the rest of the tutorial, since Tests 3 and 4 edit the pdsch block and this is the list you come back to in order to see what the edit did. Any SIB1 row on BCCH-NR in the RRC layer carries it, so there is no need to hunt for a particular one, and pdsch-TimeDomainAllocationList sits inside pdsch-ConfigCommon a little below the searchSpace entries.
c
Since automatic configuration of k1 and k2 is affected by tdd-UL-DL-ConfigurationCommon, it would be good to check on this configuration as well. In this test, dl-UL-TransmissionPeriodicity is set to 5ms which correponds to 10 slots in case of subcarrier spacing 30Khz. The number of downlink slot(nrofDownlinkSlots) are set to 7, Number of Downlink Symbols(nrofDownlinkSymbols) are set to 6 and the number of uplink slot(nrofUplinkSlots) are set to 2, Number of Uplink Symbols(nrofUplinkSymbols) are set to 4
referenceSubcarrierSpacing in the same IE is kHz30, and that is the value the periodicity is counted in slots against. There is no pattern2 alongside pattern1, because pattern2 is not set in the configuration file, so the whole period is described by pattern1 on its own.
Each field maps onto one line of the configuration file, period onto dl-UL-TransmissionPeriodicity, dl_slots onto nrofDownlinkSlots, dl_symbols onto nrofDownlinkSymbols, ul_slots onto nrofUplinkSlots and ul_symbols onto nrofUplinkSymbols. That makes this the quickest way to confirm that the NR_TDD_CONFIG branch you think you edited is the one that actually got compiled in, which matters more than usual here because the k1 and k2 arrays of the next test are written against it.

Now let's confirm on k1 configuration in RRC. you can check it with dl-DataToUL-ACK IE. The number of elements and each k1 values is automatically determined by Callbox(gNB) based on TDD UL/DL pattern. It is possible to manually configure it but manual configuration is not recommended because it is difficult to configure manually without violating the internal rules.
The list in this run is 8, 7, 6, 5, 4, 12, 11, seven values in that order, and none of them appears anywhere in the configuration file. This is the list Test 2 replaces with a hand written array, so it is worth noting the values down before moving on.
dl-DataToUL-ACK sits inside pucch-Config, just under the format1 and format2 setup and the schedulingRequestToAddModList entry with schedulingRequestId 0 and periodicityAndOffset sl40. Open an RRC setup or an RRC reconfiguration row to reach it rather than a SIB1 row, because this is dedicated configuration sent to the UE and not broadcast.

Test 2 : Manual configuration of k1,k2,msg3_k2
In this test, I will show you how configure k1,k2,msg3_k2 value manually. This is just for demonstation/tutorial purpose, it is not recommended to change these variables manually since it is tricky to set the proper values without violating the callbox's internal rule
Set the configuration in gnb-sa-tdla.cfg as follows.
In the configuration file, you can select any specific tdd pattern with the parameter NR_TDD_CONFIG. To apply TDD configuration, you first need to configure the duplex mode (NR_TDD) to 1 (TDD). And then I set NR_TDD_CONFIG to 2 which is one of default sample configuration provided by Amarisoft sample configuration.
k1 in pdsch configuration is set manually, but this is just for information purpose. I do not enourage users to do this unless it is really required and user completes understand what to do. If you configure the k1 manually, you should configure k2, msg3_k2 accordingly as well.
The array I put in is k1: [8,7,7,6,5,4,12,11], eight entries. The two comment lines above it still describe k0 and k1 as automatic settings, and they are still comments, so this one line is the whole of the override. Everything else in the pdsch block is as Test 1 left it, mapping_type still "typeA" and the mcs line still commented out.
Both the number of entries and the values are yours to get right, and the callbox algorithm has rules about which combinations it will accept. Note that 7 appears twice in this array, at k1[1] and k1[2], which matters later when you count the entries that come back in RRC. Writing this array on its own is also not enough, k2 and msg3_k2 in the pusch block have to be set to go with it.

Since you configured k1 manually, you should set k2 and msg3_k2 according to the k1 settings.
k2 is [7,4] with two entries and msg3_k2 is 8, both written straight under the comment that still calls them automatic settings. msg3_k2 is a single value rather than an array because there is only one Msg3 to schedule, and it is also the one of the three that does not reach RRC as you typed it, which the last step of this test comes back to.
The rest of the pusch block is untouched here. mapping_type is "typeA" with n_symb 14, that is the whole slot, and Test 5 is where those two move. tf_precoding is false, mcs_table and mcs_table_tp are both "qam256", ldpc_max_its is 5, msg3_mcs is 4 and beta_offset_ack_index is 9. The max_rank line sits inside an #if USE_SRS block and has nothing to do with the timing being set here.

In this test, one of the default configuration (NR_TDD_CONFIG 2) is used. With this tdd pattern, the period is 5 ms which is 10 slots for the case of Subcarrier Spacing 30Khz, number of downlink slot is 7 and the number of downlink symbol is 6 and number of uplink slot is 2 and the number of uplink symbol is 4.
This is the same branch Test 1 ran on, unchanged. It is worth having in front of you again because the k1 and k2 arrays only make sense against this particular pattern, and the moment you point NR_TDD_CONFIG at another value the arrays you wrote for this one stop being valid.

The configuration shown above can be illustrated as follows. It would be a good practice to convert the configuration into illustration. (
The row along the top is two periods of the pattern drawn side by side, seven downlink slots, then the special slot, then two uplink slots, and then the same again. The red arrows are the eight k1 entries, one leaving each slot that can carry a PDSCH and landing on the uplink slot that will carry its feedback. The two rightmost of them reach across into the uplink slots of the second period, which is what the 12 and 11 at the end of the array are for. The yellow arrows are the two k2 entries, running from the downlink slot that carries the DCI to the uplink slot that carries the PUSCH.
Drawing it out this way is what makes an off by one visible before you start the callbox. Count the arrow heads landing on each uplink slot, then count the entries in the array, and if the two do not agree the array is wrong. Doing it afterwards means finding out from an error message instead.

Make it sure that you don't see any errors in enb screen. If your configuration has any problem, you may get pretty useful error message which may be helpful for troubleshooting.

You can confirm the configuration in SIB1 as below. You can confirm how TimeDomainAllocationList is configured in RRC from the log as shown below. Number of elements and SLIV is automatically determined and set by the gNB(Callbox). It is not advisable to change it manually. Usually two elements are configured, one with full slots and the other one with partial slot. MappingType can be changed by configuration file if want.
The two entries read the same as they did in Test 1, mappingType typeA with startSymbolAndLength 40 and 57. Writing k1 by hand does not touch this list, because k1 decides when the feedback goes out while this list decides which symbols inside a slot a PDSCH occupies. The place the manual k1 shows up is dl-DataToUL-ACK, two steps further down in this test.

In this test, one of the default configuration (NR_TDD_CONFIG 2) is used. With this tdd pattern, the period is 5 ms which is 10 slots for the case of Subcarrier Spacing 30Khz, number of downlink slot is 7 and the number of downlink symbol is 6 and number of uplink slot is 2 and the number of uplink symbol is 4.
This IE reads exactly as it did in Test 1, and that is the point of showing it. I did not touch NR_TDD_CONFIG for this test, so the pattern the k1 and k2 arrays were drawn against is still the one on the air. If you ever find this IE differing from the drawing you made, stop there, because every entry in both arrays is measured against it.

Now let's confirm on k1 configuration in RRC. you can check it with dl-DataToUL-ACK IE. The number of elements and each k1 values is automatically determined by Callbox(gNB) based on TDD UL/DL pattern. It is possible to manually configure it but manual configuration is not recommended because it is difficult to configure manually without violating the internal rules.
The list reads 8, 7, 6, 5, 4, 12, 11, which is seven values, while the array in the configuration file was [8,7,7,6,5,4,12,11], which is eight. The difference is the repeated 7, which appears once in the IE. Count the entries before you conclude that something was dropped or rejected.
Every other value is in the same order as I typed it, so this is the direct check that the array reached the air. dl-DataToUL-ACK is in the same place as before, inside pucch-Config on an RRC setup row, so the two tests can be compared side by side.

Then check on pusch-TimeDomainAllocationList. In this specific test case, three elements are configured. The first two are for the regular PUSCH and the last one is for msg3 PUSCH. You may notice that k2 value set in this RRC message is a little bit different from msg3_k2 you set in the configuration file. The reason is that the msg3 k2 set in the RRC message is not the same as msg3_k2 you set in the configuration file. The k2 value in the RRC is determined by msg3_k2 value and Delta value predefined in 3GPP in the formula rrc_k2 = msg3_k2 - Delta.
The three entries read k2 7, k2 4 and k2 5, all with mappingType typeA and startSymbolAndLength 27. The first two are the [7,4] I wrote into the file, in that order. The third is the Msg3 one, and the applicable row of 38.214 Table 6.1.2.1.1-5 is mu 1 with Delta 3, so msg3_k2 of 8 minus 3 gives the 5 that appears here.
Change msg3_k2 and you have to look Delta up again for whatever subcarrier spacing the cell is running, since the same msg3_k2 comes out as a different number at a different mu. All three entries carry startSymbolAndLength 27 because pusch n_symb is still 14 in this test, and Test 5 is where that value moves.

Test 3 : Changing PDSCH mapping type(TypeB, n_symb)
In this test, I will show you how to configure PDSCH mapping typeB. With the mapping type B, you can configure mini-slot (with the number of symbos 2,4,7).
Set the configuration in gnb-sa-tdla.cfg as follows.
In the configuration file, you can select any specific tdd pattern with the parameter NR_TDD_CONFIG. To apply TDD configuration, you first need to configure the duplex mode (NR_TDD) to 1 (TDD). And then I set NR_TDD_CONFIG to 2 which is one of default sample configuration provided by Amarisoft sample configuration.
In this case, the SLIV value (derived from mapping type and the number of symbols) is configured manually in pdsch configuration parameter. You can change SLIV value by setting mapping_type,start_symb and n_symb in pdsch.
In this file mapping_type is "typeB" and n_symb is 4. n_symb stops being optional the moment you go to typeB, the gNB will not fill it in for you, so the two lines have to be written together. start_symb is not set here, which is the one thing Test 4 adds on top.
k1 is back to being a comment in this test, so the hand written array from Test 2 is gone and the feedback timing is the gNB's again. That keeps the test down to a single variable, which is worth doing when what you are after is what one parameter does to the broadcast list.

Make it sure that you don't see any errors in enb screen. If your configuration has any problem, you may get pretty useful error message which may be helpful for troubleshooting.

You can confirm the configuration in SIB1 as below. You can confirm how TimeDomainAllocationList is configured in RRC from the log as shown below. In this case, the number of SLIV(startSymbolAndLength), mappingType is configured as you set in the configuration file.
The list has come down to a single element, mappingType typeB with startSymbolAndLength 43, where Test 1 carried two entries at 40 and 57. mappingType followed the file directly. The 43 did not, it is what n_symb 4 turned into once encoded, so SLIV is a number you steer through n_symb and start_symb rather than one you write.
With start_symb left out of the file, the start symbol half of that 43 came from the gNB. Test 4 sets start_symb as well, and this same element is where the difference shows up.

Test 4 : Changing PDSCH mapping type(TypeB) and SLIV
In this test, I will show you how to configure PDSCH mapping typeB. With the mapping type B and SLIV by setting the start symbol and length of the symbols.
Set the configuration in gnb-sa-tdla.cfg as follows.
In the configuration file, you can select any specific tdd pattern with the parameter NR_TDD_CONFIG. To apply TDD configuration, you first need to configure the duplex mode (NR_TDD) to 1 (TDD). And then I set NR_TDD_CONFIG to 2 which is one of default sample configuration provided by Amarisoft sample configuration.
In this case, the SLIV value (derived from mapping type and the number of symbols) is configured manually in pdsch configuration parameter. You can change SLIV value by setting mapping_type,start_symb and n_symb in pdsch.
The only difference from Test 3 in this file is the line start_symb: 4 added under n_symb: 4. mapping_type is still "typeB", k1 is still a comment and the rest of the pdsch block is untouched, so whatever the broadcast list does differently comes from that one line.
start_symb is optional even with typeB. Leaving it out is what Test 3 did, and the gNB picked a start symbol itself. Setting it to 4 says the PDSCH begins at symbol 4 of the slot and runs for the four symbols n_symb asks for.

Make it sure that you don't see any errors in enb screen. If your configuration has any problem, you may get pretty useful error message which may be helpful for troubleshooting.

You can confirm the configuration in SIB1 as below. You can confirm how TimeDomainAllocationList is configured in RRC from the log as shown below. In this case, the number of SLIV(startSymbolAndLength), mappingType is configured as you set in the configuration file.
The single element now reads startSymbolAndLength 46 against the 43 of Test 3, with mappingType typeB unchanged and still only one entry in the list. n_symb stayed at 4 across both tests, so the difference of 3 is start_symb 4 arriving in the encoded value.
This is the check that start_symb actually took. If you set it and this number does not move, either the value was rejected or the branch you edited is not the one being compiled, and the enb screen from the previous step is where the reason will be.

Test 5 : Changing PUSCH mapping type(TypeB) and SLIV
In this test, I will show you how to configure PUSCH mapping typeB. With the mapping type B and SLIV by setting the start symbol and length of the symbols.
Set the configuration in gnb-sa-tdla.cfg as follows.
In the configuration file, you can select any specific tdd pattern with the parameter NR_TDD_CONFIG. To apply TDD configuration, you first need to configure the duplex mode (NR_TDD) to 1 (TDD). And then I set NR_TDD_CONFIG to 2 which is one of default sample configuration provided by Amarisoft sample configuration.
In this case, the SLIV value (derived from mapping type and the number of symbols) is configured manually in pusch configuration parameter. You can change SLIV value by setting mapping_type,start_symb and n_symb in pusch.
This test moves to the pusch block and leaves pdsch alone, which is the difference from Tests 3 and 4. mapping_type is "typeB" with n_symb 14 and start_symb 0, so the allocation begins at the first symbol of the slot and takes all fourteen.
k2 and msg3_k2 are back to being comments in this file, so the hand written arrays from Test 2 are out of play and the uplink timing is the gNB's again. That leaves mapping_type, n_symb and start_symb as the only three lines that differ from the stock pusch block, everything from dmrs_add_pos down to beta_offset_ack_index being as it was.

Make it sure that you don't see any errors in enb screen. If your configuration has any problem, you may get pretty useful error message which may be helpful for troubleshooting.

You can confirm the configuration in SIB1 as below. You can confirm how TimeDomainAllocationList is configured in RRC from the log as shown below. In this case, the number of TDAL elements are configured automatically by gNB, mappingType and SLIV(startSymbolAndLength) value is configured as you set in the configuration file.
All three entries now carry mappingType typeB where Test 2 had typeA, and all three keep startSymbolAndLength 27, which is what n_symb 14 with start_symb 0 encodes to. The mapping_type line therefore applies to the whole list rather than to one entry of it.
The k2 values read 7, 4 and 5, the same three numbers Test 2 produced, and this time nobody wrote them. They came out of the gNB, which is worth knowing before you decide that an array has to be set by hand to get a particular timing.

RRC / NAS Signaling
SIB1 (SA)
: This is the SIB1 message sent by gNB to configure NR SA. (
{
message c1: systemInformationBlockType1: {
cellSelectionInfo {
...
},
cellAccessRelatedInfo {
...
connEstFailureControl {
...
},
servingCellConfigCommon {
downlinkConfigCommon {
frequencyInfoDL {
...
},
initialDownlinkBWP {
genericParameters {
locationAndBandwidth 13750,
subcarrierSpacing kHz30
},
pdcch-ConfigCommon setup: {
...
},
pdsch-ConfigCommon setup: {
pdsch-TimeDomainAllocationList {
{
mappingType typeA,
startSymbolAndLength 40
},
{
mappingType typeA,
startSymbolAndLength 57
}
}
}
},
bcch-Config {
...
},
pcch-Config {
...
}
},
uplinkConfigCommon {
frequencyInfoUL {
...
},
initialUplinkBWP {
genericParameters {
...
},
rach-ConfigCommon setup: {
...
},
pusch-ConfigCommon setup: {
pusch-TimeDomainAllocationList {
{
k2 7,
mappingType typeA,
startSymbolAndLength 27
},
{
k2 4,
mappingType typeA,
startSymbolAndLength 27
},
{
k2 5,
mappingType typeA,
startSymbolAndLength 27
}
},
p0-NominalWithGrant -76
},
pucch-ConfigCommon setup: {
...
}
},
timeAlignmentTimerCommon infinity
},
ssb-PositionsInBurst {
inOneGroup '80'H
},
ssb-PeriodicityServingCell ms20,
tdd-UL-DL-ConfigurationCommon {
referenceSubcarrierSpacing kHz30,
pattern1 {
dl-UL-TransmissionPeriodicity ms5,
nrofDownlinkSlots 7,
nrofDownlinkSymbols 6,
nrofUplinkSlots 2,
nrofUplinkSymbols 4
}
},
ss-PBCH-BlockPower -28
},
ue-TimersAndConstants {
...
}
}
}