diff --git a/src/TEMPLATE_key_holder.vhd b/src/TEMPLATE_key_holder.vhd index 7048cb2..d8198ac 100644 --- a/src/TEMPLATE_key_holder.vhd +++ b/src/TEMPLATE_key_holder.vhd @@ -150,12 +150,14 @@ begin ack <= '1'; stage_next <= GET_PAYLOAD_HEADER; -- Reset - key_hash_next <= KEY_HASH_NIL; + key_hash_next <= KEY_HASH_NIL; + decode_error_latch_next <= '0'; when PUSH_SERIALIZED_KEY => ack <= '1'; stage_next <= GET_PAYLOAD_HEADER; -- Reset - key_hash_next <= KEY_HASH_NIL; + key_hash_next <= KEY_HASH_NIL; + decode_error_latch_next <= '0'; when READ_KEY_HASH => ack <= '1'; -- Key Hash not calculated diff --git a/src/Tests/Level_1/L1_Type1_key_holder_test1.vhd b/src/Tests/Level_1/L1_Type1_key_holder_test1.vhd index a9b10cc..1714df9 100644 --- a/src/Tests/Level_1/L1_Type1_key_holder_test1.vhd +++ b/src/Tests/Level_1/L1_Type1_key_holder_test1.vhd @@ -9,11 +9,12 @@ use work.rtps_package.all; use work.user_config.all; use work.rtps_config_package.all; use work.rtps_test_package.all; -use work.Type2_package.all; +use work.Type1_package.all; -- This testbench tests the KEY_HOLDER commands of TYPE1. --- It uses the writer_interface to send a valid payload, then reads the serialized key and the key hash. The returned serialized key is compared to a "handcrafted" reference, and the key hash is latched for later comparison. --- Then the reference serialized key is pushed (resetting the internally generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previously compared). +-- Firstly an invalid serialized payload is sent to test the decode error. +-- Secondly the writer_interface is used to send a valid payload, then reads the serialized key and the key hash. The returned serialized key is compared to a "handcrafted" reference, and the key hash is latched for later comparison. +-- Thirty the reference serialized key is pushed (resetting the internally generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previously compared). -- The payload is sent in Big Endian. entity L1_Type1_key_holder_test1 is @@ -22,13 +23,14 @@ end entity; architecture testbench of L1_Type1_key_holder_test1 is signal clk, reset : std_logic := '0'; - signal ready_sk, ready_w, ready_kh_in, ready_kh_out, valid_sk, valid_w, valid_kh_in, valid_kh_out, last_word_sk, last_word_w, last_word_kh_in, last_word_kh_out : std_logic := '0'; - signal data_sk, data_w, data_kh_in, data_kh_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal ready_de, ready_sk, ready_w, ready_kh_in, ready_kh_out, valid_de, valid_sk, valid_w, valid_kh_in, valid_kh_out, last_word_de, last_word_sk, last_word_w, last_word_kh_in, last_word_kh_out : std_logic := '0'; + signal data_de, data_sk, data_w, data_kh_in, data_kh_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); signal start_w, ack_w, start_kh, ack_kh, decode_error, encode_done : std_logic := '0'; signal opcode_kh : KEY_HOLDER_OPCODE_TYPE := NOP; shared variable SB_out : osvvm.ScoreBoardPkg_slv.ScoreBoardPType; - shared variable serialized_key : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + shared variable serialized_key, invalid_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; signal key_hash, key_hash_latch : KEY_HASH_TYPE := KEY_HASH_NIL; + signal send_invalid_data : std_logic := '0'; signal id_in : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := (others => '0'); signal a_in : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := (others => '0'); @@ -125,14 +127,23 @@ begin KH := GetAlertLogID("KeyHash", ALERTLOG_BASE_ID); Log("Initial Reset", INFO); - start_w <= '0'; - reset <= '1'; + send_invalid_data <= '0'; + start_w <= '0'; + reset <= '1'; wait until rising_edge(clk); wait until rising_edge(clk); reset <= '0'; + -- Create Invalid Serialized Payload + for i in 0 to MAX_TYPE1_SIZE loop + invalid_data.data(i) := RV.RandSlv(invalid_data.data(i)'length); + invalid_data.length := invalid_data.length + 1; + end loop; + invalid_data.last(invalid_data.length-1) := '1'; + + -- Serialized Key Payload Header - gen_CDR(SERIALIZED_KEY_HEADER, ALIGN_4, align_offset, serialized_key); + write_serialized_payload(SERIALIZED_KEY_HEADER, ALIGN_4, align_offset, serialized_key); -- Reset Alignment align_offset := (others => '0'); @@ -141,7 +152,7 @@ begin id_in <= RV.RandSlv(id_in'length); a_in <= RV.RandSlv(a_in'length); wait for 0 ns; - gen_CDR(id_in, ALIGN_4, align_offset, serialized_key); + write_serialized_payload(id_in, ALIGN_4, align_offset, serialized_key); -- Finalize Serialized Key if (align_offset(1 downto 0) /= "00") then @@ -150,6 +161,24 @@ begin push_sk; + Log("Push Invalid DATA", INFO); + send_invalid_data <= '1'; + opcode_kh <= PUSH_DATA; + start_w <= '1'; + wait_on_sig(ack_w); + wait until rising_edge(clk); + start_w <= '0'; + start_kh <= '1'; + wait_on_sig(ack_kh); + wait until rising_edge(clk); + start_kh <= '0'; + wait_on_sig(last_word_kh_in); + wait_on_sig(ready_kh_in); + wait until rising_edge(clk); + + Alertif(decode_error /= '1', "Decode error not asserted", ERROR); + send_invalid_data <= '0'; + Log("Push DATA", INFO); opcode_kh <= PUSH_DATA; start_w <= '1'; @@ -160,9 +189,12 @@ begin wait_on_sig(ack_kh); wait until rising_edge(clk); start_kh <= '0'; + wait for 1 ps; -- Wait until signals are stable + Alertif(decode_error /= '0', "Decode error still asserted", ERROR); wait_on_sig(last_word_kh_in); wait_on_sig(ready_kh_in); wait until rising_edge(clk); + Alertif(decode_error = '1', "Decode error asserted", ERROR); Log("Read and Compare Serialized Key", INFO); opcode_kh <= READ_SERIALIZED_KEY; @@ -193,6 +225,7 @@ begin wait_on_sig(last_word_sk); wait_on_sig(ready_sk); wait until rising_edge(clk); + Alertif(decode_error = '1', "Decode error asserted", ERROR); push_sk; Log("Read and Compare Serialized Key", INFO); @@ -234,28 +267,29 @@ begin wait for TEST_CLOCK_PERIOD/2; end process; - alert_prc : process(all) - begin - if rising_edge(clk) then - Alertif(decode_error = '1', "The Reader signals a DECODE Error", ERROR); - end if; - end process; - switch_prc : process(all) begin + ready_w <= '0'; + ready_de <= '0'; + ready_sk <= '0'; case (opcode_kh) is when PUSH_SERIALIZED_KEY => ready_sk <= ready_kh_in; valid_kh_in <= valid_sk; data_kh_in <= data_sk; last_word_kh_in <= last_word_sk; - ready_w <= '0'; when others => - ready_w <= ready_kh_in; - valid_kh_in <= valid_w; - data_kh_in <= data_w; - last_word_kh_in <= last_word_w; - ready_sk <= '0'; + if (send_invalid_data = '1') then + ready_de <= ready_kh_in; + valid_kh_in <= valid_de; + data_kh_in <= data_de; + last_word_kh_in <= last_word_de; + else + ready_w <= ready_kh_in; + valid_kh_in <= valid_w; + data_kh_in <= data_w; + last_word_kh_in <= last_word_w; + end if; end case; end process; @@ -279,6 +313,26 @@ begin end if; end process; + de_prc : process(all) + variable cnt : natural := 0; + begin + valid_de <= '1'; + data_de <= invalid_data.data(cnt); + if (cnt = invalid_data.length-1) then + last_word_de <= '1'; + end if; + + if rising_edge(clk) then + if (ready_de = '1') then + if (cnt = invalid_data.length-1) then + cnt := 0; + else + cnt := cnt + 1; + end if; + end if; + end if; + end process; + output_check_prc : process(all) variable cnt : natural range 0 to 3 := 0; begin diff --git a/src/Tests/Level_1/L1_Type1_key_holder_test2.vhd b/src/Tests/Level_1/L1_Type1_key_holder_test2.vhd index dbb6245..d93cf70 100644 --- a/src/Tests/Level_1/L1_Type1_key_holder_test2.vhd +++ b/src/Tests/Level_1/L1_Type1_key_holder_test2.vhd @@ -9,11 +9,12 @@ use work.rtps_package.all; use work.user_config.all; use work.rtps_config_package.all; use work.rtps_test_package.all; -use work.Type2_package.all; +use work.Type1_package.all; -- This testbench tests the KEY_HOLDER commands of TYPE1. --- It uses the writer_interface to send a valid payload, then reads the serialized key and the key hash. The returned serialized key is compared to a "handcrafted" reference, and the key hash is latched for later comparison. --- Then the reference serialized key is pushed (resetting the internally generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previously compared). +-- Firstly an invalid serialized payload is sent to test the decode error. +-- Secondly the writer_interface is used to send a valid payload, then reads the serialized key and the key hash. The returned serialized key is compared to a "handcrafted" reference, and the key hash is latched for later comparison. +-- Thirty the reference serialized key is pushed (resetting the internally generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previously compared). -- The payload is sent in Little Endian. entity L1_Type1_key_holder_test2 is @@ -22,13 +23,14 @@ end entity; architecture testbench of L1_Type1_key_holder_test2 is signal clk, reset : std_logic := '0'; - signal ready_sk, ready_w, ready_kh_in, ready_kh_out, valid_sk, valid_w, valid_kh_in, valid_kh_out, last_word_sk, last_word_w, last_word_kh_in, last_word_kh_out : std_logic := '0'; - signal data_sk, data_w, data_kh_in, data_kh_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal ready_de, ready_sk, ready_w, ready_kh_in, ready_kh_out, valid_de, valid_sk, valid_w, valid_kh_in, valid_kh_out, last_word_de, last_word_sk, last_word_w, last_word_kh_in, last_word_kh_out : std_logic := '0'; + signal data_de, data_sk, data_w, data_kh_in, data_kh_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); signal start_w, ack_w, start_kh, ack_kh, decode_error, encode_done : std_logic := '0'; signal opcode_kh : KEY_HOLDER_OPCODE_TYPE := NOP; shared variable SB_out : osvvm.ScoreBoardPkg_slv.ScoreBoardPType; - shared variable serialized_key : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + shared variable serialized_key, invalid_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; signal key_hash, key_hash_latch : KEY_HASH_TYPE := KEY_HASH_NIL; + signal send_invalid_data : std_logic := '0'; signal id_in : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := (others => '0'); signal a_in : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := (others => '0'); @@ -131,14 +133,23 @@ begin KH := GetAlertLogID("KeyHash", ALERTLOG_BASE_ID); Log("Initial Reset", INFO); - start_w <= '0'; - reset <= '1'; + send_invalid_data <= '0'; + start_w <= '0'; + reset <= '1'; wait until rising_edge(clk); wait until rising_edge(clk); reset <= '0'; + -- Create Invalid Serialized Payload + for i in 0 to MAX_TYPE1_SIZE loop + invalid_data.data(i) := RV.RandSlv(invalid_data.data(i)'length); + invalid_data.length := invalid_data.length + 1; + end loop; + invalid_data.last(invalid_data.length-1) := '1'; + + -- Serialized Key Payload Header - gen_CDR(SERIALIZED_KEY_HEADER, ALIGN_4, align_offset, serialized_key); + write_serialized_payload(SERIALIZED_KEY_HEADER, ALIGN_4, align_offset, serialized_key); -- Reset Alignment align_offset := (others => '0'); @@ -147,7 +158,7 @@ begin id_in <= RV.RandSlv(id_in'length); a_in <= RV.RandSlv(a_in'length); wait for 0 ns; - gen_CDR(endian_swap('1',id_in), ALIGN_4, align_offset, serialized_key); + write_serialized_payload(endian_swap('1',id_in), ALIGN_4, align_offset, serialized_key); -- Finalize Serialized Key if (align_offset(1 downto 0) /= "00") then @@ -156,6 +167,24 @@ begin push_sk; + Log("Push Invalid DATA", INFO); + send_invalid_data <= '1'; + opcode_kh <= PUSH_DATA; + start_w <= '1'; + wait_on_sig(ack_w); + wait until rising_edge(clk); + start_w <= '0'; + start_kh <= '1'; + wait_on_sig(ack_kh); + wait until rising_edge(clk); + start_kh <= '0'; + wait_on_sig(last_word_kh_in); + wait_on_sig(ready_kh_in); + wait until rising_edge(clk); + + Alertif(decode_error /= '1', "Decode error not asserted", ERROR); + send_invalid_data <= '0'; + Log("Push DATA", INFO); opcode_kh <= PUSH_DATA; start_w <= '1'; @@ -166,9 +195,12 @@ begin wait_on_sig(ack_kh); wait until rising_edge(clk); start_kh <= '0'; + wait for 1 ps; -- Wait until signals are stable + Alertif(decode_error /= '0', "Decode error still asserted", ERROR); wait_on_sig(last_word_kh_in); wait_on_sig(ready_kh_in); wait until rising_edge(clk); + Alertif(decode_error = '1', "Decode error asserted", ERROR); Log("Read and Compare Serialized Key", INFO); opcode_kh <= READ_SERIALIZED_KEY; @@ -199,6 +231,7 @@ begin wait_on_sig(last_word_sk); wait_on_sig(ready_sk); wait until rising_edge(clk); + Alertif(decode_error = '1', "Decode error asserted", ERROR); push_sk; Log("Read and Compare Serialized Key", INFO); @@ -240,28 +273,29 @@ begin wait for TEST_CLOCK_PERIOD/2; end process; - alert_prc : process(all) - begin - if rising_edge(clk) then - Alertif(decode_error = '1', "The Reader signals a DECODE Error", ERROR); - end if; - end process; - switch_prc : process(all) begin + ready_w <= '0'; + ready_de <= '0'; + ready_sk <= '0'; case (opcode_kh) is when PUSH_SERIALIZED_KEY => ready_sk <= ready_kh_in; valid_kh_in <= valid_sk; data_kh_in <= data_sk; last_word_kh_in <= last_word_sk; - ready_w <= '0'; when others => + if (send_invalid_data = '1') then + ready_de <= ready_kh_in; + valid_kh_in <= valid_de; + data_kh_in <= data_de; + last_word_kh_in <= last_word_de; + else ready_w <= ready_kh_in; valid_kh_in <= valid_w; data_kh_in <= data_w; last_word_kh_in <= last_word_w; - ready_sk <= '0'; + end if; end case; end process; @@ -285,6 +319,26 @@ begin end if; end process; + de_prc : process(all) + variable cnt : natural := 0; + begin + valid_de <= '1'; + data_de <= invalid_data.data(cnt); + if (cnt = invalid_data.length-1) then + last_word_de <= '1'; + end if; + + if rising_edge(clk) then + if (ready_de = '1') then + if (cnt = invalid_data.length-1) then + cnt := 0; + else + cnt := cnt + 1; + end if; + end if; + end if; + end process; + output_check_prc : process(all) variable cnt : natural range 0 to 3 := 0; begin diff --git a/src/Tests/Level_1/L1_Type2_key_holder_test1.vhd b/src/Tests/Level_1/L1_Type2_key_holder_test1.vhd index 6961541..a066aca 100644 --- a/src/Tests/Level_1/L1_Type2_key_holder_test1.vhd +++ b/src/Tests/Level_1/L1_Type2_key_holder_test1.vhd @@ -12,8 +12,9 @@ use work.rtps_test_package.all; use work.Type2_package.all; -- This testbench tests the KEY_HOLDER commands of TYPE2. --- It uses the writer_interface to send a valid payload, then reads the serialized key and the key hash. The returned serialized key is compared to a "handcrafted" reference, and the key hash is latched for later comparison. --- Then the reference serialized key is pushed (resetting the internally generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previously compared). +-- Firstly an invalid serialized payload is sent to test the decode error. +-- Secondly the writer_interface is used to send a valid payload, then reads the serialized key and the key hash. The returned serialized key is compared to a "handcrafted" reference, and the key hash is latched for later comparison. +-- Thirty the reference serialized key is pushed (resetting the internally generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previously compared). -- The payload is sent in Big Endian. entity L1_Type2_key_holder_test1 is @@ -22,13 +23,14 @@ end entity; architecture testbench of L1_Type2_key_holder_test1 is signal clk, reset : std_logic := '0'; - signal ready_sk, ready_w, ready_kh_in, ready_kh_out, valid_sk, valid_w, valid_kh_in, valid_kh_out, last_word_sk, last_word_w, last_word_kh_in, last_word_kh_out : std_logic := '0'; - signal data_sk, data_w, data_kh_in, data_kh_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal ready_de, ready_sk, ready_w, ready_kh_in, ready_kh_out, valid_de, valid_sk, valid_w, valid_kh_in, valid_kh_out, last_word_de, last_word_sk, last_word_w, last_word_kh_in, last_word_kh_out : std_logic := '0'; + signal data_de, data_sk, data_w, data_kh_in, data_kh_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); signal start_w, ack_w, start_kh, ack_kh, decode_error, encode_done : std_logic := '0'; signal opcode_kh : KEY_HOLDER_OPCODE_TYPE := NOP; shared variable SB_out : osvvm.ScoreBoardPkg_slv.ScoreBoardPType; - shared variable serialized_key : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + shared variable serialized_key, invalid_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; signal key_hash, key_hash_latch : KEY_HASH_TYPE := KEY_HASH_NIL; + signal send_invalid_data : std_logic := '0'; signal id_in : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := (others => '0'); signal TestSequence_len_in, TestSequence_addr_in: std_logic_vector(TESTSEQUENCE_ADDR_WIDTH-1 downto 0) := (others => '0'); @@ -197,14 +199,23 @@ begin KH := GetAlertLogID("KeyHash", ALERTLOG_BASE_ID); Log("Initial Reset", INFO); - start_w <= '0'; - reset <= '1'; + send_invalid_data <= '0'; + start_w <= '0'; + reset <= '1'; wait until rising_edge(clk); wait until rising_edge(clk); reset <= '0'; + -- Create Invalid Serialized Payload + for i in 0 to MAX_TYPE2_SIZE loop + invalid_data.data(i) := RV.RandSlv(invalid_data.data(i)'length); + invalid_data.length := invalid_data.length + 1; + end loop; + invalid_data.last(invalid_data.length-1) := '1'; + + -- Serialized Key Payload Header - gen_CDR(SERIALIZED_KEY_HEADER, ALIGN_4, align_offset, serialized_key); + write_serialized_payload(SERIALIZED_KEY_HEADER, ALIGN_4, align_offset, serialized_key); -- Reset Alignment align_offset := (others => '0'); @@ -218,10 +229,10 @@ begin TestUnion_OctetU_in <= RV.RandSlv(TestUnion_OctetU_in'length); TestBitmask_in <= RV.RandSlv(TestBitmask_in'length); wait for 0 ns; - gen_CDR(id_in, ALIGN_4, align_offset, serialized_key); + write_serialized_payload(id_in, ALIGN_4, align_offset, serialized_key); TestSequence_len_in <= int(2,TestSequence_len_in'length); - gen_CDR(int(2,CDR_LONG_WIDTH), ALIGN_4, align_offset, serialized_key); + write_serialized_payload(int(2,CDR_LONG_WIDTH), ALIGN_4, align_offset, serialized_key); -- Memory for i in 0 to 1 loop TestSequence_addr_in <= int(i,TestSequence_addr_in'length); @@ -237,7 +248,7 @@ begin TestSequence_TestArray_wen_in <= '1'; wait until rising_edge(clk); TestSequence_TestArray_wen_in <= '0'; - gen_CDR(TestSequence_TestArray_w_in, ALIGN_1, align_offset, serialized_key); + write_serialized_payload(TestSequence_TestArray_w_in, ALIGN_1, align_offset, serialized_key); end loop; wait_on_sig(TestSequence_ready_in); TestSequence_wen_in <= '1'; @@ -273,9 +284,10 @@ begin push_sk; - Log("Push DATA", INFO); - opcode_kh <= PUSH_DATA; - start_w <= '1'; + Log("Push Invalid DATA", INFO); + send_invalid_data <= '1'; + opcode_kh <= PUSH_DATA; + start_w <= '1'; wait_on_sig(ack_w); wait until rising_edge(clk); start_w <= '0'; @@ -287,6 +299,26 @@ begin wait_on_sig(ready_kh_in); wait until rising_edge(clk); + Alertif(decode_error /= '1', "Decode error not asserted", ERROR); + send_invalid_data <= '0'; + + Log("Push DATA", INFO); + opcode_kh <= PUSH_DATA; + start_w <= '1'; + wait_on_sig(ack_w); + wait until rising_edge(clk); + start_w <= '0'; + start_kh <= '1'; + wait_on_sig(ack_kh); + wait until rising_edge(clk); + start_kh <= '0'; + wait for 1 ps; -- Wait until signals are stable + Alertif(decode_error /= '0', "Decode error still asserted", ERROR); + wait_on_sig(last_word_kh_in); + wait_on_sig(ready_kh_in); + wait until rising_edge(clk); + Alertif(decode_error = '1', "Decode error asserted", ERROR); + Log("Read and Compare Serialized Key", INFO); opcode_kh <= READ_SERIALIZED_KEY; start_kh <= '1'; @@ -316,6 +348,7 @@ begin wait_on_sig(last_word_sk); wait_on_sig(ready_sk); wait until rising_edge(clk); + Alertif(decode_error = '1', "Decode error asserted", ERROR); push_sk; Log("Read and Compare Serialized Key", INFO); @@ -357,28 +390,29 @@ begin wait for TEST_CLOCK_PERIOD/2; end process; - alert_prc : process(all) - begin - if rising_edge(clk) then - Alertif(decode_error = '1', "The Reader signals a DECODE Error", ERROR); - end if; - end process; - switch_prc : process(all) begin + ready_w <= '0'; + ready_de <= '0'; + ready_sk <= '0'; case (opcode_kh) is when PUSH_SERIALIZED_KEY => ready_sk <= ready_kh_in; valid_kh_in <= valid_sk; data_kh_in <= data_sk; last_word_kh_in <= last_word_sk; - ready_w <= '0'; when others => + if (send_invalid_data = '1') then + ready_de <= ready_kh_in; + valid_kh_in <= valid_de; + data_kh_in <= data_de; + last_word_kh_in <= last_word_de; + else ready_w <= ready_kh_in; valid_kh_in <= valid_w; data_kh_in <= data_w; last_word_kh_in <= last_word_w; - ready_sk <= '0'; + end if; end case; end process; @@ -402,6 +436,26 @@ begin end if; end process; + de_prc : process(all) + variable cnt : natural := 0; + begin + valid_de <= '1'; + data_de <= invalid_data.data(cnt); + if (cnt = invalid_data.length-1) then + last_word_de <= '1'; + end if; + + if rising_edge(clk) then + if (ready_de = '1') then + if (cnt = invalid_data.length-1) then + cnt := 0; + else + cnt := cnt + 1; + end if; + end if; + end if; + end process; + output_check_prc : process(all) variable cnt : natural range 0 to 3 := 0; begin diff --git a/src/Tests/Level_1/L1_Type2_key_holder_test2.vhd b/src/Tests/Level_1/L1_Type2_key_holder_test2.vhd index 1747002..ed6ae80 100644 --- a/src/Tests/Level_1/L1_Type2_key_holder_test2.vhd +++ b/src/Tests/Level_1/L1_Type2_key_holder_test2.vhd @@ -12,8 +12,9 @@ use work.rtps_test_package.all; use work.Type2_package.all; -- This testbench tests the KEY_HOLDER commands of TYPE2. --- It uses the writer_interface to send a valid payload, then reads the serialized key and the key hash. The returned serialized key is compared to a "handcrafted" reference, and the key hash is latched for later comparison. --- Then the reference serialized key is pushed (resetting the internally generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previously compared). +-- Firstly an invalid serialized payload is sent to test the decode error. +-- Secondly the writer_interface is used to send a valid payload, then reads the serialized key and the key hash. The returned serialized key is compared to a "handcrafted" reference, and the key hash is latched for later comparison. +-- Thirty the reference serialized key is pushed (resetting the internally generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previously compared). -- The payload is sent in Little Endian. entity L1_Type2_key_holder_test2 is @@ -22,13 +23,14 @@ end entity; architecture testbench of L1_Type2_key_holder_test2 is signal clk, reset : std_logic := '0'; - signal ready_sk, ready_w, ready_kh_in, ready_kh_out, valid_sk, valid_w, valid_kh_in, valid_kh_out, last_word_sk, last_word_w, last_word_kh_in, last_word_kh_out : std_logic := '0'; - signal data_sk, data_w, data_kh_in, data_kh_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal ready_de, ready_sk, ready_w, ready_kh_in, ready_kh_out, valid_de, valid_sk, valid_w, valid_kh_in, valid_kh_out, last_word_de, last_word_sk, last_word_w, last_word_kh_in, last_word_kh_out : std_logic := '0'; + signal data_de, data_sk, data_w, data_kh_in, data_kh_out : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); signal start_w, ack_w, start_kh, ack_kh, decode_error, encode_done : std_logic := '0'; signal opcode_kh : KEY_HOLDER_OPCODE_TYPE := NOP; shared variable SB_out : osvvm.ScoreBoardPkg_slv.ScoreBoardPType; - shared variable serialized_key : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + shared variable serialized_key, invalid_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; signal key_hash, key_hash_latch : KEY_HASH_TYPE := KEY_HASH_NIL; + signal send_invalid_data : std_logic := '0'; signal id_in : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := (others => '0'); signal TestSequence_len_in, TestSequence_addr_in: std_logic_vector(TESTSEQUENCE_ADDR_WIDTH-1 downto 0) := (others => '0'); @@ -203,14 +205,23 @@ begin KH := GetAlertLogID("KeyHash", ALERTLOG_BASE_ID); Log("Initial Reset", INFO); - start_w <= '0'; - reset <= '1'; + send_invalid_data <= '0'; + start_w <= '0'; + reset <= '1'; wait until rising_edge(clk); wait until rising_edge(clk); reset <= '0'; + -- Create Invalid Serialized Payload + for i in 0 to MAX_TYPE2_SIZE loop + invalid_data.data(i) := RV.RandSlv(invalid_data.data(i)'length); + invalid_data.length := invalid_data.length + 1; + end loop; + invalid_data.last(invalid_data.length-1) := '1'; + + -- Serialized Key Payload Header - gen_CDR(SERIALIZED_KEY_HEADER, ALIGN_4, align_offset, serialized_key); + write_serialized_payload(SERIALIZED_KEY_HEADER, ALIGN_4, align_offset, serialized_key); -- Reset Alignment align_offset := (others => '0'); @@ -224,10 +235,10 @@ begin TestUnion_OctetU_in <= RV.RandSlv(TestUnion_OctetU_in'length); TestBitmask_in <= RV.RandSlv(TestBitmask_in'length); wait for 0 ns; - gen_CDR(endian_swap('1',id_in), ALIGN_4, align_offset, serialized_key); + write_serialized_payload(endian_swap('1',id_in), ALIGN_4, align_offset, serialized_key); TestSequence_len_in <= int(2,TestSequence_len_in'length); - gen_CDR(endian_swap('1',int(2,CDR_LONG_WIDTH)), ALIGN_4, align_offset, serialized_key); + write_serialized_payload(endian_swap('1',int(2,CDR_LONG_WIDTH)), ALIGN_4, align_offset, serialized_key); -- Memory for i in 0 to 1 loop TestSequence_addr_in <= int(i,TestSequence_addr_in'length); @@ -243,7 +254,7 @@ begin TestSequence_TestArray_wen_in <= '1'; wait until rising_edge(clk); TestSequence_TestArray_wen_in <= '0'; - gen_CDR(endian_swap('1',TestSequence_TestArray_w_in), ALIGN_1, align_offset, serialized_key); + write_serialized_payload(endian_swap('1',TestSequence_TestArray_w_in), ALIGN_1, align_offset, serialized_key); end loop; wait_on_sig(TestSequence_ready_in); TestSequence_wen_in <= '1'; @@ -279,9 +290,10 @@ begin push_sk; - Log("Push DATA", INFO); - opcode_kh <= PUSH_DATA; - start_w <= '1'; + Log("Push Invalid DATA", INFO); + send_invalid_data <= '1'; + opcode_kh <= PUSH_DATA; + start_w <= '1'; wait_on_sig(ack_w); wait until rising_edge(clk); start_w <= '0'; @@ -293,6 +305,26 @@ begin wait_on_sig(ready_kh_in); wait until rising_edge(clk); + Alertif(decode_error /= '1', "Decode error not asserted", ERROR); + send_invalid_data <= '0'; + + Log("Push DATA", INFO); + opcode_kh <= PUSH_DATA; + start_w <= '1'; + wait_on_sig(ack_w); + wait until rising_edge(clk); + start_w <= '0'; + start_kh <= '1'; + wait_on_sig(ack_kh); + wait until rising_edge(clk); + start_kh <= '0'; + wait for 1 ps; -- Wait until signals are stable + Alertif(decode_error /= '0', "Decode error still asserted", ERROR); + wait_on_sig(last_word_kh_in); + wait_on_sig(ready_kh_in); + wait until rising_edge(clk); + Alertif(decode_error = '1', "Decode error asserted", ERROR); + Log("Read and Compare Serialized Key", INFO); opcode_kh <= READ_SERIALIZED_KEY; start_kh <= '1'; @@ -322,6 +354,7 @@ begin wait_on_sig(last_word_sk); wait_on_sig(ready_sk); wait until rising_edge(clk); + Alertif(decode_error = '1', "Decode error asserted", ERROR); push_sk; Log("Read and Compare Serialized Key", INFO); @@ -363,28 +396,29 @@ begin wait for TEST_CLOCK_PERIOD/2; end process; - alert_prc : process(all) - begin - if rising_edge(clk) then - Alertif(decode_error = '1', "The Reader signals a DECODE Error", ERROR); - end if; - end process; - switch_prc : process(all) begin + ready_w <= '0'; + ready_de <= '0'; + ready_sk <= '0'; case (opcode_kh) is when PUSH_SERIALIZED_KEY => ready_sk <= ready_kh_in; valid_kh_in <= valid_sk; data_kh_in <= data_sk; last_word_kh_in <= last_word_sk; - ready_w <= '0'; when others => + if (send_invalid_data = '1') then + ready_de <= ready_kh_in; + valid_kh_in <= valid_de; + data_kh_in <= data_de; + last_word_kh_in <= last_word_de; + else ready_w <= ready_kh_in; valid_kh_in <= valid_w; data_kh_in <= data_w; last_word_kh_in <= last_word_w; - ready_sk <= '0'; + end if; end case; end process; @@ -408,6 +442,26 @@ begin end if; end process; + de_prc : process(all) + variable cnt : natural := 0; + begin + valid_de <= '1'; + data_de <= invalid_data.data(cnt); + if (cnt = invalid_data.length-1) then + last_word_de <= '1'; + end if; + + if rising_edge(clk) then + if (ready_de = '1') then + if (cnt = invalid_data.length-1) then + cnt := 0; + else + cnt := cnt + 1; + end if; + end if; + end if; + end process; + output_check_prc : process(all) variable cnt : natural range 0 to 3 := 0; begin diff --git a/src/Tests/Type1_key_holder.vhd b/src/Tests/Type1_key_holder.vhd index 3fe197f..99c8224 100644 --- a/src/Tests/Type1_key_holder.vhd +++ b/src/Tests/Type1_key_holder.vhd @@ -146,12 +146,14 @@ begin ack <= '1'; stage_next <= GET_PAYLOAD_HEADER; -- Reset - key_hash_next <= KEY_HASH_NIL; + key_hash_next <= KEY_HASH_NIL; + decode_error_latch_next <= '0'; when PUSH_SERIALIZED_KEY => ack <= '1'; stage_next <= GET_PAYLOAD_HEADER; -- Reset - key_hash_next <= KEY_HASH_NIL; + key_hash_next <= KEY_HASH_NIL; + decode_error_latch_next <= '0'; when READ_KEY_HASH => ack <= '1'; -- Key Hash not calculated diff --git a/src/Tests/Type2_key_holder.vhd b/src/Tests/Type2_key_holder.vhd index e779c47..6505aef 100644 --- a/src/Tests/Type2_key_holder.vhd +++ b/src/Tests/Type2_key_holder.vhd @@ -188,12 +188,14 @@ begin ack <= '1'; stage_next <= GET_PAYLOAD_HEADER; -- Reset - key_hash_next <= KEY_HASH_NIL; + key_hash_next <= KEY_HASH_NIL; + decode_error_latch_next <= '0'; when PUSH_SERIALIZED_KEY => ack <= '1'; stage_next <= GET_PAYLOAD_HEADER; -- Reset - key_hash_next <= KEY_HASH_NIL; + key_hash_next <= KEY_HASH_NIL; + decode_error_latch_next <= '0'; when READ_KEY_HASH => ack <= '1'; -- Key Hash not calculated