From 4c1aeea554b567b3ec26dbfdd0f66bd1ce9734d5 Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Mon, 3 Oct 2022 17:20:43 +0200
Subject: [PATCH] Verify BST offload header.

---
 ...ofar2_unb2c_sdp_station_bf_bst_offload.vhd | 82 ++++++++++++++++---
 1 file changed, 72 insertions(+), 10 deletions(-)

diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf_bst_offload.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf_bst_offload.vhd
index 270ce27dea..063a41982b 100644
--- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf_bst_offload.vhd
+++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf_bst_offload.vhd
@@ -35,7 +35,7 @@
 --   > as 7    # default
 --   > as 12   # for detailed debugging
 --   > run -a  
---   Takes about 10 m
+--   Takes about 20 m
 --
 -------------------------------------------------------------------------------
 LIBRARY IEEE, common_lib, unb2c_board_lib, i2c_lib, mm_lib, dp_lib, diag_lib, lofar2_sdp_lib, wpfb_lib, lofar2_unb2c_sdp_station_lib, eth_lib;
@@ -52,6 +52,7 @@ USE mm_lib.mm_file_unb_pkg.ALL;
 USE diag_lib.diag_pkg.ALL;
 USE wpfb_lib.wpfb_pkg.ALL;
 USE lofar2_sdp_lib.sdp_pkg.ALL;
+USE lofar2_sdp_lib.tb_sdp_pkg.ALL;
 
 ENTITY tb_lofar2_unb2c_sdp_station_bf_bst_offload IS
 END tb_lofar2_unb2c_sdp_station_bf_bst_offload;
@@ -60,13 +61,15 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_bst_offload IS
 
   CONSTANT c_sim             : BOOLEAN := TRUE;
   CONSTANT c_unb_nr          : NATURAL := 0; -- UniBoard 0
-  CONSTANT c_node_nr         : NATURAL := 0; 
-  CONSTANT c_id              : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000";
+  CONSTANT c_node_nr         : NATURAL := 0;
+  CONSTANT c_gn_nr           : NATURAL := c_unb_nr*4 + c_node_nr;
+  CONSTANT c_id              : STD_LOGIC_VECTOR(7 DOWNTO 0) := TO_UVEC(c_gn_nr, 8);
   CONSTANT c_version         : STD_LOGIC_VECTOR(1 DOWNTO 0) := "00";
   CONSTANT c_fw_version      : t_unb2c_board_fw_version := (1, 0);
 
   CONSTANT c_eth_clk_period      : TIME := 8 ns;  -- 125 MHz XO on UniBoard
   CONSTANT c_ext_clk_period      : TIME := 5 ns;
+  CONSTANT c_mm_clk_period       : TIME := 10 ns;  -- 100 MHz internal mm_clk
   CONSTANT c_bck_ref_clk_period  : TIME := 5 ns;
 
   CONSTANT c_tb_clk_period       : TIME := 100 ps; -- use fast tb_clk to speed up M&C
@@ -77,9 +80,25 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_bst_offload IS
   CONSTANT c_wpfb_sim            : t_wpfb := func_wpfb_set_nof_block_per_sync(c_sdp_wpfb_subbands, c_nof_block_per_sync);
   CONSTANT c_nof_sync            : NATURAL := 1;
 
-  -- MM  
-  CONSTANT c_mm_file_reg_bsn_source_v2   : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_SOURCE_V2";
-  CONSTANT c_mm_file_reg_stat_enable_bst : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_STAT_ENABLE_BST";
+  -- header fields
+  CONSTANT c_exp_beamlet_index   : NATURAL := 0;  -- depends on beamset bset * c_sdp_S_sub_bf
+
+  CONSTANT c_exp_sdp_info        : t_sdp_info := (
+                                     TO_UVEC(601, 16),   -- station_id
+                                     '0',                -- antenna_band_index
+                                     x"7FFFFFFF",        -- observation_id, use > 0 to avoid Warning: (vsim-151) NUMERIC_STD.TO_INTEGER: Value -2 is not in bounds of subtype NATURAL.
+                                     b"01",              -- nyquist_zone_index, 0 = first, 1 = second, 2 = third
+                                     '1',                -- f_adc, 0 = 160 MHz, 1 = 200 MHz
+                                     '0',                -- fsub_type, 0 = critically sampled, 1 = oversampled
+                                     '0',                -- beam_repositioning_flag
+                                     x"1400"             -- block_period = 5120
+                                   );
+
+  -- MM
+  CONSTANT c_mm_file_reg_sdp_info         : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_SDP_INFO";
+  CONSTANT c_mm_file_reg_bsn_source_v2    : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_SOURCE_V2";
+  CONSTANT c_mm_file_reg_stat_enable_bst  : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_STAT_ENABLE_BST";
+  CONSTANT c_mm_file_reg_stat_hdr_dat_bst : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_STAT_HDR_DAT_BST";
 
   -- Tb
   SIGNAL tb_end              : STD_LOGIC := '0';
@@ -94,13 +113,15 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_bst_offload IS
   CONSTANT c_eth_crc_size                 : NATURAL := 1; -- word
   CONSTANT c_eth_packet_size              : NATURAL := c_eth_header_size + c_eth_crc_size + (c_sdp_W_statistic / c_word_w) * c_sdp_S_sub_bf * c_sdp_N_pol; -- 20 + 2 * 488 * 2 = 1972 
   CONSTANT c_eth_check_nof_valid          : NATURAL := c_eth_check_nof_packets * c_eth_packet_size;  
