From 6eb369ae0242f50fe854c20ff3dc8e5245d925c6 Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Sun, 6 Feb 2022 20:51:21 +0100
Subject: [PATCH] Improved logging.

---
 .../tb_lofar2_unb2b_sdp_station_fsub.vhd      | 154 +++++++++++-------
 1 file changed, 92 insertions(+), 62 deletions(-)

diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_fsub/tb_lofar2_unb2b_sdp_station_fsub.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_fsub/tb_lofar2_unb2b_sdp_station_fsub.vhd
index 9ee13577f4..4e8d82b1f3 100644
--- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_fsub/tb_lofar2_unb2b_sdp_station_fsub.vhd
+++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_fsub/tb_lofar2_unb2b_sdp_station_fsub.vhd
@@ -33,7 +33,7 @@
 --   2) Read current BSN from reg_bsn_scheduler_wg and write reg_bsn_scheduler_wg 
 --      to trigger start of WG at BSN.
 --     
---   3) Read subband statistics (SST) via MM and verify with exp_subband_power at g_subband.
+--   3) Read subband statistics (SST) via MM and verify with exp_subband_sst at g_subband.
 --      . use weighted subbands (default selected by MM)
 --
 --   4) View in wave window
@@ -42,14 +42,16 @@
 --        - WG amplitude = 8191 (is full scale - 1) when wg_ampl = 1.0
 --      . pfb_sosi_arr(c_pfb_index).im/re and fsub_sosi_arr(c_pfb_index).im/re
 --        in u_fsub in decimal radix and analog format to check that subband
---        phase is g_subband_phase phase as set by the subband weight.
+--        phase is g_subband_weight_phase phase as set by the subband weight.
 --        - Raw: pfb_sosi_arr = atan2(-65195 / 0) = -90 degrees
 --        - Weighted: fsub_sosi_arr = atan2(-56457 / 32598) = -60 degrees
---          --> rotated expected g_subband_phase = -60 - -90 = +30 degrees.
+--          --> rotated expected g_subband_weight_phase = -60 - -90 = +30 degrees.
 --   
 -- Usage:
 --   > as 7    # default
 --   > as 12   # for detailed debugging
+--     add wave -position insertpoint  \
+--     sim:/tb_lofar2_unb2b_sdp_station_fsub/sp_subband_ssts_arr2
 --   > run -a
 --   # Takes about 40 m
 --
@@ -71,11 +73,11 @@ USE unb2b_board_lib.unb2b_board_pkg.ALL;
 
 ENTITY tb_lofar2_unb2b_sdp_station_fsub IS
   GENERIC (
-    g_sp                : NATURAL := 3;    -- signal path index in range(S_pn = 12)
-    g_wg_ampl           : REAL := 1.0;     -- WG normalized amplitude
-    g_subband           : NATURAL := 102;  -- select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz
-    g_subband_gain      : REAL := 1.0;     -- subband weight normalized gain
-    g_subband_phase     : REAL := 30.0     -- subband weight phase rotation in degrees
+    g_sp                   : NATURAL := 3;    -- signal path index in range(S_pn = 12)
+    g_wg_ampl              : REAL := 1.0;     -- WG normalized amplitude
+    g_subband              : NATURAL := 102;  -- select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz
+    g_subband_weight_gain  : REAL := 1.0;     -- subband weight normalized gain
+    g_subband_weight_phase : REAL := 30.0     -- subband weight phase rotation in degrees
   );
 END tb_lofar2_unb2b_sdp_station_fsub;
 
@@ -97,7 +99,7 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_fsub IS
   CONSTANT c_tb_clk_period       : TIME := 100 ps; -- use fast tb_clk to speed up M&C
 
   CONSTANT c_nof_block_per_sync  : NATURAL := 16;
-  CONSTANT c_nof_clk_per_sync    : NATURAL := c_nof_block_per_sync*c_sdp_N_fft - (c_sdp_N_fft/2); --15.5 block per sync
+  CONSTANT c_nof_clk_per_sync    : NATURAL := c_nof_block_per_sync * c_sdp_N_fft;
   CONSTANT c_pps_period          : NATURAL := c_nof_clk_per_sync;
   CONSTANT c_wpfb_sim            : t_wpfb := func_wpfb_set_nof_block_per_sync(c_sdp_wpfb_subbands, c_nof_block_per_sync);
   CONSTANT c_stat_data_sz        : NATURAL := c_wpfb_sim.stat_data_sz;  -- = 2
