diff --git a/libraries/base/dp/tb/vhdl/tb_dp_packet_merge_unmerge.vhd b/libraries/base/dp/tb/vhdl/tb_dp_packet_merge_unmerge.vhd index 24e34cbaf24916cfd18356d48c1a80dfd0351acd..3d62c5a15a635d757530e66cae1662f2d86cd6d5 100644 --- a/libraries/base/dp/tb/vhdl/tb_dp_packet_merge_unmerge.vhd +++ b/libraries/base/dp/tb/vhdl/tb_dp_packet_merge_unmerge.vhd @@ -21,11 +21,24 @@ -- Purpose: -- . Test bench for dp_packet_merge and dp_packet_unmerge -- Description: --- . The p_stimuli_st uses proc_dp_gen_block_data to generate g_nof_repeat packets for the DUT. The output of the DUT needs --- to be similar e.g. by means of an inverse DUT component so that the proc_dp_verify_* procedures can be used to verify --- that the counter data in the sosi data fields is passed on correctly. Furthermore the proc_dp_verify_* procedures --- verify that the test bench has yielded output results at all and that the output valid, sop, eop, and ready fits the --- streaming interface specification. +-- . The p_stimuli_st uses proc_dp_gen_block_data to generate g_nof_repeat +-- stimuli_src_out packets of length g_pkt_len_merge. +-- The u_dp_packet_merge merges g_nof_pkt packets from stimuli_src_out into +-- dp_packet_merge_src_out. +-- The p_stimuli_unmerge provides stimuli for the .err and .empty fields of +-- dp_packet_merge_src_out to get dp_packet_merge_sosi +-- The u_dp_packet_unmerge unmerges the dp_packet_merge_sosi into packets +-- of length g_pkt_len_unmerge into verify_snk_in. +-- If g_pkt_len_unmerge /= g_pkt_len_merge, then the last unmerged packet +-- may be shorter then g_pkt_len_unmerge, to contain the remaining data. +-- +-- p_stimuli_st --> u_dp_packet_merge --+--> u_dp_packet_unmerge --> p_verify +-- ^ +-- | +-- p_stimuli_unmerge --/ +-- +-- . Flow control is verified via g_flow_control_*. +-- -- Usage: -- > as 10 -- > run -all @@ -49,11 +62,12 @@ entity tb_dp_packet_merge_unmerge is -- specific g_pipeline_ready : boolean := true; g_data_w : natural := 16; - g_nof_repeat : natural := 24; + g_nof_repeat : natural := 14; g_nof_pkt : natural := 3; - g_pkt_len : natural := 29; + g_pkt_len_merge : natural := 9; + g_pkt_len_unmerge : natural := 9; g_pkt_gap : natural := 0; - g_bsn_increment : natural := 0 + g_bsn_increment : natural := 2 ); end tb_dp_packet_merge_unmerge; @@ -70,6 +84,8 @@ architecture tb of tb_dp_packet_merge_unmerge is constant c_data_max : unsigned(g_data_w - 1 downto 0) := (others => '1'); constant c_data_init : integer := -1; constant c_bsn_init : std_logic_vector(c_dp_stream_bsn_w - 1 downto 0) := X"0000000000000000"; -- X"0877665544332211" + constant c_bsn_increment_w : natural := ceil_log2(g_bsn_increment + 1); + constant c_unsigned_bsn_increment : unsigned(c_bsn_increment_w - 1 downto 0) := to_unsigned(g_bsn_increment, c_bsn_increment_w); constant c_nof_pkt_not_zero : natural := sel_a_b(g_nof_pkt = 0, 1, g_nof_pkt); constant c_nof_merged_sop : natural := sel_a_b(g_nof_pkt = 0, 0, ceil_div(g_nof_repeat, c_nof_pkt_not_zero)); @@ -165,11 +181,11 @@ begin v_sosi.bsn := INCR_UVEC(v_sosi.bsn, g_bsn_increment); -- insert sync starting at BSN = c_sync_offset and with period c_sync_period v_sosi.sync := sel_a_b((unsigned(v_sosi.bsn) mod c_sync_period) = c_sync_offset, '1', '0'); - v_sosi.data := INCR_UVEC(v_sosi.data, g_pkt_len); + v_sosi.data := INCR_UVEC(v_sosi.data, g_pkt_len_merge); v_sosi.data := RESIZE_DP_DATA(v_sosi.data(g_data_w - 1 downto 0)); -- wrap when >= 2**g_data_w -- Send packet - proc_dp_gen_block_data(g_data_w, TO_UINT(v_sosi.data), g_pkt_len, + proc_dp_gen_block_data(g_data_w, TO_UINT(v_sosi.data), g_pkt_len_merge, c_channel, c_err, v_sosi.sync, v_sosi.bsn, clk, stimuli_en, stimuli_src_in, stimuli_src_out); @@ -182,8 +198,8 @@ begin -- . e_at_least v_sosi.bsn := std_logic_vector(unsigned(c_bsn_init) + c_verify_at_least * g_nof_pkt); - -- . account for g_pkt_len - v_sosi.data := INCR_UVEC(v_sosi.data, g_pkt_len - 1); + -- . account for g_pkt_len_merge + v_sosi.data := INCR_UVEC(v_sosi.data, g_pkt_len_merge - 1); v_sosi.data := RESIZE_DP_DATA(v_sosi.data(g_data_w - 1 downto 0)); -- wrap when >= 2**g_data_w expected_verify_snk_in <= v_sosi; @@ -201,6 +217,7 @@ begin ------------------------------------------------------------------------------ -- DATA VERIFICATION + -- . p_verify ------------------------------------------------------------------------------ -- Start verify after first valid, sop or eop @@ -221,7 +238,7 @@ begin verify_snk_in.valid, verify_snk_in.data, prev_verify_snk_in.data); -- Verify that the output is incrementing BSN, like the input stimuli - proc_dp_verify_data("verify_snk_in.bsn", c_rl, c_unsigned_0, c_unsigned_0, + proc_dp_verify_data("verify_snk_in.bsn", c_rl, c_unsigned_0, c_unsigned_bsn_increment, clk, verify_en_sop, verify_snk_out.ready, verify_snk_in.sop, verify_snk_in.bsn, prev_verify_snk_in.bsn); @@ -287,7 +304,7 @@ begin ------------------------------------------------------------------------------ p_stimuli_unmerge : process(dp_packet_merge_src_out) begin - dp_packet_merge_sosi <= dp_packet_merge_src_out; + dp_packet_merge_sosi <= dp_packet_merge_src_out; -- Use counter as err field stimulus, per merged packet. Use -- offset to distinguish err and empty values dp_packet_merge_sosi.err <= TO_DP_ERROR(merged_pkt_cnt); @@ -312,8 +329,8 @@ begin generic map ( g_use_ready => c_use_ready, g_pipeline_ready => g_pipeline_ready, - g_nof_pkt_max => g_nof_pkt, - g_pkt_len => g_pkt_len, + g_nof_pkt => g_nof_pkt, + g_pkt_len => g_pkt_len_unmerge, g_bsn_increment => g_bsn_increment ) port map ( diff --git a/libraries/base/dp/tb/vhdl/tb_tb_dp_packet_merge_unmerge.vhd b/libraries/base/dp/tb/vhdl/tb_tb_dp_packet_merge_unmerge.vhd index 7fd9034f6fb81169d4c7b189a370006c2f78b9d7..c13ca82c8e5b7164712c97f398ef421c34130daa 100644 --- a/libraries/base/dp/tb/vhdl/tb_tb_dp_packet_merge_unmerge.vhd +++ b/libraries/base/dp/tb/vhdl/tb_tb_dp_packet_merge_unmerge.vhd @@ -43,28 +43,29 @@ begin -- g_data_w : natural := 4; -- g_nof_repeat : natural := 20; -- g_nof_pkt : natural := 3; - -- g_pkt_len : natural := 29; + -- g_pkt_len_merge : natural := 29; + -- g_pkt_len_unmerge : natural := 29; -- g_pkt_gap : natural := 0; -- g_bsn_increment : natural := 0; - u_act_act_8_nof_0 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 0, 29, 0, 1); - u_act_act_8_nof_1 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 1, 29, 0, 1); - u_act_act_8_nof_2 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 2, 29, 0, 1); - u_act_act_8_nof_3 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 3, 29, 0, 1); - u_act_act_8_nof_4 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 4, 29, 0, 1); - u_act_act_8_nof_4_bsn_0 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 4, 29, 0, 0); - --u_act_act_8_nof_4_bsn_2 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 4, 29, 0, 2); - u_act_act_8_nof_5 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 5, 29, 0, 1); - u_act_act_8_nof_6 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 6, 29, 0, 1); - u_act_act_8_nof_7 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 7, 29, 0, 1); + u_act_act_8_nof_0 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 0, 29, 29, 0, 1); + u_act_act_8_nof_1 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 1, 29, 29, 0, 1); + u_act_act_8_nof_2 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 2, 29, 29, 0, 1); + u_act_act_8_nof_3 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 3, 29, 29, 0, 1); + u_act_act_8_nof_4 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 4, 29, 29, 0, 1); + u_act_act_8_nof_4_bsn_0 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 4, 29, 29, 0, 0); + u_act_act_8_nof_4_bsn_2 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 4, 29, 29, 0, 2); + u_act_act_8_nof_5 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 5, 29, 29, 0, 1); + u_act_act_8_nof_6 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 6, 29, 29, 0, 1); + u_act_act_8_nof_7 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 7, 29, 29, 0, 1); - u_rnd_act_8_nof_3 : entity work.tb_dp_packet_merge_unmerge generic map ( e_random, e_active, true, 8, c_nof_repeat, 3, 29, 0, 1); - u_rnd_rnd_8_nof_3_comb : entity work.tb_dp_packet_merge_unmerge generic map ( e_random, e_random, false, 8, c_nof_repeat, 3, 29, 0, 1); - u_rnd_rnd_8_nof_3_reg : entity work.tb_dp_packet_merge_unmerge generic map ( e_random, e_random, true, 8, c_nof_repeat, 3, 29, 0, 1); - u_pls_act_8_nof_3 : entity work.tb_dp_packet_merge_unmerge generic map ( e_pulse, e_active, true, 8, c_nof_repeat, 3, 29, 0, 1); - u_pls_rnd_8_nof_3 : entity work.tb_dp_packet_merge_unmerge generic map ( e_pulse, e_random, true, 8, c_nof_repeat, 3, 29, 0, 1); - u_pls_pls_8_nof_3 : entity work.tb_dp_packet_merge_unmerge generic map ( e_pulse, e_pulse, true, 8, c_nof_repeat, 3, 29, 0, 1); + u_rnd_act_8_nof_3 : entity work.tb_dp_packet_merge_unmerge generic map ( e_random, e_active, true, 8, c_nof_repeat, 3, 29, 29, 0, 1); + u_rnd_rnd_8_nof_3_comb : entity work.tb_dp_packet_merge_unmerge generic map ( e_random, e_random, false, 8, c_nof_repeat, 3, 29, 29, 0, 1); + u_rnd_rnd_8_nof_3_reg : entity work.tb_dp_packet_merge_unmerge generic map ( e_random, e_random, true, 8, c_nof_repeat, 3, 29, 29, 0, 1); + u_pls_act_8_nof_3 : entity work.tb_dp_packet_merge_unmerge generic map ( e_pulse, e_active, true, 8, c_nof_repeat, 3, 29, 29, 0, 1); + u_pls_rnd_8_nof_3 : entity work.tb_dp_packet_merge_unmerge generic map ( e_pulse, e_random, true, 8, c_nof_repeat, 3, 29, 29, 0, 1); + u_pls_pls_8_nof_3 : entity work.tb_dp_packet_merge_unmerge generic map ( e_pulse, e_pulse, true, 8, c_nof_repeat, 3, 29, 29, 0, 1); - u_rnd_act_8_nof_1 : entity work.tb_dp_packet_merge_unmerge generic map ( e_random, e_active, true, 8, c_nof_repeat, 1, 29, 0, 1); - u_rnd_act_8_nof_3_gap : entity work.tb_dp_packet_merge_unmerge generic map ( e_random, e_active, true, 8, c_nof_repeat, 3, 29, 17, 1); + u_rnd_act_8_nof_1 : entity work.tb_dp_packet_merge_unmerge generic map ( e_random, e_active, true, 8, c_nof_repeat, 1, 29, 29, 0, 1); + u_rnd_act_8_nof_3_gap : entity work.tb_dp_packet_merge_unmerge generic map ( e_random, e_active, true, 8, c_nof_repeat, 3, 29, 29, 17, 1); end tb;