diff --git a/libraries/base/dp/tb/vhdl/tb_mmp_dp_bsn_sync_scheduler.vhd b/libraries/base/dp/tb/vhdl/tb_mmp_dp_bsn_sync_scheduler.vhd index acee0b57c9f314a4600a91edad10d8a266b9d117..ce4e5f605e7efbba13cb3ec7a972a5d9b9548805 100644 --- a/libraries/base/dp/tb/vhdl/tb_mmp_dp_bsn_sync_scheduler.vhd +++ b/libraries/base/dp/tb/vhdl/tb_mmp_dp_bsn_sync_scheduler.vhd @@ -23,7 +23,7 @@ -- Usage: -- > as 5 -- > run -all - +-- . View *_64 BSN values as radix hex in Wave window to recognize BSN hi word. LIBRARY IEEE, common_lib, technology_lib; USE IEEE.std_logic_1164.ALL; @@ -46,7 +46,9 @@ ARCHITECTURE tb OF tb_mmp_dp_bsn_sync_scheduler IS CONSTANT c_dp_clk_period : TIME := 10 ns; CONSTANT c_cross_clock_domain_latency : NATURAL := 20; - CONSTANT c_nof_input_sync : NATURAL := 5; + CONSTANT c_report_note : BOOLEAN := FALSE; -- Use TRUE for tb debugging, else FALSE to keep Transcript window more empty + + CONSTANT c_nof_input_sync : NATURAL := 10; CONSTANT c_nof_block_per_input_sync : NATURAL := 17; CONSTANT c_nof_block_per_output_sync : NATURAL := 5; CONSTANT c_block_size : NATURAL := 10; @@ -55,6 +57,7 @@ ARCHITECTURE tb OF tb_mmp_dp_bsn_sync_scheduler IS -- DUT settings CONSTANT c_bsn_w : NATURAL := 40; + CONSTANT c_bsn_hi_value : NATURAL := 23; CONSTANT c_ctrl_interval_size : NATURAL := c_nof_block_per_output_sync * c_block_size; CONSTANT c_ctrl_start_bsn_lo : NATURAL := 19; CONSTANT c_ctrl_start_bsn_hi : NATURAL := 17; @@ -75,12 +78,16 @@ ARCHITECTURE tb OF tb_mmp_dp_bsn_sync_scheduler IS SIGNAL mon_current_input_bsn_64 : STD_LOGIC_VECTOR(2*c_word_w-1 DOWNTO 0); SIGNAL mon_input_bsn_at_sync_64 : STD_LOGIC_VECTOR(2*c_word_w-1 DOWNTO 0); SIGNAL mon_output_sync_bsn_64 : STD_LOGIC_VECTOR(2*c_word_w-1 DOWNTO 0); + SIGNAL mon_block_size : NATURAL; SIGNAL stimuli_sosi : t_dp_sosi; + SIGNAL in_sosi : t_dp_sosi; SIGNAL out_sosi : t_dp_sosi; SIGNAL out_start : STD_LOGIC; SIGNAL out_enable : STD_LOGIC; + SIGNAL verify_bsn_hi : STD_LOGIC := '0'; + BEGIN dp_clk <= (NOT dp_clk) OR tb_end AFTER c_dp_clk_period/2; @@ -102,6 +109,15 @@ BEGIN --------------------------------------------------------------------------- -- Initial check --------------------------------------------------------------------------- + -- . Read mon_block_size + proc_mem_mm_bus_rd(11, mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_rd_latency(1, mm_clk); + mon_block_size <= TO_UINT(reg_miso.rddata(c_word_w-1 DOWNTO 0)); + + -- . Verify mon_block_size + proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mon_block_size = c_block_size REPORT "Wrong block_size." SEVERITY ERROR; + -- . Read mon_output_enable proc_mem_mm_bus_rd(8, mm_clk, reg_miso, reg_mosi); proc_mem_mm_bus_rd_latency(1, mm_clk); @@ -217,7 +233,9 @@ BEGIN proc_mem_mm_bus_rd_latency(1, mm_clk); mon_current_input_bsn_64(2*c_word_w-1 DOWNTO c_word_w) <= reg_miso.rddata(c_word_w-1 DOWNTO 0); proc_common_wait_some_cycles(mm_clk, 1); - REPORT "mon_current_input_bsn : " & int_to_str(v_bsn) & ", " & int_to_str(TO_UINT(mon_current_input_bsn_64)) SEVERITY NOTE; + IF c_report_note THEN + REPORT "mon_current_input_bsn : " & int_to_str(v_bsn) & ", " & int_to_str(TO_UINT(mon_current_input_bsn_64)) SEVERITY NOTE; + END IF; ASSERT v_bsn < TO_UINT(mon_current_input_bsn_64) REPORT "DUT mon_current_input_bsn is not incrementing." SEVERITY ERROR; -- . Check mon_input_bsn_at_sync_64 @@ -229,7 +247,9 @@ BEGIN proc_mem_mm_bus_rd_latency(1, mm_clk); mon_input_bsn_at_sync_64(2*c_word_w-1 DOWNTO c_word_w) <= reg_miso.rddata(c_word_w-1 DOWNTO 0); proc_common_wait_some_cycles(mm_clk, 1); - REPORT "mon_input_bsn_at_sync : " & int_to_str(v_bsn) & ", " & int_to_str(TO_UINT(mon_input_bsn_at_sync_64)) SEVERITY NOTE; + IF c_report_note THEN + REPORT "mon_input_bsn_at_sync : " & int_to_str(v_bsn) & ", " & int_to_str(TO_UINT(mon_input_bsn_at_sync_64)) SEVERITY NOTE; + END IF; ASSERT v_bsn < TO_UINT(mon_input_bsn_at_sync_64) REPORT "DUT mon_input_bsn_at_sync is not incrementing." SEVERITY ERROR; ASSERT (TO_UINT(mon_input_bsn_at_sync_64) - v_bsn) MOD c_nof_block_per_input_sync = 0 REPORT "TB input_sync interval is not correct." SEVERITY ERROR; @@ -242,10 +262,53 @@ BEGIN proc_mem_mm_bus_rd_latency(1, mm_clk); mon_output_sync_bsn_64(2*c_word_w-1 DOWNTO c_word_w) <= reg_miso.rddata(c_word_w-1 DOWNTO 0); proc_common_wait_some_cycles(mm_clk, 1); - REPORT "mon_output_sync_bsn : " & int_to_str(v_bsn) & ", " & int_to_str(TO_UINT(mon_output_sync_bsn_64)) SEVERITY NOTE; + IF c_report_note THEN + REPORT "mon_output_sync_bsn : " & int_to_str(v_bsn) & ", " & int_to_str(TO_UINT(mon_output_sync_bsn_64)) SEVERITY NOTE; + END IF; ASSERT v_bsn < TO_UINT(mon_output_sync_bsn_64) REPORT "DUT mon_output_sync_bsn is not incrementing." SEVERITY ERROR; ASSERT (TO_UINT(mon_output_sync_bsn_64) - v_bsn) MOD c_nof_block_per_output_sync = 0 REPORT "DUT output_sync interval is not correct." SEVERITY ERROR; + --------------------------------------------------------------------------- + -- Verify BSN hi word + --------------------------------------------------------------------------- + -- . wait until input block boundary + proc_common_wait_until_high(dp_clk, stimuli_sosi.sop); + verify_bsn_hi <= '1'; + proc_common_wait_some_cycles(dp_clk, c_block_size*c_nof_block_per_input_sync * 2); + + -- . Read mon_current_input_bsn_64 + proc_mem_mm_bus_rd(4, mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_rd_latency(1, mm_clk); + mon_current_input_bsn_64(c_word_w-1 DOWNTO 0) <= reg_miso.rddata(c_word_w-1 DOWNTO 0); + proc_mem_mm_bus_rd(5, mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_rd_latency(1, mm_clk); + mon_current_input_bsn_64(2*c_word_w-1 DOWNTO c_word_w) <= reg_miso.rddata(c_word_w-1 DOWNTO 0); + + -- . Read mon_input_bsn_at_sync_64 + proc_mem_mm_bus_rd(6, mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_rd_latency(1, mm_clk); + mon_input_bsn_at_sync_64(c_word_w-1 DOWNTO 0) <= reg_miso.rddata(c_word_w-1 DOWNTO 0); + proc_mem_mm_bus_rd(7, mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_rd_latency(1, mm_clk); + mon_input_bsn_at_sync_64(2*c_word_w-1 DOWNTO c_word_w) <= reg_miso.rddata(c_word_w-1 DOWNTO 0); + + -- . Read mon_output_sync_bsn_64 + proc_mem_mm_bus_rd(9, mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_rd_latency(1, mm_clk); + mon_output_sync_bsn_64(c_word_w-1 DOWNTO 0) <= reg_miso.rddata(c_word_w-1 DOWNTO 0); + proc_mem_mm_bus_rd(10, mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_rd_latency(1, mm_clk); + mon_output_sync_bsn_64(2*c_word_w-1 DOWNTO c_word_w) <= reg_miso.rddata(c_word_w-1 DOWNTO 0); + proc_common_wait_some_cycles(mm_clk, 1); + + -- The out_sosi.bsn will not reach the c_bsn_hi_value, because the + -- dp_bsn_sync_scheduler will be busy trying to catch up, see + -- nxt_r.update_bsn = '1' in dp_bsn_sync_scheduler.vhd. Therefore + -- expected mon_output_sync_bsn_64 hi value is still 0. + ASSERT c_bsn_hi_value = TO_UINT(mon_current_input_bsn_64(2*c_word_w-1 DOWNTO c_word_w)) REPORT "Wrong mon_current_input_bsn high word." SEVERITY ERROR; + ASSERT c_bsn_hi_value = TO_UINT(mon_input_bsn_at_sync_64(2*c_word_w-1 DOWNTO c_word_w)) REPORT "Wrong mon_input_bsn_at_sync high word." SEVERITY ERROR; + ASSERT 0 = TO_UINT(mon_output_sync_bsn_64( 2*c_word_w-1 DOWNTO c_word_w)) REPORT "Wrong mon_output_sync_bsn high word." SEVERITY ERROR; + --------------------------------------------------------------------------- -- Disable and verify DUT output --------------------------------------------------------------------------- @@ -267,16 +330,28 @@ BEGIN ASSERT mon_output_enable = '0' REPORT "DUT mon_output_enable is not diabled." SEVERITY ERROR; ASSERT out_enable = '0' REPORT "DUT output_enable is not enabled." SEVERITY ERROR; + --------------------------------------------------------------------------- + -- End of test + --------------------------------------------------------------------------- proc_common_wait_until_high(dp_clk, stimuli_end); tb_end <= '1'; WAIT; - END PROCESS; - + END PROCESS; ------------------------------------------------------------------------------ -- Streaming stimuli ------------------------------------------------------------------------------ + p_in_sosi : PROCESS(stimuli_sosi, verify_bsn_hi) + BEGIN + in_sosi <= stimuli_sosi; + + IF verify_bsn_hi = '1' THEN + -- Set hi word of input BSN + in_sosi.bsn(2*c_word_w-1 DOWNTO c_word_w) <= TO_UVEC(c_bsn_hi_value, c_word_w); + END IF; + END PROCESS; + -- Generate data blocks with input sync u_stimuli : ENTITY work.dp_stream_stimuli GENERIC MAP ( @@ -321,7 +396,7 @@ BEGIN reg_miso => reg_miso, -- Streaming - in_sosi => stimuli_sosi, + in_sosi => in_sosi, out_sosi => out_sosi, out_start => out_start, out_enable => out_enable