Skip to content
Snippets Groups Projects
Commit 19c982f3 authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Verify g_pkt_len_merge /= g_pkt_len_unmerge.

parent 1e61213f
No related branches found
No related tags found
1 merge request!357Move func_sdp_bdo_cep_hdr_field_sel_dest() from sdp_bdo_pkg to...
Pipeline #58583 passed
...@@ -23,22 +23,31 @@ ...@@ -23,22 +23,31 @@
-- Description: -- Description:
-- . The p_stimuli_st uses proc_dp_gen_block_data to generate g_nof_repeat -- . 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. -- 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 -- . The u_dp_packet_merge merges g_nof_pkt packets from stimuli_src_out into
-- dp_packet_merge_src_out. -- dp_packet_merge_src_out.
-- The p_stimuli_unmerge provides stimuli for the .err and .empty fields of -- . The p_stimuli_unmerge provides stimuli for the .err and .empty fields of
-- dp_packet_merge_src_out to get dp_packet_merge_sosi -- dp_packet_merge_src_out to get dp_packet_merge_sosi
-- The u_dp_packet_unmerge unmerges the dp_packet_merge_sosi into packets -- . The u_dp_packet_unmerge unmerges the dp_packet_merge_sosi into packets
-- of length g_pkt_len_unmerge into verify_snk_in. -- of length g_pkt_len_unmerge into verify_snk_in. If g_pkt_len_unmerge /=
-- If g_pkt_len_unmerge /= g_pkt_len_merge, then the last unmerged packet -- g_pkt_len_merge, then:
-- may be shorter then g_pkt_len_unmerge, to contain the remaining data. -- - the last unmerged packet may be shorter then g_pkt_len_unmerge, to
-- contain the remaining data.
-- - the number of unmerged packets c_nof_pkt_unmerge, may differ from
-- g_nof_pkt.
-- - use c_bsn_increment_unmerge = 0 for u_dp_packet_unmerge and expect BSN
-- increment of 0 for unmerged packets from same merged packet or
-- c_nof_pkt_unmerge for unmerged packets from subsequent merged packets.
-- Verify this only manually in wave window, because verifying different
-- increments is not supported by proc_dp_verify_data().
-- . The p_verify section does the verification of verify_snk_in.
-- . Flow control is verified via g_flow_control_*.
-- . Block diagram:
-- --
-- p_stimuli_st --> u_dp_packet_merge --+--> u_dp_packet_unmerge --> p_verify -- p_stimuli_st --> u_dp_packet_merge --+--> u_dp_packet_unmerge --> p_verify
-- ^ -- ^
-- | -- |
-- p_stimuli_unmerge --/ -- p_stimuli_unmerge --/
-- --
-- . Flow control is verified via g_flow_control_*.
--
-- Usage: -- Usage:
-- > as 10 -- > as 10
-- > run -all -- > run -all
...@@ -64,10 +73,10 @@ entity tb_dp_packet_merge_unmerge is ...@@ -64,10 +73,10 @@ entity tb_dp_packet_merge_unmerge is
g_data_w : natural := 16; g_data_w : natural := 16;
g_nof_repeat : natural := 14; g_nof_repeat : natural := 14;
g_nof_pkt : natural := 3; g_nof_pkt : natural := 3;
g_pkt_len_merge : natural := 9; g_pkt_len_merge : natural := 7;
g_pkt_len_unmerge : natural := 9; g_pkt_len_unmerge : natural := 6;
g_pkt_gap : natural := 0; g_pkt_gap : natural := 0;
g_bsn_increment : natural := 2 g_bsn_increment : natural := 1
); );
end tb_dp_packet_merge_unmerge; end tb_dp_packet_merge_unmerge;
...@@ -87,6 +96,9 @@ architecture tb of tb_dp_packet_merge_unmerge is ...@@ -87,6 +96,9 @@ architecture tb of tb_dp_packet_merge_unmerge is
constant c_bsn_increment_w : natural := ceil_log2(g_bsn_increment + 1); 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_unsigned_bsn_increment : unsigned(c_bsn_increment_w - 1 downto 0) := to_unsigned(g_bsn_increment, c_bsn_increment_w);
constant c_nof_pkt_unmerge : natural := ceil_div(g_nof_pkt * g_pkt_len_merge, g_pkt_len_unmerge);
constant c_bsn_increment_unmerge : natural := sel_a_b(g_nof_pkt = c_nof_pkt_unmerge, g_bsn_increment, 0);
constant c_nof_pkt_not_zero : natural := sel_a_b(g_nof_pkt = 0, 1, g_nof_pkt); 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)); constant c_nof_merged_sop : natural := sel_a_b(g_nof_pkt = 0, 0, ceil_div(g_nof_repeat, c_nof_pkt_not_zero));
-- verify that at least some packets have been merged, not exact to allow variation by p_stimuli_mm -- verify that at least some packets have been merged, not exact to allow variation by p_stimuli_mm
...@@ -122,6 +134,7 @@ architecture tb of tb_dp_packet_merge_unmerge is ...@@ -122,6 +134,7 @@ architecture tb of tb_dp_packet_merge_unmerge is
signal input_pkt_cnt : natural := 0; signal input_pkt_cnt : natural := 0;
signal merged_pkt_cnt : natural := 0; signal merged_pkt_cnt : natural := 0;
signal output_pkt_cnt : natural := 0;
signal exp_channel : natural := 0; signal exp_channel : natural := 0;
signal exp_error : natural := 0; signal exp_error : natural := 0;
signal exp_empty : natural := 0; signal exp_empty : natural := 0;
...@@ -238,9 +251,11 @@ begin ...@@ -238,9 +251,11 @@ begin
verify_snk_in.valid, verify_snk_in.data, prev_verify_snk_in.data); verify_snk_in.valid, verify_snk_in.data, prev_verify_snk_in.data);
-- Verify that the output is incrementing BSN, like the input stimuli -- 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_bsn_increment, gen_verify_bsn : if g_nof_pkt = c_nof_pkt_unmerge generate
clk, verify_en_sop, verify_snk_out.ready, proc_dp_verify_data("verify_snk_in.bsn", c_rl, c_unsigned_0, c_unsigned_bsn_increment,
verify_snk_in.sop, verify_snk_in.bsn, prev_verify_snk_in.bsn); clk, verify_en_sop, verify_snk_out.ready,
verify_snk_in.sop, verify_snk_in.bsn, prev_verify_snk_in.bsn);
end generate;
-- Verify output packet ctrl -- Verify output packet ctrl
proc_dp_verify_sop_and_eop(clk, verify_snk_in.valid, verify_snk_in.sop, verify_snk_in.eop, verify_hold_sop); proc_dp_verify_sop_and_eop(clk, verify_snk_in.valid, verify_snk_in.sop, verify_snk_in.eop, verify_hold_sop);
...@@ -256,7 +271,7 @@ begin ...@@ -256,7 +271,7 @@ begin
-- is that the channel (at sop) and err, empty (at eop) are valid during -- is that the channel (at sop) and err, empty (at eop) are valid during
-- the entire unmerged packet. -- the entire unmerged packet.
if verify_snk_in.valid = '1' then if verify_snk_in.valid = '1' then
-- Verify that output channel yields index of unmerged packet, in range(g_nof_pkt) -- Verify that output channel yields index of unmerged packet, in range(c_nof_pkt_unmerge)
assert unsigned(verify_snk_in.channel) = exp_channel assert unsigned(verify_snk_in.channel) = exp_channel
report "Wrong unmerged verify_snk_in.channel" report "Wrong unmerged verify_snk_in.channel"
severity ERROR; severity ERROR;
...@@ -316,9 +331,18 @@ begin ...@@ -316,9 +331,18 @@ begin
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
input_pkt_cnt <= input_pkt_cnt + 1 when rising_edge(clk) and stimuli_src_out.eop = '1'; input_pkt_cnt <= input_pkt_cnt + 1 when rising_edge(clk) and stimuli_src_out.eop = '1';
merged_pkt_cnt <= merged_pkt_cnt + 1 when rising_edge(clk) and dp_packet_merge_src_out.eop = '1'; merged_pkt_cnt <= merged_pkt_cnt + 1 when rising_edge(clk) and dp_packet_merge_src_out.eop = '1';
output_pkt_cnt <= output_pkt_cnt + 1 when rising_edge(clk) and verify_snk_in.eop = '1';
-- get expected value, aligned with output packet boundaries -- get expected value, aligned with output packet boundaries
exp_channel <= input_pkt_cnt mod g_nof_pkt when rising_edge(clk) and verify_snk_in.eop = '1'; p_exp_channel : process(output_pkt_cnt)
begin
-- Avoid divide by 0
exp_channel <= 0;
if c_nof_pkt_unmerge > 0 then
exp_channel <= output_pkt_cnt mod c_nof_pkt_unmerge;
end if;
end process;
exp_error <= merged_pkt_cnt when rising_edge(clk) and verify_snk_in.eop = '1'; exp_error <= merged_pkt_cnt when rising_edge(clk) and verify_snk_in.eop = '1';
exp_empty <= exp_error + 1; exp_empty <= exp_error + 1;
...@@ -329,9 +353,9 @@ begin ...@@ -329,9 +353,9 @@ begin
generic map ( generic map (
g_use_ready => c_use_ready, g_use_ready => c_use_ready,
g_pipeline_ready => g_pipeline_ready, g_pipeline_ready => g_pipeline_ready,
g_nof_pkt => g_nof_pkt, g_nof_pkt => c_nof_pkt_unmerge,
g_pkt_len => g_pkt_len_unmerge, g_pkt_len => g_pkt_len_unmerge,
g_bsn_increment => g_bsn_increment g_bsn_increment => c_bsn_increment_unmerge
) )
port map ( port map (
rst => rst, rst => rst,
......
...@@ -48,6 +48,7 @@ begin ...@@ -48,6 +48,7 @@ begin
-- g_pkt_gap : natural := 0; -- g_pkt_gap : natural := 0;
-- g_bsn_increment : natural := 0; -- g_bsn_increment : natural := 0;
-- No flow control
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_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_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_2 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 2, 29, 29, 0, 1);
...@@ -59,6 +60,17 @@ begin ...@@ -59,6 +60,17 @@ begin
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_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_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);
-- Fractional unmerge
-- . u_act_act_8_nof_3_more_unmerge : ceil((3 * 7) / 6) = 4 and (3 * 7) mod 6 = 3, so there are 4 unmerged packets and last has length 3
-- . u_act_act_8_nof_3_last_len_1 : (3 * 7) mod 10 = 1, so last unmerged packet has length 1
-- . u_act_act_8_nof_3_only_one : (3 * 7) / 21 = 1, so there is only one unmerged packet with length 21
-- . u_act_act_8_nof_3_only_one_frac : (3 * 7) / 22 = 0 and (3 * 7) mod 22 = 21, so there is only one unmerged packet with length 21
u_act_act_8_nof_3_more_unmerge : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 3, 7, 6, 0, 1);
u_act_act_8_nof_3_last_len_1 : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 3, 7, 10, 0, 1);
u_act_act_8_nof_3_only_one : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 3, 7, 21, 0, 1);
u_act_act_8_nof_3_only_one_frac : entity work.tb_dp_packet_merge_unmerge generic map ( e_active, e_active, true, 8, c_nof_repeat, 3, 7, 21, 0, 1);
-- Flow control
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_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_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_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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment