Implemented DEADLINE_QOS and REQUESTED_DEADLINE_MISSED_STATUS in DDS Reader
This commit is contained in:
parent
4914dbe5ea
commit
abdd14eb51
@ -133,6 +133,10 @@ architecture arch of history_cache is
|
|||||||
type STAGE_TYPE is (IDLE, TODO);
|
type STAGE_TYPE is (IDLE, TODO);
|
||||||
type INST_STAGE_TYPE is (IDLE, TODO);
|
type INST_STAGE_TYPE is (IDLE, TODO);
|
||||||
type INSTANCE_OPCODE_TYPE is (NOP, TODO);
|
type INSTANCE_OPCODE_TYPE is (NOP, TODO);
|
||||||
|
-- VAR_1 (STATUS_INFO, SAMPLE_COUNT, DISPOSED_GENERATION_COUNT, NO_WRITERS_GENERATION_COUNT, IGNORE_DEADLINE, WRITER_BITMAP)
|
||||||
|
-- VAR_2 (KEY_HASH, STATUS_INFO, SAMPLE_COUNT, DISPOSED_GENERATION_COUNT, NO_WRITERS_GENERATION_COUNT)
|
||||||
|
-- VAR_3 (KEY_HASH, STATUS_INFO)
|
||||||
|
type INSTANCE_DATA_VARIANT_TYPE is (VAR_1, VAR_2, VAR_3);
|
||||||
type INSTANCE_DATA_TYPE is record
|
type INSTANCE_DATA_TYPE is record
|
||||||
key_hash : KEY_HASH_TYPE;
|
key_hash : KEY_HASH_TYPE;
|
||||||
status_info : std_logic_vector(WORD_WIDTH-1 downto 0);
|
status_info : std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||||
@ -152,7 +156,7 @@ architecture arch of history_cache is
|
|||||||
writer_bitmap => (others => (others => '0'))
|
writer_bitmap => (others => (others => '0'))
|
||||||
);
|
);
|
||||||
type INST_LATCH_DATA_TYPE is record
|
type INST_LATCH_DATA_TYPE is record
|
||||||
variant : std_logic;
|
variant : INSTANCE_DATA_VARIANT_TYPE;
|
||||||
key_hash : KEY_HASH_TYPE;
|
key_hash : KEY_HASH_TYPE;
|
||||||
status_info : std_logic_vector(CDR_LONG_WIDTH-1 downto 0);
|
status_info : std_logic_vector(CDR_LONG_WIDTH-1 downto 0);
|
||||||
sample_cnt : std_logic_vector(CDR_LONG_WIDTH-1 downto 0);
|
sample_cnt : std_logic_vector(CDR_LONG_WIDTH-1 downto 0);
|
||||||
@ -163,7 +167,7 @@ architecture arch of history_cache is
|
|||||||
addr : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0);
|
addr : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0);
|
||||||
end record;
|
end record;
|
||||||
constant ZERO_INST_LATCH_DATA : INST_LATCH_DATA_TYPE := (
|
constant ZERO_INST_LATCH_DATA : INST_LATCH_DATA_TYPE := (
|
||||||
variant => '1',
|
variant => VAR_1,
|
||||||
key_hash => (others => (others => '0')),
|
key_hash => (others => (others => '0')),
|
||||||
status_info => (others => '0'),
|
status_info => (others => '0'),
|
||||||
sample_cnt => (others => '0'),
|
sample_cnt => (others => '0'),
|
||||||
@ -271,7 +275,7 @@ architecture arch of history_cache is
|
|||||||
signal single_sample, single_sample_next : std_logic := '0';
|
signal single_sample, single_sample_next : std_logic := '0';
|
||||||
signal unmark_instances, unmark_instances_next : std_logic := '0';
|
signal unmark_instances, unmark_instances_next : std_logic := '0';
|
||||||
signal dynamic_next_instance, dynamic_next_instance_next : std_logic := '0';
|
signal dynamic_next_instance, dynamic_next_instance_next : std_logic := '0';
|
||||||
signal inst_data_variant : std_logic := '0';
|
signal inst_data_variant : INSTANCE_DATA_VARIANT_TYPE := VAR_1;
|
||||||
signal abort_khg : std_logic := '0';
|
signal abort_khg : std_logic := '0';
|
||||||
|
|
||||||
signal status_sig, status_sig_next : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0');
|
signal status_sig, status_sig_next : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0');
|
||||||
@ -279,6 +283,10 @@ architecture arch of history_cache is
|
|||||||
signal sample_rej_cnt_change, sample_rej_cnt_change_next : unsigned(SAMPLE_REJECTED_STATUS_COUNT_WIDTH-1 downto 0) := (others => '0');
|
signal sample_rej_cnt_change, sample_rej_cnt_change_next : unsigned(SAMPLE_REJECTED_STATUS_COUNT_WIDTH-1 downto 0) := (others => '0');
|
||||||
signal sample_rej_last_reason, sample_rej_last_reason_next : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := (others =>'0');
|
signal sample_rej_last_reason, sample_rej_last_reason_next : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := (others =>'0');
|
||||||
signal sample_rej_last_inst, sample_rej_last_inst_next : INSTANCE_HANDLE_TYPE := (others => (others => '0'));
|
signal sample_rej_last_inst, sample_rej_last_inst_next : INSTANCE_HANDLE_TYPE := (others => (others => '0'));
|
||||||
|
signal deadline_time, deadline_time_next : TIME_TYPE := TIME_ZERO;
|
||||||
|
signal deadline_miss_cnt, deadline_miss_cnt_next : unsigned(REQUESTED_DEADLINE_MISSED_STATUS_COUNT_WIDTH-1 downto 0) := (others => '0');
|
||||||
|
signal deadline_miss_cnt_change, deadline_miss_cnt_change_next : unsigned(REQUESTED_DEADLINE_MISSED_STATUS_COUNT_WIDTH-1 downto 0) := (others => '0');
|
||||||
|
signal deadline_miss_last_inst, deadline_miss_last_inst_next : INSTANCE_HANDLE_TYPE := (others => (others => '0'));
|
||||||
|
|
||||||
--*****ALIAS DECLARATION*****
|
--*****ALIAS DECLARATION*****
|
||||||
alias prev_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_1;
|
alias prev_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_1;
|
||||||
@ -451,8 +459,12 @@ begin
|
|||||||
sample_rej_cnt_change_next <= sample_rej_cnt_change;
|
sample_rej_cnt_change_next <= sample_rej_cnt_change;
|
||||||
sample_rej_last_reason_next <= sample_rej_last_reason;
|
sample_rej_last_reason_next <= sample_rej_last_reason;
|
||||||
sample_rej_last_inst_next <= sample_rej_last_inst;
|
sample_rej_last_inst_next <= sample_rej_last_inst;
|
||||||
|
deadline_time_next <= deadline_time;
|
||||||
|
deadline_miss_cnt_next <= deadline_miss_cnt;
|
||||||
|
deadline_miss_cnt_change_next <= deadline_miss_cnt_change;
|
||||||
|
deadline_miss_last_inst_next <= deadline_miss_last_inst;
|
||||||
ack_dds <= '0';
|
ack_dds <= '0';
|
||||||
inst_data_variant <= '0';
|
inst_data_variant <= VAR_1;
|
||||||
done_dds <= '0';
|
done_dds <= '0';
|
||||||
abort_khg <= '0';
|
abort_khg <= '0';
|
||||||
return_code_dds <= RETCODE_UNSUPPORTED;
|
return_code_dds <= RETCODE_UNSUPPORTED;
|
||||||
@ -470,7 +482,14 @@ begin
|
|||||||
is_take_next <= '0';
|
is_take_next <= '0';
|
||||||
|
|
||||||
|
|
||||||
if (start_rtps = '1') then
|
-- DEADLINE QoS
|
||||||
|
if (DEADLINE_QOS /= DURATION_INFINITE and deadline_time < time) then
|
||||||
|
-- Reset Timeout
|
||||||
|
deadline_time_next <= deadline_time + DEADLINE_QOS;
|
||||||
|
|
||||||
|
stage_next <= CHECK_DEADLINE;
|
||||||
|
cnt_next <= 0;
|
||||||
|
elsif (start_rtps = '1') then
|
||||||
case (opcode_rtps) is
|
case (opcode_rtps) is
|
||||||
when ADD_CHANGE =>
|
when ADD_CHANGE =>
|
||||||
-- This Operation does not accept input at this time
|
-- This Operation does not accept input at this time
|
||||||
@ -489,7 +508,7 @@ begin
|
|||||||
writer_pos_next <= to_integer(unsigned(data_in_rtps));
|
writer_pos_next <= to_integer(unsigned(data_in_rtps));
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_opcode <= GET_FIRST_INSTANCE;
|
inst_opcode <= GET_FIRST_INSTANCE;
|
||||||
inst_data_variant <= '0';
|
inst_data_variant <= VAR_1;
|
||||||
stage_next <= REMOVE_WRITER;
|
stage_next <= REMOVE_WRITER;
|
||||||
res_rtps <= ACK;
|
res_rtps <= ACK;
|
||||||
end if;
|
end if;
|
||||||
@ -610,6 +629,11 @@ begin
|
|||||||
when GET_SAMPLE_REJECTED_STATUS =>
|
when GET_SAMPLE_REJECTED_STATUS =>
|
||||||
ack_dds <= '1';
|
ack_dds <= '1';
|
||||||
stage_next <= GET_SAMPLE_REJECTED_STATUS;
|
stage_next <= GET_SAMPLE_REJECTED_STATUS;
|
||||||
|
cnt_next <= 0;
|
||||||
|
when GET_REQUESTED_DEADLINE_MISSED_STATUS =>
|
||||||
|
ack_dds <= '1';
|
||||||
|
stage_next <= GET_REQUESTED_DEADLINE_MISSED_STATUS;
|
||||||
|
cnt_next <= 0;
|
||||||
when others =>
|
when others =>
|
||||||
ack_dds <= '1';
|
ack_dds <= '1';
|
||||||
stage_next <= UNKNOWN_OPERATION;
|
stage_next <= UNKNOWN_OPERATION;
|
||||||
@ -853,7 +877,7 @@ begin
|
|||||||
if (inst_op_done = '1') then
|
if (inst_op_done = '1') then
|
||||||
inst_opcode <= SEARCH_INSTANCE_HASH;
|
inst_opcode <= SEARCH_INSTANCE_HASH;
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_data_variant <= '0';
|
inst_data_variant <= VAR_1;
|
||||||
|
|
||||||
-- Payload not yet stored
|
-- Payload not yet stored
|
||||||
if (has_data = '1') then
|
if (has_data = '1') then
|
||||||
@ -1313,7 +1337,7 @@ begin
|
|||||||
if (inst_op_done = '1') then
|
if (inst_op_done = '1') then
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_opcode <= GET_FIRST_INSTANCE;
|
inst_opcode <= GET_FIRST_INSTANCE;
|
||||||
inst_data_variant <= '0';
|
inst_data_variant <= VAR_1;
|
||||||
|
|
||||||
-- NOTE: Instances are only removed in two occasions:
|
-- NOTE: Instances are only removed in two occasions:
|
||||||
-- * A new instance is added, and the instance memory gets full
|
-- * A new instance is added, and the instance memory gets full
|
||||||
@ -1351,7 +1375,7 @@ begin
|
|||||||
-- (Since we do not store previous pointers in the memory frame format)
|
-- (Since we do not store previous pointers in the memory frame format)
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_opcode <= SEARCH_INSTANCE_ADDR;
|
inst_opcode <= SEARCH_INSTANCE_ADDR;
|
||||||
inst_data_variant <= '0';
|
inst_data_variant <= VAR_1;
|
||||||
inst_addr_update <= sample_read_data;
|
inst_addr_update <= sample_read_data;
|
||||||
|
|
||||||
cur_sample_next <= oldest_sample;
|
cur_sample_next <= oldest_sample;
|
||||||
@ -1637,7 +1661,7 @@ begin
|
|||||||
if (inst_op_done = '1') then
|
if (inst_op_done = '1') then
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_opcode <= GET_NEXT_INSTANCE;
|
inst_opcode <= GET_NEXT_INSTANCE;
|
||||||
inst_data_variant <= '0';
|
inst_data_variant <= VAR_1;
|
||||||
stage_next <= REMOVE_WRITER;
|
stage_next <= REMOVE_WRITER;
|
||||||
end if;
|
end if;
|
||||||
when REMOVE_STALE_INSTANCE =>
|
when REMOVE_STALE_INSTANCE =>
|
||||||
@ -1675,7 +1699,7 @@ begin
|
|||||||
-- Continue Search
|
-- Continue Search
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_opcode <= GET_NEXT_INSTANCE;
|
inst_opcode <= GET_NEXT_INSTANCE;
|
||||||
inst_data_variant <= '0';
|
inst_data_variant <= VAR_1;
|
||||||
end if;
|
end if;
|
||||||
end if;
|
end if;
|
||||||
end if;
|
end if;
|
||||||
@ -1769,7 +1793,7 @@ begin
|
|||||||
if (inst_op_done = '1') then
|
if (inst_op_done = '1') then
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_opcode <= GET_INSTANCE;
|
inst_opcode <= GET_INSTANCE;
|
||||||
inst_data_variant <= '1';
|
inst_data_variant <= VAR_2;
|
||||||
inst_addr_update <= next_inst;
|
inst_addr_update <= next_inst;
|
||||||
else
|
else
|
||||||
cnt_next <= cnt; -- Keep sub-state
|
cnt_next <= cnt; -- Keep sub-state
|
||||||
@ -2020,7 +2044,7 @@ begin
|
|||||||
if (inst_op_done = '1') then
|
if (inst_op_done = '1') then
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_opcode <= GET_INSTANCE_DATA_2;
|
inst_opcode <= GET_INSTANCE_DATA_2;
|
||||||
inst_data_variant <= '1';
|
inst_data_variant <= VAR_2;
|
||||||
inst_addr_update <= next_inst;
|
inst_addr_update <= next_inst;
|
||||||
else
|
else
|
||||||
cnt_next <= cnt; -- Keep State
|
cnt_next <= cnt; -- Keep State
|
||||||
@ -2158,7 +2182,7 @@ begin
|
|||||||
-- Get Instance Data
|
-- Get Instance Data
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_opcode <= GET_INSTANCE;
|
inst_opcode <= GET_INSTANCE;
|
||||||
inst_data_variant <= '1';
|
inst_data_variant <= VAR_2;
|
||||||
inst_addr_update <= cur_inst;
|
inst_addr_update <= cur_inst;
|
||||||
end if;
|
end if;
|
||||||
end if;
|
end if;
|
||||||
@ -2341,12 +2365,12 @@ begin
|
|||||||
when 0 =>
|
when 0 =>
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_opcode <= GET_FIRST_INSTANCE;
|
inst_opcode <= GET_FIRST_INSTANCE;
|
||||||
inst_data_variant <= '1';
|
inst_data_variant <= VAR_2;
|
||||||
cnt_next <= 2;
|
cnt_next <= 2;
|
||||||
when 1 =>
|
when 1 =>
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_opcode <= GET_NEXT_INSTANCE;
|
inst_opcode <= GET_NEXT_INSTANCE;
|
||||||
inst_data_variant <= '1';
|
inst_data_variant <= VAR_2;
|
||||||
cnt_next <= 2;
|
cnt_next <= 2;
|
||||||
when 2 =>
|
when 2 =>
|
||||||
-- Instance Found
|
-- Instance Found
|
||||||
@ -2407,7 +2431,7 @@ begin
|
|||||||
else
|
else
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_opcode <= GET_NEXT_INSTANCE;
|
inst_opcode <= GET_NEXT_INSTANCE;
|
||||||
inst_data_variant <= '1';
|
inst_data_variant <= VAR_2;
|
||||||
end if;
|
end if;
|
||||||
else
|
else
|
||||||
-- DONE
|
-- DONE
|
||||||
@ -2426,7 +2450,7 @@ begin
|
|||||||
when 0 =>
|
when 0 =>
|
||||||
inst_op_start <= '1';
|
inst_op_start <= '1';
|
||||||
inst_opcode <= SEARCH_INSTANCE_HASH;
|
inst_opcode <= SEARCH_INSTANCE_HASH;
|
||||||
inst_data_variant <= '1';
|
inst_data_variant <= VAR_2;
|
||||||
cnt_next <= 1;
|
cnt_next <= 1;
|
||||||
when 1 =>
|
when 1 =>
|
||||||
-- Instance Found
|
-- Instance Found
|
||||||
@ -2541,6 +2565,91 @@ begin
|
|||||||
null;
|
null;
|
||||||
end case;
|
end case;
|
||||||
end if;
|
end if;
|
||||||
|
when GET_REQUESTED_DEADLINE_MISSED_STATUS =>
|
||||||
|
if (ready_out_dds = '1') then
|
||||||
|
cnt_next <= cnt + 1;
|
||||||
|
valid_out_dds <= '1';
|
||||||
|
|
||||||
|
case (cnt) is
|
||||||
|
-- Total Count
|
||||||
|
when 0 =>
|
||||||
|
data_out_dds <= deadline_miss_cnt;
|
||||||
|
-- Total Count Change
|
||||||
|
when 1 =>
|
||||||
|
data_out_dds <= deadline_miss_cnt_change;
|
||||||
|
-- Reset
|
||||||
|
deadline_miss_cnt_change_next <= (others => '0');
|
||||||
|
-- Last Instance Handle 1/4
|
||||||
|
when 2 =>
|
||||||
|
data_out_dds <= deadline_miss_last_inst(0);
|
||||||
|
-- Last Instance Handle 2/4
|
||||||
|
when 3 =>
|
||||||
|
data_out_dds <= deadline_miss_last_inst(1);
|
||||||
|
-- Last Instance Handle 3/4
|
||||||
|
when 4 =>
|
||||||
|
data_out_dds <= deadline_miss_last_inst(2);
|
||||||
|
-- Last Instance Handle 4/4
|
||||||
|
when 5 =>
|
||||||
|
data_out_dds <= deadline_miss_last_inst(3);
|
||||||
|
last_word_out_dds <= '1';
|
||||||
|
-- Return Code
|
||||||
|
when 6 =>
|
||||||
|
done_dds <= '1';
|
||||||
|
return_code_dds <= RETCODE_OK;
|
||||||
|
-- Reset
|
||||||
|
status_sig_next(REQUESTED_DEADLINE_MISSED_STATUS) <= '0';
|
||||||
|
|
||||||
|
-- DONE
|
||||||
|
stage_next <= IDLE;
|
||||||
|
when others =>
|
||||||
|
null;
|
||||||
|
end case;
|
||||||
|
end if;
|
||||||
|
when CHECK_DEADLINE =>
|
||||||
|
-- Memory Operation Guard
|
||||||
|
if (inst_op_done = '1') then
|
||||||
|
case (cnt) is
|
||||||
|
-- Get First Instance
|
||||||
|
when 0 =>
|
||||||
|
inst_op_start <= '1';
|
||||||
|
inst_opcode <= GET_FIRST_INSTANCE;
|
||||||
|
inst_data_variant <= VAR_3;
|
||||||
|
cnt_next <= 2;
|
||||||
|
-- Get Next Instance
|
||||||
|
when 1 =>
|
||||||
|
inst_op_start <= '1';
|
||||||
|
inst_opcode <= GET_NEXT_INSTANCE;
|
||||||
|
inst_data_variant <= VAR_3;
|
||||||
|
cnt_next <= 2;
|
||||||
|
-- Check Instance
|
||||||
|
when 2 =>
|
||||||
|
-- Reached End of Instances
|
||||||
|
if (inst_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then
|
||||||
|
-- DONE
|
||||||
|
stage_next <= IDLE;
|
||||||
|
else
|
||||||
|
-- Instance received Sample
|
||||||
|
if (inst_data.status_info(LIVELINESS_FLAG) = '1') then
|
||||||
|
-- Reset Liveliness Flag
|
||||||
|
inst_op_start <= '1';
|
||||||
|
inst_opcode <= UPDATE_INSTANCE;
|
||||||
|
update_inst_flags <= STATUS_FLAG;
|
||||||
|
status_info_update <= inst_data.status_info;
|
||||||
|
status_info_update(LIVELINESS_FLAG) <= '0';
|
||||||
|
cnt_next <= 1;
|
||||||
|
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;
|
||||||
|
deadline_miss_last_inst_next <= inst_data.key_hash;
|
||||||
|
cnt_next <= 1;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
when others =>
|
||||||
|
null;
|
||||||
|
end case;
|
||||||
|
end if;
|
||||||
when others =>
|
when others =>
|
||||||
null;
|
null;
|
||||||
end case;
|
end case;
|
||||||
@ -2658,13 +2767,20 @@ begin
|
|||||||
else
|
else
|
||||||
inst_prev_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS;
|
inst_prev_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS;
|
||||||
inst_addr_base_next <= inst_occupied_head;
|
inst_addr_base_next <= inst_occupied_head;
|
||||||
inst_addr_next <= inst_occupied_head + IMF_STATUS_INFO_OFFSET;
|
case (inst_data_variant) is
|
||||||
if (inst_data_variant = '0') then
|
when VAR_1 =>
|
||||||
inst_stage_next <= GET_INSTANCE_DATA_1;
|
inst_addr_next <= inst_occupied_head + IMF_STATUS_INFO_OFFSET;
|
||||||
else
|
inst_stage_next <= GET_INSTANCE_DATA_1;
|
||||||
inst_stage_next <= GET_INSTANCE_DATA_2;
|
inst_cnt_next <= 0;
|
||||||
end if;
|
when VAR_2 =>
|
||||||
inst_cnt_next <= 0;
|
inst_addr_next <= inst_occupied_head + IMF_KEY_HASH_OFFSET;
|
||||||
|
inst_stage_next <= GET_INSTANCE_DATA_2;
|
||||||
|
inst_cnt_next <= 0;
|
||||||
|
when VAR_3 =>
|
||||||
|
inst_addr_next <= inst_occupied_head + IMF_KEY_HASH_OFFSET;
|
||||||
|
inst_stage_next <= GET_INSTANCE_DATA_3;
|
||||||
|
inst_cnt_next <= 0;
|
||||||
|
end case;
|
||||||
end if;
|
end if;
|
||||||
when GET_NEXT_INSTANCE =>
|
when GET_NEXT_INSTANCE =>
|
||||||
-- No Instances avialable
|
-- No Instances avialable
|
||||||
@ -2687,13 +2803,20 @@ begin
|
|||||||
inst_cnt_next <= 0;
|
inst_cnt_next <= 0;
|
||||||
when GET_INSTANCE =>
|
when GET_INSTANCE =>
|
||||||
inst_addr_base_next <= inst_addr_update;
|
inst_addr_base_next <= inst_addr_update;
|
||||||
inst_addr_next <= inst_addr_update + IMF_KEY_HASH_OFFSET;
|
case (inst_data_variant) is
|
||||||
if (inst_data_variant = '0') then
|
when VAR_1 =>
|
||||||
inst_stage_next <= GET_INSTANCE_DATA_1;
|
inst_addr_next <= inst_addr_update + IMF_STATUS_INFO_OFFSET;
|
||||||
else
|
inst_stage_next <= GET_INSTANCE_DATA_1;
|
||||||
inst_stage_next <= GET_INSTANCE_DATA_2;
|
inst_cnt_next <= 0;
|
||||||
end if;
|
when VAR_2 =>
|
||||||
inst_cnt_next <= 0;
|
inst_addr_next <= inst_addr_update + IMF_KEY_HASH_OFFSET;
|
||||||
|
inst_stage_next <= GET_INSTANCE_DATA_2;
|
||||||
|
inst_cnt_next <= 0;
|
||||||
|
when VAR_3 =>
|
||||||
|
inst_addr_next <= inst_addr_update + IMF_KEY_HASH_OFFSET;
|
||||||
|
inst_stage_next <= GET_INSTANCE_DATA_3;
|
||||||
|
inst_cnt_next <= 0;
|
||||||
|
end case;
|
||||||
when UNMARK_INTANCES =>
|
when UNMARK_INTANCES =>
|
||||||
-- Empty Memory Guard
|
-- Empty Memory Guard
|
||||||
if (inst_occupied_head /= INSTANCE_MEMORY_MAX_ADDRESS) then
|
if (inst_occupied_head /= INSTANCE_MEMORY_MAX_ADDRESS) then
|
||||||
@ -2788,14 +2911,19 @@ begin
|
|||||||
-- Match
|
-- Match
|
||||||
else
|
else
|
||||||
-- Fetch Instance Data
|
-- Fetch Instance Data
|
||||||
if (inst_data_variant = '0') then
|
case (inst_data_variant) is
|
||||||
inst_stage_next <= GET_INSTANCE_DATA_1;
|
when VAR_1 =>
|
||||||
inst_cnt_next <= 1; -- No preload needed
|
inst_stage_next <= GET_INSTANCE_DATA_1;
|
||||||
else
|
inst_cnt_next <= 1; -- No preload needed
|
||||||
inst_addr_next <= inst_addr_base + IMF_KEY_HASH_OFFSET;
|
when VAR_2 =>
|
||||||
inst_stage_next <= GET_INSTANCE_DATA_2;
|
inst_addr_next <= inst_addr_base + IMF_KEY_HASH_OFFSET;
|
||||||
inst_cnt_next <= 0;
|
inst_stage_next <= GET_INSTANCE_DATA_2;
|
||||||
end if;
|
inst_cnt_next <= 0;
|
||||||
|
when VAR_3 =>
|
||||||
|
inst_addr_next <= inst_addr_base + IMF_KEY_HASH_OFFSET;
|
||||||
|
inst_stage_next <= GET_INSTANCE_DATA_3;
|
||||||
|
inst_cnt_next <= 0;
|
||||||
|
end case;
|
||||||
end if;
|
end if;
|
||||||
when others =>
|
when others =>
|
||||||
null;
|
null;
|
||||||
@ -2816,16 +2944,22 @@ begin
|
|||||||
-- Match
|
-- Match
|
||||||
if (inst_read_data = inst_latch_data.addr) then
|
if (inst_read_data = inst_latch_data.addr) then
|
||||||
-- Fetch Instance Data
|
-- Fetch Instance Data
|
||||||
if (inst_data_variant = '0') then
|
case (inst_data_variant) is
|
||||||
inst_addr_next <= inst_read_data + IMF_STATUS_INFO_OFFSET;
|
when VAR_1 =>
|
||||||
inst_stage_next <= GET_INSTANCE_DATA_1;
|
inst_addr_next <= inst_read_data + IMF_STATUS_INFO_OFFSET;
|
||||||
inst_cnt_next <= 0;
|
inst_stage_next <= GET_INSTANCE_DATA_1;
|
||||||
else
|
inst_cnt_next <= 0;
|
||||||
inst_addr_next <= inst_read_data + IMF_KEY_HASH_OFFSET;
|
when VAR_2 =>
|
||||||
inst_stage_next <= GET_INSTANCE_DATA_2;
|
inst_addr_next <= inst_read_data + IMF_KEY_HASH_OFFSET;
|
||||||
-- TODO: Skip Preload?
|
inst_stage_next <= GET_INSTANCE_DATA_2;
|
||||||
inst_cnt_next <= 0;
|
-- TODO: Skip Preload?
|
||||||
end if;
|
inst_cnt_next <= 0;
|
||||||
|
when VAR_3 =>
|
||||||
|
inst_addr_next <= inst_read_data + IMF_KEY_HASH_OFFSET;
|
||||||
|
inst_stage_next <= GET_INSTANCE_DATA_3;
|
||||||
|
-- TODO: Skip Preload?
|
||||||
|
inst_cnt_next <= 0;
|
||||||
|
end case;
|
||||||
-- No Match
|
-- No Match
|
||||||
else
|
else
|
||||||
-- Reached List Tail, No Match
|
-- Reached List Tail, No Match
|
||||||
@ -2854,16 +2988,54 @@ begin
|
|||||||
|
|
||||||
|
|
||||||
-- Fetch Instance Data
|
-- Fetch Instance Data
|
||||||
if (inst_data_variant = '0') then
|
case (inst_data_variant) is
|
||||||
inst_addr_next <= inst_addr_base + IMF_STATUS_INFO_OFFSET;
|
when VAR_1 =>
|
||||||
inst_stage_next <= GET_INSTANCE_DATA_1;
|
inst_addr_next <= inst_addr_base + IMF_STATUS_INFO_OFFSET;
|
||||||
inst_cnt_next <= 0;
|
inst_stage_next <= GET_INSTANCE_DATA_1;
|
||||||
else
|
inst_cnt_next <= 0;
|
||||||
inst_addr_next <= inst_addr_base + IMF_KEY_HASH_OFFSET;
|
when VAR_2 =>
|
||||||
inst_stage_next <= GET_INSTANCE_DATA_2;
|
inst_addr_next <= inst_addr_base + IMF_KEY_HASH_OFFSET;
|
||||||
-- TODO: Skip Preload?
|
inst_stage_next <= GET_INSTANCE_DATA_2;
|
||||||
inst_cnt_next <= 0;
|
-- TODO: Skip Preload?
|
||||||
end if;
|
inst_cnt_next <= 0;
|
||||||
|
when VAR_3 =>
|
||||||
|
inst_addr_next <= inst_addr_base + IMF_KEY_HASH_OFFSET;
|
||||||
|
inst_stage_next <= GET_INSTANCE_DATA_3;
|
||||||
|
-- TODO: Skip Preload?
|
||||||
|
inst_cnt_next <= 0;
|
||||||
|
end case;
|
||||||
|
end case;
|
||||||
|
when GET_INSTANCE_DATA_3 =>
|
||||||
|
-- Precondition: inst_addr (Status Info)
|
||||||
|
|
||||||
|
inst_ren <= '1';
|
||||||
|
inst_cnt_next <= inst_cnt + 1;
|
||||||
|
inst_addr_next <= inst_addr + 1;
|
||||||
|
|
||||||
|
case (inst_cnt) is
|
||||||
|
-- Memory Preload
|
||||||
|
when 0 =>
|
||||||
|
null;
|
||||||
|
-- Key Hash 1/4
|
||||||
|
when 1 =>
|
||||||
|
inst_data_next.key_hash(0) <= inst_read_data;
|
||||||
|
-- Key Hash 2/4
|
||||||
|
when 2 =>
|
||||||
|
inst_data_next.key_hash(1) <= inst_read_data;
|
||||||
|
-- Key Hash 3/4
|
||||||
|
when 3 =>
|
||||||
|
inst_data_next.key_hash(2) <= inst_read_data;
|
||||||
|
-- Key Hash 4/4
|
||||||
|
when 4 =>
|
||||||
|
inst_data_next.key_hash(3) <= inst_read_data;
|
||||||
|
-- Status Info
|
||||||
|
when 5 =>
|
||||||
|
inst_data_next.status_info <= inst_read_data;
|
||||||
|
|
||||||
|
-- DONE
|
||||||
|
inst_stage_next <= IDLE;
|
||||||
|
when others =>
|
||||||
|
null;
|
||||||
end case;
|
end case;
|
||||||
when GET_INSTANCE_DATA_2 =>
|
when GET_INSTANCE_DATA_2 =>
|
||||||
-- Precondition: inst_addr (Status Info)
|
-- Precondition: inst_addr (Status Info)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user