diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_tbk.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_tbk.vhd index ea3c82f..f32f3ca 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test2_tbk.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test2_tbk.vhd @@ -160,6 +160,7 @@ begin 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; diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_trk.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_trk.vhd index 35a5213..ac7deb1 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test2_trk.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test2_trk.vhd @@ -160,6 +160,7 @@ begin 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; diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_vbk.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_vbk.vhd index 24e3c9b..933afb3 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test2_vbk.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test2_vbk.vhd @@ -160,6 +160,7 @@ begin 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; diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_vrk.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_vrk.vhd index f2480c4..2e5bb58 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test2_vrk.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test2_vrk.vhd @@ -160,6 +160,7 @@ begin 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; diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_vrn.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_vrn.vhd index 15359e4..07fe7d2 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test2_vrn.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test2_vrn.vhd @@ -160,6 +160,7 @@ begin 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; diff --git a/src/Tests/Level_0/L0_rtps_reader_test3_a.vhd b/src/Tests/Level_0/L0_rtps_reader_test3_a.vhd index a870521..55cdee1 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test3_a.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test3_a.vhd @@ -159,6 +159,7 @@ begin 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; diff --git a/src/Tests/Level_0/L0_rtps_reader_test3_m.vhd b/src/Tests/Level_0/L0_rtps_reader_test3_m.vhd index af63e17..92bc702 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test3_m.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test3_m.vhd @@ -159,6 +159,7 @@ begin 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; diff --git a/src/Tests/Level_0/L0_rtps_writer_test1_vbkdp.vhd b/src/Tests/Level_0/L0_rtps_writer_test1_vbkdp.vhd index 3611708..125d4b0 100644 --- a/src/Tests/Level_0/L0_rtps_writer_test1_vbkdp.vhd +++ b/src/Tests/Level_0/L0_rtps_writer_test1_vbkdp.vhd @@ -116,8 +116,7 @@ begin last_word_in_hc => '0', cc_instance_handle => HANDLE_NIL, cc_kind => ALIVE, - cc_source_timestamp => TIME_INVALID, - cc_seq_nr => SEQUENCENUMBER_UNKNOWN + cc_source_timestamp => TIME_INVALID ); stimulus_prc : process diff --git a/src/Tests/Level_0/L0_rtps_writer_test1_vrkdp.vhd b/src/Tests/Level_0/L0_rtps_writer_test1_vrkdp.vhd index 0d8ee49..8eb61c7 100644 --- a/src/Tests/Level_0/L0_rtps_writer_test1_vrkdp.vhd +++ b/src/Tests/Level_0/L0_rtps_writer_test1_vrkdp.vhd @@ -116,8 +116,7 @@ begin last_word_in_hc => '0', cc_instance_handle => HANDLE_NIL, cc_kind => ALIVE, - cc_source_timestamp => TIME_INVALID, - cc_seq_nr => SEQUENCENUMBER_UNKNOWN + cc_source_timestamp => TIME_INVALID ); stimulus_prc : process diff --git a/src/rtps_config_package.vhd b/src/rtps_config_package.vhd index 816e34a..e3384a8 100644 --- a/src/rtps_config_package.vhd +++ b/src/rtps_config_package.vhd @@ -840,6 +840,8 @@ package body rtps_config_package is -- SENTINEL ret.length := ret.length + 1; ret.data(ret.length) := PID_SENTINEL & std_logic_vector(to_unsigned(0, 16)); + -- Final Length + ret.length := ret.length + 1; return ret; end function; diff --git a/src/rtps_test_package.vhd b/src/rtps_test_package.vhd index a89ce1d..e7e401c 100644 --- a/src/rtps_test_package.vhd +++ b/src/rtps_test_package.vhd @@ -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;