Remove GENERATION_COUNTERS Option

Generation Counters are always needed (e.g. for the calculation of the
view_state, since they are dependent on the reading of samples of the
last generation). As such, the Generation Counters were "converted" to
mandatory fields.
This commit is contained in:
Greek 2021-01-22 12:01:16 +01:00
parent bdb397ae7d
commit f152abc373
2 changed files with 92 additions and 110 deletions

View File

@ -354,9 +354,9 @@ READER
+-------------------------------------------------------------+ +-------------------------------------------------------------+
06| INSTANCE_ADDRESS | {A} 06| INSTANCE_ADDRESS | {A}
+-------------------------------------------------------------+ +-------------------------------------------------------------+
07| DISPOSED_GENERATION_COUNT | {A} [only GENERATION_COUNTERS] 07| DISPOSED_GENERATION_COUNT | {A}
+-------------------------------------------------------------+ +-------------------------------------------------------------+
08| NO_WRITERS_GENERATION_COUNT | {A} [only GENERATION_COUNTERS] 08| NO_WRITERS_GENERATION_COUNT | {A}
+-------------------------------------------------------------+ +-------------------------------------------------------------+
09| PREV_ADDRESS | {A} 09| PREV_ADDRESS | {A}
+-------------------------------------------------------------+ +-------------------------------------------------------------+
@ -441,9 +441,9 @@ INSTANCE MEMORY
+-------------------------------------------------------------+ +-------------------------------------------------------------+
06| SAMPLE_COUNT | {A/B} 06| SAMPLE_COUNT | {A/B}
+-------------------------------------------------------------+ +-------------------------------------------------------------+
07| DISPOSED_GENERATION_COUNT | {A} [only GENERATION_COUNTERS] 07| DISPOSED_GENERATION_COUNT | {A}
+-------------------------------------------------------------+ +-------------------------------------------------------------+
08| NO_WRITERS_GENERATION_COUNT | {A} [only GENERATION_COUNTERS] 08| NO_WRITERS_GENERATION_COUNT | {A}
+-------------------------------------------------------------+ +-------------------------------------------------------------+
09| | 09| |
+ IGNORE_DEADLINE + {A} [only TIME_BASED_FILTER] + IGNORE_DEADLINE + {A} [only TIME_BASED_FILTER]
@ -600,6 +600,14 @@ Scenario 2: With SHARED ownership and destination order by SOURCE timestamp, re
associated with the instance would forget the source timestamp when the deletion occurs and if a different associated with the instance would forget the source timestamp when the deletion occurs and if a different
DataWriter where to write the instance with an earlier timestamp the update would be incorrectly accepted. DataWriter where to write the instance with an earlier timestamp the update would be incorrectly accepted.
2.2.2.5.3.8 read (DDS)
Samples that contain no data do not count towards the limits imposed by the RESOURCE_LIMITS QoS policy.
2.2.2.5.3.8 read (DDS)
The act of reading a sample sets its sample_state to READ. If the sample belongs to the most recent
generation of the instance, it will also set the view_state of the instance to NOT_NEW. It will not
affect the instance_state of the instance.
INVALIDATION INVALIDATION
============ ============

View File

