diff --git a/src/dds_endpoint.vhd b/src/dds_endpoint.vhd index 8ac3d5d..04e529d 100644 --- a/src/dds_endpoint.vhd +++ b/src/dds_endpoint.vhd @@ -272,6 +272,7 @@ architecture arch of history_cache is signal unmark_instances, unmark_instances_next : std_logic := '0'; signal dynamic_next_instance, dynamic_next_instance_next : std_logic := '0'; signal inst_data_variant : std_logic := '0'; + signal abort_khg : std_logic := '0'; --*****ALIAS DECLARATION***** alias prev_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_1; @@ -353,7 +354,7 @@ begin key_hash_generator_inst : entity work.key_hash_generator(arch) port ( clk => clk, - reset => reset, + reset => reset or abort_khg, data_in => khg_data_in, valid_in => khg_valid_in, ready_in => khg_ready_in, @@ -443,6 +444,7 @@ begin ack_dds <= '0'; inst_data_variant <= '0'; done_dds <= '0'; + abort_khg <= '0'; return_code_dds <= RETCODE_UNSUPPORTED; case (stage) is @@ -702,7 +704,7 @@ begin sample_wen <= '1'; sample_write_data <= empty_payload_list_head; - payload_addr_next <= empty_payload_list_head + PMF_NEXT_ADDR_OFFSET; + payload_addr_next <= empty_payload_list_head + PMF_PAYLOAD_OFFSET; cur_payload_next <= empty_payload_list_head; else -- Mark Sample with no Payload @@ -734,9 +736,9 @@ begin end if; -- Flow Control Guard - if ((valid_in_rtps = '1' and has_key_hash = '0') or (valid_in_rtps = '1' and has_key_hash = '0' and khg_ready_in = '1')) then + if ((valid_in_rtps = '1' and has_key_hash = '1') or (valid_in_rtps = '1' and has_key_hash = '0' and khg_ready_in = '1')) then cnt_next <= cnt + 1; - payload_addr_next <= payload_addr + PMF_NEXT_ADDR_OFFSET; + payload_addr_next <= payload_addr + 1; -- Payload Write if (has_data = '1') then @@ -752,22 +754,30 @@ begin -- End of Payload if (last_word_in_rtps = '1') then - if (has_key_hash = '0') then - khg_last_word_in <= '1'; - stage_next <= GET_KEY_HASH; - cnt_next <= 0; + khg_last_word_in <= '1'; + + -- Payload Slot not full + if (has_data = '1' and cnt /= PAYLOAD_FRAME_SIZE-2) then + -- Zero Rest of Payload Slot + stage_next <= ZERO_PAYLOAD; else - stage_next <= FILTER_STAGE; + if (has_key_hash = '0') then + -- Fetch the Key Hash + stage_next <= GET_KEY_HASH; + cnt_next <= 0; + else + stage_next <= FILTER_STAGE; + end if; end if; -- End of Payload Slot elsif (has_data = '1' and cnt = PAYLOAD_FRAME_SIZE-2) then stage_next <= NEXT_PAYLOAD_SLOT; - payload_addr_next <= cur_payload; + payload_addr_next <= cur_payload + PMF_NEXT_ADDR_OFFSET; cnt_next <= 0; end if; end if; when NEXT_PAYLOAD_SLOT => - -- Precondition: payload_addr (Beginning of current Slot) + -- Precondition: payload_addr (Next Pointer of cur_payload) cnt_next <= cnt + 1; @@ -780,15 +790,34 @@ begin if (payload_read_data = PAYLOAD_MEMORY_MAX_ADDRESS) then -- Reject Change stage_next <= SKIP_ADD_REJECT; + -- Abort Key Hash Generation + abort_khg <= '1'; else -- Latch next Payload Slot and Continue cur_payload_next <= payload_read_data; - payload_addr_next <= payload_read_data + PMF_NEXT_ADDR_OFFSET; + payload_addr_next <= payload_read_data + PMF_PAYLOAD_OFFSET; stage_next <= ADD_PAYLOAD; end if; when others => null; end case; + when ZERO_PAYLOAD => + cnt_next <= cnt + 1; + payload_addr_next <= payload_addr + 1; + + -- Zero Payload + payload_write_data <= (others => '0'); + payload_wen <= '1'; + + -- Exit Condition + if (cnt = PAYLOAD_FRAME_SIZE-2) then + if (has_key_hash = '0') then + stage_next <= GET_KEY_HASH; + cnt_next <= 0; + else + stage_next <= FILTER_STAGE; + end if; + end if; when GET_KEY_HASH => khg_ready_out <= '1';