-  CONSTANT c_eth_runtime_timeout          : TIME := (c_nof_sync + 1) * c_nof_clk_per_sync * c_ext_clk_period;  -- eth statistics should be done after c_nof_sync intervals
+
+  -- eth statistics should be done after c_nof_sync + 1 intervals (+1 because first new_interval is skipped)
+  CONSTANT c_eth_runtime_timeout          : TIME := (c_nof_sync + 2) * c_nof_clk_per_sync * c_ext_clk_period;
   
   -- DUT
   SIGNAL ext_clk             : STD_LOGIC := '0';
   SIGNAL pps                 : STD_LOGIC := '0';
   SIGNAL ext_pps             : STD_LOGIC := '0'; 
-  SIGNAL pps_rst             : STD_LOGIC := '0';
+  SIGNAL pps_rst             : STD_LOGIC := '1';
 
   SIGNAL WDI                 : STD_LOGIC;
   SIGNAL INTA                : STD_LOGIC;
@@ -119,6 +140,7 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_bst_offload IS
   SIGNAL rx_hdr_fields_out   : STD_LOGIC_VECTOR(1023 DOWNTO 0);
   SIGNAL rx_hdr_fields_raw   : STD_LOGIC_VECTOR(1023 DOWNTO 0) := (OTHERS => '0');
   SIGNAL rx_sdp_stat_header  : t_sdp_stat_header;
+  SIGNAL exp_sdp_stat_header : t_sdp_stat_header;
 
   -- back transceivers
   SIGNAL JESD204B_SERIAL_DATA : STD_LOGIC_VECTOR(c_sdp_S_pn-1 downto 0);
@@ -199,7 +221,26 @@ BEGIN
   BEGIN
     -- Wait for DUT power up after reset
     WAIT FOR 1 us;
- 
+    pps_rst <= '0';
+
+    ----------------------------------------------------------------------------
+    -- Offload destination MAC/IP/UDP
+    ----------------------------------------------------------------------------
+    mmf_mm_bus_wr(c_mm_file_reg_stat_hdr_dat_bst, 42, TO_UINT(c_sdp_stat_eth_dst_mac(47 DOWNTO 32)), tb_clk);
+    mmf_mm_bus_wr(c_mm_file_reg_stat_hdr_dat_bst, 41, TO_SINT(c_sdp_stat_eth_dst_mac(31 DOWNTO 0)), tb_clk);  -- use signed to fit 32 b in INTEGER
+    mmf_mm_bus_wr(c_mm_file_reg_stat_hdr_dat_bst, 26, TO_SINT(c_sdp_stat_ip_dst_addr), tb_clk);  -- use signed to fit 32 b in INTEGER
+    mmf_mm_bus_wr(c_mm_file_reg_stat_hdr_dat_bst, 24, TO_UINT(c_sdp_stat_udp_dst_port), tb_clk);
+    proc_common_wait_cross_clock_domain_latency(c_mm_clk_period, c_ext_clk_period);
+
+    ----------------------------------------------------------------------------
+    -- Set SDP info
+    ----------------------------------------------------------------------------
+    mmf_mm_bus_wr(c_mm_file_reg_sdp_info,  7, TO_UINT(c_exp_sdp_info.station_id), tb_clk);
+    mmf_mm_bus_wr(c_mm_file_reg_sdp_info,  6, TO_UINT(slv(c_exp_sdp_info.antenna_band_index)), tb_clk);
+    mmf_mm_bus_wr(c_mm_file_reg_sdp_info,  5, TO_UINT(c_exp_sdp_info.observation_id), tb_clk);
+    mmf_mm_bus_wr(c_mm_file_reg_sdp_info,  4, TO_UINT(c_exp_sdp_info.nyquist_zone_index), tb_clk);
+    mmf_mm_bus_wr(c_mm_file_reg_sdp_info,  1, TO_UINT(slv(c_exp_sdp_info.beam_repositioning_flag)), tb_clk);
+
     ----------------------------------------------------------------------------
     -- Enable BSN
     ----------------------------------------------------------------------------
@@ -244,7 +285,7 @@ BEGIN
   eth_rx_data <= eth_rx_sosi.data(c_32-1 DOWNTO 0);
 
   -- . Verify XST packet header
-  u_rx_statistics : ENTITY dp_lib.dp_offload_rx
+  u_dp_offload_rx : ENTITY dp_lib.dp_offload_rx
   GENERIC MAP (
     g_nof_streams         => 1,
     g_data_w              => c_word_w,
@@ -269,4 +310,25 @@ BEGIN
 
   rx_sdp_stat_header <= func_sdp_map_stat_header(rx_hdr_fields_raw);
 
+  exp_sdp_stat_header <= func_sdp_compose_stat_header(c_exp_sdp_info,
+                                                      "BST",
+                                                      '1',  -- fixed '1' for BST and XST, weighted_subbands_flag
+                                                      c_gn_nr,
+                                                      c_nof_block_per_sync,
+                                                      0,  -- not used for BST, sst_signal_input
+                                                      c_exp_beamlet_index,
+                                                      0,  -- not used for BST, subband_index
+                                                      0,  -- not used for BST, xst_signal_input_A
+                                                      0,  -- not used for BST, xst_signal_input_B
+                                                      0); -- dp_bsn
+
+  p_verify_header : PROCESS(rx_offload_sosi)
+    VARIABLE v_bool : BOOLEAN;
+  BEGIN
+    -- Prepare exp_sdp_stat_header before rx_offload_sosi.eop, so that it can be verified at rx_offload_sosi.eop
+    IF rx_offload_sosi.eop = '1' THEN
+      v_bool := func_sdp_verify_stat_header("BST", rx_sdp_stat_header, exp_sdp_stat_header);
+    END IF;
+  END PROCESS;
+
 END tb;
-- 
GitLab