* partly revert commit ec4d44c
- Re-add max_participant_addr to prevent iterating through the whole memory area unnecessarily - Pointer points to last occuoied participant frame
This commit is contained in:
parent
e18c6e15ce
commit
0ae131189b
@ -25,9 +25,9 @@ analyze Level_0/rtps_out_test1.vhd
|
|||||||
|
|
||||||
#simulate rtps_handler_test1
|
#simulate rtps_handler_test1
|
||||||
#simulate rtps_handler_test2
|
#simulate rtps_handler_test2
|
||||||
simulate rtps_builtin_endpoint_test1
|
#simulate rtps_builtin_endpoint_test1
|
||||||
#simulate rtps_builtin_endpoint_test2
|
#simulate rtps_builtin_endpoint_test2
|
||||||
#simulate rtps_builtin_endpoint_test3
|
#simulate rtps_builtin_endpoint_test3
|
||||||
#simulate rtps_builtin_endpoint_test4
|
#simulate rtps_builtin_endpoint_test4
|
||||||
#simulate rtps_builtin_endpoint_test5
|
simulate rtps_builtin_endpoint_test5
|
||||||
#simulate rtps_out_test1
|
#simulate rtps_out_test1
|
||||||
@ -264,6 +264,10 @@ architecture arch of rtps_builtin_endpoint is
|
|||||||
signal mem_addr_base, mem_addr_base_next : unsigned(BUILTIN_BUFFER_ADDR_WIDTH-1 downto 0) := (others => '0');
|
signal mem_addr_base, mem_addr_base_next : unsigned(BUILTIN_BUFFER_ADDR_WIDTH-1 downto 0) := (others => '0');
|
||||||
-- Result Base Memory Address of Memory Operation
|
-- Result Base Memory Address of Memory Operation
|
||||||
signal addr_res, addr_res_next : unsigned(BUILTIN_BUFFER_ADDR_WIDTH-1 downto 0) := (others => '0');
|
signal addr_res, addr_res_next : unsigned(BUILTIN_BUFFER_ADDR_WIDTH-1 downto 0) := (others => '0');
|
||||||
|
-- Help signal used to reset the MAX Participant/Endpoint Memory Pointers
|
||||||
|
signal last_addr, last_addr_next : unsigned(BUILTIN_BUFFER_ADDR_WIDTH-1 downto 0) := (others => '0');
|
||||||
|
-- Highest Participant Memory Address (Points to first Word of last occupied Participant Frame)
|
||||||
|
signal max_participant_addr, max_participant_addr_next : unsigned(BUILTIN_BUFFER_ADDR_WIDTH-1 downto 0) := (others => '0');
|
||||||
-- Memory Data Read and Write Signals
|
-- Memory Data Read and Write Signals
|
||||||
signal mem_read_data, mem_write_data : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
|
signal mem_read_data, mem_write_data : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
|
||||||
-- Memory Read and Write Enable Signals
|
-- Memory Read and Write Enable Signals
|
||||||
@ -280,6 +284,8 @@ architecture arch of rtps_builtin_endpoint is
|
|||||||
signal last_seq_nr, last_seq_nr_next : SEQUENCENUMBER_TYPE := (others => (others => '0'));
|
signal last_seq_nr, last_seq_nr_next : SEQUENCENUMBER_TYPE := (others => (others => '0'));
|
||||||
-- Intermediate write enable signal.
|
-- Intermediate write enable signal.
|
||||||
signal wr_sig : std_logic := '0';
|
signal wr_sig : std_logic := '0';
|
||||||
|
-- Signifies if we currently are resetting the MAX Participant/Endpoint Pointer
|
||||||
|
signal reset_max_pointer, reset_max_pointer_next : std_logic := '0';
|
||||||
-- Signifies if we currently are doing a Participant Stale Entry Check (Used to start Stale Checks between packet handling)
|
-- Signifies if we currently are doing a Participant Stale Entry Check (Used to start Stale Checks between packet handling)
|
||||||
signal stale_check, stale_check_next : std_logic := '0';
|
signal stale_check, stale_check_next : std_logic := '0';
|
||||||
-- Latch containing the GUID Prefix of the removed Participant from the memory, and the Enity ID of the last Orphan Endpoint found
|
-- Latch containing the GUID Prefix of the removed Participant from the memory, and the Enity ID of the last Orphan Endpoint found
|
||||||
@ -3038,9 +3044,12 @@ begin
|
|||||||
mem_addr_next <= mem_addr;
|
mem_addr_next <= mem_addr;
|
||||||
addr_res_next <= addr_res;
|
addr_res_next <= addr_res;
|
||||||
mem_cnt_next <= mem_cnt;
|
mem_cnt_next <= mem_cnt;
|
||||||
|
last_addr_next <= last_addr;
|
||||||
mem_participant_data_next <= mem_participant_data;
|
mem_participant_data_next <= mem_participant_data;
|
||||||
is_heartbeat_res_next <= is_heartbeat_res;
|
is_heartbeat_res_next <= is_heartbeat_res;
|
||||||
mem_guidprefix_next <= mem_guidprefix;
|
mem_guidprefix_next <= mem_guidprefix;
|
||||||
|
max_participant_addr_next <= max_participant_addr;
|
||||||
|
reset_max_pointer_next <= reset_max_pointer;
|
||||||
-- DEFAULT Unregistered
|
-- DEFAULT Unregistered
|
||||||
mem_write_data <= (others => '0');
|
mem_write_data <= (others => '0');
|
||||||
mem_op_done <= '0';
|
mem_op_done <= '0';
|
||||||
@ -3051,6 +3060,7 @@ begin
|
|||||||
case (mem_stage) is
|
case (mem_stage) is
|
||||||
when IDLE =>
|
when IDLE =>
|
||||||
mem_op_done <= '1';
|
mem_op_done <= '1';
|
||||||
|
reset_max_pointer_next <= '0';
|
||||||
|
|
||||||
if (mem_op_start = '1') then
|
if (mem_op_start = '1') then
|
||||||
case(mem_opcode) is
|
case(mem_opcode) is
|
||||||
@ -3133,7 +3143,7 @@ begin
|
|||||||
-- No Match
|
-- No Match
|
||||||
if (mem_read_data /= guid(0)) then
|
if (mem_read_data /= guid(0)) then
|
||||||
-- Reached End of Memory, No Match
|
-- Reached End of Memory, No Match
|
||||||
if (mem_addr_base = MAX_PARTICIPANT_ADDRESS) then
|
if (mem_addr_base = max_participant_addr) then
|
||||||
addr_res_next <= MAX_ADDRESS; --No match
|
addr_res_next <= MAX_ADDRESS; --No match
|
||||||
-- DONE
|
-- DONE
|
||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
@ -3149,7 +3159,7 @@ begin
|
|||||||
-- No Match
|
-- No Match
|
||||||
if (mem_read_data /= guid(1)) then
|
if (mem_read_data /= guid(1)) then
|
||||||
-- Reached End of Memory, No Match
|
-- Reached End of Memory, No Match
|
||||||
if (mem_addr_base = MAX_PARTICIPANT_ADDRESS) then
|
if (mem_addr_base = max_participant_addr) then
|
||||||
addr_res_next <= MAX_ADDRESS; --No match
|
addr_res_next <= MAX_ADDRESS; --No match
|
||||||
-- DONE
|
-- DONE
|
||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
@ -3165,7 +3175,7 @@ begin
|
|||||||
-- No Match
|
-- No Match
|
||||||
if (mem_read_data /= guid(2)) then
|
if (mem_read_data /= guid(2)) then
|
||||||
-- Reached End of Memory, No Match
|
-- Reached End of Memory, No Match
|
||||||
if (mem_addr_base = MAX_PARTICIPANT_ADDRESS) then
|
if (mem_addr_base = max_participant_addr) then
|
||||||
addr_res_next <= MAX_ADDRESS; --No match
|
addr_res_next <= MAX_ADDRESS; --No match
|
||||||
-- DONE
|
-- DONE
|
||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
@ -3532,12 +3542,17 @@ begin
|
|||||||
when 6 =>
|
when 6 =>
|
||||||
mem_wr <= '1';
|
mem_wr <= '1';
|
||||||
mem_write_data <= GUIDPREFIX_UNKNOWN(2);
|
mem_write_data <= GUIDPREFIX_UNKNOWN(2);
|
||||||
|
-- Reset MAX Participant Pointer
|
||||||
-- DONE
|
mem_addr_base_next <= FIRST_PARTICIPANT_ADDRESS;
|
||||||
mem_stage_next <= IDLE;
|
mem_addr_next <= FIRST_PARTICIPANT_ADDRESS;
|
||||||
|
reset_max_pointer_next <= '1';
|
||||||
|
last_addr_next <= (others => '0');
|
||||||
|
mem_stage_next <= FIND_PARTICIPANT_SLOT;
|
||||||
|
mem_cnt_next <= 0;
|
||||||
when others =>
|
when others =>
|
||||||
null;
|
null;
|
||||||
end case;
|
end case;
|
||||||
|
-- TODO: Should I set the addr_res?
|
||||||
when FIND_PARTICIPANT_SLOT =>
|
when FIND_PARTICIPANT_SLOT =>
|
||||||
mem_rd <= '1';
|
mem_rd <= '1';
|
||||||
mem_addr_next <= mem_addr + 1;
|
mem_addr_next <= mem_addr + 1;
|
||||||
@ -3554,12 +3569,30 @@ begin
|
|||||||
when 1 =>
|
when 1 =>
|
||||||
-- Slot Occupied
|
-- Slot Occupied
|
||||||
if (mem_read_data /= GUIDPREFIX_UNKNOWN(0)) then
|
if (mem_read_data /= GUIDPREFIX_UNKNOWN(0)) then
|
||||||
if (mem_addr_base = MAX_PARTICIPANT_ADDRESS) then
|
if (mem_addr_base = max_participant_addr) then
|
||||||
report "Memory Full, ignoring Participant Data" severity WARNING;
|
-- We are in the middle of resetting the MAX Participant Pointer
|
||||||
addr_res_next <= MAX_ADDRESS; --No match
|
if (reset_max_pointer = '1') then
|
||||||
-- DONE
|
-- No Change
|
||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
|
-- MEMORY FULL
|
||||||
|
elsif (max_participant_addr = MAX_PARTICIPANT_ADDRESS) then
|
||||||
|
report "Memory Full, Ignoring Participant Data" severity NOTE;
|
||||||
|
-- Ignore Insertion
|
||||||
|
mem_stage_next <= IDLE;
|
||||||
|
addr_res_next <= MAX_ADDRESS;
|
||||||
|
else
|
||||||
|
-- Extend Participant Memory Area
|
||||||
|
-- NOTE: "max_participant_addr" points to the first address of last participant frame
|
||||||
|
max_participant_addr_next <= tmp;
|
||||||
|
-- Populate Participant Slot
|
||||||
|
mem_stage_next <= INSERT_PARTICIPANT;
|
||||||
|
mem_addr_next <= tmp;
|
||||||
|
addr_res_next <= tmp;
|
||||||
|
mem_cnt_next <= 0;
|
||||||
|
end if;
|
||||||
else
|
else
|
||||||
|
-- Latch last occupied Participant Slot
|
||||||
|
last_addr_next <= mem_addr_base;
|
||||||
-- Continue Search
|
-- Continue Search
|
||||||
mem_addr_next <= tmp;
|
mem_addr_next <= tmp;
|
||||||
mem_addr_base_next <= tmp;
|
mem_addr_base_next <= tmp;
|
||||||
@ -3570,12 +3603,30 @@ begin
|
|||||||
when 2 =>
|
when 2 =>
|
||||||
-- Slot Occupied
|
-- Slot Occupied
|
||||||
if (mem_read_data /= GUIDPREFIX_UNKNOWN(1)) then
|
if (mem_read_data /= GUIDPREFIX_UNKNOWN(1)) then
|
||||||
if (mem_addr_base = MAX_PARTICIPANT_ADDRESS) then
|
if (mem_addr_base = max_participant_addr) then
|
||||||
report "Memory Full, ignoring Participant Data" severity WARNING;
|
-- We are in the middle of resetting the MAX Participant Pointer
|
||||||
addr_res_next <= MAX_ADDRESS; --No match
|
if (reset_max_pointer = '1') then
|
||||||
-- DONE
|
-- No Change
|
||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
|
-- MEMORY FULL
|
||||||
|
elsif (max_participant_addr = MAX_PARTICIPANT_ADDRESS) then
|
||||||
|
report "Memory Full, Ignoring Participant Data" severity NOTE;
|
||||||
|
-- Ignore Insertion
|
||||||
|
mem_stage_next <= IDLE;
|
||||||
|
addr_res_next <= MAX_ADDRESS;
|
||||||
|
else
|
||||||
|
-- Extend Participant Memory Area
|
||||||
|
-- NOTE: "max_participant_addr" points to the first address of last participant frame
|
||||||
|
max_participant_addr_next <= tmp;
|
||||||
|
-- Populate Participant Slot
|
||||||
|
mem_stage_next <= INSERT_PARTICIPANT;
|
||||||
|
mem_addr_next <= tmp;
|
||||||
|
addr_res_next <= tmp;
|
||||||
|
mem_cnt_next <= 0;
|
||||||
|
end if;
|
||||||
else
|
else
|
||||||
|
-- Latch last occupied Participant Slot
|
||||||
|
last_addr_next <= mem_addr_base;
|
||||||
-- Continue Search
|
-- Continue Search
|
||||||
mem_addr_next <= tmp;
|
mem_addr_next <= tmp;
|
||||||
mem_addr_base_next <= tmp;
|
mem_addr_base_next <= tmp;
|
||||||
@ -3586,12 +3637,30 @@ begin
|
|||||||
when 3 =>
|
when 3 =>
|
||||||
-- Slot Occupied
|
-- Slot Occupied
|
||||||
if (mem_read_data /= GUIDPREFIX_UNKNOWN(2)) then
|
if (mem_read_data /= GUIDPREFIX_UNKNOWN(2)) then
|
||||||
if (mem_addr_base = MAX_PARTICIPANT_ADDRESS) then
|
if (mem_addr_base = max_participant_addr) then
|
||||||
report "Memory Full, ignoring Participant Data" severity WARNING;
|
-- We are in the middle of resetting the MAX Participant Pointer
|
||||||
addr_res_next <= MAX_ADDRESS; --No match
|
if (reset_max_pointer = '1') then
|
||||||
-- DONE
|
-- No Change
|
||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
|
-- MEMORY FULL
|
||||||
|
elsif (max_participant_addr = MAX_PARTICIPANT_ADDRESS) then
|
||||||
|
report "Memory Full, Ignoring Participant Data" severity NOTE;
|
||||||
|
-- Ignore Insertion
|
||||||
|
mem_stage_next <= IDLE;
|
||||||
|
addr_res_next <= MAX_ADDRESS;
|
||||||
|
else
|
||||||
|
-- Extend Participant Memory Area
|
||||||
|
-- NOTE: "max_participant_addr" points to the first address of last participant frame
|
||||||
|
max_participant_addr_next <= tmp;
|
||||||
|
-- Populate Participant Slot
|
||||||
|
mem_stage_next <= INSERT_PARTICIPANT;
|
||||||
|
mem_addr_next <= tmp;
|
||||||
|
addr_res_next <= tmp;
|
||||||
|
mem_cnt_next <= 0;
|
||||||
|
end if;
|
||||||
else
|
else
|
||||||
|
-- Latch last occupied Participant Slot
|
||||||
|
last_addr_next <= mem_addr_base;
|
||||||
-- Continue Search
|
-- Continue Search
|
||||||
mem_addr_next <= tmp;
|
mem_addr_next <= tmp;
|
||||||
mem_addr_base_next <= tmp;
|
mem_addr_base_next <= tmp;
|
||||||
@ -3599,10 +3668,26 @@ begin
|
|||||||
end if;
|
end if;
|
||||||
-- Slot Empty
|
-- Slot Empty
|
||||||
else
|
else
|
||||||
-- Populate Participant Slot
|
if (reset_max_pointer = '1') then
|
||||||
mem_stage_next <= INSERT_PARTICIPANT;
|
-- Mak sure to iterate through complete participant area
|
||||||
mem_addr_next <= mem_addr_base;
|
if (mem_addr_base = max_participant_addr) then
|
||||||
mem_cnt_next <= 0;
|
-- Reset Pointer to last occupied participant Slot
|
||||||
|
max_participant_addr_next <= last_addr;
|
||||||
|
-- DONE
|
||||||
|
mem_stage_next <= IDLE;
|
||||||
|
else
|
||||||
|
-- Continue Search
|
||||||
|
mem_addr_next <= tmp;
|
||||||
|
mem_addr_base_next <= tmp;
|
||||||
|
mem_cnt_next <= 0;
|
||||||
|
end if;
|
||||||
|
else
|
||||||
|
-- Populate Participant Slot
|
||||||
|
mem_stage_next <= INSERT_PARTICIPANT;
|
||||||
|
mem_addr_next <= mem_addr_base;
|
||||||
|
addr_res_next <= mem_addr_base;
|
||||||
|
mem_cnt_next <= 0;
|
||||||
|
end if;
|
||||||
end if;
|
end if;
|
||||||
when others =>
|
when others =>
|
||||||
null;
|
null;
|
||||||
@ -3651,7 +3736,7 @@ begin
|
|||||||
-- Slot Empty
|
-- Slot Empty
|
||||||
else
|
else
|
||||||
-- Reached End of Memory, No Match
|
-- Reached End of Memory, No Match
|
||||||
if (mem_addr_base = MAX_PARTICIPANT_ADDRESS) then
|
if (mem_addr_base = max_participant_addr) then
|
||||||
addr_res_next <= MAX_ADDRESS; --No match
|
addr_res_next <= MAX_ADDRESS; --No match
|
||||||
-- DONE
|
-- DONE
|
||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
@ -3707,7 +3792,7 @@ begin
|
|||||||
-- Slot Empty
|
-- Slot Empty
|
||||||
else
|
else
|
||||||
-- Reached End of Memory, No Match
|
-- Reached End of Memory, No Match
|
||||||
if (mem_addr_base = MAX_PARTICIPANT_ADDRESS) then
|
if (mem_addr_base = max_participant_addr) then
|
||||||
addr_res_next <= MAX_ADDRESS; --No match
|
addr_res_next <= MAX_ADDRESS; --No match
|
||||||
-- DONE
|
-- DONE
|
||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
@ -3794,7 +3879,7 @@ begin
|
|||||||
-- Participant not Stale
|
-- Participant not Stale
|
||||||
else
|
else
|
||||||
-- Reached End of Memory, No Match
|
-- Reached End of Memory, No Match
|
||||||
if (mem_addr_base = MAX_PARTICIPANT_ADDRESS) then
|
if (mem_addr_base = max_participant_addr) then
|
||||||
addr_res_next <= MAX_ADDRESS; --No match
|
addr_res_next <= MAX_ADDRESS; --No match
|
||||||
-- DONE
|
-- DONE
|
||||||
mem_stage_next <= IDLE;
|
mem_stage_next <= IDLE;
|
||||||
@ -3857,8 +3942,10 @@ begin
|
|||||||
mem_addr_base <= (others => '0');
|
mem_addr_base <= (others => '0');
|
||||||
mem_addr <= (others => '0');
|
mem_addr <= (others => '0');
|
||||||
addr_res <= (others => '0');
|
addr_res <= (others => '0');
|
||||||
|
last_addr <= (others => '0');
|
||||||
long_latch <= (others => '0');
|
long_latch <= (others => '0');
|
||||||
rcvd <= (others => '0');
|
rcvd <= (others => '0');
|
||||||
|
max_participant_addr <= FIRST_PARTICIPANT_ADDRESS;
|
||||||
guid <= (others => (others => '0'));
|
guid <= (others => (others => '0'));
|
||||||
mem_guidprefix <= (others => (others => '0'));
|
mem_guidprefix <= (others => (others => '0'));
|
||||||
lease_duration <= (others => (others => '0'));
|
lease_duration <= (others => (others => '0'));
|
||||||
@ -3888,6 +3975,7 @@ begin
|
|||||||
stale_check <= '0';
|
stale_check <= '0';
|
||||||
is_live_assert <= '0';
|
is_live_assert <= '0';
|
||||||
is_heartbeat_res <= '0';
|
is_heartbeat_res <= '0';
|
||||||
|
reset_max_pointer <= '0';
|
||||||
last_word_in_latch <= '0';
|
last_word_in_latch <= '0';
|
||||||
else
|
else
|
||||||
stage <= stage_next;
|
stage <= stage_next;
|
||||||
@ -3915,8 +4003,10 @@ begin
|
|||||||
mem_addr_base <= mem_addr_base_next;
|
mem_addr_base <= mem_addr_base_next;
|
||||||
mem_addr <= mem_addr_next;
|
mem_addr <= mem_addr_next;
|
||||||
addr_res <= addr_res_next;
|
addr_res <= addr_res_next;
|
||||||
|
last_addr <= last_addr_next;
|
||||||
long_latch <= long_latch_next;
|
long_latch <= long_latch_next;
|
||||||
rcvd <= rcvd_next;
|
rcvd <= rcvd_next;
|
||||||
|
max_participant_addr <= max_participant_addr_next;
|
||||||
guid <= guid_next;
|
guid <= guid_next;
|
||||||
mem_guidprefix <= mem_guidprefix_next;
|
mem_guidprefix <= mem_guidprefix_next;
|
||||||
lease_duration <= lease_duration_next;
|
lease_duration <= lease_duration_next;
|
||||||
@ -3946,6 +4036,7 @@ begin
|
|||||||
stale_check <= stale_check_next;
|
stale_check <= stale_check_next;
|
||||||
is_live_assert <= is_live_assert_next;
|
is_live_assert <= is_live_assert_next;
|
||||||
is_heartbeat_res <= is_heartbeat_res_next;
|
is_heartbeat_res <= is_heartbeat_res_next;
|
||||||
|
reset_max_pointer <= reset_max_pointer_next;
|
||||||
last_word_in_latch <= last_word_in_latch_next;
|
last_word_in_latch <= last_word_in_latch_next;
|
||||||
end if;
|
end if;
|
||||||
end if;
|
end if;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user