Support WITH_KEY=FALSE Topics in DDS and RTPS Reader

In the event of Keyless Topics less resources are used with the
help of "synthesis guards".
This commit is contained in:
Greek 2021-02-03 18:28:37 +01:00
parent d3fb1cc176
commit dc8746c463
2 changed files with 2231 additions and 2066 deletions

View File

@ -15,6 +15,7 @@ entity dds_reader is
DESTINATION_ORDER_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := DEFAULT_DESTINATION_ORDER_QOS;
COHERENT_ACCESS : boolean := DEFAULT_COHERENT_ACCESS;
ORDERED_ACCESS : boolean := DEFAULT_ORDERED_ACCESS;
WITH_KEY : boolean := FALSE; -- TODO: Default
);
port (
-- SYSTEM
@ -473,6 +474,7 @@ begin
data_out => payload_read_data
);
gen_instance_mem_ctrl_inst : if WITH_KEY generate
instance_mem_ctrl_inst : entity work.mem_ctrl(arch)
generic map (
ADDR_WIDTH => INSTANCE_MEMORY_ADDR_WIDTH,
@ -493,7 +495,6 @@ begin
data_out => instance_read_data
);
key_hash_generator_inst : entity work.key_hash_generator(arch)
port (
clk => clk,
@ -507,6 +508,7 @@ begin
ready_out => khg_ready_out,
last_word_out => khg_last_word_out
);
end generate;
-- *Main State Machine*
-- STATE DESCRIPTION
@ -660,8 +662,21 @@ begin
-- Reset Timeout
deadline_time_next <= deadline_time + DEADLINE_QOS;
-- Synthesis Guard
if (WITH_KEY) then
stage_next <= CHECK_DEADLINE;
cnt_next <= 0;
else
if (inst_data.status_info(LIVELINESS_FLAG) = '1') then
-- Reset Liveliness Flag
inst_data_next.status_info(LIVELINESS_FLAG) <= '0';
else
-- Update Requested Deadline Missed Status
status_sig_next(REQUESTED_DEADLINE_MISSED_STATUS) <= '1';
deadline_miss_cnt_next <= deadline_miss_cnt + 1;
deadline_miss_cnt_change_next <= deadline_miss_cnt_change + 1;
end if;
end if;
-- LIFESPAN QoS
elsif (lifespan_time <= time) then
-- Reset Timeout
@ -687,20 +702,36 @@ begin
end if;
when REMOVE_WRITER =>
-- Input and Memory Gurad
if (valid_in_rtps = '1' and inst_op_done = '1') then
if (valid_in_rtps = '1') then
res_rtps <= ACK;
-- Synthesis Guard
if (WITH_KEY) then
-- Latch Writer Pos
writer_pos_next <= to_integer(unsigned(data_in_rtps));
inst_op_start <= '1';
inst_opcode <= GET_FIRST_INSTANCE;
inst_mem_fields <= IMF_STATUS_FLAG or IMF_WRITER_BITMAP_FLAG;
stage_next <= REMOVE_WRITER;
res_rtps <= ACK;
cnt_next <= 2;
else
-- Convert Writer Bitmap to SLV
tmp_bitmap := to_endpoint_bitmap(inst_data.writer_bitmap);
-- Remove Writer
tmp_bitmap(to_integer(unsigned(data_in_rtps))) := '0';
-- Convert Back
inst_data_next.writer_bitmap <= from_endpoint_bitmap(tmp_bitmap);
-- NOT_ALIVE_NO_WRITERS Transition
if (tmp_bitmap = (tmp_bitmap'range => '0') and inst_data.status_info(NOT_ALIVE_DISPOSED_FLAG) = '0') then
inst_data_next.status_info(NOT_ALIVE_NO_WRITERS_FLAG) <= '1';
end if;
end if;
end if;
when others =>
null;
end case;
-- Unmark Instances
elsif (unmark_instances = '1') then
elsif (WITH_KEY and unmark_instances = '1') then
-- Memory Operation Guard
if (inst_op_done = '1') then
inst_op_start <= '1';
@ -716,8 +747,8 @@ begin
max_samples_next <= unsigned(max_samples_in);
-- Reset
single_instance_next <= '0';
single_instance_next <= '0';
single_sample_next <= '0';
single_instance_next <= '0' when WITH_KEY else '1';
collection_cnt_next <= 0;
collection_cnt_max_next <= 0;
is_first_instance_sample_next <= '1';
@ -773,13 +804,21 @@ begin
stage_next <= GET_NEXT_SAMPLE;
cnt_next <= 0;
when READ_INSTANCE =>
-- Synthesis Guard
if (WITH_KEY) then
ack_dds <= '1';
single_instance_next <= '1';
cur_sample_next <= oldest_sample;
key_hash_next <= instance_handle_in;
stage_next <= CHECK_INSTANCE;
cnt_next <= 0;
else
ack_dds <= '1';
stage_next <= UNKNOWN_OPERATION;
end if;
when TAKE_INSTANCE =>
-- Synthesis Guard
if (WITH_KEY) then
ack_dds <= '1';
is_take_next <= '1';
single_instance_next <= '1';
@ -787,7 +826,13 @@ begin
key_hash_next <= instance_handle_in;
stage_next <= CHECK_INSTANCE;
cnt_next <= 0;
else
ack_dds <= '1';
stage_next <= UNKNOWN_OPERATION;
end if;
when READ_NEXT_INSTANCE =>
-- Synthesis Guard
if (WITH_KEY) then
ack_dds <= '1';
single_instance_next <= '1';
dynamic_next_instance_next <= '1';
@ -795,7 +840,13 @@ begin
key_hash_next <= instance_handle_in;
stage_next <= FIND_NEXT_INSTANCE;
cnt_next <= 0;
else
ack_dds <= '1';
stage_next <= UNKNOWN_OPERATION;
end if;
when TAKE_NEXT_INSTANCE =>
-- Synthesis Guard
if (WITH_KEY) then
ack_dds <= '1';
is_take_next <= '1';
single_instance_next <= '1';
@ -804,6 +855,10 @@ begin
key_hash_next <= instance_handle_in;
stage_next <= FIND_NEXT_INSTANCE;
cnt_next <= 0;
else
ack_dds <= '1';
stage_next <= UNKNOWN_OPERATION;
end if;
when GET_SAMPLE_REJECTED_STATUS =>
ack_dds <= '1';
stage_next <= GET_SAMPLE_REJECTED_STATUS;
@ -819,7 +874,7 @@ begin
end if;
when UNKNOWN_OPERATION =>
done_dds <= '1';
return_code_dds <= RETCODE_UNSUPPORTED;
return_code_dds <= RETCODE_ILLEGAL_OPERATION;
-- DONE
stage_next <= IDLE;
@ -958,11 +1013,15 @@ begin
-- Memory Flow Control Guard
if (sample_ready_in = '1') then
-- If Key Hash is available, start the Instance Search first
if (has_key_hash = '1') then
if (WITH_KEY and has_key_hash = '1') then
stage_next <= INITIATE_INSTANCE_SEARCH;
else
if (has_data = '1' or (WITH_KEY and has_key_hash = '0')) then
stage_next <= ADD_PAYLOAD;
cnt_next <= 0;
else
stage_next <= FILTER_STAGE;
end if;
end if;
end if;
when ADD_PAYLOAD =>
@ -988,7 +1047,7 @@ begin
cnt2_next <= cnt2 + 1;
-- Key Hash needs to be calculated
if (has_key_hash = '0') then
if (WITH_KEY and has_key_hash = '0') then
cnt_next <= 1;
else
ready_in_rtps <= '1';
@ -1015,6 +1074,8 @@ begin
end if;
-- Push to KHG
when 1 =>
-- Synthesis Guard
if (WITH_KEY) then
assert (valid_in_rtps = '1') severity FAILURE;
khg_valid_in <= '1';
@ -1056,6 +1117,7 @@ begin
end if;
end if;
end if;
end if;
when others =>
null;
end case;
@ -1106,7 +1168,7 @@ begin
if (payload_ready_in = '1') then
-- Exit Condition
if (cnt2 = PAYLOAD_FRAME_SIZE-1) then
if (has_key_hash = '0') then
if (WITH_KEY and has_key_hash = '0') then
stage_next <= GET_KEY_HASH;
cnt_next <= 0;
else
@ -1115,7 +1177,8 @@ begin
end if;
end if;
when GET_KEY_HASH =>
-- Synthesis Guard
if (WITH_KEY) then
khg_ready_out <= '1';
if (khg_valid_out = '1') then
@ -1130,7 +1193,10 @@ begin
stage_next <= INITIATE_INSTANCE_SEARCH;
end if;
end if;
end if;
when INITIATE_INSTANCE_SEARCH =>
-- Synthesis Guard
if (WITH_KEY) then
-- Memory Operation Guard
if (inst_op_done = '1') then
inst_op_start <= '1';
@ -1145,17 +1211,18 @@ begin
stage_next <= FILTER_STAGE;
end if;
end if;
end if;
when FILTER_STAGE =>
-- Precondition: cur_sample set
-- Wait for Instance Search to finish
if (inst_op_done = '1') then
if (not WITH_KEY or inst_op_done = '1') then
sample_valid_in <= '1';
sample_addr <= cur_sample + SMF_INSTANCE_ADDR_OFFSET;
cur_inst_next <= inst_addr_base;
-- Instance Found
if (inst_addr_base /= INSTANCE_MEMORY_MAX_ADDRESS) then
if (not WITH_KEY or inst_addr_base /= INSTANCE_MEMORY_MAX_ADDRESS) then
-- Store Instance Address
sample_write_data <= inst_addr_base;
@ -1167,7 +1234,7 @@ begin
res_rtps <= ACCEPTED;
stage_next <= IDLE;
-- RESOURCE_LIMITS_QOS (MAX_SAMPLES_PER_INSTANCE)
elsif (MAX_SAMPLES_PER_INSTANCE /= LENGTH_UNLIMITED and inst_data.sample_cnt = MAX_SAMPLES_PER_INSTANCE) then
elsif (WITH_KEY and MAX_SAMPLES_PER_INSTANCE /= LENGTH_UNLIMITED and inst_data.sample_cnt = MAX_SAMPLES_PER_INSTANCE) then
if (HISTORY_QOS = KEEP_LAST_HISTORY_QOS and RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then
-- Reject Change
res_rtps <= REJECTED;
@ -1289,7 +1356,7 @@ begin
end if;
when UPDATE_INSTANCE =>
-- Memory Operation Guard
if (inst_op_done = '1') then
if (not WITH_KEY or inst_op_done = '1') then
-- DEFAULT
tmp_update := (others => '0');
@ -1298,20 +1365,17 @@ begin
-- ALIVE -> NOT_ALIVE_DISPOSED Transition
if (inst_data.status_info(NOT_ALIVE_DISPOSED_FLAG) /= '1' and inst_data.status_info(NOT_ALIVE_NO_WRITERS_FLAG) /= '1') then
-- STATUS INFO
-- Synthesis Guard
if (WITH_KEY) then
tmp_update <= tmp_update or IMF_STATUS_FLAG;
status_info_update <= inst_data.status;
status_info_update(NOT_ALIVE_DISPOSED_FLAG) <= '1';
status_info_update(NOT_ALIVE_NO_WRITERS_FLAG) <= '0';
status_info_update(LIVELINESS_FLAG) <= '1';
else
inst_data_next.status_info(NOT_ALIVE_DISPOSED_FLAG) <= '1';
inst_data_next.status_info(LIVELINESS_FLAG) <= '1';
end if;
end if;
-- WRITER BITMAP
-- Convert Writer Bitmap to SLV
tmp_bitmap := to_endpoint_bitmap(inst_data.writer_bitmap);
-- Remove Writer
tmp_bitmap(writer_pos) := '0';
-- Convert Back
writer_bitmap <= from_endpoint_bitmap(tmp_bitmap);
tmp_update := tmp_update or IMF_WRITER_BITMAP_FLAG;
-- Instance UNREGISTERED
elsif (sample_status_info(UNREGISTERED_FLAG) = '1') then
-- WRITER BITMAP
@ -1319,38 +1383,66 @@ begin
tmp_bitmap := to_endpoint_bitmap(inst_data.writer_bitmap);
-- Remove Writer
tmp_bitmap(writer_pos) := '0';
-- Convert Back
-- Synthesis Guard
if (WITH_KEY) then
writer_bitmap <= from_endpoint_bitmap(tmp_bitmap);
tmp_update := tmp_update or IMF_WRITER_BITMAP_FLAG;
else
inst_data_next.writer_bitmap <= from_endpoint_bitmap(tmp_bitmap);
end if;
-- ALIVE -> NOT_ALIVE_NO_WRITERS Transition
if (inst_data.status_info(NOT_ALIVE_DISPOSED_FLAG) /= '1' and inst_data.status_info(NOT_ALIVE_NO_WRITERS_FLAG) /= '1' and tmp_bitmap = (tmp_bitmap => '0')) then
-- STATUS INFO
-- Synthesis Guard
if (WITH_KEY) then
tmp_update <= tmp_update or IMF_STATUS_FLAG;
status_info_update <= inst_data.status;
status_info_update(NOT_ALIVE_DISPOSED_FLAG) <= '0';
status_info_update(NOT_ALIVE_NO_WRITERS_FLAG) <= '1';
status_info_update(LIVELINESS_FLAG) <= '1';
else
inst_data_next.status_info(NOT_ALIVE_NO_WRITERS_FLAG) <= '1';
inst_data_next.status_info(LIVELINESS_FLAG) <= '1';
end if;
end if;
-- Instance ALIVE/FILTERED
else
-- STATUS INFO
-- Synthesis Guard
if (WITH_KEY) then
tmp_update <= tmp_update or IMF_STATUS_FLAG;
status_info_update <= inst_data.status;
status_info_update(NOT_ALIVE_DISPOSED_FLAG) <= '0';
status_info_update(NOT_ALIVE_NO_WRITERS_FLAG) <= '0';
status_info_update(LIVELINESS_FLAG) <= '1';
else
inst_data_next.status_info(NOT_ALIVE_DISPOSED_FLAG) <= '0';
inst_data_next.status_info(NOT_ALIVE_NO_WRITERS_FLAG) <= '0';
inst_data_next.status_info(LIVELINESS_FLAG) <= '1';
end if;
-- GENERATION COUNTERS
-- NOT_ALIVE_DISPOSED -> ALIVE Transition
if (inst_data.status_info(NOT_ALIVE_DISPOSED_FLAG) = '1') then
-- Synthesis Guard
if (WITH_KEY) then
tmp_update := tmp_update or IMF_DISPOSED_CNT_FLAG;
gen_cnt <= inst_data.disposed_gen_cnt + 1;
else
inst_data_next.disposed_gen_cnt <= inst_data.disposed_gen_cnt + 1;
end if;
-- NOT_ALIVE_NO_WRITERS -> ALIVE Transition
elsif (inst_data.status_info(NOT_ALIVE_NO_WRITERS_FLAG) = '1') then
-- Synthesis Guard
if (WITH_KEY) then
tmp_update := tmp_update or IMF_NO_WRITERS_CNT_FLAG;
gen_cnt <= inst_data.no_writers_gen_cnt + 1;
else
inst_data_next.no_writers_gen_cnt <= inst_data.no_writers_gen_cnt + 1;
end if;
end if;
-- WRITER BITMAP
@ -1358,28 +1450,48 @@ begin
tmp_bitmap := to_endpoint_bitmap(inst_data.writer_bitmap);
-- Write if Writer New for Instance
if (tmp_bitmap(writer_pos) /= '1') then
-- Remove Writer
tmp_bitmap(writer_pos) := '0';
-- Insert Writer
tmp_bitmap(writer_pos) := '1';
-- Convert Back
-- Synthesis Guard
if (WITH_KEY) then
writer_bitmap <= from_endpoint_bitmap(tmp_bitmap);
tmp_update := tmp_update or IMF_WRITER_BITMAP_FLAG;
else
inst_data_next.writer_bitmap <= from_endpoint_bitmap(tmp_bitmap);
end if;
end if;
end if;
-- INSTANCE SAMPLE COUNT
-- NOTE: Ignored when remove_oldest_inst_sample, since it will be decremented again. (Stays same)
if (remove_oldest_inst_sample = '0') then
-- Synthesis Guard
if (WITH_KEY) then
tmp_update := tmp_update or IMF_SAMPLE_CNT_FLAG;
sample_cnt <= inst_data.sample_cnt + 1;
else
inst_data_next.sample_cnt <= inst_data.sample_cnt + 1;
end if;
-- IGNORE DEADLINE
if (TIME_BASED_FILTER_QOS /= DURATION_ZERO) then
tmp_update := tmp_update or IMF_IGNORE_DEADLINE_FLAG;
deadline <= time + TIME_BASED_FILTER_QOS;
end if;
-- IGNORE DEADLINE
if (TIME_BASED_FILTER_QOS /= DURATION_ZERO) then
-- Synthesis Guard
if (WITH_KEY) then
tmp_update := tmp_update or IMF_IGNORE_DEADLINE_FLAG;
deadline <= time + TIME_BASED_FILTER_QOS;
else
inst_data_next.ignore_deadline <= time + TIME_BASED_FILTER_QOS;
end if;
end if;
-- Synthesis Guard
if (WITH_KEY) then
inst_op_start <= '1';
inst_opcode <= UPDATE_INSTANCE;
inst_mem_fields <= tmp_update;
end if;
if (has_data = '1') then
stage_next <= FINALIZE_PAYLOAD;
@ -1432,18 +1544,16 @@ begin
when PRE_SAMPLE_FINALIZE =>
-- Precondition: cur_sample set
-- Wait for instance Update to Complete
if (not WITH_KEY or inst_op_done = '1') then
case (cnt) is
-- Disposed Generation Counter
when 0 =>
sample_valid_in <= '1';
sample_addr <= cur_sample + SMF_DISPOSED_GEN_CNT_OFFSET;
-- NOT_ALIVE_DISPOSED -> ALIVE Transition
if (inst_data.status_info(NOT_ALIVE_DISPOSED_FLAG) = '1' and sample_status_info(NOT_ALIVE_DISPOSED_FLAG) = '0' and sample_status_info(NOT_ALIVE_NO_WRITERS_FLAG) = '0') then
sample_write_data <= gen_cnt + 1;
else
sample_write_data <= gen_cnt;
end if;
sample_write_data <= inst_data.disposed_gen_cnt;
-- Memory Flow Control Guard
if (sample_ready_in = '1') then
@ -1454,12 +1564,7 @@ begin
sample_valid_in <= '1';
sample_addr <= cur_sample + SMF_NO_WRITERS_GEN_CNT_OFFSET;
-- NOT_ALIVE_NO_WRITERS -> ALIVE Transition
if (inst_data.status_info(NOT_ALIVE_NO_WRITERS_FLAG) = '1' and sample_status_info(NOT_ALIVE_DISPOSED_FLAG) = '0' and sample_status_info(NOT_ALIVE_NO_WRITERS_FLAG) = '0') then
sample_write_data <= gen_cnt + 1;
else
sample_write_data <= gen_cnt;
end if;
sample_write_data <= inst_data.no_writers_gen_cnt;
-- Memory Flow Control Guard
if (sample_ready_in = '1') then
@ -1487,6 +1592,7 @@ begin
when others =>
null;
end case;
end if;
when FIND_POS =>
-- Synthesis Guard
if (DESTINATION_ORDER_QOS /= BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS) then
@ -1676,7 +1782,7 @@ begin
-- NOTE: added_new_instance and remove_oldest_sample are NOT mutual exclusive, but Instance Removal takes precedence.
-- New Instance was added, and Instance Memory is Full
if (added_new_instance = '1' and inst_empty_head = INSTANCE_MEMORY_MAX_ADDRESS) then
if (WITH_KEY and added_new_instance = '1' and inst_empty_head = INSTANCE_MEMORY_MAX_ADDRESS) then
-- Memory Operation Guard
if (inst_op_done = '1') then
inst_op_start <= '1';
@ -1693,11 +1799,17 @@ begin
else
cnt_next <= cnt; -- Keep State
end if;
elsif (remove_oldest_inst_sample = '1') then
elsif (WITH_KEY and remove_oldest_inst_sample = '1') then
cur_sample <= oldest_sample;
stage_next <= FIND_OLDEST_INST_SAMPLE;
elsif (remove_oldest_sample = '1') then
-- Synthesis Guard
if (WITH_KEY) then
stage_next <= GET_OLDEST_SAMPLE_INSTANCE;
else
cur_sample_next <= oldest_sample;
stage_next <= REMOVE_SAMPLE;
end if;
else
-- DONE
stage_next <= IDLE;
@ -1705,7 +1817,8 @@ begin
end if;
end case;
when GET_OLDEST_SAMPLE_INSTANCE =>
-- Synthesis Guard
if (WITH_KEY) then
case (cnt) is
-- GET Instance Pointer (Oldest Sample)
when 0 =>
@ -1740,11 +1853,12 @@ begin
when others =>
null;
end case;
end if;
when FIND_OLDEST_INST_SAMPLE =>
-- Precondition: cur_sample set
cnt_next <= cnt + 1;
-- Synthesis Guard
if (WITH_KEY) then
case (cnt) is
-- GET Instance Pointer
when 0 =>
@ -1792,11 +1906,12 @@ begin
when others =>
null;
end case;
end if;
when REMOVE_SAMPLE =>
-- Precondition: cur_sample set, sample_addr (Previous Pointer of cur_sample)
-- Wait for Instance Search to finish
if (inst_op_done = '1') then
if (not WITH_KEY or inst_op_done = '1') then
case (cnt) is
-- GET Previous Sample
@ -1992,19 +2107,24 @@ begin
end if;
when POST_SAMPLE_REMOVE =>
-- Memory Operation Guard
if (inst_op_done = '1') then
if (not WITH_KEY or inst_op_done = '1') then
-- No Instance Change on remove_oldest_inst_sample
if (remove_oldest_inst_sample /= '1') then
if (not WITH_KEY or remove_oldest_inst_sample /= '1') then
tmp_bitmap := to_endpoint_bitmap(inst_data.writer_bitmap);
-- Instance obsolete and Instance Memory Full
if (inst_data.sample_cnt = 1 and tmp_bitmap = (tmp_bitmap'range => '0') and inst_empty_head = INSTANCE_MEMORY_MAX_ADDRESS) then
if (WITH_KEY and inst_data.sample_cnt = 1 and tmp_bitmap = (tmp_bitmap'range => '0') and inst_empty_head = INSTANCE_MEMORY_MAX_ADDRESS) then
inst_op_start <= '1';
inst_opcode <= REMOVE_INSTANCE;
else
-- Synthesis Guard
if (WITH_KEY) then
inst_op_start <= '1';
inst_opcode <= UPDATE_INSTANCE;
inst_mem_fields <= IMF_SAMPLE_CNT_FLAG;
sample_cnt <= inst_data.sample_cnt - 1;
else
inst_data_nextsample_cnt <= inst_data.sample_cnt - 1;
end if;
end if;
end if;
@ -2069,6 +2189,8 @@ begin
null;
end case;
when REMOVE_WRITER =>
-- Synthesis Guard
if (WITH_KEY) then
-- Memory Operation Guard
if (inst_op_done = '1') then
case (cnt) is
@ -2089,12 +2211,10 @@ begin
-- Convert Back
writer_bitmap <= from_endpoint_bitmap(tmp_bitmap);
-- No More Writers for Instance
if (tmp_bitmap = (tmp_bitmap'range => '0')) then
-- NOT_ALIVE_NO_WRITERS Transition
if (tmp_bitmap = (tmp_bitmap'range => '0') and inst_data.status(NOT_ALIVE_DISPOSED_FLAG) = '0') then
status_info_update <= inst_data.status;
status_info_update(NOT_ALIVE_DISPOSED_FLAG) <= '0';
status_info_update(NOT_ALIVE_NO_WRITERS_FLAG) <= '1';
status_info_update(LIVELINESS_FLAG) <= '1';
inst_op_start <= '1';
inst_opcode <= UPDATE_INSTANCE;
inst_mem_fields <= IMF_STATUS_FLAG or IMF_WRITER_BITMAP_FLAG;
@ -2113,11 +2233,20 @@ begin
inst_mem_fields <= IMF_STATUS_FLAG or IMF_WRITER_BITMAP_FLAG;
stage_next <= REMOVE_WRITER;
cnt_next <= 0;
when 2 =>
inst_op_start <= '1';
inst_opcode <= GET_FIRST_INSTANCE;
inst_mem_fields <= IMF_STATUS_FLAG or IMF_WRITER_BITMAP_FLAG;
stage_next <= REMOVE_WRITER;
cnt_next <= 0;
when others =>
null;
end case;
end if;
end if;
when REMOVE_STALE_INSTANCE =>
-- Synthesis Guard
if (WITH_KEY) then
-- Wait for Instance Data
if (inst_op_done = '1') then
-- Iterated through all Instances
@ -2154,6 +2283,7 @@ begin
end if;
end if;
end if;
end if;
when GET_NEXT_SAMPLE =>
-- Precondition: cur_sample set, cur_inst set, si_sample_rank_sig set
@ -2246,7 +2376,7 @@ begin
-- Instance pre-selected
if (cur_inst /= INSTANCE_MEMORY_MAX_ADDRESS) then
-- Sample has different Instance
if (cur_inst /= sample_read_data) then
if (WITH_KEY and cur_inst /= sample_read_data) then
-- Consecutive Instance Sample Order
if (not ORDERED_ACCESS or PRESENTATION_QOS = INSTANCE_PRESENTATION_QOS) then
-- Skip Sample
@ -2280,11 +2410,18 @@ begin
else
-- Get Instance Data
next_inst_next <= sample_read_data;
-- Synthesis Guard
if (WITH_KEY) then
cnt_next <= cnt + 1;
else
cnt_next <= cnt + 2;
end if;
end if;
end if;
-- Get Instance Data
when 5 =>
-- Synthesis Guard
if (WITH_KEY) then
-- Memory Operation Guard
if (inst_op_done = '1') then
inst_op_start <= '1';
@ -2293,10 +2430,11 @@ begin
inst_addr_update <= next_inst;
cnt_next <= cnt + 1;
end if;
end if;
-- Check Instance Data
when 6 =>
-- Wait for Instance Data
if (inst_op_done = '1') then
if (not WITH_KEY or inst_op_done = '1') then
-- DEFAULT
tmp_bool := TRUE;
@ -2488,7 +2626,7 @@ begin
-- Collection Empty
if (collection_cnt = 0) then
-- READ_NEXT_INSTANCE/TAKE_NEXT_INSTANCE Operation
if (dynamic_next_instance = '1') then
if (WITH_KEY and dynamic_next_instance = '1') then
-- NOTE: We selected a compatible instance, but the instance has no compatible samples.
-- Find next compatible instance.
stage_next <= FIND_NEXT_INSTANCE;
@ -2647,7 +2785,7 @@ begin
-- Memory Control Flow Guard
if (sample_valid_out = '1') then
-- Same Instance
if (sample_read_data = cur_inst) then
if (not WITH_KEY or sample_read_data = cur_inst) then
-- Count Sample (No need to check Instance)
collection_cnt_max_next <= collection_cnt_max + 1;
si_sample_rank_sig_next <= si_sample_rank_sig + 1;
@ -2689,6 +2827,8 @@ begin
end if;
-- Get Instance Data
when 10 =>
-- Synthesis Guard
if (WITH_KEY) then
-- Memory Operation Guard
if (inst_op_done = '1') then
inst_op_start <= '1';
@ -2697,8 +2837,11 @@ begin
inst_addr_update <= next_inst;
cnt_next <= cnt + 1;
end if;
end if;
-- Check Instance Data
when 11 =>
-- Synthesis Guard
if (WITH_KEY) then
-- Wait for Instance Data
if (inst_op_done = '1') then
-- DEFAULT
@ -2757,6 +2900,7 @@ begin
end if;
cnt_next <= cnt + 1;
end if;
end if;
-- Exit State
when 12 =>
-- Exit Condition (Reached End of Samples or Collection Fully Precalculated)
@ -2780,9 +2924,9 @@ begin
-- Finalize Sample Info Data
when 0 =>
-- Wait for Instance Data
if (inst_op_done = '1') then
if (not WITH_KEY or inst_op_done = '1') then
-- Instance Data valid
if (inst_addr_base = cur_inst) then
if (not WITH_KEY or inst_addr_base = cur_inst) then
-- Sample Info View State
if (inst_data.status_info(VIEW_FLAG) = '1') then
si_view_state_sig_next <= NEW_VIEW_STATE;
@ -2852,12 +2996,14 @@ begin
-- Post-Present Data
when 2 =>
-- Memory Operation Guard
if (inst_op_done = '1') then
if (not WITH_KEY or inst_op_done = '1') then
-- NOTE: If we have a presentation of consecutive same instance samples of multiple instances, we have to
-- mark the instances we have already handled, in order to prevent the GET_NEXT_SAMPLE state to
-- re-process them.
-- Last Sample of Instance in Collection
if (si_sample_rank_sig = 1) then
-- Synthesis Guard
if (WITH_KEY) then
inst_op_start <= '1';
inst_opcode <= UPDATE_INSTANCE;
inst_mem_fields <= IMF_STATUS_FLAG;
@ -2880,6 +3026,13 @@ begin
-- Mark Instance as VIEWED
status_info_update(VIEW_FLAG) <= '1';
end if;
else
-- Instance is NOT_VIEWED and sample is from last generation of Instance
if (inst_data.status_info(VIEW_FLAG) = '0' and si_absolute_generation_count_sig = 0) then
-- Mark Instance as VIEWED
inst_data_next.status_info(VIEW_FLAG) <= '1';
end if;
end if;
end if;
-- Collection Completed
@ -3020,6 +3173,8 @@ begin
cnt_next <= 2;
end if;
when FIND_NEXT_INSTANCE =>
-- Synthesis Guard
if (WITH_KEY) then
-- Wait for Instance Data
if (inst_op_done = '1') then
case (cnt) is
@ -3107,7 +3262,10 @@ begin
null;
end case;
end if;
end if;
when CHECK_INSTANCE =>
-- Synthesis Guard
if (WITH_KEY) then
-- Wait for Instance Data
if (inst_op_done = '1') then
case (cnt) is
@ -3185,6 +3343,7 @@ begin
null;
end case;
end if;
end if;
when CHECK_LIFESPAN =>
-- Precondition: cur_sample set,
@ -3357,6 +3516,8 @@ begin
end case;
end if;
when CHECK_DEADLINE =>
-- Synthesis Guard
if (WITH_KEY) then
-- Memory Operation Guard
if (inst_op_done = '1') then
case (cnt) is
@ -3401,11 +3562,14 @@ begin
null;
end case;
end if;
end if;
when others =>
null;
end case;
end process;
gen_inst_ctrl_prc : if WITH_KEY generate
-- *Instance Memory Process*
-- STATE DESCRIPTION
-- IDLE Idle State. Done Signal is pulled high and Memory FSM accepts new memory operations
@ -4931,5 +5095,5 @@ begin
null;
end case;
end process;
end generate;
end architecture;

View File

@ -21,6 +21,7 @@ entity rtps_reader is
HEARTBEAT_SUPPRESSION_DELAY : DURATION_TYPE := TODO;
LEASE_DURATION : DURATION_TYPE := DEFAULT_LEASE_DURATION;
ENTITYID : std_logic_vector(ENTITYID_WIDTH-1 downto 0) := ENTITYID_UNKNOWN;
WITH_KEY : boolean := FALSE -- TODO: Default
);
port (
-- SYSTEM
@ -1158,7 +1159,7 @@ begin
when 4 =>
dds_data_in <= lifespan(1);
-- Skip Key Hash, if not received
if (key_hash_rcvd = '0') then
if (not WITH_KEY or key_hash_rcvd = '0') then
cnt_next <= 9;
end if;
-- Key hash 1/4
@ -1182,7 +1183,7 @@ begin
dds_data_in <= std_logic_vector(to_unsigned(mem_pos, CDR_LONG_WIDTH));
-- Payload exists
if (data_flag = '1' or key_flag = '1') then
if (data_flag = '1' or (WITH_KEY and key_flag = '1')) then
stage_next <= PUSH_PAYLOAD;
else
-- DONE