|
|
|
|
@ -257,6 +257,7 @@ package rtps_test_package is
|
|
|
|
|
procedure gen_endpoint_match_frame( ref : in ENDPOINT_DATA_TYPE; output : inout TEST_PACKET_TYPE);
|
|
|
|
|
procedure gen_participant_match_frame( ref : in PARTICIPANT_DATA_TYPE; output : inout TEST_PACKET_TYPE);
|
|
|
|
|
procedure gen_liveliness_update_frame( ref : in PARTICIPANT_DATA_TYPE; output : inout TEST_PACKET_TYPE);
|
|
|
|
|
function gen_endpoint(id : natural) return ENDPOINT_DATA_TYPE;
|
|
|
|
|
function gen_endpoint_array(readers : boolean) return ENDPOINT_DATA_ARRAY_TYPE;
|
|
|
|
|
|
|
|
|
|
procedure gen_liveliness_assertion(participant : in PARTICIPANT_DATA_TYPE; manual : in boolean; extra_data : in TEST_PACKET_TYPE; output : inout TEST_PACKET_TYPE);
|
|
|
|
|
@ -269,7 +270,6 @@ package rtps_test_package is
|
|
|
|
|
procedure gen_inline_qos(ref : in CACHE_CHANGE_TYPE; endpoint : in ENDPOINT_DATA_TYPE; expectsInlineQoS : in boolean; littleEndian : in std_logic; output : inout TEST_PACKET_TYPE);
|
|
|
|
|
procedure gen_inline_qos(ref : in CACHE_CHANGE_TYPE; output : inout TEST_PACKET_TYPE);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
procedure gen_rand_loc(RV : inout RandomPType; ret : out LOCATOR_TYPE);
|
|
|
|
|
procedure gen_rand_entityid(RV : inout RandomPType; reader : boolean; ret : out std_logic_vector(ENTITYID_WIDTH-1 downto 0));
|
|
|
|
|
function int(n : integer; width : natural) return std_logic_vector;
|
|
|
|
|
@ -879,11 +879,12 @@ package body rtps_test_package is
|
|
|
|
|
|
|
|
|
|
-- *ACKNACK/NACK_FRAG/HEARTBEAT/HEARTBEAT_FRAG/GAP/DATA/DATA_FRAG*
|
|
|
|
|
if (ref.submessageID = SID_ACKNACK or ref.submessageID = SID_NACK_FRAG or ref.submessageID = SID_HEARTBEAT or ref.submessageID = SID_HEARTBEAT_FRAG or ref.submessageID = SID_GAP or ref.submessageID = SID_DATA or ref.submessageID = SID_DATA_FRAG or ref.submessageID = SID_INFO_TS or ref.submessageID = SID_INFO_SRC or ref.submessageID = SID_INFO_DST or ref.submessageID = SID_INFO_REPLY or ref.submessageID =SID_INFO_REPLY_IP4) then
|
|
|
|
|
-- NOTE: A Submessage Length of 0 is left as is.
|
|
|
|
|
-- Fix Submessage Length
|
|
|
|
|
if (ref.submessageLength = (ref.submessageLength'range => '1')) then
|
|
|
|
|
output.data(start)(SUBMESSAGE_LENGTH_WIDTH-1 downto 0) := endian_swap(ref.flags(SUBMESSAGE_ENDIAN_FLAG_POS), int((output.length-start-1)*4,SUBMESSAGE_LENGTH_WIDTH));
|
|
|
|
|
-- Fix Packet Length
|
|
|
|
|
else
|
|
|
|
|
-- Fix(Truncate/Extend) Packet Length to specified Length
|
|
|
|
|
elsif (ref.submessageLength /= (ref.submessageLength'range => '0')) then
|
|
|
|
|
output.length := start + to_integer(unsigned(ref.submessageLength));
|
|
|
|
|
end if;
|
|
|
|
|
-- *PAD/UKNOWN*
|
|
|
|
|
@ -2278,6 +2279,53 @@ package body rtps_test_package is
|
|
|
|
|
procedure gen_inline_qos(ref : in CACHE_CHANGE_TYPE; endpoint : in ENDPOINT_DATA_TYPE; expectsInlineQoS : in boolean; littleEndian : in std_logic; output : inout TEST_PACKET_TYPE; pid : in std_logic_vector(PARAMETER_ID_WIDTH-1 downto 0); offset : in integer) is
|
|
|
|
|
variable tmp : natural := 0;
|
|
|
|
|
begin
|
|
|
|
|
-- *INLINE-ONLY*
|
|
|
|
|
-- Key Hash
|
|
|
|
|
if (ref.instance /= HANDLE_NIL or pid = PID_KEY_HASH) then
|
|
|
|
|
if (pid = PID_KEY_HASH) then
|
|
|
|
|
assert (16+(offset*4) >= 0) report "Parameter Length < 0" severity FAILURE;
|
|
|
|
|
output.data(output.length) := PID_KEY_HASH & endian_swap(littleEndian, int(16+(offset*4),PARAMETER_LENGTH_WIDTH));
|
|
|
|
|
else
|
|
|
|
|
output.data(output.length) := PID_KEY_HASH & endian_swap(littleEndian, int(16,PARAMETER_LENGTH_WIDTH));
|
|
|
|
|
end if;
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
output.data(output.length) := ref.instance(0);
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
output.data(output.length) := ref.instance(1);
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
output.data(output.length) := ref.instance(2);
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
output.data(output.length) := ref.instance(3);
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
if (pid = PID_KEY_HASH) then
|
|
|
|
|
output.length := output.length + offset;
|
|
|
|
|
end if;
|
|
|
|
|
end if;
|
|
|
|
|
-- Status Info
|
|
|
|
|
if (ref.kind /= ALIVE or pid = PID_STATUS_INFO) then
|
|
|
|
|
if (pid = PID_STATUS_INFO) then
|
|
|
|
|
assert (4+(offset*4) >= 0) report "Parameter Length < 0" severity FAILURE;
|
|
|
|
|
output.data(output.length) := PID_STATUS_INFO & endian_swap(littleEndian, int(4+(offset*4),PARAMETER_LENGTH_WIDTH));
|
|
|
|
|
else
|
|
|
|
|
output.data(output.length) := PID_STATUS_INFO & endian_swap(littleEndian, int(4,PARAMETER_LENGTH_WIDTH));
|
|
|
|
|
end if;
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
output.data(output.length) := (others => '0');
|
|
|
|
|
case (ref.kind) is
|
|
|
|
|
when ALIVE_FILTERED =>
|
|
|
|
|
output.data(output.length)(SSI_FILTERED_FLAG) := '1';
|
|
|
|
|
when NOT_ALIVE_DISPOSED =>
|
|
|
|
|
output.data(output.length)(SSI_DISPOSED_FLAG) := '1';
|
|
|
|
|
when NOT_ALIVE_UNREGISTERED =>
|
|
|
|
|
output.data(output.length)(SSI_UNREGISTERED_FLAG) := '1';
|
|
|
|
|
when others =>
|
|
|
|
|
null;
|
|
|
|
|
end case;
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
if (pid = PID_STATUS_INFO) then
|
|
|
|
|
output.length := output.length + offset;
|
|
|
|
|
end if;
|
|
|
|
|
end if;
|
|
|
|
|
-- ENDPOINT DATA QOS
|
|
|
|
|
if (expectsInlineQoS) then
|
|
|
|
|
-- TOPIC NAME
|
|
|
|
|
@ -2480,53 +2528,6 @@ package body rtps_test_package is
|
|
|
|
|
end if;
|
|
|
|
|
end if;
|
|
|
|
|
end if;
|
|
|
|
|
-- *INLINE-ONLY*
|
|
|
|
|
-- Status Info
|
|
|
|
|
if (ref.kind /= ALIVE or pid = PID_STATUS_INFO) then
|
|
|
|
|
if (pid = PID_STATUS_INFO) then
|
|
|
|
|
assert (4+(offset*4) >= 0) report "Parameter Length < 0" severity FAILURE;
|
|
|
|
|
output.data(output.length) := PID_STATUS_INFO & endian_swap(littleEndian, int(4+(offset*4),PARAMETER_LENGTH_WIDTH));
|
|
|
|
|
else
|
|
|
|
|
output.data(output.length) := PID_STATUS_INFO & endian_swap(littleEndian, int(4,PARAMETER_LENGTH_WIDTH));
|
|
|
|
|
end if;
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
output.data(output.length) := (others => '0');
|
|
|
|
|
case (ref.kind) is
|
|
|
|
|
when ALIVE_FILTERED =>
|
|
|
|
|
output.data(output.length)(SSI_FILTERED_FLAG) := '1';
|
|
|
|
|
when NOT_ALIVE_DISPOSED =>
|
|
|
|
|
output.data(output.length)(SSI_DISPOSED_FLAG) := '1';
|
|
|
|
|
when NOT_ALIVE_UNREGISTERED =>
|
|
|
|
|
output.data(output.length)(SSI_UNREGISTERED_FLAG) := '1';
|
|
|
|
|
when others =>
|
|
|
|
|
null;
|
|
|
|
|
end case;
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
if (pid = PID_STATUS_INFO) then
|
|
|
|
|
output.length := output.length + offset;
|
|
|
|
|
end if;
|
|
|
|
|
end if;
|
|
|
|
|
-- Key Hash
|
|
|
|
|
if (ref.instance /= HANDLE_NIL or pid = PID_KEY_HASH) then
|
|
|
|
|
if (pid = PID_KEY_HASH) then
|
|
|
|
|
assert (16+(offset*4) >= 0) report "Parameter Length < 0" severity FAILURE;
|
|
|
|
|
output.data(output.length) := PID_KEY_HASH & endian_swap(littleEndian, int(16+(offset*4),PARAMETER_LENGTH_WIDTH));
|
|
|
|
|
else
|
|
|
|
|
output.data(output.length) := PID_KEY_HASH & endian_swap(littleEndian, int(16,PARAMETER_LENGTH_WIDTH));
|
|
|
|
|
end if;
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
output.data(output.length) := ref.instance(0);
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
output.data(output.length) := ref.instance(1);
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
output.data(output.length) := ref.instance(2);
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
output.data(output.length) := ref.instance(3);
|
|
|
|
|
output.length := output.length + 1;
|
|
|
|
|
if (pid = PID_KEY_HASH) then
|
|
|
|
|
output.length := output.length + offset;
|
|
|
|
|
end if;
|
|
|
|
|
end if;
|
|
|
|
|
end procedure;
|
|
|
|
|
|
|
|
|
|
procedure gen_inline_qos(ref : in CACHE_CHANGE_TYPE; endpoint : in ENDPOINT_DATA_TYPE; expectsInlineQoS : in boolean; littleEndian : in std_logic; output : inout TEST_PACKET_TYPE) is
|
|
|
|
|
@ -2553,73 +2554,55 @@ package body rtps_test_package is
|
|
|
|
|
return TRUE;
|
|
|
|
|
end function;
|
|
|
|
|
|
|
|
|
|
function gen_endpoint(id : natural) return ENDPOINT_DATA_TYPE is
|
|
|
|
|
variable ret : ENDPOINT_DATA_TYPE := DEFAULT_ENDPOINT_DATA;
|
|
|
|
|
begin
|
|
|
|
|
assert (id <= NUM_ENDPOINTS-1) report "ID outside bounds." severity FAILURE;
|
|
|
|
|
|
|
|
|
|
ret.reader := TRUE when (id < NUM_READERS) else FALSE;
|
|
|
|
|
ret.topic_name := ENDPOINT_TOPIC(id);
|
|
|
|
|
ret.type_name := ENDPOINT_TYPE(id);
|
|
|
|
|
ret.durability := ENDPOINT_DURABILITY_QOS(id);
|
|
|
|
|
ret.durability_service_cleanup_delay := ENDPOINT_DURABILITY_SERVICE_CLEANUP_DELAY(id);
|
|
|
|
|
ret.durability_service_history := ENDPOINT_DURABILITY_SERVICE_HISTORY(id);
|
|
|
|
|
ret.durability_service_history_depth := ENDPOINT_DURABILITY_SERVICE_HISTORY_DEPTH(id);
|
|
|
|
|
ret.durability_service_max_samples := ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES(id);
|
|
|
|
|
ret.durability_service_max_instances := ENDPOINT_DURABILITY_SERVICE_MAX_INSTANCES(id);
|
|
|
|
|
ret.durability_service_max_samples_per_instances := ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES_PER_INSTANCE(id);
|
|
|
|
|
ret.presentation := ENDPOINT_PRESENTATION_QOS(id);
|
|
|
|
|
ret.coherent_access(0) := boolean_to_std_logic(ENDPOINT_COHERENT_ACCESS(id));
|
|
|
|
|
ret.ordered_access(0) := boolean_to_std_logic(ENDPOINT_ORDERED_ACCESS(id));
|
|
|
|
|
ret.deadline := ENDPOINT_DEADLINE_QOS(id);
|
|
|
|
|
ret.latency_budget := ENDPOINT_LATENCY_BUDGET_QOS(id);
|
|
|
|
|
ret.ownership := ENDPOINT_OWNERSHIP_QOS(id);
|
|
|
|
|
ret.ownership_strength := ENDPOINT_OWNERSHIP_STRENGTH_QOS(id);
|
|
|
|
|
ret.liveliness := ENDPOINT_LIVELINESS_QOS(id);
|
|
|
|
|
ret.leaseDuration := ENDPOINT_LEASE_DURATION(id);
|
|
|
|
|
ret.time_based_filter := ENDPOINT_TIME_BASED_FILTER_QOS(id);
|
|
|
|
|
ret.reliability := ENDPOINT_RELIABILITY_QOS(id);
|
|
|
|
|
ret.max_blocking_time := ENDPOINT_MAX_BLOCKING_TIME(id);
|
|
|
|
|
ret.transport_priority := ENDPOINT_TRANSPORT_PRIORITY_QOS(id);
|
|
|
|
|
ret.lifespan := ENDPOINT_LIFESPAN_QOS(id);
|
|
|
|
|
ret.destination_order := ENDPOINT_DESTINATION_ORDER_QOS(id);
|
|
|
|
|
ret.expectsInlineQoS(0) := '1' when (id < NUM_READERS) else '0';
|
|
|
|
|
ret.participant := THIS_PARTICIPANT_DATA;
|
|
|
|
|
ret.entityId := ENTITYID(id);
|
|
|
|
|
ret.nr := id;
|
|
|
|
|
return ret;
|
|
|
|
|
end function;
|
|
|
|
|
|
|
|
|
|
function gen_endpoint_array(readers : boolean) return ENDPOINT_DATA_ARRAY_TYPE is
|
|
|
|
|
variable ret_readers : ENDPOINT_DATA_ARRAY_TYPE(0 to NUM_READERS-1) := (others => DEFAULT_ENDPOINT_DATA);
|
|
|
|
|
variable ret_writers : ENDPOINT_DATA_ARRAY_TYPE(0 to NUM_WRITERS-1) := (others => DEFAULT_ENDPOINT_DATA);
|
|
|
|
|
begin
|
|
|
|
|
if (readers) then
|
|
|
|
|
for i in 0 to NUM_READERS-1 loop
|
|
|
|
|
ret_readers(i).reader := TRUE;
|
|
|
|
|
ret_readers(i).topic_name := ENDPOINT_TOPIC(i);
|
|
|
|
|
ret_readers(i).type_name := ENDPOINT_TYPE(i);
|
|
|
|
|
ret_readers(i).durability := ENDPOINT_DURABILITY_QOS(i);
|
|
|
|
|
ret_readers(i).durability_service_cleanup_delay := ENDPOINT_DURABILITY_SERVICE_CLEANUP_DELAY(i);
|
|
|
|
|
ret_readers(i).durability_service_history := ENDPOINT_DURABILITY_SERVICE_HISTORY(i);
|
|
|
|
|
ret_readers(i).durability_service_history_depth := ENDPOINT_DURABILITY_SERVICE_HISTORY_DEPTH(i);
|
|
|
|
|
ret_readers(i).durability_service_max_samples := ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES(i);
|
|
|
|
|
ret_readers(i).durability_service_max_instances := ENDPOINT_DURABILITY_SERVICE_MAX_INSTANCES(i);
|
|
|
|
|
ret_readers(i).durability_service_max_samples_per_instances := ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES_PER_INSTANCE(i);
|
|
|
|
|
ret_readers(i).presentation := ENDPOINT_PRESENTATION_QOS(i);
|
|
|
|
|
ret_readers(i).coherent_access(0) := boolean_to_std_logic(ENDPOINT_COHERENT_ACCESS(i));
|
|
|
|
|
ret_readers(i).ordered_access(0) := boolean_to_std_logic(ENDPOINT_ORDERED_ACCESS(i));
|
|
|
|
|
ret_readers(i).deadline := ENDPOINT_DEADLINE_QOS(i);
|
|
|
|
|
ret_readers(i).latency_budget := ENDPOINT_LATENCY_BUDGET_QOS(i);
|
|
|
|
|
ret_readers(i).ownership := ENDPOINT_OWNERSHIP_QOS(i);
|
|
|
|
|
ret_readers(i).ownership_strength := ENDPOINT_OWNERSHIP_STRENGTH_QOS(i);
|
|
|
|
|
ret_readers(i).liveliness := ENDPOINT_LIVELINESS_QOS(i);
|
|
|
|
|
ret_readers(i).leaseDuration := ENDPOINT_LEASE_DURATION(i);
|
|
|
|
|
ret_readers(i).time_based_filter := ENDPOINT_TIME_BASED_FILTER_QOS(i);
|
|
|
|
|
ret_readers(i).reliability := ENDPOINT_RELIABILITY_QOS(i);
|
|
|
|
|
ret_readers(i).max_blocking_time := ENDPOINT_MAX_BLOCKING_TIME(i);
|
|
|
|
|
ret_readers(i).transport_priority := ENDPOINT_TRANSPORT_PRIORITY_QOS(i);
|
|
|
|
|
ret_readers(i).lifespan := ENDPOINT_LIFESPAN_QOS(i);
|
|
|
|
|
ret_readers(i).destination_order := ENDPOINT_DESTINATION_ORDER_QOS(i);
|
|
|
|
|
ret_readers(i).expectsInlineQoS(0) := '1';
|
|
|
|
|
ret_readers(i).participant := THIS_PARTICIPANT_DATA;
|
|
|
|
|
ret_readers(i).entityId := ENTITYID(i);
|
|
|
|
|
ret_readers(i).nr := i;
|
|
|
|
|
ret_readers(i) := gen_endpoint(i);
|
|
|
|
|
end loop;
|
|
|
|
|
return ret_readers;
|
|
|
|
|
else
|
|
|
|
|
for i in NUM_READERS to NUM_ENDPOINTS-1 loop
|
|
|
|
|
ret_writers(i-NUM_READERS).reader := FALSE;
|
|
|
|
|
ret_writers(i-NUM_READERS).topic_name := ENDPOINT_TOPIC(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).type_name := ENDPOINT_TYPE(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).durability := ENDPOINT_DURABILITY_QOS(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).durability_service_cleanup_delay := ENDPOINT_DURABILITY_SERVICE_CLEANUP_DELAY(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).durability_service_history := ENDPOINT_DURABILITY_SERVICE_HISTORY(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).durability_service_history_depth := ENDPOINT_DURABILITY_SERVICE_HISTORY_DEPTH(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).durability_service_max_samples := ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).durability_service_max_instances := ENDPOINT_DURABILITY_SERVICE_MAX_INSTANCES(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).durability_service_max_samples_per_instances := ENDPOINT_DURABILITY_SERVICE_MAX_SAMPLES_PER_INSTANCE(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).presentation := ENDPOINT_PRESENTATION_QOS(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).coherent_access(0) := boolean_to_std_logic(ENDPOINT_COHERENT_ACCESS(i));
|
|
|
|
|
ret_writers(i-NUM_READERS).ordered_access(0) := boolean_to_std_logic(ENDPOINT_ORDERED_ACCESS(i));
|
|
|
|
|
ret_writers(i-NUM_READERS).deadline := ENDPOINT_DEADLINE_QOS(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).latency_budget := ENDPOINT_LATENCY_BUDGET_QOS(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).ownership := ENDPOINT_OWNERSHIP_QOS(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).ownership_strength := ENDPOINT_OWNERSHIP_STRENGTH_QOS(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).liveliness := ENDPOINT_LIVELINESS_QOS(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).leaseDuration := ENDPOINT_LEASE_DURATION(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).time_based_filter := ENDPOINT_TIME_BASED_FILTER_QOS(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).reliability := ENDPOINT_RELIABILITY_QOS(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).max_blocking_time := ENDPOINT_MAX_BLOCKING_TIME(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).transport_priority := ENDPOINT_TRANSPORT_PRIORITY_QOS(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).lifespan := ENDPOINT_LIFESPAN_QOS(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).destination_order := ENDPOINT_DESTINATION_ORDER_QOS(i);
|
|
|
|
|
ret_writers(i-NUM_READERS).participant := THIS_PARTICIPANT_DATA;
|
|
|
|
|
ret_writers(i-NUM_READERS).entityId := ENTITYID(i);
|
|
|
|
|
ret_readers(i-NUM_READERS).nr := i;
|
|
|
|
|
ret_writers(i-NUM_READERS) := gen_endpoint(i);
|
|
|
|
|
end loop;
|
|
|
|
|
return ret_writers;
|
|
|
|
|
end if;
|
|
|
|
|
|