@@ -112,7 +114,8 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_fsub IS
   CONSTANT c_wg_ampl_full_scale   : NATURAL := 2**(c_sdp_W_adc-1);  -- full scale (FS) of WG, will just cause clipping of +FS to +FS-1
   CONSTANT c_wg_ampl_lsb          : REAL := c_diag_wg_ampl_unit / REAL(c_wg_ampl_full_scale);  -- amplitude in number of LSbit resolution steps
   CONSTANT c_wg_ampl              : NATURAL := NATURAL(g_wg_ampl * REAL(c_wg_ampl_full_scale));  -- in number of lsb
-  CONSTANT c_exp_wg_power_sp      : REAL := REAL(c_wg_ampl**2)/2.0 * REAL(c_nof_clk_per_sync);
+  CONSTANT c_exp_sp_power         : REAL := REAL(c_wg_ampl**2) / 2.0;
+  CONSTANT c_exp_sp_ast           : REAL := c_exp_sp_power * REAL(c_nof_clk_per_sync);
   -- . phase
   CONSTANT c_subband_phase        : REAL := 0.0;  -- wanted subband phase in degrees = WG phase at sop
   CONSTANT c_subband_freq         : REAL := REAL(g_subband) / REAL(c_sdp_N_fft);                   -- normalized by fs = f_adc = 200 MHz is dp_clk
@@ -126,20 +129,25 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_fsub IS
   -- . WPFB
   CONSTANT c_pol_index                      : NATURAL := g_sp MOD c_sdp_Q_fft;
   CONSTANT c_pfb_index                      : NATURAL := g_sp / c_sdp_Q_fft;  -- only read used WPFB unit out of range(c_sdp_P_pfb = 6)
-  CONSTANT c_exp_subband_sp_power_ratio     : REAL := 1.0/8.0;   -- subband power / SP power, depends on internal WPFB quantization and FIR coefficients
-  CONSTANT c_exp_subband_power_raw          : REAL := c_exp_wg_power_sp * c_exp_subband_sp_power_ratio;
-  CONSTANT c_exp_subband_power_weighted     : REAL := c_exp_subband_power_raw * g_subband_gain**2.0;
-
-  -- . expected limit values, obtained with print_str() for g_subband = 102
-  CONSTANT c_exp_subband_power_leakage_snr_dB   : REAL := 75.0;  -- < 76.372
-  CONSTANT c_exp_subband_power_crosstalk_snr_dB : REAL := 95.0;  -- < 96.284
+  CONSTANT c_exp_subband_sp_ampl_ratio      : REAL := 7.96;  -- ~= 8 for unit FIR DC gain, depends on internal WPFB quantization and FIR coefficients
+  CONSTANT c_exp_subband_ampl_raw           : REAL := REAL(c_wg_ampl) * c_exp_subband_sp_ampl_ratio;
+  CONSTANT c_exp_subband_ampl_weighted      : REAL := c_exp_subband_ampl_raw * g_subband_weight_gain;
+  CONSTANT c_exp_subband_power_raw          : REAL := c_exp_subband_ampl_raw**2.0;  -- complex, so no divide by 2
+  CONSTANT c_exp_subband_power_weighted     : REAL := c_exp_subband_ampl_weighted**2.0;  -- complex, so no divide by 2
+  CONSTANT c_exp_subband_sst_raw            : REAL := c_exp_subband_power_raw * REAL(c_nof_block_per_sync);
+  CONSTANT c_exp_subband_sst_weighted       : REAL := c_exp_subband_power_weighted * REAL(c_nof_block_per_sync);
+
+  -- . expected limit values, obtained with print_str() for g_subband = 102,
+  --   g_wg_ampl = 1.0, g_subband_weight_gain = 1.0, g_subband_weight_phase = 30.0
+  CONSTANT c_exp_subband_sst_leakage_snr_dB   : REAL := 70.0;  -- < 74.913
+  CONSTANT c_exp_subband_sst_crosstalk_snr_dB : REAL := 90.0;  -- < 96.284
 
   TYPE t_real_arr IS ARRAY (INTEGER RANGE <>) OF REAL; 
   TyPE t_slv_64_subbands_arr IS ARRAY (INTEGER RANGE <>) OF t_slv_64_arr(0 TO c_sdp_N_sub-1);
 
   -- . Subband weights for selected g_sp
