rtps-fpga/src/Tests/Level_0/L0_rtps_builtin_endpoint_test2.vhd
Greek b9dff6bd71 * General Testbench Update
- Change Testbench naming Convention (File and Internal)
	- Remove Component declarations and use direct instantiating
* Add more static generated SLVs in rtps_config_package
2020-12-06 19:32:40 +01:00

915 lines
38 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 matching of remote endpoints. This is done by checking the Match/Unmatch Frame sent to the local endpoints.
-- The local participant is configured with following endpoints (called "fixed" endpoints):
-- NOTE: All Endpoints are configured with topic "TOPIC_1" and type "TYPE_1", except is explicitly stated otherwise.
-- WRITER 0
-- * DEFAULT
-- WRITER 1
-- * TYPE_2
-- WRITER 2
-- * TOPIC_2
-- * TYPE_2
-- WRITER 3
-- * RELIABILITY BEST_EFFORT
-- WRITER 4
-- * DURABILITY TRANSIENT_LOCAL
-- * PRESENTATION TOPIC
-- * COHERENT_ACCESS TRUE
-- * DEADLINE 15s
-- * LATENCY_BUDGET 1s
-- * LIVELINESS MANUAL_BY_PARTICIPANT
-- * LEASE_DURATION 15s
-- * DESTINATION_ORDER BY_SOURCE_TIMESTAMP
-- WRITER 5
-- * PRESENTATION TOPIC
-- * COHERENT_ACCESS TRUE
-- * ORDERED_ACCESS TRUE
-- WRITER 6
-- * LATENCY_BUDGET 1s
-- WRITER 7
-- * DURABILITY_SERVICE_CLEANUP_DELAY 86400s
-- * DURABILITY_SERVICE_HISTORY KEEP_ALL_HISTORY_QOS
-- * DURABILITY_SERVICE_HISTORY_DEPTH 10
-- * DURABILITY_SERVICE_MAX_SAMPLES 10
-- * DURABILITY_SERVICE_MAX_INSTANCES 5
-- * DURABILITY_SERVICE_MAX_SAMPLES_PER_INSTANCE 5
-- * OWNERSHIP_STRENGTH 2
-- * MAX_BLOCKING_TIME 2s
-- * TRANSPORT_PRIORITY 3
-- * LIFESPAN 30s
-- * USER_DATA "USER_DATA"
-- * TOPIC_DATA "TOPIC_DATA"
-- * GROUP_DATA "GROUP_DATA"
-- READER 0
-- * DEFAULT
-- READER 1
-- * TYPE_2
-- READER 2
-- * TOPIC_2
-- * TYPE_2
-- READER 3
-- * DURABILITY TRANSIENT_LOCAL
-- READER 4
-- * PRESENTATION TOPIC
-- READER 5
-- * COHERENT_ACCESS TRUE
-- READER 6
-- * COHERENT_ACCESS TRUE
-- * ORDERED_ACCESS TRUE
-- READER 7
-- * DEADLINE 10s
-- * TIME_BASED_FILTER 5s
-- READER 8
-- * DEADLINE 20s
-- * TIME_BASED_FILTER 5s
-- READER 9
-- * LATENCY_BUDGET 500ms
-- READER 10
-- * LATENCY_BUDGET 2s
-- READER 11
-- * LIVELINESS MANUAL_BY_PARTICIPANT
-- * LEASE_DURATION 20s
-- READER 12
-- * LIVELINESS MANUAL_BY_TOPIC
-- * LEASE_DURATION 20s
-- READER 13
-- * LEASE_DURATION 10s
-- READER 14
-- * LEASE_DURATION 20s
-- READER 15
-- * RELIABILITY BEST_EFFORT
-- READER 16
-- * DESTINATION_ORDER BY_SOURCE_TIMESTAMP
-- The testbench announces 3 remote Participants. Participant 0 and 1 contain the same endpoints as our local Participant, but Participant 1 announces everything in Little Endian format.
-- Participant 2 announces extra endpoints to test matching for Readers/Writers with unsupported/ignored QoS
entity L0_rtps_builtin_endpoint_test2 is
end entity;
architecture testbench of L0_rtps_builtin_endpoint_test2 is
-- *TYPE DECLARATION*
type TEST_STAGE_TYPE is (IDLE, BUSY);
type MATCH_MATRIX_TYPE is array (0 to NUM_WRITERS-1) of std_logic_vector(0 to NUM_READERS-1);
-- *SIGNAL DECLARATION*
signal clk, in_empty, rd_sig, last_word_in, last_word_out: std_logic := '0';
signal reset : std_logic := '1';
signal endpoint_wr, endpoint_full : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
signal data_in, data_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal stim_stage : TEST_STAGE_TYPE := IDLE;
shared variable stimulus, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
signal packet_sent : std_logic := '0';
signal cnt_stim : natural := 0;
signal start : std_logic := '0';
shared variable SB : work.ScoreBoardPkg_builtin_endpoint.ScoreBoardPType;
signal MATCH_MATRIX : MATCH_MATRIX_TYPE := (others => (others => '0'));
signal stim_done, check_done : std_logic := '0';
-- *FUNCTION DECLARATION*
procedure wait_on_complete is
begin
wait until rising_edge(packet_sent);
end procedure;
impure function gen_wr(index : natural; reader : boolean) return std_logic_vector is
variable ret : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
begin
if (reader) then
for i in 0 to NUM_WRITERS-1 loop
ret(NUM_READERS+i) := MATCH_MATRIX(i)(index);
end loop;
else
for i in 0 to NUM_READERS-1 loop
ret(i) := MATCH_MATRIX(index)(i);
end loop;
end if;
return ret;
end function;
begin
-- Unit Under Test
uut : entity work.rtps_builtin_endpoint(arch)
port map (
clk => clk,
reset => reset,
empty => in_empty or packet_sent,
rd => rd_sig,
data_in => data_in,
data_out => data_out,
last_word_in => last_word_in,
time => TIME_ZERO,
endpoint_full => endpoint_full,
endpoint_wr => endpoint_wr,
rtps_wr => open,
rtps_full => '0',
last_word_out => last_word_out,
alive => (others => '0')
);
stimulus_prc : process
variable sub, sub_p, sub_s : RTPS_SUBMESSAGE_TYPE := DEFAULT_RTPS_SUBMESSAGE;
variable check_cnt : natural := 0;
variable RV : RandomPType;
variable p0, p1, p2, participant: PARTICIPANT_DATA_TYPE := DEFAULT_PARTICIPANT_DATA;
variable fixed_readers : ENDPOINT_DATA_ARRAY_TYPE(0 to NUM_READERS-1) := gen_endpoint_array(TRUE);
variable fixed_writers : ENDPOINT_DATA_ARRAY_TYPE(0 to NUM_WRITERS-1) := gen_endpoint_array(FALSE);
variable endpoint, e1, e2 : ENDPOINT_DATA_TYPE := DEFAULT_ENDPOINT_DATA;
variable p0_snp, p1_snp, p2_snp : SEQUENCENUMBER_TYPE := FIRST_SEQUENCENUMBER;
variable p0_sns, p1_sns, p2_sns : SEQUENCENUMBER_TYPE := FIRST_SEQUENCENUMBER;
variable p_sn : SEQUENCENUMBER_TYPE := FIRST_SEQUENCENUMBER;
variable wr_sig : std_logic_vector(0 to NUM_ENDPOINTS-1) := (others => '0');
variable user_data, topic_data, group_data : STRING_WORD_ARRAY_TYPE := EMPTY_STRING;
variable partition : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
-- 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_entityid_2(reader : boolean) return std_logic_vector is
variable ret : std_logic_vector(ENTITYID_WIDTH-1 downto 0) := (others => '0');
begin
gen_rand_entityid(RV, reader, ret);
return ret;
end function;
procedure push_endpoint_reference is
begin
-- MATCH
if (wr_sig /= (wr_sig'range => '0')) then
endpoint.match := MATCH;
gen_endpoint_match_frame(endpoint, reference);
for i in 0 to reference.length-1 loop
SB.Push(wr_sig & reference.last(i) & reference.data(i));
end loop;
reference := EMPTY_TEST_PACKET;
end if;
-- UNMATCH
if ((not wr_sig) /= (wr_sig'range => '0')) then
endpoint.match := UNMATCH;
gen_endpoint_match_frame(endpoint, reference);
for i in 0 to reference.length-1 loop
SB.Push((not wr_sig) & reference.last(i) & reference.data(i));
end loop;
reference := EMPTY_TEST_PACKET;
end if;
end procedure;
procedure push_participant_reference is
variable wr_sig : std_logic_vector(NUM_ENDPOINTS-1 downto 0) := (others => '1');
begin
gen_participant_match_frame(participant, reference);
for i in 0 to reference.length-1 loop
SB.Push(wr_sig & reference.last(i) & reference.data(i));
end loop;
reference := EMPTY_TEST_PACKET;
end procedure;
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_test is
begin
start <= '1';
wait until rising_edge(clk);
start <= '0';
wait until rising_edge(clk);
end procedure;
begin
assert (TEST_STRING = "TEST_CONFIG_1") report "user_config incompatible with testbench." severity FAILURE;
SetAlertLogName("rtps_builtin_endpoint - Level 0 - Endpoint Matching");
SetAlertEnable(FAILURE, TRUE);
SetAlertEnable(ERROR, TRUE);
SetAlertEnable(WARNING, TRUE);
SetLogEnable(DEBUG, FALSE);
SetLogEnable(PASSED, FALSE);
SetLogEnable(INFO, TRUE);
RV.InitSeed(RV'instance_name);
-- Populate MATCH Matrix
MATCH_MATRIX <= (
0 => (0 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0'),
1 => (1 => '1', others => '0'),
2 => (2 => '1', others => '0'),
3 => (15 => '1', others => '0'),
4 => (0 => '1', 3 => '1', 4 => '1', 5 => '1', 8 => '1', 9 => '1', 10 => '1', 11 => '1', 14 => '1', 15 => '1', 16 => '1', others => '0'),
5 => (0 => '1', 4 => '1', 5 => '1', 6 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0'),
6 => (10 => '1', others => '0'),
7 => (0 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0')
);
-- Participant RTPS Submessage
sub := DEFAULT_RTPS_SUBMESSAGE;
sub.submessageID := SID_DATA;
sub.writerId := ENTITYID_SPDP_BUILTIN_PARTICIPANT_ANNOUNCER;
sub.readerId := ENTITYID_SPDP_BUILTIN_PARTICIPANT_DETECTOR;
sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
-- Publisher Endpoint RTPS Submessage
sub_p := DEFAULT_RTPS_SUBMESSAGE;
sub_p.submessageID := SID_DATA;
sub_p.writerId := ENTITYID_SEDP_BUILTIN_PUBLICATIONS_ANNOUNCER;
sub_p.readerId := ENTITYID_SEDP_BUILTIN_PUBLICATIONS_DETECTOR;
sub_p.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
-- Subscriber Endpoint RTPS Submessage
sub_s := DEFAULT_RTPS_SUBMESSAGE;
sub_s.submessageID := SID_DATA;
sub_s.writerId := ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_ANNOUNCER;
sub_s.readerId := ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_DETECTOR;
sub_s.flags(SUBMESSAGE_DATA_FLAG_POS) := '1';
-- Participant 0 (Contains the fixed Endpoints)
p0.guidPrefix := gen_rand_guid_prefix;
p0.nr := 0;
p0.defaultUnicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR));
p0.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_SUBSCRIPTIONS_DETECTOR) := '1';
p0.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_SUBSCRIPTIONS_ANNOUNCER):= '1';
p0.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_DETECTOR) := '1';
p0.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_ANNOUNCER) := '1';
-- Participant 1 (Contains the fixed Endpoints in Little Endian)
p1.guidPrefix := gen_rand_guid_prefix;
p1.nr := 1;
p1.littleEndian := '1';
p1.defaultUnicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR));
p1.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_SUBSCRIPTIONS_DETECTOR) := '1';
p1.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_SUBSCRIPTIONS_ANNOUNCER):= '1';
p1.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_DETECTOR) := '1';
p1.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_ANNOUNCER) := '1';
-- Participant 2 (Used for dyncamic Endpoints)
p2.guidPrefix := gen_rand_guid_prefix;
p2.nr := 2;
p2.defaultUnicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR));
p2.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_SUBSCRIPTIONS_DETECTOR) := '1';
p2.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_SUBSCRIPTIONS_ANNOUNCER):= '1';
p2.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_DETECTOR) := '1';
p2.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_ANNOUNCER) := '1';
for i in 0 to fixed_writers'length-1 loop
fixed_writers(i).entityId := gen_rand_entityid_2(FALSE);
end loop;
for i in 0 to fixed_readers'length-1 loop
fixed_readers(i).entityId := gen_rand_entityid_2(TRUE);
end loop;
e1.participant := p2;
e1.entityId := gen_rand_entityid_2(FALSE);
e1.topic_name := ENDPOINT_TOPIC(0);
e1.type_name := ENDPOINT_TYPE(0);
e2.participant := p2;
e2.entityId := gen_rand_entityid_2(TRUE);
e2.topic_name := ENDPOINT_TOPIC(0);
e2.type_name := ENDPOINT_TYPE(0);
user_data := convert_string("USER_DATA" & (10 to 256 => NUL));
group_data := convert_string("GROUP_DATA" & (11 to 256 => NUL));
topic_data := convert_string("TOPIC_DATA" & (11 to 256 => NUL));
-- Partition
partition.data(0) := int(10, CDR_LONG_WIDTH);
partition.data(1) := x"50415254";
partition.data(2) := x"4954494f";
partition.data(3) := x"4e000000";
partition.length := 4;
Log("Initiating Test", INFO);
stim_done <= '0';
start <= '0';
reset <= '1';
wait until rising_edge(clk);
wait until rising_edge(clk);
reset <= '0';
-- *Insert Participant 0*
-- Contains the same Endpoints as our Participant, as defined above
Log("Match Participant 0 [Compatible]", INFO);
sub.writerSN := p_sn;
participant := p0;
gen_participant_data(participant, sub.data);
gen_sentinel(sub.data);
gen_rtps_handler_out(sub, participant, stimulus);
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
sub.data := EMPTY_TEST_PACKET;
p_sn := p_sn + 1;
-- *Insert Participant 1*
-- Contains the same Endpoints as Participant 0, but in little Endian
Log("Match Participant 1 [Compatible, Little Endian]", INFO);
sub.writerSN := p_sn;
participant := p1;
gen_participant_data(participant, sub.data);
gen_sentinel(sub.data);
gen_rtps_handler_out(sub, participant, stimulus);
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
sub.data := EMPTY_TEST_PACKET;
p_sn := p_sn + 1;
-- *Insert Participant 2*
-- Used for extra Endpoint testing (e.g. unsupported QoS)
Log("Match Participant 2 [Compatible]", INFO);
sub.writerSN := p_sn;
participant := p2;
gen_participant_data(participant, sub.data);
gen_sentinel(sub.data);
gen_rtps_handler_out(sub, participant, stimulus);
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
sub.data := EMPTY_TEST_PACKET;
p_sn := p_sn + 1;
-- *Fixed Writers (Participant 0)*
for i in 0 to NUM_WRITERS-1 loop
Log("Fixed Writer " & to_string(i) & ", Participant 0", INFO);
sub_p.writerSN := p0_snp;
endpoint := fixed_writers(i);
endpoint.participant := p0;
gen_endpoint_data(endpoint, sub_p.data);
gen_sentinel(sub_p.data);
gen_rtps_handler_out(sub_p, endpoint, stimulus);
wr_sig := gen_wr(i, FALSE);
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
sub_p.data := EMPTY_TEST_PACKET;
p0_snp := p0_snp + 1;
end loop;
-- *Fixed Writers (Participant 1)[Little Endian]*
for i in 0 to NUM_WRITERS-1 loop
Log("Fixed Writer " & to_string(i) & ", Participant 1 [Little Endian]", INFO);
sub_p.writerSN := p1_snp;
endpoint := fixed_writers(i);
endpoint.participant := p1;
endpoint.littleEndian:= '1';
gen_endpoint_data(endpoint, sub_p.data);
gen_sentinel(sub_p.data);
gen_rtps_handler_out(sub_p, endpoint, stimulus);
wr_sig := gen_wr(i, FALSE);
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
sub_p.data := EMPTY_TEST_PACKET;
p1_snp := p1_snp + 1;
end loop;
-- *Fixed Readers (Participant 0)*
for i in 0 to NUM_READERS-1 loop
Log("Fixed Reader " & to_string(i) & ", Participant 0", INFO);
sub_s.writerSN := p0_sns;
endpoint := fixed_readers(i);
endpoint.participant := p0;
gen_endpoint_data(endpoint, sub_s.data);
gen_sentinel(sub_s.data);
gen_rtps_handler_out(sub_s, endpoint, stimulus);
wr_sig := gen_wr(i, TRUE);
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
sub_s.data := EMPTY_TEST_PACKET;
p0_sns := p0_sns + 1;
end loop;
-- *Fixed Readers (Participant 1)[Little Endian]*
for i in 0 to NUM_READERS-1 loop
Log("Fixed Reader " & to_string(i) & ", Participant 1", INFO);
sub_s.writerSN := p1_sns;
endpoint := fixed_readers(i);
endpoint.participant := p1;
endpoint.littleEndian:= '1';
gen_endpoint_data(endpoint, sub_s.data);
gen_sentinel(sub_s.data);
gen_rtps_handler_out(sub_s, endpoint, stimulus);
wr_sig := gen_wr(i, TRUE);
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
sub_s.data := EMPTY_TEST_PACKET;
p1_sns := p1_sns + 1;
end loop;
-- *Remove Participant 1*
Log("Unmatch Participant 1", INFO);
sub.writerSN := p_sn;
participant := p1;
participant.domainId := int(2, DOMAIN_ID_WIDTH);
participant.match := UNMATCH;
gen_participant_data(participant, sub.data);
gen_sentinel(sub.data);
gen_rtps_handler_out(sub, participant, stimulus);
push_participant_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub.data := EMPTY_TEST_PACKET;
p_sn := p_sn + 1;
-- *Participant 2 Endpoints*
-- Writers
Log("Match Participant 2 Writer [Durability Persistent]", INFO);
sub_p.writerSN := p2_snp;
endpoint := DEFAULT_ENDPOINT_DATA;
endpoint.entityId := gen_rand_entityid_2(FALSE);
endpoint.participant := p2;
endpoint.topic_name := ENDPOINT_TOPIC(0);
endpoint.type_name := ENDPOINT_TYPE(0);
endpoint.durability := PERSISTENT_DURABILITY_QOS;
gen_endpoint_data(endpoint, sub_p.data);
gen_sentinel(sub_p.data);
gen_rtps_handler_out(sub_p, endpoint, stimulus);
wr_sig := (0 => '1', 3 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_p.data := EMPTY_TEST_PACKET;
p2_snp := p2_snp + 1;
Log("Match Participant 2 Writer [Presentation Group]", INFO);
sub_p.writerSN := p2_snp;
endpoint := DEFAULT_ENDPOINT_DATA;
endpoint.entityId := gen_rand_entityid_2(FALSE);
endpoint.participant := p2;
endpoint.topic_name := ENDPOINT_TOPIC(0);
endpoint.type_name := ENDPOINT_TYPE(0);
endpoint.presentation := GROUP_PRESENTATION_QOS;
gen_endpoint_data(endpoint, sub_p.data);
gen_sentinel(sub_p.data);
gen_rtps_handler_out(sub_p, endpoint, stimulus);
wr_sig := (0 => '1', 4 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_p.data := EMPTY_TEST_PACKET;
p2_snp := p2_snp + 1;
Log("Ignore Participant 2 Writer [Ownership Exclusive]", INFO);
sub_p.writerSN := p2_snp;
endpoint := DEFAULT_ENDPOINT_DATA;
endpoint.entityId := gen_rand_entityid_2(FALSE);
endpoint.participant := p2;
endpoint.topic_name := ENDPOINT_TOPIC(0);
endpoint.type_name := ENDPOINT_TYPE(0);
endpoint.ownership := EXCLUSIVE_OWNERSHIP_QOS;
gen_endpoint_data(endpoint, sub_p.data);
gen_sentinel(sub_p.data);
gen_rtps_handler_out(sub_p, endpoint, stimulus);
wr_sig := (others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_p.data := EMPTY_TEST_PACKET;
p2_snp := p2_snp + 1;
Log("Match Participant 2 Writer [USER_DATA, TOPIC_DATA, GROUP_DATA, MAX_SERIALIZED_PAYLOAD]", INFO);
sub_p.writerSN := p2_snp;
endpoint := DEFAULT_ENDPOINT_DATA;
endpoint.entityId := gen_rand_entityid_2(FALSE);
endpoint.participant := p2;
endpoint.topic_name := ENDPOINT_TOPIC(0);
endpoint.type_name := ENDPOINT_TYPE(0);
endpoint.user_data := user_data;
endpoint.topic_data := topic_data;
endpoint.group_data := group_data;
endpoint.max_size_serialized:= std_logic_vector(to_unsigned(65000, CDR_LONG_WIDTH));
gen_endpoint_data(endpoint, sub_p.data);
gen_sentinel(sub_p.data);
gen_rtps_handler_out(sub_p, endpoint, stimulus);
wr_sig := (0 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_p.data := EMPTY_TEST_PACKET;
p2_snp := p2_snp + 1;
Log("Ignore Participant 2 Writer [Incompatible MAX_SERIALIZED_PAYLOAD]", INFO);
sub_p.writerSN := p2_snp;
endpoint := DEFAULT_ENDPOINT_DATA;
endpoint.entityId := gen_rand_entityid_2(FALSE);
endpoint.participant := p2;
endpoint.topic_name := ENDPOINT_TOPIC(0);
endpoint.type_name := ENDPOINT_TYPE(0);
endpoint.max_size_serialized:= std_logic_vector(to_unsigned(66000, CDR_LONG_WIDTH));
gen_endpoint_data(endpoint, sub_p.data);
gen_sentinel(sub_p.data);
gen_rtps_handler_out(sub_p, endpoint, stimulus);
wr_sig := (others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_p.data := EMPTY_TEST_PACKET;
p2_snp := p2_snp + 1;
Log("Ignore Participant 2 Writer [Non-Default Partition]", INFO);
sub_p.writerSN := p2_snp;
endpoint := DEFAULT_ENDPOINT_DATA;
endpoint.entityId := gen_rand_entityid_2(FALSE);
endpoint.participant := p2;
endpoint.topic_name := ENDPOINT_TOPIC(0);
endpoint.type_name := ENDPOINT_TYPE(0);
gen_endpoint_data(endpoint, sub_p.data);
gen_parameter(PID_PARTITION, partition, sub_p.data);
gen_sentinel(sub_p.data);
gen_rtps_handler_out(sub_p, endpoint, stimulus);
wr_sig := (others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_p.data := EMPTY_TEST_PACKET;
p2_snp := p2_snp + 1;
-- Readers
Log("Ignore Participant 2 Reader [Durability Persistent]", INFO);
sub_s.writerSN := p2_sns;
endpoint := DEFAULT_ENDPOINT_DATA;
endpoint.entityId := gen_rand_entityid_2(TRUE);
endpoint.participant := p2;
endpoint.topic_name := ENDPOINT_TOPIC(0);
endpoint.type_name := ENDPOINT_TYPE(0);
endpoint.durability := PERSISTENT_DURABILITY_QOS;
gen_endpoint_data(endpoint, sub_s.data);
gen_sentinel(sub_s.data);
gen_rtps_handler_out(sub_s, endpoint, stimulus);
wr_sig := (others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_s.data := EMPTY_TEST_PACKET;
p2_sns := p2_sns + 1;
Log("Ignore Participant 2 Reader [Presentation Group]", INFO);
sub_s.writerSN := p2_sns;
endpoint := DEFAULT_ENDPOINT_DATA;
endpoint.entityId := gen_rand_entityid_2(TRUE);
endpoint.participant := p2;
endpoint.topic_name := ENDPOINT_TOPIC(0);
endpoint.type_name := ENDPOINT_TYPE(0);
endpoint.presentation := GROUP_PRESENTATION_QOS;
gen_endpoint_data(endpoint, sub_s.data);
gen_sentinel(sub_s.data);
gen_rtps_handler_out(sub_s, endpoint, stimulus);
wr_sig := (others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_s.data := EMPTY_TEST_PACKET;
p2_sns := p2_sns + 1;
Log("Ignore Participant 2 Reader [Ownership Exclusive]", INFO);
sub_s.writerSN := p2_sns;
endpoint := DEFAULT_ENDPOINT_DATA;
endpoint.entityId := gen_rand_entityid_2(TRUE);
endpoint.participant := p2;
endpoint.topic_name := ENDPOINT_TOPIC(0);
endpoint.type_name := ENDPOINT_TYPE(0);
endpoint.ownership := EXCLUSIVE_OWNERSHIP_QOS;
gen_endpoint_data(endpoint, sub_s.data);
gen_sentinel(sub_s.data);
gen_rtps_handler_out(sub_s, endpoint, stimulus);
wr_sig := (others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_s.data := EMPTY_TEST_PACKET;
p2_sns := p2_sns + 1;
Log("Match Participant 2 Reader [USER_DATA, TOPIC_DATA, GROUP_DATA, EXPECTS_INLINE_QOS]", INFO);
sub_s.writerSN := p2_sns;
endpoint := DEFAULT_ENDPOINT_DATA;
endpoint.entityId := gen_rand_entityid_2(TRUE);
endpoint.participant := p2;
endpoint.topic_name := ENDPOINT_TOPIC(0);
endpoint.type_name := ENDPOINT_TYPE(0);
endpoint.user_data := user_data;
endpoint.topic_data := topic_data;
endpoint.group_data := group_data;
endpoint.expectsInlineQoS(0):= '1';
gen_endpoint_data(endpoint, sub_s.data);
gen_sentinel(sub_s.data);
gen_rtps_handler_out(sub_s, endpoint, stimulus);
wr_sig := (NUM_READERS => '1', NUM_READERS+4 => '1', NUM_READERS+5 => '1', NUM_READERS+7 => '1', others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_s.data := EMPTY_TEST_PACKET;
p2_sns := p2_sns + 1;
Log("Ignore Participant 2 Reader [Non-Default Partition]", INFO);
sub_s.writerSN := p2_sns;
endpoint := DEFAULT_ENDPOINT_DATA;
endpoint.entityId := gen_rand_entityid_2(TRUE);
endpoint.participant := p2;
endpoint.topic_name := ENDPOINT_TOPIC(0);
endpoint.type_name := ENDPOINT_TYPE(0);
gen_endpoint_data(endpoint, sub_s.data);
gen_parameter(PID_PARTITION, partition, sub_s.data);
gen_sentinel(sub_s.data);
gen_rtps_handler_out(sub_s, endpoint, stimulus);
wr_sig := (others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_s.data := EMPTY_TEST_PACKET;
p2_sns := p2_sns + 1;
-- Reader/Writer Match/Unmatch
Log("Match Participant 2 Writer [Default]", INFO);
sub_p.writerSN := p2_snp;
endpoint := e1;
gen_endpoint_data(endpoint, sub_p.data);
gen_sentinel(sub_p.data);
gen_rtps_handler_out(sub_p, endpoint, stimulus);
wr_sig := (0 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_p.data := EMPTY_TEST_PACKET;
p2_snp := p2_snp + 1;
Log("Match Participant 2 Reader [Default]", INFO);
sub_s.writerSN := p2_sns;
endpoint := e2;
gen_endpoint_data(endpoint, sub_s.data);
gen_sentinel(sub_s.data);
gen_rtps_handler_out(sub_s, endpoint, stimulus);
wr_sig := (NUM_READERS => '1', NUM_READERS+4 => '1', NUM_READERS+5 => '1', NUM_READERS+7 => '1', others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_s.data := EMPTY_TEST_PACKET;
p2_sns := p2_sns + 1;
Log("Update Participant 2 Writer [Unicast Locators (1 valid, 2 invalid)]", INFO);
sub_p.writerSN := p2_snp;
endpoint := e1;
endpoint.unicastLocatorList := (numLocators => int(4,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, 1 => gen_rand_loc_2, 2 => gen_rand_loc_2, 3 => gen_rand_loc_2, others => EMPTY_LOCATOR));
endpoint.unicastLocatorList.locator(1).kind := LOCATOR_KIND_UDPv6;
endpoint.unicastLocatorList.locator(2).addr := (others => '0');
endpoint.unicastLocatorList.locator(3).portn := (others => '0');
gen_endpoint_data(endpoint, sub_p.data);
gen_sentinel(sub_p.data);
gen_rtps_handler_out(sub_p, endpoint, stimulus);
wr_sig := (0 => '1', 9 => '1', 10 => '1', 15 => '1', others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_p.data := EMPTY_TEST_PACKET;
p2_snp := p2_snp + 1;
Log("Update Participant 2 Reader [Multicast Locator (1 valid, 2 invalid)]", INFO);
sub_s.writerSN := p2_sns;
endpoint := e2;
endpoint.multicastLocatorList := (numLocators => int(4,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, 1 => gen_rand_loc_2, 2 => gen_rand_loc_2, 3 => gen_rand_loc_2, others => EMPTY_LOCATOR));
endpoint.multicastLocatorList.locator(1).kind := LOCATOR_KIND_UDPv6;
endpoint.multicastLocatorList.locator(2).addr := (others => '0');
endpoint.multicastLocatorList.locator(3).portn := (others => '0');
gen_endpoint_data(endpoint, sub_s.data);
gen_sentinel(sub_s.data);
gen_rtps_handler_out(sub_s, endpoint, stimulus);
wr_sig := (NUM_READERS => '1', NUM_READERS+4 => '1', NUM_READERS+5 => '1', NUM_READERS+7 => '1', others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_s.data := EMPTY_TEST_PACKET;
p2_sns := p2_sns + 1;
Log("Change Match Participant 2 Writer [Reliability Best Effort]", INFO);
sub_p.writerSN := p2_snp;
endpoint := e1;
endpoint.reliability := BEST_EFFORT_RELIABILITY_QOS;
gen_endpoint_data(endpoint, sub_p.data);
gen_sentinel(sub_p.data);
gen_rtps_handler_out(sub_p, endpoint, stimulus);
wr_sig := (15 => '1', others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_p.data := EMPTY_TEST_PACKET;
p2_snp := p2_snp + 1;
Log("Change Match Participant 2 Reader [Topic & Type Change]", INFO);
sub_s.writerSN := p2_sns;
endpoint := e2;
endpoint.topic_name := ENDPOINT_TOPIC(2);
endpoint.type_name := ENDPOINT_TYPE(2);
gen_endpoint_data(endpoint, sub_s.data);
gen_sentinel(sub_s.data);
gen_rtps_handler_out(sub_s, endpoint, stimulus);
wr_sig := (NUM_READERS+2 => '1', others => '0');
push_endpoint_reference;
start_test;
wait_on_complete;
stimulus := EMPTY_TEST_PACKET;
reference := EMPTY_TEST_PACKET;
sub_s.data := EMPTY_TEST_PACKET;
p2_sns := p2_sns + 1;
TranscriptOpen(RESULTS_FILE, APPEND_MODE);
SetTranscriptMirror;
stim_done <= '1';
wait until check_done = '1';
AlertIf(not SB.empty, "Incomplete test run");
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;
in_empty_prc : process
begin
in_empty <= '0';
wait until rd_sig = '1';
wait until rising_edge(clk);
in_empty <= '1';
wait until rising_edge(clk);
end process;
endpoint_full_prc : process
begin
endpoint_full <= (others => '0');
wait until (or endpoint_wr) = '1';
wait until rising_edge(clk);
endpoint_full <= (others => '1');
wait until rising_edge(clk);
end process;
alert_prc : process(all)
begin
if rising_edge(clk) then
alertif(in_empty = '1' and rd_sig = '1', "Input FIFO read signal high while empty signal high", ERROR);
alertif(endpoint_full /= (0 to NUM_ENDPOINTS-1 => '0') and (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')), "Endpoint FIFO write signal high while full signal high", ERROR);
end if;
end process;
input_prc : process(all)
begin
data_in <= stimulus.data(cnt_stim);
last_word_in <= stimulus.last(cnt_stim);
if rising_edge(clk) then
if (reset = '1') then
cnt_stim <= 0;
stim_stage <= IDLE;
packet_sent <= '1';
else
case (stim_stage) is
when IDLE =>
if (start = '1' and stimulus.length /= 0) then
stim_stage <= BUSY;
cnt_stim <= 0;
packet_sent <= '0';
end if;
when BUSY =>
if (rd_sig = '1') then
if (cnt_stim = stimulus.length-1) then
stim_stage <= IDLE;
packet_sent <= '1';
else
cnt_stim <= cnt_stim + 1;
end if;
end if;
end case;
end if;
end if;
end process;
output_prc : process(all)
begin
check_done <= '0';
if rising_edge(clk) then
if (endpoint_wr /= (0 to NUM_ENDPOINTS-1 => '0')) then
SB.Check(endpoint_wr & last_word_out & data_out);
end if;
if (stim_done = '1' and SB.empty) then
check_done <= '1';
end if;
end if;
end process;
watchdog : process
begin
wait for 2 ms;
Alert("Test timeout", FAILURE);
std.env.stop;
end process;
end architecture;