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