diff --git a/libraries/base/dp/tb/vhdl/tb_dp_bsn_sync_scheduler.vhd b/libraries/base/dp/tb/vhdl/tb_dp_bsn_sync_scheduler.vhd index 1fc9befefb64f95e626b59894d0a2e94830d2eef..6ce8ab3ad0c35044bf61dab3bb03a52eb2bcde9e 100644 --- a/libraries/base/dp/tb/vhdl/tb_dp_bsn_sync_scheduler.vhd +++ b/libraries/base/dp/tb/vhdl/tb_dp_bsn_sync_scheduler.vhd @@ -40,9 +40,9 @@ -- -- Development steps: -- . Step 1 ~1 day work (idea started earlier, so requirements were clear), --- steps 2,5 ~1.5 days work (fixing details and verifying all features), --- steps 3,4 ~0.5 day work, --- total ~3 days work spent in ~ 1 week. +-- steps 2,5 ~2 days work (fixing details and verifying all features), +-- steps 3,4 ~1 day work, +-- total ~4 days work spent in ~ 1 week. -- 1a Draft design description of dp_bsn_sync_scheduler -- b Initial implementation that compiles -- 2a Initial tb using u_stimuli to generate in_sosi and using p_stimuli @@ -130,7 +130,7 @@ ARCHITECTURE tb OF tb_dp_bsn_sync_scheduler IS SIGNAL ctrl_enable_evt : STD_LOGIC := '0'; SIGNAL ctrl_interval_size : NATURAL := g_nof_samples_per_output_sync; SIGNAL ctrl_start_bsn : STD_LOGIC_VECTOR(c_bsn_w-1 DOWNTO 0) := (OTHERS=>'0'); - SIGNAL mon_input_current_bsn : STD_LOGIC_VECTOR(c_bsn_w-1 DOWNTO 0); + SIGNAL mon_current_input_bsn : STD_LOGIC_VECTOR(c_bsn_w-1 DOWNTO 0); SIGNAL mon_input_bsn_at_sync : STD_LOGIC_VECTOR(c_bsn_w-1 DOWNTO 0); SIGNAL mon_output_enable : STD_LOGIC; SIGNAL mon_output_sync_bsn : STD_LOGIC_VECTOR(c_bsn_w-1 DOWNTO 0); @@ -161,7 +161,6 @@ ARCHITECTURE tb OF tb_dp_bsn_sync_scheduler IS SIGNAL verifying_sync_equal : STD_LOGIC := '0'; SIGNAL prev_out_enable : STD_LOGIC := '0'; - SIGNAL pending_out_enable : STD_LOGIC := '0'; SIGNAL pending_out_disable : STD_LOGIC := '0'; SIGNAL expected_out_enable : STD_LOGIC := '0'; SIGNAL expecting_out_start : STD_LOGIC := '0'; @@ -358,56 +357,39 @@ BEGIN END IF; END PROCESS; - p_expected_out_enable : PROCESS(ctrl_enable, ctrl_enable_evt, in_sosi, ctrl_start_bsn, out_enable, pending_out_enable, pending_out_disable, hold_out_eop) + -- Determine expected out_enable + p_expected_out_enable : PROCESS(ctrl_enable, ctrl_enable_evt, in_sosi, ctrl_start_bsn, out_enable, pending_out_disable, hold_out_eop) BEGIN - -- Determine expected out_enable - IF ctrl_enable = '1' THEN - -- Detect output enable event - IF ctrl_enable_evt = '1' THEN - -- Determine whether the output enable event is scheduled in the future - IF UNSIGNED(in_sosi.bsn) < UNSIGNED(ctrl_start_bsn) THEN - pending_out_enable <= '1'; - - -- Detect output re-enable event, to plan output disable before re-enable - IF out_enable = '1' THEN - IF hold_out_eop = '1' THEN - expected_out_enable <= '0'; - ELSE - pending_out_disable <= '1'; - END IF; - END IF; - END IF; -- else ignore output enable event in the past - END IF; + -- Expect output disable after ctrl_enable_evt + IF ctrl_enable_evt = '1' THEN + IF out_enable = '0' THEN + -- Output is already disabled + expected_out_enable <= '0'; + ELSE + -- Output is enabled, so this is a re-enable event. + IF hold_out_eop = '1' THEN + expected_out_enable <= '0'; -- end of block, so output can disable immediately + ELSE + pending_out_disable <= '1'; -- plan output disable before re-enable + END IF; + END IF; + END IF; - -- Enable expected_out_enable at start BSN (and at in_sosi.sop) - IF pending_out_enable = '1' THEN - IF UNSIGNED(in_sosi.bsn) >= UNSIGNED(ctrl_start_bsn) THEN - expected_out_enable <= '1'; - pending_out_enable <= '0'; - END IF; - END IF; - ELSE - -- Immediately remove any pending output enable - pending_out_enable <= '0'; - - -- Detect output disable event, to plan output disable - IF ctrl_enable_evt = '1' THEN - IF hold_out_eop = '1' THEN - expected_out_enable <= '0'; - ELSE - pending_out_disable <= '1'; - END IF; + IF pending_out_disable <= '1' THEN + IF hold_out_eop = '1' THEN + expected_out_enable <= '0'; -- end of block, so output can disable + pending_out_disable <= '0'; END IF; END IF; - -- Expected out_enable disabled between block boundaries - IF pending_out_disable = '1' AND hold_out_eop = '1' THEN - expected_out_enable <= '0'; - pending_out_disable <= '0'; + -- Expect output enable at start BSN + IF ctrl_enable = '1' THEN + IF UNSIGNED(in_sosi.bsn) >= UNSIGNED(ctrl_start_bsn) THEN + expected_out_enable <= '1'; + END IF; END IF; END PROCESS; - p_verify_out_enable : PROCESS(clk) BEGIN -- Use registered values to compare, to avoid combinatorial differences @@ -470,7 +452,7 @@ BEGIN REPORT "Unexpected out_start" SEVERITY ERROR; END IF; - -- Check when out_enable goes high whether out_start is missed + -- Check that out_start is active when out_enable goes high IF out_start = '0' AND out_enable = '1' AND prev_out_enable = '0' THEN REPORT "Missed out_start" SEVERITY ERROR; END IF; @@ -509,20 +491,7 @@ BEGIN ----------------------------------------------------------------------------- -- . Verify out_sosi.sync interval ----------------------------------------------------------------------------- - p_verify_sync : PROCESS(clk) - BEGIN - IF rising_edge(clk) THEN - IF ctrl_enable = '1' AND ctrl_enable_evt = '1' THEN - verify_sync <= '0'; -- request for new sync interval - ELSIF out_start = '1' THEN - verify_sync <= '1'; -- new sync interval has started; - END IF; - - IF recover_from_in_lost = '1' THEN - verify_sync <= '0'; -- after long input lost, first output_sync may get lost during catch up - END IF; - END IF; - END PROCESS; + verify_sync <= NOT recover_from_in_lost; proc_dp_verify_sync(TO_UINT(ctrl_start_bsn), ctrl_interval_size, @@ -553,8 +522,8 @@ BEGIN IF rising_edge(clk) THEN IF recover_from_in_lost = '0' THEN IF out_sop_dly = '1' THEN - v_bsn_min := TO_UINT(mon_input_current_bsn) - 1; - v_bsn_max := TO_UINT(mon_input_current_bsn) + c_output_nof_blocks_min + 1; + v_bsn_min := TO_UINT(mon_current_input_bsn) - 1; + v_bsn_max := TO_UINT(mon_current_input_bsn) + c_output_nof_blocks_min + 1; ASSERT TO_UINT(mon_output_sync_bsn) >= v_bsn_min REPORT "Wrong: mon_output_sync_bsn is behind (" & int_to_str(TO_UINT(mon_output_sync_bsn)) & " < " & int_to_str(v_bsn_min) & ")" SEVERITY ERROR; @@ -562,7 +531,7 @@ BEGIN REPORT "Wrong: mon_output_sync_bsn is too far ahead (" & int_to_str(TO_UINT(mon_output_sync_bsn)) & " > " & int_to_str(v_bsn_max) & ")" SEVERITY ERROR; --Debug report used to investigate v_bsn_min and v_bsn_max assert conditions - --REPORT int_to_str(TO_UINT(mon_output_sync_bsn)) & " : " & int_to_str(TO_UINT(mon_input_current_bsn)) SEVERITY NOTE; + --REPORT int_to_str(TO_UINT(mon_output_sync_bsn)) & " : " & int_to_str(TO_UINT(mon_current_input_bsn)) SEVERITY NOTE; END IF; END IF; END IF; @@ -588,7 +557,7 @@ BEGIN ctrl_enable_evt => ctrl_enable_evt, ctrl_interval_size => ctrl_interval_size, ctrl_start_bsn => ctrl_start_bsn, - mon_input_current_bsn => mon_input_current_bsn, + mon_current_input_bsn => mon_current_input_bsn, mon_input_bsn_at_sync => mon_input_bsn_at_sync, mon_output_enable => mon_output_enable, mon_output_sync_bsn => mon_output_sync_bsn,