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 }