Skip to content
Snippets Groups Projects
Select Git revision
  • L2SDP-LIFT
  • L2SDP-1113
  • master default protected
  • HPR-158
4 results

sdp_pkg.vhd

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    sdp_pkg.vhd 19.77 KiB
    -------------------------------------------------------------------------------
    --
    -- Copyright 2020
    -- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
    -- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
    --
    -- Licensed under the Apache License, Version 2.0 (the "License");
    -- you may not use this file except in compliance with the License.
    -- You may obtain a copy of the License at
    --
    --     http://www.apache.org/licenses/LICENSE-2.0
    --
    -- Unless required by applicable law or agreed to in writing, software
    -- distributed under the License is distributed on an "AS IS" BASIS,
    -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -- See the License for the specific language governing permissions and
    -- limitations under the License.
    --
    -------------------------------------------------------------------------------
    
    -------------------------------------------------------------------------------
    --
    -- Author: R. van der Walle
    -- Purpose: 
    -- . This package contains sdp specific constants.
    -- Description:
    -- Remark:
    -- . See Document: L3 SDP Decision: SDP Parameter definitions.
    --   https://support.astron.nl/confluence/display/L2M/L3+SDP+Decision%3A+SDP+Parameter+definitions
    -------------------------------------------------------------------------------
    LIBRARY ieee, common_lib, rTwoSDF_lib, fft_lib, filter_lib, wpfb_lib;
    USE IEEE.std_logic_1164.ALL;
    USE common_lib.common_pkg.ALL;
    USE common_lib.common_mem_pkg.ALL;
    USE common_lib.common_field_pkg.ALL;
    USE rTwoSDF_lib.rTwoSDFPkg.ALL;
    USE fft_lib.fft_pkg.ALL; 
    USE filter_lib.fil_pkg.ALL; 
    USE wpfb_lib.wpfb_pkg.ALL;
    
    PACKAGE sdp_pkg is
      -------------------------------------------------
      -- SDP info record as defined in:
      --  LOFAR2-9258-SDP info per antenna band 
      -------------------------------------------------
      TYPE t_sdp_info IS RECORD
        station_id              : STD_LOGIC_VECTOR(15 DOWNTO 0);
        antenna_band_index      : STD_LOGIC;
        observation_id          : STD_LOGIC_VECTOR(31 DOWNTO 0); 
        nyquist_zone_index      : STD_LOGIC_VECTOR(1 DOWNTO 0);   
        f_adc                   : STD_LOGIC;     
        fsub_type               : STD_LOGIC;  
        beam_repositioning_flag : STD_LOGIC; 
        subband_calibrated_flag : STD_LOGIC; 
        O_si                    : STD_LOGIC_VECTOR(7 DOWNTO 0);    
        N_si                    : STD_LOGIC_VECTOR(7 DOWNTO 0);    
        O_rn                    : STD_LOGIC_VECTOR(7 DOWNTO 0);    
        N_rn                    : STD_LOGIC_VECTOR(7 DOWNTO 0);   
        block_period            : STD_LOGIC_VECTOR(15 DOWNTO 0);      
        beamlet_scale           : STD_LOGIC_VECTOR(15 DOWNTO 0);   
      END RECORD;   
    
      CONSTANT c_sdp_info_rst : t_sdp_info := 
          ( (OTHERS => '0'), '0', (OTHERS => '0'), (OTHERS => '0'),
            '0', '0', '0', '0',
            (OTHERS => '0'), (OTHERS => '0'), (OTHERS => '0'), (OTHERS => '0'),
            (OTHERS => '0'), (OTHERS => '0') );  
    
      -------------------------------------------------
      -- SDP specific parameters as defined in:
      --  L3 SDP Decision: SDP Parameter definitions 
      CONSTANT c_sdp_f_adc_MHz       : NATURAL := 200;
      CONSTANT c_sdp_N_beamsets      : NATURAL := 2;
      CONSTANT c_sdp_N_crosslets     : NATURAL := 1;
      CONSTANT c_sdp_N_fft           : NATURAL := 1024;
      CONSTANT c_sdp_N_pn_lb         : NATURAL := 16;
      CONSTANT c_sdp_N_pol           : NATURAL := 2;
      CONSTANT c_sdp_N_sub           : NATURAL := 512;
      CONSTANT c_sdp_N_taps          : NATURAL := 16;
      CONSTANT c_sdp_Q_fft           : NATURAL := 2;
      CONSTANT c_sdp_S_pn            : NATURAL := 12;
      CONSTANT c_sdp_S_rcu           : NATURAL := 3;
      CONSTANT c_sdp_S_sub_bf        : NATURAL := 488;
      CONSTANT c_sdp_V_sample_delay  : NATURAL := 4096;
      CONSTANT c_sdp_V_si_db         : NATURAL := 1024;
      CONSTANT c_sdp_V_si_db_large   : NATURAL := 131072;
      CONSTANT c_sdp_W_adc           : NATURAL := 14;
      CONSTANT c_sdp_W_adc_jesd      : NATURAL := 16;
      CONSTANT c_sdp_W_beamlet       : NATURAL := 8;
      CONSTANT c_sdp_W_beamlet_scale : NATURAL := 16;
      CONSTANT c_sdp_W_beamlet_sum   : NATURAL := 18;
      CONSTANT c_sdp_W_bf_magnitude  : NATURAL := 1;
      CONSTANT c_sdp_W_bf_weight     : NATURAL := 16;
      CONSTANT c_sdp_W_fir_coef      : NATURAL := 16;
      CONSTANT c_sdp_W_gn_id         : NATURAL := 5;
      CONSTANT c_sdp_W_sub_magnitude : NATURAL := 2;
      CONSTANT c_sdp_W_sub_weight    : NATURAL := 16;
      CONSTANT c_sdp_W_subband       : NATURAL := 18;
    
      -- Derived constants
      CONSTANT c_sdp_P_pfb           : NATURAL := c_sdp_S_pn / c_sdp_Q_fft;
      CONSTANT c_sdp_T_adc           : TIME    := (10**6 / c_sdp_f_adc_MHz) * 1 ps;
      CONSTANT c_sdp_T_sub           : TIME    := c_sdp_N_fft * c_sdp_T_adc;
      CONSTANT c_sdp_W_bf_fraction   : NATURAL := c_sdp_W_bf_weight - c_sdp_W_bf_magnitude -1;
      CONSTANT c_sdp_W_bf_product    : NATURAL := c_sdp_W_subband + c_sdp_W_bf_weight -1;
      CONSTANT c_sdp_W_sub_fraction  : NATURAL := c_sdp_W_sub_weight - c_sdp_W_sub_magnitude -1;
    
      -- 
      CONSTANT c_sdp_marker_sst : NATURAL := 83;  -- = 0x53 = 'S'
      CONSTANT c_sdp_marker_bst : NATURAL := 66;  -- = 0x42 = 'B'
      CONSTANT c_sdp_marker_xst : NATURAL := 88;  -- = 0x58 = 'X'
    
      -- In SDP c_nof_channels = 2**nof_chan = 1 and wb_factor = 1, 
      -- therefore these parameters are not explicitly used in calculation of derived constants
      -- LTS 2020_11_23:
      --CONSTANT c_sdp_wpfb_subbands : t_wpfb :=
      -- (1, c_sdp_N_fft, 0, c_sdp_P_pfb,
      -- c_sdp_N_taps, 1, c_sdp_W_adc, 16, c_sdp_W_fir_coef,
      -- true, false, true, 16, c_sdp_W_subband, 1, 18, 2, 
      -- true, 54, 2, 195313, c_fft_pipeline, c_fft_pipeline, 
      -- c_fil_ppf_pipeline);
      -- LTS 2021-02-03, changes based on results from u_wpfb_stage22 in tb_tb_verify_pfb_wg.vhd:
      -- . fil_backoff_w = 0 (was 1)
      -- . fil_out_dat_w = fft_in_dat_w = 17 (was 16)
      -- . g_fft_out_gain_w = 0 (was 1)
      -- . g_fft_stage_dat_w = 22 (was 18)
      -- . g_fft_guard_w = 1 (was 2)
      CONSTANT c_sdp_wpfb_subbands : t_wpfb :=
       (1, c_sdp_N_fft, 0, c_sdp_P_pfb,
       c_sdp_N_taps, 0, c_sdp_W_adc, 17, c_sdp_W_fir_coef,
       true, false, true, 17, c_sdp_W_subband, 0, 22, 1, 
       true, 54, 2, 195313, c_fft_pipeline, c_fft_pipeline, 
       c_fil_ppf_pipeline);
    
      -- JESD204
      CONSTANT c_sdp_jesd204b_freq             : STRING := "200MHz";
      CONSTANT c_sdp_jesd204b_mm_jesd_ctrl_reg : t_c_mem := (latency  => 1,
                                                             adr_w    => 1,
                                                             dat_w    => c_word_w,
                                                             nof_dat  => 1,
                                                             init_sl  => '0');
    
      -- AIT MM address widths
      CONSTANT c_sdp_jesd204b_addr_w               : NATURAL := 8 + ceil_log2(c_sdp_S_pn); 
      CONSTANT c_sdp_jesd_ctrl_addr_w              : NATURAL := 1; 
      CONSTANT c_sdp_reg_bsn_monitor_input_addr_w  : NATURAL := 8;
      CONSTANT c_sdp_reg_wg_addr_w                 : NATURAL := 2 + ceil_log2(c_sdp_S_pn);
      CONSTANT c_sdp_ram_wg_addr_w                 : NATURAL := 10 + ceil_log2(c_sdp_S_pn); 
      CONSTANT c_sdp_reg_dp_shiftram_addr_w        : NATURAL := 1 + ceil_log2(c_sdp_S_pn); 
      CONSTANT c_sdp_reg_bsn_source_v2_addr_w      : NATURAL := 3;
      CONSTANT c_sdp_reg_bsn_scheduler_addr_w      : NATURAL := 1;
      CONSTANT c_sdp_ram_diag_data_buf_bsn_addr_w  : NATURAL := ceil_log2(c_sdp_S_pn*c_sdp_V_si_db_large); -- Dimension DB address range for largest DB, so that both the large and the default small DB fit.
      CONSTANT c_sdp_reg_diag_data_buf_bsn_addr_w  : NATURAL := 1 + ceil_log2(c_sdp_S_pn);  
      CONSTANT c_sdp_reg_aduh_monitor_addr_w       : NATURAL := 2 + ceil_log2(c_sdp_S_pn);
    
      -- FSUB MM address widths
      CONSTANT c_sdp_ram_fil_coefs_addr_w       : NATURAL := ceil_log2(c_sdp_N_fft * c_sdp_N_taps);
      CONSTANT c_sdp_ram_st_sst_addr_w          : NATURAL := ceil_log2(c_sdp_P_pfb*c_sdp_N_sub*c_sdp_Q_fft*c_sdp_wpfb_subbands.stat_data_sz);
      CONSTANT c_sdp_reg_si_addr_w              : NATURAL := 1; --enable/disable
      CONSTANT c_sdp_ram_equalizer_gains_addr_w : NATURAL := ceil_log2(c_sdp_P_pfb*c_sdp_N_sub*c_sdp_Q_fft);
      CONSTANT c_sdp_reg_dp_selector_addr_w     : NATURAL := 1; --Select input 0 or 1.
    
      -- BF MM address widths
      CONSTANT c_sdp_reg_sdp_info_addr_w        : NATURAL := 4;  
      CONSTANT c_sdp_ram_ss_ss_wide_addr_w      : NATURAL := ceil_log2(c_sdp_N_beamsets) + ceil_log2(c_sdp_P_pfb * c_sdp_S_sub_bf * c_sdp_Q_fft);
      CONSTANT c_sdp_ram_bf_weights_addr_w      : NATURAL := ceil_log2(c_sdp_N_beamsets) + ceil_log2(c_sdp_N_pol * c_sdp_P_pfb * c_sdp_S_sub_bf * c_sdp_Q_fft);
      CONSTANT c_sdp_reg_bf_scale_addr_w        : NATURAL := ceil_log2(c_sdp_N_beamsets) + 1;  
      CONSTANT c_sdp_reg_dp_xonoff_addr_w       : NATURAL := ceil_log2(c_sdp_N_beamsets) + 1;
      CONSTANT c_sdp_ram_st_bst_addr_w          : NATURAL := ceil_log2(c_sdp_N_beamsets) + ceil_log2(c_sdp_S_sub_bf*c_sdp_N_pol*(c_longword_sz/c_word_sz));
    
      -- SST UDP offload MM address widths
      CONSTANT c_sdp_reg_stat_enable_addr_w     :NATURAL  := 1;  
    
      -- XSUB
      CONSTANT c_sdp_crosslets_index_w : NATURAL := ceil_log2(c_sdp_N_sub);
      CONSTANT c_sdp_mm_reg_crosslets_info : t_c_mem := (latency  => 1,
                                                         adr_w    => 4,
                                                         dat_w    => c_sdp_crosslets_index_w,  
                                                         nof_dat  => 16,        -- 15 offsets + 1 step
                                                         init_sl  => '0');
      CONSTANT c_sdp_crosslets_info_reg_w : NATURAL := c_sdp_mm_reg_crosslets_info.nof_dat*c_sdp_mm_reg_crosslets_info.dat_w;
    
    
      -- 10GbE offload (cep = central processor)
      CONSTANT c_sdp_cep_eth_src_mac_47_16 : STD_LOGIC_VECTOR(31 DOWNTO 0) := x"00228608";  -- 47:16, 15:8 = backplane, 7:0 = node
      CONSTANT c_sdp_cep_ip_src_addr_31_16 : STD_LOGIC_VECTOR(15 DOWNTO 0) := x"C0A8";      -- 31:16, 15:8 = backplane, 7:0 = node + 1 = 192.168.xx.yy
      CONSTANT c_sdp_cep_udp_src_port_15_8 : STD_LOGIC_VECTOR(7 DOWNTO 0)  := x"D0";        -- 15:8, 7:0 = gn_id (= ID[7:0] = backplane[5:0] & node[1:0])
    
      CONSTANT c_sdp_cep_nof_blocks_per_packet  : NATURAL := 4;
      CONSTANT c_sdp_cep_nof_beamlets_per_block : NATURAL := c_sdp_N_pol * c_sdp_S_sub_bf; 
      CONSTANT c_sdp_cep_nof_hdr_fields : NATURAL := 3+12+4+18+1; -- 592b; 9.25 64b words
      CONSTANT c_sdp_cep_hdr_field_sel  : STD_LOGIC_VECTOR(c_sdp_cep_nof_hdr_fields-1 DOWNTO 0) := "101"&"111111111001"&"0111"&"110000000010000110"&"0";
    
      CONSTANT c_sdp_cep_hdr_field_arr : t_common_field_arr(c_sdp_cep_nof_hdr_fields-1 DOWNTO 0) := ( 
          ( field_name_pad("eth_dst_mac"                        ), "RW", 48, field_default(x"00074306C700") ), -- 00074306C700=DOP36-eth0 
          ( field_name_pad("eth_src_mac"                        ), "RW", 48, field_default(0) ),
          ( field_name_pad("eth_type"                           ), "RW", 16, field_default(x"0800") ),
          ( field_name_pad("ip_version"                         ), "RW",  4, field_default(4) ),
          ( field_name_pad("ip_header_length"                   ), "RW",  4, field_default(5) ),
          ( field_name_pad("ip_services"                        ), "RW",  8, field_default(0) ),
          ( field_name_pad("ip_total_length"                    ), "RW", 16, field_default(7868) ), 
          ( field_name_pad("ip_identification"                  ), "RW", 16, field_default(0) ),
          ( field_name_pad("ip_flags"                           ), "RW",  3, field_default(2) ),
          ( field_name_pad("ip_fragment_offset"                 ), "RW", 13, field_default(0) ),
          ( field_name_pad("ip_time_to_live"                    ), "RW",  8, field_default(127) ),
          ( field_name_pad("ip_protocol"                        ), "RW",  8, field_default(17) ),
          ( field_name_pad("ip_header_checksum"                 ), "RW", 16, field_default(0) ),
          ( field_name_pad("ip_src_addr"                        ), "RW", 32, field_default(0) ),
          ( field_name_pad("ip_dst_addr"                        ), "RW", 32, field_default(x"C0A80001") ), -- C0A80001=DOP36-eth0 '192.168.0.1'
          ( field_name_pad("udp_src_port"                       ), "RW", 16, field_default(0) ), 
          ( field_name_pad("udp_dst_port"                       ), "RW", 16, field_default(5000) ), 
          ( field_name_pad("udp_total_length"                   ), "RW", 16, field_default(7848) ), 
          ( field_name_pad("udp_checksum"                       ), "RW", 16, field_default(0) ),
          ( field_name_pad("sdp_marker"                         ), "RW",  8, field_default(x"62") ),
          ( field_name_pad("sdp_version_id"                     ), "RW",  8, field_default(5) ),
          ( field_name_pad("sdp_observation_id"                 ), "RW", 32, field_default(0) ),
          ( field_name_pad("sdp_station_id"                     ), "RW", 16, field_default(0) ),
          ( field_name_pad("sdp_source_info_antenna_band_id"    ), "RW",  1, field_default(0) ),
          ( field_name_pad("sdp_source_info_nyquist_zone_id"    ), "RW",  2, field_default(0) ),
          ( field_name_pad("sdp_source_info_f_adc"              ), "RW",  1, field_default(0) ),
          ( field_name_pad("sdp_source_info_fsub_type"          ), "RW",  1, field_default(0) ),
          ( field_name_pad("sdp_source_info_payload_error"      ), "RW",  1, field_default(0) ),
          ( field_name_pad("sdp_source_info_repositioning_flag" ), "RW",  1, field_default(0) ),
          ( field_name_pad("sdp_source_info_beamlet_width"      ), "RW",  4, field_default(c_sdp_W_beamlet) ),
          ( field_name_pad("sdp_source_info_gn_id"              ), "RW",  5, field_default(0) ),
          ( field_name_pad("sdp_reserved"                       ), "RW", 40, field_default(0) ),
          ( field_name_pad("sdp_beamlet_scale"                  ), "RW", 16, field_default(2**15) ),
          ( field_name_pad("sdp_beamlet_id"                     ), "RW", 16, field_default(0) ),
          ( field_name_pad("sdp_nof_blocks_per_packet"          ), "RW",  8, field_default(c_sdp_cep_nof_blocks_per_packet) ),
          ( field_name_pad("sdp_nof_beamlets_per_block"         ), "RW", 16, field_default(c_sdp_cep_nof_beamlets_per_block) ),
          ( field_name_pad("sdp_block_period"                   ), "RW", 16, field_default(5120) ),
          ( field_name_pad("dp_bsn"                             ), "RW", 64, field_default(0) ) 
      );
    
      -- 10GbE MM address widths
      CONSTANT c_sdp_reg_hdr_dat_addr_w         : NATURAL := ceil_log2(c_sdp_N_beamsets) + ceil_log2(field_nof_words(c_sdp_cep_hdr_field_arr, c_word_w));
      CONSTANT c_sdp_reg_nw_10GbE_mac_addr_w    : NATURAL := 13;
      CONSTANT c_sdp_reg_nw_10GbE_eth10g_addr_w : NATURAL := 1;
    
      -- statistics offload
      -- The statistics offload uses the same 1GbE port as the NiosII for M&C. The 1GbE addresses defined in SW and here in FW.
      -- See NiosII code:
      --   https://git.astron.nl/desp/hdl/-/blob/master/libraries/unb_osy/unbos_eth.h
      --   https://git.astron.nl/desp/hdl/-/blob/master/libraries/unb_osy/unbos_eth.c
      -- and g_base_ip = x"0A63" in:
      --   https://git.astron.nl/desp/hdl/-/blob/master/boards/uniboard2b/libraries/unb2b_board/src/vhdl/ctrl_unb2b_board.vhd
    
      CONSTANT c_sdp_stat_eth_src_mac_47_16 : STD_LOGIC_VECTOR(31 DOWNTO 0) := x"00228608";  -- 00:22:86:08:pp:qq
      CONSTANT c_sdp_stat_ip_src_addr_31_16 : STD_LOGIC_VECTOR(15 DOWNTO 0) := x"0A63";    -- 10.99.xx.yy
      CONSTANT c_sdp_sst_udp_src_port_15_8  : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"D0";  -- TBC
      CONSTANT c_sdp_bst_udp_src_port_15_8  : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"D1";  -- TBC
      CONSTANT c_sdp_xst_udp_src_port_15_8  : STD_LOGIC_VECTOR(7 DOWNTO 0) := x"D2";  -- TBC
    
      CONSTANT c_sdp_stat_nof_hdr_fields : NATURAL := 1+3+12+4+20+1; -- 592b; 18.5 32b words
      CONSTANT c_sdp_stat_hdr_field_sel  : STD_LOGIC_VECTOR(c_sdp_stat_nof_hdr_fields-1 DOWNTO 0) := "1"&"101"&"111111111101"&"0111"&"01000000000000000100"&"0";  -- 0=data path, 1=MM controlled TODO
    
      CONSTANT c_sdp_stat_hdr_field_arr : t_common_field_arr(c_sdp_stat_nof_hdr_fields-1 DOWNTO 0) := (
          ( field_name_pad("word_align"                              ), "RW", 16, field_default(0) ),
          ( field_name_pad("eth_dst_mac"                             ), "RW", 48, field_default(x"001B217176B9") ), -- 001B217176B9 = DOP36-enp2s0 
          ( field_name_pad("eth_src_mac"                             ), "RW", 48, field_default(0) ),
          ( field_name_pad("eth_type"                                ), "RW", 16, field_default(x"0800") ),
          ( field_name_pad("ip_version"                              ), "RW",  4, field_default(4) ),
          ( field_name_pad("ip_header_length"                        ), "RW",  4, field_default(5) ),
          ( field_name_pad("ip_services"                             ), "RW",  8, field_default(0) ),
          ( field_name_pad("ip_total_length"                         ), "RW", 16, field_default(4156) ), 
          ( field_name_pad("ip_identification"                       ), "RW", 16, field_default(0) ),
          ( field_name_pad("ip_flags"                                ), "RW",  3, field_default(2) ),
          ( field_name_pad("ip_fragment_offset"                      ), "RW", 13, field_default(0) ),
          ( field_name_pad("ip_time_to_live"                         ), "RW",  8, field_default(127) ),
          ( field_name_pad("ip_protocol"                             ), "RW",  8, field_default(17) ),
          ( field_name_pad("ip_header_checksum"                      ), "RW", 16, field_default(0) ),
          ( field_name_pad("ip_src_addr"                             ), "RW", 32, field_default(0) ),
          ( field_name_pad("ip_dst_addr"                             ), "RW", 32, field_default(x"0A6300FE") ), -- 0A6300FE = DOP36-enp2s0 '10.99.0.254'
          ( field_name_pad("udp_src_port"                            ), "RW", 16, field_default(0) ), 
          ( field_name_pad("udp_dst_port"                            ), "RW", 16, field_default(5001) ), 
          ( field_name_pad("udp_total_length"                        ), "RW", 16, field_default(4136) ), 
          ( field_name_pad("udp_checksum"                            ), "RW", 16, field_default(0) ),
          ( field_name_pad("sdp_marker"                              ), "RW",  8, field_default(0) ),
          ( field_name_pad("sdp_version_id"                          ), "RW",  8, field_default(5) ),
          ( field_name_pad("sdp_observation_id"                      ), "RW", 32, field_default(0) ),
          ( field_name_pad("sdp_station_id"                          ), "RW", 16, field_default(0) ),
          ( field_name_pad("sdp_source_info_antenna_band_id"         ), "RW",  1, field_default(0) ),
          ( field_name_pad("sdp_source_info_nyquist_zone_id"         ), "RW",  2, field_default(0) ),
          ( field_name_pad("sdp_source_info_f_adc"                   ), "RW",  1, field_default(0) ),
          ( field_name_pad("sdp_source_info_fsub_type"               ), "RW",  1, field_default(0) ),
          ( field_name_pad("sdp_source_info_payload_error"           ), "RW",  1, field_default(0) ),
          ( field_name_pad("sdp_source_info_beam_repositioning_flag" ), "RW",  1, field_default(0) ),
          ( field_name_pad("sdp_source_info_subband_calibrated_flag" ), "RW",  1, field_default(0) ),
          ( field_name_pad("sdp_source_info_reserved"                ), "RW",  3, field_default(0) ),
          ( field_name_pad("sdp_source_info_gn_id"                   ), "RW",  5, field_default(0) ),
          ( field_name_pad("sdp_reserved"                            ), "RW",  8, field_default(0) ),
          ( field_name_pad("sdp_integration_interval"                ), "RW", 24, field_default(0) ),
          ( field_name_pad("sdp_data_id"                             ), "RW", 32, field_default(0) ),
          ( field_name_pad("sdp_nof_signal_inputs"                   ), "RW",  8, field_default(0) ),
          ( field_name_pad("sdp_nof_bytes_per_statistics"            ), "RW",  8, field_default(8) ),
          ( field_name_pad("sdp_nof_statistics_per_packet"           ), "RW", 16, field_default(0) ),
          ( field_name_pad("sdp_block_period"                        ), "RW", 16, field_default(0) ),
          ( field_name_pad("dp_bsn"                                  ), "RW", 64, field_default(0) )
      );
      CONSTANT c_sdp_reg_stat_hdr_dat_addr_w         : NATURAL := ceil_log2(field_nof_words(c_sdp_stat_hdr_field_arr, c_word_w));
    
    
    END PACKAGE sdp_pkg;
    
    PACKAGE BODY sdp_pkg IS
    
      
    END sdp_pkg;