Since we disabled the 'expectsInlineQoS' Flag due to Cyclone DDS compatibility, we no longer have access to the lifespan of the remote writers. The Endpoint Match Format was changed to also send the Lifespan Duration from the rtps_builtin_endpoint.
1279 lines
55 KiB
VHDL
1279 lines
55 KiB
VHDL
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use ieee.numeric_std.all;
|
|
|
|
library osvvm; -- Utility Library
|
|
context osvvm.OsvvmContext;
|
|
|
|
use work.rtps_package.all;
|
|
use work.user_config.all;
|
|
use work.rtps_config_package.all;
|
|
use work.rtps_test_package.all;
|
|
|
|
-- This testbench tests the User traffic handling of the RTPS Reader.
|
|
-- The testbench checks which packets are accepted and propagated as Cache Changes to the History Cache.
|
|
-- This testbench covers following:
|
|
-- * Traffic from matched/unmatched remote Endpoint
|
|
-- * Traffic with/without prior HEARTBEAT
|
|
-- * HEARTBEAT Handling
|
|
-- * GAP Handling
|
|
-- * Inline-QoS Handling
|
|
-- * Traffic without Payload (Unregister/Dispose DDS Operations)
|
|
|
|
entity L0_rtps_reader_test2_vbk is
|
|
end entity;
|
|
|
|
architecture testbench of L0_rtps_reader_test2_vbk is
|
|
|
|
-- *CONSTANT DECLARATION*
|
|
constant MAX_REMOTE_ENDPOINTS : natural := 3;
|
|
constant ACCEPT_RES : std_logic_vector(WORD_WIDTH downto 0) := (others => '0');
|
|
constant REJECT_RES : std_logic_vector(WORD_WIDTH downto 0) := (others => '1');
|
|
|
|
-- *TYPE DECLARATION*
|
|
type SEND_STAGE_TYPE is (IDLE, BUSY);
|
|
type CHECK_STAGE_TYPE is (IDLE, CHECK, RESPONSE);
|
|
|
|
-- *SIGNAL DECLARATION*
|
|
signal clk, empty_user, empty_meta, rd_user, rd_meta, last_word_in_user, last_word_in_meta, wr_rtps : std_logic := '0';
|
|
signal reset : std_logic := '1';
|
|
signal data_in_user, data_in_meta, data_out_hc : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
|
|
signal start_hc, ack_hc, done_hc, done_hc_delay, ready_out_hc, valid_out_hc, last_word_out_hc : std_logic := '0';
|
|
signal opcode_hc : HISTORY_CACHE_OPCODE_TYPE := NOP;
|
|
signal ret_hc : HISTORY_CACHE_RESPONSE_TYPE := OK;
|
|
signal stim_stage_user, stim_stage_meta : SEND_STAGE_TYPE := IDLE;
|
|
signal check_stage : CHECK_STAGE_TYPE := IDLE;
|
|
shared variable stimulus_user, stimulus_meta, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
|
|
signal packet_sent_user, packet_sent_meta : std_logic := '0';
|
|
signal cnt_stim_meta, cnt_stim_user : natural := 0;
|
|
signal start_meta, start_user : std_logic := '0';
|
|
shared variable SB_out : osvvm.ScoreBoardPkg_slv.ScoreBoardPType;
|
|
signal stim_done, mem_check_done, out_check_done, test_done : std_logic := '0';
|
|
|
|
-- *FUNCTION DECLARATION*
|
|
function gen_sn(input : natural) return SEQUENCENUMBER_TYPE is
|
|
variable ret : SEQUENCENUMBER_TYPE;
|
|
begin
|
|
ret(0) := (others => '0');
|
|
ret(1) := unsigned(int(input, WORD_WIDTH));
|
|
return ret;
|
|
end function;
|
|
begin
|
|
|
|
-- Unit Under Test
|
|
uut : entity work.rtps_reader(arch)
|
|
generic map (
|
|
ENTITYID => DEFAULT_READER_ENTITYID,
|
|
RELIABILITY_QOS => BEST_EFFORT_RELIABILITY_QOS,
|
|
LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS,
|
|
DURABILITY_QOS => VOLATILE_DURABILITY_QOS,
|
|
HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO,
|
|
HEARTBEAT_SUPPRESSION_DELAY => DURATION_ZERO,
|
|
LEASE_DURATION => DURATION_INFINITE,
|
|
WITH_KEY => TRUE,
|
|
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
|
|
)
|
|
port map (
|
|
-- SYSTEM
|
|
clk => clk,
|
|
reset => reset,
|
|
time => TIME_ZERO,
|
|
empty_user => empty_user or packet_sent_user,
|
|
rd_user => rd_user,
|
|
data_in_user => data_in_user,
|
|
last_word_in_user => last_word_in_user,
|
|
empty_meta => empty_meta or packet_sent_meta,
|
|
rd_meta => rd_meta,
|
|
data_in_meta => data_in_meta,
|
|
last_word_in_meta => last_word_in_meta,
|
|
wr_ro => wr_rtps,
|
|
full_ro => '0',
|
|
last_word_out_ro => open,
|
|
data_out_ro => open,
|
|
start_hc => start_hc,
|
|
opcode_hc => opcode_hc,
|
|
ack_hc => ack_hc,
|
|
done_hc => done_hc,
|
|
ret_hc => ret_hc,
|
|
data_out_hc => data_out_hc,
|
|
valid_out_hc => valid_out_hc,
|
|
ready_out_hc => ready_out_hc,
|
|
last_word_out_hc => last_word_out_hc
|
|
);
|
|
|
|
stimulus_prc : process
|
|
variable RV : RandomPType;
|
|
variable e0, e1, e2, endpoint : ENDPOINT_DATA_TYPE := DEFAULT_ENDPOINT_DATA;
|
|
variable payload : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
|
|
variable sub : RTPS_SUBMESSAGE_TYPE := DEFAULT_RTPS_SUBMESSAGE;
|
|
variable cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE;
|
|
variable src_ts : TIME_TYPE := TIME_INVALID;
|
|
|
|
-- Wrapper to use procedure as function
|
|
impure function gen_rand_loc_2 return LOCATOR_TYPE is
|
|
variable ret : LOCATOR_TYPE := EMPTY_LOCATOR;
|
|
begin
|
|
gen_rand_loc(RV, ret);
|
|
return ret;
|
|
end function;
|
|
|
|
impure function gen_rand_guid_prefix return GUIDPREFIX_TYPE is
|
|
variable ret : GUIDPREFIX_TYPE;
|
|
begin
|
|
ret := (0 => RV.RandSlv(WORD_WIDTH), 1 => RV.RandSlv(WORD_WIDTH), 2 => RV.RandSlv(WORD_WIDTH));
|
|
return ret;
|
|
end function;
|
|
|
|
procedure start_meta_test is
|
|
begin
|
|
start_meta <= '1';
|
|
wait until rising_edge(clk);
|
|
start_meta <= '0';
|
|
wait until rising_edge(clk);
|
|
end procedure;
|
|
|
|
procedure start_user_test is
|
|
begin
|
|
start_user <= '1';
|
|
wait until rising_edge(clk);
|
|
start_user <= '0';
|
|
wait until rising_edge(clk);
|
|
end procedure;
|
|
|
|
procedure push_reference(accept : in BOOLEAN) is
|
|
begin
|
|
-- NOTE: First Word represents the Response that we will return.
|
|
if (accept) then
|
|
SB_out.Push(ACCEPT_RES);
|
|
else
|
|
SB_out.Push(REJECT_RES);
|
|
end if;
|
|
for i in 0 to reference.length-1 loop
|
|
SB_out.Push(reference.last(i) & reference.data(i));
|
|
end loop;
|
|
end procedure;
|
|
|
|
impure function gen_payload return TEST_PACKET_TYPE is
|
|
variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
|
|
begin
|
|
for i in 0 to RV.RandInt(1,10) loop
|
|
ret.data(ret.length) := RV.RandSlv(WORD_WIDTH);
|
|
ret.length := ret.length + 1;
|
|
end loop;
|
|
ret.last(ret.length-1) := '1';
|
|
return ret;
|
|
end function;
|
|
|
|
impure function gen_key_hash return KEY_HASH_TYPE is
|
|
variable ret : KEY_HASH_TYPE := KEY_HASH_NIL;
|
|
begin
|
|
for i in 0 to KEY_HASH_TYPE'length-1 loop
|
|
ret(i) := RV.RandSlv(WORD_WIDTH);
|
|
end loop;
|
|
return ret;
|
|
end function;
|
|
|
|
procedure wait_on_meta_sent is
|
|
begin
|
|
wait until rising_edge(packet_sent_meta);
|
|
end procedure;
|
|
|
|
procedure wait_on_user_sent is
|
|
begin
|
|
wait until rising_edge(packet_sent_user);
|
|
end procedure;
|
|
|
|
procedure wait_on_out_check is
|
|
begin
|
|
if (out_check_done /= '1') then
|
|
wait until out_check_done = '1';
|
|
end if;
|
|
end procedure;
|
|
|
|
procedure wait_on_completion is
|
|
begin
|
|
if (test_done /= '1') then
|
|
wait until test_done = '1';
|
|
end if;
|
|
end procedure;
|
|
begin
|
|
|
|
SetAlertLogName("rtps_reader - Level 0 - (Volatile, Best Effort, Keyed) - User Traffic Handling");
|
|
SetAlertEnable(FAILURE, TRUE);
|
|
SetAlertEnable(ERROR, TRUE);
|
|
SetAlertEnable(WARNING, TRUE);
|
|
SetLogEnable(DEBUG, FALSE);
|
|
SetLogEnable(PASSED, FALSE);
|
|
SetLogEnable(INFO, TRUE);
|
|
RV.InitSeed(RV'instance_name);
|
|
|
|
-- Endpoint 1
|
|
e0 := DEFAULT_ENDPOINT_DATA;
|
|
e0.reader := FALSE;
|
|
e0.nr := 0;
|
|
e0.match := MATCH;
|
|
e0.entityid := RV.RandSlv(ENTITYID_WIDTH);
|
|
e0.participant.guidPrefix := gen_rand_guid_prefix;
|
|
e0.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR));
|
|
e0.lifespan := gen_duration(2,0);
|
|
-- Endpoint 2
|
|
e1 := DEFAULT_ENDPOINT_DATA;
|
|
e1.reader := FALSE;
|
|
e1.nr := 1;
|
|
e1.match := MATCH;
|
|
e1.entityid := RV.RandSlv(ENTITYID_WIDTH);
|
|
e1.participant.guidPrefix := gen_rand_guid_prefix;
|
|
e1.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR));
|
|
-- Endpoint 3
|
|
e2 := DEFAULT_ENDPOINT_DATA;
|
|
e2.reader := FALSE;
|
|
e2.nr := 2;
|
|
e2.match := MATCH;
|
|
e2.entityid := RV.RandSlv(ENTITYID_WIDTH);
|
|
e2.participant.guidPrefix := gen_rand_guid_prefix;
|
|
e2.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR));
|
|
|
|
Log("Initiating Test", INFO);
|
|
stim_done <= '0';
|
|
start_meta <= '0';
|
|
start_user <= '0';
|
|
reset <= '1';
|
|
wait until rising_edge(clk);
|
|
wait until rising_edge(clk);
|
|
reset <= '0';
|
|
|
|
src_ts := TIME_INVALID;
|
|
|
|
-- *GENERAL SEQUENCE NUMBER HANDLING*
|
|
Log("Test General SequenceNumber Handling", INFO);
|
|
|
|
Log("Ignore Endpoint 0 sent DATA [SN 1]", INFO);
|
|
endpoint := e0;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(1);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
-- NOTE: We do not wait here for the sent, to allow meta traffic being available during user traffic handling.
|
|
|
|
Log("Insert Endpoint 0,1,2", INFO);
|
|
gen_endpoint_match_frame(e0, stimulus_meta);
|
|
gen_endpoint_match_frame(e1, stimulus_meta);
|
|
gen_endpoint_match_frame(e2, stimulus_meta);
|
|
start_meta_test;
|
|
wait_on_meta_sent;
|
|
stimulus_meta := EMPTY_TEST_PACKET;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 0 sent DATA [SN 1]", INFO);
|
|
endpoint := e0;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(1);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, endpoint.lifespan, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 0 sent DATA [SN 1]", INFO);
|
|
endpoint := e0;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(1);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 0 sent DATA [SN 3]", INFO);
|
|
endpoint := e0;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(3);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, endpoint.lifespan, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 0 sent DATA [SN 2]", INFO);
|
|
endpoint := e0;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(2);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
-- *HEARTBEAT HANDLING*
|
|
Log("Test HEARTBEAT Handling", INFO);
|
|
|
|
Log("Endpoint 2 Heartbeat [First 2, Last 11]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_HEARTBEAT;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.firstSN := gen_sn(2);
|
|
sub.lastSN := gen_sn(11);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 2 sent DATA [SN 2]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(2);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 2 sent DATA [SN 11]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(11);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Endpoint 2 Heartbeat [First 5, Last 13]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_HEARTBEAT;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.firstSN := gen_sn(5);
|
|
sub.lastSN := gen_sn(13);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 2 sent DATA [SN 5]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(5);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 2 sent DATA [SN 13]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(13);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 2 sent DATA [SN 12]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(12);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Endpoint 2 Heartbeat [First 15, Last 18]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_HEARTBEAT;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.firstSN := gen_sn(15);
|
|
sub.lastSN := gen_sn(18);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 2 sent DATA [SN 18]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(18);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 2 sent DATA [SN 15]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(15);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Endpoint 2 Heartbeat [First 19, Last 18]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_HEARTBEAT;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.firstSN := gen_sn(19);
|
|
sub.lastSN := gen_sn(18);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 2 sent DATA [SN 19]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(19);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
-- *GAP HANDLING*
|
|
Log("Test GAP Handling", INFO);
|
|
|
|
Log("Endpoint 2 Heartbeat [GAP 1-10]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_GAP;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.gapStart := gen_sn(1);
|
|
sub.gapList := (base => gen_sn(11), numBits => int(0, CDR_LONG_WIDTH), bitmap => (others => '0'));
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 2 sent DATA [SN 11]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(11);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Endpoint 2 Heartbeat [GAP 2-10,12]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_GAP;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.gapStart := gen_sn(2);
|
|
sub.gapList := (base => gen_sn(10), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0'));
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 2 sent DATA [SN 13]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(13);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Endpoint 2 Heartbeat [GAP 21-22]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_GAP;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.gapStart := gen_sn(21);
|
|
sub.gapList := (base => gen_sn(23), numBits => int(0, CDR_LONG_WIDTH), bitmap => (others => '0'));
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 2 sent DATA [SN 20]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(20);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Endpoint 2 Heartbeat [GAP 21-22, 24]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_GAP;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.gapStart := gen_sn(21);
|
|
sub.gapList := (base => gen_sn(22), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0'));
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 2 sent DATA [SN 21]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(21);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Endpoint 2 Heartbeat [GAP 21-22, 24]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_GAP;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.gapStart := gen_sn(21);
|
|
sub.gapList := (base => gen_sn(22), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0'));
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 2 sent DATA [SN 23]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(23);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Endpoint 2 Heartbeat [GAP 21-22, 24]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_GAP;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.gapStart := gen_sn(21);
|
|
sub.gapList := (base => gen_sn(23), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0'));
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 2 sent DATA [SN 24]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(24);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 2 sent DATA [SN 25]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(25);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Endpoint 2 Heartbeat [GAP 20-30]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_GAP;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.gapStart := gen_sn(20);
|
|
sub.gapList := (base => gen_sn(31), numBits => int(1, CDR_LONG_WIDTH), bitmap => (others => '0'));
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 2 sent DATA [SN 26]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(26);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 2 sent DATA [SN 31]", INFO);
|
|
endpoint := e2;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(31);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
-- *DURABILITY AND INLINE-QOS HANDLING*
|
|
Log("Test Durability and Inline-QoS Handling", INFO);
|
|
|
|
Log("Accept Endpoint 1 sent DATA [SN 10]", INFO);
|
|
endpoint := e1;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(10);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 1 sent DATA [SN 11, Inline-QoS (Status Info, Key Hash)]", INFO);
|
|
src_ts := gen_duration(1,0);
|
|
endpoint := e1;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(11);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
cc := gen_cache_change(sub);
|
|
cc.kind := ALIVE_FILTERED;
|
|
cc.src_timestamp := src_ts;
|
|
cc.instance := gen_key_hash;
|
|
gen_inline_qos(cc, endpoint, TRUE, '0', sub.inlineQos);
|
|
gen_sentinel(sub.inlineQos);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 1 sent DATA [SN 12, Inline-QoS (Invalid PID_STATUS_INFO)]", INFO);
|
|
src_ts := gen_duration(1,300);
|
|
endpoint := e1;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(12);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
cc := gen_cache_change(sub);
|
|
cc.kind := ALIVE_FILTERED;
|
|
cc.src_timestamp := src_ts;
|
|
cc.instance := gen_key_hash;
|
|
gen_inline_qos(cc, endpoint, TRUE, '0', sub.inlineQos, PID_STATUS_INFO, -1);
|
|
gen_sentinel(sub.inlineQos);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 1 sent DATA [SN 12, Inline-QoS (Extra Bytes in PID_STATUS_INFO)]", INFO);
|
|
src_ts := gen_duration(1,400);
|
|
endpoint := e1;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(12);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
cc := gen_cache_change(sub);
|
|
cc.kind := ALIVE_FILTERED;
|
|
cc.src_timestamp := src_ts;
|
|
cc.instance := gen_key_hash;
|
|
gen_inline_qos(cc, endpoint, TRUE, '0', sub.inlineQos, PID_STATUS_INFO, +1);
|
|
gen_sentinel(sub.inlineQos);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 1 sent DATA [SN 13, Inline-QoS (Invalid PID_KEY_HASH)]", INFO);
|
|
src_ts := gen_duration(1,500);
|
|
endpoint := e1;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(13);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
cc := gen_cache_change(sub);
|
|
cc.kind := ALIVE_FILTERED;
|
|
cc.src_timestamp := src_ts;
|
|
cc.instance := gen_key_hash;
|
|
gen_inline_qos(cc, endpoint, TRUE, '0', sub.inlineQos, PID_KEY_HASH, -1);
|
|
gen_sentinel(sub.inlineQos);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 1 sent DATA [SN 13, Inline-QoS (Extra Bytes in PID_KEY_HASH)]", INFO);
|
|
src_ts := gen_duration(1,600);
|
|
endpoint := e1;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(13);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
cc := gen_cache_change(sub);
|
|
cc.kind := ALIVE_FILTERED;
|
|
cc.src_timestamp := src_ts;
|
|
cc.instance := gen_key_hash;
|
|
gen_inline_qos(cc, endpoint, TRUE, '0', sub.inlineQos, PID_KEY_HASH, +1);
|
|
gen_sentinel(sub.inlineQos);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 1 sent DATA [SN 14, Inline-QoS (Status Info, Key Hash), Little Endian]", INFO);
|
|
src_ts := gen_duration(1,700);
|
|
endpoint := e1;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(14);
|
|
sub.flags(SUBMESSAGE_ENDIAN_FLAG_POS) := '1';
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
cc := gen_cache_change(sub);
|
|
cc.kind := ALIVE_FILTERED;
|
|
cc.src_timestamp := src_ts;
|
|
cc.instance := gen_key_hash;
|
|
gen_inline_qos(cc, endpoint, TRUE, '1', sub.inlineQos);
|
|
gen_sentinel('1', sub.inlineQos);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
-- *NON_PAYLOAD TRAFFIC HANDLING*
|
|
Log("Test Non-Payload Traffic Handling", INFO);
|
|
|
|
Log("Accept Endpoint 1 sent DATA [SN 15, No Payload, Inline-QoS (Status Info, Key Hash)]", INFO);
|
|
src_ts := gen_duration(2,0);
|
|
endpoint := e1;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(15);
|
|
sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1';
|
|
cc := gen_cache_change(sub);
|
|
cc.kind := NOT_ALIVE_DISPOSED;
|
|
cc.src_timestamp := src_ts;
|
|
cc.instance := gen_key_hash;
|
|
gen_inline_qos(cc, endpoint, TRUE, '0', sub.inlineQos);
|
|
gen_sentinel(sub.inlineQos);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 1 sent DATA [SN 16, Serialized Key, Inline-QoS (Status Info)]", INFO);
|
|
src_ts := gen_duration(2,500);
|
|
endpoint := e1;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(16);
|
|
sub.flags(SUBMESSAGE_KEY_FLAG_POS) := '1';
|
|
sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
cc := gen_cache_change(sub);
|
|
cc.kind := NOT_ALIVE_UNREGISTERED;
|
|
cc.src_timestamp := src_ts;
|
|
gen_inline_qos(cc, endpoint, TRUE, '0', sub.inlineQos);
|
|
gen_sentinel(sub.inlineQos);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Ignore Endpoint 1 sent DATA [SN 17, No Payload, Inline-QoS (Status Info)]", INFO);
|
|
src_ts := gen_duration(2,600);
|
|
endpoint := e1;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(17);
|
|
sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1';
|
|
cc := gen_cache_change(sub);
|
|
cc.kind := NOT_ALIVE_DISPOSED;
|
|
cc.src_timestamp := src_ts;
|
|
gen_inline_qos(cc, endpoint, TRUE, '0', sub.inlineQos);
|
|
gen_sentinel(sub.inlineQos);
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
src_ts := TIME_INVALID;
|
|
|
|
-- *HISTORY CACHE RESPONSE HANDLING*
|
|
Log("Test History Cache Response Handling", INFO);
|
|
|
|
Log("Accept Endpoint 0 sent DATA [SN 4, HC Reject]", INFO);
|
|
endpoint := e0;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(4);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, endpoint.lifespan, endpoint.nr, reference);
|
|
push_reference(FALSE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
Log("Accept Endpoint 0 sent DATA [SN 4]", INFO);
|
|
endpoint := e0;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(4);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
cc := gen_cache_change(sub);
|
|
gen_add_cache_change_dds(cc, endpoint.lifespan, endpoint.nr, reference);
|
|
push_reference(TRUE);
|
|
start_user_test;
|
|
wait_on_user_sent;
|
|
wait_on_out_check;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
-- *CONCURRENT TRAFFIC HANDLING*
|
|
Log("Test Concurrent User and Metatraffic Handling", INFO);
|
|
|
|
Log("Unmatch Endpoint 0 and Ignore Endpoint 0 sent DATA [SN 5]", INFO);
|
|
e0.match := UNMATCH;
|
|
gen_endpoint_match_frame(e0, stimulus_meta);
|
|
endpoint := e0;
|
|
sub := DEFAULT_RTPS_SUBMESSAGE;
|
|
sub.submessageID := SID_DATA;
|
|
sub.writerId := endpoint.entityid;
|
|
sub.readerId := DEFAULT_READER_ENTITYID;
|
|
sub.writerSN := gen_sn(5);
|
|
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
|
|
sub.data := gen_payload;
|
|
gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user);
|
|
start_user <= '1';
|
|
start_meta <= '1';
|
|
wait until rising_edge(clk);
|
|
start_user <= '0';
|
|
start_meta <= '0';
|
|
stimulus_meta := EMPTY_TEST_PACKET;
|
|
stimulus_user := EMPTY_TEST_PACKET;
|
|
reference := EMPTY_TEST_PACKET;
|
|
|
|
stim_done <= '1';
|
|
wait_on_completion;
|
|
TranscriptOpen(RESULTS_FILE, APPEND_MODE);
|
|
SetTranscriptMirror;
|
|
ReportAlerts;
|
|
TranscriptClose;
|
|
std.env.stop;
|
|
wait;
|
|
end process;
|
|
|
|
clock_prc : process
|
|
begin
|
|
clk <= '0';
|
|
wait for 25 ns;
|
|
clk <= '1';
|
|
wait for 25 ns;
|
|
end process;
|
|
|
|
empty_meta_prc : process
|
|
begin
|
|
empty_meta <= '0';
|
|
wait until rd_meta = '1';
|
|
wait until rising_edge(clk);
|
|
empty_meta <= '1';
|
|
wait until rising_edge(clk);
|
|
end process;
|
|
|
|
empty_user_prc : process
|
|
begin
|
|
empty_user <= '0';
|
|
wait until rd_user = '1';
|
|
wait until rising_edge(clk);
|
|
empty_user <= '1';
|
|
wait until rising_edge(clk);
|
|
end process;
|
|
|
|
alert_prc : process(all)
|
|
begin
|
|
if rising_edge(clk) then
|
|
alertif(empty_meta = '1' and rd_meta = '1', "Input FIFO read signal high while empty signal high (meta)", ERROR);
|
|
alertif(empty_user = '1' and rd_user = '1', "Input FIFO read signal high while empty signal high (user)", ERROR);
|
|
alertif(wr_rtps = '1', "Best Effort Reader has RTPS output", ERROR);
|
|
end if;
|
|
end process;
|
|
|
|
input_meta_prc : process(all)
|
|
begin
|
|
data_in_meta <= stimulus_meta.data(cnt_stim_meta);
|
|
last_word_in_meta <= stimulus_meta.last(cnt_stim_meta);
|
|
|
|
if rising_edge(clk) then
|
|
if (reset = '1') then
|
|
cnt_stim_meta <= 0;
|
|
stim_stage_meta <= IDLE;
|
|
packet_sent_meta <= '1';
|
|
else
|
|
case (stim_stage_meta) is
|
|
when IDLE =>
|
|
if (start_meta = '1' and stimulus_meta.length /= 0) then
|
|
stim_stage_meta <= BUSY;
|
|
packet_sent_meta <= '0';
|
|
end if;
|
|
when BUSY =>
|
|
if (rd_meta = '1') then
|
|
if (cnt_stim_meta = stimulus_meta.length-1) then
|
|
stim_stage_meta <= IDLE;
|
|
packet_sent_meta <= '1';
|
|
cnt_stim_meta <= 0;
|
|
else
|
|
cnt_stim_meta <= cnt_stim_meta + 1;
|
|
end if;
|
|
end if;
|
|
end case;
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
input_user_prc : process(all)
|
|
begin
|
|
data_in_user <= stimulus_user.data(cnt_stim_user);
|
|
last_word_in_user <= stimulus_user.last(cnt_stim_user);
|
|
|
|
if rising_edge(clk) then
|
|
if (reset = '1') then
|
|
cnt_stim_user <= 0;
|
|
stim_stage_user <= IDLE;
|
|
packet_sent_user <= '1';
|
|
else
|
|
case (stim_stage_user) is
|
|
when IDLE =>
|
|
if (start_user = '1' and stimulus_user.length /= 0) then
|
|
stim_stage_user <= BUSY;
|
|
packet_sent_user <= '0';
|
|
end if;
|
|
when BUSY =>
|
|
if (rd_user = '1') then
|
|
if (cnt_stim_user = stimulus_user.length-1) then
|
|
stim_stage_user <= IDLE;
|
|
packet_sent_user <= '1';
|
|
cnt_stim_user <= 0;
|
|
else
|
|
cnt_stim_user <= cnt_stim_user + 1;
|
|
end if;
|
|
end if;
|
|
end case;
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
done_proc : process(clk)
|
|
begin
|
|
if rising_edge(clk) then
|
|
if (stim_done = '1' and SB_out.empty) then
|
|
test_done <= '1';
|
|
else
|
|
test_done <= '0';
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
out_check_prc : process(all)
|
|
variable accept : std_logic_vector(WORD_WIDTH downto 0);
|
|
begin
|
|
if rising_edge(clk) then
|
|
case (check_stage) is
|
|
when IDLE =>
|
|
out_check_done <= '0';
|
|
if (start_hc = '1') then
|
|
check_stage <= CHECK;
|
|
case (opcode_hc) is
|
|
when ADD_CACHE_CHANGE =>
|
|
-- Pop Response Value
|
|
SB_out.pop(accept);
|
|
when others =>
|
|
Alert("Unexpected HC Opcode", ERROR);
|
|
end case;
|
|
end if;
|
|
when CHECK =>
|
|
if (valid_out_hc = '1') then
|
|
SB_out.Check(last_word_out_hc & data_out_hc);
|
|
|
|
if (last_word_out_hc = '1') then
|
|
check_stage <= RESPONSE;
|
|
end if;
|
|
end if;
|
|
when RESPONSE =>
|
|
check_stage <= IDLE;
|
|
out_check_done <= '1';
|
|
end case;
|
|
end if;
|
|
-- DEFAULT
|
|
ack_hc <= '0';
|
|
done_hc <= '0';
|
|
ret_hc <= ERROR;
|
|
ready_out_hc <= '0';
|
|
case (check_stage) is
|
|
when IDLE =>
|
|
if (start_hc = '1') then
|
|
ack_hc <= '1';
|
|
end if;
|
|
when CHECK =>
|
|
ready_out_hc <= '1';
|
|
when RESPONSE =>
|
|
done_hc <= '1';
|
|
if (accept = ACCEPT_RES) then
|
|
ret_hc <= OK;
|
|
else
|
|
ret_hc <= REJECTED;
|
|
end if;
|
|
end case;
|
|
end process;
|
|
|
|
watchdog : process
|
|
begin
|
|
wait for 1 ms;
|
|
Alert("Test timeout", FAILURE);
|
|
std.env.stop;
|
|
end process;
|
|
|
|
end architecture; |