@ -11,7 +11,6 @@ entity history_cache is
MAX_SAMPLES_PER_INSTANCE : natural := DEFAULT_MAX_SAMPLES_PER_INSTANCE; MAX_SAMPLES_PER_INSTANCE : natural := DEFAULT_MAX_SAMPLES_PER_INSTANCE;
HISTORY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := DEFAULT_HISTORY_QOS; HISTORY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := DEFAULT_HISTORY_QOS;
RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := DEFAULT_RELIABILTY_QOS; RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := DEFAULT_RELIABILTY_QOS;
GENERATION_COUNTERS : boolean := TRUE;
); );
port ( port (
clk : in std_logic; clk : in std_logic;
@ -30,6 +29,9 @@ entity history_cache is
res_b : out HISTORY_CACHE_RESPOSNE_TYPE; res_b : out HISTORY_CACHE_RESPOSNE_TYPE;
data_out_b : out std_logic_vector(WORD_WIDTH-1 downto 0); data_out_b : out std_logic_vector(WORD_WIDTH-1 downto 0);
last_word_out_b : in std_logic; last_word_out_b : in std_logic;
instance_state : in INSTANCE_STATE_TYPE;
view_state : in VIEW_STATE_TYPE;
sample_state : in SAMPLE_STATE;
); );
end entity; end entity;
@ -82,7 +84,7 @@ architecture arch of history_cache is
constant SMF_INSTANCE_ADDR_OFFSET : natural := 6; constant SMF_INSTANCE_ADDR_OFFSET : natural := 6;
constant SMF_DISPOSED_GEN_CNT_OFFSET : natural := 7; constant SMF_DISPOSED_GEN_CNT_OFFSET : natural := 7;
constant SMF_NO_WRITERS_GEN_CNT_OFFSET : natural := 8; constant SMF_NO_WRITERS_GEN_CNT_OFFSET : natural := 8;
constant SMF_PREV_ADDR_OFFSET : natural := SMF_NO_WRITERS_GEN_CNT_OFFSET+1 when GENERATION_COUNTERS else SMF_INSTANCE_ADDR_OFFSET+1; constant SMF_PREV_ADDR_OFFSET : natural := SMF_NO_WRITERS_GEN_CNT_OFFSET+1;
constant SMF_NEXT_ADDR_OFFSET : natural := SMF_PREV_ADDR_OFFSET+1; constant SMF_NEXT_ADDR_OFFSET : natural := SMF_PREV_ADDR_OFFSET+1;
-- *PAYLOAD MEMORY FRAME FORMAT* -- *PAYLOAD MEMORY FRAME FORMAT*
constant PMF_NEXT_ADDR_OFFSET : natural := 0; constant PMF_NEXT_ADDR_OFFSET : natural := 0;
@ -94,11 +96,8 @@ architecture arch of history_cache is
constant IMF_SAMPLE_CNT_OFFSET : natural := 6; constant IMF_SAMPLE_CNT_OFFSET : natural := 6;
constant IMF_DISPOSED_GEN_CNT_OFFSET : natural := IMF_SAMPLE_CNT_OFFSET+1 when (MAX_SAMPLES_PER_INSTANCE /= LENGTH_UNLIMITED) else IMF_STATUS_INFO_OFFSET+1; constant IMF_DISPOSED_GEN_CNT_OFFSET : natural := IMF_SAMPLE_CNT_OFFSET+1 when (MAX_SAMPLES_PER_INSTANCE /= LENGTH_UNLIMITED) else IMF_STATUS_INFO_OFFSET+1;
constant IMF_NO_WRITERS_GEN_CNT_OFFSET : natural := IMF_DISPOSED_GEN_CNT_OFFSET+1; constant IMF_NO_WRITERS_GEN_CNT_OFFSET : natural := IMF_DISPOSED_GEN_CNT_OFFSET+1;
constant IMF_IGNORE_DEADLINE_OFFSET : natural := IMF_NO_WRITERS_GEN_CNT_OFFSET+1 when (GENERATION_COUNTERS) else constant IMF_IGNORE_DEADLINE_OFFSET : natural := IMF_NO_WRITERS_GEN_CNT_OFFSET+1;
IMF_SAMPLE_CNT_OFFSET+1 when (MAX_SAMPLES_PER_INSTANCE /= LENGTH_UNLIMITED) else IMF_STATUS_INFO_OFFSET+1; constant IMF_WRITER_BITMAP_OFFSET : natural := IMF_IGNORE_DEADLINE_OFFSET+2 when (TIME_BASED_FILTER_QOS /= DURATION_ZERO) else IMF_NO_WRITERS_GEN_CNT_OFFSET+1;
constant IMF_WRITER_BITMAP_OFFSET : natural := IMF_IGNORE_DEADLINE_OFFSET+2 when (TIME_BASED_FILTER_QOS /= DURATION_ZERO) else
IMF_NO_WRITERS_GEN_CNT_OFFSET+1 when (GENERATION_COUNTERS) else
IMF_SAMPLE_CNT_OFFSET+1 when (MAX_SAMPLES_PER_INSTANCE /= LENGTH_UNLIMITED) else IMF_STATUS_INFO_OFFSET+1;
--*****TYPE DECLARATION***** --*****TYPE DECLARATION*****
-- FSM states. Explained below in detail -- FSM states. Explained below in detail
@ -177,7 +176,7 @@ architecture arch of history_cache is
signal sample_mem_full, sample_mem_full_next : std_logic := '0'; signal sample_mem_full, sample_mem_full_next : std_logic := '0';
signal writer_pos, writer_pos_next : natural range TODO := 0; signal writer_pos, writer_pos_next : natural range TODO := 0;
signal writer_bitmap : ENDPOINT_BITMAP_ARRAY_TYPE; signal writer_bitmap : ENDPOINT_BITMAP_ARRAY_TYPE;
signal instance_state : INSTANCE_STATE_TYPE := ALIVE; signal instance_state_update : INSTANCE_STATE_TYPE := ALIVE;
signal key_hash, key_hash_next : KEY_HASH_TYPE := (others => (others => '0')); signal key_hash, key_hash_next : KEY_HASH_TYPE := (others => (others => '0'));
signal remove_oldest_sample, remove_oldest_sample_next : std_logic := '0'; signal remove_oldest_sample, remove_oldest_sample_next : std_logic := '0';
signal remove_oldest_inst_sample, remove_oldest_inst_sample_next : std_logic := '0'; signal remove_oldest_inst_sample, remove_oldest_inst_sample_next : std_logic := '0';
@ -564,7 +563,7 @@ begin
-- Wait for Instance Search to finish -- Wait for Instance Search to finish
if (inst_op_done = '1') then if (inst_op_done = '1') then
sample_addr_next <= sample_addr + 1; -- Disposed Gen Counter (Prev Address if GENERATION_COUNTERS=FALSE) sample_addr_next <= sample_addr + 1; -- Disposed Gen Counter
-- Instance Found -- Instance Found
if (inst_addr_base /= INSTANCE_MEMORY_MAX_ADDRESS) then if (inst_addr_base /= INSTANCE_MEMORY_MAX_ADDRESS) then
@ -641,7 +640,7 @@ begin
cnt_next <= 0; cnt_next <= 0;
else else
stage_next <= PRE_SAMPLE_FINALIZE; stage_next <= PRE_SAMPLE_FINALIZE;
cnt_next <= 0 when GENERATION_COUNTERS else 2; cnt_next <= 0;
end if; end if;
else else
-- Drop Change -- Drop Change
@ -664,7 +663,7 @@ begin
cnt_next <= 0; cnt_next <= 0;
else else
stage_next <= PRE_SAMPLE_FINALIZE; stage_next <= PRE_SAMPLE_FINALIZE;
cnt_next <= 0 when GENERATION_COUNTERS else 2; cnt_next <= 0;
end if; end if;
else else
-- Drop Change -- Drop Change
@ -685,7 +684,7 @@ begin
if (inst_data.status_info(NOT_ALIVE_DISPOSED_FLAG) /= '1' and inst_data.status_info(NOT_ALIVE_NO_WRITERS_FLAG) /= '1') then if (inst_data.status_info(NOT_ALIVE_DISPOSED_FLAG) /= '1' and inst_data.status_info(NOT_ALIVE_NO_WRITERS_FLAG) /= '1') then
-- STATUS INFO -- STATUS INFO
tmp_update <= tmp_update or STATUS_FLAG; tmp_update <= tmp_update or STATUS_FLAG;
instance_state <= NOT_ALIVE_DISPOSED; instance_state_update <= NOT_ALIVE_DISPOSED;
end if; end if;
-- WRITER BITMAP -- WRITER BITMAP
-- Convert Writer Bitmap to SLV -- Convert Writer Bitmap to SLV
@ -710,16 +709,15 @@ begin
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 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 -- STATUS INFO
tmp_update <= tmp_update or STATUS_FLAG; tmp_update <= tmp_update or STATUS_FLAG;
instance_state <= NOT_ALIVE_NO_WRITERS; instance_state_update <= NOT_ALIVE_NO_WRITERS;
end if; end if;
-- Instance ALIVE/FILTERED -- Instance ALIVE/FILTERED
else else
-- STATUS INFO -- STATUS INFO
tmp_update <= tmp_update or STATUS_FLAG; tmp_update <= tmp_update or STATUS_FLAG;
instance_state <= ALIVE; instance_state_update <= ALIVE;
-- GENERATION COUNTERS -- GENERATION COUNTERS
if (GENERATION_COUNTERS) then
-- NOT_ALIVE_DISPOSED -> ALIVE Transition -- NOT_ALIVE_DISPOSED -> ALIVE Transition
if (inst_data.status_info(NOT_ALIVE_DISPOSED_FLAG) = '1') then if (inst_data.status_info(NOT_ALIVE_DISPOSED_FLAG) = '1') then
tmp_update := tmp_update or DISPOSED_CNT_FLAG; tmp_update := tmp_update or DISPOSED_CNT_FLAG;
@ -729,7 +727,6 @@ begin
tmp_update := tmp_update or NO_WRITERS_CNT_FLAG; tmp_update := tmp_update or NO_WRITERS_CNT_FLAG;
gen_cnt <= inst_data.no_writers_gen_cnt + 1; gen_cnt <= inst_data.no_writers_gen_cnt + 1;
end if; end if;
end if;
-- WRITER BITMAP -- WRITER BITMAP
-- Convert Writer Bitmap to SLV -- Convert Writer Bitmap to SLV
@ -765,7 +762,7 @@ begin
cnt_next <= 0; cnt_next <= 0;
else else
stage_next <= PRE_SAMPLE_FINALIZE; stage_next <= PRE_SAMPLE_FINALIZE;
cnt_next <= 0 when GENERATION_COUNTERS else 2; cnt_next <= 0;
end if; end if;
end if; end if;
when FINALIZE_PAYLOAD => when FINALIZE_PAYLOAD =>
@ -786,7 +783,7 @@ begin
payload_wen <= '1'; payload_wen <= '1';
stage_next <= PRE_SAMPLE_FINALIZE; stage_next <= PRE_SAMPLE_FINALIZE;
cnt_next <= 0 when GENERATION_COUNTERS else 2; cnt_next <= 0;
when others => when others =>
null; null;
end case; end case;
@ -798,7 +795,6 @@ begin
case (cnt) is case (cnt) is
-- Disposed Generation Counter -- Disposed Generation Counter
when 0 => when 0 =>
if (GENERATION_COUNTERS) then
sample_addr_next <= sample_addr + 1; sample_addr_next <= sample_addr + 1;
sample_wen <= '1'; sample_wen <= '1';
@ -808,10 +804,8 @@ begin
else else
sample_write_data <= gen_cnt; sample_write_data <= gen_cnt;
end if; end if;
end if;
-- No Writer Generation Counter -- No Writer Generation Counter
when 1 => when 1 =>
if (GENERATION_COUNTERS) then
sample_wen <= '1'; sample_wen <= '1';
-- NOT_ALIVE_NO_WRITERS -> ALIVE Transition -- NOT_ALIVE_NO_WRITERS -> ALIVE Transition
@ -820,7 +814,6 @@ begin
else else
sample_write_data <= gen_cnt; sample_write_data <= gen_cnt;
end if; end if;
end if;
when 2 => when 2 =>
-- First Sample -- First Sample
if (newest_sample = SAMPLE_MEMORY_MAX_ADDRESS) then if (newest_sample = SAMPLE_MEMORY_MAX_ADDRESS) then
@ -1221,7 +1214,7 @@ begin
-- No More Writers for Instance -- No More Writers for Instance
if (tmp_bitmap = (tmp_bitmap'range => '0')) then if (tmp_bitmap = (tmp_bitmap'range => '0')) then
inst_op_start <= '1'; inst_op_start <= '1';
instance_state <= NOT_ALIVE_NO_WRITERS; instance_state_update <= NOT_ALIVE_NO_WRITERS;
inst_opcode <= UPDATE_INSTANCE; inst_opcode <= UPDATE_INSTANCE;
update_inst_flags <= STATUS_FLAG or WRITER_BITMAP_FLAG; update_inst_flags <= STATUS_FLAG or WRITER_BITMAP_FLAG;
else else
@ -1301,7 +1294,7 @@ begin
-- Latch Signals needed for Mermory Operation (Use _next signals, because some signals are set in same clk) -- Latch Signals needed for Mermory Operation (Use _next signals, because some signals are set in same clk)
inst_latch_data_next <= ( inst_latch_data_next <= (
key_hash => key_hash_next, key_hash => key_hash_next,
instance_state => instance_state, instance_state => instance_state_update,
sample_cnt => sample_cnt, sample_cnt => sample_cnt,
gen_cnt => gen_cnt, gen_cnt => gen_cnt,
deadline => deadline, deadline => deadline,
@ -1358,11 +1351,11 @@ begin
inst_stage_next <= UPDATE_INSTANCE; inst_stage_next <= UPDATE_INSTANCE;
inst_addr_next <= inst_addr_update + IMF_SAMPLE_CNT_OFFSET; inst_addr_next <= inst_addr_update + IMF_SAMPLE_CNT_OFFSET;
inst_cnt_next <= 3; inst_cnt_next <= 3;
elsif (GENERATION_COUNTERS and (update_inst_flags and DISPOSED_CNT_FLAG) = DISPOSED_CNT_FLAG) then elsif ((update_inst_flags and DISPOSED_CNT_FLAG) = DISPOSED_CNT_FLAG) then
inst_stage_next <= UPDATE_INSTANCE; inst_stage_next <= UPDATE_INSTANCE;
inst_addr_next <= inst_addr_update + IMF_DISPOSED_GEN_CNT_OFFSET; inst_addr_next <= inst_addr_update + IMF_DISPOSED_GEN_CNT_OFFSET;
inst_cnt_next <= 6; inst_cnt_next <= 6;
elsif (GENERATION_COUNTERS and (update_inst_flags and NO_WRITERS_CNT_FLAG) = NO_WRITERS_CNT_FLAG) then elsif ((update_inst_flags and NO_WRITERS_CNT_FLAG) = NO_WRITERS_CNT_FLAG) then
inst_stage_next <= UPDATE_INSTANCE; inst_stage_next <= UPDATE_INSTANCE;
inst_addr_next <= inst_addr_update + IMF_NO_WRITERS_GEN_CNT_OFFSET; inst_addr_next <= inst_addr_update + IMF_NO_WRITERS_GEN_CNT_OFFSET;
inst_cnt_next <= 7; inst_cnt_next <= 7;
@ -1619,23 +1612,11 @@ begin
-- Sample Count -- Sample Count
when 7 => when 7 =>
inst_write_data <= std_logic_vector(to_unsigned(1, WORD_WIDTH)); inst_write_data <= std_logic_vector(to_unsigned(1, WORD_WIDTH));
if (GENERATION_COUNTERS) then
inst_cnt <= 8;
elsif (TIME_BASED_FILTER_QOS /= DURATION_ZERO) then
inst_cnt <= 10;
else
inst_stage_next <= SET_WRITER_BITMAP;
inst_cnt_next <= 0;
end if;
-- Disposed Generation Count -- Disposed Generation Count
when 8 => when 8 =>
if (GENERATION_COUNTERS) then
inst_write_data <= (others => '0'); inst_write_data <= (others => '0');
end if;
-- No Writers Generation Count -- No Writers Generation Count
when 9 => when 9 =>
if (GENERATION_COUNTERS) then
inst_write_data <= (others => '0'); inst_write_data <= (others => '0');
if (TIME_BASED_FILTER_QOS /= DURATION_ZERO) then if (TIME_BASED_FILTER_QOS /= DURATION_ZERO) then
@ -1644,7 +1625,6 @@ begin
inst_stage_next <= SET_WRITER_BITMAP; inst_stage_next <= SET_WRITER_BITMAP;
inst_cnt_next <= 0; inst_cnt_next <= 0;
end if; end if;
end if;
-- Ignore Deadline 1/2 -- Ignore Deadline 1/2
when 10 => when 10 =>
if (TIME_BASED_FILTER_QOS /= DURATION_ZERO) then if (TIME_BASED_FILTER_QOS /= DURATION_ZERO) then
@ -1699,10 +1679,10 @@ begin
if ((inst_latch_data.update_flags and SAMPLE_CNT_FLAG) = SAMPLE_CNT_FLAG) then if ((inst_latch_data.update_flags and SAMPLE_CNT_FLAG) = SAMPLE_CNT_FLAG) then
inst_addr_next <= inst_addr_base + IMF_SAMPLE_CNT_OFFSET; inst_addr_next <= inst_addr_base + IMF_SAMPLE_CNT_OFFSET;
inst_cnt_next <= 1; inst_cnt_next <= 1;
elsif (GENERATION_COUNTERS and (inst_latch_data.update_flags and DISPOSED_CNT_FLAG) = DISPOSED_CNT_FLAG) then elsif ((inst_latch_data.update_flags and DISPOSED_CNT_FLAG) = DISPOSED_CNT_FLAG) then
inst_addr_next <= inst_addr_base + IMF_DISPOSED_GEN_CNT_OFFSET; inst_addr_next <= inst_addr_base + IMF_DISPOSED_GEN_CNT_OFFSET;
inst_cnt_next <= 2; inst_cnt_next <= 2;
elsif (GENERATION_COUNTERS and (inst_latch_data.update_flags and NO_WRITERS_CNT_FLAG) = NO_WRITERS_CNT_FLAG) then elsif ((inst_latch_data.update_flags and NO_WRITERS_CNT_FLAG) = NO_WRITERS_CNT_FLAG) then
inst_addr_next <= inst_addr_base + IMF_NO_WRITERS_GEN_CNT_OFFSET; inst_addr_next <= inst_addr_base + IMF_NO_WRITERS_GEN_CNT_OFFSET;
inst_cnt_next <= 3; inst_cnt_next <= 3;
elsif (TIME_BASED_FILTER_QOS /= DURATION_ZERO and (inst_latch_data.update_flags and IGNORE_DEADLINE_FLAG) = IGNORE_DEADLINE_FLAG) then elsif (TIME_BASED_FILTER_QOS /= DURATION_ZERO and (inst_latch_data.update_flags and IGNORE_DEADLINE_FLAG) = IGNORE_DEADLINE_FLAG) then
@ -1721,10 +1701,10 @@ begin
inst_wen <= '1'; inst_wen <= '1';
inst_write_data <= inst_latch_data.sample_cnt; inst_write_data <= inst_latch_data.sample_cnt;
if (GENERATION_COUNTERS and (inst_latch_data.update_flags and DISPOSED_CNT_FLAG) = DISPOSED_CNT_FLAG) then if ((inst_latch_data.update_flags and DISPOSED_CNT_FLAG) = DISPOSED_CNT_FLAG) then
inst_addr_next <= inst_addr_base + IMF_DISPOSED_GEN_CNT_OFFSET; inst_addr_next <= inst_addr_base + IMF_DISPOSED_GEN_CNT_OFFSET;
inst_cnt_next <= 2; inst_cnt_next <= 2;
elsif (GENERATION_COUNTERS and (inst_latch_data.update_flags and NO_WRITERS_CNT_FLAG) = NO_WRITERS_CNT_FLAG) then elsif ((inst_latch_data.update_flags and NO_WRITERS_CNT_FLAG) = NO_WRITERS_CNT_FLAG) then
inst_addr_next <= inst_addr_base + IMF_NO_WRITERS_GEN_CNT_OFFSET; inst_addr_next <= inst_addr_base + IMF_NO_WRITERS_GEN_CNT_OFFSET;
inst_cnt_next <= 3; inst_cnt_next <= 3;
elsif (TIME_BASED_FILTER_QOS /= DURATION_ZERO and (inst_latch_data.update_flags and IGNORE_DEADLINE_FLAG) = IGNORE_DEADLINE_FLAG) then elsif (TIME_BASED_FILTER_QOS /= DURATION_ZERO and (inst_latch_data.update_flags and IGNORE_DEADLINE_FLAG) = IGNORE_DEADLINE_FLAG) then
@ -1740,14 +1720,11 @@ begin
end if; end if;
-- Disposed Generation Count -- Disposed Generation Count
when 2 => when 2 =>
if (GENERATION_COUNTERS) then
inst_wen <= '1'; inst_wen <= '1';
inst_write_data <= inst_latch_data.gen_cnt; inst_write_data <= inst_latch_data.gen_cnt;
if (GENERATION_COUNTERS and (inst_latch_data.update_flags and NO_WRITERS_CNT_FLAG) = NO_WRITERS_CNT_FLAG) then -- NOTE: Both Generation Counters cannot be updated on the same update procedure
inst_addr_next <= inst_addr_base + IMF_NO_WRITERS_GEN_CNT_OFFSET; if (TIME_BASED_FILTER_QOS /= DURATION_ZERO and (inst_latch_data.update_flags and IGNORE_DEADLINE_FLAG) = IGNORE_DEADLINE_FLAG) then
inst_cnt_next <= 3;
elsif (TIME_BASED_FILTER_QOS /= DURATION_ZERO and (inst_latch_data.update_flags and IGNORE_DEADLINE_FLAG) = IGNORE_DEADLINE_FLAG) then
inst_addr_next <= inst_addr_base + IMF_IGNORE_DEADLINE_OFFSET; inst_addr_next <= inst_addr_base + IMF_IGNORE_DEADLINE_OFFSET;
inst_cnt_next <= 4; inst_cnt_next <= 4;
elsif ((inst_latch_data.update_flags and WRITER_BITMAP_FLAG) = WRITER_BITMAP_FLAG) then elsif ((inst_latch_data.update_flags and WRITER_BITMAP_FLAG) = WRITER_BITMAP_FLAG) then
@ -1758,10 +1735,8 @@ begin
-- DONE -- DONE
inst_stage_next <= IDLE; inst_stage_next <= IDLE;
end if; end if;
end if;
-- No Writers Generation Count -- No Writers Generation Count
when 3 => when 3 =>
if (GENERATION_COUNTERS) then
inst_wen <= '1'; inst_wen <= '1';
inst_write_data <= inst_latch_data.gen_cnt; inst_write_data <= inst_latch_data.gen_cnt;
@ -1776,7 +1751,6 @@ begin
-- DONE -- DONE
inst_stage_next <= IDLE; inst_stage_next <= IDLE;
end if; end if;
end if;
-- Ignore Deadline 1/2 -- Ignore Deadline 1/2
when 4 => when 4 =>
if (TIME_BASED_FILTER_QOS /= DURATION_ZERO) then if (TIME_BASED_FILTER_QOS /= DURATION_ZERO) then