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