diff --git a/libraries/base/dp/tb/vhdl/tb_dp_bsn_source_v2.vhd b/libraries/base/dp/tb/vhdl/tb_dp_bsn_source_v2.vhd index 669522d47e037d52d3ec6f18bfedf652f93fc080..c3ccfaac5de706539f24db523b09c9c2d4d5042a 100644 --- a/libraries/base/dp/tb/vhdl/tb_dp_bsn_source_v2.vhd +++ b/libraries/base/dp/tb/vhdl/tb_dp_bsn_source_v2.vhd @@ -1,6 +1,6 @@ ------------------------------------------------------------------------------- -- --- Copyright (C) 2011 +-- Copyright (C) 2020 -- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> -- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands -- @@ -25,9 +25,9 @@ -- [1]. -- Decsription: -- * Start/Stop BSN source tests: --- 1) test 1x asynchronously (dp_on_pps='0') without automatic check, check +-- 1) test once asynchronously (dp_on_pps='0') without automatic check, check -- visualy in wave window. --- 2) test 3x synchronously (dp_on_pps='1') with automatic check. +-- 2) test c_nof_repeat synchronously (dp_on_pps='1') with automatic check. -- . Verify if bs_sosi.eop and bs_sosi.sop come in pairs -- . Verify that bs_sosi.sync is at bs_sosi.sop -- . Verify that bs_sosi has fixed latency with respect to ref_grid @@ -37,7 +37,7 @@ -- [2] https://support.astron.nl/confluence/display/L2M/L6+FWLIB+Design+Document%3A+BSN+source+with+offset -- -- Usage: --- > as 10 +-- > as 8, e.g. view bs_sosi, exp_grid and unexpected_bs_sync -- > run -all -- . sop, eop are verified automatically -- . sync and bsn are verified automatically using the ref_grid @@ -52,15 +52,22 @@ USE dp_lib.tb_dp_pkg.ALL; ENTITY tb_dp_bsn_source_v2 IS GENERIC ( - g_nof_pps : NATURAL := 10; - g_pps_interval : NATURAL := 10; --101; - g_block_size : NATURAL := 7 --23 + g_pps_interval : NATURAL := 16; --101; + g_block_size : NATURAL := 5 --23 ); END tb_dp_bsn_source_v2; ARCHITECTURE tb OF tb_dp_bsn_source_v2 IS - CONSTANT c_nof_repeat : NATURAL := 3; + CONSTANT c_gcd : NATURAL := gcd(g_pps_interval, g_block_size); + CONSTANT c_min_nof_interval : NATURAL := g_block_size / c_gcd; + + -- choose c_nof_pps and c_nof_repeat > c_min_nof_interval, because the + -- fractional sync pattern will repeat every c_min_nof_interval number + -- of g_pps_intervals. + CONSTANT c_factor : NATURAL := 3; + CONSTANT c_nof_pps : NATURAL := c_min_nof_interval * c_factor; + CONSTANT c_nof_repeat : NATURAL := c_min_nof_interval * c_factor; CONSTANT c_clk_period : TIME := 10 ns; CONSTANT c_bsn_w : NATURAL := 31; @@ -119,6 +126,9 @@ ARCHITECTURE tb OF tb_dp_bsn_source_v2 IS SIGNAL prev_bs_valid : STD_LOGIC; SIGNAL bs_starts_cnt : NATURAL := 0; + SIGNAL dbg_c_nof_pps : NATURAL := c_nof_pps; + SIGNAL dbg_c_nof_repeat : NATURAL := c_nof_repeat; + SIGNAL dbg_nof_blk : NATURAL; SIGNAL dbg_accumulate : NATURAL; SIGNAL dbg_expected_bsn : NATURAL; @@ -181,7 +191,7 @@ BEGIN tb_state <= s_dp_on; dp_on_pps <= '0'; dp_on <= '1'; - proc_common_wait_some_cycles(clk, g_nof_pps*g_pps_interval); + proc_common_wait_some_cycles(clk, c_nof_pps*g_pps_interval); tb_state <= s_disable; dp_on <= '0'; dp_on_pps <= '0'; @@ -212,7 +222,7 @@ BEGIN tb_state <= s_dp_on_pps; dp_on_pps <= '1'; dp_on <= '1'; - proc_common_wait_some_cycles(clk, g_nof_pps*g_pps_interval); + proc_common_wait_some_cycles(clk, c_nof_pps*g_pps_interval); tb_state <= s_disable; dp_on <= '0'; dp_on_pps <= '0'; @@ -238,7 +248,8 @@ BEGIN --proc_dp_verify_sync(clk, verify_sync, bs_sosi.sync, exp_grid.sop, exp_grid.sync); -- Verify sync at sop and at expected_sync -- Verify sync at sop and at expected_sync - proc_dp_verify_sync(g_pps_interval, + proc_dp_verify_sync(0, -- start bsn of PPS grid and BSN grid is 0, see [1] + g_pps_interval, g_block_size, clk, verify_en, @@ -267,10 +278,20 @@ BEGIN END IF; END PROCESS; - -- Verify that bs_sosi.valid = '1' did happen after dp_on + -- Verify that bs_sosi.valid = '1' did happen after dp_on by verifying bs_start prev_bs_valid <= bs_sosi.valid WHEN rising_edge(clk); bs_starts_cnt <= bs_starts_cnt + 1 WHEN rising_edge(clk) AND bs_sosi.valid = '1' AND prev_bs_valid = '0'; + p_verify_bs_restart : PROCESS(clk) + BEGIN + IF rising_edge(clk) THEN + IF bs_restart = '1' THEN + ASSERT bs_sosi.sync = '1' REPORT "Unexpected bs_start while bs_sosi.sync /= 1" SEVERITY ERROR; + ASSERT prev_bs_valid = '0' REPORT "Unexpected bs_start while prev_bs_valid /= 0" SEVERITY ERROR; + END IF; + END IF; + END PROCESS; + ----------------------------------------------------------------------------- -- DUT: dp_bsn_source_v2 ----------------------------------------------------------------------------- diff --git a/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_source_v2.vhd b/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_source_v2.vhd index b893581245a4262daf58758174bb4fd8ba9558fd..63a5385422a3adbef497d38fbdd597664134d926 100644 --- a/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_source_v2.vhd +++ b/libraries/base/dp/tb/vhdl/tb_tb_dp_bsn_source_v2.vhd @@ -25,7 +25,7 @@ USE IEEE.std_logic_1164.ALL; USE work.tb_dp_pkg.ALL; --- > as 2 +-- > as 4 -- > run -all --> OK ENTITY tb_tb_dp_bsn_source_v2 IS @@ -33,30 +33,44 @@ END tb_tb_dp_bsn_source_v2; ARCHITECTURE tb OF tb_tb_dp_bsn_source_v2 IS - SIGNAL tb_end : STD_LOGIC := '0'; -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end' - CONSTANT c_nof_pps : NATURAL := 50; -- choose > g_block_size, because the fractional sync pattern will repeat - -- within g_block_size number of g_pps_interval's + SIGNAL tb_end : STD_LOGIC := '0'; -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end' BEGIN -- from tb_dp_bsn_source_v2.vhd -- - -- g_nof_pps : NATURAL := 20; -- g_pps_interval : NATURAL := 240 - -- g_block_size : NATURAL := 32 + -- g_block_size : NATURAL := 32 + + -- test integer case + u_20_10 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (20, 10); -- 20 // 10 = 2, 20 MOD 10 = 0, 20/10 = 2 block/sync + u_22_11 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (22, 11); -- 22 // 11 = 2, 22 MOD 11 = 0, 22/11 = 2 block/sync + u_39_13 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (39, 13); -- 39 // 13 = 3, 39 MOD 13 = 0, 39/13 = 3 block/sync + + -- test smallest nof block per sync + u_10_10 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (10, 10); -- 1 block/sync + u_5_5 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (5, 5); -- 1 block/sync + + -- test smallest g_block_size case + u_3_3 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (3, 3); -- 3 // 3 = 1, 3 MOD 3 = 0, 3/3 = 1 block/sync + u_6_3 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (6, 3); -- 6 // 3 = 2, 6 MOD 3 = 0, 6/3 = 2 block/sync + u_7_3 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (7, 3); -- 7 // 3 = 2, 7 MOD 3 = 1, 7/3 = 2.33 block/sync - -- test different clk_per_sync - u_230_32_div_7_mod_6 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 230, 32); -- 230 / 32 = 7, 230 MOD 32 = 6 - u_240_32_div_7_mod_16 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 240, 32); -- 240 / 32 = 7, 240 MOD 32 = 16 - u_248_32_div_7_mod_24 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 248, 32); -- 248 / 32 = 7, 248 MOD 32 = 24 + -- test lofar case with 0.5 fraction in average nof block/sync + u_20_8 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (20, 8); -- 20 // 8 = 2, 20 MOD 8 = 4, 20/8 = 2.5 block/sync - -- test different block_size's - u_240_27_div_8_mod_24 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 240, 27); -- 240 / 27 = 8, 240 MOD 27 = 24 - u_240_30_div_8_mod_0 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 240, 30); -- 240 / 30 = 8, 240 MOD 30 = 0 + -- test fractional (corner) cases + u_18_9 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (18, 9); -- 18 MOD 9 = 0 + u_17_9 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (17, 9); -- 17 MOD 9 = 8 = g_block_size - 1 + u_19_9 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (19, 9); -- 19 MOD 9 = 1 + u_20_9 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (20, 9); -- 20 MOD 9 = 2 + u_25_9 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (25, 9); -- 25 MOD 9 = 7 + u_26_9 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (26, 9); -- 26 MOD 9 = 8 = g_block_size - 1 + u_27_9 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (27, 9); -- 27 MOD 9 = 0 -- test some prime values - u_101_17_div_5_mod_16 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 101, 17); -- 101 / 17 = 5, 101 MOD 17 = 16 - u_101_23_div_4_mod_9 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (c_nof_pps, 101, 23); -- 101 / 23 = 4, 101 MOD 23 = 9 + u_17_3 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (17, 3); -- 17 // 3 = 5, 17 MOD 3 = 2, 17/3 = 5.66 block/sync + u_101_17 : ENTITY work.tb_dp_bsn_source_v2 GENERIC MAP (101, 17); -- 101 // 17 = 5, 101 MOD 17 = 16, 101/17 = 5.9411 block/sync END tb;