-  CONSTANT c_subband_weight_re   : INTEGER := INTEGER(g_subband_gain * REAL(c_sdp_unit_sub_weight) * COS(g_subband_phase * MATH_2_PI / 360.0));
-  CONSTANT c_subband_weight_im   : INTEGER := INTEGER(g_subband_gain * REAL(c_sdp_unit_sub_weight) * SIN(g_subband_phase * MATH_2_PI / 360.0));
+  CONSTANT c_subband_weight_re   : INTEGER := INTEGER(g_subband_weight_gain * REAL(c_sdp_unit_sub_weight) * COS(g_subband_weight_phase * MATH_2_PI / 360.0));
+  CONSTANT c_subband_weight_im   : INTEGER := INTEGER(g_subband_weight_gain * REAL(c_sdp_unit_sub_weight) * SIN(g_subband_weight_phase * MATH_2_PI / 360.0));
 
   -- MM
   -- . Address widths of a single MM instance
@@ -168,15 +176,18 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_fsub IS
 
   -- FSUB
   -- . WPFB
-  SIGNAL sp_subband_powers_arr2            : t_slv_64_subbands_arr(c_sdp_N_pol-1 DOWNTO 0);   -- [pol][sub]
-  SIGNAL sp_subband_power_sum_arr          : t_real_arr(c_sdp_N_pol-1 DOWNTO 0) := (OTHERS => 0.0);
-  SIGNAL sp_subband_power                  : REAL := 0.0;
-  SIGNAL sp_subband_power_leakage          : REAL := 0.0;
-  SIGNAL sp_subband_power_leakage_snr_dB   : REAL := 0.0;  -- signal to noise (leakage) ratio
-  SIGNAL sp_subband_power_crosstalk        : REAL := 0.0;
-  SIGNAL sp_subband_power_crosstalk_snr_dB : REAL := 0.0;  -- signal to noise (crosstalk) ration
-
-  SIGNAL exp_subband_power       : REAL := 0.0;
+  SIGNAL sp_subband_ssts_arr2            : t_slv_64_subbands_arr(c_sdp_N_pol-1 DOWNTO 0);   -- [pol][sub]
+  SIGNAL sp_subband_sst_sum_arr          : t_real_arr(c_sdp_N_pol-1 DOWNTO 0) := (OTHERS => 0.0);
+  SIGNAL sp_subband_sst                  : REAL := 0.0;
+  SIGNAL sp_subband_sst_leakage          : REAL := 0.0;
+  SIGNAL sp_subband_sst_leakage_snr_dB   : REAL := 0.0;  -- signal to noise (leakage) ratio
+  SIGNAL sp_subband_sst_crosstalk        : REAL := 0.0;
+  SIGNAL sp_subband_sst_crosstalk_snr_dB : REAL := 0.0;  -- signal to noise (crosstalk) ration
+
+  SIGNAL exp_subband_ampl    : REAL := 0.0;
+  SIGNAL exp_subband_power   : REAL := 0.0;
+  SIGNAL exp_subband_sst     : REAL := 0.0;
+  SIGNAL stat_data           : STD_LOGIC_VECTOR(c_longword_w-1 DOWNTO 0);
 
   -- . Selector
   SIGNAL sst_offload_weighted_subbands     : STD_LOGIC;
@@ -287,7 +298,10 @@ BEGIN
     JESD204B_SYNC_N => jesd204b_sync_n
   );
 
+  -- Raw or weighted subbands
+  exp_subband_ampl  <= sel_a_b(sst_offload_weighted_subbands = '0', c_exp_subband_ampl_raw, c_exp_subband_ampl_weighted);
   exp_subband_power <= sel_a_b(sst_offload_weighted_subbands = '0', c_exp_subband_power_raw, c_exp_subband_power_weighted);
+  exp_subband_sst   <= sel_a_b(sst_offload_weighted_subbands = '0', c_exp_subband_sst_raw, c_exp_subband_sst_weighted);
 
   ------------------------------------------------------------------------------
   -- MM slave accesses via file IO
@@ -412,38 +426,39 @@ BEGIN
         v_data_hi := rd_data;
         v_stat_data := v_data_hi & v_data_lo;
 
-        sp_subband_powers_arr2(v_P)(v_B) <= v_stat_data;
+        sp_subband_ssts_arr2(v_P)(v_B) <= v_stat_data;
+        stat_data <= v_stat_data;  -- for time series view in Wave window
 
         -- sum of all subband powers per pol
