Skip to content
Snippets Groups Projects

Resolve L2SDP-962

Merged Eric Kooistra requested to merge L2SDP-962 into master
2 files
+ 82
55
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -51,8 +51,6 @@ entity tb_dp_packet_merge_unmerge is
g_nof_pkt : natural := 3;
g_pkt_len : natural := 10;
g_pkt_gap : natural := 0;
g_align_at_sync : boolean := false;
g_verify_bsn_err : boolean := false;
g_bsn_increment : natural := 1
);
end tb_dp_packet_merge_unmerge;
@@ -69,23 +67,20 @@ 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_err_init : natural := 247;
constant c_bsn_err_bi : natural := 31; -- use sufficiently high bsn error bit index, that is outside counter range of c_err_init
constant c_channel_init : integer := 5; -- fixed
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_verify_at_least : natural := largest(1,c_nof_merged_sop / 2); -- verify that at least some packets have been merged, not exact to allow variation by p_stimuli_mm
constant c_verify_data_gap : natural := g_nof_pkt;
constant c_verify_bsn_gap : natural := g_nof_pkt * g_bsn_increment;
-- verify that at least some packets have been merged, not exact to allow variation by p_stimuli_mm
constant c_verify_at_least : natural := largest(1,c_nof_merged_sop / 2);
signal tb_end : std_logic := '0';
signal clk : std_logic := '1';
signal rst : std_logic := '1';
signal sl1 : std_logic := '1';
signal random_0 : std_logic_vector(14 downto 0) := (others => '0'); -- use different lengths to have different random sequences
signal random_1 : std_logic_vector(15 downto 0) := (others => '0'); -- use different lengths to have different random sequences
-- use different slv lengths to have different random sequences
signal random_0 : std_logic_vector(14 downto 0) := (others => '0');
signal random_1 : std_logic_vector(15 downto 0) := (others => '0');
signal pulse_0 : std_logic;
signal pulse_1 : std_logic;
signal pulse_en : std_logic := '1';
@@ -105,8 +100,12 @@ architecture tb of tb_dp_packet_merge_unmerge is
signal verify_snk_in : t_dp_sosi;
signal verify_data : std_logic_vector(g_data_w - 1 downto 0);
signal prev_verify_snk_in : t_dp_sosi;
signal input_pkt_cnt : natural := 0;
signal merged_pkt_cnt : natural := 0;
signal exp_channel : natural := 0;
signal exp_error : natural := 0;
signal exp_empty : natural := 0;
signal verify_hold_sop : std_logic := '0';
signal verify_en_valid : std_logic := '0';
@@ -144,13 +143,14 @@ begin
-- Generate data path input data
p_stimuli_st : process
variable v_sosi : t_dp_sosi := c_dp_sosi_rst;
variable v_bsn : std_logic_vector(c_dp_stream_bsn_w - 1 downto 0);
constant c_channel : natural := 0;
constant c_err : natural := 0;
variable v_sosi : t_dp_sosi := c_dp_sosi_rst;
variable v_bsn : std_logic_vector(c_dp_stream_bsn_w - 1 downto 0);
begin
-- Adjust initial sosi field values by -1 to compensate for auto increment
v_sosi.bsn := INCR_UVEC(c_bsn_init, -1);
v_sosi.data := INCR_UVEC(TO_DP_DATA(c_data_init), -1);
v_sosi.err := INCR_UVEC(TO_DP_ERROR(c_err_init), -1);
stimuli_src_out <= c_dp_sosi_rst;
proc_common_wait_until_low(clk, rst);
@@ -159,14 +159,15 @@ begin
-- Generate c_nof_repeat packets
for I in 0 to g_nof_repeat - 1 loop
-- Auto increment v_sosi field values for this packet
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 := RESIZE_DP_DATA(v_sosi.data(g_data_w - 1 downto 0)); -- wrap when >= 2**g_data_w
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 := 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, TO_UINT(v_sosi.channel), TO_UINT(v_sosi.err), v_sosi.sync, v_sosi.bsn,
proc_dp_gen_block_data(g_data_w, TO_UINT(v_sosi.data), g_pkt_len,
c_channel, c_err, v_sosi.sync, v_sosi.bsn,
clk, stimuli_en, stimuli_src_in, stimuli_src_out);
-- Insert optional gap between the packets
@@ -176,11 +177,11 @@ begin
-- Determine expected sosi field values after end of stimuli
-- . e_qual (account for merge size g_nof_pkt)
-- . e_at_least
v_sosi.bsn := std_logic_vector(unsigned(c_bsn_init) + c_verify_at_least * g_nof_pkt);
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);
v_sosi.data := RESIZE_DP_DATA(v_sosi.data(g_data_w - 1 downto 0)); -- wrap when >= 2**g_data_w
v_sosi.data := INCR_UVEC(v_sosi.data, g_pkt_len - 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;
-- Signal end of stimuli
@@ -216,7 +217,8 @@ begin
clk, verify_en_valid, verify_snk_out.ready,
verify_snk_in.valid, verify_snk_in.data, prev_verify_snk_in.data);
proc_dp_verify_data("verify_snk_in.bsn", c_rl, c_unsigned_0, to_unsigned(c_verify_bsn_gap, 32),
-- 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,
clk, verify_en_sop, verify_snk_out.ready,
verify_snk_in.sop, verify_snk_in.bsn, prev_verify_snk_in.bsn);
@@ -226,13 +228,27 @@ begin
-- Verify output ready latency
proc_dp_verify_valid(clk, verify_en_valid, verify_snk_out.ready, prev_verify_snk_out.ready, verify_snk_in.valid);
-- Verify output channel
p_verify_channel : process(clk)
-- Verify output verify_snk_in.sosi fields
p_verify_fields : process(clk)
begin
if rising_edge(clk) then
if verify_snk_in.sop = '1' then
-- Use verify_snk_in.valid, because the assumption with dp_packet_unmerge
-- is that the channel (at sop) and err, empty (at eop) are valid during
-- the entire unmerged packet.
if verify_snk_in.valid = '1' then
-- Verify that output channel yields index of unmerged packet, in range(g_nof_pkt)
assert unsigned(verify_snk_in.channel) = exp_channel
report "wrong unmerged verify_snk_in.channel"
report "Wrong unmerged verify_snk_in.channel"
severity ERROR;
-- Verify that output error is same per g_nof_pkt unmerged packets
assert unsigned(verify_snk_in.err) = exp_error
report "Wrong unmerged verify_snk_in.err"
severity ERROR;
-- Verify that output empty is same per g_nof_pkt unmerged packets
assert unsigned(verify_snk_in.empty) = exp_empty
report "Wrong unmerged verify_snk_in.empty"
severity ERROR;
end if;
end if;
@@ -246,9 +262,9 @@ begin
u_dp_packet_merge : entity work.dp_packet_merge
generic map (
g_nof_pkt => g_nof_pkt,
g_align_at_sync => g_align_at_sync,
g_align_at_sync => false, -- not used in this tb
g_bsn_increment => g_bsn_increment,
g_bsn_err_bi => c_bsn_err_bi
g_bsn_err_bi => 0 -- not used in this tb
)
port map (
rst => rst,
@@ -261,18 +277,31 @@ begin
src_out => dp_packet_merge_src_out
);
merged_pkt_cnt <= merged_pkt_cnt + 1 when rising_edge(clk) and dp_packet_merge_src_out.eop = '1';
exp_channel <= merged_pkt_cnt mod g_nof_pkt;
dp_packet_merge_snk_in <= dp_packet_merge_siso;
------------------------------------------------------------------------------
-- TB stimuli for dp_packet_unmerge
------------------------------------------------------------------------------
p_stimuli_unmerge : process(dp_packet_merge_src_out)
begin
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);
dp_packet_merge_sosi.empty <= TO_DP_EMPTY(merged_pkt_cnt + 1);
end process;
------------------------------------------------------------------------------
-- TB signals for verification of dp_packet_unmerge
------------------------------------------------------------------------------
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';
-- 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';
exp_error <= merged_pkt_cnt when rising_edge(clk) and verify_snk_in.eop = '1';
exp_empty <= exp_error + 1;
------------------------------------------------------------------------------
-- Optional reverse DUT dp_packet_unmerge
------------------------------------------------------------------------------
Loading