Testbench Code Refactoring

This commit is contained in:
Greek 2021-03-02 17:15:08 +01:00
parent a9eb56d6e5
commit 7ccf850adc
11 changed files with 101 additions and 111 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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;