From afabdea7ed762111c4d3e4a71f22eb62eefb370b Mon Sep 17 00:00:00 2001
From: Erik Kooistra <kooistra@astron.nl>
Date: Wed, 19 Oct 2016 09:25:34 +0000
Subject: [PATCH] Added tb for c_stage_dat_extra_w >> 18b to verify
 g_diff_margin = 1.

---
 .../dsp/wpfb/tb/vhdl/tb_tb_wpfb_unit_wide.vhd | 58 ++++++++++---------
 .../dsp/wpfb/tb/vhdl/tb_wpfb_unit_wide.vhd    | 27 +++------
 2 files changed, 38 insertions(+), 47 deletions(-)

diff --git a/libraries/dsp/wpfb/tb/vhdl/tb_tb_wpfb_unit_wide.vhd b/libraries/dsp/wpfb/tb/vhdl/tb_tb_wpfb_unit_wide.vhd
index e302b71434..d4608ba3c5 100644
--- a/libraries/dsp/wpfb/tb/vhdl/tb_tb_wpfb_unit_wide.vhd
+++ b/libraries/dsp/wpfb/tb/vhdl/tb_tb_wpfb_unit_wide.vhd
@@ -42,24 +42,26 @@ END tb_tb_wpfb_unit_wide;
 
 ARCHITECTURE tb OF tb_tb_wpfb_unit_wide IS
   
+  constant c_stage_dat_extra_w         : natural := c_dsp_mult_w + 10;
+  
   -- wb 1, two real
   CONSTANT c_wb_1_two_real_1024        : t_wpfb := (1, 1024, 0, 1,
                                                     16, 1, 8, 16, 16,
-                                                    true, false, true, 16, 16, 0, c_dsp_mult_w, 2, true, 56, 2,  
+                                                    true, false, true, 16, 16, 1, c_dsp_mult_w, 2, true, 56, 2,  
                                                     c_fft_pipeline, c_fft_pipeline, c_fil_ppf_pipeline);
   CONSTANT c_wb_1_two_real             : t_wpfb := (1, 32, 0, 1,
                                                     16, 1, 8, 16, 16,
-                                                    true, false, true, 16, 16, 0, c_dsp_mult_w, 2, true, 56, 2,  
+                                                    true, false, true, 16, 16, 1, c_dsp_mult_w, 2, true, 56, 2,  
                                                     c_fft_pipeline, c_fft_pipeline, c_fil_ppf_pipeline);
                                                     
   -- wb 4, two real
   CONSTANT c_wb_4_two_real_1024        : t_wpfb := (4, 1024, 0, 1,
                                                     16, 1, 8, 16, 16,
-                                                    true, false, true, 16, 16, 0, c_dsp_mult_w, 2, true, 56, 2,  
+                                                    true, false, true, 16, 16, 1, c_stage_dat_extra_w, 2, true, 56, 2,  
                                                     c_fft_pipeline, c_fft_pipeline, c_fil_ppf_pipeline);
   CONSTANT c_wb_4_two_real             : t_wpfb := (4, 32, 0, 1,
                                                     16, 1, 8, 16, 16,
-                                                    true, false, true, 16, 16, 0, c_dsp_mult_w, 2, true, 56, 2,  
+                                                    true, false, true, 16, 16, 1, c_dsp_mult_w, 2, true, 56, 2,  
                                                     c_fft_pipeline, c_fft_pipeline, c_fil_ppf_pipeline);
                                                     
   -- wb 1, complex reordered
@@ -116,10 +118,12 @@ ARCHITECTURE tb OF tb_tb_wpfb_unit_wide IS
                                                     false, false, false, 16, 16, 0, c_dsp_mult_w, 2, true, 56, 2,  
                                                     c_fft_pipeline, c_fft_pipeline, c_fil_ppf_pipeline);
                                        
-  CONSTANT c_dm             : natural := 3;  -- diff margin (for 32p dm=2 appears sufficient, for 1024p dm=3 is sufficient)
+  CONSTANT c_dm_1                : natural := 1;  -- diff margin (for stage_dat_w >> c_dsp_mult_w)
+  CONSTANT c_dm_3                : natural := 3;  -- diff margin (for 32 point dm=2 appears sufficient, for 1024 point dm=3 is sufficient)
+  CONSTANT c_dm_5                : natural := 5;  -- diff margin (for 32 point dm=2 appears sufficient, for 1024 point dm=3 is sufficient)
   
