diff --git a/libraries/base/dp/tb/vhdl/tb_dp_pkg.vhd b/libraries/base/dp/tb/vhdl/tb_dp_pkg.vhd index 5f17d869a6c41027a47f14a33c9e6694d38fbd78..6e60576827b6b82a8cf5868f626744dfcf28322a 100644 --- a/libraries/base/dp/tb/vhdl/tb_dp_pkg.vhd +++ b/libraries/base/dp/tb/vhdl/tb_dp_pkg.vhd @@ -53,10 +53,6 @@ PACKAGE tb_dp_pkg IS -- . To run all stimuli in Modelsim do: -- > as 10 -- > run 400 us - -- - -- References: - -- [1] https://support.astron.nl/confluence/pages/viewpage.action?spaceKey=L2M&title=L2+STAT+Decision%3A+Timing+in+Station - -- ------------------------------------------------------------------------------ CONSTANT clk_period : TIME := 10 ns; -- 100 MHz @@ -493,7 +489,8 @@ PACKAGE tb_dp_pkg IS SIGNAL sop : IN STD_LOGIC; SIGNAL bsn : IN STD_LOGIC_VECTOR); - PROCEDURE proc_dp_verify_sync(CONSTANT c_sync_period : IN NATURAL; + PROCEDURE proc_dp_verify_sync(CONSTANT c_start_bsn : IN NATURAL; + CONSTANT c_sync_period : IN NATURAL; CONSTANT c_block_size : IN NATURAL; SIGNAL clk : IN STD_LOGIC; SIGNAL verify_en : IN STD_LOGIC; @@ -2378,14 +2375,13 @@ PACKAGE BODY tb_dp_pkg IS ------------------------------------------------------------------------------ -- PROCEDURE: Verify the DUT output sync - -- . assume PPS and BSN grid as in [1] -- . sync is defined such that it can only be active at sop -- . assume that the fractional sync period varies between N and N-1 blocks - -- . c_start_bsn = 0 is at start of PPS and BSN grid, so BSN = 0 has a PPS. -- . the fractional sync period starts with N blocks and fits e.g. -- dp_bsn_source_v2, dp_bsn_sync_scheduler. ------------------------------------------------------------------------------ - PROCEDURE proc_dp_verify_sync(CONSTANT c_sync_period : IN NATURAL; -- number of sample per sync period + PROCEDURE proc_dp_verify_sync(CONSTANT c_start_bsn : IN NATURAL; -- BSN of first sync, start of fractional periods + CONSTANT c_sync_period : IN NATURAL; -- number of sample per sync period CONSTANT c_block_size : IN NATURAL; -- number of sample per block SIGNAL clk : IN STD_LOGIC; SIGNAL verify_en : IN STD_LOGIC; @@ -2396,12 +2392,11 @@ PACKAGE BODY tb_dp_pkg IS SIGNAL dbg_nof_blk : OUT NATURAL; SIGNAL dbg_accumulate : OUT NATURAL; SIGNAL dbg_expected_bsn : OUT NATURAL) IS - CONSTANT c_start_bsn : NATURAL := 0; -- BSN of first sync, start of fractional periods CONSTANT c_bsn_w : NATURAL := sel_a_b(bsn'LENGTH>31, 31, bsn'LENGTH); -- use maximally c_natural_w = 31 bit of BSN slv to allow calculations with integers CONSTANT c_nof_blk_min : NATURAL := c_sync_period / c_block_size; -- minimum number of blocks in sync period CONSTANT c_extra : NATURAL := c_sync_period MOD c_block_size; -- number of extra samples in sync period VARIABLE v_bsn : NATURAL := TO_UINT(bsn(c_bsn_w-1 DOWNTO 0)); - VARIABLE v_expected_sync : BOOLEAN := FALSE; + VARIABLE v_expected_sync : BOOLEAN := FALSE; -- default FALSE, e.g. when bsn < c_start_bsn is in the past VARIABLE v_expected_bsn : NATURAL := c_start_bsn; -- BSN that is expected to have a sync, intialize with start BSN VARIABLE v_nof_blk : NATURAL := c_nof_blk_min + 1; -- number of blocks in period, first sync period will be 1 block longer to achieve the fraction part VARIABLE v_accumulate : INTEGER := c_block_size - c_extra; -- number of extra samples in period, first sync period will have v_accumulate more @@ -2410,7 +2405,7 @@ PACKAGE BODY tb_dp_pkg IS IF c_extra = 0 THEN -- The sync period contains an integer number of blocks (c_extra = 0) -- Determine directly whether the input bsn is expected to have a sync - v_expected_sync := (v_bsn MOD c_nof_blk_min) = 0; + v_expected_sync := ((v_bsn - c_start_bsn) MOD c_nof_blk_min = 0); ELSE -- The sync period contains a fractional number of blocks -- Determine next expected BSN with sync until the input bsn is reached using a loop @@ -2418,19 +2413,21 @@ PACKAGE BODY tb_dp_pkg IS v_expected_bsn := v_expected_bsn + v_nof_blk; -- next expected BSN to have a sync v_nof_blk := c_nof_blk_min; - v_accumulate := v_accumulate - c_extra; + v_accumulate := v_accumulate - c_extra; IF v_accumulate < 0 THEN v_nof_blk := v_nof_blk + 1; - v_accumulate := v_accumulate + c_block_size; + v_accumulate := v_accumulate + c_block_size; END IF; END LOOP; v_expected_sync := (v_bsn = v_expected_bsn); END IF; - -- Debug signals, for view in Wave window - dbg_nof_blk <= v_nof_blk; - dbg_accumulate <= v_accumulate; - dbg_expected_bsn <= v_expected_bsn; + IF verify_en = '1' THEN + -- Debug signals, for view in Wave window + dbg_nof_blk <= v_nof_blk; + dbg_accumulate <= v_accumulate; + dbg_expected_bsn <= v_expected_bsn; + END IF; -- Report sync and v_expected_sync proc_dp_verify_sync(clk, verify_en, sync, sop, v_bsn, v_expected_bsn, to_sl(v_expected_sync));