From b502cb01cd3fc04fefc173f0a7db044906541c19 Mon Sep 17 00:00:00 2001 From: Eric Kooistra <kooistra@astron.nl> Date: Fri, 21 Jan 2022 14:18:44 +0100 Subject: [PATCH] Added g_empty to support verifing any empty size < nof symbols per word. --- .../base/dp/tb/vhdl/tb_dp_offload_tx_v3.vhd | 30 ++++++++++++++----- .../dp/tb/vhdl/tb_tb_dp_offload_tx_v3.vhd | 22 ++++++++------ 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/libraries/base/dp/tb/vhdl/tb_dp_offload_tx_v3.vhd b/libraries/base/dp/tb/vhdl/tb_dp_offload_tx_v3.vhd index 70d6538309..d965531434 100644 --- a/libraries/base/dp/tb/vhdl/tb_dp_offload_tx_v3.vhd +++ b/libraries/base/dp/tb/vhdl/tb_dp_offload_tx_v3.vhd @@ -74,7 +74,8 @@ ENTITY tb_dp_offload_tx_v3 IS g_print_en : BOOLEAN := TRUE; -- specific g_data_w : NATURAL := 64; - g_symbol_w : NATURAL := 32; + g_symbol_w : NATURAL := 8; + g_empty : NATURAL := 6; -- number of empty symbols in header when g_symbol_w < g_data_w, must be < c_nof_symbols_per_data g_pkt_len : NATURAL := 240; g_pkt_gap : NATURAL := 16 ); @@ -95,7 +96,7 @@ ARCHITECTURE tb OF tb_dp_offload_tx_v3 IS CONSTANT c_nof_symbols_per_bsn : NATURAL := c_dp_stream_bsn_w / g_symbol_w; -- = 64 / g_symbol_w CONSTANT c_bsn_w : NATURAL := sel_a_b(c_nof_symbols_per_data = 1, g_symbol_w * c_nof_symbols_per_bsn, - g_symbol_w * (c_nof_symbols_per_bsn - 1)); + g_symbol_w * (c_nof_symbols_per_bsn - g_empty)); CONSTANT c_use_shortened_header : BOOLEAN := c_bsn_w <= c_word_w; -- dp_stream_stimuli @@ -116,6 +117,7 @@ ARCHITECTURE tb OF tb_dp_offload_tx_v3 IS CONSTANT c_expected_pkt_len : NATURAL := g_pkt_len; CONSTANT c_sync_period : NATURAL := 5; CONSTANT c_sync_offset : NATURAL := 2; + CONSTANT c_data_init : NATURAL := 17; CONSTANT c_bsn_init : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0) := TO_DP_BSN(0); CONSTANT c_nof_sync : NATURAL := 3; CONSTANT c_nof_packets : NATURAL := c_sync_period * c_nof_sync; @@ -190,7 +192,7 @@ ARCHITECTURE tb OF tb_dp_offload_tx_v3 IS X"0000001B"); -- 25 = eth_dst_mac[47:32] CONSTANT c_expected_tx_hdr_word_arr_shortened : t_slv_32_arr(0 TO c_udp_offload_nof_hdr_words_shortened-1) := ( -- word address - X"00000000", -- 0 = dp_bsn[31:0] -- readback is MM value, not the logic value + X"00000000", -- 0 = dp_bsn[c_bsn_w-1:0] -- readback is MM value, not the logic value X"00000000", -- 1 = dp_sync X"03040506", -- 2 = dp_reserved[31:0] X"00000102", -- 3 = dp_reserved[47:32] @@ -246,7 +248,7 @@ ARCHITECTURE tb OF tb_dp_offload_tx_v3 IS X"0000001B"); -- 25 = eth_dst_mac[47:32] CONSTANT c_expected_rx_hdr_word_arr_shortened : t_slv_32_arr(0 TO c_udp_offload_nof_hdr_words_shortened-1) := ( -- word address - X"00000002", -- 0 = dp_bsn[31:0] -- dynamic value obtained from simulation + X"00000002", -- 0 = dp_bsn[c_bsn_w-1:0] -- dynamic value obtained from simulation X"00000001", -- 1 = dp_sync -- dynamic value obtained from simulation X"03040506", -- 2 = dp_reserved[31:0] X"00000102", -- 3 = dp_reserved[47:32] @@ -366,6 +368,7 @@ BEGIN -- initializations g_sync_period => c_sync_period, g_sync_offset => c_sync_offset, + g_data_init => c_data_init, g_bsn_init => c_bsn_init, -- specific g_in_dat_w => g_data_w, @@ -563,7 +566,16 @@ BEGIN link_offload_sosi_arr(0).sop <= tx_offload_sosi_arr(0).sop; link_offload_sosi_arr(0).eop <= tx_offload_sosi_arr(0).eop; - tx_offload_siso_arr <= (OTHERS=>c_dp_siso_rdy); + -- The dp_offload_tx_v3 cannot accept flow control via its src_in_arr + -- however the dp_offload_rx only lowers ready at eop, to request a + -- one cycle gap between rx packets. The dp_offload_tx_v3 output via + -- src_out_arr has a gap, when g_flow_control_stimuli is e_pulse or when + -- g_pkt_gap > 0. The dp_offload_tx_v3 output has gaps, even when the + -- input stimuli have no gaps. Hence the flow control from dp_offload_rx + -- at the eop has no impact. However the tb will still eventually fail + -- the stimuli is always active, because then the u_dp_fifo_sc will run + -- full. + tx_offload_siso_arr <= link_offload_siso_arr; --(OTHERS=>c_dp_siso_rdy); END PROCESS; ------------------------------------------------------------------------------ @@ -664,16 +676,18 @@ BEGIN END PROCESS; p_verify_snk_in_data : PROCESS + VARIABLE v_data : INTEGER; BEGIN -- Note: This verification overlaps with u_dp_stream_verify because that also verifies incrementing valid data. WAIT UNTIL rising_edge(dp_clk); prev_verify_snk_in_data <= verify_snk_in.data(g_data_w-1 DOWNTO 0); + v_data := TO_UINT(verify_snk_in.data) - c_data_init; IF verify_snk_in.sop = '1' THEN - ASSERT TO_UINT(verify_snk_in.data) MOD g_pkt_len = 0 REPORT "Wrong decoded data at sop." SEVERITY ERROR; + ASSERT v_data MOD g_pkt_len = 0 REPORT "Wrong decoded data at sop." SEVERITY ERROR; ELSIF verify_snk_in.eop = '1' THEN - ASSERT TO_UINT(verify_snk_in.data) MOD g_pkt_len = g_pkt_len - 1 REPORT "Wrong decoded data at eop." SEVERITY ERROR; + ASSERT v_data MOD g_pkt_len = g_pkt_len - 1 REPORT "Wrong decoded data at eop." SEVERITY ERROR; ELSIF verify_snk_in.valid = '1' THEN - ASSERT TO_UINT(verify_snk_in.data) = TO_UINT(prev_verify_snk_in_data) + 1 REPORT "Wrong decoded data at valid." SEVERITY ERROR; + ASSERT v_data = TO_UINT(prev_verify_snk_in_data) - c_data_init + 1 REPORT "Wrong decoded data at valid." SEVERITY ERROR; END IF; END PROCESS; diff --git a/libraries/base/dp/tb/vhdl/tb_tb_dp_offload_tx_v3.vhd b/libraries/base/dp/tb/vhdl/tb_tb_dp_offload_tx_v3.vhd index f55d74d658..39cc44db3e 100644 --- a/libraries/base/dp/tb/vhdl/tb_tb_dp_offload_tx_v3.vhd +++ b/libraries/base/dp/tb/vhdl/tb_tb_dp_offload_tx_v3.vhd @@ -44,17 +44,21 @@ BEGIN -- -- specific -- g_data_w : NATURAL := 64; -- g_symbol_w : NATURAL := 16; + -- g_empty : NATURAL := 6; -- number of empty symbols in header when g_symbol_w < g_data_w, must be < c_nof_symbols_per_data -- g_pkt_len : NATURAL := 240; -- g_pkt_gap : NATURAL := 16 - u_pls_act_data_w_64 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_pulse, e_active, FALSE, 64, 64, 240, 16); - u_pls_act_data_w_64_no_gap : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_pulse, e_active, FALSE, 64, 64, 240, 0); - u_rnd_act_data_w_64 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 64, 64, 240, 16); - u_rnd_act_data_w_32 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 32, 32, 240, 16); - --u_act_rnd_data_w : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_active, e_random, FALSE, 64, 64, 240, 16); - u_rnd_act_data_64_symbol_16 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 64, 16, 240, 16); - u_rnd_act_data_64_symbol_32 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 64, 32, 240, 16); - u_rnd_act_data_32_symbol_8 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 32, 8, 240, 16); - u_rnd_act_data_32_symbol_16 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 32, 16, 240, 16); + u_pls_act_data_w_64 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_pulse, e_active, FALSE, 64, 64, 0, 240, 16); + u_act_act_data_w_64_no_gap : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_active, e_active, FALSE, 64, 64, 0, 240, 0); -- u_dp_fifo_sc does run almost full + u_pls_act_data_w_64_no_gap : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_pulse, e_active, FALSE, 64, 64, 0, 240, 0); + u_rnd_act_data_w_64 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 64, 64, 0, 240, 16); + u_rnd_act_data_w_32 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 32, 32, 0, 240, 16); + --u_act_rnd_data_w : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_active, e_random, FALSE, 64, 64, 0, 240, 16); -- dp_offload_rx requires e_active + u_rnd_act_data_64_symbol_8_empty_1 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 64, 8, 1, 240, 16); + u_rnd_act_data_64_symbol_8_empty_6 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 64, 8, 6, 240, 16); + u_rnd_act_data_64_symbol_16 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 64, 16, 1, 240, 16); + u_rnd_act_data_64_symbol_32 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 64, 32, 1, 240, 16); + u_rnd_act_data_32_symbol_8 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 32, 8, 1, 240, 16); + u_rnd_act_data_32_symbol_16 : ENTITY work.tb_dp_offload_tx_v3 GENERIC MAP (e_random, e_active, FALSE, 32, 16, 1, 240, 16); END tb; -- GitLab