-  CONSTANT c_pre_ab         : string := "data/run_pfb_m_pfir_coeff_fircls1";
-  CONSTANT c_pre_c          : string := "data/run_pfb_complex_m_pfir_coeff_fircls1";
+  CONSTANT c_pre_ab              : string := "data/run_pfb_m_pfir_coeff_fircls1";
+  CONSTANT c_pre_c               : string := "data/run_pfb_complex_m_pfir_coeff_fircls1";
   
   -- Real input
   CONSTANT c_sinusoid_chirp_1024 : string := "data/run_pfb_m_sinusoid_chirp_8b_16taps_1024points_16b_16b.dat";   -- 204800 lines
@@ -235,33 +239,33 @@ BEGIN
   
   -- Two real input data A and B
   -- * 1024 point (as in Apertif subband filterbank)
-  u_act_wb_4_two_real_ab_1024    : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_two_real_1024, c_dm, c_pre_ab, c_pre_c, c_sinusoid_chirp_1024, 204800, c_noise_1024,   51200, c_un, 0, 51200, FALSE);
-  u_act_wb_1_two_real_ab_1024    : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_two_real_1024, c_dm, c_pre_ab, c_pre_c, c_sinusoid_chirp_1024, 204800, c_noise_1024,   51200, c_un, 0, 51200, FALSE);
-  u_act_wb_1_two_real_chirp_1024 : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_two_real_1024, c_dm, c_pre_ab, c_pre_c, c_sinusoid_chirp_1024, 204800, c_zero,         51200, c_un, 0, 51200, FALSE);
+  u_act_wb_4_two_real_ab_1024    : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_two_real_1024, c_dm_1, c_pre_ab, c_pre_c, c_sinusoid_chirp_1024, 204800, c_noise_1024,   51200, c_un, 0, 51200, FALSE);
+  u_act_wb_1_two_real_ab_1024    : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_two_real_1024, c_dm_5, c_pre_ab, c_pre_c, c_sinusoid_chirp_1024, 204800, c_noise_1024,   51200, c_un, 0, 51200, FALSE);
+  u_act_wb_1_two_real_chirp_1024 : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_two_real_1024, c_dm_5, c_pre_ab, c_pre_c, c_sinusoid_chirp_1024, 204800, c_zero,         51200, c_un, 0, 51200, FALSE);
   
   -- * 32 point
-  u_act_wb_1_two_real_chirp      : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_two_real,      c_dm, c_pre_ab, c_pre_c, c_sinusoid_chirp,        6400, c_impulse_chirp, 6400, c_un, 0,  6400, FALSE);
-  u_act_wb_1_two_real_a0         : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_two_real,      c_dm, c_pre_ab, c_pre_c, c_zero,                  6400, c_impulse_chirp, 6400, c_un, 0,  6400, FALSE);
-  u_act_wb_1_two_real_b0         : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_two_real,      c_dm, c_pre_ab, c_pre_c, c_sinusoid_chirp,        6400, c_zero,          6400, c_un, 0,  6400, FALSE);
-  u_rnd_wb_4_two_real_noise      : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_two_real,      c_dm, c_pre_ab, c_pre_c, c_noise,                 1600, c_dc_agwn,       1600, c_un, 0,  1600, TRUE);
-  u_rnd_wb_1_two_real_noise      : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_two_real,      c_dm, c_pre_ab, c_pre_c, c_noise,                 1600, c_dc_agwn,       1600, c_un, 0,  1600, TRUE);
+  u_act_wb_1_two_real_chirp      : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_two_real,      c_dm_5, c_pre_ab, c_pre_c, c_sinusoid_chirp,        6400, c_impulse_chirp, 6400, c_un, 0,  6400, FALSE);
+  u_act_wb_1_two_real_a0         : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_two_real,      c_dm_5, c_pre_ab, c_pre_c, c_zero,                  6400, c_impulse_chirp, 6400, c_un, 0,  6400, FALSE);
+  u_act_wb_1_two_real_b0         : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_two_real,      c_dm_5, c_pre_ab, c_pre_c, c_sinusoid_chirp,        6400, c_zero,          6400, c_un, 0,  6400, FALSE);
+  u_rnd_wb_4_two_real_noise      : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_two_real,      c_dm_5, c_pre_ab, c_pre_c, c_noise,                 1600, c_dc_agwn,       1600, c_un, 0,  1600, TRUE);
+  u_rnd_wb_1_two_real_noise      : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_two_real,      c_dm_5, c_pre_ab, c_pre_c, c_noise,                 1600, c_dc_agwn,       1600, c_un, 0,  1600, TRUE);
   
   -- Complex input data
   -- * 1024 point
-  u_act_wb_1_complex_chirp_1024  : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_complex_1024,  c_dm, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor_chirp_1024,  204800, 51200, FALSE);
-  u_act_wb_4_complex_chirp_1024  : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex_1024,  c_dm, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor_chirp_1024,  204800, 51200, FALSE);
+  u_act_wb_1_complex_chirp_1024  : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_complex_1024,  c_dm_3, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor_chirp_1024,  204800, 51200, FALSE);
+  u_act_wb_4_complex_chirp_1024  : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex_1024,  c_dm_3, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor_chirp_1024,  204800, 51200, FALSE);
   
   -- * 64 point (as in Apertif channel filterbank)
-  u_act_wb_1_complex_chirp_64         : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_complex_64,         c_dm, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor_chirp_64,  12800, 12800, FALSE);
-  u_act_wb_4_complex_chirp_64         : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex_64,         c_dm, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor_chirp_64,  12800, 12800, FALSE);
-  u_act_wb_1_complex_flipped_noise_64 : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_complex_flipped_64, c_dm, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_noise_complex_64,  3200,  3200, FALSE);
-  u_act_wb_4_complex_flipped_noise_64 : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex_flipped_64, c_dm, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_noise_complex_64,  3200,  3200, FALSE);
+  u_act_wb_1_complex_chirp_64         : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_complex_64,         c_dm_3, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor_chirp_64,  12800, 12800, FALSE);
+  u_act_wb_4_complex_chirp_64         : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex_64,         c_dm_3, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor_chirp_64,  12800, 12800, FALSE);
+  u_act_wb_1_complex_flipped_noise_64 : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_complex_flipped_64, c_dm_3, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_noise_complex_64,  3200,  3200, FALSE);
+  u_act_wb_4_complex_flipped_noise_64 : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex_flipped_64, c_dm_3, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_noise_complex_64,  3200,  3200, FALSE);
   
   -- * 32 point
-  u_act_wb_4_complex_chirp       : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex,         c_dm, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor_chirp,  6400, 6400, FALSE);
-  u_act_wb_4_complex_flipped     : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex_flipped, c_dm, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor_chirp,  6400, 6400, FALSE);
-  u_rnd_wb_1_complex_phasor      : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_complex,         c_dm, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor,        1600, 1600, TRUE);
-  u_rnd_wb_4_complex_phasor      : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex,         c_dm, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor,        1600, 1600, TRUE);
-  u_rnd_wb_1_complex_noise       : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_complex,         c_dm, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_noise_complex, 1600, 1600, TRUE);
-  u_rnd_wb_4_complex_noise       : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex,         c_dm, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_noise_complex, 1600, 1600, TRUE);
+  u_act_wb_4_complex_chirp       : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex,         c_dm_3, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor_chirp,  6400, 6400, FALSE);
+  u_act_wb_4_complex_flipped     : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex_flipped, c_dm_3, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor_chirp,  6400, 6400, FALSE);
+  u_rnd_wb_1_complex_phasor      : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_complex,         c_dm_3, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor,        1600, 1600, TRUE);
+  u_rnd_wb_4_complex_phasor      : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex,         c_dm_3, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_phasor,        1600, 1600, TRUE);
+  u_rnd_wb_1_complex_noise       : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_1_complex,         c_dm_3, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_noise_complex, 1600, 1600, TRUE);
+  u_rnd_wb_4_complex_noise       : ENTITY work.tb_wpfb_unit_wide GENERIC MAP (c_wb_4_complex,         c_dm_3, c_pre_ab, c_pre_c, c_un, 0, c_un, 0, c_noise_complex, 1600, 1600, TRUE);
 END tb;
diff --git a/libraries/dsp/wpfb/tb/vhdl/tb_wpfb_unit_wide.vhd b/libraries/dsp/wpfb/tb/vhdl/tb_wpfb_unit_wide.vhd
index f65a6024c7..66ee79b323 100644
--- a/libraries/dsp/wpfb/tb/vhdl/tb_wpfb_unit_wide.vhd
+++ b/libraries/dsp/wpfb/tb/vhdl/tb_wpfb_unit_wide.vhd
@@ -68,7 +68,7 @@ entity tb_wpfb_unit_wide is
     -- DUT generics
     g_wpfb : t_wpfb := (4, 32, 0, 1,
                         16, 1, 8, 16, 16,
-                        true, false, true, 16, 16, 0, c_dsp_mult_w, 2, true, 56, 2,  
+                        true, false, true, 16, 16, 1, c_dsp_mult_w, 2, true, 56, 2,  
                         c_fft_pipeline, c_fft_pipeline, c_fil_ppf_pipeline);
     --  type t_wpfb is record  
     --    -- General parameters for the wideband poly phase filter
@@ -104,9 +104,10 @@ entity tb_wpfb_unit_wide is
     --  end record;
     
     -- TB generics
-    g_diff_margin           : integer := 2;  -- maximum difference between HDL output and expected output (> 0 to allow minor rounding differences)
-                                             -- for   32 point diff margin = 2 appears sufficient
-                                             -- for 1024 point diff margin = 3 appears sufficient
+    g_diff_margin           : integer := 5;  -- maximum difference between HDL output and expected output (> 0 to allow minor rounding differences)
+                                             -- for complex  diff margin = 3 appears sufficient
+                                             -- for two_real diff margin = 5 appears sufficient
+                                             -- if stage_dat_w >> 18 >= fft_out_dat_w then g_diff_margin = 1 is sufficient
     
     -- PFIR coefficients
     g_coefs_file_prefix_ab    : string := "data/run_pfb_m_pfir_coeff_fircls1";
@@ -120,6 +121,8 @@ entity tb_wpfb_unit_wide is
     --g_data_file_b_nof_lines : natural := 0;
     
     -- * 32 points = 16 subbands
+    --g_data_file_a           : string := "data/run_pfb_m_sinusoid_chirp_8b_16taps_1024points_16b_16b.dat";
+    --g_data_file_a_nof_lines : natural := 204800;
     --g_data_file_a           : string := "data/run_pfb_m_sinusoid_chirp_8b_16taps_32points_16b_16b.dat";
     --g_data_file_a_nof_lines : natural := 6400;
     g_data_file_a           : string := "data/run_pfb_m_sinusoid_8b_16taps_32points_16b_16b.dat";
@@ -158,22 +161,6 @@ architecture tb of tb_wpfb_unit_wide is
   constant c_sclk_period           : time := c_clk_period / g_wpfb.wb_factor;
   
   constant c_in_complex            : boolean := not g_wpfb.use_separate;
-  constant c_wfft                  : t_fft := (g_wpfb.use_reorder,
-                                               g_wpfb.use_fft_shift,
-                                               g_wpfb.use_separate,
-                                               g_wpfb.nof_chan,
-                                               g_wpfb.wb_factor,
-                                               0,
-                                               g_wpfb.nof_points,
-                                               g_wpfb.fil_in_dat_w,
-                                               g_wpfb.fft_out_dat_w,
-                                               g_wpfb.fft_out_gain_w,
-                                               g_wpfb.stage_dat_w,
-                                               g_wpfb.guard_w,
-                                               g_wpfb.guard_enable,
-                                               g_wpfb.stat_data_w,
-                                               g_wpfb.stat_data_sz);
-  constant c_fft_r2_check          : boolean := fft_r2_parameter_asserts(c_wfft);
   
   constant c_nof_channels          : natural := 1;
   constant c_nof_coefs             : natural := g_wpfb.nof_taps * g_wpfb.nof_points;       -- nof PFIR coef
-- 
GitLab