From 0f7750bd5a885df29e85def752f9d2e5929abf3e Mon Sep 17 00:00:00 2001 From: Greek Date: Sun, 21 Feb 2021 15:20:27 +0100 Subject: [PATCH] Expanded test 1 and test 2 of RTPS Reader with different Generics Tests are added for different Generics Settings (Durability, Reliability, Keyed Topic). Test 2 of RTPS Reader (User Tarffic Handling) is extended with a few extra test cases. --- sim/L0_rtps_reader_test1.do | 64 - sim/L0_rtps_reader_test1_vrk.do | 64 + sim/L0_rtps_reader_test2.do | 82 - sim/L0_rtps_reader_test2_trk.do | 82 + sim/L0_rtps_reader_test2_vbk.do | 82 + sim/L0_rtps_reader_test2_vrk.do | 82 + sim/L0_rtps_reader_test2_vrn.do | 82 + sim/test_all.do | 4 + src/TODO.txt | 2 +- .../Level_0/L0_rtps_reader_test1_vbk.vhd | 483 ++++++ ...test1.vhd => L0_rtps_reader_test1_vrk.vhd} | 6 +- .../Level_0/L0_rtps_reader_test2_tbk.vhd | 1308 ++++++++++++++++ .../Level_0/L0_rtps_reader_test2_trk.vhd | 1317 +++++++++++++++++ .../Level_0/L0_rtps_reader_test2_vbk.vhd | 1289 ++++++++++++++++ ...test2.vhd => L0_rtps_reader_test2_vrk.vhd} | 85 +- .../Level_0/L0_rtps_reader_test2_vrn.vhd | 1312 ++++++++++++++++ src/rtps_reader.vhd | 3 +- 17 files changed, 6185 insertions(+), 162 deletions(-) delete mode 100644 sim/L0_rtps_reader_test1.do create mode 100644 sim/L0_rtps_reader_test1_vrk.do delete mode 100644 sim/L0_rtps_reader_test2.do create mode 100644 sim/L0_rtps_reader_test2_trk.do create mode 100644 sim/L0_rtps_reader_test2_vbk.do create mode 100644 sim/L0_rtps_reader_test2_vrk.do create mode 100644 sim/L0_rtps_reader_test2_vrn.do create mode 100644 sim/test_all.do create mode 100644 src/Tests/Level_0/L0_rtps_reader_test1_vbk.vhd rename src/Tests/Level_0/{L0_rtps_reader_test1.vhd => L0_rtps_reader_test1_vrk.vhd} (98%) create mode 100644 src/Tests/Level_0/L0_rtps_reader_test2_tbk.vhd create mode 100644 src/Tests/Level_0/L0_rtps_reader_test2_trk.vhd create mode 100644 src/Tests/Level_0/L0_rtps_reader_test2_vbk.vhd rename src/Tests/Level_0/{L0_rtps_reader_test2.vhd => L0_rtps_reader_test2_vrk.vhd} (94%) create mode 100644 src/Tests/Level_0/L0_rtps_reader_test2_vrn.vhd diff --git a/sim/L0_rtps_reader_test1.do b/sim/L0_rtps_reader_test1.do deleted file mode 100644 index 0485be7..0000000 --- a/sim/L0_rtps_reader_test1.do +++ /dev/null @@ -1,64 +0,0 @@ -onerror {resume} -quietly WaveActivateNextPane {} 0 -add wave -noupdate -divider SYSTEM -add wave -noupdate /l0_rtps_reader_test1/uut/clk -add wave -noupdate /l0_rtps_reader_test1/uut/reset -add wave -noupdate -divider INPUT -add wave -noupdate /l0_rtps_reader_test1/uut/empty_meta -add wave -noupdate /l0_rtps_reader_test1/uut/rd_meta -add wave -noupdate /l0_rtps_reader_test1/uut/last_word_in_meta -add wave -noupdate -radix hexadecimal /l0_rtps_reader_test1/uut/data_in_meta -add wave -noupdate -divider OUTPUT -add wave -noupdate /l0_rtps_reader_test1/uut/start_hc -add wave -noupdate /l0_rtps_reader_test1/uut/opcode_hc -add wave -noupdate /l0_rtps_reader_test1/uut/ack_hc -add wave -noupdate /l0_rtps_reader_test1/uut/done_hc -add wave -noupdate -radix hexadecimal /l0_rtps_reader_test1/uut/data_out_hc -add wave -noupdate -divider {MAIN FSM} -add wave -noupdate /l0_rtps_reader_test1/uut/stage -add wave -noupdate /l0_rtps_reader_test1/uut/stage_next -add wave -noupdate /l0_rtps_reader_test1/uut/cnt -add wave -noupdate -divider {MEMORY FSM} -add wave -noupdate /l0_rtps_reader_test1/uut/mem_op_done -add wave -noupdate /l0_rtps_reader_test1/uut/mem_op_start -add wave -noupdate /l0_rtps_reader_test1/uut/mem_opcode -add wave -noupdate /l0_rtps_reader_test1/uut/mem_stage -add wave -noupdate /l0_rtps_reader_test1/uut/mem_stage_next -add wave -noupdate /l0_rtps_reader_test1/uut/mem_cnt -add wave -noupdate /l0_rtps_reader_test1/uut/mem_pos -add wave -noupdate -radix unsigned /l0_rtps_reader_test1/uut/mem_addr_base -add wave -noupdate -expand -group MEM_CTRL -radix unsigned /l0_rtps_reader_test1/uut/mem_addr -add wave -noupdate -expand -group MEM_CTRL /l0_rtps_reader_test1/uut/mem_valid_in -add wave -noupdate -expand -group MEM_CTRL /l0_rtps_reader_test1/uut/mem_ready_in -add wave -noupdate -expand -group MEM_CTRL /l0_rtps_reader_test1/uut/mem_read -add wave -noupdate -expand -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test1/uut/mem_write_data -add wave -noupdate -expand -group MEM_CTRL /l0_rtps_reader_test1/uut/abort_read -add wave -noupdate -expand -group MEM_CTRL /l0_rtps_reader_test1/uut/mem_valid_out -add wave -noupdate -expand -group MEM_CTRL /l0_rtps_reader_test1/uut/mem_ready_out -add wave -noupdate -expand -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test1/uut/mem_read_data -add wave -noupdate -divider TESTBENCH -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1/start -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1/cnt_stim -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1/packet_sent -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1/mem_check_done -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1/stim_done -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1/test_done -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1/uut/idle_sig -TreeUpdate [SetDefaultTree] -WaveRestoreCursors {Begin {8325000 ps} 1} {Error {9725000 ps} 1} {Cursor {9175000 ps} 0} -quietly wave cursor active 3 -configure wave -namecolwidth 150 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 1 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -configure wave -timelineunits ns -update -WaveRestoreZoom {8888200 ps} {9912200 ps} diff --git a/sim/L0_rtps_reader_test1_vrk.do b/sim/L0_rtps_reader_test1_vrk.do new file mode 100644 index 0000000..091978b --- /dev/null +++ b/sim/L0_rtps_reader_test1_vrk.do @@ -0,0 +1,64 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider SYSTEM +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/clk +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/reset +add wave -noupdate -divider INPUT +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/empty_meta +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/rd_meta +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/last_word_in_meta +add wave -noupdate -radix hexadecimal /l0_rtps_reader_test1_vrk/uut/data_in_meta +add wave -noupdate -divider OUTPUT +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/start_hc +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/opcode_hc +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/ack_hc +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/done_hc +add wave -noupdate -radix hexadecimal /l0_rtps_reader_test1_vrk/uut/data_out_hc +add wave -noupdate -divider {MAIN FSM} +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/stage +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/stage_next +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/cnt +add wave -noupdate -divider {MEMORY FSM} +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/mem_op_done +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/mem_op_start +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/mem_opcode +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/mem_stage +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/mem_stage_next +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/mem_cnt +add wave -noupdate /l0_rtps_reader_test1_vrk/uut/mem_pos +add wave -noupdate -radix unsigned /l0_rtps_reader_test1_vrk/uut/mem_addr_base +add wave -noupdate -expand -group MEM_CTRL -radix unsigned /l0_rtps_reader_test1_vrk/uut/mem_addr +add wave -noupdate -expand -group MEM_CTRL /l0_rtps_reader_test1_vrk/uut/mem_valid_in +add wave -noupdate -expand -group MEM_CTRL /l0_rtps_reader_test1_vrk/uut/mem_ready_in +add wave -noupdate -expand -group MEM_CTRL /l0_rtps_reader_test1_vrk/uut/mem_read +add wave -noupdate -expand -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test1_vrk/uut/mem_write_data +add wave -noupdate -expand -group MEM_CTRL /l0_rtps_reader_test1_vrk/uut/abort_read +add wave -noupdate -expand -group MEM_CTRL /l0_rtps_reader_test1_vrk/uut/mem_valid_out +add wave -noupdate -expand -group MEM_CTRL /l0_rtps_reader_test1_vrk/uut/mem_ready_out +add wave -noupdate -expand -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test1_vrk/uut/mem_read_data +add wave -noupdate -divider TESTBENCH +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1_vrk/start +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1_vrk/cnt_stim +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1_vrk/packet_sent +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1_vrk/mem_check_done +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1_vrk/stim_done +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1_vrk/test_done +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test1_vrk/uut/idle_sig +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {Begin {8325000 ps} 1} {Error {9725000 ps} 1} {Cursor {9175000 ps} 0} +quietly wave cursor active 3 +configure wave -namecolwidth 150 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ns +update +WaveRestoreZoom {8888200 ps} {9912200 ps} diff --git a/sim/L0_rtps_reader_test2.do b/sim/L0_rtps_reader_test2.do deleted file mode 100644 index 3011fc9..0000000 --- a/sim/L0_rtps_reader_test2.do +++ /dev/null @@ -1,82 +0,0 @@ -onerror {resume} -quietly WaveActivateNextPane {} 0 -add wave -noupdate -divider SYSTEM -add wave -noupdate /l0_rtps_reader_test2/uut/clk -add wave -noupdate /l0_rtps_reader_test2/uut/reset -add wave -noupdate -divider INPUT -add wave -noupdate -group META /l0_rtps_reader_test2/uut/empty_meta -add wave -noupdate -group META /l0_rtps_reader_test2/uut/rd_meta -add wave -noupdate -group META /l0_rtps_reader_test2/uut/last_word_in_meta -add wave -noupdate -group META -radix hexadecimal /l0_rtps_reader_test2/uut/data_in_meta -add wave -noupdate -expand -group USER /l0_rtps_reader_test2/uut/empty_user -add wave -noupdate -expand -group USER /l0_rtps_reader_test2/uut/rd_user -add wave -noupdate -expand -group USER -radix hexadecimal /l0_rtps_reader_test2/uut/data_in_user -add wave -noupdate -expand -group USER /l0_rtps_reader_test2/uut/last_word_in_user -add wave -noupdate -divider HC -add wave -noupdate /l0_rtps_reader_test2/uut/start_hc -add wave -noupdate /l0_rtps_reader_test2/uut/opcode_hc -add wave -noupdate /l0_rtps_reader_test2/uut/ack_hc -add wave -noupdate /l0_rtps_reader_test2/uut/valid_out_hc -add wave -noupdate /l0_rtps_reader_test2/uut/ready_out_hc -add wave -noupdate -radix hexadecimal /l0_rtps_reader_test2/uut/data_out_hc -add wave -noupdate /l0_rtps_reader_test2/uut/last_word_out_hc -add wave -noupdate /l0_rtps_reader_test2/uut/done_hc -add wave -noupdate /l0_rtps_reader_test2/uut/ret_hc -add wave -noupdate -divider {MAIN FSM} -add wave -noupdate /l0_rtps_reader_test2/uut/stage -add wave -noupdate /l0_rtps_reader_test2/uut/stage_next -add wave -noupdate /l0_rtps_reader_test2/uut/cnt -add wave -noupdate -divider {MEMORY FSM} -add wave -noupdate /l0_rtps_reader_test2/uut/mem_op_done -add wave -noupdate /l0_rtps_reader_test2/uut/mem_op_start -add wave -noupdate /l0_rtps_reader_test2/uut/mem_opcode -add wave -noupdate /l0_rtps_reader_test2/uut/mem_stage -add wave -noupdate /l0_rtps_reader_test2/uut/mem_stage_next -add wave -noupdate /l0_rtps_reader_test2/uut/mem_cnt -add wave -noupdate /l0_rtps_reader_test2/uut/mem_pos -add wave -noupdate -radix unsigned /l0_rtps_reader_test2/uut/mem_addr_base -add wave -noupdate -childformat {{/l0_rtps_reader_test2/uut/mem_endpoint_data.guid -radix hexadecimal} {/l0_rtps_reader_test2/uut/mem_endpoint_data.addr -radix hexadecimal} {/l0_rtps_reader_test2/uut/mem_endpoint_data.portn -radix hexadecimal} {/l0_rtps_reader_test2/uut/mem_endpoint_data.next_seq_nr -radix unsigned -childformat {{/l0_rtps_reader_test2/uut/mem_endpoint_data.next_seq_nr(0) -radix unsigned} {/l0_rtps_reader_test2/uut/mem_endpoint_data.next_seq_nr(1) -radix unsigned}}} {/l0_rtps_reader_test2/uut/mem_endpoint_data.lease_deadline -radix hexadecimal} {/l0_rtps_reader_test2/uut/mem_endpoint_data.res_time -radix hexadecimal}} -subitemconfig {/l0_rtps_reader_test2/uut/mem_endpoint_data.guid {-height 15 -radix hexadecimal} /l0_rtps_reader_test2/uut/mem_endpoint_data.addr {-height 15 -radix hexadecimal} /l0_rtps_reader_test2/uut/mem_endpoint_data.portn {-height 15 -radix hexadecimal} /l0_rtps_reader_test2/uut/mem_endpoint_data.next_seq_nr {-height 15 -radix unsigned -childformat {{/l0_rtps_reader_test2/uut/mem_endpoint_data.next_seq_nr(0) -radix unsigned} {/l0_rtps_reader_test2/uut/mem_endpoint_data.next_seq_nr(1) -radix unsigned}}} /l0_rtps_reader_test2/uut/mem_endpoint_data.next_seq_nr(0) {-height 15 -radix unsigned} /l0_rtps_reader_test2/uut/mem_endpoint_data.next_seq_nr(1) {-height 15 -radix unsigned} /l0_rtps_reader_test2/uut/mem_endpoint_data.lease_deadline {-height 15 -radix hexadecimal} /l0_rtps_reader_test2/uut/mem_endpoint_data.res_time {-height 15 -radix hexadecimal}} /l0_rtps_reader_test2/uut/mem_endpoint_data -add wave -noupdate -group MEM_CTRL -radix unsigned /l0_rtps_reader_test2/uut/mem_addr -add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2/uut/mem_valid_in -add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2/uut/mem_ready_in -add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2/uut/mem_read -add wave -noupdate -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test2/uut/mem_write_data -add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2/uut/abort_read -add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2/uut/mem_valid_out -add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2/uut/mem_ready_out -add wave -noupdate -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test2/uut/mem_read_data -add wave -noupdate -divider TESTBENCH -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2/start_meta -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2/packet_sent_meta -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2/start_user -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2/packet_sent_user -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2/check_stage -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2/out_check_done -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2/stim_done -add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2/test_done -add wave -noupdate -divider GAP -add wave -noupdate -radix unsigned /l0_rtps_reader_test2/uut/gap_start -add wave -noupdate -radix unsigned /l0_rtps_reader_test2/uut/gap_list_base -add wave -noupdate -radix unsigned /l0_rtps_reader_test2/uut/gap_list_end -add wave -noupdate /l0_rtps_reader_test2/uut/bitmap_latch -add wave -noupdate /l0_rtps_reader_test2/uut/bitmap_pos -add wave -noupdate -radix unsigned /l0_rtps_reader_test2/uut/next_seq_nr -add wave -noupdate -radix unsigned /l0_rtps_reader_test2/uut/bitmap_cnt -TreeUpdate [SetDefaultTree] -WaveRestoreCursors {Begin {49575000 ps} 1} {Error {53225000 ps} 1} {Cursor {50275000 ps} 0} -quietly wave cursor active 3 -configure wave -namecolwidth 150 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 1 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -configure wave -timelineunits ns -update -WaveRestoreZoom {49779800 ps} {50803800 ps} diff --git a/sim/L0_rtps_reader_test2_trk.do b/sim/L0_rtps_reader_test2_trk.do new file mode 100644 index 0000000..73fafc8 --- /dev/null +++ b/sim/L0_rtps_reader_test2_trk.do @@ -0,0 +1,82 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider SYSTEM +add wave -noupdate /l0_rtps_reader_test2_trk/uut/clk +add wave -noupdate /l0_rtps_reader_test2_trk/uut/reset +add wave -noupdate -divider INPUT +add wave -noupdate -group META /l0_rtps_reader_test2_trk/uut/empty_meta +add wave -noupdate -group META /l0_rtps_reader_test2_trk/uut/rd_meta +add wave -noupdate -group META /l0_rtps_reader_test2_trk/uut/last_word_in_meta +add wave -noupdate -group META -radix hexadecimal /l0_rtps_reader_test2_trk/uut/data_in_meta +add wave -noupdate -expand -group USER /l0_rtps_reader_test2_trk/uut/empty_user +add wave -noupdate -expand -group USER /l0_rtps_reader_test2_trk/uut/rd_user +add wave -noupdate -expand -group USER -radix hexadecimal /l0_rtps_reader_test2_trk/uut/data_in_user +add wave -noupdate -expand -group USER /l0_rtps_reader_test2_trk/uut/last_word_in_user +add wave -noupdate -divider HC +add wave -noupdate /l0_rtps_reader_test2_trk/uut/start_hc +add wave -noupdate /l0_rtps_reader_test2_trk/uut/opcode_hc +add wave -noupdate /l0_rtps_reader_test2_trk/uut/ack_hc +add wave -noupdate /l0_rtps_reader_test2_trk/uut/valid_out_hc +add wave -noupdate /l0_rtps_reader_test2_trk/uut/ready_out_hc +add wave -noupdate -radix hexadecimal /l0_rtps_reader_test2_trk/uut/data_out_hc +add wave -noupdate /l0_rtps_reader_test2_trk/uut/last_word_out_hc +add wave -noupdate /l0_rtps_reader_test2_trk/uut/done_hc +add wave -noupdate /l0_rtps_reader_test2_trk/uut/ret_hc +add wave -noupdate -divider {MAIN FSM} +add wave -noupdate /l0_rtps_reader_test2_trk/uut/stage +add wave -noupdate /l0_rtps_reader_test2_trk/uut/stage_next +add wave -noupdate /l0_rtps_reader_test2_trk/uut/cnt +add wave -noupdate -divider {MEMORY FSM} +add wave -noupdate /l0_rtps_reader_test2_trk/uut/mem_op_done +add wave -noupdate /l0_rtps_reader_test2_trk/uut/mem_op_start +add wave -noupdate /l0_rtps_reader_test2_trk/uut/mem_opcode +add wave -noupdate /l0_rtps_reader_test2_trk/uut/mem_stage +add wave -noupdate /l0_rtps_reader_test2_trk/uut/mem_stage_next +add wave -noupdate /l0_rtps_reader_test2_trk/uut/mem_cnt +add wave -noupdate /l0_rtps_reader_test2_trk/uut/mem_pos +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_trk/uut/mem_addr_base +add wave -noupdate -childformat {{/l0_rtps_reader_test2_trk/uut/mem_endpoint_data.guid -radix hexadecimal} {/l0_rtps_reader_test2_trk/uut/mem_endpoint_data.addr -radix hexadecimal} {/l0_rtps_reader_test2_trk/uut/mem_endpoint_data.portn -radix hexadecimal} {/l0_rtps_reader_test2_trk/uut/mem_endpoint_data.next_seq_nr -radix unsigned -childformat {{/l0_rtps_reader_test2_trk/uut/mem_endpoint_data.next_seq_nr(0) -radix unsigned} {/l0_rtps_reader_test2_trk/uut/mem_endpoint_data.next_seq_nr(1) -radix unsigned}}} {/l0_rtps_reader_test2_trk/uut/mem_endpoint_data.lease_deadline -radix hexadecimal} {/l0_rtps_reader_test2_trk/uut/mem_endpoint_data.res_time -radix hexadecimal}} -subitemconfig {/l0_rtps_reader_test2_trk/uut/mem_endpoint_data.guid {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_trk/uut/mem_endpoint_data.addr {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_trk/uut/mem_endpoint_data.portn {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_trk/uut/mem_endpoint_data.next_seq_nr {-height 15 -radix unsigned -childformat {{/l0_rtps_reader_test2_trk/uut/mem_endpoint_data.next_seq_nr(0) -radix unsigned} {/l0_rtps_reader_test2_trk/uut/mem_endpoint_data.next_seq_nr(1) -radix unsigned}}} /l0_rtps_reader_test2_trk/uut/mem_endpoint_data.next_seq_nr(0) {-height 15 -radix unsigned} /l0_rtps_reader_test2_trk/uut/mem_endpoint_data.next_seq_nr(1) {-height 15 -radix unsigned} /l0_rtps_reader_test2_trk/uut/mem_endpoint_data.lease_deadline {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_trk/uut/mem_endpoint_data.res_time {-height 15 -radix hexadecimal}} /l0_rtps_reader_test2_trk/uut/mem_endpoint_data +add wave -noupdate -group MEM_CTRL -radix unsigned /l0_rtps_reader_test2_trk/uut/mem_addr +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_trk/uut/mem_valid_in +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_trk/uut/mem_ready_in +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_trk/uut/mem_read +add wave -noupdate -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test2_trk/uut/mem_write_data +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_trk/uut/abort_read +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_trk/uut/mem_valid_out +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_trk/uut/mem_ready_out +add wave -noupdate -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test2_trk/uut/mem_read_data +add wave -noupdate -divider TESTBENCH +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_trk/start_meta +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_trk/packet_sent_meta +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_trk/start_user +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_trk/packet_sent_user +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_trk/check_stage +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_trk/out_check_done +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_trk/stim_done +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_trk/test_done +add wave -noupdate -divider GAP +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_trk/uut/gap_start +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_trk/uut/gap_list_base +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_trk/uut/gap_list_end +add wave -noupdate /l0_rtps_reader_test2_trk/uut/bitmap_latch +add wave -noupdate /l0_rtps_reader_test2_trk/uut/bitmap_pos +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_trk/uut/next_seq_nr +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_trk/uut/bitmap_cnt +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {Begin {49575000 ps} 1} {Error {53225000 ps} 1} {Cursor {50275000 ps} 0} +quietly wave cursor active 3 +configure wave -namecolwidth 150 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ns +update +WaveRestoreZoom {49779800 ps} {50803800 ps} diff --git a/sim/L0_rtps_reader_test2_vbk.do b/sim/L0_rtps_reader_test2_vbk.do new file mode 100644 index 0000000..9887ea0 --- /dev/null +++ b/sim/L0_rtps_reader_test2_vbk.do @@ -0,0 +1,82 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider SYSTEM +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/clk +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/reset +add wave -noupdate -divider INPUT +add wave -noupdate -group META /l0_rtps_reader_test2_vbk/uut/empty_meta +add wave -noupdate -group META /l0_rtps_reader_test2_vbk/uut/rd_meta +add wave -noupdate -group META /l0_rtps_reader_test2_vbk/uut/last_word_in_meta +add wave -noupdate -group META -radix hexadecimal /l0_rtps_reader_test2_vbk/uut/data_in_meta +add wave -noupdate -expand -group USER /l0_rtps_reader_test2_vbk/uut/empty_user +add wave -noupdate -expand -group USER /l0_rtps_reader_test2_vbk/uut/rd_user +add wave -noupdate -expand -group USER -radix hexadecimal /l0_rtps_reader_test2_vbk/uut/data_in_user +add wave -noupdate -expand -group USER /l0_rtps_reader_test2_vbk/uut/last_word_in_user +add wave -noupdate -divider HC +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/start_hc +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/opcode_hc +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/ack_hc +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/valid_out_hc +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/ready_out_hc +add wave -noupdate -radix hexadecimal /l0_rtps_reader_test2_vbk/uut/data_out_hc +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/last_word_out_hc +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/done_hc +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/ret_hc +add wave -noupdate -divider {MAIN FSM} +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/stage +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/stage_next +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/cnt +add wave -noupdate -divider {MEMORY FSM} +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/mem_op_done +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/mem_op_start +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/mem_opcode +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/mem_stage +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/mem_stage_next +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/mem_cnt +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/mem_pos +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vbk/uut/mem_addr_base +add wave -noupdate -childformat {{/l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.guid -radix hexadecimal} {/l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.addr -radix hexadecimal} {/l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.portn -radix hexadecimal} {/l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.next_seq_nr -radix unsigned -childformat {{/l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.next_seq_nr(0) -radix unsigned} {/l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.next_seq_nr(1) -radix unsigned}}} {/l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.lease_deadline -radix hexadecimal} {/l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.res_time -radix hexadecimal}} -subitemconfig {/l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.guid {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.addr {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.portn {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.next_seq_nr {-height 15 -radix unsigned -childformat {{/l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.next_seq_nr(0) -radix unsigned} {/l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.next_seq_nr(1) -radix unsigned}}} /l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.next_seq_nr(0) {-height 15 -radix unsigned} /l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.next_seq_nr(1) {-height 15 -radix unsigned} /l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.lease_deadline {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_vbk/uut/mem_endpoint_data.res_time {-height 15 -radix hexadecimal}} /l0_rtps_reader_test2_vbk/uut/mem_endpoint_data +add wave -noupdate -group MEM_CTRL -radix unsigned /l0_rtps_reader_test2_vbk/uut/mem_addr +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vbk/uut/mem_valid_in +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vbk/uut/mem_ready_in +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vbk/uut/mem_read +add wave -noupdate -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test2_vbk/uut/mem_write_data +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vbk/uut/abort_read +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vbk/uut/mem_valid_out +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vbk/uut/mem_ready_out +add wave -noupdate -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test2_vbk/uut/mem_read_data +add wave -noupdate -divider TESTBENCH +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vbk/start_meta +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vbk/packet_sent_meta +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vbk/start_user +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vbk/packet_sent_user +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vbk/check_stage +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vbk/out_check_done +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vbk/stim_done +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vbk/test_done +add wave -noupdate -divider GAP +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vbk/uut/gap_start +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vbk/uut/gap_list_base +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vbk/uut/gap_list_end +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/bitmap_latch +add wave -noupdate /l0_rtps_reader_test2_vbk/uut/bitmap_pos +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vbk/uut/next_seq_nr +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vbk/uut/bitmap_cnt +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {Begin {49575000 ps} 1} {Error {53225000 ps} 1} {Cursor {50275000 ps} 0} +quietly wave cursor active 3 +configure wave -namecolwidth 150 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ns +update +WaveRestoreZoom {49779800 ps} {50803800 ps} diff --git a/sim/L0_rtps_reader_test2_vrk.do b/sim/L0_rtps_reader_test2_vrk.do new file mode 100644 index 0000000..a2eeb1f --- /dev/null +++ b/sim/L0_rtps_reader_test2_vrk.do @@ -0,0 +1,82 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider SYSTEM +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/clk +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/reset +add wave -noupdate -divider INPUT +add wave -noupdate -group META /l0_rtps_reader_test2_vrk/uut/empty_meta +add wave -noupdate -group META /l0_rtps_reader_test2_vrk/uut/rd_meta +add wave -noupdate -group META /l0_rtps_reader_test2_vrk/uut/last_word_in_meta +add wave -noupdate -group META -radix hexadecimal /l0_rtps_reader_test2_vrk/uut/data_in_meta +add wave -noupdate -expand -group USER /l0_rtps_reader_test2_vrk/uut/empty_user +add wave -noupdate -expand -group USER /l0_rtps_reader_test2_vrk/uut/rd_user +add wave -noupdate -expand -group USER -radix hexadecimal /l0_rtps_reader_test2_vrk/uut/data_in_user +add wave -noupdate -expand -group USER /l0_rtps_reader_test2_vrk/uut/last_word_in_user +add wave -noupdate -divider HC +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/start_hc +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/opcode_hc +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/ack_hc +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/valid_out_hc +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/ready_out_hc +add wave -noupdate -radix hexadecimal /l0_rtps_reader_test2_vrk/uut/data_out_hc +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/last_word_out_hc +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/done_hc +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/ret_hc +add wave -noupdate -divider {MAIN FSM} +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/stage +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/stage_next +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/cnt +add wave -noupdate -divider {MEMORY FSM} +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/mem_op_done +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/mem_op_start +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/mem_opcode +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/mem_stage +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/mem_stage_next +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/mem_cnt +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/mem_pos +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vrk/uut/mem_addr_base +add wave -noupdate -childformat {{/l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.guid -radix hexadecimal} {/l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.addr -radix hexadecimal} {/l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.portn -radix hexadecimal} {/l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.next_seq_nr -radix unsigned -childformat {{/l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.next_seq_nr(0) -radix unsigned} {/l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.next_seq_nr(1) -radix unsigned}}} {/l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.lease_deadline -radix hexadecimal} {/l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.res_time -radix hexadecimal}} -subitemconfig {/l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.guid {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.addr {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.portn {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.next_seq_nr {-height 15 -radix unsigned -childformat {{/l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.next_seq_nr(0) -radix unsigned} {/l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.next_seq_nr(1) -radix unsigned}}} /l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.next_seq_nr(0) {-height 15 -radix unsigned} /l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.next_seq_nr(1) {-height 15 -radix unsigned} /l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.lease_deadline {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_vrk/uut/mem_endpoint_data.res_time {-height 15 -radix hexadecimal}} /l0_rtps_reader_test2_vrk/uut/mem_endpoint_data +add wave -noupdate -group MEM_CTRL -radix unsigned /l0_rtps_reader_test2_vrk/uut/mem_addr +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vrk/uut/mem_valid_in +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vrk/uut/mem_ready_in +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vrk/uut/mem_read +add wave -noupdate -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test2_vrk/uut/mem_write_data +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vrk/uut/abort_read +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vrk/uut/mem_valid_out +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vrk/uut/mem_ready_out +add wave -noupdate -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test2_vrk/uut/mem_read_data +add wave -noupdate -divider TESTBENCH +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrk/start_meta +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrk/packet_sent_meta +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrk/start_user +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrk/packet_sent_user +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrk/check_stage +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrk/out_check_done +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrk/stim_done +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrk/test_done +add wave -noupdate -divider GAP +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vrk/uut/gap_start +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vrk/uut/gap_list_base +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vrk/uut/gap_list_end +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/bitmap_latch +add wave -noupdate /l0_rtps_reader_test2_vrk/uut/bitmap_pos +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vrk/uut/next_seq_nr +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vrk/uut/bitmap_cnt +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {Begin {49575000 ps} 1} {Error {53225000 ps} 1} {Cursor {50275000 ps} 0} +quietly wave cursor active 3 +configure wave -namecolwidth 150 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ns +update +WaveRestoreZoom {49779800 ps} {50803800 ps} diff --git a/sim/L0_rtps_reader_test2_vrn.do b/sim/L0_rtps_reader_test2_vrn.do new file mode 100644 index 0000000..58090ab --- /dev/null +++ b/sim/L0_rtps_reader_test2_vrn.do @@ -0,0 +1,82 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider SYSTEM +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/clk +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/reset +add wave -noupdate -divider INPUT +add wave -noupdate -group META /l0_rtps_reader_test2_vrn/uut/empty_meta +add wave -noupdate -group META /l0_rtps_reader_test2_vrn/uut/rd_meta +add wave -noupdate -group META /l0_rtps_reader_test2_vrn/uut/last_word_in_meta +add wave -noupdate -group META -radix hexadecimal /l0_rtps_reader_test2_vrn/uut/data_in_meta +add wave -noupdate -expand -group USER /l0_rtps_reader_test2_vrn/uut/empty_user +add wave -noupdate -expand -group USER /l0_rtps_reader_test2_vrn/uut/rd_user +add wave -noupdate -expand -group USER -radix hexadecimal /l0_rtps_reader_test2_vrn/uut/data_in_user +add wave -noupdate -expand -group USER /l0_rtps_reader_test2_vrn/uut/last_word_in_user +add wave -noupdate -divider HC +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/start_hc +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/opcode_hc +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/ack_hc +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/valid_out_hc +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/ready_out_hc +add wave -noupdate -radix hexadecimal /l0_rtps_reader_test2_vrn/uut/data_out_hc +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/last_word_out_hc +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/done_hc +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/ret_hc +add wave -noupdate -divider {MAIN FSM} +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/stage +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/stage_next +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/cnt +add wave -noupdate -divider {MEMORY FSM} +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/mem_op_done +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/mem_op_start +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/mem_opcode +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/mem_stage +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/mem_stage_next +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/mem_cnt +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/mem_pos +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vrn/uut/mem_addr_base +add wave -noupdate -childformat {{/l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.guid -radix hexadecimal} {/l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.addr -radix hexadecimal} {/l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.portn -radix hexadecimal} {/l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.next_seq_nr -radix unsigned -childformat {{/l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.next_seq_nr(0) -radix unsigned} {/l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.next_seq_nr(1) -radix unsigned}}} {/l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.lease_deadline -radix hexadecimal} {/l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.res_time -radix hexadecimal}} -subitemconfig {/l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.guid {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.addr {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.portn {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.next_seq_nr {-height 15 -radix unsigned -childformat {{/l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.next_seq_nr(0) -radix unsigned} {/l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.next_seq_nr(1) -radix unsigned}}} /l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.next_seq_nr(0) {-height 15 -radix unsigned} /l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.next_seq_nr(1) {-height 15 -radix unsigned} /l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.lease_deadline {-height 15 -radix hexadecimal} /l0_rtps_reader_test2_vrn/uut/mem_endpoint_data.res_time {-height 15 -radix hexadecimal}} /l0_rtps_reader_test2_vrn/uut/mem_endpoint_data +add wave -noupdate -group MEM_CTRL -radix unsigned /l0_rtps_reader_test2_vrn/uut/mem_addr +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vrn/uut/mem_valid_in +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vrn/uut/mem_ready_in +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vrn/uut/mem_read +add wave -noupdate -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test2_vrn/uut/mem_write_data +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vrn/uut/abort_read +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vrn/uut/mem_valid_out +add wave -noupdate -group MEM_CTRL /l0_rtps_reader_test2_vrn/uut/mem_ready_out +add wave -noupdate -group MEM_CTRL -radix hexadecimal /l0_rtps_reader_test2_vrn/uut/mem_read_data +add wave -noupdate -divider TESTBENCH +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrn/start_meta +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrn/packet_sent_meta +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrn/start_user +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrn/packet_sent_user +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrn/check_stage +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrn/out_check_done +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrn/stim_done +add wave -noupdate -group TESTBENCH /l0_rtps_reader_test2_vrn/test_done +add wave -noupdate -divider GAP +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vrn/uut/gap_start +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vrn/uut/gap_list_base +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vrn/uut/gap_list_end +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/bitmap_latch +add wave -noupdate /l0_rtps_reader_test2_vrn/uut/bitmap_pos +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vrn/uut/next_seq_nr +add wave -noupdate -radix unsigned /l0_rtps_reader_test2_vrn/uut/bitmap_cnt +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {Begin {49575000 ps} 1} {Error {53225000 ps} 1} {Cursor {50275000 ps} 0} +quietly wave cursor active 3 +configure wave -namecolwidth 150 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ns +update +WaveRestoreZoom {49779800 ps} {50803800 ps} diff --git a/sim/test_all.do b/sim/test_all.do new file mode 100644 index 0000000..fa63c55 --- /dev/null +++ b/sim/test_all.do @@ -0,0 +1,4 @@ +puts "Starting ALL Tests" +build ../src/Tests/testbench.pro +puts "DONE" +exit \ No newline at end of file diff --git a/src/TODO.txt b/src/TODO.txt index 24783b4..606d962 100644 --- a/src/TODO.txt +++ b/src/TODO.txt @@ -77,7 +77,7 @@ - No * Since Lifespan is a duration, there is an inherent difference in the expiration time between writer and reader. This in addition to the fact that the reader may use the Reception time for the expiration time calculation could lead to an actual expiration duration almost double in length (If sent right before expiring locally in the writer). * The current implementation will sent a second unregister/dispose Sample, if the user does the unregister/dispose operation a second time. Should we handle that specially? - +* If a Keyed Reader receives a DATA Message with no Key hash and no Payload, it will drop it since there is no way to determine the instance (And the SN will never be accepted). * Fast-RTPS does not follow DDSI-RTPS Specification diff --git a/src/Tests/Level_0/L0_rtps_reader_test1_vbk.vhd b/src/Tests/Level_0/L0_rtps_reader_test1_vbk.vhd new file mode 100644 index 0000000..cf13214 --- /dev/null +++ b/src/Tests/Level_0/L0_rtps_reader_test1_vbk.vhd @@ -0,0 +1,483 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library osvvm; -- Utility Library +context osvvm.OsvvmContext; + +use work.rtps_package.all; +use work.user_config.all; +use work.rtps_config_package.all; +use work.rtps_test_package.all; + +-- This testbench tests the metatraffic operation behaviour of the RTPS Reader. (Remote Endpoint matching and memory behaviour) +-- This testbench is using external names to access the memory of the rtps_reader directly and check the contents at the supposed locations. +-- This testbench covers following: +-- * Mathing Endpoint +-- * Memory Full Behaviour +-- * Unmatching Endpoint +-- * Unmatching Participant +-- * Updating previously matched Endpoint +-- * Unknown Metatraffic Operation + +entity L0_rtps_reader_test1_vbk is +end entity; + +architecture testbench of L0_rtps_reader_test1_vbk is + + -- *CONSTANT DECLARATION* + constant MAX_REMOTE_ENDPOINTS : natural := 3; + + -- *TYPE DECLARATION* + type TEST_STAGE_TYPE is (IDLE, BUSY); + type TEST_RAM_TYPE is array (0 to (MAX_REMOTE_ENDPOINTS*WRITER_ENDPOINT_FRAME_SIZE_B)-1) of std_logic_vector(WORD_WIDTH-1 downto 0); + + -- *SIGNAL DECLARATION* + signal clk, empty_user, empty_meta, rd_meta, last_word_in_meta : std_logic := '0'; + signal reset : std_logic := '1'; + signal data_in_meta, data_out_hc : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal start_hc, ack_hc, done_hc, done_hc_delay : std_logic := '0'; + signal opcode_hc : HISTORY_CACHE_OPCODE_TYPE := NOP; + signal ret_hc : HISTORY_CACHE_RESPONSE_TYPE := OK; + signal stim_stage : TEST_STAGE_TYPE := IDLE; + shared variable stimulus, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + signal packet_sent : std_logic := '0'; + signal cnt_stim : natural := 0; + signal start : std_logic := '0'; + shared variable SB_out : osvvm.ScoreBoardPkg_slv.ScoreBoardPType; + shared variable SB_mem : work.ScoreBoardPkg_MemoryTest.ScoreBoardPType; + signal stim_done, mem_check_done, out_check_done, test_done : std_logic := '0'; + + -- *FUNCTION DECLARATION* + procedure wait_on_sent is + begin + wait until rising_edge(packet_sent); + end procedure; + + procedure wait_on_mem_check is + begin + if (mem_check_done /= '1') then + wait until mem_check_done = '1'; + end if; + end procedure; + + procedure wait_on_completion is + begin + if (test_done /= '1') then + wait until test_done = '1'; + end if; + end procedure; + +begin + + -- Unit Under Test + uut : entity work.rtps_reader(arch) + generic map ( + ENTITYID => DEFAULT_READER_ENTITYID, + RELIABILTY_QOS => BEST_EFFORT_RELIABILITY_QOS, + LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, + DURABILITY_QOS => VOLATILE_DURABILITY_QOS, + HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, + HEARTBEAT_SUPPRESSION_DELAY => DURATION_ZERO, + LEASE_DURATION => DURATION_INFINITE, + WITH_KEY => TRUE, + MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS + ) + port map ( + -- SYSTEM + clk => clk, + reset => reset, + time => TIME_ZERO, + empty_user => '1', + rd_user => open, + data_in_user => (others => '0'), + last_word_in_user => '0', + empty_meta => empty_meta or packet_sent, + rd_meta => rd_meta, + data_in_meta => data_in_meta, + last_word_in_meta => last_word_in_meta, + wr_rtps => open, + full_rtps => '0', + last_word_out_rtps => open, + data_out_rtps => open, + start_hc => start_hc, + opcode_hc => opcode_hc, + ack_hc => ack_hc, + done_hc => done_hc, + ret_hc => ret_hc, + data_out_hc => data_out_hc, + valid_out_hc => open, + ready_out_hc => '0', + last_word_out_hc => open + ); + + stimulus_prc : process + variable RV : RandomPType; + variable p0, p1, participant : PARTICIPANT_DATA_TYPE := DEFAULT_PARTICIPANT_DATA; + variable e0, e1, e2, e3, endpoint : ENDPOINT_DATA_TYPE := DEFAULT_ENDPOINT_DATA; + + -- Wrapper to use procedure as function + impure function gen_rand_loc_2 return LOCATOR_TYPE is + variable ret : LOCATOR_TYPE := EMPTY_LOCATOR; + begin + gen_rand_loc(RV, ret); + return ret; + end function; + + impure function gen_rand_guid_prefix return GUIDPREFIX_TYPE is + variable ret : GUIDPREFIX_TYPE; + begin + ret := (0 => RV.RandSlv(WORD_WIDTH), 1 => RV.RandSlv(WORD_WIDTH), 2 => RV.RandSlv(WORD_WIDTH)); + return ret; + end function; + + procedure start_test is + begin + start <= '1'; + wait until rising_edge(clk); + start <= '0'; + wait until rising_edge(clk); + end procedure; + begin + + SetAlertLogName("rtps_reader - (Volatile, Best Effort, Keyed) - Level 0 - Metatraffic Handling"); + SetAlertEnable(FAILURE, TRUE); + SetAlertEnable(ERROR, TRUE); + SetAlertEnable(WARNING, TRUE); + SetLogEnable(DEBUG, FALSE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, TRUE); + RV.InitSeed(RV'instance_name); + + p0.guidPrefix := gen_rand_guid_prefix; + p1.guidPrefix := gen_rand_guid_prefix; + + -- Endpoint 1 + e0 := DEFAULT_ENDPOINT_DATA; + e0.participant := p0; + e0.entityid := RV.RandSlv(ENTITYID_WIDTH); + e0.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + -- Endpoint 2 + e1 := DEFAULT_ENDPOINT_DATA; + e1.participant := p0; + e1.entityid := RV.RandSlv(ENTITYID_WIDTH); + e1.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + -- Endpoint 3 + e2 := DEFAULT_ENDPOINT_DATA; + e2.participant := p1; + e2.entityid := RV.RandSlv(ENTITYID_WIDTH); + e2.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + -- Endpoint 4 + e3 := DEFAULT_ENDPOINT_DATA; + e3.participant := p1; + e3.entityid := RV.RandSlv(ENTITYID_WIDTH); + e3.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + + Log("Initiating Test", INFO); + stim_done <= '0'; + start <= '0'; + reset <= '1'; + wait until rising_edge(clk); + wait until rising_edge(clk); + reset <= '0'; + + + Log("Insert Endpoint 0 Participant 0", INFO); + endpoint := e0; + endpoint.nr := 0; + endpoint.match := MATCH; + gen_endpoint_match_frame(endpoint, stimulus); + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + start_test; + wait_on_sent; + stimulus := EMPTY_TEST_PACKET; + wait_on_mem_check; + -- MEMORY STATE [p0e0,0,0] + + Log("Insert Endpoint 1 Participant 0", INFO); + endpoint := e1; + endpoint.nr := 1; + endpoint.match := MATCH; + gen_endpoint_match_frame(endpoint, stimulus); + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + start_test; + wait_on_sent; + stimulus := EMPTY_TEST_PACKET; + wait_on_mem_check; + -- MEMORY STATE [p0e0,p0e1,0] + + Log("Insert Endpoint 2 Participant 1", INFO); + endpoint := e2; + endpoint.nr := 2; + endpoint.match := MATCH; + gen_endpoint_match_frame(endpoint, stimulus); + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + start_test; + wait_on_sent; + stimulus := EMPTY_TEST_PACKET; + wait_on_mem_check; + -- MEMORY STATE [p0e0,p0e1,p1e2] + + Log("Ignore Endpoint 3 Participant 1 [Memory Full]", INFO); + endpoint := e3; + endpoint.match := MATCH; + gen_endpoint_match_frame(endpoint, stimulus); + -- Re-check Mem-State + endpoint := e0; + endpoint.nr := 0; + endpoint.match := MATCH; + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + endpoint := e1; + endpoint.nr := 1; + endpoint.match := MATCH; + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + endpoint := e2; + endpoint.nr := 2; + endpoint.match := MATCH; + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + start_test; + wait_on_sent; + stimulus := EMPTY_TEST_PACKET; + wait_on_mem_check; + -- MEMORY STATE [p0e0,p0e1,p1e3] + + Log("Remove Endpoint 2 Participant 1", INFO); + endpoint := e2; + endpoint.nr := 2; + endpoint.match := UNMATCH; + gen_endpoint_match_frame(endpoint, stimulus); + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + SB_out.Push(std_logic_vector(to_unsigned(endpoint.nr, WORD_WIDTH))); + start_test; + wait_on_sent; + stimulus := EMPTY_TEST_PACKET; + wait_on_mem_check; + -- MEMORY STATE [p0e0,p0e1,0] + + Log("Insert Endpoint 3 Participant 1", INFO); + endpoint := e3; + endpoint.nr := 2; + endpoint.match := MATCH; + gen_endpoint_match_frame(endpoint, stimulus); + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + start_test; + wait_on_sent; + stimulus := EMPTY_TEST_PACKET; + wait_on_mem_check; + -- MEMORY STATE [p0e0,p0e1,p1e3] + + Log("Remove Participant 0", INFO); + participant := p0; + participant.match := UNMATCH; + gen_participant_match_frame(participant, stimulus); + -- Remove Endpoint 0 + endpoint := e0; + endpoint.nr := 0; + endpoint.match := UNMATCH; + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + SB_out.Push(std_logic_vector(to_unsigned(endpoint.nr, WORD_WIDTH))); + -- Remove Endpoint 1 + endpoint := e1; + endpoint.nr := 1; + endpoint.match := UNMATCH; + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + SB_out.Push(std_logic_vector(to_unsigned(endpoint.nr, WORD_WIDTH))); + start_test; + wait_on_sent; + stimulus := EMPTY_TEST_PACKET; + wait_on_mem_check; + -- MEMORY STATE [0,0,p1e3] + + Log("Insert Endpoint 2 Participant 1", INFO); + endpoint := e2; + endpoint.nr := 0; + endpoint.match := MATCH; + gen_endpoint_match_frame(endpoint, stimulus); + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + start_test; + wait_on_sent; + stimulus := EMPTY_TEST_PACKET; + wait_on_mem_check; + -- MEMORY STATE [p1e2,0,p1e3] + + Log("Unknown Metatraffic Operation followed by insertion of Enpoint 0 Participant 0", INFO); + for i in 0 to 9 loop + stimulus.data(i) := RV.RandSlv(WORD_WIDTH); + end loop; + stimulus.last(9) := '1'; + stimulus.length := 10; + endpoint := e0; + endpoint.nr := 1; + endpoint.match := MATCH; + gen_endpoint_match_frame(endpoint, stimulus); + -- Re-check Mem-State + endpoint := e2; + endpoint.nr := 0; + endpoint.match := MATCH; + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + endpoint := e0; + endpoint.nr := 1; + endpoint.match := MATCH; + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + endpoint := e3; + endpoint.nr := 2; + endpoint.match := MATCH; + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + start_test; + wait_on_sent; + stimulus := EMPTY_TEST_PACKET; + wait_on_mem_check; + -- MEMORY STATE [p1e2,p0e0,p1e3] + + Log("Update Endpoint 2 Participant 1", INFO); + endpoint := e2; + endpoint.nr := 0; + endpoint.match := MATCH; + endpoint.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + gen_endpoint_match_frame(endpoint, stimulus); + SB_mem.Push(gen_writer_endpoint_mem_frame_b(endpoint)); + start_test; + wait_on_sent; + stimulus := EMPTY_TEST_PACKET; + wait_on_mem_check; + -- MEMORY STATE [p1e2,p0e0,p1e3] + + + + stim_done <= '1'; + wait_on_completion; + TranscriptOpen(RESULTS_FILE, APPEND_MODE); + SetTranscriptMirror; + ReportAlerts; + TranscriptClose; + std.env.stop; + wait; + end process; + + clock_prc : process + begin + clk <= '0'; + wait for 25 ns; + clk <= '1'; + wait for 25 ns; + end process; + + in_empty_prc : process + begin + empty_meta <= '0'; + wait until rd_meta = '1'; + wait until rising_edge(clk); + empty_meta <= '1'; + wait until rising_edge(clk); + end process; + + alert_prc : process(all) + begin + if rising_edge(clk) then + alertif(empty_meta = '1' and rd_meta = '1', "Input FIFO read signal high while empty signal high", ERROR); + end if; + end process; + + input_prc : process(all) + begin + data_in_meta <= stimulus.data(cnt_stim); + last_word_in_meta <= stimulus.last(cnt_stim); + + if rising_edge(clk) then + if (reset = '1') then + cnt_stim <= 0; + stim_stage <= IDLE; + packet_sent <= '1'; + else + case (stim_stage) is + when IDLE => + if (start = '1' and stimulus.length /= 0) then + stim_stage <= BUSY; + packet_sent <= '0'; + end if; + when BUSY => + if (rd_meta = '1') then + if (cnt_stim = stimulus.length-1) then + stim_stage <= IDLE; + packet_sent <= '1'; + cnt_stim <= 0; + else + cnt_stim <= cnt_stim + 1; + end if; + end if; + end case; + end if; + end if; + end process; + + done_proc : process(clk) + begin + if rising_edge(clk) then + if (stim_done = '1' and SB_out.empty and SB_mem.empty) then + test_done <= '1'; + else + test_done <= '0'; + end if; + end if; + end process; + + out_check_prc : process(all) + begin + if rising_edge(clk) then + done_hc <= done_hc_delay; + if (start_hc = '1') then + ack_hc <= '1'; + done_hc_delay <= '1'; + case (opcode_hc) is + when REMOVE_WRITER => + SB_out.check(data_out_hc); + when others => + Alert("Unexpected HC Opcode", ERROR); + end case; + else + ack_hc <= '0'; + done_hc_delay <= '0'; + end if; + end if; + end process; + + mem_check_prc : process + alias mem is <>; + alias mem_op_done is <>; + alias idle_sig is <>; + variable reference : TEST_WRITER_ENDPOINT_MEMORY_FRAME_TYPE_B; + begin + mem_check_done <= '0'; + -- SAFEGUARD: (Prevent Fall-through Behavior) + if (reset /= '0') then + wait until reset = '0'; + end if; + -- Wait for Packet to be sent + wait until rising_edge(packet_sent); + -- Wait for UUT IDLE state + if (idle_sig /= '1') then + wait until idle_sig = '1'; + end if; + -- Wait for ongoing memory operation + if (mem_op_done /= '1') then + wait until mem_op_done = '1'; + end if; + while (not SB_mem.empty) loop + SB_mem.Pop(reference); + for i in 0 to reference'length-1 loop + AffirmIf(?? (mem(reference(i).addr) ?= reference(i).data), "Address: " & integer'image(reference(i).addr) & " Received: " & to_hstring(mem(reference(i).addr)) & " Expected: " & to_hstring(reference(i).data)); + end loop; + end loop; + -- Toggle High for one clock cycle + mem_check_done <= '1'; + wait until rising_edge(clk); + end process; + + watchdog : process + begin + wait for 1 ms; + Alert("Test timeout", FAILURE); + std.env.stop; + end process; + +end architecture; \ No newline at end of file diff --git a/src/Tests/Level_0/L0_rtps_reader_test1.vhd b/src/Tests/Level_0/L0_rtps_reader_test1_vrk.vhd similarity index 98% rename from src/Tests/Level_0/L0_rtps_reader_test1.vhd rename to src/Tests/Level_0/L0_rtps_reader_test1_vrk.vhd index 56be9c9..9358c7c 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test1.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test1_vrk.vhd @@ -20,10 +20,10 @@ use work.rtps_test_package.all; -- * Updating previously matched Endpoint -- * Unknown Metatraffic Operation -entity L0_rtps_reader_test1 is +entity L0_rtps_reader_test1_vrk is end entity; -architecture testbench of L0_rtps_reader_test1 is +architecture testbench of L0_rtps_reader_test1_vrk is -- *CONSTANT DECLARATION* constant MAX_REMOTE_ENDPOINTS : natural := 3; @@ -140,7 +140,7 @@ begin end procedure; begin - SetAlertLogName("rtps_reader - Level 0 - Metatraffic Handling"); + SetAlertLogName("rtps_reader - (Volatile, Reliable, Keyed) - Level 0 - Metatraffic Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_tbk.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_tbk.vhd new file mode 100644 index 0000000..1957fc9 --- /dev/null +++ b/src/Tests/Level_0/L0_rtps_reader_test2_tbk.vhd @@ -0,0 +1,1308 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library osvvm; -- Utility Library +context osvvm.OsvvmContext; + +use work.rtps_package.all; +use work.user_config.all; +use work.rtps_config_package.all; +use work.rtps_test_package.all; + +-- This testbench tests the User traffic handling of the RTPS Reader. +-- The testbench checks which packets are accepted and propagated as Cache Changes to the History Cache. +-- This testbench covers following: +-- * Traffic from matched/unmatched remote Endpoint +-- * Traffic with/without prior HEARTBEAT +-- * HEARTBEAT Handling +-- * GAP Handling +-- * Inline-QoS Handling +-- * Traffic without Payload (Unregister/Dispose DDS Operations) + +entity L0_rtps_reader_test2_tbk is +end entity; + +architecture testbench of L0_rtps_reader_test2_tbk is + + -- *CONSTANT DECLARATION* + constant MAX_REMOTE_ENDPOINTS : natural := 4; + constant ACCEPT_RES : std_logic_vector(WORD_WIDTH downto 0) := (others => '0'); + constant REJECT_RES : std_logic_vector(WORD_WIDTH downto 0) := (others => '1'); + + -- *TYPE DECLARATION* + type SEND_STAGE_TYPE is (IDLE, BUSY); + type CHECK_STAGE_TYPE is (IDLE, CHECK, RESPONSE); + type TEST_RAM_TYPE is array (0 to (MAX_REMOTE_ENDPOINTS*WRITER_ENDPOINT_FRAME_SIZE_A)-1) of std_logic_vector(WORD_WIDTH-1 downto 0); + + -- *SIGNAL DECLARATION* + signal clk, empty_user, empty_meta, rd_user, rd_meta, last_word_in_user, last_word_in_meta, wr_rtps : std_logic := '0'; + signal reset : std_logic := '1'; + signal data_in_user, data_in_meta, data_out_hc : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal start_hc, ack_hc, done_hc, done_hc_delay, ready_out_hc, valid_out_hc, last_word_out_hc : std_logic := '0'; + signal opcode_hc : HISTORY_CACHE_OPCODE_TYPE := NOP; + signal ret_hc : HISTORY_CACHE_RESPONSE_TYPE := OK; + signal stim_stage_user, stim_stage_meta : SEND_STAGE_TYPE := IDLE; + signal check_stage : CHECK_STAGE_TYPE := IDLE; + shared variable stimulus_user, stimulus_meta, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + signal packet_sent_user, packet_sent_meta : std_logic := '0'; + signal cnt_stim_meta, cnt_stim_user : natural := 0; + signal start_meta, start_user : std_logic := '0'; + shared variable SB_out : osvvm.ScoreBoardPkg_slv.ScoreBoardPType; + signal stim_done, mem_check_done, out_check_done, test_done : std_logic := '0'; + + -- *FUNCTION DECLARATION* + function gen_sn(input : natural) return SEQUENCENUMBER_TYPE is + variable ret : SEQUENCENUMBER_TYPE; + begin + ret(0) := (others => '0'); + ret(1) := unsigned(int(input, WORD_WIDTH)); + return ret; + end function; +begin + + -- Unit Under Test + uut : entity work.rtps_reader(arch) + generic map ( + ENTITYID => DEFAULT_READER_ENTITYID, + RELIABILTY_QOS => BEST_EFFORT_RELIABILITY_QOS, + LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, + DURABILITY_QOS => TRANSIENT_LOCAL_DURABILITY_QOS, + HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, + HEARTBEAT_SUPPRESSION_DELAY => DURATION_ZERO, + LEASE_DURATION => DURATION_INFINITE, + WITH_KEY => TRUE, + MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS + ) + port map ( + -- SYSTEM + clk => clk, + reset => reset, + time => TIME_ZERO, + empty_user => empty_user or packet_sent_user, + rd_user => rd_user, + data_in_user => data_in_user, + last_word_in_user => last_word_in_user, + empty_meta => empty_meta or packet_sent_meta, + rd_meta => rd_meta, + data_in_meta => data_in_meta, + last_word_in_meta => last_word_in_meta, + wr_rtps => wr_rtps, + full_rtps => '0', + last_word_out_rtps => open, + data_out_rtps => open, + start_hc => start_hc, + opcode_hc => opcode_hc, + ack_hc => ack_hc, + done_hc => done_hc, + ret_hc => ret_hc, + data_out_hc => data_out_hc, + valid_out_hc => valid_out_hc, + ready_out_hc => ready_out_hc, + last_word_out_hc => last_word_out_hc + ); + + stimulus_prc : process + variable RV : RandomPType; + variable e0, e1, e2, endpoint : ENDPOINT_DATA_TYPE := DEFAULT_ENDPOINT_DATA; + variable payload : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + variable sub : RTPS_SUBMESSAGE_TYPE := DEFAULT_RTPS_SUBMESSAGE; + variable cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE; + variable src_ts, life_ts : TIME_TYPE := TIME_INVALID; + + -- Wrapper to use procedure as function + impure function gen_rand_loc_2 return LOCATOR_TYPE is + variable ret : LOCATOR_TYPE := EMPTY_LOCATOR; + begin + gen_rand_loc(RV, ret); + return ret; + end function; + + impure function gen_rand_guid_prefix return GUIDPREFIX_TYPE is + variable ret : GUIDPREFIX_TYPE; + begin + ret := (0 => RV.RandSlv(WORD_WIDTH), 1 => RV.RandSlv(WORD_WIDTH), 2 => RV.RandSlv(WORD_WIDTH)); + return ret; + end function; + + procedure start_meta_test is + begin + start_meta <= '1'; + wait until rising_edge(clk); + start_meta <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure start_user_test is + begin + start_user <= '1'; + wait until rising_edge(clk); + start_user <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure push_reference(accept : in BOOLEAN) is + begin + -- NOTE: First Word represents the Response that we will return. + if (accept) then + SB_out.Push(ACCEPT_RES); + else + SB_out.Push(REJECT_RES); + end if; + for i in 0 to reference.length-1 loop + SB_out.Push(reference.last(i) & reference.data(i)); + end loop; + end procedure; + + impure function gen_payload return TEST_PACKET_TYPE is + variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + for i in 0 to RV.RandInt(1,10) loop + ret.data(ret.length) := RV.RandSlv(WORD_WIDTH); + ret.length := ret.length + 1; + end loop; + return ret; + end function; + + impure function gen_key_hash return KEY_HASH_TYPE is + variable ret : KEY_HASH_TYPE := (others => (others => '0')); + begin + for i in 0 to KEY_HASH_TYPE'length-1 loop + ret(i) := RV.RandSlv(WORD_WIDTH); + end loop; + return ret; + end function; + + procedure wait_on_meta_sent is + begin + wait until rising_edge(packet_sent_meta); + end procedure; + + procedure wait_on_user_sent is + begin + wait until rising_edge(packet_sent_user); + end procedure; + + procedure wait_on_out_check is + begin + if (out_check_done /= '1') then + wait until out_check_done = '1'; + end if; + end procedure; + + procedure wait_on_completion is + begin + if (test_done /= '1') then + wait until test_done = '1'; + end if; + end procedure; + begin + + SetAlertLogName("rtps_reader - (Transient Local, Best Effort, Keyed) - Level 0 - User Traffic Handling"); + SetAlertEnable(FAILURE, TRUE); + SetAlertEnable(ERROR, TRUE); + SetAlertEnable(WARNING, TRUE); + SetLogEnable(DEBUG, FALSE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, TRUE); + RV.InitSeed(RV'instance_name); + + -- Endpoint 1 + e0 := DEFAULT_ENDPOINT_DATA; + e0.nr := 0; + e0.match := MATCH; + e0.entityid := RV.RandSlv(ENTITYID_WIDTH); + e0.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + -- Endpoint 2 + e1 := DEFAULT_ENDPOINT_DATA; + e1.nr := 1; + e1.match := MATCH; + e1.entityid := RV.RandSlv(ENTITYID_WIDTH); + e1.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + -- Endpoint 3 + e2 := DEFAULT_ENDPOINT_DATA; + e2.nr := 2; + e2.match := MATCH; + e2.entityid := RV.RandSlv(ENTITYID_WIDTH); + e2.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + + Log("Initiating Test", INFO); + stim_done <= '0'; + start_meta <= '0'; + start_user <= '0'; + reset <= '1'; + wait until rising_edge(clk); + wait until rising_edge(clk); + reset <= '0'; + + src_ts := TIME_INVALID; + life_ts := TIME_INVALID; + + -- *GENERAL SEQUENCE NUMBER HANDLING* + Log("Test General SequenceNumber Handling", INFO); + + Log("Ignore Endpoint 0 sent DATA [SN 1]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(1); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + -- NOTE: We do not wait here for the sent, to allow meta traffic being available during user traffic handling. + + Log("Insert Endpoint 0,1,2", INFO); + gen_endpoint_match_frame(e0, stimulus_meta); + gen_endpoint_match_frame(e1, stimulus_meta); + gen_endpoint_match_frame(e2, stimulus_meta); + start_meta_test; + wait_on_meta_sent; + stimulus_meta := EMPTY_TEST_PACKET; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 1]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(1); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 0 sent DATA [SN 1]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(1); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 3]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(3); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 0 sent DATA [SN 2]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(2); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *HEARTBEAT HANDLING* + Log("Test HEARTBEAT Handling", INFO); + + Log("Endpoint 2 Heartbeat [First 2, Last 11]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(2); + sub.lastSN := gen_sn(11); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 1]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(1); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 2]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(2); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 11]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(11); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [First 5, Last 13]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(5); + sub.lastSN := gen_sn(13); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 5]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(5); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 13]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 12]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(12); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [First 15, Last 18]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(15); + sub.lastSN := gen_sn(18); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 18]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(18); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 15]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(15); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [First 19, Last 18]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(19); + sub.lastSN := gen_sn(18); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 19]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(19); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *GAP HANDLING* + Log("Test GAP Handling", INFO); + + Log("Endpoint 2 Heartbeat [GAP 1-10]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(1); + sub.gapList := (base => gen_sn(11), numBits => int(0, CDR_LONG_WIDTH), bitmap => (others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 11]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(11); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 2-10,12]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(2); + sub.gapList := (base => gen_sn(10), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 13]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 21-22]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(21); + sub.gapList := (base => gen_sn(23), numBits => int(0, CDR_LONG_WIDTH), bitmap => (others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 20]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(20); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 21-22, 24]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(21); + sub.gapList := (base => gen_sn(22), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 21]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(21); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 23]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(23); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 21-22, 24]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(21); + sub.gapList := (base => gen_sn(23), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 24]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(24); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 25]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(25); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 20-30]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(20); + sub.gapList := (base => gen_sn(31), numBits => int(1, CDR_LONG_WIDTH), bitmap => (others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 26]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(26); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 31]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(31); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *DURABILITY AND INLINE-QOS HANDLING* + Log("Test Durability and Inline-QoS Handling", INFO); + + Log("Accept Endpoint 1 sent DATA [SN 10]", INFO); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(10); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 11, Inline-QoS (Lifespan, Status Info, Key Hash)]", INFO); + src_ts := gen_duration(1,0); + life_ts := gen_duration(2,0); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(11); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 12, Inline-QoS (Invalid PID_LIFESPAN)]", INFO); + src_ts := gen_duration(1,100); + life_ts := gen_duration(2,100); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(12); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_LIFESPAN, -1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 12, Inline-QoS (Extra Bytes in PID_LIFESPAN)]", INFO); + src_ts := gen_duration(1,200); + life_ts := gen_duration(2,200); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(12); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_LIFESPAN, +1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 13, Inline-QoS (Invalid PID_STATUS_INFO)]", INFO); + src_ts := gen_duration(1,300); + life_ts := gen_duration(2,300); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_STATUS_INFO, -1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 13, Inline-QoS (Extra Bytes in PID_STATUS_INFO)]", INFO); + src_ts := gen_duration(1,400); + life_ts := gen_duration(2,400); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_STATUS_INFO, +1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 14, Inline-QoS (Invalid PID_KEY_HASH)]", INFO); + src_ts := gen_duration(1,500); + life_ts := gen_duration(2,500); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(14); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_KEY_HASH, -1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 14, Inline-QoS (Extra Bytes in PID_KEY_HASH)]", INFO); + src_ts := gen_duration(1,600); + life_ts := gen_duration(2,600); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(14); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_KEY_HASH, +1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *NON_PAYLOAD TRAFFIC HANDLING* + Log("Test Non-Payload Traffic Handling", INFO); + + Log("Accept Endpoint 1 sent DATA [SN 15, No Payload, Inline-QoS (Lifespan, Status Info, Key Hash)]", INFO); + src_ts := gen_duration(2,0); + life_ts := gen_duration(3,0); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(15); + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_DISPOSED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 16, Serialized Key, Inline-QoS (Lifespan, Status Info)]", INFO); + src_ts := gen_duration(2,500); + life_ts := gen_duration(3,500); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(16); + sub.flags(SUBMESSAGE_KEY_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.src_timestamp := src_ts; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 17, No Payload, Inline-QoS (Lifespan, Status Info)]", INFO); + src_ts := gen_duration(2,600); + life_ts := gen_duration(3,600); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(17); + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_DISPOSED; + cc.src_timestamp := src_ts; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + src_ts := TIME_INVALID; + life_ts := TIME_INVALID; + + -- *HISTORY CACHE RESPONSE HANDLING* + Log("Test History Cache Response Handling", INFO); + + Log("Accept Endpoint 0 sent DATA [SN 4, HC Reject]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(4); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(FALSE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 4]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(4); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *CONCURRENT TRAFFIC HANDLING* + Log("Test Concurrent User and Metatraffic Handling", INFO); + + Log("Unmatch Endpoint 0 and Ignore Endpoint 0 sent DATA [SN 5]", INFO); + e0.match := UNMATCH; + gen_endpoint_match_frame(e0, stimulus_meta); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(5); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user <= '1'; + start_meta <= '1'; + wait until rising_edge(clk); + start_user <= '0'; + start_meta <= '0'; + stimulus_meta := EMPTY_TEST_PACKET; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + stim_done <= '1'; + wait_on_completion; + TranscriptOpen(RESULTS_FILE, APPEND_MODE); + SetTranscriptMirror; + ReportAlerts; + TranscriptClose; + std.env.stop; + wait; + end process; + + clock_prc : process + begin + clk <= '0'; + wait for 25 ns; + clk <= '1'; + wait for 25 ns; + end process; + + empty_meta_prc : process + begin + empty_meta <= '0'; + wait until rd_meta = '1'; + wait until rising_edge(clk); + empty_meta <= '1'; + wait until rising_edge(clk); + end process; + + empty_user_prc : process + begin + empty_user <= '0'; + wait until rd_user = '1'; + wait until rising_edge(clk); + empty_user <= '1'; + wait until rising_edge(clk); + end process; + + alert_prc : process(all) + begin + if rising_edge(clk) then + alertif(empty_meta = '1' and rd_meta = '1', "Input FIFO read signal high while empty signal high (meta)", ERROR); + alertif(empty_user = '1' and rd_user = '1', "Input FIFO read signal high while empty signal high (user)", ERROR); + alertif(wr_rtps = '1', "Best Effort Reader has RTPS output", ERROR); + end if; + end process; + + input_meta_prc : process(all) + begin + data_in_meta <= stimulus_meta.data(cnt_stim_meta); + last_word_in_meta <= stimulus_meta.last(cnt_stim_meta); + + if rising_edge(clk) then + if (reset = '1') then + cnt_stim_meta <= 0; + stim_stage_meta <= IDLE; + packet_sent_meta <= '1'; + else + case (stim_stage_meta) is + when IDLE => + if (start_meta = '1' and stimulus_meta.length /= 0) then + stim_stage_meta <= BUSY; + packet_sent_meta <= '0'; + end if; + when BUSY => + if (rd_meta = '1') then + if (cnt_stim_meta = stimulus_meta.length-1) then + stim_stage_meta <= IDLE; + packet_sent_meta <= '1'; + cnt_stim_meta <= 0; + else + cnt_stim_meta <= cnt_stim_meta + 1; + end if; + end if; + end case; + end if; + end if; + end process; + + input_user_prc : process(all) + begin + data_in_user <= stimulus_user.data(cnt_stim_user); + last_word_in_user <= stimulus_user.last(cnt_stim_user); + + if rising_edge(clk) then + if (reset = '1') then + cnt_stim_user <= 0; + stim_stage_user <= IDLE; + packet_sent_user <= '1'; + else + case (stim_stage_user) is + when IDLE => + if (start_user = '1' and stimulus_user.length /= 0) then + stim_stage_user <= BUSY; + packet_sent_user <= '0'; + end if; + when BUSY => + if (rd_user = '1') then + if (cnt_stim_user = stimulus_user.length-1) then + stim_stage_user <= IDLE; + packet_sent_user <= '1'; + cnt_stim_user <= 0; + else + cnt_stim_user <= cnt_stim_user + 1; + end if; + end if; + end case; + end if; + end if; + end process; + + done_proc : process(clk) + begin + if rising_edge(clk) then + if (stim_done = '1' and SB_out.empty) then + test_done <= '1'; + else + test_done <= '0'; + end if; + end if; + end process; + + out_check_prc : process(all) + variable accept : std_logic_vector(WORD_WIDTH downto 0); + begin + if rising_edge(clk) then + case (check_stage) is + when IDLE => + ack_hc <= '0'; + done_hc <= '0'; + ready_out_hc <= '0'; + ret_hc <= ERROR; + out_check_done <= '0'; + if (start_hc = '1') then + ack_hc <= '1'; + check_stage <= CHECK; + case (opcode_hc) is + when ADD_CACHE_CHANGE => + -- Pop Response Value + SB_out.pop(accept); + when others => + Alert("Unexpected HC Opcode", ERROR); + end case; + end if; + when CHECK => + ack_hc <= '0'; + ready_out_hc <= '1'; + out_check_done <= '0'; + if (valid_out_hc = '1') then + SB_out.Check(last_word_out_hc & data_out_hc); + + if (last_word_out_hc = '1') then + ready_out_hc <= '0'; + check_stage <= RESPONSE; + end if; + end if; + when RESPONSE => + ack_hc <= '0'; + ready_out_hc <= '0'; + done_hc <= '1'; + if (accept = ACCEPT_RES) then + ret_hc <= OK; + else + ret_hc <= REJECTED; + end if; + check_stage <= IDLE; + out_check_done <= '1'; + end case; + end if; + end process; + + watchdog : process + begin + wait for 1 ms; + Alert("Test timeout", FAILURE); + std.env.stop; + end process; + +end architecture; \ No newline at end of file diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_trk.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_trk.vhd new file mode 100644 index 0000000..4fc5ec2 --- /dev/null +++ b/src/Tests/Level_0/L0_rtps_reader_test2_trk.vhd @@ -0,0 +1,1317 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library osvvm; -- Utility Library +context osvvm.OsvvmContext; + +use work.rtps_package.all; +use work.user_config.all; +use work.rtps_config_package.all; +use work.rtps_test_package.all; + +-- This testbench tests the User traffic handling of the RTPS Reader. +-- The testbench checks which packets are accepted and propagated as Cache Changes to the History Cache. +-- This testbench covers following: +-- * Traffic from matched/unmatched remote Endpoint +-- * Traffic with/without prior HEARTBEAT +-- * HEARTBEAT Handling +-- * GAP Handling +-- * Inline-QoS Handling +-- * Traffic without Payload (Unregister/Dispose DDS Operations) + +entity L0_rtps_reader_test2_trk is +end entity; + +architecture testbench of L0_rtps_reader_test2_trk is + + -- *CONSTANT DECLARATION* + constant MAX_REMOTE_ENDPOINTS : natural := 4; + constant ACCEPT_RES : std_logic_vector(WORD_WIDTH downto 0) := (others => '0'); + constant REJECT_RES : std_logic_vector(WORD_WIDTH downto 0) := (others => '1'); + + -- *TYPE DECLARATION* + type SEND_STAGE_TYPE is (IDLE, BUSY); + type CHECK_STAGE_TYPE is (IDLE, CHECK, RESPONSE); + type TEST_RAM_TYPE is array (0 to (MAX_REMOTE_ENDPOINTS*WRITER_ENDPOINT_FRAME_SIZE_A)-1) of std_logic_vector(WORD_WIDTH-1 downto 0); + + -- *SIGNAL DECLARATION* + signal clk, empty_user, empty_meta, rd_user, rd_meta, last_word_in_user, last_word_in_meta : std_logic := '0'; + signal reset : std_logic := '1'; + signal data_in_user, data_in_meta, data_out_hc : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal start_hc, ack_hc, done_hc, done_hc_delay, ready_out_hc, valid_out_hc, last_word_out_hc : std_logic := '0'; + signal opcode_hc : HISTORY_CACHE_OPCODE_TYPE := NOP; + signal ret_hc : HISTORY_CACHE_RESPONSE_TYPE := OK; + signal stim_stage_user, stim_stage_meta : SEND_STAGE_TYPE := IDLE; + signal check_stage : CHECK_STAGE_TYPE := IDLE; + shared variable stimulus_user, stimulus_meta, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + signal packet_sent_user, packet_sent_meta : std_logic := '0'; + signal cnt_stim_meta, cnt_stim_user : natural := 0; + signal start_meta, start_user : std_logic := '0'; + shared variable SB_out : osvvm.ScoreBoardPkg_slv.ScoreBoardPType; + signal stim_done, mem_check_done, out_check_done, test_done : std_logic := '0'; + + -- *FUNCTION DECLARATION* + function gen_sn(input : natural) return SEQUENCENUMBER_TYPE is + variable ret : SEQUENCENUMBER_TYPE; + begin + ret(0) := (others => '0'); + ret(1) := unsigned(int(input, WORD_WIDTH)); + return ret; + end function; +begin + + -- Unit Under Test + uut : entity work.rtps_reader(arch) + generic map ( + ENTITYID => DEFAULT_READER_ENTITYID, + RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, + DURABILITY_QOS => TRANSIENT_LOCAL_DURABILITY_QOS, + HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, + HEARTBEAT_SUPPRESSION_DELAY => DURATION_ZERO, + LEASE_DURATION => DURATION_INFINITE, + WITH_KEY => TRUE, + MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS + ) + port map ( + -- SYSTEM + clk => clk, + reset => reset, + time => TIME_ZERO, + empty_user => empty_user or packet_sent_user, + rd_user => rd_user, + data_in_user => data_in_user, + last_word_in_user => last_word_in_user, + empty_meta => empty_meta or packet_sent_meta, + rd_meta => rd_meta, + data_in_meta => data_in_meta, + last_word_in_meta => last_word_in_meta, + wr_rtps => open, + full_rtps => '0', + last_word_out_rtps => open, + data_out_rtps => open, + start_hc => start_hc, + opcode_hc => opcode_hc, + ack_hc => ack_hc, + done_hc => done_hc, + ret_hc => ret_hc, + data_out_hc => data_out_hc, + valid_out_hc => valid_out_hc, + ready_out_hc => ready_out_hc, + last_word_out_hc => last_word_out_hc + ); + + stimulus_prc : process + variable RV : RandomPType; + variable e0, e1, e2, endpoint : ENDPOINT_DATA_TYPE := DEFAULT_ENDPOINT_DATA; + variable payload : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + variable sub : RTPS_SUBMESSAGE_TYPE := DEFAULT_RTPS_SUBMESSAGE; + variable cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE; + variable src_ts, life_ts : TIME_TYPE := TIME_INVALID; + + -- Wrapper to use procedure as function + impure function gen_rand_loc_2 return LOCATOR_TYPE is + variable ret : LOCATOR_TYPE := EMPTY_LOCATOR; + begin + gen_rand_loc(RV, ret); + return ret; + end function; + + impure function gen_rand_guid_prefix return GUIDPREFIX_TYPE is + variable ret : GUIDPREFIX_TYPE; + begin + ret := (0 => RV.RandSlv(WORD_WIDTH), 1 => RV.RandSlv(WORD_WIDTH), 2 => RV.RandSlv(WORD_WIDTH)); + return ret; + end function; + + procedure start_meta_test is + begin + start_meta <= '1'; + wait until rising_edge(clk); + start_meta <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure start_user_test is + begin + start_user <= '1'; + wait until rising_edge(clk); + start_user <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure push_reference(accept : in BOOLEAN) is + begin + -- NOTE: First Word represents the Response that we will return. + if (accept) then + SB_out.Push(ACCEPT_RES); + else + SB_out.Push(REJECT_RES); + end if; + for i in 0 to reference.length-1 loop + SB_out.Push(reference.last(i) & reference.data(i)); + end loop; + end procedure; + + impure function gen_payload return TEST_PACKET_TYPE is + variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + for i in 0 to RV.RandInt(1,10) loop + ret.data(ret.length) := RV.RandSlv(WORD_WIDTH); + ret.length := ret.length + 1; + end loop; + return ret; + end function; + + impure function gen_key_hash return KEY_HASH_TYPE is + variable ret : KEY_HASH_TYPE := (others => (others => '0')); + begin + for i in 0 to KEY_HASH_TYPE'length-1 loop + ret(i) := RV.RandSlv(WORD_WIDTH); + end loop; + return ret; + end function; + + procedure wait_on_meta_sent is + begin + wait until rising_edge(packet_sent_meta); + end procedure; + + procedure wait_on_user_sent is + begin + wait until rising_edge(packet_sent_user); + end procedure; + + procedure wait_on_out_check is + begin + if (out_check_done /= '1') then + wait until out_check_done = '1'; + end if; + end procedure; + + procedure wait_on_completion is + begin + if (test_done /= '1') then + wait until test_done = '1'; + end if; + end procedure; + begin + + SetAlertLogName("rtps_reader - (Transient Local, Reliable, Keyed) - Level 0 - User Traffic Handling"); + SetAlertEnable(FAILURE, TRUE); + SetAlertEnable(ERROR, TRUE); + SetAlertEnable(WARNING, TRUE); + SetLogEnable(DEBUG, FALSE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, TRUE); + RV.InitSeed(RV'instance_name); + + -- Endpoint 1 + e0 := DEFAULT_ENDPOINT_DATA; + e0.nr := 0; + e0.match := MATCH; + e0.entityid := RV.RandSlv(ENTITYID_WIDTH); + e0.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + -- Endpoint 2 + e1 := DEFAULT_ENDPOINT_DATA; + e1.nr := 1; + e1.match := MATCH; + e1.entityid := RV.RandSlv(ENTITYID_WIDTH); + e1.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + -- Endpoint 3 + e2 := DEFAULT_ENDPOINT_DATA; + e2.nr := 2; + e2.match := MATCH; + e2.entityid := RV.RandSlv(ENTITYID_WIDTH); + e2.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + + Log("Initiating Test", INFO); + stim_done <= '0'; + start_meta <= '0'; + start_user <= '0'; + reset <= '1'; + wait until rising_edge(clk); + wait until rising_edge(clk); + reset <= '0'; + + src_ts := TIME_INVALID; + life_ts := TIME_INVALID; + + -- *GENERAL SEQUENCE NUMBER HANDLING* + Log("Test General SequenceNumber Handling", INFO); + + Log("Ignore Endpoint 0 sent DATA [SN 1]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(1); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + -- NOTE: We do not wait here for the sent, to allow meta traffic being available during user traffic handling. + + Log("Insert Endpoint 0,1,2", INFO); + gen_endpoint_match_frame(e0, stimulus_meta); + gen_endpoint_match_frame(e1, stimulus_meta); + gen_endpoint_match_frame(e2, stimulus_meta); + start_meta_test; + wait_on_meta_sent; + stimulus_meta := EMPTY_TEST_PACKET; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 1]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(1); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 0 sent DATA [SN 3]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(3); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 2]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(2); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *HEARTBEAT HANDLING* + Log("Test HEARTBEAT Handling", INFO); + + Log("Endpoint 2 Heartbeat [First 11, Last 19]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(11); + sub.lastSN := gen_sn(19); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 19]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(19); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 11]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(11); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [First 5, Last 15]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(5); + sub.lastSN := gen_sn(15); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 5]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(5); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 15]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(15); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 12]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(12); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [First 15, Last 18]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(15); + sub.lastSN := gen_sn(18); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 16]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(16); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 18]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(18); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 15]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(15); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [First 19, Last 18]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(19); + sub.lastSN := gen_sn(18); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 19]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(19); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *GAP HANDLING* + Log("Test GAP Handling", INFO); + + Log("Endpoint 2 Heartbeat [GAP 1-10]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(1); + sub.gapList := (base => gen_sn(11), numBits => int(0, CDR_LONG_WIDTH), bitmap => (others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 11]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(11); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 2-10,12]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(2); + sub.gapList := (base => gen_sn(10), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 13]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 21-22]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(21); + sub.gapList := (base => gen_sn(23), numBits => int(0, CDR_LONG_WIDTH), bitmap => (others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 20]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(20); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 21-22, 24]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(21); + sub.gapList := (base => gen_sn(22), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 21]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(21); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 23]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(23); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 21-22, 24]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(21); + sub.gapList := (base => gen_sn(23), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 24]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(24); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 25]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(25); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 20-30]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(20); + sub.gapList := (base => gen_sn(31), numBits => int(1, CDR_LONG_WIDTH), bitmap => (others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 26]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(26); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 31]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(31); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *DURABILITY AND INLINE-QOS HANDLING* + Log("Test Durability and Inline-QoS Handling", INFO); + + Log("Ignore Endpoint 1 sent DATA [SN 10]", INFO); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(10); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 1 Heartbeat [First 10, Last 16]", INFO); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(10); + sub.lastSN := gen_sn(16); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 10]", INFO); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(10); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 11, Inline-QoS (Lifespan, Status Info, Key Hash)]", INFO); + src_ts := gen_duration(1,0); + life_ts := gen_duration(2,0); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(11); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 12, Inline-QoS (Invalid PID_LIFESPAN)]", INFO); + src_ts := gen_duration(1,100); + life_ts := gen_duration(2,100); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(12); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_LIFESPAN, -1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 12, Inline-QoS (Extra Bytes in PID_LIFESPAN)]", INFO); + src_ts := gen_duration(1,200); + life_ts := gen_duration(2,200); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(12); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_LIFESPAN, +1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 13, Inline-QoS (Invalid PID_STATUS_INFO)]", INFO); + src_ts := gen_duration(1,300); + life_ts := gen_duration(2,300); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_STATUS_INFO, -1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 13, Inline-QoS (Extra Bytes in PID_STATUS_INFO)]", INFO); + src_ts := gen_duration(1,400); + life_ts := gen_duration(2,400); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_STATUS_INFO, +1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 14, Inline-QoS (Invalid PID_KEY_HASH)]", INFO); + src_ts := gen_duration(1,500); + life_ts := gen_duration(2,500); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(14); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_KEY_HASH, -1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 14, Inline-QoS (Extra Bytes in PID_KEY_HASH)]", INFO); + src_ts := gen_duration(1,600); + life_ts := gen_duration(2,600); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(14); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_KEY_HASH, +1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *NON_PAYLOAD TRAFFIC HANDLING* + Log("Test Non-Payload Traffic Handling", INFO); + + Log("Accept Endpoint 1 sent DATA [SN 15, No Payload, Inline-QoS (Lifespan, Status Info, Key Hash)]", INFO); + src_ts := gen_duration(2,0); + life_ts := gen_duration(3,0); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(15); + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_DISPOSED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 16, Serialized Key, Inline-QoS (Lifespan, Status Info)]", INFO); + src_ts := gen_duration(2,500); + life_ts := gen_duration(3,500); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(16); + sub.flags(SUBMESSAGE_KEY_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.src_timestamp := src_ts; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 17, No Payload, Inline-QoS (Lifespan, Status Info)]", INFO); + src_ts := gen_duration(2,600); + life_ts := gen_duration(3,600); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(17); + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_DISPOSED; + cc.src_timestamp := src_ts; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + src_ts := TIME_INVALID; + life_ts := TIME_INVALID; + + -- *HISTORY CACHE RESPONSE HANDLING* + Log("Test History Cache Response Handling", INFO); + + Log("Accept Endpoint 0 sent DATA [SN 3, HC Reject]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(3); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(FALSE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 3]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(3); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *CONCURRENT TRAFFIC HANDLING* + Log("Test Concurrent User and Metatraffic Handling", INFO); + + Log("Unmatch Endpoint 0 and Ignore Endpoint 0 sent DATA [SN 4]", INFO); + e0.match := UNMATCH; + gen_endpoint_match_frame(e0, stimulus_meta); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(4); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user <= '1'; + start_meta <= '1'; + wait until rising_edge(clk); + start_user <= '0'; + start_meta <= '0'; + stimulus_meta := EMPTY_TEST_PACKET; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + stim_done <= '1'; + wait_on_completion; + TranscriptOpen(RESULTS_FILE, APPEND_MODE); + SetTranscriptMirror; + ReportAlerts; + TranscriptClose; + std.env.stop; + wait; + end process; + + clock_prc : process + begin + clk <= '0'; + wait for 25 ns; + clk <= '1'; + wait for 25 ns; + end process; + + empty_meta_prc : process + begin + empty_meta <= '0'; + wait until rd_meta = '1'; + wait until rising_edge(clk); + empty_meta <= '1'; + wait until rising_edge(clk); + end process; + + empty_user_prc : process + begin + empty_user <= '0'; + wait until rd_user = '1'; + wait until rising_edge(clk); + empty_user <= '1'; + wait until rising_edge(clk); + end process; + + alert_prc : process(all) + begin + if rising_edge(clk) then + alertif(empty_meta = '1' and rd_meta = '1', "Input FIFO read signal high while empty signal high (meta)", ERROR); + alertif(empty_user = '1' and rd_user = '1', "Input FIFO read signal high while empty signal high (user)", ERROR); + end if; + end process; + + input_meta_prc : process(all) + begin + data_in_meta <= stimulus_meta.data(cnt_stim_meta); + last_word_in_meta <= stimulus_meta.last(cnt_stim_meta); + + if rising_edge(clk) then + if (reset = '1') then + cnt_stim_meta <= 0; + stim_stage_meta <= IDLE; + packet_sent_meta <= '1'; + else + case (stim_stage_meta) is + when IDLE => + if (start_meta = '1' and stimulus_meta.length /= 0) then + stim_stage_meta <= BUSY; + packet_sent_meta <= '0'; + end if; + when BUSY => + if (rd_meta = '1') then + if (cnt_stim_meta = stimulus_meta.length-1) then + stim_stage_meta <= IDLE; + packet_sent_meta <= '1'; + cnt_stim_meta <= 0; + else + cnt_stim_meta <= cnt_stim_meta + 1; + end if; + end if; + end case; + end if; + end if; + end process; + + input_user_prc : process(all) + begin + data_in_user <= stimulus_user.data(cnt_stim_user); + last_word_in_user <= stimulus_user.last(cnt_stim_user); + + if rising_edge(clk) then + if (reset = '1') then + cnt_stim_user <= 0; + stim_stage_user <= IDLE; + packet_sent_user <= '1'; + else + case (stim_stage_user) is + when IDLE => + if (start_user = '1' and stimulus_user.length /= 0) then + stim_stage_user <= BUSY; + packet_sent_user <= '0'; + end if; + when BUSY => + if (rd_user = '1') then + if (cnt_stim_user = stimulus_user.length-1) then + stim_stage_user <= IDLE; + packet_sent_user <= '1'; + cnt_stim_user <= 0; + else + cnt_stim_user <= cnt_stim_user + 1; + end if; + end if; + end case; + end if; + end if; + end process; + + done_proc : process(clk) + begin + if rising_edge(clk) then + if (stim_done = '1' and SB_out.empty) then + test_done <= '1'; + else + test_done <= '0'; + end if; + end if; + end process; + + out_check_prc : process(all) + variable accept : std_logic_vector(WORD_WIDTH downto 0); + begin + if rising_edge(clk) then + case (check_stage) is + when IDLE => + ack_hc <= '0'; + done_hc <= '0'; + ready_out_hc <= '0'; + ret_hc <= ERROR; + out_check_done <= '0'; + if (start_hc = '1') then + ack_hc <= '1'; + check_stage <= CHECK; + case (opcode_hc) is + when ADD_CACHE_CHANGE => + -- Pop Response Value + SB_out.pop(accept); + when others => + Alert("Unexpected HC Opcode", ERROR); + end case; + end if; + when CHECK => + ack_hc <= '0'; + ready_out_hc <= '1'; + out_check_done <= '0'; + if (valid_out_hc = '1') then + SB_out.Check(last_word_out_hc & data_out_hc); + + if (last_word_out_hc = '1') then + ready_out_hc <= '0'; + check_stage <= RESPONSE; + end if; + end if; + when RESPONSE => + ack_hc <= '0'; + ready_out_hc <= '0'; + done_hc <= '1'; + if (accept = ACCEPT_RES) then + ret_hc <= OK; + else + ret_hc <= REJECTED; + end if; + check_stage <= IDLE; + out_check_done <= '1'; + end case; + end if; + end process; + + watchdog : process + begin + wait for 1 ms; + Alert("Test timeout", FAILURE); + std.env.stop; + end process; + +end architecture; \ No newline at end of file diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_vbk.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_vbk.vhd new file mode 100644 index 0000000..04be180 --- /dev/null +++ b/src/Tests/Level_0/L0_rtps_reader_test2_vbk.vhd @@ -0,0 +1,1289 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library osvvm; -- Utility Library +context osvvm.OsvvmContext; + +use work.rtps_package.all; +use work.user_config.all; +use work.rtps_config_package.all; +use work.rtps_test_package.all; + +-- This testbench tests the User traffic handling of the RTPS Reader. +-- The testbench checks which packets are accepted and propagated as Cache Changes to the History Cache. +-- This testbench covers following: +-- * Traffic from matched/unmatched remote Endpoint +-- * Traffic with/without prior HEARTBEAT +-- * HEARTBEAT Handling +-- * GAP Handling +-- * Inline-QoS Handling +-- * Traffic without Payload (Unregister/Dispose DDS Operations) + +entity L0_rtps_reader_test2_vbk is +end entity; + +architecture testbench of L0_rtps_reader_test2_vbk is + + -- *CONSTANT DECLARATION* + constant MAX_REMOTE_ENDPOINTS : natural := 4; + constant ACCEPT_RES : std_logic_vector(WORD_WIDTH downto 0) := (others => '0'); + constant REJECT_RES : std_logic_vector(WORD_WIDTH downto 0) := (others => '1'); + + -- *TYPE DECLARATION* + type SEND_STAGE_TYPE is (IDLE, BUSY); + type CHECK_STAGE_TYPE is (IDLE, CHECK, RESPONSE); + type TEST_RAM_TYPE is array (0 to (MAX_REMOTE_ENDPOINTS*WRITER_ENDPOINT_FRAME_SIZE_A)-1) of std_logic_vector(WORD_WIDTH-1 downto 0); + + -- *SIGNAL DECLARATION* + signal clk, empty_user, empty_meta, rd_user, rd_meta, last_word_in_user, last_word_in_meta, wr_rtps : std_logic := '0'; + signal reset : std_logic := '1'; + signal data_in_user, data_in_meta, data_out_hc : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal start_hc, ack_hc, done_hc, done_hc_delay, ready_out_hc, valid_out_hc, last_word_out_hc : std_logic := '0'; + signal opcode_hc : HISTORY_CACHE_OPCODE_TYPE := NOP; + signal ret_hc : HISTORY_CACHE_RESPONSE_TYPE := OK; + signal stim_stage_user, stim_stage_meta : SEND_STAGE_TYPE := IDLE; + signal check_stage : CHECK_STAGE_TYPE := IDLE; + shared variable stimulus_user, stimulus_meta, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + signal packet_sent_user, packet_sent_meta : std_logic := '0'; + signal cnt_stim_meta, cnt_stim_user : natural := 0; + signal start_meta, start_user : std_logic := '0'; + shared variable SB_out : osvvm.ScoreBoardPkg_slv.ScoreBoardPType; + signal stim_done, mem_check_done, out_check_done, test_done : std_logic := '0'; + + -- *FUNCTION DECLARATION* + function gen_sn(input : natural) return SEQUENCENUMBER_TYPE is + variable ret : SEQUENCENUMBER_TYPE; + begin + ret(0) := (others => '0'); + ret(1) := unsigned(int(input, WORD_WIDTH)); + return ret; + end function; +begin + + -- Unit Under Test + uut : entity work.rtps_reader(arch) + generic map ( + ENTITYID => DEFAULT_READER_ENTITYID, + RELIABILTY_QOS => BEST_EFFORT_RELIABILITY_QOS, + LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, + DURABILITY_QOS => VOLATILE_DURABILITY_QOS, + HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, + HEARTBEAT_SUPPRESSION_DELAY => DURATION_ZERO, + LEASE_DURATION => DURATION_INFINITE, + WITH_KEY => TRUE, + MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS + ) + port map ( + -- SYSTEM + clk => clk, + reset => reset, + time => TIME_ZERO, + empty_user => empty_user or packet_sent_user, + rd_user => rd_user, + data_in_user => data_in_user, + last_word_in_user => last_word_in_user, + empty_meta => empty_meta or packet_sent_meta, + rd_meta => rd_meta, + data_in_meta => data_in_meta, + last_word_in_meta => last_word_in_meta, + wr_rtps => wr_rtps, + full_rtps => '0', + last_word_out_rtps => open, + data_out_rtps => open, + start_hc => start_hc, + opcode_hc => opcode_hc, + ack_hc => ack_hc, + done_hc => done_hc, + ret_hc => ret_hc, + data_out_hc => data_out_hc, + valid_out_hc => valid_out_hc, + ready_out_hc => ready_out_hc, + last_word_out_hc => last_word_out_hc + ); + + stimulus_prc : process + variable RV : RandomPType; + variable e0, e1, e2, endpoint : ENDPOINT_DATA_TYPE := DEFAULT_ENDPOINT_DATA; + variable payload : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + variable sub : RTPS_SUBMESSAGE_TYPE := DEFAULT_RTPS_SUBMESSAGE; + variable cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE; + variable src_ts, life_ts : TIME_TYPE := TIME_INVALID; + + -- Wrapper to use procedure as function + impure function gen_rand_loc_2 return LOCATOR_TYPE is + variable ret : LOCATOR_TYPE := EMPTY_LOCATOR; + begin + gen_rand_loc(RV, ret); + return ret; + end function; + + impure function gen_rand_guid_prefix return GUIDPREFIX_TYPE is + variable ret : GUIDPREFIX_TYPE; + begin + ret := (0 => RV.RandSlv(WORD_WIDTH), 1 => RV.RandSlv(WORD_WIDTH), 2 => RV.RandSlv(WORD_WIDTH)); + return ret; + end function; + + procedure start_meta_test is + begin + start_meta <= '1'; + wait until rising_edge(clk); + start_meta <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure start_user_test is + begin + start_user <= '1'; + wait until rising_edge(clk); + start_user <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure push_reference(accept : in BOOLEAN) is + begin + -- NOTE: First Word represents the Response that we will return. + if (accept) then + SB_out.Push(ACCEPT_RES); + else + SB_out.Push(REJECT_RES); + end if; + for i in 0 to reference.length-1 loop + SB_out.Push(reference.last(i) & reference.data(i)); + end loop; + end procedure; + + impure function gen_payload return TEST_PACKET_TYPE is + variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + for i in 0 to RV.RandInt(1,10) loop + ret.data(ret.length) := RV.RandSlv(WORD_WIDTH); + ret.length := ret.length + 1; + end loop; + return ret; + end function; + + impure function gen_key_hash return KEY_HASH_TYPE is + variable ret : KEY_HASH_TYPE := (others => (others => '0')); + begin + for i in 0 to KEY_HASH_TYPE'length-1 loop + ret(i) := RV.RandSlv(WORD_WIDTH); + end loop; + return ret; + end function; + + procedure wait_on_meta_sent is + begin + wait until rising_edge(packet_sent_meta); + end procedure; + + procedure wait_on_user_sent is + begin + wait until rising_edge(packet_sent_user); + end procedure; + + procedure wait_on_out_check is + begin + if (out_check_done /= '1') then + wait until out_check_done = '1'; + end if; + end procedure; + + procedure wait_on_completion is + begin + if (test_done /= '1') then + wait until test_done = '1'; + end if; + end procedure; + begin + + SetAlertLogName("rtps_reader - (Volatile, Best Effort, Keyed) - Level 0 - User Traffic Handling"); + SetAlertEnable(FAILURE, TRUE); + SetAlertEnable(ERROR, TRUE); + SetAlertEnable(WARNING, TRUE); + SetLogEnable(DEBUG, FALSE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, TRUE); + RV.InitSeed(RV'instance_name); + + -- Endpoint 1 + e0 := DEFAULT_ENDPOINT_DATA; + e0.nr := 0; + e0.match := MATCH; + e0.entityid := RV.RandSlv(ENTITYID_WIDTH); + e0.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + -- Endpoint 2 + e1 := DEFAULT_ENDPOINT_DATA; + e1.nr := 1; + e1.match := MATCH; + e1.entityid := RV.RandSlv(ENTITYID_WIDTH); + e1.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + -- Endpoint 3 + e2 := DEFAULT_ENDPOINT_DATA; + e2.nr := 2; + e2.match := MATCH; + e2.entityid := RV.RandSlv(ENTITYID_WIDTH); + e2.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + + Log("Initiating Test", INFO); + stim_done <= '0'; + start_meta <= '0'; + start_user <= '0'; + reset <= '1'; + wait until rising_edge(clk); + wait until rising_edge(clk); + reset <= '0'; + + src_ts := TIME_INVALID; + life_ts := TIME_INVALID; + + -- *GENERAL SEQUENCE NUMBER HANDLING* + Log("Test General SequenceNumber Handling", INFO); + + Log("Ignore Endpoint 0 sent DATA [SN 1]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(1); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + -- NOTE: We do not wait here for the sent, to allow meta traffic being available during user traffic handling. + + Log("Insert Endpoint 0,1,2", INFO); + gen_endpoint_match_frame(e0, stimulus_meta); + gen_endpoint_match_frame(e1, stimulus_meta); + gen_endpoint_match_frame(e2, stimulus_meta); + start_meta_test; + wait_on_meta_sent; + stimulus_meta := EMPTY_TEST_PACKET; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 1]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(1); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 0 sent DATA [SN 1]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(1); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 3]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(3); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 0 sent DATA [SN 2]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(2); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *HEARTBEAT HANDLING* + Log("Test HEARTBEAT Handling", INFO); + + Log("Endpoint 2 Heartbeat [First 2, Last 11]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(2); + sub.lastSN := gen_sn(11); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 2]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(2); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 11]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(11); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [First 5, Last 13]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(5); + sub.lastSN := gen_sn(13); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 5]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(5); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 13]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 12]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(12); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [First 15, Last 18]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(15); + sub.lastSN := gen_sn(18); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 18]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(18); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 15]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(15); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [First 19, Last 18]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(19); + sub.lastSN := gen_sn(18); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 19]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(19); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *GAP HANDLING* + Log("Test GAP Handling", INFO); + + Log("Endpoint 2 Heartbeat [GAP 1-10]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(1); + sub.gapList := (base => gen_sn(11), numBits => int(0, CDR_LONG_WIDTH), bitmap => (others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 11]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(11); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 2-10,12]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(2); + sub.gapList := (base => gen_sn(10), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 13]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 21-22]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(21); + sub.gapList := (base => gen_sn(23), numBits => int(0, CDR_LONG_WIDTH), bitmap => (others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 20]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(20); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 21-22, 24]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(21); + sub.gapList := (base => gen_sn(22), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 21]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(21); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 23]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(23); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 21-22, 24]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(21); + sub.gapList := (base => gen_sn(23), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 24]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(24); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 25]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(25); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 20-30]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(20); + sub.gapList := (base => gen_sn(31), numBits => int(1, CDR_LONG_WIDTH), bitmap => (others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 26]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(26); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 31]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(31); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *DURABILITY AND INLINE-QOS HANDLING* + Log("Test Durability and Inline-QoS Handling", INFO); + + Log("Accept Endpoint 1 sent DATA [SN 10]", INFO); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(10); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 11, Inline-QoS (Lifespan, Status Info, Key Hash)]", INFO); + src_ts := gen_duration(1,0); + life_ts := gen_duration(2,0); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(11); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 12, Inline-QoS (Invalid PID_LIFESPAN)]", INFO); + src_ts := gen_duration(1,100); + life_ts := gen_duration(2,100); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(12); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_LIFESPAN, -1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 12, Inline-QoS (Extra Bytes in PID_LIFESPAN)]", INFO); + src_ts := gen_duration(1,200); + life_ts := gen_duration(2,200); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(12); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_LIFESPAN, +1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 13, Inline-QoS (Invalid PID_STATUS_INFO)]", INFO); + src_ts := gen_duration(1,300); + life_ts := gen_duration(2,300); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_STATUS_INFO, -1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 13, Inline-QoS (Extra Bytes in PID_STATUS_INFO)]", INFO); + src_ts := gen_duration(1,400); + life_ts := gen_duration(2,400); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_STATUS_INFO, +1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 14, Inline-QoS (Invalid PID_KEY_HASH)]", INFO); + src_ts := gen_duration(1,500); + life_ts := gen_duration(2,500); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(14); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_KEY_HASH, -1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 14, Inline-QoS (Extra Bytes in PID_KEY_HASH)]", INFO); + src_ts := gen_duration(1,600); + life_ts := gen_duration(2,600); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(14); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_KEY_HASH, +1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *NON_PAYLOAD TRAFFIC HANDLING* + Log("Test Non-Payload Traffic Handling", INFO); + + Log("Accept Endpoint 1 sent DATA [SN 15, No Payload, Inline-QoS (Lifespan, Status Info, Key Hash)]", INFO); + src_ts := gen_duration(2,0); + life_ts := gen_duration(3,0); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(15); + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_DISPOSED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 16, Serialized Key, Inline-QoS (Lifespan, Status Info)]", INFO); + src_ts := gen_duration(2,500); + life_ts := gen_duration(3,500); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(16); + sub.flags(SUBMESSAGE_KEY_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.src_timestamp := src_ts; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 17, No Payload, Inline-QoS (Lifespan, Status Info)]", INFO); + src_ts := gen_duration(2,600); + life_ts := gen_duration(3,600); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(17); + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_DISPOSED; + cc.src_timestamp := src_ts; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + src_ts := TIME_INVALID; + life_ts := TIME_INVALID; + + -- *HISTORY CACHE RESPONSE HANDLING* + Log("Test History Cache Response Handling", INFO); + + Log("Accept Endpoint 0 sent DATA [SN 4, HC Reject]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(4); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(FALSE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 4]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(4); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *CONCURRENT TRAFFIC HANDLING* + Log("Test Concurrent User and Metatraffic Handling", INFO); + + Log("Unmatch Endpoint 0 and Ignore Endpoint 0 sent DATA [SN 5]", INFO); + e0.match := UNMATCH; + gen_endpoint_match_frame(e0, stimulus_meta); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(5); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user <= '1'; + start_meta <= '1'; + wait until rising_edge(clk); + start_user <= '0'; + start_meta <= '0'; + stimulus_meta := EMPTY_TEST_PACKET; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + stim_done <= '1'; + wait_on_completion; + TranscriptOpen(RESULTS_FILE, APPEND_MODE); + SetTranscriptMirror; + ReportAlerts; + TranscriptClose; + std.env.stop; + wait; + end process; + + clock_prc : process + begin + clk <= '0'; + wait for 25 ns; + clk <= '1'; + wait for 25 ns; + end process; + + empty_meta_prc : process + begin + empty_meta <= '0'; + wait until rd_meta = '1'; + wait until rising_edge(clk); + empty_meta <= '1'; + wait until rising_edge(clk); + end process; + + empty_user_prc : process + begin + empty_user <= '0'; + wait until rd_user = '1'; + wait until rising_edge(clk); + empty_user <= '1'; + wait until rising_edge(clk); + end process; + + alert_prc : process(all) + begin + if rising_edge(clk) then + alertif(empty_meta = '1' and rd_meta = '1', "Input FIFO read signal high while empty signal high (meta)", ERROR); + alertif(empty_user = '1' and rd_user = '1', "Input FIFO read signal high while empty signal high (user)", ERROR); + alertif(wr_rtps = '1', "Best Effort Reader has RTPS output", ERROR); + end if; + end process; + + input_meta_prc : process(all) + begin + data_in_meta <= stimulus_meta.data(cnt_stim_meta); + last_word_in_meta <= stimulus_meta.last(cnt_stim_meta); + + if rising_edge(clk) then + if (reset = '1') then + cnt_stim_meta <= 0; + stim_stage_meta <= IDLE; + packet_sent_meta <= '1'; + else + case (stim_stage_meta) is + when IDLE => + if (start_meta = '1' and stimulus_meta.length /= 0) then + stim_stage_meta <= BUSY; + packet_sent_meta <= '0'; + end if; + when BUSY => + if (rd_meta = '1') then + if (cnt_stim_meta = stimulus_meta.length-1) then + stim_stage_meta <= IDLE; + packet_sent_meta <= '1'; + cnt_stim_meta <= 0; + else + cnt_stim_meta <= cnt_stim_meta + 1; + end if; + end if; + end case; + end if; + end if; + end process; + + input_user_prc : process(all) + begin + data_in_user <= stimulus_user.data(cnt_stim_user); + last_word_in_user <= stimulus_user.last(cnt_stim_user); + + if rising_edge(clk) then + if (reset = '1') then + cnt_stim_user <= 0; + stim_stage_user <= IDLE; + packet_sent_user <= '1'; + else + case (stim_stage_user) is + when IDLE => + if (start_user = '1' and stimulus_user.length /= 0) then + stim_stage_user <= BUSY; + packet_sent_user <= '0'; + end if; + when BUSY => + if (rd_user = '1') then + if (cnt_stim_user = stimulus_user.length-1) then + stim_stage_user <= IDLE; + packet_sent_user <= '1'; + cnt_stim_user <= 0; + else + cnt_stim_user <= cnt_stim_user + 1; + end if; + end if; + end case; + end if; + end if; + end process; + + done_proc : process(clk) + begin + if rising_edge(clk) then + if (stim_done = '1' and SB_out.empty) then + test_done <= '1'; + else + test_done <= '0'; + end if; + end if; + end process; + + out_check_prc : process(all) + variable accept : std_logic_vector(WORD_WIDTH downto 0); + begin + if rising_edge(clk) then + case (check_stage) is + when IDLE => + ack_hc <= '0'; + done_hc <= '0'; + ready_out_hc <= '0'; + ret_hc <= ERROR; + out_check_done <= '0'; + if (start_hc = '1') then + ack_hc <= '1'; + check_stage <= CHECK; + case (opcode_hc) is + when ADD_CACHE_CHANGE => + -- Pop Response Value + SB_out.pop(accept); + when others => + Alert("Unexpected HC Opcode", ERROR); + end case; + end if; + when CHECK => + ack_hc <= '0'; + ready_out_hc <= '1'; + out_check_done <= '0'; + if (valid_out_hc = '1') then + SB_out.Check(last_word_out_hc & data_out_hc); + + if (last_word_out_hc = '1') then + ready_out_hc <= '0'; + check_stage <= RESPONSE; + end if; + end if; + when RESPONSE => + ack_hc <= '0'; + ready_out_hc <= '0'; + done_hc <= '1'; + if (accept = ACCEPT_RES) then + ret_hc <= OK; + else + ret_hc <= REJECTED; + end if; + check_stage <= IDLE; + out_check_done <= '1'; + end case; + end if; + end process; + + watchdog : process + begin + wait for 1 ms; + Alert("Test timeout", FAILURE); + std.env.stop; + end process; + +end architecture; \ No newline at end of file diff --git a/src/Tests/Level_0/L0_rtps_reader_test2.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_vrk.vhd similarity index 94% rename from src/Tests/Level_0/L0_rtps_reader_test2.vhd rename to src/Tests/Level_0/L0_rtps_reader_test2_vrk.vhd index f8778c0..a31a876 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test2.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test2_vrk.vhd @@ -10,7 +10,7 @@ use work.user_config.all; use work.rtps_config_package.all; use work.rtps_test_package.all; --- This testbench tests the User traffic handling of the RTPS Reader (Volatile, Reliable, With Key). +-- This testbench tests the User traffic handling of the RTPS Reader. -- The testbench checks which packets are accepted and propagated as Cache Changes to the History Cache. -- This testbench covers following: -- * Traffic from matched/unmatched remote Endpoint @@ -20,10 +20,10 @@ use work.rtps_test_package.all; -- * Inline-QoS Handling -- * Traffic without Payload (Unregister/Dispose DDS Operations) -entity L0_rtps_reader_test2 is +entity L0_rtps_reader_test2_vrk is end entity; -architecture testbench of L0_rtps_reader_test2 is +architecture testbench of L0_rtps_reader_test2_vrk is -- *CONSTANT DECLARATION* constant MAX_REMOTE_ENDPOINTS : natural := 4; @@ -79,7 +79,7 @@ begin clk => clk, reset => reset, time => TIME_ZERO, - empty_user => empty_meta or packet_sent_user, + empty_user => empty_user or packet_sent_user, rd_user => rd_user, data_in_user => data_in_user, last_word_in_user => last_word_in_user, @@ -198,7 +198,7 @@ begin end procedure; begin - SetAlertLogName("rtps_reader - Level 0 - User Traffic Handling"); + SetAlertLogName("rtps_reader - (Volatile, Reliable, Keyed) - Level 0 - User Traffic Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -475,7 +475,7 @@ begin stimulus_user := EMPTY_TEST_PACKET; reference := EMPTY_TEST_PACKET; - Log("Ignore Endpoint 2 sent DATA [SN 16]", INFO); + Log("Ignore Endpoint 2 sent DATA [SN 18]", INFO); endpoint := e2; sub := DEFAULT_RTPS_SUBMESSAGE; sub.submessageID := SID_DATA; @@ -1023,7 +1023,7 @@ begin sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; sub.data := gen_payload; cc := gen_cache_change(sub); - cc.kind := NOT_ALIVE_DISPOSED; + cc.kind := NOT_ALIVE_UNREGISTERED; cc.src_timestamp := src_ts; gen_inline_qos(cc, life_ts, sub.inlineQos); gen_sentinel(sub.inlineQos); @@ -1036,10 +1036,75 @@ begin stimulus_user := EMPTY_TEST_PACKET; reference := EMPTY_TEST_PACKET; + Log("Ignore Endpoint 1 sent DATA [SN 17, No Payload, Inline-QoS (Lifespan, Status Info)]", INFO); + src_ts := gen_duration(2,600); + life_ts := gen_duration(3,600); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(17); + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_DISPOSED; + cc.src_timestamp := src_ts; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + src_ts := TIME_INVALID; + life_ts := TIME_INVALID; + + -- *HISTORY CACHE RESPONSE HANDLING* + Log("Test History Cache Response Handling", INFO); + + Log("Accept Endpoint 0 sent DATA [SN 3, HC Reject]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(3); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(FALSE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 3]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(3); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + -- *CONCURRENT TRAFFIC HANDLING* Log("Test Concurrent User and Metatraffic Handling", INFO); - Log("Unmatch Endpoint 0 and Ignore Endpoint 0 sent DATA [SN 3]", INFO); + Log("Unmatch Endpoint 0 and Ignore Endpoint 0 sent DATA [SN 4]", INFO); e0.match := UNMATCH; gen_endpoint_match_frame(e0, stimulus_meta); endpoint := e0; @@ -1047,7 +1112,7 @@ begin sub.submessageID := SID_DATA; sub.writerId := endpoint.entityid; sub.readerId := DEFAULT_READER_ENTITYID; - sub.writerSN := gen_sn(1); + sub.writerSN := gen_sn(4); sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; sub.data := gen_payload; gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); @@ -1081,7 +1146,6 @@ begin empty_meta_prc : process begin empty_meta <= '0'; - wait; -- TODO: Remove wait until rd_meta = '1'; wait until rising_edge(clk); empty_meta <= '1'; @@ -1091,7 +1155,6 @@ begin empty_user_prc : process begin empty_user <= '0'; - wait; -- TODO: Remove wait until rd_user = '1'; wait until rising_edge(clk); empty_user <= '1'; diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_vrn.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_vrn.vhd new file mode 100644 index 0000000..d227c62 --- /dev/null +++ b/src/Tests/Level_0/L0_rtps_reader_test2_vrn.vhd @@ -0,0 +1,1312 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library osvvm; -- Utility Library +context osvvm.OsvvmContext; + +use work.rtps_package.all; +use work.user_config.all; +use work.rtps_config_package.all; +use work.rtps_test_package.all; + +-- This testbench tests the User traffic handling of the RTPS Reader. +-- The testbench checks which packets are accepted and propagated as Cache Changes to the History Cache. +-- This testbench covers following: +-- * Traffic from matched/unmatched remote Endpoint +-- * Traffic with/without prior HEARTBEAT +-- * HEARTBEAT Handling +-- * GAP Handling +-- * Inline-QoS Handling +-- * Traffic without Payload (Unregister/Dispose DDS Operations) + +entity L0_rtps_reader_test2_vrn is +end entity; + +architecture testbench of L0_rtps_reader_test2_vrn is + + -- *CONSTANT DECLARATION* + constant MAX_REMOTE_ENDPOINTS : natural := 4; + constant ACCEPT_RES : std_logic_vector(WORD_WIDTH downto 0) := (others => '0'); + constant REJECT_RES : std_logic_vector(WORD_WIDTH downto 0) := (others => '1'); + + -- *TYPE DECLARATION* + type SEND_STAGE_TYPE is (IDLE, BUSY); + type CHECK_STAGE_TYPE is (IDLE, CHECK, RESPONSE); + type TEST_RAM_TYPE is array (0 to (MAX_REMOTE_ENDPOINTS*WRITER_ENDPOINT_FRAME_SIZE_A)-1) of std_logic_vector(WORD_WIDTH-1 downto 0); + + -- *SIGNAL DECLARATION* + signal clk, empty_user, empty_meta, rd_user, rd_meta, last_word_in_user, last_word_in_meta : std_logic := '0'; + signal reset : std_logic := '1'; + signal data_in_user, data_in_meta, data_out_hc : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal start_hc, ack_hc, done_hc, done_hc_delay, ready_out_hc, valid_out_hc, last_word_out_hc : std_logic := '0'; + signal opcode_hc : HISTORY_CACHE_OPCODE_TYPE := NOP; + signal ret_hc : HISTORY_CACHE_RESPONSE_TYPE := OK; + signal stim_stage_user, stim_stage_meta : SEND_STAGE_TYPE := IDLE; + signal check_stage : CHECK_STAGE_TYPE := IDLE; + shared variable stimulus_user, stimulus_meta, reference : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + signal packet_sent_user, packet_sent_meta : std_logic := '0'; + signal cnt_stim_meta, cnt_stim_user : natural := 0; + signal start_meta, start_user : std_logic := '0'; + shared variable SB_out : osvvm.ScoreBoardPkg_slv.ScoreBoardPType; + signal stim_done, mem_check_done, out_check_done, test_done : std_logic := '0'; + + -- *FUNCTION DECLARATION* + function gen_sn(input : natural) return SEQUENCENUMBER_TYPE is + variable ret : SEQUENCENUMBER_TYPE; + begin + ret(0) := (others => '0'); + ret(1) := unsigned(int(input, WORD_WIDTH)); + return ret; + end function; +begin + + -- Unit Under Test + uut : entity work.rtps_reader(arch) + generic map ( + ENTITYID => DEFAULT_READER_ENTITYID, + RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, + DURABILITY_QOS => VOLATILE_DURABILITY_QOS, + HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, + HEARTBEAT_SUPPRESSION_DELAY => DURATION_ZERO, + LEASE_DURATION => DURATION_INFINITE, + WITH_KEY => FALSE, + MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS + ) + port map ( + -- SYSTEM + clk => clk, + reset => reset, + time => TIME_ZERO, + empty_user => empty_user or packet_sent_user, + rd_user => rd_user, + data_in_user => data_in_user, + last_word_in_user => last_word_in_user, + empty_meta => empty_meta or packet_sent_meta, + rd_meta => rd_meta, + data_in_meta => data_in_meta, + last_word_in_meta => last_word_in_meta, + wr_rtps => open, + full_rtps => '0', + last_word_out_rtps => open, + data_out_rtps => open, + start_hc => start_hc, + opcode_hc => opcode_hc, + ack_hc => ack_hc, + done_hc => done_hc, + ret_hc => ret_hc, + data_out_hc => data_out_hc, + valid_out_hc => valid_out_hc, + ready_out_hc => ready_out_hc, + last_word_out_hc => last_word_out_hc + ); + + stimulus_prc : process + variable RV : RandomPType; + variable e0, e1, e2, endpoint : ENDPOINT_DATA_TYPE := DEFAULT_ENDPOINT_DATA; + variable payload : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + variable sub : RTPS_SUBMESSAGE_TYPE := DEFAULT_RTPS_SUBMESSAGE; + variable cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE; + variable src_ts, life_ts : TIME_TYPE := TIME_INVALID; + + -- Wrapper to use procedure as function + impure function gen_rand_loc_2 return LOCATOR_TYPE is + variable ret : LOCATOR_TYPE := EMPTY_LOCATOR; + begin + gen_rand_loc(RV, ret); + return ret; + end function; + + impure function gen_rand_guid_prefix return GUIDPREFIX_TYPE is + variable ret : GUIDPREFIX_TYPE; + begin + ret := (0 => RV.RandSlv(WORD_WIDTH), 1 => RV.RandSlv(WORD_WIDTH), 2 => RV.RandSlv(WORD_WIDTH)); + return ret; + end function; + + procedure start_meta_test is + begin + start_meta <= '1'; + wait until rising_edge(clk); + start_meta <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure start_user_test is + begin + start_user <= '1'; + wait until rising_edge(clk); + start_user <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure push_reference(accept : in BOOLEAN) is + begin + -- NOTE: First Word represents the Response that we will return. + if (accept) then + SB_out.Push(ACCEPT_RES); + else + SB_out.Push(REJECT_RES); + end if; + for i in 0 to reference.length-1 loop + SB_out.Push(reference.last(i) & reference.data(i)); + end loop; + end procedure; + + impure function gen_payload return TEST_PACKET_TYPE is + variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + for i in 0 to RV.RandInt(1,10) loop + ret.data(ret.length) := RV.RandSlv(WORD_WIDTH); + ret.length := ret.length + 1; + end loop; + return ret; + end function; + + impure function gen_key_hash return KEY_HASH_TYPE is + variable ret : KEY_HASH_TYPE := (others => (others => '0')); + begin + for i in 0 to KEY_HASH_TYPE'length-1 loop + ret(i) := RV.RandSlv(WORD_WIDTH); + end loop; + return ret; + end function; + + procedure wait_on_meta_sent is + begin + wait until rising_edge(packet_sent_meta); + end procedure; + + procedure wait_on_user_sent is + begin + wait until rising_edge(packet_sent_user); + end procedure; + + procedure wait_on_out_check is + begin + if (out_check_done /= '1') then + wait until out_check_done = '1'; + end if; + end procedure; + + procedure wait_on_completion is + begin + if (test_done /= '1') then + wait until test_done = '1'; + end if; + end procedure; + begin + + SetAlertLogName("rtps_reader - (Volatile, Reliable, Non Keyed) - Level 0 - User Traffic Handling"); + SetAlertEnable(FAILURE, TRUE); + SetAlertEnable(ERROR, TRUE); + SetAlertEnable(WARNING, TRUE); + SetLogEnable(DEBUG, FALSE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, TRUE); + RV.InitSeed(RV'instance_name); + + -- Endpoint 1 + e0 := DEFAULT_ENDPOINT_DATA; + e0.nr := 0; + e0.match := MATCH; + e0.entityid := RV.RandSlv(ENTITYID_WIDTH); + e0.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + -- Endpoint 2 + e1 := DEFAULT_ENDPOINT_DATA; + e1.nr := 1; + e1.match := MATCH; + e1.entityid := RV.RandSlv(ENTITYID_WIDTH); + e1.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + -- Endpoint 3 + e2 := DEFAULT_ENDPOINT_DATA; + e2.nr := 2; + e2.match := MATCH; + e2.entityid := RV.RandSlv(ENTITYID_WIDTH); + e2.unicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR)); + + Log("Initiating Test", INFO); + stim_done <= '0'; + start_meta <= '0'; + start_user <= '0'; + reset <= '1'; + wait until rising_edge(clk); + wait until rising_edge(clk); + reset <= '0'; + + src_ts := TIME_INVALID; + life_ts := TIME_INVALID; + + -- *GENERAL SEQUENCE NUMBER HANDLING* + Log("Test General SequenceNumber Handling", INFO); + + Log("Ignore Endpoint 0 sent DATA [SN 1]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(1); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + -- NOTE: We do not wait here for the sent, to allow meta traffic being available during user traffic handling. + + Log("Insert Endpoint 0,1,2", INFO); + gen_endpoint_match_frame(e0, stimulus_meta); + gen_endpoint_match_frame(e1, stimulus_meta); + gen_endpoint_match_frame(e2, stimulus_meta); + start_meta_test; + wait_on_meta_sent; + stimulus_meta := EMPTY_TEST_PACKET; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 1]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(1); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 0 sent DATA [SN 1]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(1); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 0 sent DATA [SN 3]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(3); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 2]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(2); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *HEARTBEAT HANDLING* + Log("Test HEARTBEAT Handling", INFO); + + Log("Endpoint 2 Heartbeat [First 2, Last 11]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(2); + sub.lastSN := gen_sn(11); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 2]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(2); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 11]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(11); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [First 5, Last 15]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(5); + sub.lastSN := gen_sn(15); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 5]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(5); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 15]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(15); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 12]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(12); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [First 15, Last 18]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(15); + sub.lastSN := gen_sn(18); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 16]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(16); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 18]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(18); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 15]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(15); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [First 19, Last 18]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_HEARTBEAT; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.firstSN := gen_sn(19); + sub.lastSN := gen_sn(18); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 19]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(19); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *GAP HANDLING* + Log("Test GAP Handling", INFO); + + Log("Endpoint 2 Heartbeat [GAP 1-10]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(1); + sub.gapList := (base => gen_sn(11), numBits => int(0, CDR_LONG_WIDTH), bitmap => (others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 11]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(11); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 2-10,12]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(2); + sub.gapList := (base => gen_sn(10), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 13]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 21-22]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(21); + sub.gapList := (base => gen_sn(23), numBits => int(0, CDR_LONG_WIDTH), bitmap => (others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 20]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(20); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 21-22, 24]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(21); + sub.gapList := (base => gen_sn(22), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 21]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(21); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 23]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(23); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 21-22, 24]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(21); + sub.gapList := (base => gen_sn(23), numBits => int(3, CDR_LONG_WIDTH), bitmap => (0 => '1', 2 => '1', others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 24]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(24); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 25]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(25); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Endpoint 2 Heartbeat [GAP 20-30]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_GAP; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.gapStart := gen_sn(20); + sub.gapList := (base => gen_sn(31), numBits => int(1, CDR_LONG_WIDTH), bitmap => (others => '0')); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 2 sent DATA [SN 26]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(26); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 2 sent DATA [SN 31]", INFO); + endpoint := e2; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(31); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *DURABILITY AND INLINE-QOS HANDLING* + Log("Test Durability and Inline-QoS Handling", INFO); + + Log("Accept Endpoint 1 sent DATA [SN 10]", INFO); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(10); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); -- No key Hash due to WITH_KEY=FALSE + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 11, Inline-QoS (Lifespan, Status Info, Key Hash)]", INFO); + src_ts := gen_duration(1,0); + life_ts := gen_duration(2,0); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(11); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc.instance := HANDLE_NIL; -- No key Hash due to WITH_KEY=FALSE + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 12, Inline-QoS (Invalid PID_LIFESPAN)]", INFO); + src_ts := gen_duration(1,100); + life_ts := gen_duration(2,100); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(12); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_LIFESPAN, -1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 12, Inline-QoS (Extra Bytes in PID_LIFESPAN)]", INFO); + src_ts := gen_duration(1,200); + life_ts := gen_duration(2,200); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(12); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_LIFESPAN, +1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc.instance := HANDLE_NIL; -- No key Hash due to WITH_KEY=FALSE + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 13, Inline-QoS (Invalid PID_STATUS_INFO)]", INFO); + src_ts := gen_duration(1,300); + life_ts := gen_duration(2,300); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_STATUS_INFO, -1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 13, Inline-QoS (Extra Bytes in PID_STATUS_INFO)]", INFO); + src_ts := gen_duration(1,400); + life_ts := gen_duration(2,400); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(13); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_STATUS_INFO, +1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc.instance := HANDLE_NIL; -- No key Hash due to WITH_KEY=FALSE + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Ignore Endpoint 1 sent DATA [SN 14, Inline-QoS (Invalid PID_KEY_HASH)]", INFO); + src_ts := gen_duration(1,500); + life_ts := gen_duration(2,500); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(14); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_KEY_HASH, -1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user_test; + wait_on_user_sent; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 14, Inline-QoS (Extra Bytes in PID_KEY_HASH)]", INFO); + src_ts := gen_duration(1,600); + life_ts := gen_duration(2,600); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(14); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos, PID_KEY_HASH, +1); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc.instance := HANDLE_NIL; -- No key Hash due to WITH_KEY=FALSE + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *NON_PAYLOAD TRAFFIC HANDLING* + Log("Test Non-Payload Traffic Handling", INFO); + + Log("Accept Endpoint 1 sent DATA [SN 15, No Payload, Inline-QoS (Lifespan, Status Info, Key Hash)]", INFO); + src_ts := gen_duration(2,0); + life_ts := gen_duration(3,0); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(15); + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_DISPOSED; + cc.src_timestamp := src_ts; + cc.instance := gen_key_hash; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc.instance := HANDLE_NIL; -- No key Hash due to WITH_KEY=FALSE + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 16, Serialized Key, Inline-QoS (Lifespan, Status Info)]", INFO); + src_ts := gen_duration(2,500); + life_ts := gen_duration(3,500); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(16); + sub.flags(SUBMESSAGE_KEY_FLAG_POS) := '1'; + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + sub.data := gen_payload; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.src_timestamp := src_ts; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc.payload := EMPTY_TEST_PACKET; -- No payload due to WITH_KEY=FALSE + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + --wait_on_out_check; -- Output is done before sent is done + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 1 sent DATA [SN 17, No Payload, Inline-QoS (Lifespan, Status Info)]", INFO); + src_ts := gen_duration(2,600); + life_ts := gen_duration(3,600); + endpoint := e1; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(17); + sub.flags(SUBMESSAGE_INLINE_QOS_FLAG_POS) := '1'; + cc := gen_cache_change(sub); + cc.kind := NOT_ALIVE_DISPOSED; + cc.src_timestamp := src_ts; + gen_inline_qos(cc, life_ts, sub.inlineQos); + gen_sentinel(sub.inlineQos); + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + gen_add_cache_change_dds(cc, life_ts, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + src_ts := TIME_INVALID; + life_ts := TIME_INVALID; + + -- *HISTORY CACHE RESPONSE HANDLING* + Log("Test History Cache Response Handling", INFO); + + Log("Accept Endpoint 0 sent DATA [SN 3, HC Reject]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(3); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(FALSE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + Log("Accept Endpoint 0 sent DATA [SN 3]", INFO); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(3); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + cc := gen_cache_change(sub); + gen_add_cache_change_dds(cc, TIME_INVALID, endpoint.nr, reference); + push_reference(TRUE); + start_user_test; + wait_on_user_sent; + wait_on_out_check; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + -- *CONCURRENT TRAFFIC HANDLING* + Log("Test Concurrent User and Metatraffic Handling", INFO); + + Log("Unmatch Endpoint 0 and Ignore Endpoint 0 sent DATA [SN 4]", INFO); + e0.match := UNMATCH; + gen_endpoint_match_frame(e0, stimulus_meta); + endpoint := e0; + sub := DEFAULT_RTPS_SUBMESSAGE; + sub.submessageID := SID_DATA; + sub.writerId := endpoint.entityid; + sub.readerId := DEFAULT_READER_ENTITYID; + sub.writerSN := gen_sn(4); + sub.flags(SUBMESSAGE_DATA_FLAG_POS) := '1'; + sub.data := gen_payload; + gen_rtps_handler_out(sub, get_loc(endpoint), FALSE, src_ts, endpoint.participant.guidPrefix, stimulus_user); + start_user <= '1'; + start_meta <= '1'; + wait until rising_edge(clk); + start_user <= '0'; + start_meta <= '0'; + stimulus_meta := EMPTY_TEST_PACKET; + stimulus_user := EMPTY_TEST_PACKET; + reference := EMPTY_TEST_PACKET; + + stim_done <= '1'; + wait_on_completion; + TranscriptOpen(RESULTS_FILE, APPEND_MODE); + SetTranscriptMirror; + ReportAlerts; + TranscriptClose; + std.env.stop; + wait; + end process; + + clock_prc : process + begin + clk <= '0'; + wait for 25 ns; + clk <= '1'; + wait for 25 ns; + end process; + + empty_meta_prc : process + begin + empty_meta <= '0'; + wait until rd_meta = '1'; + wait until rising_edge(clk); + empty_meta <= '1'; + wait until rising_edge(clk); + end process; + + empty_user_prc : process + begin + empty_user <= '0'; + wait until rd_user = '1'; + wait until rising_edge(clk); + empty_user <= '1'; + wait until rising_edge(clk); + end process; + + alert_prc : process(all) + begin + if rising_edge(clk) then + alertif(empty_meta = '1' and rd_meta = '1', "Input FIFO read signal high while empty signal high (meta)", ERROR); + alertif(empty_user = '1' and rd_user = '1', "Input FIFO read signal high while empty signal high (user)", ERROR); + end if; + end process; + + input_meta_prc : process(all) + begin + data_in_meta <= stimulus_meta.data(cnt_stim_meta); + last_word_in_meta <= stimulus_meta.last(cnt_stim_meta); + + if rising_edge(clk) then + if (reset = '1') then + cnt_stim_meta <= 0; + stim_stage_meta <= IDLE; + packet_sent_meta <= '1'; + else + case (stim_stage_meta) is + when IDLE => + if (start_meta = '1' and stimulus_meta.length /= 0) then + stim_stage_meta <= BUSY; + packet_sent_meta <= '0'; + end if; + when BUSY => + if (rd_meta = '1') then + if (cnt_stim_meta = stimulus_meta.length-1) then + stim_stage_meta <= IDLE; + packet_sent_meta <= '1'; + cnt_stim_meta <= 0; + else + cnt_stim_meta <= cnt_stim_meta + 1; + end if; + end if; + end case; + end if; + end if; + end process; + + input_user_prc : process(all) + begin + data_in_user <= stimulus_user.data(cnt_stim_user); + last_word_in_user <= stimulus_user.last(cnt_stim_user); + + if rising_edge(clk) then + if (reset = '1') then + cnt_stim_user <= 0; + stim_stage_user <= IDLE; + packet_sent_user <= '1'; + else + case (stim_stage_user) is + when IDLE => + if (start_user = '1' and stimulus_user.length /= 0) then + stim_stage_user <= BUSY; + packet_sent_user <= '0'; + end if; + when BUSY => + if (rd_user = '1') then + if (cnt_stim_user = stimulus_user.length-1) then + stim_stage_user <= IDLE; + packet_sent_user <= '1'; + cnt_stim_user <= 0; + else + cnt_stim_user <= cnt_stim_user + 1; + end if; + end if; + end case; + end if; + end if; + end process; + + done_proc : process(clk) + begin + if rising_edge(clk) then + if (stim_done = '1' and SB_out.empty) then + test_done <= '1'; + else + test_done <= '0'; + end if; + end if; + end process; + + out_check_prc : process(all) + variable accept : std_logic_vector(WORD_WIDTH downto 0); + begin + if rising_edge(clk) then + case (check_stage) is + when IDLE => + ack_hc <= '0'; + done_hc <= '0'; + ready_out_hc <= '0'; + ret_hc <= ERROR; + out_check_done <= '0'; + if (start_hc = '1') then + ack_hc <= '1'; + check_stage <= CHECK; + case (opcode_hc) is + when ADD_CACHE_CHANGE => + -- Pop Response Value + SB_out.pop(accept); + when others => + Alert("Unexpected HC Opcode", ERROR); + end case; + end if; + when CHECK => + ack_hc <= '0'; + ready_out_hc <= '1'; + out_check_done <= '0'; + if (valid_out_hc = '1') then + SB_out.Check(last_word_out_hc & data_out_hc); + + if (last_word_out_hc = '1') then + ready_out_hc <= '0'; + check_stage <= RESPONSE; + end if; + end if; + when RESPONSE => + ack_hc <= '0'; + ready_out_hc <= '0'; + done_hc <= '1'; + if (accept = ACCEPT_RES) then + ret_hc <= OK; + else + ret_hc <= REJECTED; + end if; + check_stage <= IDLE; + out_check_done <= '1'; + end case; + end if; + end process; + + watchdog : process + begin + wait for 1 ms; + Alert("Test timeout", FAILURE); + std.env.stop; + end process; + +end architecture; \ No newline at end of file diff --git a/src/rtps_reader.vhd b/src/rtps_reader.vhd index 593b2bb..a115f66 100644 --- a/src/rtps_reader.vhd +++ b/src/rtps_reader.vhd @@ -1236,7 +1236,7 @@ begin when 0 => valid_out_hc <= '1'; data_out_hc <= status_info; - data_out_hc(SSI_KEY_HASH_FLAG) <= key_hash_rcvd; + data_out_hc(SSI_KEY_HASH_FLAG) <= key_hash_rcvd when WITH_KEY; data_out_hc(SSI_PAYLOAD_FLAG) <= data_flag; -- Output Guard if (ready_out_hc = '1') then @@ -1398,6 +1398,7 @@ begin when 0 => mem_op_start <= '1'; mem_opcode <= GET_NEXT_ENDPOINT; + mem_field_flags <= EMF_LEASE_DEADLINE_FLAG or EMF_RES_TIME_FLAG; cnt_next <= 1; -- Check Endpoint when 1 =>