-        sp_subband_power_sum_arr(v_P) <= sp_subband_power_sum_arr(v_P) + TO_UREAL(v_stat_data);
+        sp_subband_sst_sum_arr(v_P) <= sp_subband_sst_sum_arr(v_P) + TO_UREAL(v_stat_data);
       END IF;
     END LOOP;
 
     -- Subband power of g_subband in g_sp
-    -- . For the selected g_subband in g_sp the sp_subband_power will be close
-    --   to sp_subband_power_sum_arr(c_pol_index), because the input is a
+    -- . For the selected g_subband in g_sp the sp_subband_sst will be close
+    --   to sp_subband_sst_sum_arr(c_pol_index), because the input is a
     --   sinus, so most power will be in 1 subband.
-    sp_subband_power <= TO_UREAL(sp_subband_powers_arr2(c_pol_index)(g_subband));
+    sp_subband_sst <= TO_UREAL(sp_subband_ssts_arr2(c_pol_index)(g_subband));
     proc_common_wait_some_cycles(tb_clk, 1);
 
-    -- The sp_subband_power_leakage shows how much power from the input sinus at a specific
+    -- The sp_subband_sst_leakage shows how much power from the input sinus at a specific
     -- subband has leaked into the N_sub-1 = 511 other subbands. The power ratio yields an
     -- indication of the SNR, although that also depends on the SNR of the WG sinus.
-    v_power := sp_subband_power_sum_arr(c_pol_index) - sp_subband_power;
-    sp_subband_power_leakage <= v_power;
+    v_power := sp_subband_sst_sum_arr(c_pol_index) - sp_subband_sst;
+    sp_subband_sst_leakage <= v_power;
     IF v_power > 0.0 THEN
-      sp_subband_power_leakage_snr_dB <= 10.0 * LOG10(sp_subband_power / v_power);
+      sp_subband_sst_leakage_snr_dB <= 10.0 * LOG10(sp_subband_sst / v_power);
     ELSE
       REPORT "Wrong, zero leakage is unexpected for SP-" & NATURAL'IMAGE(g_sp) SEVERITY ERROR;
     END IF;
 
-    -- The sp_subband_power_crosstalk shows how much power from one WPFB input cross talks
+    -- The sp_subband_sst_crosstalk shows how much power from one WPFB input cross talks
     -- into the other output, due to quantization cross talk in the complex FFT. The power
     -- ration indicates the suppression, provided that the other input was zero.
-    v_power := sp_subband_power_sum_arr(not_int(c_pol_index));
-    sp_subband_power_crosstalk <= v_power;
+    v_power := sp_subband_sst_sum_arr(not_int(c_pol_index));
+    sp_subband_sst_crosstalk <= v_power;
     IF v_power > 0.0 THEN
-      sp_subband_power_crosstalk_snr_dB <= 10.0 * LOG10(sp_subband_power / v_power);
+      sp_subband_sst_crosstalk_snr_dB <= 10.0 * LOG10(sp_subband_sst / v_power);
     ELSE
       REPORT "Wrong, zero crosstalk is unexpected for SP-" & NATURAL'IMAGE(g_sp) SEVERITY ERROR;
     END IF;
@@ -451,36 +466,51 @@ BEGIN
     proc_common_wait_some_cycles(tb_clk, 1);
 
     ---------------------------------------------------------------------------
-    -- Log subband statistics
+    -- Log WG, subband statistics
     ---------------------------------------------------------------------------
