diff --git a/applications/lofar2/libraries/ring/hdllib.cfg b/applications/lofar2/libraries/ring/hdllib.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..7ba2d20b96256c3a83f726dd0cdd78eaacb6c7c3
--- /dev/null
+++ b/applications/lofar2/libraries/ring/hdllib.cfg
@@ -0,0 +1,17 @@
+hdl_lib_name = lofar2_ring
+hdl_library_clause_name = lofar2_ring_lib
+hdl_lib_uses_synth = common dp technology mm dp diag tr_10GbE
+hdl_lib_uses_sim = 
+hdl_lib_technology = 
+
+synth_files = 
+
+test_bench_files =
+
+regression_test_vhdl = 
+
+[modelsim_project_file]
+
+
+[quartus_project_file]
+
diff --git a/applications/lofar2/libraries/ring/ring.peripheral.yaml b/applications/lofar2/libraries/ring/ring.peripheral.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a0b991efb87598f013bc1b8f1e04e2bf20fa3be8
--- /dev/null
+++ b/applications/lofar2/libraries/ring/ring.peripheral.yaml
@@ -0,0 +1,453 @@
+schema_name: args
+schema_version: 1.0
+schema_type: peripheral
+
+hdl_library_name: sdp
+hdl_library_description: "Station Digital Processor (SDP) for LOFAR2.0"
+
+peripherals:
+  - peripheral_name: sdp_info    # pi_sdp_info.py
+    peripheral_description: "SDP info."
+    mm_ports:
+      # MM port for sdp_info.vhd
+      - mm_port_name: REG_SDP_INFO
+        mm_port_type: REG
+        mm_port_span: 16 * MM_BUS_SIZE
+        mm_port_description: |
+          "The SDP info contains central SDP information. The station_id applies to the entire station.
+           The other info fields apply per antenna band (low band or high band). An FPGA node only
+           participates in one band."
+        fields:
+          - - { field_name: station_id,              mm_width: 16, access_mode: RW, address_offset: 0x2C }
+          - - { field_name: antenna_band_index,      mm_width:  1, access_mode: RO, address_offset: 0x28 }
+          - - { field_name: observation_id,          mm_width: 32, access_mode: RW, address_offset: 0x24 }
+          - - { field_name: nyquist_zone_index,      mm_width:  2, access_mode: RW, address_offset: 0x20 }
+          - - { field_name: f_adc,                   mm_width:  1, access_mode: RO, address_offset: 0x1C }
+          - - { field_name: fsub_type,               mm_width:  1, access_mode: RO, address_offset: 0x18 }
+          - - { field_name: beam_repositioning_flag, mm_width:  1, access_mode: RW, address_offset: 0x14 }
+          - - { field_name: O_si,                    mm_width:  8, access_mode: RW, address_offset: 0x10 }
+          - - { field_name: N_si,                    mm_width:  8, access_mode: RW, address_offset: 0xC  }
+          - - { field_name: O_rn,                    mm_width:  8, access_mode: RW, address_offset: 0x8  }
+          - - { field_name: N_rn,                    mm_width:  8, access_mode: RW, address_offset: 0x4  }
+          - - { field_name: block_period,            mm_width: 16, access_mode: RO, address_offset: 0x0  }
+
+
+  - peripheral_name: sdp_crosslets_subband_select    # pi_sdp_crosslets_info.py 
+    peripheral_description: "SDP crosslets info."
+    mm_ports:
+      # MM port for sdp_info.vhd
+      - mm_port_name: REG_CROSSLETS_INFO
+        mm_port_type: REG
+        mm_port_span: 16 * MM_BUS_SIZE
+        mm_port_description: |
+          "The SDP crosslets info contains the step size and 15 offsets, that are used to select a new 
+           crosslet subband for every integration interval"
+        fields:
+          - - { field_name: step, access_mode: RW, address_offset: 0x3C }
+          - - field_name: offset
+              number_of_fields: 15  
+              address_offset: 0x0
+
+
+  - peripheral_name: sdp_subband_equalizer    # pi_sdp_subband_equalizer.py
+    peripheral_description: "SDP Subband equalizer coefficients."
+    parameters:
+      # Parameters of pi_sdp_subband_equalizer.py, fixed in sdp_subband_equalizer.vhd / sdp_pkg.vhd
+      - { name: P_pfb, value: 6 }  # P_pfb = S_pn / Q_fft = 12 / 2 = 6
+      - { name: Q_fft, value: 2 }
+      - { name: N_sub, value: 512 }
+    mm_ports:
+      # MM port for sdp_subband_equalizer.vhd
+      - mm_port_name: RAM_EQUALIZER_GAINS
+        mm_port_type: RAM
+        mm_port_span: ceil_pow2(Q_fft * N_sub) * MM_BUS_SIZE
+        mm_port_description: |
+          "The subband weigths are stored in P_pfb = S_pn / Q_fft = 6 blocks of
+           Q_fft * N_sub = 2 * 512 = 1024 complex coefficients as:
+
+           (cint16)subband_weights[S_pn/Q_fft]_[Q_fft][N_sub]
+
+           where S_pn = 12, Q_fft = 2 and N_sub = 512 are defined in sdp_pkg.vhd."
+        number_of_mm_ports: P_pfb
+        fields:
+          - - field_name: coef
+              field_description: |
+                "Complex coefficient to calibrate the gain and phase per subband. Packed as imaginary in high part,
+                 real in low part of mm_width = N_complex * W_sub_weight = 2 * 16 = 32 bit."
+              number_of_fields: Q_fft * N_sub  # = 1024 = 2 signal inputs * 512 subbands
+              address_offset: 0x0
+              mm_width: 32  # = N_complex * W_sub_weight
+              radix: cint16_ir
+
+
+  - peripheral_name: sdp_bf_weights    # pi_sdp_bf_weights.py
+    peripheral_description: "SDP Beamformer weights (= beamlet weights)."
+    parameters:
+      # Parameters of pi_sdp_bf_weights.py, fixed in sdp_bf_weights.vhd / sdp_pkg.vhd
+      - { name: N_pol_bf, value: 2 }
+      - { name: P_pfb, value: 6 }  # P_pfb = S_pn / Q_fft = 12 / 2 = 6
+      - { name: Q_fft, value: 2 }
+      - { name: S_sub_bf, value: 488 }
+    mm_ports:
+      # MM port for sdp_beamformer_local.vhd / sdp_bf_weights.vhd / mms_dp_gain_serial_arr.vhd
+      - mm_port_name: RAM_BF_WEIGHTS
+        mm_port_type: RAM
+        mm_port_span: ceil_pow2(Q_fft * S_sub_bf) * MM_BUS_SIZE
+        mm_port_description: |
+          "The beamlet weigths are stored in N_pol_bf * P_pfb = 2 * 6 = 12 instances, where
+           P_pfb = S_pn / Q_fft = 6. Per instance there is a block of Q_fft * S_sub_bf =
+           2 * 488 = 976 complex BF weights. The N_pol_bf = 2 represents the two beamformer
+           polarizations, to distinguish these from the N_pol = 2 antenna polarizations. The
+           beamlet weigths for S_pn = P_pfb * Q_fft = 12 signal inputs are therefore defined by:
+
+           (cint16)bf_weights[N_pol_bf][P_pfb]_[Q_fft][S_sub_bf]
+
+           where N_pol_bf = 2, P_pfb = 6 and Q_fft = 2 and S_sub_bf = 488, defined in sdp_pkg.vhd.
+
+           The pairs of Q_fft signal inputs that are multiplexed per block are mapped to the N_pol = 2
+           polarizations of an antenna. Therefore A_pn = P_pfb = 6 is the number dual polarization
+           antennas per peripheral. The  beamlet weigths for S_pn = A_pn * N_pol = 12 signal inputs
+           are therefore defined by:
+
+           (cint16)bf_weights[N_pol_bf][A_pn]_[N_pol][S_sub_bf]
+
+           where N_pol_bf = 2, A_pn = 6 and N_pol = 2 and S_sub_bf = 488, defined in sdp_pkg.vhd.
+
+           The BF weights can implement the full 2x2 Jones matrix for weighting and adding the
+           signal input polarizations [x, y] per dual polarization antenna. The polarization index
+           mapping is index 0 = X and index 1 = Y. The co-polarization BF weights (XX, YY) are set
+           when index of N_pol_bf and index of N_pol are the same. The cross-polarization BF
+           weights (XY, YX) are set when index of N_pol_bf and index of N_pol are different. If
+           no cross-polarization weighting is needed, then these weights can be kept 0."
+        number_of_mm_ports: N_pol_bf * P_pfb  # = 12 = 2 beam polarizations * 6 complex PFB units
+        fields:
+          - - field_name: coef
+              field_description: |
+                "Complex weight per subband. Packed as imaginary in high part, real in low part
+                 of mm_width = N_complex * W_bf_weight = 2 * 16 = 32 bit."
+              number_of_fields: Q_fft * S_sub_bf  # = 976 = 2 signal inputs * 488 beamlets
+              address_offset: 0x0
+              mm_width: 32  # = N_complex * W_bf_weight
+              radix: cint16_ir
+
+
+  - peripheral_name: sdp_bf_scale    # pi_sdp_bf_scale.py
+    peripheral_description: "SDP BF beamlet data output scaling and requantization."
+    parameters:
+      # Parameters fixed in node_sdp_beamformer.vhd / mms_dp_scale.vhd / sdp_pkg.vhd
+      - { name: g_gain_w, value: 16 }
+      - { name: g_lsb_w, value: 15 }
+    mm_ports:
+      # MM port for node_sdp_beamformer.vhd / mms_dp_scale.vhd / mms_dp_gain.vhd / mms_dp_gain_arr.vhd
+      - mm_port_name: REG_BF_SCALE
+        mm_port_type: REG
+        mm_port_span: 2 * MM_BUS_SIZE
+        mm_port_description: |
+          "The beamlet scale function scales the beamlet sum with a real scale factor and then
+           requantizes the result to beamlet data output with less bits.
+           The beamlet scale factor has g_gain_w bits and the value 2**g_lsb_w represents a gain of 1.
+           For example for g_gain_w = 16, g_lsb_w = 15, a beamlet sum of 18 bits and beamlet data
+           output of 8 bits, a scale value of:
+           . 2**g_lsb_w = 2**15 selects the lowest 8 bits of the beamlet sum and clips the highest
+             10 bits,
+           . 2**11 rounds the lowest 4 bits, selects the next 8 bits of the beamlet sum and clips
+             the highest 6 bits,
+           . 2**5 rounds the lowest 10 bits and selects the highest 8 bits of the beamlet sum."
+        fields:
+          - - field_name: scale
+              field_description: ""
+              number_of_fields: 1
+              address_offset: 0x0
+              mm_width: g_gain_w
+              #user_width: g_gain_w           # EK TODO: check parameter passing to user_width
+              radix: uint32          # scale factor is unsigned value
+              resolution_w: 0 - g_lsb_w
+          - - field_name: unused
+              field_description: "Not used."
+              address_offset: 0x4
+
+
+  - peripheral_name: sdp_beamformer_output_hdr_dat  #  pi_dp_offload_tx_hdr_dat_lofar2_beamformer_output.py
+    peripheral_description: "SDP BF beamlet data output header."
+    mm_ports:
+      # MM port for sdp_beamformer_output.vhd / dp_offload_tx_v3.vhd
+      - mm_port_name: REG_DP_OFFLOAD_TX_HDR_DAT
+        mm_port_type: REG
+        mm_port_span: 64 * MM_BUS_SIZE
+        mm_port_description: |
+          "The ETH/IP/UDP/application header fields for the beamlet data output offload UDP packets.
+
+           The header fields are described in ICD STAT-CEP [1].
+
+           https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L1%20Interface%20Control%20Documents/STAT%20to%20CEP%20ICD
+
+           From tb_dp_offload_tx_v3.vhd simulation it follows that:
+           . the header fields are stored in reversed address order due to that the array in VHDL has
+             range (h downto 0) where the first header field (eth_destination_mac) is at index h.
+           . the RO fields are filled in by the logic, when the packet header is transmitted, however
+             the read value does not still represents the MM write value, not the transmitted value.
+           . dp_bsn with user_width = 64 is stored as:
+              word  byte
+              addr  addr  bits
+                0   0x0 [31:0] = dp_bsn[31:0]
+                1   0x4 [31:0] = dp_bsn[63:32]
+           . eth_dst_mac with user_width = 48 is stored as:
+              word  byte
+              addr  addr  bits
+               21   0x84 [31:0] = eth_dst_mac[31:0]
+               22   0x88 [15:0] = eth_dst_mac[47:32]
+          "
+        fields:
+          # eth field group
+          - - { field_name: eth_destination_mac,                mm_width: 32, user_width: 48, radix: uint64, access_mode: RW, address_offset: 0xA0 }
+          - - { field_name: eth_source_mac,                     mm_width: 32, user_width: 48, radix: uint64, access_mode: RO, address_offset: 0x98 }
+          - - { field_name: eth_type,                           mm_width: 16,                                access_mode: RO, address_offset: 0x94 }
+          # ip field group
+          - - { field_name: ip_version,                         mm_width:  4,                                access_mode: RW, address_offset: 0x90 }
+          - - { field_name: ip_header_length,                   mm_width:  4,                                access_mode: RW, address_offset: 0x8C }
+          - - { field_name: ip_services,                        mm_width:  8,                                access_mode: RW, address_offset: 0x88 }
+          - - { field_name: ip_total_length,                    mm_width: 16,                                access_mode: RW, address_offset: 0x84 }
+          - - { field_name: ip_identification,                  mm_width: 16,                                access_mode: RW, address_offset: 0x80 }
+          - - { field_name: ip_flags,                           mm_width:  3,                                access_mode: RW, address_offset: 0x7C }
+          - - { field_name: ip_fragment_offset,                 mm_width: 13,                                access_mode: RW, address_offset: 0x78 }
+          - - { field_name: ip_time_to_live,                    mm_width:  8,                                access_mode: RW, address_offset: 0x74 }
+          - - { field_name: ip_protocol,                        mm_width:  8,                                access_mode: RW, address_offset: 0x70 }
+          - - { field_name: ip_header_checksum,                 mm_width: 16,                                access_mode: RW, address_offset: 0x6C }
+          - - { field_name: ip_source_address,                  mm_width: 32,                                access_mode: RW, address_offset: 0x68 }
+          - - { field_name: ip_destination_address,             mm_width: 32,                                access_mode: RW, address_offset: 0x64 }
+          # udp field group
+          - - { field_name: udp_source_port,                    mm_width: 16,                                access_mode: RW, address_offset: 0x60 }
+          - - { field_name: udp_destination_port,               mm_width: 16,                                access_mode: RW, address_offset: 0x5C }
+          - - { field_name: udp_length,                         mm_width: 16,                                access_mode: RW, address_offset: 0x58 }
+          - - { field_name: udp_checksum,                       mm_width: 16,                                access_mode: RW, address_offset: 0x54 }
+          # application field group
+          - - { field_name: sdp_marker,                         mm_width:  8,                                access_mode: RO, address_offset: 0x50 }
+          - - { field_name: sdp_version_id,                     mm_width:  8,                                access_mode: RO, address_offset: 0x4C }
+          - - { field_name: sdp_observation_id,                 mm_width: 32,                                access_mode: RW, address_offset: 0x48 }
+          - - { field_name: sdp_station_id,                     mm_width: 16,                                access_mode: RW, address_offset: 0x44 }
+          - - { field_name: sdp_source_info_antenna_band_index, mm_width:  1, bit_offset: 15,                access_mode: RW, address_offset: 0x40 }
+          - - { field_name: sdp_source_info_nyquist_zone_index, mm_width:  2, bit_offset: 13,                access_mode: RW, address_offset: 0x3C }
+          - - { field_name: sdp_source_info_f_adc,              mm_width:  1, bit_offset: 12,                access_mode: RW, address_offset: 0x38 }
+          - - { field_name: sdp_source_info_fsub_type,          mm_width:  1, bit_offset: 11,                access_mode: RW, address_offset: 0x34 }
+          - - { field_name: sdp_source_info_payload_error,      mm_width:  1, bit_offset: 10,                access_mode: RW, address_offset: 0x30 }
+          - - { field_name: sdp_source_info_repositioning_flag, mm_width:  1, bit_offset:  9,                access_mode: RW, address_offset: 0x2C }
+          - - { field_name: sdp_source_info_beamlet_width,      mm_width:  3, bit_offset:  5,                access_mode: RW, address_offset: 0x28 }
+          - - { field_name: sdp_source_info_gn_index,           mm_width:  5, bit_offset:  0,                access_mode: RW, address_offset: 0x24 }
+
+          - - { field_name: sdp_reserved,                       mm_width: 32, user_width: 40, radix: uint64, access_mode: RW, address_offset: 0x1C }
+          - - { field_name: sdp_beamlet_scale,                  mm_width: 16,                                access_mode: RW, address_offset: 0x18 }
+          - - { field_name: sdp_beamlet_index,                  mm_width: 16,                                access_mode: RW, address_offset: 0x14 }
+          - - { field_name: sdp_nof_blocks_per_packet,          mm_width:  8,                                access_mode: RW, address_offset: 0x10 }
+          - - { field_name: sdp_nof_beamlets_per_block,         mm_width: 16,                                access_mode: RW, address_offset: 0xC }
+          - - { field_name: sdp_block_period,                   mm_width: 16,                                access_mode: RW, address_offset: 0x8 }
+          - - { field_name: BSN,                                mm_width: 32, user_width: 64, radix: uint64, access_mode: RW, address_offset: 0x0 }
+
+
+  - peripheral_name: sdp_statistics_offload_hdr_dat_sst  #  pi_dp_offload_tx_hdr_dat_lofar2_sdp_statistics_offload.py
+    peripheral_description: "SDP statistics offload header for the subband statistics (SST)."
+    mm_ports:
+      # MM port for sdp_statistics_offload.vhd / dp_offload_tx_v3.vhd
+      - mm_port_name: REG_DP_OFFLOAD_TX_HDR_DAT
+        mm_port_type: REG
+        mm_port_span: 64 * MM_BUS_SIZE
+        mm_port_description: |
+          "The ETH/IP/UDP/application header fields for the SST offload UDP packets.
+
+           The Subband statistics (SST) are integrated auto power values of the subbands per signal input.
+           The SST specific settings are defined by data_id_sst.
+
+           The statistics offload header fields are described in ICD SC-SDP [1].
+
+           [1] https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD
+          "
+        fields:
+          # eth field group
+          - - { field_name: word_align,                              mm_width: 16,                                access_mode: RW, address_offset: 0xAC }
+          - - { field_name: eth_destination_mac,                     mm_width: 32, user_width: 48, radix: uint64, access_mode: RW, address_offset: 0xA4 }
+          - - { field_name: eth_source_mac,                          mm_width: 32, user_width: 48, radix: uint64, access_mode: RO, address_offset: 0x9C }
+          - - { field_name: eth_type,                                mm_width: 16,                                access_mode: RO, address_offset: 0x98 }
+          # ip field group
+          - - { field_name: ip_version,                              mm_width:  4,                                access_mode: RW, address_offset: 0x94 }
+          - - { field_name: ip_header_length,                        mm_width:  4,                                access_mode: RW, address_offset: 0x90 }
+          - - { field_name: ip_services,                             mm_width:  8,                                access_mode: RW, address_offset: 0x8C }
+          - - { field_name: ip_total_length,                         mm_width: 16,                                access_mode: RW, address_offset: 0x88 }
+          - - { field_name: ip_identification,                       mm_width: 16,                                access_mode: RW, address_offset: 0x84 }
+          - - { field_name: ip_flags,                                mm_width:  3,                                access_mode: RW, address_offset: 0x80 }
+          - - { field_name: ip_fragment_offset,                      mm_width: 13,                                access_mode: RW, address_offset: 0x7C }
+          - - { field_name: ip_time_to_live,                         mm_width:  8,                                access_mode: RW, address_offset: 0x78 }
+          - - { field_name: ip_protocol,                             mm_width:  8,                                access_mode: RW, address_offset: 0x74 }
+          - - { field_name: ip_header_checksum,                      mm_width: 16,                                access_mode: RW, address_offset: 0x70 }
+          - - { field_name: ip_source_address,                       mm_width: 32,                                access_mode: RW, address_offset: 0x6C }
+          - - { field_name: ip_destination_address,                  mm_width: 32,                                access_mode: RW, address_offset: 0x68 }
+          # udp field group
+          - - { field_name: udp_source_port,                         mm_width: 16,                                access_mode: RW, address_offset: 0x64 }
+          - - { field_name: udp_destination_port,                    mm_width: 16,                                access_mode: RW, address_offset: 0x60 }
+          - - { field_name: udp_length,                              mm_width: 16,                                access_mode: RW, address_offset: 0x5C }
+          - - { field_name: udp_checksum,                            mm_width: 16,                                access_mode: RW, address_offset: 0x58 }
+          # application field group
+          - - { field_name: sdp_marker,                              mm_width:  8,                                access_mode: RO, address_offset: 0x54 }
+          - - { field_name: sdp_version_id,                          mm_width:  8,                                access_mode: RO, address_offset: 0x50 }
+          - - { field_name: sdp_observation_id,                      mm_width: 32,                                access_mode: RW, address_offset: 0x4C }
+          - - { field_name: sdp_station_id,                          mm_width: 16,                                access_mode: RW, address_offset: 0x48 }
+          - - { field_name: sdp_source_info_antenna_band_index,      mm_width:  1, bit_offset: 15,                access_mode: RW, address_offset: 0x44 }
+          - - { field_name: sdp_source_info_nyquist_zone_index,      mm_width:  2, bit_offset: 13,                access_mode: RW, address_offset: 0x40 }
+          - - { field_name: sdp_source_info_f_adc,                   mm_width:  1, bit_offset: 12,                access_mode: RW, address_offset: 0x3C }
+          - - { field_name: sdp_source_info_fsub_type,               mm_width:  1, bit_offset: 11,                access_mode: RW, address_offset: 0x38 }
+          - - { field_name: sdp_source_info_payload_error,           mm_width:  1, bit_offset: 10,                access_mode: RW, address_offset: 0x34 }
+          - - { field_name: sdp_source_info_beam_repositioning_flag, mm_width:  1, bit_offset:  9,                access_mode: RW, address_offset: 0x30 }
+          - - { field_name: sdp_source_info_subband_calibrated_flag, mm_width:  1, bit_offset:  8,                access_mode: RW, address_offset: 0x2C }
+          - - { field_name: sdp_source_info_reserved,                mm_width:  3, bit_offset:  5,                access_mode: RW, address_offset: 0x28 }
+          - - { field_name: sdp_source_info_gn_index,                mm_width:  5, bit_offset:  0,                access_mode: RW, address_offset: 0x24 }
+          - - { field_name: sdp_reserved,                            mm_width:  8,                                access_mode: RW, address_offset: 0x20 }
+          - - { field_name: sdp_integration_interval,                mm_width: 24,                                access_mode: RW, address_offset: 0x1C }
+          - - { field_name: sdp_data_id,                             mm_width: 32,                                access_mode: RW, address_offset: 0x18 }
+          - "sdp_data_id_sst":
+            - { field_name: reserved,                                mm_width: 24, bit_offset:  8,                access_mode: RW, address_offset: 0x18 }
+            - { field_name: signal_input_index,                      mm_width:  8, bit_offset:  0,                access_mode: RW, address_offset: 0x18 }
+
+          - - { field_name: sdp_nof_signal_inputs,                   mm_width:  8,                                access_mode: RW, address_offset: 0x14 }
+          - - { field_name: sdp_nof_bytes_per_statistic,             mm_width:  8,                                access_mode: RW, address_offset: 0x10 }
+          - - { field_name: sdp_nof_statistics_per_packet,           mm_width: 16,                                access_mode: RW, address_offset: 0xC }
+          - - { field_name: sdp_block_period,                        mm_width: 16,                                access_mode: RW, address_offset: 0x8 }
+          - - { field_name: BSN,                                     mm_width: 32, user_width: 64, radix: uint64, access_mode: RW, address_offset: 0x0 }
+
+
+  - peripheral_name: sdp_statistics_offload_hdr_dat_bst  #  pi_dp_offload_tx_hdr_dat_lofar2_sdp_statistics_offload.py
+    peripheral_description: "SDP statistics offload header for the beamlet statistics (BST)."
+    mm_ports:
+      # MM port for sdp_statistics_offload.vhd / dp_offload_tx_v3.vhd
+      - mm_port_name: REG_DP_OFFLOAD_TX_HDR_DAT
+        mm_port_type: REG
+        mm_port_span: 64 * MM_BUS_SIZE
+        mm_port_description: |
+          "The ETH/IP/UDP/application header fields for the BST offload UDP packets.
+
+           The beamlet statistics (BST) are integrated auto power values of the beamlets per beamset
+           The BST specific settings are defined by data_id_bst.
+
+           The statistics offload header fields are described in ICD SC-SDP [1].
+
+           [1] https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD
+          "
+        fields:
+          # eth field group
+          - - { field_name: word_align,                              mm_width: 16,                                access_mode: RW, address_offset: 0xAC }
+          - - { field_name: eth_destination_mac,                     mm_width: 32, user_width: 48, radix: uint64, access_mode: RW, address_offset: 0xA4 }
+          - - { field_name: eth_source_mac,                          mm_width: 32, user_width: 48, radix: uint64, access_mode: RO, address_offset: 0x9C }
+          - - { field_name: eth_type,                                mm_width: 16,                                access_mode: RO, address_offset: 0x98 }
+          # ip field group
+          - - { field_name: ip_version,                              mm_width:  4,                                access_mode: RW, address_offset: 0x94 }
+          - - { field_name: ip_header_length,                        mm_width:  4,                                access_mode: RW, address_offset: 0x90 }
+          - - { field_name: ip_services,                             mm_width:  8,                                access_mode: RW, address_offset: 0x8C }
+          - - { field_name: ip_total_length,                         mm_width: 16,                                access_mode: RW, address_offset: 0x88 }
+          - - { field_name: ip_identification,                       mm_width: 16,                                access_mode: RW, address_offset: 0x84 }
+          - - { field_name: ip_flags,                                mm_width:  3,                                access_mode: RW, address_offset: 0x80 }
+          - - { field_name: ip_fragment_offset,                      mm_width: 13,                                access_mode: RW, address_offset: 0x7C }
+          - - { field_name: ip_time_to_live,                         mm_width:  8,                                access_mode: RW, address_offset: 0x78 }
+          - - { field_name: ip_protocol,                             mm_width:  8,                                access_mode: RW, address_offset: 0x74 }
+          - - { field_name: ip_header_checksum,                      mm_width: 16,                                access_mode: RW, address_offset: 0x70 }
+          - - { field_name: ip_source_address,                       mm_width: 32,                                access_mode: RW, address_offset: 0x6C }
+          - - { field_name: ip_destination_address,                  mm_width: 32,                                access_mode: RW, address_offset: 0x68 }
+          # udp field group
+          - - { field_name: udp_source_port,                         mm_width: 16,                                access_mode: RW, address_offset: 0x64 }
+          - - { field_name: udp_destination_port,                    mm_width: 16,                                access_mode: RW, address_offset: 0x60 }
+          - - { field_name: udp_length,                              mm_width: 16,                                access_mode: RW, address_offset: 0x5C }
+          - - { field_name: udp_checksum,                            mm_width: 16,                                access_mode: RW, address_offset: 0x58 }
+          # application field group
+          - - { field_name: sdp_marker,                              mm_width:  8,                                access_mode: RO, address_offset: 0x54 }
+          - - { field_name: sdp_version_id,                          mm_width:  8,                                access_mode: RO, address_offset: 0x50 }
+          - - { field_name: sdp_observation_id,                      mm_width: 32,                                access_mode: RW, address_offset: 0x4C }
+          - - { field_name: sdp_station_id,                          mm_width: 16,                                access_mode: RW, address_offset: 0x48 }
+          - - { field_name: sdp_source_info_antenna_band_index,      mm_width:  1, bit_offset: 15,                access_mode: RW, address_offset: 0x44 }
+          - - { field_name: sdp_source_info_nyquist_zone_index,      mm_width:  2, bit_offset: 13,                access_mode: RW, address_offset: 0x40 }
+          - - { field_name: sdp_source_info_f_adc,                   mm_width:  1, bit_offset: 12,                access_mode: RW, address_offset: 0x3C }
+          - - { field_name: sdp_source_info_fsub_type,               mm_width:  1, bit_offset: 11,                access_mode: RW, address_offset: 0x38 }
+          - - { field_name: sdp_source_info_payload_error,           mm_width:  1, bit_offset: 10,                access_mode: RW, address_offset: 0x34 }
+          - - { field_name: sdp_source_info_beam_repositioning_flag, mm_width:  1, bit_offset:  9,                access_mode: RW, address_offset: 0x30 }
+          - - { field_name: sdp_source_info_subband_calibrated_flag, mm_width:  1, bit_offset:  8,                access_mode: RW, address_offset: 0x2C }
+          - - { field_name: sdp_source_info_reserved,                mm_width:  3, bit_offset:  5,                access_mode: RW, address_offset: 0x28 }
+          - - { field_name: sdp_source_info_gn_index,                mm_width:  5, bit_offset:  0,                access_mode: RW, address_offset: 0x24 }
+          - - { field_name: sdp_reserved,                            mm_width:  8,                                access_mode: RW, address_offset: 0x20 }
+          - - { field_name: sdp_integration_interval,                mm_width: 24,                                access_mode: RW, address_offset: 0x1C }
+          - - { field_name: sdp_data_id,                             mm_width: 32,                                access_mode: RW, address_offset: 0x18 }
+          - "sdp_data_id_bst":
+            - { field_name: reserved,                                mm_width: 16, bit_offset: 16,                access_mode: RW, address_offset: 0x18 }
+            - { field_name: beamlet_index,                           mm_width: 16, bit_offset:  0,                access_mode: RW, address_offset: 0x18 }
+
+          - - { field_name: nof_signal_inputs,                       mm_width:  8,                                access_mode: RW, address_offset: 0x14 }
+          - - { field_name: nof_bytes_per_statistic,                 mm_width:  8,                                access_mode: RW, address_offset: 0x10 }
+          - - { field_name: nof_statistics_per_packet,               mm_width: 16,                                access_mode: RW, address_offset: 0xC }
+          - - { field_name: block_period,                            mm_width: 16,                                access_mode: RW, address_offset: 0x8 }
+          - - { field_name: BSN,                                     mm_width: 32, user_width: 64, radix: uint64, access_mode: RW, address_offset: 0x0 }
+
+
+  - peripheral_name: sdp_statistics_offload_hdr_dat_xst  #  pi_dp_offload_tx_hdr_dat_lofar2_sdp_statistics_offload.py
+    peripheral_description: "SDP statistics offload header for the cross-subband statistics (XST)."
+    mm_ports:
+      # MM port for sdp_statistics_offload.vhd / dp_offload_tx_v3.vhd
+      - mm_port_name: REG_DP_OFFLOAD_TX_HDR_DAT
+        mm_port_type: REG
+        mm_port_span: 64 * MM_BUS_SIZE
+        mm_port_description: |
+          "The ETH/IP/UDP/application header fields for the XST offload UDP packets.
+
+           The crosslet statistics (XST) are integrated cross power values of the subbands from all
+           pairs of signal inputs per suband.
+           The XST specific settings are defined by data_id_xst.
+
+           The statistics offload header fields are described in ICD SC-SDP [1].
+
+           [1] https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD
+          "
+        fields:
+          # eth field group
+          - - { field_name: word_align,                              mm_width: 16,                                access_mode: RW, address_offset: 0xAC }
+          - - { field_name: eth_destination_mac,                     mm_width: 32, user_width: 48, radix: uint64, access_mode: RW, address_offset: 0xA4 }
+          - - { field_name: eth_source_mac,                          mm_width: 32, user_width: 48, radix: uint64, access_mode: RO, address_offset: 0x9C }
+          - - { field_name: eth_type,                                mm_width: 16,                                access_mode: RO, address_offset: 0x98 }
+          # ip field group
+          - - { field_name: ip_version,                              mm_width:  4,                                access_mode: RW, address_offset: 0x94 }
+          - - { field_name: ip_header_length,                        mm_width:  4,                                access_mode: RW, address_offset: 0x90 }
+          - - { field_name: ip_services,                             mm_width:  8,                                access_mode: RW, address_offset: 0x8C }
+          - - { field_name: ip_total_length,                         mm_width: 16,                                access_mode: RW, address_offset: 0x88 }
+          - - { field_name: ip_identification,                       mm_width: 16,                                access_mode: RW, address_offset: 0x84 }
+          - - { field_name: ip_flags,                                mm_width:  3,                                access_mode: RW, address_offset: 0x80 }
+          - - { field_name: ip_fragment_offset,                      mm_width: 13,                                access_mode: RW, address_offset: 0x7C }
+          - - { field_name: ip_time_to_live,                         mm_width:  8,                                access_mode: RW, address_offset: 0x78 }
+          - - { field_name: ip_protocol,                             mm_width:  8,                                access_mode: RW, address_offset: 0x74 }
+          - - { field_name: ip_header_checksum,                      mm_width: 16,                                access_mode: RW, address_offset: 0x70 }
+          - - { field_name: ip_source_address,                       mm_width: 32,                                access_mode: RW, address_offset: 0x6C }
+          - - { field_name: ip_destination_address,                  mm_width: 32,                                access_mode: RW, address_offset: 0x68 }
+          # udp field group
+          - - { field_name: udp_source_port,                         mm_width: 16,                                access_mode: RW, address_offset: 0x64 }
+          - - { field_name: udp_destination_port,                    mm_width: 16,                                access_mode: RW, address_offset: 0x60 }
+          - - { field_name: udp_length,                              mm_width: 16,                                access_mode: RW, address_offset: 0x5C }
+          - - { field_name: udp_checksum,                            mm_width: 16,                                access_mode: RW, address_offset: 0x58 }
+          # application field group
+          - - { field_name: sdp_marker,                              mm_width:  8,                                access_mode: RO, address_offset: 0x54 }
+          - - { field_name: sdp_version_id,                          mm_width:  8,                                access_mode: RO, address_offset: 0x50 }
+          - - { field_name: sdp_observation_id,                      mm_width: 32,                                access_mode: RW, address_offset: 0x4C }
+          - - { field_name: sdp_station_id,                          mm_width: 16,                                access_mode: RW, address_offset: 0x48 }
+          - - { field_name: sdp_source_info_antenna_band_index,      mm_width:  1, bit_offset: 15,                access_mode: RW, address_offset: 0x44 }
+          - - { field_name: sdp_source_info_nyquist_zone_index,      mm_width:  2, bit_offset: 13,                access_mode: RW, address_offset: 0x40 }
+          - - { field_name: sdp_source_info_f_adc,                   mm_width:  1, bit_offset: 12,                access_mode: RW, address_offset: 0x3C }
+          - - { field_name: sdp_source_info_fsub_type,               mm_width:  1, bit_offset: 11,                access_mode: RW, address_offset: 0x38 }
+          - - { field_name: sdp_source_info_payload_error,           mm_width:  1, bit_offset: 10,                access_mode: RW, address_offset: 0x34 }
+          - - { field_name: sdp_source_info_beam_repositioning_flag, mm_width:  1, bit_offset:  9,                access_mode: RW, address_offset: 0x30 }
+          - - { field_name: sdp_source_info_subband_calibrated_flag, mm_width:  1, bit_offset:  8,                access_mode: RW, address_offset: 0x2C }
+          - - { field_name: sdp_source_info_reserved,                mm_width:  3, bit_offset:  5,                access_mode: RW, address_offset: 0x28 }
+          - - { field_name: sdp_source_info_gn_index,                mm_width:  5, bit_offset:  0,                access_mode: RW, address_offset: 0x24 }
+          - - { field_name: sdp_reserved,                            mm_width:  8,                                access_mode: RW, address_offset: 0x20 }
+          - - { field_name: sdp_integration_interval,                mm_width: 24,                                access_mode: RW, address_offset: 0x1C }
+          - - { field_name: sdp_data_id,                             mm_width: 32,                                access_mode: RW, address_offset: 0x18 }
+          - "sdp_data_id_xst":
+            - { field_name: reserved,                                mm_width:  7, bit_offset: 25,                access_mode: RW, address_offset: 0x18 }
+            - { field_name: subband_index,                           mm_width:  9, bit_offset: 16,                access_mode: RW, address_offset: 0x18 }
+            - { field_name: signal_input_A_index,                    mm_width:  8, bit_offset:  8,                access_mode: RW, address_offset: 0x18 }
+            - { field_name: signal_input_B_index,                    mm_width:  8, bit_offset:  0,                access_mode: RW, address_offset: 0x18 }
+
+          - - { field_name: nof_signal_inputs,                       mm_width:  8,                                access_mode: RW, address_offset: 0x14 }
+          - - { field_name: nof_bytes_per_statistic,                 mm_width:  8,                                access_mode: RW, address_offset: 0x10 }
+          - - { field_name: nof_statistics_per_packet,               mm_width: 16,                                access_mode: RW, address_offset: 0xC }
+          - - { field_name: block_period,                            mm_width: 16,                                access_mode: RW, address_offset: 0x8 }
+          - - { field_name: BSN,                                     mm_width: 32, user_width: 64, radix: uint64, access_mode: RW, address_offset: 0x0 }