From 3b5c252dcc0e692991c205041b76c3dc6d202746 Mon Sep 17 00:00:00 2001 From: Eric Kooistra <kooistra@astron.nl> Date: Mon, 29 Nov 2021 11:32:06 +0100 Subject: [PATCH] Define sdp_nof_bytes_per_statistic (without s) via data path in c_sdp_stat_hdr_field_sel. --- .../lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd | 47 +++++++++++++++---- .../sdp/src/vhdl/sdp_statistics_offload.vhd | 25 +++++----- .../libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd | 2 +- 3 files changed, 54 insertions(+), 20 deletions(-) diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd index a37c388d40..411e19c0f3 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd @@ -164,8 +164,9 @@ PACKAGE sdp_pkg is CONSTANT c_sdp_offload_time : NATURAL := 600000; -- L2SDP-452 -- packet lengths, see ICD SC-SDP - CONSTANT c_sdp_stat_data_sz : NATURAL := 2; -- = 2 words = 64 bit data (= c_sdp_wpfb_subbands.stat_data_sz) - CONSTANT c_sdp_stat_data_byte_sz : NATURAL := c_sdp_stat_data_sz * c_word_sz; -- = 8 bytes = 64 bit data + CONSTANT c_sdp_stat_data_sz : NATURAL := 2; -- = 2 words = 64 bit data (= c_sdp_wpfb_subbands.stat_data_sz) + CONSTANT c_sdp_stat_data_byte_sz : NATURAL := c_sdp_stat_data_sz * c_word_sz; -- = 8 bytes = 64 bit data + CONSTANT c_sdp_nof_bytes_per_statistic : NATURAL := 8; CONSTANT c_sdp_stat_app_header_len : NATURAL := 32; @@ -193,7 +194,7 @@ PACKAGE sdp_pkg is CONSTANT c_sdp_stat_version_id : NATURAL := 5; CONSTANT c_sdp_stat_nof_hdr_fields : NATURAL := 1+3+12+4+20+1; -- 608b; 19 32b words - CONSTANT c_sdp_stat_hdr_field_sel : STD_LOGIC_VECTOR(c_sdp_stat_nof_hdr_fields-1 DOWNTO 0) := "1"&"101"&"111011111001"&"0100"&"0100"&"000000010"&"1000100"&"0"; -- 0=data path, 1=MM controlled + CONSTANT c_sdp_stat_hdr_field_sel : STD_LOGIC_VECTOR(c_sdp_stat_nof_hdr_fields-1 DOWNTO 0) := "1"&"101"&"111011111001"&"0100"&"0100"&"000000010"&"1000000"&"0"; -- 0=data path, 1=MM controlled --CONSTANT c_sdp_stat_hdr_field_sel : STD_LOGIC_VECTOR(c_sdp_stat_nof_hdr_fields-1 DOWNTO 0) := "1"&"101"&"111011111001"&"0101"&"0100"&"000000000"&"0000100"&"0"; -- 0=data path, 1=MM controlled TODO (26 nov 2021) --CONSTANT c_sdp_stat_hdr_field_sel : STD_LOGIC_VECTOR(c_sdp_stat_nof_hdr_fields-1 DOWNTO 0) := "0"&"100"&"000000010001"&"0100"&"0100"&"000000010"&"1000000"&"0"; -- 0=data path, 1=MM controlled TODO @@ -240,7 +241,7 @@ PACKAGE sdp_pkg is ( 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_bytes_per_statistic" ), "RW", 8, field_default(c_sdp_nof_bytes_per_statistic) ), ( field_name_pad("sdp_nof_statistics_per_packet" ), "RW", 16, field_default(0) ), ( field_name_pad("sdp_block_period" ), "RW", 16, field_default(c_sdp_block_period) ), @@ -273,7 +274,7 @@ PACKAGE sdp_pkg is sdp_data_id_xst_signal_input_A_index : STD_LOGIC_VECTOR(15 DOWNTO 8); -- sdp_data_id sub field sdp_data_id_xst_signal_input_B_index : STD_LOGIC_VECTOR( 7 DOWNTO 0); -- sdp_data_id sub field sdp_nof_signal_inputs : STD_LOGIC_VECTOR( 7 DOWNTO 0); - sdp_nof_bytes_per_statistics : STD_LOGIC_VECTOR( 7 DOWNTO 0); + sdp_nof_bytes_per_statistic : STD_LOGIC_VECTOR( 7 DOWNTO 0); sdp_nof_statistics_per_packet : STD_LOGIC_VECTOR(15 DOWNTO 0); sdp_block_period : STD_LOGIC_VECTOR(15 DOWNTO 0); @@ -447,13 +448,22 @@ PACKAGE sdp_pkg is CONSTANT c_sdp_reg_stat_hdr_dat_bst_addr_w: NATURAL := ceil_log2(c_sdp_N_beamsets) + c_sdp_reg_stat_hdr_dat_addr_w; -- XSUB - CONSTANT c_sdp_crosslets_index_w : NATURAL := ceil_log2(c_sdp_N_sub); + 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; + CONSTANT c_sdp_crosslets_info_reg_w : NATURAL := c_sdp_mm_reg_crosslets_info.nof_dat*c_sdp_mm_reg_crosslets_info.dat_w; + CONSTANT c_sdp_crosslets_info_nof_offsets : NATURAL := c_sdp_mm_reg_crosslets_info.nof_dat - 1; + + TYPE t_sdp_crosslets_info IS RECORD + offset_arr : t_natural_arr(0 TO c_sdp_crosslets_info_nof_offsets-1); + step : NATURAL; + END RECORD; + + FUNCTION func_extract_crosslets_info(info_slv : STD_LOGIC_VECTOR) RETURN t_sdp_crosslets_info; + FUNCTION func_construct_crosslets_info(info_rec : t_sdp_crosslets_info) RETURN STD_LOGIC_VECTOR; CONSTANT c_sdp_mm_reg_nof_crosslets : t_c_mem := (latency => 1, adr_w => 1, @@ -618,7 +628,7 @@ PACKAGE BODY sdp_pkg IS v.app.sdp_data_id_xst_signal_input_A_index := v.app.sdp_data_id(15 DOWNTO 8); v.app.sdp_data_id_xst_signal_input_B_index := v.app.sdp_data_id( 7 DOWNTO 0); v.app.sdp_nof_signal_inputs := hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_signal_inputs") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_signal_inputs")); - v.app.sdp_nof_bytes_per_statistics := hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_bytes_per_statistics") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_bytes_per_statistics")); + v.app.sdp_nof_bytes_per_statistic := hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_bytes_per_statistic") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_bytes_per_statistic")); v.app.sdp_nof_statistics_per_packet := hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_packet") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_packet")); v.app.sdp_block_period := hdr_fields_raw(field_hi(c_sdp_stat_hdr_field_arr, "sdp_block_period") DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_block_period")); @@ -681,4 +691,25 @@ PACKAGE BODY sdp_pkg IS RETURN v; END sdp_extract_cep_header; + + FUNCTION func_extract_crosslets_info(info_slv : STD_LOGIC_VECTOR) RETURN t_sdp_crosslets_info IS + VARIABLE v_info : t_sdp_crosslets_info; + BEGIN + FOR I IN 0 TO c_sdp_crosslets_info_nof_offsets-1 LOOP + v_info.offset_arr(I) := TO_UINT(info_slv((I+1)*c_sdp_crosslets_index_w-1 DOWNTO I*c_sdp_crosslets_index_w)); + END LOOP; + v_info.step := TO_UINT(info_slv(c_sdp_crosslets_info_reg_w-1 DOWNTO c_sdp_crosslets_info_reg_w - c_sdp_crosslets_index_w)); + RETURN v_info; + END func_extract_crosslets_info; + + FUNCTION func_construct_crosslets_info(info_rec : t_sdp_crosslets_info) RETURN STD_LOGIC_VECTOR IS + VARIABLE v_info : STD_LOGIC_VECTOR(c_sdp_crosslets_info_reg_w-1 DOWNTO 0); + BEGIN + FOR I IN 0 TO c_sdp_crosslets_info_nof_offsets-1 LOOP + v_info((I+1)*c_sdp_crosslets_index_w-1 DOWNTO I*c_sdp_crosslets_index_w) := TO_UVEC(info_rec.offset_arr(I), c_sdp_crosslets_index_w); + END LOOP; + v_info(c_sdp_crosslets_info_reg_w-1 DOWNTO c_sdp_crosslets_info_reg_w - c_sdp_crosslets_index_w) := TO_UVEC(info_rec.step, c_sdp_crosslets_index_w); + RETURN v_info; + END func_construct_crosslets_info; + END sdp_pkg; diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd index 93007e6438..e794ec2b90 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_statistics_offload.vhd @@ -57,33 +57,34 @@ ENTITY sdp_statistics_offload IS dp_rst : IN STD_LOGIC; -- Memory access to statistics values - master_mosi : OUT t_mem_mosi; -- := c_mem_mosi_rst; - master_miso : IN t_mem_miso; + master_mosi : OUT t_mem_mosi; -- := c_mem_mosi_rst; + master_miso : IN t_mem_miso; -- Memory access to read/write settings - reg_enable_mosi : IN t_mem_mosi := c_mem_mosi_rst; - reg_enable_miso : OUT t_mem_miso; + reg_enable_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_enable_miso : OUT t_mem_miso; reg_hdr_dat_mosi : IN t_mem_mosi := c_mem_mosi_rst; reg_hdr_dat_miso : OUT t_mem_miso; -- Input timing regarding the integration interval of the statistics - in_sosi : IN t_dp_sosi; + in_sosi : IN t_dp_sosi; -- Streaming output of offloaded statistics packets - out_sosi : OUT t_dp_sosi; - out_siso : IN t_dp_siso; + out_sosi : OUT t_dp_sosi; + out_siso : IN t_dp_siso; -- inputs from other blocks eth_src_mac : IN STD_LOGIC_VECTOR(c_network_eth_mac_addr_w-1 DOWNTO 0); udp_src_port : IN STD_LOGIC_VECTOR(c_network_udp_port_w-1 DOWNTO 0); ip_src_addr : IN STD_LOGIC_VECTOR(c_network_ip_addr_w-1 DOWNTO 0); + + gn_index : IN NATURAL; + sdp_info : IN t_sdp_info; subband_calibrated_flag : IN STD_LOGIC := '0'; nof_crosslets : IN STD_LOGIC_VECTOR(c_sdp_nof_crosslets_reg_w-1 DOWNTO 0) := (OTHERS => '0'); - crosslets_info : IN STD_LOGIC_VECTOR(c_sdp_crosslets_info_reg_w-1 DOWNTO 0) := (OTHERS => '0'); - - gn_index : IN NATURAL + crosslets_info : IN STD_LOGIC_VECTOR(c_sdp_crosslets_info_reg_w-1 DOWNTO 0) := (OTHERS => '0') ); END sdp_statistics_offload; @@ -160,7 +161,7 @@ BEGIN ------------------------------------------------------------------------------- -- Assemble offload header info, for data path fields that are selected by: - -- c_sdp_stat_hdr_field_sel = "1"&"101"&"111011111001"&"0100"&"0100"&"000000010"&"1000100"&"0" + -- c_sdp_stat_hdr_field_sel = "1"&"101"&"111011111001"&"0100"&"0100"&"000000010"&"1000000"&"0" -- eth ip udp app -- where 0 = data path, 1 = MM controlled. The '0' fields are assigned here in dp_header_info -- in order: @@ -182,6 +183,7 @@ BEGIN -- sdp_source_info_subband_calibrated_flag, -- sdp_source_info_gn_id, -- - sdp_integration_interval, sdp_data_id, sdp_nof_signal_inputs, + -- sdp_nof_bytes_per_statistic, -- sdp_nof_statistics_per_packet, sdp_block_period -- - dp_bsn ------------------------------------------------------------------------------- @@ -204,6 +206,7 @@ BEGIN dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_integration_interval" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_integration_interval" )) <= TO_UVEC(r.integration_interval, 24); dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_data_id" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_data_id" )) <= r.data_id; dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_signal_inputs" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_signal_inputs" )) <= TO_UVEC(c_nof_signal_inputs, 8); + dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_bytes_per_statistic" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_bytes_per_statistic" )) <= TO_UVEC(c_sdp_nof_bytes_per_statistic, 8); dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_packet" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_nof_statistics_per_packet" )) <= TO_UVEC(c_nof_statistics_per_packet, 16); dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "sdp_block_period" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "sdp_block_period" )) <= sdp_info.block_period; dp_header_info(field_hi(c_sdp_stat_hdr_field_arr, "dp_bsn" ) DOWNTO field_lo(c_sdp_stat_hdr_field_arr, "dp_bsn" )) <= bsn_at_sync; diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd index 7ed15b4d02..cfdb39d357 100644 --- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd +++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd @@ -107,7 +107,7 @@ PACKAGE BODY tb_sdp_pkg IS END IF; ASSERT in_hdr.app.sdp_nof_signal_inputs = exp_hdr.app.sdp_nof_signal_inputs REPORT "Wrong " & g_statistics_type & " app.sdp_nof_signal_inputs" SEVERITY ERROR; - ASSERT in_hdr.app.sdp_nof_bytes_per_statistics = exp_hdr.app.sdp_nof_bytes_per_statistics REPORT "Wrong " & g_statistics_type & " app.sdp_nof_bytes_per_statistics" SEVERITY ERROR; + ASSERT in_hdr.app.sdp_nof_bytes_per_statistic = exp_hdr.app.sdp_nof_bytes_per_statistic REPORT "Wrong " & g_statistics_type & " app.sdp_nof_bytes_per_statistic" SEVERITY ERROR; ASSERT in_hdr.app.sdp_nof_statistics_per_packet = exp_hdr.app.sdp_nof_statistics_per_packet REPORT "Wrong " & g_statistics_type & " app.sdp_nof_statistics_per_packet" SEVERITY ERROR; ASSERT in_hdr.app.sdp_block_period = sdp_info.block_period REPORT "Wrong " & g_statistics_type & " app.sdp_block_period" SEVERITY ERROR; -- GitLab