diff --git a/libraries/base/dp/tb/vhdl/tb_dp_block_gen.vhd b/libraries/base/dp/tb/vhdl/tb_dp_block_gen.vhd index c1f0a74c2641dac6656dd31e02848772ebc82276..84cf3e5107796f2bee35dcb0323cebd68a8d60f6 100644 --- a/libraries/base/dp/tb/vhdl/tb_dp_block_gen.vhd +++ b/libraries/base/dp/tb/vhdl/tb_dp_block_gen.vhd @@ -38,11 +38,11 @@ USE dp_lib.tb_dp_pkg.ALL; ENTITY tb_dp_block_gen IS GENERIC ( - g_use_src_in : BOOLEAN := TRUE; + g_use_src_in : BOOLEAN := FALSE; g_nof_data_per_block : NATURAL := 11; - g_nof_blk_per_sync : NATURAL := 8; + g_nof_blk_per_sync : NATURAL := 1; g_enable : t_dp_flow_control_enum := e_active; -- always e_active or e_pulse block generator enable - g_out_ready : t_dp_flow_control_enum := e_random; -- always e_active, e_random or e_pulse flow control + g_out_ready : t_dp_flow_control_enum := e_active; -- always e_active, e_random or e_pulse flow control g_nof_repeat : NATURAL := 100 ); END tb_dp_block_gen; @@ -54,25 +54,36 @@ ARCHITECTURE tb OF tb_dp_block_gen IS CONSTANT c_pulse_active : NATURAL := 1; CONSTANT c_pulse_period : NATURAL := 7; + CONSTANT c_bsn_init : NATURAL := 3; + SIGNAL tb_end : STD_LOGIC := '0'; SIGNAL clk : STD_LOGIC := '1'; SIGNAL rst : STD_LOGIC := '1'; + SIGNAL sl1 : STD_LOGIC := '1'; SIGNAL random : STD_LOGIC_VECTOR(15 DOWNTO 0) := (OTHERS=>'0'); -- use different lengths to have different random sequences SIGNAL pulse : STD_LOGIC; SIGNAL pulse_en : STD_LOGIC := '1'; SIGNAL enable : STD_LOGIC; + SIGNAL ready : STD_LOGIC; SIGNAL ref_sosi : t_dp_sosi := c_dp_sosi_rst; SIGNAL out_siso : t_dp_siso := c_dp_siso_rdy; SIGNAL out_sosi : t_dp_sosi; SIGNAL prev_out_sosi : t_dp_sosi; SIGNAL prev_out_ready : STD_LOGIC_VECTOR(0 TO c_rl); - SIGNAL out_gap : STD_LOGIC; + SIGNAL out_gap : STD_LOGIC := '0'; + SIGNAL hold_sop : STD_LOGIC := '0'; + SIGNAL exp_size : NATURAL := g_nof_data_per_block; + SIGNAL cnt_size : NATURAL := 0; SIGNAL verify_en : STD_LOGIC := '0'; SIGNAL verify_bsn_en : STD_LOGIC := '0'; + SIGNAL verify_done : STD_LOGIC := '0'; + SIGNAL verify_valid : STD_LOGIC := '0'; + SIGNAL verify_sop : STD_LOGIC := '0'; + SIGNAL verify_eop : STD_LOGIC := '0'; BEGIN @@ -87,9 +98,9 @@ BEGIN -- STREAM CONTROL ------------------------------------------------------------------------------ - out_siso.ready <= '1' WHEN g_out_ready=e_active ELSE - random(random'HIGH) WHEN g_out_ready=e_random ELSE - pulse WHEN g_out_ready=e_pulse; + ready <= '1' WHEN g_out_ready=e_active ELSE + random(random'HIGH) WHEN g_out_ready=e_random ELSE + pulse WHEN g_out_ready=e_pulse; ------------------------------------------------------------------------------ @@ -115,15 +126,21 @@ BEGIN -- End of stimuli proc_common_wait_some_cycles(clk, 100); + proc_common_gen_pulse(clk, verify_done); + proc_common_wait_some_cycles(clk, 10); tb_end <= '1'; WAIT; END PROCESS; - ref_sosi.valid <= '0' WHEN g_nof_blk_per_sync=0 ELSE out_siso.ready; + -- input data ref_sosi.data <= INCR_UVEC(ref_sosi.data, 1) WHEN out_siso.ready='1' AND rising_edge(clk); ref_sosi.re <= INCR_UVEC(ref_sosi.re, 2) WHEN out_siso.ready='1' AND rising_edge(clk); ref_sosi.im <= INCR_UVEC(ref_sosi.im, 3) WHEN out_siso.ready='1' AND rising_edge(clk); + -- flow control via input valid or via output ready + ref_sosi.valid <= '0' WHEN g_use_src_in=TRUE ELSE ready; + out_siso.ready <= '1' WHEN g_use_src_in=FALSE ELSE ready; + ------------------------------------------------------------------------------ -- VERIFICATION ------------------------------------------------------------------------------ @@ -141,11 +158,25 @@ BEGIN END LOOP; END PROCESS; + -- Verify that the stimuli have been applied at all + verify_valid <= '1' WHEN out_sosi.valid='1' AND rising_edge(clk); + verify_sop <= '1' WHEN out_sosi.sop='1' AND rising_edge(clk); + verify_eop <= '1' WHEN out_sosi.eop='1' AND rising_edge(clk); + proc_dp_verify_value("out_sosi.valid", clk, verify_done, sl1, verify_valid); + proc_dp_verify_value("out_sosi.sop", clk, verify_done, sl1, verify_sop); + proc_dp_verify_value("out_sosi.eop", clk, verify_done, sl1, verify_eop); + -- Verify some general streaming interface properties proc_dp_verify_valid(c_rl, clk, verify_en, out_siso.ready, prev_out_ready, out_sosi.valid); -- Verify that the out_sosi valid fits with the ready latency proc_dp_verify_gap_invalid(clk, out_sosi.valid, out_sosi.sop, out_sosi.eop, out_gap); -- Verify that the out_sosi valid is low between blocks proc_dp_verify_data("BSN", clk, verify_bsn_en, out_sosi.sop, out_sosi.bsn, prev_out_sosi.bsn); - + + -- Verify intervals + proc_dp_verify_sync(g_nof_blk_per_sync, c_bsn_init, clk, verify_en, out_sosi.sync, out_sosi.sop, out_sosi.bsn); + + proc_dp_verify_sop_and_eop(c_rl, clk, out_siso.ready, out_sosi.valid, out_sosi.sop, out_sosi.eop, hold_sop); + + proc_dp_verify_block_size(exp_size, clk, out_sosi.valid, out_sosi.sop, out_sosi.eop, cnt_size); ------------------------------------------------------------------------------ -- DUT : dp_block_gen @@ -158,7 +189,8 @@ BEGIN g_nof_blk_per_sync => g_nof_blk_per_sync, g_empty => 1, g_channel => 2, - g_error => 3 + g_error => 3, + g_bsn => c_bsn_init ) PORT MAP ( rst => rst,