-    -- Log selector
-    print_str("sst_offload_weighted_subbands        = " & sl_to_str(sst_offload_weighted_subbands));
-
-    -- Log subband weight
-    print_str("sp_subband_weight_gain               = " & real_to_str(sp_subband_weight_gain, 20, 6));
-    print_str("sp_subband_weight_phase              = " & real_to_str(sp_subband_weight_phase, 20, 6));
-
-    -- Log SST
-    print_str("sp_subband_power                     = " & real_to_str(sp_subband_power, 20, 0));
-    print_str("sp_subband_power / exp_subband_power = " & real_to_str(sp_subband_power / exp_subband_power, 20, 0));
+    print_str("");
+    print_str("WG:");
+    print_str(". c_wg_ampl                            = " & int_to_str(c_wg_ampl));
+    print_str(". c_exp_sp_power                       = " & real_to_str(c_exp_sp_power, 20, 1));
+    print_str(". c_exp_sp_ast                         = " & real_to_str(c_exp_sp_ast, 20, 1));
+
+    print_str("");
+    print_str("Subband selector:");
+    print_str(". sst_offload_weighted_subbands        = " & sl_to_str(sst_offload_weighted_subbands));
+
+    print_str("");
+    print_str("Subband weight:");
+    print_str(". sp_subband_weight_gain               = " & real_to_str(sp_subband_weight_gain, 20, 6));
+    print_str(". sp_subband_weight_phase              = " & real_to_str(sp_subband_weight_phase, 20, 6));
+
+    print_str("");
+    print_str("SST results:");
+    print_str(". exp_subband_ampl                     = " & int_to_str(NATURAL(exp_subband_ampl)));
+    print_str(". exp_subband_power                    = " & real_to_str(exp_subband_power, 20, 1));
+    print_str(". exp_subband_sst                      = " & real_to_str(exp_subband_sst, 20, 1));
+    print_str("");
+    print_str(". sp_subband_sst                       = " & real_to_str(sp_subband_sst, 20, 1));
+    print_str(". sp_subband_sst / exp_subband_sst     = " & real_to_str(sp_subband_sst / exp_subband_sst, 20, 6));
 
     -- Log WPFB details, these are allready verified in tb of wpfb_unit_dev.vhd, so here
     -- quality indicators like leakage and crosstalk are also reported out of interest.
-    print_str("sp_subband_power_leakage             = " & real_to_str(sp_subband_power_leakage, 20, 0));
-    print_str("sp_subband_power_leakage_snr_dB      = " & real_to_str(sp_subband_power_leakage_snr_dB, 20, 3));
-    print_str("sp_subband_power_crosstalk           = " & real_to_str(sp_subband_power_crosstalk, 20, 0));
-    print_str("sp_subband_power_crosstalk_snr_db    = " & real_to_str(sp_subband_power_crosstalk_snr_db, 20, 3));
+    print_str("");
+    print_str("SST quality indicators");
+    print_str(". sp_subband_sst_leakage               = " & real_to_str(sp_subband_sst_leakage, 20, 0));
+    print_str(". sp_subband_sst_leakage_snr_dB        = " & real_to_str(sp_subband_sst_leakage_snr_dB, 20, 3));
+    print_str(". sp_subband_sst_crosstalk             = " & real_to_str(sp_subband_sst_crosstalk, 20, 0));
+    print_str(". sp_subband_sst_crosstalk_snr_db      = " & real_to_str(sp_subband_sst_crosstalk_snr_db, 20, 3));
 
     ---------------------------------------------------------------------------
-    -- Verify subband statistics
-    ---------------------------------------------------------------------------  
+    -- Verify SST
+    ---------------------------------------------------------------------------
     -- verify expected subband power based on WG power
-    ASSERT sp_subband_power > c_lo_factor * exp_subband_power REPORT "Wrong subband power for SP " & NATURAL'IMAGE(g_sp) SEVERITY ERROR;
-    ASSERT sp_subband_power < c_hi_factor * exp_subband_power REPORT "Wrong subband power for SP " & NATURAL'IMAGE(g_sp) SEVERITY ERROR;
+    ASSERT sp_subband_sst > c_lo_factor * exp_subband_sst REPORT "Wrong subband power for SP " & NATURAL'IMAGE(g_sp) SEVERITY ERROR;
+    ASSERT sp_subband_sst < c_hi_factor * exp_subband_sst REPORT "Wrong subband power for SP " & NATURAL'IMAGE(g_sp) SEVERITY ERROR;
 
     -- Verify expected SNR quality measures
-    ASSERT sp_subband_power_leakage_snr_dB   > c_exp_subband_power_leakage_snr_dB   REPORT "Wrong to much leakage for SP " & NATURAL'IMAGE(g_sp) SEVERITY ERROR;
-    ASSERT sp_subband_power_crosstalk_snr_dB > c_exp_subband_power_crosstalk_snr_dB REPORT "Wrong to much crosstalk for SP " & NATURAL'IMAGE(g_sp) SEVERITY ERROR;
+    ASSERT sp_subband_sst_leakage_snr_dB   > c_exp_subband_sst_leakage_snr_dB   REPORT "Wrong to much leakage for SP " & NATURAL'IMAGE(g_sp) SEVERITY ERROR;
+    ASSERT sp_subband_sst_crosstalk_snr_dB > c_exp_subband_sst_crosstalk_snr_dB REPORT "Wrong to much crosstalk for SP " & NATURAL'IMAGE(g_sp) SEVERITY ERROR;
 
     ---------------------------------------------------------------------------
     -- End Simulation 
-- 
GitLab