From bac011905aef7422ace5284fb25ae4a38b7d33ed Mon Sep 17 00:00:00 2001 From: Greek Date: Sun, 11 Apr 2021 16:39:17 +0200 Subject: [PATCH] Add Test 1 of DDS Reader Test RTPS Operations ADD_CACHE_CHANGE, and REMOVE_WRITER of DDS Reader. Port changes and code refoctoring in DDS Writer. --- sim/L0_dds_reader_test1_abzkriu.do | 193 ++ sim/L0_dds_reader_test1_arzkriu.do | 191 ++ sim/L0_dds_reader_test1_arzksiu.do | 192 ++ sim/L0_dds_reader_test1_arznriu.do | 170 ++ sim/L0_dds_reader_test1_lbzkriu.do | 193 ++ sim/L0_dds_reader_test1_lrzkriu.do | 193 ++ src/REF.txt | 7 + src/TODO.txt | 27 +- .../Level_0/L0_dds_reader_test1_abzkriu.vhd | 1436 +++++++++++++ .../Level_0/L0_dds_reader_test1_arzkriu.vhd | 1445 +++++++++++++ .../Level_0/L0_dds_reader_test1_arzksiu.vhd | 1440 +++++++++++++ .../Level_0/L0_dds_reader_test1_arznriu.vhd | 995 +++++++++ .../Level_0/L0_dds_reader_test1_lbzkriu.vhd | 1435 +++++++++++++ .../Level_0/L0_dds_reader_test1_lrzkriu.vhd | 1436 +++++++++++++ src/Tests/Level_0/L0_dds_writer_test1_afk.vhd | 1840 ++++++++-------- src/Tests/Level_0/L0_dds_writer_test1_aik.vhd | 1856 +++++++++-------- src/Tests/Level_0/L0_dds_writer_test1_ain.vhd | 801 ++++--- src/Tests/Level_0/L0_dds_writer_test1_lik.vhd | 1564 +++++++------- src/Tests/Level_0/L0_dds_writer_test2_aik.vhd | 276 ++- src/Tests/Level_0/L0_dds_writer_test3_aik.vhd | 331 ++- src/Tests/Level_0/L0_dds_writer_test3_ain.vhd | 266 ++- src/Tests/Level_0/L0_dds_writer_test4_aik.vhd | 304 ++- src/Tests/Level_0/L0_dds_writer_test5_afk.vhd | 342 ++- src/Tests/Level_0/dds_reader_tests.txt | 57 + src/Tests/Level_0/dds_writer_tests.txt | 2 +- src/Tests/testbench.pro | 17 +- src/dds_reader.vhd | 1483 +++++++------ src/dds_writer.vhd | 497 +++-- src/rtps_builtin_endpoint.vhd | 3 +- src/rtps_package.vhd | 20 + src/rtps_test_package.vhd | 539 ++++- 31 files changed, 14810 insertions(+), 4741 deletions(-) create mode 100644 sim/L0_dds_reader_test1_abzkriu.do create mode 100644 sim/L0_dds_reader_test1_arzkriu.do create mode 100644 sim/L0_dds_reader_test1_arzksiu.do create mode 100644 sim/L0_dds_reader_test1_arznriu.do create mode 100644 sim/L0_dds_reader_test1_lbzkriu.do create mode 100644 sim/L0_dds_reader_test1_lrzkriu.do create mode 100644 src/Tests/Level_0/L0_dds_reader_test1_abzkriu.vhd create mode 100644 src/Tests/Level_0/L0_dds_reader_test1_arzkriu.vhd create mode 100644 src/Tests/Level_0/L0_dds_reader_test1_arzksiu.vhd create mode 100644 src/Tests/Level_0/L0_dds_reader_test1_arznriu.vhd create mode 100644 src/Tests/Level_0/L0_dds_reader_test1_lbzkriu.vhd create mode 100644 src/Tests/Level_0/L0_dds_reader_test1_lrzkriu.vhd create mode 100644 src/Tests/Level_0/dds_reader_tests.txt diff --git a/sim/L0_dds_reader_test1_abzkriu.do b/sim/L0_dds_reader_test1_abzkriu.do new file mode 100644 index 0000000..7b247cc --- /dev/null +++ b/sim/L0_dds_reader_test1_abzkriu.do @@ -0,0 +1,193 @@ +onerror {resume} +radix define DDS_RETCODE { + "10#0#" "RETCODE_OK", + "10#1#" "RETCODE_ERROR", + "10#2#" "RETCODE_UNSUPPORTED", + "10#3#" "RETCODE_BAD_PARAMETER", + "10#4#" "RETCODE_PRECONDITION_NOT_MET", + "10#5#" "RETCODE_OUT_OF_RESOURCES", + "10#6#" "RETCODE_NOT_ENABLED", + "10#7#" "RETCODE_IMMUTABLE_POLICY", + "10#8#" "RETCODE_INCONSISTENT_POLICY", + "10#9#" "RETCODE_ALREADY_DELETED", + "10#10#" "RETCODE_TIMEOUT", + "10#11#" "RETCODE_NO_DATA", + "10#12#" "RETCODE_ILLEGAL_OPERATION", + -default unsigned +} +radix define SAMPLE_STATE { + "16#00000001#" "READ_SAMPLE_STATE", + "16#00000002#" "NOT_READ_SAMPLE_STATE", + -default binary +} +radix define VIEW_STATE { + "16#00000001#" "NEW_VIEW_STATE", + "16#00000002#" "NOT_NEW_VIEW_STATE", + -default binary +} +radix define INSTANCE_STATE { + "16#00000001#" "ALIVE_INSTANCE_STATE", + "16#00000002#" "NOT_ALIVE_DISPOSED_INSTANCE_STATE", + "16#00000004#" "NOT_ALIVE_NO_WRITERS_INSTANCE_STATE", + -default binary +} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider SYSTEM +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/clk +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/reset +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/time +add wave -noupdate -divider RTPS +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_abzkriu/uut/start_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_abzkriu/uut/opcode_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_abzkriu/uut/ack_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_abzkriu/uut/ret_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_abzkriu/uut/done_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_abzkriu/uut/ready_in_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_abzkriu/uut/valid_in_rtps +add wave -noupdate -expand -group RTPS -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/data_in_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_abzkriu/uut/last_word_in_rtps +add wave -noupdate -divider DDS +add wave -noupdate -group DDS /l0_dds_reader_test1_abzkriu/uut/start_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_abzkriu/uut/ack_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_abzkriu/uut/opcode_dds +add wave -noupdate -group DDS -radix SAMPLE_STATE /l0_dds_reader_test1_abzkriu/uut/sample_state_dds +add wave -noupdate -group DDS -radix INSTANCE_STATE /l0_dds_reader_test1_abzkriu/uut/instance_state_dds +add wave -noupdate -group DDS -radix VIEW_STATE /l0_dds_reader_test1_abzkriu/uut/view_state_dds +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/instance_handle_dds +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_abzkriu/uut/max_samples_dds +add wave -noupdate -group DDS -radix DDS_RETCODE /l0_dds_reader_test1_abzkriu/uut/return_code_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_abzkriu/uut/done_dds +add wave -noupdate -group DDS -divider SI +add wave -noupdate -group DDS -radix SAMPLE_STATE /l0_dds_reader_test1_abzkriu/uut/si_sample_state +add wave -noupdate -group DDS -radix VIEW_STATE /l0_dds_reader_test1_abzkriu/uut/si_view_state +add wave -noupdate -group DDS -radix INSTANCE_STATE /l0_dds_reader_test1_abzkriu/uut/si_instance_state +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_abzkriu/uut/si_source_timestamp +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/si_instance_handle +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/si_publication_handle +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_abzkriu/uut/si_disposed_generation_count +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_abzkriu/uut/si_no_writers_generation_count +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_abzkriu/uut/si_sample_rank +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_abzkriu/uut/si_generation_rank +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_abzkriu/uut/si_absolute_generation_rank +add wave -noupdate -group DDS /l0_dds_reader_test1_abzkriu/uut/si_valid_data +add wave -noupdate -group DDS /l0_dds_reader_test1_abzkriu/uut/si_valid +add wave -noupdate -group DDS /l0_dds_reader_test1_abzkriu/uut/si_last +add wave -noupdate -group DDS /l0_dds_reader_test1_abzkriu/uut/get_data_dds +add wave -noupdate -group DDS -divider OUTPUT +add wave -noupdate -group DDS /l0_dds_reader_test1_abzkriu/uut/ready_out_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_abzkriu/uut/valid_out_dds +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/data_out_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_abzkriu/uut/last_word_out_dds +add wave -noupdate -divider {MAIN FSM} +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/stage +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/stage_next +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/cnt +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/remove_oldest_sample +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/remove_oldest_inst_sample +add wave -noupdate -divider MEMORY +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_abzkriu/uut/sample_abort_read +add wave -noupdate -group {SAMPLE MEM} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/sample_mem_ctrl_inst/addr +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_abzkriu/uut/sample_mem_ctrl_inst/read +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_abzkriu/uut/sample_mem_ctrl_inst/ready_in +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_abzkriu/uut/sample_mem_ctrl_inst/valid_in +add wave -noupdate -group {SAMPLE MEM} -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/sample_mem_ctrl_inst/data_in +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_abzkriu/uut/sample_mem_ctrl_inst/ready_out +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_abzkriu/uut/sample_mem_ctrl_inst/valid_out +add wave -noupdate -group {SAMPLE MEM} -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/sample_mem_ctrl_inst/data_out +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_abzkriu/uut/payload_abort_read +add wave -noupdate -group {PAYLOAD MEM} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/payload_mem_ctrl_inst/addr +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_abzkriu/uut/payload_mem_ctrl_inst/read +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_abzkriu/uut/payload_mem_ctrl_inst/ready_in +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_abzkriu/uut/payload_mem_ctrl_inst/valid_in +add wave -noupdate -group {PAYLOAD MEM} -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/payload_mem_ctrl_inst/data_in +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_abzkriu/uut/payload_mem_ctrl_inst/ready_out +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_abzkriu/uut/payload_mem_ctrl_inst/valid_out +add wave -noupdate -group {PAYLOAD MEM} -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/payload_mem_ctrl_inst/data_out +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_abzkriu/uut/inst_abort_read +add wave -noupdate -group {INSTANCE MEM} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/addr +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_abzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/read +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_abzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/ready_in +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_abzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/valid_in +add wave -noupdate -group {INSTANCE MEM} -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/data_in +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_abzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/ready_out +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_abzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/valid_out +add wave -noupdate -group {INSTANCE MEM} -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/data_out +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/inst_op_start +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/inst_opcode +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/inst_op_done +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/inst_stage +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/inst_stage_next +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/inst_cnt +add wave -noupdate -radix unsigned /l0_dds_reader_test1_abzkriu/uut/inst_addr_base +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/inst_mem_fields +add wave -noupdate -childformat {{/l0_dds_reader_test1_abzkriu/uut/inst_data.key_hash -radix hexadecimal} {/l0_dds_reader_test1_abzkriu/uut/inst_data.status_info -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.sample_cnt -radix unsigned} {/l0_dds_reader_test1_abzkriu/uut/inst_data.disposed_gen_cnt -radix unsigned} {/l0_dds_reader_test1_abzkriu/uut/inst_data.no_writers_gen_cnt -radix unsigned} {/l0_dds_reader_test1_abzkriu/uut/inst_data.ignore_deadline -radix unsigned} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap -radix binary -childformat {{/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0) -radix binary -childformat {{/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}}}}} -subitemconfig {/l0_dds_reader_test1_abzkriu/uut/inst_data.key_hash {-height 15 -radix hexadecimal} /l0_dds_reader_test1_abzkriu/uut/inst_data.status_info {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.sample_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_abzkriu/uut/inst_data.disposed_gen_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_abzkriu/uut/inst_data.no_writers_gen_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_abzkriu/uut/inst_data.ignore_deadline {-height 15 -radix unsigned} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap {-height 15 -radix binary -childformat {{/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0) -radix binary -childformat {{/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}}}} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0) {-height 15 -radix binary -childformat {{/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(0) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(1) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(2) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(3) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(4) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(5) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(6) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(7) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(8) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(9) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(10) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(11) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(12) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(13) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(14) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(15) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(16) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(17) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(18) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(19) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(20) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(21) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(22) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(23) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(24) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(25) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(26) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(27) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(28) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(29) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(30) {-height 15 -radix binary} /l0_dds_reader_test1_abzkriu/uut/inst_data.writer_bitmap(0)(31) {-height 15 -radix binary}} /l0_dds_reader_test1_abzkriu/uut/inst_data +add wave -noupdate -radix unsigned /l0_dds_reader_test1_abzkriu/uut/inst_next_addr_base +add wave -noupdate -radix unsigned /l0_dds_reader_test1_abzkriu/uut/inst_prev_addr_base +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/current_imf +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/stale_inst_cnt +add wave -noupdate -divider POINTERS +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/empty_sample_list_head +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/empty_sample_list_tail +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/empty_payload_list_head +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/oldest_sample +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/newest_sample +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/inst_empty_head +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/inst_occupied_head +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/cur_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/next_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/prev_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/cur_payload +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/next_payload +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/cur_inst +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_abzkriu/uut/next_inst +add wave -noupdate -divider TESTBENCH +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_abzkriu/dds_start +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_abzkriu/dds_stage +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_abzkriu/dds_cnt +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_abzkriu/dds_cnt2 +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_abzkriu/dds_done +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_abzkriu/rtps_start +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_abzkriu/rtps_stage +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_abzkriu/rtps_cnt +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_abzkriu/rtps_done +add wave -noupdate -divider {KEY HOLDER} +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_abzkriu/uut/start_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_abzkriu/uut/opcode_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_abzkriu/uut/ack_kh +add wave -noupdate -group {KEY HOLDER} -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/data_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_abzkriu/uut/valid_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_abzkriu/uut/ready_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_abzkriu/uut/last_word_in_kh +add wave -noupdate -group {KEY HOLDER} -radix hexadecimal /l0_dds_reader_test1_abzkriu/uut/data_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_abzkriu/uut/valid_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_abzkriu/uut/ready_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_abzkriu/uut/last_word_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_abzkriu/uut/abort_kh +add wave -noupdate -divider MISC +add wave -noupdate -radix unsigned /l0_dds_reader_test1_abzkriu/uut/first_sample +add wave -noupdate -radix unsigned /l0_dds_reader_test1_abzkriu/uut/collection_cnt +add wave -noupdate -radix unsigned /l0_dds_reader_test1_abzkriu/uut/collection_cnt_max +add wave -noupdate -radix unsigned /l0_dds_reader_test1_abzkriu/uut/collection_generation_rank +add wave -noupdate -radix unsigned /l0_dds_reader_test1_abzkriu/uut/cur_generation_rank +add wave -noupdate -radix unsigned /l0_dds_reader_test1_abzkriu/uut/second_sample +add wave -noupdate -radix unsigned /l0_dds_reader_test1_abzkriu/uut/max_samples_latch +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/single_instance +add wave -noupdate /l0_dds_reader_test1_abzkriu/uut/is_take +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {84445758 ps} 0} {{Cursor 2} {84374419 ps} 1} +quietly wave cursor active 2 +configure wave -namecolwidth 187 +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 {83726685 ps} {84727326 ps} diff --git a/sim/L0_dds_reader_test1_arzkriu.do b/sim/L0_dds_reader_test1_arzkriu.do new file mode 100644 index 0000000..b45ff88 --- /dev/null +++ b/sim/L0_dds_reader_test1_arzkriu.do @@ -0,0 +1,191 @@ +onerror {resume} +radix define DDS_RETCODE { + "10#0#" "RETCODE_OK", + "10#1#" "RETCODE_ERROR", + "10#2#" "RETCODE_UNSUPPORTED", + "10#3#" "RETCODE_BAD_PARAMETER", + "10#4#" "RETCODE_PRECONDITION_NOT_MET", + "10#5#" "RETCODE_OUT_OF_RESOURCES", + "10#6#" "RETCODE_NOT_ENABLED", + "10#7#" "RETCODE_IMMUTABLE_POLICY", + "10#8#" "RETCODE_INCONSISTENT_POLICY", + "10#9#" "RETCODE_ALREADY_DELETED", + "10#10#" "RETCODE_TIMEOUT", + "10#11#" "RETCODE_NO_DATA", + "10#12#" "RETCODE_ILLEGAL_OPERATION", + -default unsigned +} +radix define SAMPLE_STATE { + "16#00000001#" "READ_SAMPLE_STATE", + "16#00000002#" "NOT_READ_SAMPLE_STATE", + -default binary +} +radix define VIEW_STATE { + "16#00000001#" "NEW_VIEW_STATE", + "16#00000002#" "NOT_NEW_VIEW_STATE", + -default binary +} +radix define INSTANCE_STATE { + "16#00000001#" "ALIVE_INSTANCE_STATE", + "16#00000002#" "NOT_ALIVE_DISPOSED_INSTANCE_STATE", + "16#00000004#" "NOT_ALIVE_NO_WRITERS_INSTANCE_STATE", + -default binary +} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider SYSTEM +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/clk +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/reset +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/time +add wave -noupdate -divider RTPS +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzkriu/uut/start_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzkriu/uut/opcode_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzkriu/uut/ack_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzkriu/uut/ret_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzkriu/uut/done_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzkriu/uut/ready_in_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzkriu/uut/valid_in_rtps +add wave -noupdate -expand -group RTPS -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/data_in_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzkriu/uut/last_word_in_rtps +add wave -noupdate -divider DDS +add wave -noupdate -group DDS /l0_dds_reader_test1_arzkriu/uut/start_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arzkriu/uut/ack_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arzkriu/uut/opcode_dds +add wave -noupdate -group DDS -radix SAMPLE_STATE /l0_dds_reader_test1_arzkriu/uut/sample_state_dds +add wave -noupdate -group DDS -radix INSTANCE_STATE /l0_dds_reader_test1_arzkriu/uut/instance_state_dds +add wave -noupdate -group DDS -radix VIEW_STATE /l0_dds_reader_test1_arzkriu/uut/view_state_dds +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/instance_handle_dds +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzkriu/uut/max_samples_dds +add wave -noupdate -group DDS -radix DDS_RETCODE /l0_dds_reader_test1_arzkriu/uut/return_code_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arzkriu/uut/done_dds +add wave -noupdate -group DDS -divider SI +add wave -noupdate -group DDS -radix SAMPLE_STATE /l0_dds_reader_test1_arzkriu/uut/si_sample_state +add wave -noupdate -group DDS -radix VIEW_STATE /l0_dds_reader_test1_arzkriu/uut/si_view_state +add wave -noupdate -group DDS -radix INSTANCE_STATE /l0_dds_reader_test1_arzkriu/uut/si_instance_state +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzkriu/uut/si_source_timestamp +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/si_instance_handle +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/si_publication_handle +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzkriu/uut/si_disposed_generation_count +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzkriu/uut/si_no_writers_generation_count +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzkriu/uut/si_sample_rank +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzkriu/uut/si_generation_rank +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzkriu/uut/si_absolute_generation_rank +add wave -noupdate -group DDS /l0_dds_reader_test1_arzkriu/uut/si_valid_data +add wave -noupdate -group DDS /l0_dds_reader_test1_arzkriu/uut/si_valid +add wave -noupdate -group DDS /l0_dds_reader_test1_arzkriu/uut/si_last +add wave -noupdate -group DDS /l0_dds_reader_test1_arzkriu/uut/get_data_dds +add wave -noupdate -group DDS -divider OUTPUT +add wave -noupdate -group DDS /l0_dds_reader_test1_arzkriu/uut/ready_out_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arzkriu/uut/valid_out_dds +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/data_out_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arzkriu/uut/last_word_out_dds +add wave -noupdate -divider {MAIN FSM} +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/stage +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/stage_next +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/cnt +add wave -noupdate -divider MEMORY +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_arzkriu/uut/sample_abort_read +add wave -noupdate -group {SAMPLE MEM} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/sample_mem_ctrl_inst/addr +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_arzkriu/uut/sample_mem_ctrl_inst/read +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_arzkriu/uut/sample_mem_ctrl_inst/ready_in +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_arzkriu/uut/sample_mem_ctrl_inst/valid_in +add wave -noupdate -group {SAMPLE MEM} -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/sample_mem_ctrl_inst/data_in +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_arzkriu/uut/sample_mem_ctrl_inst/ready_out +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_arzkriu/uut/sample_mem_ctrl_inst/valid_out +add wave -noupdate -group {SAMPLE MEM} -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/sample_mem_ctrl_inst/data_out +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arzkriu/uut/payload_abort_read +add wave -noupdate -group {PAYLOAD MEM} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/payload_mem_ctrl_inst/addr +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arzkriu/uut/payload_mem_ctrl_inst/read +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arzkriu/uut/payload_mem_ctrl_inst/ready_in +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arzkriu/uut/payload_mem_ctrl_inst/valid_in +add wave -noupdate -group {PAYLOAD MEM} -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/payload_mem_ctrl_inst/data_in +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arzkriu/uut/payload_mem_ctrl_inst/ready_out +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arzkriu/uut/payload_mem_ctrl_inst/valid_out +add wave -noupdate -group {PAYLOAD MEM} -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/payload_mem_ctrl_inst/data_out +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_arzkriu/uut/inst_abort_read +add wave -noupdate -group {INSTANCE MEM} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/addr +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_arzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/read +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_arzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/ready_in +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_arzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/valid_in +add wave -noupdate -group {INSTANCE MEM} -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/data_in +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_arzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/ready_out +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_arzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/valid_out +add wave -noupdate -group {INSTANCE MEM} -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/data_out +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/inst_op_start +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/inst_opcode +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/inst_op_done +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/inst_stage +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/inst_stage_next +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/inst_cnt +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzkriu/uut/inst_addr_base +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/inst_mem_fields +add wave -noupdate -childformat {{/l0_dds_reader_test1_arzkriu/uut/inst_data.key_hash -radix hexadecimal} {/l0_dds_reader_test1_arzkriu/uut/inst_data.status_info -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.sample_cnt -radix unsigned} {/l0_dds_reader_test1_arzkriu/uut/inst_data.disposed_gen_cnt -radix unsigned} {/l0_dds_reader_test1_arzkriu/uut/inst_data.no_writers_gen_cnt -radix unsigned} {/l0_dds_reader_test1_arzkriu/uut/inst_data.ignore_deadline -radix unsigned} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap -radix binary -childformat {{/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0) -radix binary -childformat {{/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}}}}} -subitemconfig {/l0_dds_reader_test1_arzkriu/uut/inst_data.key_hash {-height 15 -radix hexadecimal} /l0_dds_reader_test1_arzkriu/uut/inst_data.status_info {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.sample_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_arzkriu/uut/inst_data.disposed_gen_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_arzkriu/uut/inst_data.no_writers_gen_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_arzkriu/uut/inst_data.ignore_deadline {-height 15 -radix unsigned} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap {-height 15 -radix binary -childformat {{/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0) -radix binary -childformat {{/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}}}} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0) {-height 15 -radix binary -childformat {{/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(0) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(1) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(2) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(3) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(4) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(5) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(6) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(7) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(8) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(9) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(10) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(11) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(12) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(13) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(14) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(15) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(16) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(17) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(18) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(19) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(20) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(21) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(22) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(23) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(24) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(25) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(26) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(27) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(28) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(29) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(30) {-height 15 -radix binary} /l0_dds_reader_test1_arzkriu/uut/inst_data.writer_bitmap(0)(31) {-height 15 -radix binary}} /l0_dds_reader_test1_arzkriu/uut/inst_data +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzkriu/uut/inst_next_addr_base +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzkriu/uut/inst_prev_addr_base +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/current_imf +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/stale_inst_cnt +add wave -noupdate -divider POINTERS +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/empty_sample_list_head +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/empty_sample_list_tail +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/empty_payload_list_head +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/oldest_sample +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/newest_sample +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/inst_empty_head +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/inst_occupied_head +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/cur_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/next_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/prev_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/cur_payload +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/next_payload +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/cur_inst +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzkriu/uut/next_inst +add wave -noupdate -divider TESTBENCH +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzkriu/dds_start +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzkriu/dds_stage +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzkriu/dds_cnt +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzkriu/dds_cnt2 +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzkriu/dds_done +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzkriu/rtps_start +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzkriu/rtps_stage +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzkriu/rtps_cnt +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzkriu/rtps_done +add wave -noupdate -divider {KEY HOLDER} +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzkriu/uut/start_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzkriu/uut/opcode_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzkriu/uut/ack_kh +add wave -noupdate -group {KEY HOLDER} -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/data_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzkriu/uut/valid_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzkriu/uut/ready_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzkriu/uut/last_word_in_kh +add wave -noupdate -group {KEY HOLDER} -radix hexadecimal /l0_dds_reader_test1_arzkriu/uut/data_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzkriu/uut/valid_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzkriu/uut/ready_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzkriu/uut/last_word_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzkriu/uut/abort_kh +add wave -noupdate -divider MISC +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzkriu/uut/first_sample +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzkriu/uut/collection_cnt +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzkriu/uut/collection_cnt_max +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzkriu/uut/collection_generation_rank +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzkriu/uut/cur_generation_rank +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzkriu/uut/second_sample +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzkriu/uut/max_samples_latch +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/single_instance +add wave -noupdate /l0_dds_reader_test1_arzkriu/uut/is_take +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {114324883 ps} 0} {{Cursor 2} {115175000 ps} 1} +quietly wave cursor active 1 +configure wave -namecolwidth 187 +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 {114169578 ps} {115170219 ps} diff --git a/sim/L0_dds_reader_test1_arzksiu.do b/sim/L0_dds_reader_test1_arzksiu.do new file mode 100644 index 0000000..90d3c8e --- /dev/null +++ b/sim/L0_dds_reader_test1_arzksiu.do @@ -0,0 +1,192 @@ +onerror {resume} +radix define DDS_RETCODE { + "10#0#" "RETCODE_OK", + "10#1#" "RETCODE_ERROR", + "10#2#" "RETCODE_UNSUPPORTED", + "10#3#" "RETCODE_BAD_PARAMETER", + "10#4#" "RETCODE_PRECONDITION_NOT_MET", + "10#5#" "RETCODE_OUT_OF_RESOURCES", + "10#6#" "RETCODE_NOT_ENABLED", + "10#7#" "RETCODE_IMMUTABLE_POLICY", + "10#8#" "RETCODE_INCONSISTENT_POLICY", + "10#9#" "RETCODE_ALREADY_DELETED", + "10#10#" "RETCODE_TIMEOUT", + "10#11#" "RETCODE_NO_DATA", + "10#12#" "RETCODE_ILLEGAL_OPERATION", + -default unsigned +} +radix define SAMPLE_STATE { + "16#00000001#" "READ_SAMPLE_STATE", + "16#00000002#" "NOT_READ_SAMPLE_STATE", + -default binary +} +radix define VIEW_STATE { + "16#00000001#" "NEW_VIEW_STATE", + "16#00000002#" "NOT_NEW_VIEW_STATE", + -default binary +} +radix define INSTANCE_STATE { + "16#00000001#" "ALIVE_INSTANCE_STATE", + "16#00000002#" "NOT_ALIVE_DISPOSED_INSTANCE_STATE", + "16#00000004#" "NOT_ALIVE_NO_WRITERS_INSTANCE_STATE", + -default binary +} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider SYSTEM +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/clk +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/reset +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzksiu/uut/time +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzksiu/uut/last_read_ts +add wave -noupdate -divider RTPS +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzksiu/uut/start_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzksiu/uut/opcode_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzksiu/uut/ack_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzksiu/uut/ret_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzksiu/uut/done_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzksiu/uut/ready_in_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzksiu/uut/valid_in_rtps +add wave -noupdate -expand -group RTPS -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/data_in_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arzksiu/uut/last_word_in_rtps +add wave -noupdate -divider DDS +add wave -noupdate -group DDS /l0_dds_reader_test1_arzksiu/uut/start_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arzksiu/uut/ack_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arzksiu/uut/opcode_dds +add wave -noupdate -group DDS -radix SAMPLE_STATE /l0_dds_reader_test1_arzksiu/uut/sample_state_dds +add wave -noupdate -group DDS -radix INSTANCE_STATE /l0_dds_reader_test1_arzksiu/uut/instance_state_dds +add wave -noupdate -group DDS -radix VIEW_STATE /l0_dds_reader_test1_arzksiu/uut/view_state_dds +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/instance_handle_dds +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzksiu/uut/max_samples_dds +add wave -noupdate -group DDS -radix DDS_RETCODE /l0_dds_reader_test1_arzksiu/uut/return_code_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arzksiu/uut/done_dds +add wave -noupdate -group DDS -divider SI +add wave -noupdate -group DDS -radix SAMPLE_STATE /l0_dds_reader_test1_arzksiu/uut/si_sample_state +add wave -noupdate -group DDS -radix VIEW_STATE /l0_dds_reader_test1_arzksiu/uut/si_view_state +add wave -noupdate -group DDS -radix INSTANCE_STATE /l0_dds_reader_test1_arzksiu/uut/si_instance_state +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzksiu/uut/si_source_timestamp +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/si_instance_handle +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/si_publication_handle +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzksiu/uut/si_disposed_generation_count +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzksiu/uut/si_no_writers_generation_count +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzksiu/uut/si_sample_rank +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzksiu/uut/si_generation_rank +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arzksiu/uut/si_absolute_generation_rank +add wave -noupdate -group DDS /l0_dds_reader_test1_arzksiu/uut/si_valid_data +add wave -noupdate -group DDS /l0_dds_reader_test1_arzksiu/uut/si_valid +add wave -noupdate -group DDS /l0_dds_reader_test1_arzksiu/uut/si_last +add wave -noupdate -group DDS /l0_dds_reader_test1_arzksiu/uut/get_data_dds +add wave -noupdate -group DDS -divider OUTPUT +add wave -noupdate -group DDS /l0_dds_reader_test1_arzksiu/uut/ready_out_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arzksiu/uut/valid_out_dds +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/data_out_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arzksiu/uut/last_word_out_dds +add wave -noupdate -divider {MAIN FSM} +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/stage +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/stage_next +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/cnt +add wave -noupdate -divider MEMORY +add wave -noupdate -expand -group {SAMPLE MEM} /l0_dds_reader_test1_arzksiu/uut/sample_abort_read +add wave -noupdate -expand -group {SAMPLE MEM} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/sample_mem_ctrl_inst/addr +add wave -noupdate -expand -group {SAMPLE MEM} /l0_dds_reader_test1_arzksiu/uut/sample_mem_ctrl_inst/read +add wave -noupdate -expand -group {SAMPLE MEM} /l0_dds_reader_test1_arzksiu/uut/sample_mem_ctrl_inst/ready_in +add wave -noupdate -expand -group {SAMPLE MEM} /l0_dds_reader_test1_arzksiu/uut/sample_mem_ctrl_inst/valid_in +add wave -noupdate -expand -group {SAMPLE MEM} -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/sample_mem_ctrl_inst/data_in +add wave -noupdate -expand -group {SAMPLE MEM} /l0_dds_reader_test1_arzksiu/uut/sample_mem_ctrl_inst/ready_out +add wave -noupdate -expand -group {SAMPLE MEM} /l0_dds_reader_test1_arzksiu/uut/sample_mem_ctrl_inst/valid_out +add wave -noupdate -expand -group {SAMPLE MEM} -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/sample_mem_ctrl_inst/data_out +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arzksiu/uut/payload_abort_read +add wave -noupdate -group {PAYLOAD MEM} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/payload_mem_ctrl_inst/addr +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arzksiu/uut/payload_mem_ctrl_inst/read +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arzksiu/uut/payload_mem_ctrl_inst/ready_in +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arzksiu/uut/payload_mem_ctrl_inst/valid_in +add wave -noupdate -group {PAYLOAD MEM} -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/payload_mem_ctrl_inst/data_in +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arzksiu/uut/payload_mem_ctrl_inst/ready_out +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arzksiu/uut/payload_mem_ctrl_inst/valid_out +add wave -noupdate -group {PAYLOAD MEM} -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/payload_mem_ctrl_inst/data_out +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_arzksiu/uut/inst_abort_read +add wave -noupdate -group {INSTANCE MEM} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/addr +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_arzksiu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/read +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_arzksiu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/ready_in +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_arzksiu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/valid_in +add wave -noupdate -group {INSTANCE MEM} -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/data_in +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_arzksiu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/ready_out +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_arzksiu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/valid_out +add wave -noupdate -group {INSTANCE MEM} -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/data_out +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/inst_op_start +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/inst_opcode +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/inst_op_done +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/inst_stage +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/inst_stage_next +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/inst_cnt +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzksiu/uut/inst_addr_base +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/inst_mem_fields +add wave -noupdate -childformat {{/l0_dds_reader_test1_arzksiu/uut/inst_data.key_hash -radix hexadecimal} {/l0_dds_reader_test1_arzksiu/uut/inst_data.status_info -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.sample_cnt -radix unsigned} {/l0_dds_reader_test1_arzksiu/uut/inst_data.disposed_gen_cnt -radix unsigned} {/l0_dds_reader_test1_arzksiu/uut/inst_data.no_writers_gen_cnt -radix unsigned} {/l0_dds_reader_test1_arzksiu/uut/inst_data.ignore_deadline -radix unsigned} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap -radix binary -childformat {{/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0) -radix binary -childformat {{/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}}}}} -subitemconfig {/l0_dds_reader_test1_arzksiu/uut/inst_data.key_hash {-height 15 -radix hexadecimal} /l0_dds_reader_test1_arzksiu/uut/inst_data.status_info {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.sample_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_arzksiu/uut/inst_data.disposed_gen_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_arzksiu/uut/inst_data.no_writers_gen_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_arzksiu/uut/inst_data.ignore_deadline {-height 15 -radix unsigned} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap {-height 15 -radix binary -childformat {{/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0) -radix binary -childformat {{/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}}}} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0) {-height 15 -radix binary -childformat {{/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(0) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(1) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(2) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(3) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(4) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(5) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(6) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(7) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(8) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(9) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(10) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(11) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(12) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(13) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(14) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(15) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(16) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(17) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(18) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(19) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(20) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(21) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(22) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(23) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(24) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(25) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(26) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(27) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(28) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(29) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(30) {-height 15 -radix binary} /l0_dds_reader_test1_arzksiu/uut/inst_data.writer_bitmap(0)(31) {-height 15 -radix binary}} /l0_dds_reader_test1_arzksiu/uut/inst_data +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzksiu/uut/inst_next_addr_base +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzksiu/uut/inst_prev_addr_base +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/current_imf +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/stale_inst_cnt +add wave -noupdate -divider POINTERS +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/empty_sample_list_head +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/empty_sample_list_tail +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/empty_payload_list_head +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/oldest_sample +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/newest_sample +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/inst_empty_head +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/inst_occupied_head +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/cur_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/next_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/prev_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/cur_payload +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/next_payload +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/cur_inst +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arzksiu/uut/next_inst +add wave -noupdate -divider TESTBENCH +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzksiu/dds_start +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzksiu/dds_stage +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzksiu/dds_cnt +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzksiu/dds_cnt2 +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzksiu/dds_done +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzksiu/rtps_start +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzksiu/rtps_stage +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzksiu/rtps_cnt +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arzksiu/rtps_done +add wave -noupdate -divider {KEY HOLDER} +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzksiu/uut/start_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzksiu/uut/opcode_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzksiu/uut/ack_kh +add wave -noupdate -group {KEY HOLDER} -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/data_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzksiu/uut/valid_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzksiu/uut/ready_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzksiu/uut/last_word_in_kh +add wave -noupdate -group {KEY HOLDER} -radix hexadecimal /l0_dds_reader_test1_arzksiu/uut/data_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzksiu/uut/valid_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzksiu/uut/ready_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzksiu/uut/last_word_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arzksiu/uut/abort_kh +add wave -noupdate -divider MISC +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzksiu/uut/first_sample +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzksiu/uut/collection_cnt +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzksiu/uut/collection_cnt_max +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzksiu/uut/collection_generation_rank +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzksiu/uut/cur_generation_rank +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzksiu/uut/second_sample +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arzksiu/uut/max_samples_latch +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/single_instance +add wave -noupdate /l0_dds_reader_test1_arzksiu/uut/is_take +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {1106071 ps} 0} {{Cursor 2} {115175000 ps} 1} +quietly wave cursor active 1 +configure wave -namecolwidth 187 +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 {600384 ps} {1601025 ps} diff --git a/sim/L0_dds_reader_test1_arznriu.do b/sim/L0_dds_reader_test1_arznriu.do new file mode 100644 index 0000000..ceac11f --- /dev/null +++ b/sim/L0_dds_reader_test1_arznriu.do @@ -0,0 +1,170 @@ +onerror {resume} +radix define DDS_RETCODE { + "10#0#" "RETCODE_OK", + "10#1#" "RETCODE_ERROR", + "10#2#" "RETCODE_UNSUPPORTED", + "10#3#" "RETCODE_BAD_PARAMETER", + "10#4#" "RETCODE_PRECONDITION_NOT_MET", + "10#5#" "RETCODE_OUT_OF_RESOURCES", + "10#6#" "RETCODE_NOT_ENABLED", + "10#7#" "RETCODE_IMMUTABLE_POLICY", + "10#8#" "RETCODE_INCONSISTENT_POLICY", + "10#9#" "RETCODE_ALREADY_DELETED", + "10#10#" "RETCODE_TIMEOUT", + "10#11#" "RETCODE_NO_DATA", + "10#12#" "RETCODE_ILLEGAL_OPERATION", + -default unsigned +} +radix define SAMPLE_STATE { + "16#00000001#" "READ_SAMPLE_STATE", + "16#00000002#" "NOT_READ_SAMPLE_STATE", + -default binary +} +radix define VIEW_STATE { + "16#00000001#" "NEW_VIEW_STATE", + "16#00000002#" "NOT_NEW_VIEW_STATE", + -default binary +} +radix define INSTANCE_STATE { + "16#00000001#" "ALIVE_INSTANCE_STATE", + "16#00000002#" "NOT_ALIVE_DISPOSED_INSTANCE_STATE", + "16#00000004#" "NOT_ALIVE_NO_WRITERS_INSTANCE_STATE", + -default binary +} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider SYSTEM +add wave -noupdate /l0_dds_reader_test1_arznriu/uut/clk +add wave -noupdate /l0_dds_reader_test1_arznriu/uut/reset +add wave -noupdate /l0_dds_reader_test1_arznriu/uut/time +add wave -noupdate -divider RTPS +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arznriu/uut/start_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arznriu/uut/opcode_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arznriu/uut/ack_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arznriu/uut/ret_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arznriu/uut/done_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arznriu/uut/ready_in_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arznriu/uut/valid_in_rtps +add wave -noupdate -expand -group RTPS -radix hexadecimal /l0_dds_reader_test1_arznriu/uut/data_in_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_arznriu/uut/last_word_in_rtps +add wave -noupdate -divider DDS +add wave -noupdate -group DDS /l0_dds_reader_test1_arznriu/uut/start_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arznriu/uut/ack_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arznriu/uut/opcode_dds +add wave -noupdate -group DDS -radix SAMPLE_STATE /l0_dds_reader_test1_arznriu/uut/sample_state_dds +add wave -noupdate -group DDS -radix INSTANCE_STATE /l0_dds_reader_test1_arznriu/uut/instance_state_dds +add wave -noupdate -group DDS -radix VIEW_STATE /l0_dds_reader_test1_arznriu/uut/view_state_dds +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_arznriu/uut/instance_handle_dds +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arznriu/uut/max_samples_dds +add wave -noupdate -group DDS -radix DDS_RETCODE /l0_dds_reader_test1_arznriu/uut/return_code_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arznriu/uut/done_dds +add wave -noupdate -group DDS -divider SI +add wave -noupdate -group DDS -radix SAMPLE_STATE /l0_dds_reader_test1_arznriu/uut/si_sample_state +add wave -noupdate -group DDS -radix VIEW_STATE /l0_dds_reader_test1_arznriu/uut/si_view_state +add wave -noupdate -group DDS -radix INSTANCE_STATE /l0_dds_reader_test1_arznriu/uut/si_instance_state +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arznriu/uut/si_source_timestamp +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_arznriu/uut/si_instance_handle +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_arznriu/uut/si_publication_handle +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arznriu/uut/si_disposed_generation_count +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arznriu/uut/si_no_writers_generation_count +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arznriu/uut/si_sample_rank +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arznriu/uut/si_generation_rank +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_arznriu/uut/si_absolute_generation_rank +add wave -noupdate -group DDS /l0_dds_reader_test1_arznriu/uut/si_valid_data +add wave -noupdate -group DDS /l0_dds_reader_test1_arznriu/uut/si_valid +add wave -noupdate -group DDS /l0_dds_reader_test1_arznriu/uut/si_last +add wave -noupdate -group DDS /l0_dds_reader_test1_arznriu/uut/get_data_dds +add wave -noupdate -group DDS -divider OUTPUT +add wave -noupdate -group DDS /l0_dds_reader_test1_arznriu/uut/ready_out_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arznriu/uut/valid_out_dds +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_arznriu/uut/data_out_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_arznriu/uut/last_word_out_dds +add wave -noupdate -divider {MAIN FSM} +add wave -noupdate /l0_dds_reader_test1_arznriu/uut/stage +add wave -noupdate /l0_dds_reader_test1_arznriu/uut/stage_next +add wave -noupdate /l0_dds_reader_test1_arznriu/uut/cnt +add wave -noupdate -divider MEMORY +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_arznriu/uut/sample_abort_read +add wave -noupdate -group {SAMPLE MEM} -radix unsigned /l0_dds_reader_test1_arznriu/uut/sample_mem_ctrl_inst/addr +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_arznriu/uut/sample_mem_ctrl_inst/read +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_arznriu/uut/sample_mem_ctrl_inst/ready_in +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_arznriu/uut/sample_mem_ctrl_inst/valid_in +add wave -noupdate -group {SAMPLE MEM} -radix hexadecimal /l0_dds_reader_test1_arznriu/uut/sample_mem_ctrl_inst/data_in +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_arznriu/uut/sample_mem_ctrl_inst/ready_out +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_arznriu/uut/sample_mem_ctrl_inst/valid_out +add wave -noupdate -group {SAMPLE MEM} -radix hexadecimal /l0_dds_reader_test1_arznriu/uut/sample_mem_ctrl_inst/data_out +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arznriu/uut/payload_abort_read +add wave -noupdate -group {PAYLOAD MEM} -radix unsigned /l0_dds_reader_test1_arznriu/uut/payload_mem_ctrl_inst/addr +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arznriu/uut/payload_mem_ctrl_inst/read +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arznriu/uut/payload_mem_ctrl_inst/ready_in +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arznriu/uut/payload_mem_ctrl_inst/valid_in +add wave -noupdate -group {PAYLOAD MEM} -radix hexadecimal /l0_dds_reader_test1_arznriu/uut/payload_mem_ctrl_inst/data_in +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arznriu/uut/payload_mem_ctrl_inst/ready_out +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_arznriu/uut/payload_mem_ctrl_inst/valid_out +add wave -noupdate -group {PAYLOAD MEM} -radix hexadecimal /l0_dds_reader_test1_arznriu/uut/payload_mem_ctrl_inst/data_out +add wave -noupdate -childformat {{/l0_dds_reader_test1_arznriu/uut/inst_data.key_hash -radix hexadecimal} {/l0_dds_reader_test1_arznriu/uut/inst_data.status_info -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.sample_cnt -radix unsigned} {/l0_dds_reader_test1_arznriu/uut/inst_data.disposed_gen_cnt -radix unsigned} {/l0_dds_reader_test1_arznriu/uut/inst_data.no_writers_gen_cnt -radix unsigned} {/l0_dds_reader_test1_arznriu/uut/inst_data.ignore_deadline -radix unsigned} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap -radix binary -childformat {{/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0) -radix binary -childformat {{/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}}}}} -expand -subitemconfig {/l0_dds_reader_test1_arznriu/uut/inst_data.key_hash {-height 15 -radix hexadecimal} /l0_dds_reader_test1_arznriu/uut/inst_data.status_info {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.sample_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_arznriu/uut/inst_data.disposed_gen_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_arznriu/uut/inst_data.no_writers_gen_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_arznriu/uut/inst_data.ignore_deadline {-height 15 -radix unsigned} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap {-height 15 -radix binary -childformat {{/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0) -radix binary -childformat {{/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}}}} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0) {-height 15 -radix binary -childformat {{/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(0) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(1) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(2) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(3) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(4) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(5) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(6) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(7) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(8) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(9) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(10) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(11) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(12) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(13) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(14) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(15) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(16) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(17) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(18) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(19) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(20) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(21) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(22) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(23) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(24) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(25) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(26) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(27) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(28) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(29) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(30) {-height 15 -radix binary} /l0_dds_reader_test1_arznriu/uut/inst_data.writer_bitmap(0)(31) {-height 15 -radix binary}} /l0_dds_reader_test1_arznriu/uut/inst_data +add wave -noupdate -divider POINTERS +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/empty_sample_list_head +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/empty_sample_list_tail +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/empty_payload_list_head +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/oldest_sample +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/newest_sample +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/inst_empty_head +add wave -noupdate -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/inst_occupied_head +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/cur_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/next_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/prev_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/cur_payload +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/next_payload +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/cur_inst +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_arznriu/uut/next_inst +add wave -noupdate -divider TESTBENCH +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arznriu/dds_start +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arznriu/dds_stage +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arznriu/dds_cnt +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arznriu/dds_cnt2 +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arznriu/dds_done +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arznriu/rtps_start +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arznriu/rtps_stage +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arznriu/rtps_cnt +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_arznriu/rtps_done +add wave -noupdate -divider {KEY HOLDER} +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arznriu/uut/start_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arznriu/uut/opcode_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arznriu/uut/ack_kh +add wave -noupdate -group {KEY HOLDER} -radix hexadecimal /l0_dds_reader_test1_arznriu/uut/data_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arznriu/uut/valid_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arznriu/uut/ready_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arznriu/uut/last_word_in_kh +add wave -noupdate -group {KEY HOLDER} -radix hexadecimal /l0_dds_reader_test1_arznriu/uut/data_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arznriu/uut/valid_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arznriu/uut/ready_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arznriu/uut/last_word_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_arznriu/uut/abort_kh +add wave -noupdate -divider MISC +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arznriu/uut/first_sample +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arznriu/uut/collection_cnt +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arznriu/uut/collection_cnt_max +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arznriu/uut/collection_generation_rank +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arznriu/uut/cur_generation_rank +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arznriu/uut/second_sample +add wave -noupdate -radix unsigned /l0_dds_reader_test1_arznriu/uut/max_samples_latch +add wave -noupdate /l0_dds_reader_test1_arznriu/uut/single_instance +add wave -noupdate /l0_dds_reader_test1_arznriu/uut/is_take +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {94698 ps} 0} {{Cursor 2} {115175000 ps} 1} +quietly wave cursor active 1 +configure wave -namecolwidth 174 +configure wave -valuecolwidth 209 +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 {0 ps} {940034 ps} diff --git a/sim/L0_dds_reader_test1_lbzkriu.do b/sim/L0_dds_reader_test1_lbzkriu.do new file mode 100644 index 0000000..39200a2 --- /dev/null +++ b/sim/L0_dds_reader_test1_lbzkriu.do @@ -0,0 +1,193 @@ +onerror {resume} +radix define DDS_RETCODE { + "10#0#" "RETCODE_OK", + "10#1#" "RETCODE_ERROR", + "10#2#" "RETCODE_UNSUPPORTED", + "10#3#" "RETCODE_BAD_PARAMETER", + "10#4#" "RETCODE_PRECONDITION_NOT_MET", + "10#5#" "RETCODE_OUT_OF_RESOURCES", + "10#6#" "RETCODE_NOT_ENABLED", + "10#7#" "RETCODE_IMMUTABLE_POLICY", + "10#8#" "RETCODE_INCONSISTENT_POLICY", + "10#9#" "RETCODE_ALREADY_DELETED", + "10#10#" "RETCODE_TIMEOUT", + "10#11#" "RETCODE_NO_DATA", + "10#12#" "RETCODE_ILLEGAL_OPERATION", + -default unsigned +} +radix define SAMPLE_STATE { + "16#00000001#" "READ_SAMPLE_STATE", + "16#00000002#" "NOT_READ_SAMPLE_STATE", + -default binary +} +radix define VIEW_STATE { + "16#00000001#" "NEW_VIEW_STATE", + "16#00000002#" "NOT_NEW_VIEW_STATE", + -default binary +} +radix define INSTANCE_STATE { + "16#00000001#" "ALIVE_INSTANCE_STATE", + "16#00000002#" "NOT_ALIVE_DISPOSED_INSTANCE_STATE", + "16#00000004#" "NOT_ALIVE_NO_WRITERS_INSTANCE_STATE", + -default binary +} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider SYSTEM +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/clk +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/reset +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/time +add wave -noupdate -divider RTPS +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lbzkriu/uut/start_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lbzkriu/uut/opcode_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lbzkriu/uut/ack_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lbzkriu/uut/ret_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lbzkriu/uut/done_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lbzkriu/uut/ready_in_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lbzkriu/uut/valid_in_rtps +add wave -noupdate -expand -group RTPS -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/data_in_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lbzkriu/uut/last_word_in_rtps +add wave -noupdate -divider DDS +add wave -noupdate -group DDS /l0_dds_reader_test1_lbzkriu/uut/start_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_lbzkriu/uut/ack_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_lbzkriu/uut/opcode_dds +add wave -noupdate -group DDS -radix SAMPLE_STATE /l0_dds_reader_test1_lbzkriu/uut/sample_state_dds +add wave -noupdate -group DDS -radix INSTANCE_STATE /l0_dds_reader_test1_lbzkriu/uut/instance_state_dds +add wave -noupdate -group DDS -radix VIEW_STATE /l0_dds_reader_test1_lbzkriu/uut/view_state_dds +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/instance_handle_dds +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/max_samples_dds +add wave -noupdate -group DDS -radix DDS_RETCODE /l0_dds_reader_test1_lbzkriu/uut/return_code_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_lbzkriu/uut/done_dds +add wave -noupdate -group DDS -divider SI +add wave -noupdate -group DDS -radix SAMPLE_STATE /l0_dds_reader_test1_lbzkriu/uut/si_sample_state +add wave -noupdate -group DDS -radix VIEW_STATE /l0_dds_reader_test1_lbzkriu/uut/si_view_state +add wave -noupdate -group DDS -radix INSTANCE_STATE /l0_dds_reader_test1_lbzkriu/uut/si_instance_state +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/si_source_timestamp +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/si_instance_handle +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/si_publication_handle +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/si_disposed_generation_count +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/si_no_writers_generation_count +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/si_sample_rank +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/si_generation_rank +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/si_absolute_generation_rank +add wave -noupdate -group DDS /l0_dds_reader_test1_lbzkriu/uut/si_valid_data +add wave -noupdate -group DDS /l0_dds_reader_test1_lbzkriu/uut/si_valid +add wave -noupdate -group DDS /l0_dds_reader_test1_lbzkriu/uut/si_last +add wave -noupdate -group DDS /l0_dds_reader_test1_lbzkriu/uut/get_data_dds +add wave -noupdate -group DDS -divider OUTPUT +add wave -noupdate -group DDS /l0_dds_reader_test1_lbzkriu/uut/ready_out_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_lbzkriu/uut/valid_out_dds +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/data_out_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_lbzkriu/uut/last_word_out_dds +add wave -noupdate -divider {MAIN FSM} +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/stage +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/stage_next +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/cnt +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/remove_oldest_sample +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/remove_oldest_inst_sample +add wave -noupdate -divider MEMORY +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_lbzkriu/uut/sample_abort_read +add wave -noupdate -group {SAMPLE MEM} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/sample_mem_ctrl_inst/addr +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_lbzkriu/uut/sample_mem_ctrl_inst/read +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_lbzkriu/uut/sample_mem_ctrl_inst/ready_in +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_lbzkriu/uut/sample_mem_ctrl_inst/valid_in +add wave -noupdate -group {SAMPLE MEM} -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/sample_mem_ctrl_inst/data_in +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_lbzkriu/uut/sample_mem_ctrl_inst/ready_out +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_lbzkriu/uut/sample_mem_ctrl_inst/valid_out +add wave -noupdate -group {SAMPLE MEM} -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/sample_mem_ctrl_inst/data_out +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_lbzkriu/uut/payload_abort_read +add wave -noupdate -group {PAYLOAD MEM} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/payload_mem_ctrl_inst/addr +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_lbzkriu/uut/payload_mem_ctrl_inst/read +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_lbzkriu/uut/payload_mem_ctrl_inst/ready_in +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_lbzkriu/uut/payload_mem_ctrl_inst/valid_in +add wave -noupdate -group {PAYLOAD MEM} -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/payload_mem_ctrl_inst/data_in +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_lbzkriu/uut/payload_mem_ctrl_inst/ready_out +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_lbzkriu/uut/payload_mem_ctrl_inst/valid_out +add wave -noupdate -group {PAYLOAD MEM} -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/payload_mem_ctrl_inst/data_out +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_lbzkriu/uut/inst_abort_read +add wave -noupdate -group {INSTANCE MEM} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/addr +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_lbzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/read +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_lbzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/ready_in +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_lbzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/valid_in +add wave -noupdate -group {INSTANCE MEM} -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/data_in +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_lbzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/ready_out +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_lbzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/valid_out +add wave -noupdate -group {INSTANCE MEM} -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/data_out +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/inst_op_start +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/inst_opcode +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/inst_op_done +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/inst_stage +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/inst_stage_next +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/inst_cnt +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/inst_addr_base +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/inst_mem_fields +add wave -noupdate -childformat {{/l0_dds_reader_test1_lbzkriu/uut/inst_data.key_hash -radix hexadecimal} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.status_info -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.sample_cnt -radix unsigned} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.disposed_gen_cnt -radix unsigned} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.no_writers_gen_cnt -radix unsigned} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.ignore_deadline -radix unsigned} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap -radix binary -childformat {{/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0) -radix binary -childformat {{/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}}}}} -subitemconfig {/l0_dds_reader_test1_lbzkriu/uut/inst_data.key_hash {-height 15 -radix hexadecimal} /l0_dds_reader_test1_lbzkriu/uut/inst_data.status_info {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.sample_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_lbzkriu/uut/inst_data.disposed_gen_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_lbzkriu/uut/inst_data.no_writers_gen_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_lbzkriu/uut/inst_data.ignore_deadline {-height 15 -radix unsigned} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap {-height 15 -radix binary -childformat {{/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0) -radix binary -childformat {{/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}}}} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0) {-height 15 -radix binary -childformat {{/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(0) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(1) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(2) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(3) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(4) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(5) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(6) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(7) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(8) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(9) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(10) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(11) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(12) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(13) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(14) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(15) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(16) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(17) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(18) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(19) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(20) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(21) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(22) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(23) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(24) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(25) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(26) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(27) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(28) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(29) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(30) {-height 15 -radix binary} /l0_dds_reader_test1_lbzkriu/uut/inst_data.writer_bitmap(0)(31) {-height 15 -radix binary}} /l0_dds_reader_test1_lbzkriu/uut/inst_data +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/inst_next_addr_base +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/inst_prev_addr_base +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/current_imf +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/stale_inst_cnt +add wave -noupdate -divider POINTERS +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/empty_sample_list_head +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/empty_sample_list_tail +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/empty_payload_list_head +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/oldest_sample +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/newest_sample +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/inst_empty_head +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/inst_occupied_head +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/cur_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/next_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/prev_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/cur_payload +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/next_payload +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/cur_inst +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/next_inst +add wave -noupdate -divider TESTBENCH +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lbzkriu/dds_start +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lbzkriu/dds_stage +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lbzkriu/dds_cnt +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lbzkriu/dds_cnt2 +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lbzkriu/dds_done +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lbzkriu/rtps_start +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lbzkriu/rtps_stage +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lbzkriu/rtps_cnt +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lbzkriu/rtps_done +add wave -noupdate -divider {KEY HOLDER} +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lbzkriu/uut/start_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lbzkriu/uut/opcode_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lbzkriu/uut/ack_kh +add wave -noupdate -group {KEY HOLDER} -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/data_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lbzkriu/uut/valid_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lbzkriu/uut/ready_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lbzkriu/uut/last_word_in_kh +add wave -noupdate -group {KEY HOLDER} -radix hexadecimal /l0_dds_reader_test1_lbzkriu/uut/data_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lbzkriu/uut/valid_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lbzkriu/uut/ready_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lbzkriu/uut/last_word_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lbzkriu/uut/abort_kh +add wave -noupdate -divider MISC +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/first_sample +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/collection_cnt +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/collection_cnt_max +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/collection_generation_rank +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/cur_generation_rank +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/second_sample +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lbzkriu/uut/max_samples_latch +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/single_instance +add wave -noupdate /l0_dds_reader_test1_lbzkriu/uut/is_take +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {84445758 ps} 0} {{Cursor 2} {84374419 ps} 1} +quietly wave cursor active 2 +configure wave -namecolwidth 187 +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 {83726685 ps} {84727326 ps} diff --git a/sim/L0_dds_reader_test1_lrzkriu.do b/sim/L0_dds_reader_test1_lrzkriu.do new file mode 100644 index 0000000..09c380e --- /dev/null +++ b/sim/L0_dds_reader_test1_lrzkriu.do @@ -0,0 +1,193 @@ +onerror {resume} +radix define DDS_RETCODE { + "10#0#" "RETCODE_OK", + "10#1#" "RETCODE_ERROR", + "10#2#" "RETCODE_UNSUPPORTED", + "10#3#" "RETCODE_BAD_PARAMETER", + "10#4#" "RETCODE_PRECONDITION_NOT_MET", + "10#5#" "RETCODE_OUT_OF_RESOURCES", + "10#6#" "RETCODE_NOT_ENABLED", + "10#7#" "RETCODE_IMMUTABLE_POLICY", + "10#8#" "RETCODE_INCONSISTENT_POLICY", + "10#9#" "RETCODE_ALREADY_DELETED", + "10#10#" "RETCODE_TIMEOUT", + "10#11#" "RETCODE_NO_DATA", + "10#12#" "RETCODE_ILLEGAL_OPERATION", + -default unsigned +} +radix define SAMPLE_STATE { + "16#00000001#" "READ_SAMPLE_STATE", + "16#00000002#" "NOT_READ_SAMPLE_STATE", + -default binary +} +radix define VIEW_STATE { + "16#00000001#" "NEW_VIEW_STATE", + "16#00000002#" "NOT_NEW_VIEW_STATE", + -default binary +} +radix define INSTANCE_STATE { + "16#00000001#" "ALIVE_INSTANCE_STATE", + "16#00000002#" "NOT_ALIVE_DISPOSED_INSTANCE_STATE", + "16#00000004#" "NOT_ALIVE_NO_WRITERS_INSTANCE_STATE", + -default binary +} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider SYSTEM +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/clk +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/reset +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/time +add wave -noupdate -divider RTPS +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lrzkriu/uut/start_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lrzkriu/uut/opcode_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lrzkriu/uut/ack_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lrzkriu/uut/ret_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lrzkriu/uut/done_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lrzkriu/uut/ready_in_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lrzkriu/uut/valid_in_rtps +add wave -noupdate -expand -group RTPS -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/data_in_rtps +add wave -noupdate -expand -group RTPS /l0_dds_reader_test1_lrzkriu/uut/last_word_in_rtps +add wave -noupdate -divider DDS +add wave -noupdate -group DDS /l0_dds_reader_test1_lrzkriu/uut/start_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_lrzkriu/uut/ack_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_lrzkriu/uut/opcode_dds +add wave -noupdate -group DDS -radix SAMPLE_STATE /l0_dds_reader_test1_lrzkriu/uut/sample_state_dds +add wave -noupdate -group DDS -radix INSTANCE_STATE /l0_dds_reader_test1_lrzkriu/uut/instance_state_dds +add wave -noupdate -group DDS -radix VIEW_STATE /l0_dds_reader_test1_lrzkriu/uut/view_state_dds +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/instance_handle_dds +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/max_samples_dds +add wave -noupdate -group DDS -radix DDS_RETCODE /l0_dds_reader_test1_lrzkriu/uut/return_code_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_lrzkriu/uut/done_dds +add wave -noupdate -group DDS -divider SI +add wave -noupdate -group DDS -radix SAMPLE_STATE /l0_dds_reader_test1_lrzkriu/uut/si_sample_state +add wave -noupdate -group DDS -radix VIEW_STATE /l0_dds_reader_test1_lrzkriu/uut/si_view_state +add wave -noupdate -group DDS -radix INSTANCE_STATE /l0_dds_reader_test1_lrzkriu/uut/si_instance_state +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/si_source_timestamp +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/si_instance_handle +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/si_publication_handle +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/si_disposed_generation_count +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/si_no_writers_generation_count +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/si_sample_rank +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/si_generation_rank +add wave -noupdate -group DDS -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/si_absolute_generation_rank +add wave -noupdate -group DDS /l0_dds_reader_test1_lrzkriu/uut/si_valid_data +add wave -noupdate -group DDS /l0_dds_reader_test1_lrzkriu/uut/si_valid +add wave -noupdate -group DDS /l0_dds_reader_test1_lrzkriu/uut/si_last +add wave -noupdate -group DDS /l0_dds_reader_test1_lrzkriu/uut/get_data_dds +add wave -noupdate -group DDS -divider OUTPUT +add wave -noupdate -group DDS /l0_dds_reader_test1_lrzkriu/uut/ready_out_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_lrzkriu/uut/valid_out_dds +add wave -noupdate -group DDS -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/data_out_dds +add wave -noupdate -group DDS /l0_dds_reader_test1_lrzkriu/uut/last_word_out_dds +add wave -noupdate -divider {MAIN FSM} +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/stage +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/stage_next +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/cnt +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/remove_oldest_sample +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/remove_oldest_inst_sample +add wave -noupdate -divider MEMORY +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_lrzkriu/uut/sample_abort_read +add wave -noupdate -group {SAMPLE MEM} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/sample_mem_ctrl_inst/addr +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_lrzkriu/uut/sample_mem_ctrl_inst/read +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_lrzkriu/uut/sample_mem_ctrl_inst/ready_in +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_lrzkriu/uut/sample_mem_ctrl_inst/valid_in +add wave -noupdate -group {SAMPLE MEM} -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/sample_mem_ctrl_inst/data_in +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_lrzkriu/uut/sample_mem_ctrl_inst/ready_out +add wave -noupdate -group {SAMPLE MEM} /l0_dds_reader_test1_lrzkriu/uut/sample_mem_ctrl_inst/valid_out +add wave -noupdate -group {SAMPLE MEM} -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/sample_mem_ctrl_inst/data_out +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_lrzkriu/uut/payload_abort_read +add wave -noupdate -group {PAYLOAD MEM} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/payload_mem_ctrl_inst/addr +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_lrzkriu/uut/payload_mem_ctrl_inst/read +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_lrzkriu/uut/payload_mem_ctrl_inst/ready_in +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_lrzkriu/uut/payload_mem_ctrl_inst/valid_in +add wave -noupdate -group {PAYLOAD MEM} -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/payload_mem_ctrl_inst/data_in +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_lrzkriu/uut/payload_mem_ctrl_inst/ready_out +add wave -noupdate -group {PAYLOAD MEM} /l0_dds_reader_test1_lrzkriu/uut/payload_mem_ctrl_inst/valid_out +add wave -noupdate -group {PAYLOAD MEM} -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/payload_mem_ctrl_inst/data_out +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_lrzkriu/uut/inst_abort_read +add wave -noupdate -group {INSTANCE MEM} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/addr +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_lrzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/read +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_lrzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/ready_in +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_lrzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/valid_in +add wave -noupdate -group {INSTANCE MEM} -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/data_in +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_lrzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/ready_out +add wave -noupdate -group {INSTANCE MEM} /l0_dds_reader_test1_lrzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/valid_out +add wave -noupdate -group {INSTANCE MEM} -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/gen_instance_mem_ctrl_inst/instance_mem_ctrl_inst/data_out +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/inst_op_start +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/inst_opcode +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/inst_op_done +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/inst_stage +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/inst_stage_next +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/inst_cnt +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/inst_addr_base +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/inst_mem_fields +add wave -noupdate -childformat {{/l0_dds_reader_test1_lrzkriu/uut/inst_data.key_hash -radix hexadecimal} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.status_info -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.sample_cnt -radix unsigned} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.disposed_gen_cnt -radix unsigned} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.no_writers_gen_cnt -radix unsigned} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.ignore_deadline -radix unsigned} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap -radix binary -childformat {{/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0) -radix binary -childformat {{/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}}}}} -subitemconfig {/l0_dds_reader_test1_lrzkriu/uut/inst_data.key_hash {-height 15 -radix hexadecimal} /l0_dds_reader_test1_lrzkriu/uut/inst_data.status_info {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.sample_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_lrzkriu/uut/inst_data.disposed_gen_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_lrzkriu/uut/inst_data.no_writers_gen_cnt {-height 15 -radix unsigned} /l0_dds_reader_test1_lrzkriu/uut/inst_data.ignore_deadline {-height 15 -radix unsigned} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap {-height 15 -radix binary -childformat {{/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0) -radix binary -childformat {{/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}}}} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0) {-height 15 -radix binary -childformat {{/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(0) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(1) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(2) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(3) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(4) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(5) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(6) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(7) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(8) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(9) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(10) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(11) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(12) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(13) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(14) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(15) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(16) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(17) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(18) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(19) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(20) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(21) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(22) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(23) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(24) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(25) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(26) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(27) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(28) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(29) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(30) -radix binary} {/l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(31) -radix binary}}} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(0) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(1) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(2) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(3) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(4) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(5) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(6) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(7) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(8) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(9) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(10) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(11) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(12) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(13) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(14) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(15) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(16) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(17) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(18) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(19) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(20) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(21) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(22) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(23) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(24) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(25) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(26) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(27) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(28) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(29) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(30) {-height 15 -radix binary} /l0_dds_reader_test1_lrzkriu/uut/inst_data.writer_bitmap(0)(31) {-height 15 -radix binary}} /l0_dds_reader_test1_lrzkriu/uut/inst_data +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/inst_next_addr_base +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/inst_prev_addr_base +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/current_imf +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/stale_inst_cnt +add wave -noupdate -divider POINTERS +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/empty_sample_list_head +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/empty_sample_list_tail +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/empty_payload_list_head +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/oldest_sample +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/newest_sample +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/inst_empty_head +add wave -noupdate -expand -group {LIST POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/inst_occupied_head +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/cur_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/next_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/prev_sample +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/cur_payload +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/next_payload +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/cur_inst +add wave -noupdate -expand -group {GENERAL POINTERS} -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/next_inst +add wave -noupdate -divider TESTBENCH +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lrzkriu/dds_start +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lrzkriu/dds_stage +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lrzkriu/dds_cnt +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lrzkriu/dds_cnt2 +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lrzkriu/dds_done +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lrzkriu/rtps_start +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lrzkriu/rtps_stage +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lrzkriu/rtps_cnt +add wave -noupdate -group TESTBENCH /l0_dds_reader_test1_lrzkriu/rtps_done +add wave -noupdate -divider {KEY HOLDER} +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lrzkriu/uut/start_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lrzkriu/uut/opcode_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lrzkriu/uut/ack_kh +add wave -noupdate -group {KEY HOLDER} -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/data_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lrzkriu/uut/valid_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lrzkriu/uut/ready_in_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lrzkriu/uut/last_word_in_kh +add wave -noupdate -group {KEY HOLDER} -radix hexadecimal /l0_dds_reader_test1_lrzkriu/uut/data_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lrzkriu/uut/valid_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lrzkriu/uut/ready_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lrzkriu/uut/last_word_out_kh +add wave -noupdate -group {KEY HOLDER} /l0_dds_reader_test1_lrzkriu/uut/abort_kh +add wave -noupdate -divider MISC +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/first_sample +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/collection_cnt +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/collection_cnt_max +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/collection_generation_rank +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/cur_generation_rank +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/second_sample +add wave -noupdate -radix unsigned /l0_dds_reader_test1_lrzkriu/uut/max_samples_latch +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/single_instance +add wave -noupdate /l0_dds_reader_test1_lrzkriu/uut/is_take +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {84445758 ps} 0} {{Cursor 2} {84374419 ps} 1} +quietly wave cursor active 2 +configure wave -namecolwidth 187 +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 {83726685 ps} {84727326 ps} diff --git a/src/REF.txt b/src/REF.txt index 0ca00dc..614131c 100644 --- a/src/REF.txt +++ b/src/REF.txt @@ -765,6 +765,13 @@ Scenario 2: With SHARED ownership and destination order by SOURCE timestamp, re associated with the instance would forget the source timestamp when the deletion occurs and if a different DataWriter where to write the instance with an earlier timestamp the update would be incorrectly accepted. +https://community.rti.com/content/forum-topic/instance-resources-dispose-and-unregister +The instance has no known DataWriters that are writing it. This occurs when all the DataWriters that +were known (by the DataReader) to write the instance have either unregistered the instance or have left +the system (so they are no longer matched with the DataReader). Note that the instance could be on a +NOT_ALIVE_NO_WRITERS instance_state or a NOT_ALIVE_DISPOSED, depending on whether the instance was +disposed prior to losing all the DataWriters. + 2.2.2.5.3.8 read (DDS) Samples that contain no data do not count towards the limits imposed by the RESOURCE_LIMITS QoS policy. diff --git a/src/TODO.txt b/src/TODO.txt index e74bf2b..6b2b570 100644 --- a/src/TODO.txt +++ b/src/TODO.txt @@ -78,6 +78,7 @@ * 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). * If a Best Effort Remote Reader sends a ACKNACK, he will indirectly receive a lease deadline and may timeout (DoS Attack) +* Since the Instance Handle has to be Unique but also orderable, we could use the actual Instance Memory Base Address. Since the Instances are in a list, we also have implicitly an order to all registered Instances. [It may be necessary to add a PREV pointer to the IMF to better support the read_previous_isntance operation] * Fast-RTPS does not follow DDSI-RTPS Specification - Open Github Issue @@ -331,8 +332,32 @@ DESIGN DECISIONS * The DDS Specification states that if after an Unregister Operation "the application wants to modify (write or dispose) the instance, it has to register it again, or else use the special handle value - HANDLE_NIL". I do not have this prerequirement. it will return BAD_PARAMETER only if the Instance + HANDLE_NIL". I do not have this prerequirement. It will return BAD_PARAMETER only if the Instance is not in the memory anymore. + +* The DDS Specification is not entirely clear how to handle transition between the NOT_ALIVE states. + Going by the petri-net state-flowchart transitions between the NOT_ALIVE states are not allowed, + meaning that the first taken NOT_ALIVE state stays until the instance is reborn. But since the Disposal + of an Instance is of higher Information value, we should support transitioning from NOT_ALIVE_NO_WRITERS + to NOT_ALIVE_DISPOSED. This i.e. is done by transitioning to ALIVE and back to NOT_ALIVE_DISPOSED on the + same received sample (not_alive_generation_counter is incremented). This is also in accordance to the + protocol, since the writer that disposes the instance effectively (re-)registers the instance, meaning + that it now has a live writer again. On the other hand there is no transition from NOT_ALIVE_DISPOSED + to NOT_ALIVE_NO_WRITERS. + +* Unregister/Dispose/Filtered Samples of unknown Instances are droped. Note that if a previous ALIVE + instance went to an NOT_ALIVE_NO_WRITERS state and was subsequently pushed out of the memory will + miss the transition to NOT_ALIVE_DISPOSED if a writer than decides to sent a Dispose Sample. + +* The DDS Specification is not entirely clear on what happens in the DDS Reader on reception of + Meta Samples (Unregister/Dispose Samples). One simple solution would be to make Data-less Samples for + each received Meta-Sample. But since a meta-sample may not necessarily change the state to something + visible from the Sample info (e.g. Unregister on Instance with still alive Writers or Dispose from + another Writer on already disposed Instance), it does not seem practical. (In effect only the source + timestamp and publication handle of the Sample Info could be different). + Taking this into consideration, thsi DDS Reader implementation only generates data-less samples if + an Instance State is triggered. Filtered Cache Changes also do not produce any Samples visible to the + user (But affect internal state, like DEADLINE and LIVELINESS state). PROTOCOL UNCOMPLIANCE ===================== diff --git a/src/Tests/Level_0/L0_dds_reader_test1_abzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test1_abzkriu.vhd new file mode 100644 index 0000000..5601147 --- /dev/null +++ b/src/Tests/Level_0/L0_dds_reader_test1_abzkriu.vhd @@ -0,0 +1,1436 @@ +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 RTPS handling of the DDS Reader. It tests the correctness of the RTPS ADD_CACHE_CHANGE, and REMOVE_WRITER Operations. +-- Implicitly some DDS Operations are also tested, since they are used for state checking. +-- More specifically the testbench covers following tests: +-- TEST: NORMAL ADD_CACHE_CHANGE +-- TEST: ADD_CACHE_CHANGE ON PAYLOAD MEMORY FULL +-- TEST: REMOVE_WRITER [UNKNOWN WRITER] +-- TEST: REMOVE_WRITER [KNOWN WRITER (1 Instance)] +-- TEST: REMOVE_WRITER [KNOWN WRITER (>1 Instances)] +-- TEST: SAMPLE WITH ALIGNED PAYLOAD +-- TEST: SAMPLE WITH UNALIGNED PAYLOAD [>1 SLOT] +-- TEST: SAMPLE WITH UNALIGNED PAYLOAD [<1 SLOT] +-- TEST: NORMAL SAMPLE [KNOWN INSTANCE] +-- TEST: NORMAL SAMPLE [UNKNOWN INSTANCE] +-- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, KNOWN WRITER] +-- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, UNKNOWN WRITER] +-- TEST: UNREGISTER SAMPLE [UNKNOWN INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE, STALE INSTANCE TRANSITION] +-- TEST: DISPOSE SAMPLE [KNOWN INSTANCE] +-- TEST: DISPOSE SAMPLE [UNKNOWN INSTANCE] +-- TEST: DISPOSE SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: DISPOSE SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: FILTER SAMPLE [KNOWN INSTANCE] +-- TEST: FILTER SAMPLE [UNKNOWN INSTANCE] +-- TEST: FILTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: FILTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: SAMPLE WITH KEY_HASH +-- TEST: SAMPLE WITHOUT KEY_HASH +-- TEST: SAMPLE WITH SERIALIZED KEY [WITH KEY_HASH] +-- TEST: SAMPLE WITH SERIALIZED KEY [WITHOUT KEY_HASH] +-- TEST: SAMPLE WITH EARLY TIMESTAMP [TIMESTAMP EARLIER THAN LAST READ] +-- TEST: TEST SAMPLE WITH SERIALIZED KEY EFFECT ON PAYLOAD MEMORY FULLNESS +-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE +-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES [UNKNOWN INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] +-- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE +-- TEST: ADD SAMPLE ON PAYLOAD MEMORY FULL & MAX_SAMPLES_PER_INSTANCE (Induce Double Remove) + +entity L0_dds_reader_test1_abzkriu is +end entity; + + +architecture testbench of L0_dds_reader_test1_abzkriu is + + -- *CONSTANT DECLARATION* + constant MAX_REMOTE_ENDPOINTS : natural := 3; + + -- *TYPE DECLARATION* + type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA); + type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE); + type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); + + -- *SIGNAL DECLARATION* + signal clk : std_logic := '0'; + signal reset : std_logic := '1'; + signal check_time : TIME_TYPE := TIME_ZERO; + signal start_rtps, start_dds, start_kh, ack_rtps, ack_dds, ack_kh, done_rtps, done_dds : std_logic := '0'; + signal opcode_rtps : HISTORY_CACHE_OPCODE_TYPE := NOP; + signal opcode_dds : DDS_READER_OPCODE_TYPE := NOP; + signal opcode_kh : KEY_HOLDER_OPCODE_TYPE := NOP; + signal ret_rtps : HISTORY_CACHE_RESPONSE_TYPE := ERROR; + signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic := '0'; + signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic := '0'; + signal ready_in_kh, ready_out_kh, valid_in_kh, valid_out_kh, last_word_in_kh, last_word_out_kh : std_logic := '0'; + signal data_in_rtps, data_out_dds, data_in_kh, data_out_kh : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal get_data_dds, si_valid_data, si_valid, si_last, abort_kh : std_logic := '0'; + signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); + signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); + signal instance_state_dds, si_instance_state : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0) := ANY_INSTANCE_STATE; + signal view_state_dds, si_view_state : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0) := ANY_VIEW_STATE; + signal sample_state_dds, si_sample_state : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := ANY_SAMPLE_STATE; + signal instance_handle_dds, si_instance_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + signal max_samples_dds : std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0) := (others => '0'); + signal si_source_timestamp : TIME_TYPE := TIME_INVALID; + signal si_publication_handle : PUBLICATION_HANDLE_TYPE := (others => (others => '0')); + signal si_disposed_generation_count : std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_no_writers_generation_count : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_sample_rank : std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0) := (others => '0'); + signal si_generation_rank : std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0) := (others => '0'); + signal si_absolute_generation_rank: std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + + signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, dds_cnt2, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; + signal kh_stage : KH_STAGE_TYPE := IDLE; + signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST; + shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST; + shared variable mem : DDS_READER_MEM_TYPE := DEFAULT_DDS_READER_MEM; + signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, last_id, valid_id : AlertLogIDType; + + -- *FUNCTION DECLARATION* + function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is + variable ret : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + for i in 0 to 3 loop + ret(i) := not payload.data(i); + end loop; + + return ret; + end function; + + 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.dds_reader(arch) + generic map ( + TIME_BASED_FILTER_QOS => DURATION_ZERO, + DEADLINE_QOS => DURATION_INFINITE, + MAX_SAMPLES => std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH)), + MAX_INSTANCES => std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH)), + MAX_SAMPLES_PER_INSTANCE => std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH)), + HISTORY_QOS => KEEP_ALL_HISTORY_QOS, + RELIABILITY_QOS => BEST_EFFORT_RELIABILITY_QOS, + PRESENTATION_QOS => INSTANCE_PRESENTATION_QOS, + DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, + COHERENT_ACCESS => FALSE, + ORDERED_ACCESS => FALSE, + WITH_KEY => TRUE, + PAYLOAD_FRAME_SIZE => 11, + MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS + ) + port map ( + clk => clk, + reset => reset, + time => check_time, + start_rtps => start_rtps, + opcode_rtps => opcode_rtps, + ack_rtps => ack_rtps, + done_rtps => done_rtps, + ret_rtps => ret_rtps, + data_in_rtps => data_in_rtps, + valid_in_rtps => valid_in_rtps, + ready_in_rtps => ready_in_rtps, + last_word_in_rtps => last_word_in_rtps, + start_kh => start_kh, + opcode_kh => opcode_kh, + ack_kh => ack_kh, + data_in_kh => data_in_kh, + valid_in_kh => valid_in_kh, + ready_in_kh => ready_in_kh, + last_word_in_kh => last_word_in_kh, + data_out_kh => data_out_kh, + valid_out_kh => valid_out_kh, + ready_out_kh => ready_out_kh, + last_word_out_kh => last_word_out_kh, + abort_kh => abort_kh, + start_dds => start_dds, + ack_dds => ack_dds, + opcode_dds => opcode_dds, + instance_state_dds => instance_state_dds, + view_state_dds => view_state_dds, + sample_state_dds => sample_state_dds, + instance_handle_dds => instance_handle_dds, + max_samples_dds => max_samples_dds, + get_data_dds => get_data_dds, + done_dds => done_dds, + return_code_dds => return_code_dds, + ready_out_dds => ready_out_dds, + valid_out_dds => valid_out_dds, + data_out_dds => data_out_dds, + last_word_out_dds => last_word_out_dds, + si_sample_state => si_sample_state, + si_view_state => si_view_state, + si_instance_state => si_instance_state, + si_source_timestamp => si_source_timestamp, + si_instance_handle => si_instance_handle, + si_publication_handle => si_publication_handle, + si_disposed_generation_count => si_disposed_generation_count, + si_no_writers_generation_count => si_no_writers_generation_count, + si_sample_rank => si_sample_rank, + si_generation_rank => si_generation_rank, + si_absolute_generation_rank => si_absolute_generation_rank, + si_valid_data => si_valid_data, + si_valid => si_valid, + si_last => si_last, + status => status + ); + + stimulus_prc : process + variable RV : RandomPType; + variable kh1, kh2, kh3, kh4 : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + variable cc1, cc2, cc3, cc4, cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE; + variable s : SAMPLE_TYPE := DEFAULT_SAMPLE; + + impure function gen_payload(key_hash : INSTANCE_HANDLE_TYPE; len : natural) return TEST_PACKET_TYPE is + variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + assert (len >= 4) report "Payload length has to be at least 16 Bytes long" severity FAILURE; + + for i in 0 to len-1 loop + if (i < 4) then + -- NOTE: Beginning of payload is negated key to allow deterministic Key Hash generation from the kh_prc + ret.data(ret.length) := not key_hash(i); + else + ret.data(ret.length) := RV.RandSlv(WORD_WIDTH); + end if; + ret.length := ret.length + 1; + end loop; + ret.last(ret.length-1) := '1'; + + 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 start_dds is + begin + dds_start <= '1'; + wait until rising_edge(clk); + dds_start <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure start_rtps is + begin + rtps_start <= '1'; + wait until rising_edge(clk); + rtps_start <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure wait_on_dds is + begin + if (dds_done /= '1') then + wait until dds_done = '1'; + end if; + end procedure; + + procedure wait_on_rtps is + begin + if (rtps_done /= '1') then + wait until rtps_done = '1'; + end if; + end procedure; + + procedure wait_on_completion is + begin + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; + end if; + end procedure; + + begin + + SetAlertLogName("dds_reader - (KEEP ALL, Best Effort, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - RTPS Handling"); + SetAlertEnable(FAILURE, TRUE); + SetAlertEnable(ERROR, TRUE); + SetAlertEnable(WARNING, TRUE); + SetLogEnable(DEBUG, FALSE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, TRUE); + RV.InitSeed(RV'instance_name); + sstate_id <= GetAlertLogID("Sample State", ALERTLOG_BASE_ID); + vstate_id <= GetAlertLogID("View State", ALERTLOG_BASE_ID); + istate_id <= GetAlertLogID("Instance State", ALERTLOG_BASE_ID); + ts_id <= GetAlertLogID("Source Timestamp", ALERTLOG_BASE_ID); + inst_id <= GetAlertLogID("Instance Handle", ALERTLOG_BASE_ID); + pub_id <= GetAlertLogID("Publication Hanlde", ALERTLOG_BASE_ID); + dis_gen_cnt_id <= GetAlertLogID("Disposed Generation Count", ALERTLOG_BASE_ID); + no_w_gen_cnt_id <= GetAlertLogID("No Writers Generation Count", ALERTLOG_BASE_ID); + srank_id <= GetAlertLogID("Sample Rank", ALERTLOG_BASE_ID); + grank_id <= GetAlertLogID("Generation Rank", ALERTLOG_BASE_ID); + agrank_id <= GetAlertLogID("Absolute Generation Rank", ALERTLOG_BASE_ID); + last_id <= GetAlertLogID("Last Sample", ALERTLOG_BASE_ID); + valid_id <= GetAlertLogID("Valid Data", ALERTLOG_BASE_ID); + data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID); + ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID); + + -- Key Hashes + kh1 := gen_key_hash; + kh2 := gen_key_hash; + kh3 := gen_key_hash; + kh4 := gen_key_hash; + + + + Log("Initiating Test", INFO); + reset <= '1'; + wait until rising_edge(clk); + wait until rising_edge(clk); + reset <= '0'; + -- MEM: 0, 0, 0, 0 + -- ISTATE: - + -- WRITER: - + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(1,0); + + -- TEST: NORMAL ADD_CACHE_CHANGE + -- TEST: SAMPLE WITH ALIGNED PAYLOAD + -- TEST: NORMAL SAMPLE [UNKNOWN INSTANCE] + -- TEST: SAMPLE WITH KEY_HASH + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S1, 0, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := HANDLE_NIL; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(2,0); + + -- TEST: SAMPLE WITHOUT KEY_HASH + -- TEST: NORMAL SAMPLE [KNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [NO KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + s.inst := kh1; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S1, I1S2, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,18); + cc.src_timestamp := gen_duration(2,0); + + -- TEST: SAMPLE WITH UNALIGNED PAYLOAD [>1 SLOT] + -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S2, I1S3+, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I1S3+, 0, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(3,0); + + -- TEST: DISPOSE SAMPLE [KNOWN INSTANCE] + -- TEST: SAMPLE WITH SERIALIZED KEY [WITH KEY_HASH] + -- TEST: SAMPLE WITH UNALIGNED PAYLOAD [<1 SLOT] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + s.inst := kh1; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S3+, I1S4-, 0, 0 + -- ISTATE: I1:DISPOSED + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh2; + cc.payload := gen_payload(kh2,20); + cc.src_timestamp := gen_duration(4,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S3+, I1S4-, I2S1+, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE + -- WRITER: W0:I1, W1:I2 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(5,0); + + -- TEST: TEST SAMPLE WITH SERIALIZED KEY EFFECT ON PAYLOAD MEMORY FULLNESS + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S3+, I1S4-, I2S1+, I3S1 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I1, W1:I2,I3 + + -- TEST: REMOVE_WRITER [UNKNOWN WRITER] + + Log("RTPS Operation REMOVE_WRITER [Writer 2] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, NOT_READ_SAMPLE_STATE, NOT_ALIVE_DISPOSED_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := NOT_READ_SAMPLE_STATE; + dds.istate := NOT_ALIVE_DISPOSED_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I1S3+, I2S1+, I3S1, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I1, W1:I2,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(6,0); + + -- TEST: ADD_CACHE_CHANGE ON PAYLOAD MEMORY FULL + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I1, W1:I2,I3, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh4; + cc.payload := gen_payload(kh4,10); + cc.src_timestamp := gen_duration(7,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + -- TEST: REMOVE_WRITER [KNOWN WRITER (1 Instance)] + + Log("RTPS Operation REMOVE_WRITER [Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 0; + change_istate(kh1, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W1:I2,I3, W2:I3 + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + remove_inst(kh1, mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, I4S1 + -- ISTATE: I2:ALIVE, I3:ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I3S1, I3S2, I4S1, 0 + -- ISTATE: I2:ALIVE, I3:ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(8,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(8,0); + + -- TEST: DISPOSE SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 0] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh4; + cc.payload := gen_payload(kh4,10); + cc.src_timestamp := gen_duration(8,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S1, I4S2 + -- ISTATE: I2:ALIVE, I3:ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(9,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + -- TEST: REMOVE_WRITER [KNOWN WRITER (>1 Instances)] + + Log("RTPS Operation REMOVE_WRITER [Writer 1] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 1; + change_istate(kh2, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + change_istate(kh4, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S1, I4S2 + -- ISTATE: I2:NO_WRITERS, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W2:I3 + + -- TEST: ADD SAMPLE ON MAX_SAMPLES [UNKNOWN INSTANCE] + -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + remove_inst(kh2,mem); + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S2, I4S1, I4S2, I1S1 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W0:I1, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(10,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I4S1, I4S2, I1S1, I3S3 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W0:I1, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(11,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I4S2, I1S1, I3S3, I3S4 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W0:I1, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(12,0); + + -- TEST: ADD SAMPLE ON PAYLOAD MEMORY FULL & MAX_SAMPLES_PER_INSTANCE (Induce Double Remove) + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + remove_sample(2,mem); + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S1, I3S4, I3S5, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W0:I1, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,30); + cc.src_timestamp := gen_duration(13,0); + + -- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload (3 Slots)] (REJECTED: Payload memory Full)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := HANDLE_NIL; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(14,0); + + -- TEST: DISPOSE SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + -- TEST: SAMPLE WITH SERIALIZED KEY [WITHOUT KEY_HASH] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 4, Writer 1] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + s.inst := kh4; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S1, I3S4, I3S5, I4S3- + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(15,0); + + -- TEST: DISPOSE SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 4, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W0:I1,I4 W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(16,0); + + -- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, KNOWN WRITER] + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 4, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(17,0); + + -- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, UNKNOWN WRITER] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh2; + cc.payload := gen_payload(kh2,5); + cc.src_timestamp := gen_duration(18,0); + + -- TEST: UNREGISTER SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 2, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(19,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + s := to_sample(cc,NOT_ALIVE_NO_WRITERS_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, 0, 0, 0 + -- ISTATE: I1:NO_WRITERS, I3:ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(20,0); + + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 2] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(21,0); + + -- TEST: FILTER SAMPLE [KNOWN INSTANCE] + -- TEST: FILTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 1, Writer 2] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(22,0); + + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE, STALE INSTANCE TRANSITION] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 4, Writer 1] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh2; + cc.payload := gen_payload(kh2,10); + cc.src_timestamp := gen_duration(23,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + remove_inst(kh4, mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, I2S1, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(24,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 2] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, 0, 0, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(25,0); + + -- TEST: FILTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 1, Writer 2] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, I1S5-, 0, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(26,0); + + -- TEST: FILTER SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 4, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(10,0); + + -- TEST: SAMPLE WITH EARLY TIMESTAMP [TIMESTAMP EARLIER THAN LAST READ] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, I1S5-, I3S3, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + 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; + + alert_prc : process(all) + begin + if rising_edge(clk) then + -- TODO + end if; + end process; + + dds_prc : process(all) + variable col : COLLECTION_TYPE := DEFAULT_COLLECTION; + begin + if rising_edge(clk) then + dds_done <= '0'; + case (dds_stage ) is + when IDLE => + if (dds_start = '1') then + dds_stage <= START; + else + dds_done <= '1'; + end if; + when START => + if (ack_dds = '1') then + dds_stage <= DONE; + dds_cnt <= 0; + end if; + when DONE => + if (done_dds = '1') then + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + case (dds.ret_code) is + when RETCODE_OK => + gen_collection(mem, col, dds, INSTANCE_PRESENTATION_QOS, FALSE); + dds_stage <= CHECK_SI; + dds_cnt <= 0; + when others => + dds_stage <= IDLE; + end case; + end if; + when CHECK_SI => + if (si_valid = '1') then + AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); + AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); + AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); + AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); + AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); + AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); + AffirmIfEqual(no_w_gen_cnt_id, si_no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH))); + AffirmIfEqual(srank_id, si_sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH))); + AffirmIfEqual(grank_id, si_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH))); + AffirmIfEqual(agrank_id, si_absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH))); + if (dds_cnt = col.len-1) then + AffirmIf(last_id, si_last = '1', "Last Signal not pulled High"); + else + AffirmIf(last_id, si_last = '0', "Last Signal pulled High"); + end if; + if (si_valid_data = '1') then + AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected"); + dds_stage <= CHECK_DATA; + dds_cnt2 <= 0; + else + AffirmIf(valid_id, col.s(dds_cnt).data = EMPTY_TEST_PACKET, "Sample with Data expected"); + if (dds_cnt = col.len-1) then + -- DONE + dds_stage <= IDLE; + else + dds_cnt <= dds_cnt + 1; + end if; + end if; + end if; + when CHECK_DATA => + if (valid_out_dds = '1') then + AffirmIfEqual(data_id, data_out_dds, col.s(dds_cnt).data.data(dds_cnt2)); + dds_cnt2 <= dds_cnt2 + 1; + if (dds_cnt2 = col.s(dds_cnt).data.length-1) then + AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); + if (dds_cnt = col.len-1) then + -- DONE + dds_stage <= IDLE; + else + dds_stage <= CHECK_SI; + dds_cnt <= dds_cnt + 1; + end if; + end if; + end if; + end case; + end if; + + -- DEFAULT + start_dds <= '0'; + opcode_dds <= NOP; + instance_state_dds <= ANY_INSTANCE_STATE; + view_state_dds <= ANY_VIEW_STATE; + sample_state_dds <= ANY_SAMPLE_STATE; + instance_handle_dds <= HANDLE_NIL; + max_samples_dds <= (others => '0'); + get_data_dds <= '0'; + ready_out_dds <= '0'; + + + case (dds_stage ) is + when START => + start_dds <= '1'; + opcode_dds <= dds.opcode; + instance_state_dds <= dds.istate; + view_state_dds <= dds.vstate; + sample_state_dds <= dds.sstate; + instance_handle_dds <= dds.inst; + max_samples_dds <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH)); + when CHECK_SI => + if (si_valid = '1' and si_valid_data = '1') then + get_data_dds <= '1'; + end if; + when CHECK_DATA => + ready_out_dds <= '1'; + when others => + null; + end case; + end process; + + rtps_prc : process(all) + variable stimulus : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + if rising_edge(clk) then + rtps_done <= '0'; + case (rtps_stage) is + when IDLE => + if (rtps_start = '1') then + rtps_stage <= START; + else + rtps_done <= '1'; + end if; + when START => + if (ack_rtps = '1') then + case (rtps.opcode) is + when ADD_CACHE_CHANGE => + gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus); + rtps_stage <= PUSH; + when others => + rtps_stage <= DONE; + end case; + end if; + when PUSH => + if (ready_in_rtps = '1') then + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = stimulus.length-1) then + rtps_stage <= DONE; + end if; + end if; + when DONE => + if (done_rtps = '1') then + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + rtps_stage <= IDLE; + end if; + end case; + end if; + + -- DEFAULT + start_rtps <= '0'; + opcode_rtps <= NOP; + valid_in_rtps <= '0'; + last_word_in_rtps <= '0'; + data_in_rtps <= (others => '0'); + + case (rtps_stage) is + when START => + start_rtps <= '1'; + opcode_rtps <= rtps.opcode; + case (rtps.opcode) is + when REMOVE_WRITER => + data_in_rtps <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH)); + when others => + null; + end case; + when PUSH => + valid_in_rtps <= '1'; + data_in_rtps <= stimulus.data(rtps_cnt); + last_word_in_rtps <= stimulus.last(rtps_cnt); + when others => + null; + end case; + end process; + + kh_prc : process (all) + variable tmp_key_hash : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + if rising_edge(clk) then + case (kh_stage) is + when IDLE => + if (start_kh = '1') then + case (opcode_kh) is + when PUSH_DATA => + kh_stage <= READ_DATA; + kh_cnt <= 0; + kh_data <= EMPTY_TEST_PACKET; + when PUSH_SERIALIZED_KEY => + kh_stage <= READ_DATA; + kh_cnt <= 0; + kh_data <= EMPTY_TEST_PACKET; + when READ_KEY_HASH => + kh_stage <= PUSH_KEY_HASH; + kh_cnt <= 0; + when others => + Alert("Unexpected Key Holder Operation", FAILURE); + end case; + end if; + when READ_DATA => + if (valid_out_kh = '1') then + kh_data.data(kh_cnt) <= data_out_kh; + kh_data.last(kh_cnt) <= last_word_out_kh; + kh_data.length <= kh_data.length + 1; + + kh_cnt <= kh_cnt + 1; + if (last_word_out_kh = '1') then + kh_stage <= IDLE; + end if; + end if; + when PUSH_KEY_HASH => + if (ready_in_kh = '1') then + kh_cnt <= kh_cnt + 1; + if (kh_cnt = INSTANCE_HANDLE_TYPE'length-1) then + kh_stage <= IDLE; + end if; + end if; + end case; + end if; + + -- DEFAULT + ack_kh <= '0'; + ready_out_kh <= '0'; + valid_in_kh <= '0'; + data_in_kh <= (others => '0'); + last_word_in_kh <= '0'; + + case (kh_stage) is + when IDLE => + if (start_kh = '1') then + ack_kh <= '1'; + end if; + when READ_DATA => + ready_out_kh <= '1'; + when PUSH_KEY_HASH => + valid_in_kh <= '1'; + tmp_key_hash := extract_key_hash(kh_data); + data_in_kh <= tmp_key_hash(kh_cnt); + if (kh_cnt = INSTANCE_HANDLE_TYPE'length-1) then + last_word_in_kh <= '1'; + end if; + end case; + 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_dds_reader_test1_arzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test1_arzkriu.vhd new file mode 100644 index 0000000..6257cd9 --- /dev/null +++ b/src/Tests/Level_0/L0_dds_reader_test1_arzkriu.vhd @@ -0,0 +1,1445 @@ +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 RTPS handling of the DDS Reader. It tests the correctness of the RTPS ADD_CACHE_CHANGE, and REMOVE_WRITER Operations. +-- Implicitly some DDS Operations are also tested, since they are used for state checking. +-- More specifically the testbench covers following tests: +-- TEST: NORMAL ADD_CACHE_CHANGE +-- TEST: ADD_CACHE_CHANGE ON PAYLOAD MEMORY FULL +-- TEST: REMOVE_WRITER [UNKNOWN WRITER] +-- TEST: REMOVE_WRITER [KNOWN WRITER (1 Instance)] +-- TEST: REMOVE_WRITER [KNOWN WRITER (>1 Instances)] +-- TEST: SAMPLE WITH ALIGNED PAYLOAD +-- TEST: SAMPLE WITH UNALIGNED PAYLOAD [>1 SLOT] +-- TEST: SAMPLE WITH UNALIGNED PAYLOAD [<1 SLOT] +-- TEST: NORMAL SAMPLE [KNOWN INSTANCE] +-- TEST: NORMAL SAMPLE [UNKNOWN INSTANCE] +-- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, KNOWN WRITER] +-- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, UNKNOWN WRITER] +-- TEST: UNREGISTER SAMPLE [UNKNOWN INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE, STALE INSTANCE TRANSITION] +-- TEST: DISPOSE SAMPLE [KNOWN INSTANCE] +-- TEST: DISPOSE SAMPLE [UNKNOWN INSTANCE] +-- TEST: DISPOSE SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: DISPOSE SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: FILTER SAMPLE [KNOWN INSTANCE] +-- TEST: FILTER SAMPLE [UNKNOWN INSTANCE] +-- TEST: FILTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: FILTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: SAMPLE WITH KEY_HASH +-- TEST: SAMPLE WITHOUT KEY_HASH +-- TEST: SAMPLE WITH SERIALIZED KEY [WITH KEY_HASH] +-- TEST: SAMPLE WITH SERIALIZED KEY [WITHOUT KEY_HASH] +-- TEST: SAMPLE WITH EARLY TIMESTAMP [TIMESTAMP EARLIER THAN LAST READ] +-- TEST: TEST SAMPLE WITH SERIALIZED KEY EFFECT ON PAYLOAD MEMORY FULLNESS +-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE +-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES [UNKNOWN INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] +-- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE + +entity L0_dds_reader_test1_arzkriu is +end entity; + + +architecture testbench of L0_dds_reader_test1_arzkriu is + + -- *CONSTANT DECLARATION* + constant MAX_REMOTE_ENDPOINTS : natural := 3; + + -- *TYPE DECLARATION* + type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA); + type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE); + type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); + + -- *SIGNAL DECLARATION* + signal clk : std_logic := '0'; + signal reset : std_logic := '1'; + signal check_time : TIME_TYPE := TIME_ZERO; + signal start_rtps, start_dds, start_kh, ack_rtps, ack_dds, ack_kh, done_rtps, done_dds : std_logic := '0'; + signal opcode_rtps : HISTORY_CACHE_OPCODE_TYPE := NOP; + signal opcode_dds : DDS_READER_OPCODE_TYPE := NOP; + signal opcode_kh : KEY_HOLDER_OPCODE_TYPE := NOP; + signal ret_rtps : HISTORY_CACHE_RESPONSE_TYPE := ERROR; + signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic := '0'; + signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic := '0'; + signal ready_in_kh, ready_out_kh, valid_in_kh, valid_out_kh, last_word_in_kh, last_word_out_kh : std_logic := '0'; + signal data_in_rtps, data_out_dds, data_in_kh, data_out_kh : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal get_data_dds, si_valid_data, si_valid, si_last, abort_kh : std_logic := '0'; + signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); + signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); + signal instance_state_dds, si_instance_state : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0) := ANY_INSTANCE_STATE; + signal view_state_dds, si_view_state : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0) := ANY_VIEW_STATE; + signal sample_state_dds, si_sample_state : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := ANY_SAMPLE_STATE; + signal instance_handle_dds, si_instance_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + signal max_samples_dds : std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0) := (others => '0'); + signal si_source_timestamp : TIME_TYPE := TIME_INVALID; + signal si_publication_handle : PUBLICATION_HANDLE_TYPE := (others => (others => '0')); + signal si_disposed_generation_count : std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_no_writers_generation_count : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_sample_rank : std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0) := (others => '0'); + signal si_generation_rank : std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0) := (others => '0'); + signal si_absolute_generation_rank: std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + + signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, dds_cnt2, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; + signal kh_stage : KH_STAGE_TYPE := IDLE; + signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST; + shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST; + shared variable mem : DDS_READER_MEM_TYPE := DEFAULT_DDS_READER_MEM; + signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, last_id, valid_id : AlertLogIDType; + + -- *FUNCTION DECLARATION* + function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is + variable ret : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + for i in 0 to 3 loop + ret(i) := not payload.data(i); + end loop; + + return ret; + end function; + + 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.dds_reader(arch) + generic map ( + TIME_BASED_FILTER_QOS => DURATION_ZERO, + DEADLINE_QOS => DURATION_INFINITE, + MAX_SAMPLES => std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH)), + MAX_INSTANCES => std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH)), + MAX_SAMPLES_PER_INSTANCE => std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH)), + HISTORY_QOS => KEEP_ALL_HISTORY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, + PRESENTATION_QOS => INSTANCE_PRESENTATION_QOS, + DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, + COHERENT_ACCESS => FALSE, + ORDERED_ACCESS => FALSE, + WITH_KEY => TRUE, + PAYLOAD_FRAME_SIZE => 11, + MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS + ) + port map ( + clk => clk, + reset => reset, + time => check_time, + start_rtps => start_rtps, + opcode_rtps => opcode_rtps, + ack_rtps => ack_rtps, + done_rtps => done_rtps, + ret_rtps => ret_rtps, + data_in_rtps => data_in_rtps, + valid_in_rtps => valid_in_rtps, + ready_in_rtps => ready_in_rtps, + last_word_in_rtps => last_word_in_rtps, + start_kh => start_kh, + opcode_kh => opcode_kh, + ack_kh => ack_kh, + data_in_kh => data_in_kh, + valid_in_kh => valid_in_kh, + ready_in_kh => ready_in_kh, + last_word_in_kh => last_word_in_kh, + data_out_kh => data_out_kh, + valid_out_kh => valid_out_kh, + ready_out_kh => ready_out_kh, + last_word_out_kh => last_word_out_kh, + abort_kh => abort_kh, + start_dds => start_dds, + ack_dds => ack_dds, + opcode_dds => opcode_dds, + instance_state_dds => instance_state_dds, + view_state_dds => view_state_dds, + sample_state_dds => sample_state_dds, + instance_handle_dds => instance_handle_dds, + max_samples_dds => max_samples_dds, + get_data_dds => get_data_dds, + done_dds => done_dds, + return_code_dds => return_code_dds, + ready_out_dds => ready_out_dds, + valid_out_dds => valid_out_dds, + data_out_dds => data_out_dds, + last_word_out_dds => last_word_out_dds, + si_sample_state => si_sample_state, + si_view_state => si_view_state, + si_instance_state => si_instance_state, + si_source_timestamp => si_source_timestamp, + si_instance_handle => si_instance_handle, + si_publication_handle => si_publication_handle, + si_disposed_generation_count => si_disposed_generation_count, + si_no_writers_generation_count => si_no_writers_generation_count, + si_sample_rank => si_sample_rank, + si_generation_rank => si_generation_rank, + si_absolute_generation_rank => si_absolute_generation_rank, + si_valid_data => si_valid_data, + si_valid => si_valid, + si_last => si_last, + status => status + ); + + stimulus_prc : process + variable RV : RandomPType; + variable kh1, kh2, kh3, kh4 : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + variable cc1, cc2, cc3, cc4, cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE; + variable s : SAMPLE_TYPE := DEFAULT_SAMPLE; + + impure function gen_payload(key_hash : INSTANCE_HANDLE_TYPE; len : natural) return TEST_PACKET_TYPE is + variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + assert (len >= 4) report "Payload length has to be at least 16 Bytes long" severity FAILURE; + + for i in 0 to len-1 loop + if (i < 4) then + -- NOTE: Beginning of payload is negated key to allow deterministic Key Hash generation from the kh_prc + ret.data(ret.length) := not key_hash(i); + else + ret.data(ret.length) := RV.RandSlv(WORD_WIDTH); + end if; + ret.length := ret.length + 1; + end loop; + ret.last(ret.length-1) := '1'; + + 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 start_dds is + begin + dds_start <= '1'; + wait until rising_edge(clk); + dds_start <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure start_rtps is + begin + rtps_start <= '1'; + wait until rising_edge(clk); + rtps_start <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure wait_on_dds is + begin + if (dds_done /= '1') then + wait until dds_done = '1'; + end if; + end procedure; + + procedure wait_on_rtps is + begin + if (rtps_done /= '1') then + wait until rtps_done = '1'; + end if; + end procedure; + + procedure wait_on_completion is + begin + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; + end if; + end procedure; + + begin + + SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - RTPS Handling"); + SetAlertEnable(FAILURE, TRUE); + SetAlertEnable(ERROR, TRUE); + SetAlertEnable(WARNING, TRUE); + SetLogEnable(DEBUG, FALSE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, TRUE); + RV.InitSeed(RV'instance_name); + sstate_id <= GetAlertLogID("Sample State", ALERTLOG_BASE_ID); + vstate_id <= GetAlertLogID("View State", ALERTLOG_BASE_ID); + istate_id <= GetAlertLogID("Instance State", ALERTLOG_BASE_ID); + ts_id <= GetAlertLogID("Source Timestamp", ALERTLOG_BASE_ID); + inst_id <= GetAlertLogID("Instance Handle", ALERTLOG_BASE_ID); + pub_id <= GetAlertLogID("Publication Hanlde", ALERTLOG_BASE_ID); + dis_gen_cnt_id <= GetAlertLogID("Disposed Generation Count", ALERTLOG_BASE_ID); + no_w_gen_cnt_id <= GetAlertLogID("No Writers Generation Count", ALERTLOG_BASE_ID); + srank_id <= GetAlertLogID("Sample Rank", ALERTLOG_BASE_ID); + grank_id <= GetAlertLogID("Generation Rank", ALERTLOG_BASE_ID); + agrank_id <= GetAlertLogID("Absolute Generation Rank", ALERTLOG_BASE_ID); + last_id <= GetAlertLogID("Last Sample", ALERTLOG_BASE_ID); + valid_id <= GetAlertLogID("Valid Data", ALERTLOG_BASE_ID); + data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID); + ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID); + + -- Key Hashes + kh1 := gen_key_hash; + kh2 := gen_key_hash; + kh3 := gen_key_hash; + kh4 := gen_key_hash; + + + + Log("Initiating Test", INFO); + reset <= '1'; + wait until rising_edge(clk); + wait until rising_edge(clk); + reset <= '0'; + -- MEM: 0, 0, 0, 0 + -- ISTATE: - + -- WRITER: - + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(1,0); + + -- TEST: NORMAL ADD_CACHE_CHANGE + -- TEST: SAMPLE WITH ALIGNED PAYLOAD + -- TEST: NORMAL SAMPLE [UNKNOWN INSTANCE] + -- TEST: SAMPLE WITH KEY_HASH + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S1, 0, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := HANDLE_NIL; + cc.payload := gen_payload(kh1,18); + cc.src_timestamp := gen_duration(2,0); + + -- TEST: SAMPLE WITHOUT KEY_HASH + -- TEST: SAMPLE WITH UNALIGNED PAYLOAD [>1 SLOT] + -- TEST: NORMAL SAMPLE [KNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [NO KEY_HASH, Instance 1, Writer 0, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + s.inst := kh1; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S1, I1S2+, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + -- VAILDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(3,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 0] (REJECTED: MAX_SAMPLES_PER_INSTANCE exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I1S2+, 0, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + -- TEST: DISPOSE SAMPLE [KNOWN INSTANCE] + -- TEST: SAMPLE WITH SERIALIZED KEY [WITH KEY_HASH] + -- TEST: SAMPLE WITH UNALIGNED PAYLOAD [<1 SLOT] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + s.inst := kh1; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S2+, I1S3-, 0, 0 + -- ISTATE: I1:DISPOSED + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh2; + cc.payload := gen_payload(kh2,20); + cc.src_timestamp := gen_duration(4,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S2+, I1S3-, I2S1+, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE + -- WRITER: W0:I1, W1:I2 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(5,0); + + -- TEST: TEST SAMPLE WITH SERIALIZED KEY EFFECT ON PAYLOAD MEMORY FULLNESS + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2+, I1S3-, I2S1+, I3S1 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I1, W1:I2,I3 + + -- TEST: REMOVE_WRITER [UNKNOWN WRITER] + + Log("RTPS Operation REMOVE_WRITER [Writer 2] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, NOT_READ_SAMPLE_STATE, NOT_ALIVE_DISPOSED_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := NOT_READ_SAMPLE_STATE; + dds.istate := NOT_ALIVE_DISPOSED_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I1S2+, I2S1+, I3S1, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I1, W1:I2,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(6,0); + + -- TEST: ADD_CACHE_CHANGE ON PAYLOAD MEMORY FULL + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (REJECTED: Payload Memory Full)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I2S1+, I3S1, 0, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I1, W1:I2,I3 + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I1, W1:I2,I3, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh4; + cc.payload := gen_payload(kh4,10); + cc.src_timestamp := gen_duration(7,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + -- TEST: REMOVE_WRITER [KNOWN WRITER (1 Instance)] + + Log("RTPS Operation REMOVE_WRITER [Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 0; + change_istate(kh1, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3: ALIVE + -- WRITER: W1:I2,I3, W2:I3 + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + remove_inst(kh1, mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, I4S1 + -- ISTATE: I2:ALIVE, I3: ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I3S1, I3S2, I4S1, 0 + -- ISTATE: I2:ALIVE, I3: ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(8,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(8,0); + + -- TEST: DISPOSE SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 0] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh4; + cc.payload := gen_payload(kh4,10); + cc.src_timestamp := gen_duration(8,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S1, I4S2 + -- ISTATE: I2:ALIVE, I3: ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh2; + cc.payload := gen_payload(kh2,10); + cc.src_timestamp := gen_duration(9,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(9,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + -- TEST: REMOVE_WRITER [KNOWN WRITER (>1 Instances)] + + Log("RTPS Operation REMOVE_WRITER [Writer 1] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 1; + change_istate(kh2, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + change_istate(kh4, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S1, I4S2 + -- ISTATE: I2:NO_WRITER, I3: ALIVE, I4:NO_WRITER + -- WRITER: W2:I3 + + Log("DDS Operation TAKE_INSTANCE [Instance 4, MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE_INSTANCE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + dds.inst := kh4; + start_dds; + wait_on_dds; + -- MEM: I3S1, I3S2, I4S2, 0 + -- ISTATE: I2:NO_WRITER, I3: ALIVE, I4:NO_WRITER + -- WRITER: W2:I3 + + -- NOTE: We read the current KH4 Sample, so that we can easiy remove the new KH4 Sample + Log("DDS Operation READ_INSTANCE [Instance 4, MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ_INSTANCE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + dds.inst := kh4; + start_dds; + wait_on_dds; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := HANDLE_NIL; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(9,0); + + -- TEST: DISPOSE SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + -- TEST: SAMPLE WITH SERIALIZED KEY [WITHOUT KEY_HASH] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 4, Writer 1] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + s.inst := kh4; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S2, I4S3- + -- ISTATE: I2:NO_WRITER, I3: ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(10,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES [UNKNOWN INSTANCE] + -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, NOT_READ_SAMPLE_STATE, NOT_ALIVE_DISPOSED_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := NOT_READ_SAMPLE_STATE; + dds.istate := NOT_ALIVE_DISPOSED_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I3S1, I3S2, I4S2, 0 + -- ISTATE: I2:NO_WRITER, I3: ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,30); + cc.src_timestamp := gen_duration(9,0); + + -- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload (3 Slots)] (REJECTED: Payload Memory Full)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,20); + cc.src_timestamp := gen_duration(9,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + remove_inst(kh2, mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S2, I1S1+ + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(10,0); + + -- TEST: DISPOSE SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 4, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W0:I1,I4 W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(11,0); + + -- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, KNOWN WRITER] + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 4, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W0:I1 W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(12,0); + + -- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, UNKNOWN WRITER] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W0:I1 W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh2; + cc.payload := gen_payload(kh2,5); + cc.src_timestamp := gen_duration(13,0); + + -- TEST: UNREGISTER SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 2, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W0:I1 W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(14,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + s := to_sample(cc,NOT_ALIVE_NO_WRITERS_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, 0, 0, 0 + -- ISTATE: I1:NO_WRITERS, I3: ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(14,0); + + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 2] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(15,0); + + -- TEST: FILTER SAMPLE [KNOWN INSTANCE] + -- TEST: FILTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 1, Writer 2] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(16,0); + + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE, STALE INSTANCE TRANSITION] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 4, Writer 1] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh2; + cc.payload := gen_payload(kh2,10); + cc.src_timestamp := gen_duration(17,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + remove_inst(kh4, mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, I2S1, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(18,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 2] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, 0, 0, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(19,0); + + -- TEST: FILTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 1, Writer 2] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, I1S5-, 0, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(20,0); + + -- TEST: FILTER SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 4, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + -- TEST: SAMPLE WITH EARLY TIMESTAMP [TIMESTAMP EARLIER THAN LAST READ] + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(10,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, I1S5-, I3S3, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + 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; + + alert_prc : process(all) + begin + if rising_edge(clk) then + -- TODO + end if; + end process; + + dds_prc : process(all) + variable col : COLLECTION_TYPE := DEFAULT_COLLECTION; + begin + if rising_edge(clk) then + dds_done <= '0'; + case (dds_stage ) is + when IDLE => + if (dds_start = '1') then + dds_stage <= START; + else + dds_done <= '1'; + end if; + when START => + if (ack_dds = '1') then + dds_stage <= DONE; + dds_cnt <= 0; + end if; + when DONE => + if (done_dds = '1') then + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + case (dds.ret_code) is + when RETCODE_OK => + gen_collection(mem, col, dds, INSTANCE_PRESENTATION_QOS, FALSE); + dds_stage <= CHECK_SI; + dds_cnt <= 0; + when others => + dds_stage <= IDLE; + end case; + end if; + when CHECK_SI => + if (si_valid = '1') then + AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); + AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); + AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); + AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); + AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); + AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); + AffirmIfEqual(no_w_gen_cnt_id, si_no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH))); + AffirmIfEqual(srank_id, si_sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH))); + AffirmIfEqual(grank_id, si_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH))); + AffirmIfEqual(agrank_id, si_absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH))); + if (dds_cnt = col.len-1) then + AffirmIf(last_id, si_last = '1', "Last Signal not pulled High"); + else + AffirmIf(last_id, si_last = '0', "Last Signal pulled High"); + end if; + if (si_valid_data = '1') then + AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected"); + dds_stage <= CHECK_DATA; + dds_cnt2 <= 0; + else + AffirmIf(valid_id, col.s(dds_cnt).data = EMPTY_TEST_PACKET, "Sample with Data expected"); + if (dds_cnt = col.len-1) then + -- DONE + dds_stage <= IDLE; + else + dds_cnt <= dds_cnt + 1; + end if; + end if; + end if; + when CHECK_DATA => + if (valid_out_dds = '1') then + AffirmIfEqual(data_id, data_out_dds, col.s(dds_cnt).data.data(dds_cnt2)); + dds_cnt2 <= dds_cnt2 + 1; + if (dds_cnt2 = col.s(dds_cnt).data.length-1) then + AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); + if (dds_cnt = col.len-1) then + -- DONE + dds_stage <= IDLE; + else + dds_stage <= CHECK_SI; + dds_cnt <= dds_cnt + 1; + end if; + end if; + end if; + end case; + end if; + + -- DEFAULT + start_dds <= '0'; + opcode_dds <= NOP; + instance_state_dds <= ANY_INSTANCE_STATE; + view_state_dds <= ANY_VIEW_STATE; + sample_state_dds <= ANY_SAMPLE_STATE; + instance_handle_dds <= HANDLE_NIL; + max_samples_dds <= (others => '0'); + get_data_dds <= '0'; + ready_out_dds <= '0'; + + + case (dds_stage ) is + when START => + start_dds <= '1'; + opcode_dds <= dds.opcode; + instance_state_dds <= dds.istate; + view_state_dds <= dds.vstate; + sample_state_dds <= dds.sstate; + instance_handle_dds <= dds.inst; + max_samples_dds <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH)); + when CHECK_SI => + if (si_valid = '1' and si_valid_data = '1') then + get_data_dds <= '1'; + end if; + when CHECK_DATA => + ready_out_dds <= '1'; + when others => + null; + end case; + end process; + + rtps_prc : process(all) + variable stimulus : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + if rising_edge(clk) then + rtps_done <= '0'; + case (rtps_stage) is + when IDLE => + if (rtps_start = '1') then + rtps_stage <= START; + else + rtps_done <= '1'; + end if; + when START => + if (ack_rtps = '1') then + case (rtps.opcode) is + when ADD_CACHE_CHANGE => + gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus); + rtps_stage <= PUSH; + when others => + rtps_stage <= DONE; + end case; + end if; + when PUSH => + if (ready_in_rtps = '1') then + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = stimulus.length-1) then + rtps_stage <= DONE; + end if; + end if; + when DONE => + if (done_rtps = '1') then + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + rtps_stage <= IDLE; + end if; + end case; + end if; + + -- DEFAULT + start_rtps <= '0'; + opcode_rtps <= NOP; + valid_in_rtps <= '0'; + last_word_in_rtps <= '0'; + data_in_rtps <= (others => '0'); + + case (rtps_stage) is + when START => + start_rtps <= '1'; + opcode_rtps <= rtps.opcode; + case (rtps.opcode) is + when REMOVE_WRITER => + data_in_rtps <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH)); + when others => + null; + end case; + when PUSH => + valid_in_rtps <= '1'; + data_in_rtps <= stimulus.data(rtps_cnt); + last_word_in_rtps <= stimulus.last(rtps_cnt); + when others => + null; + end case; + end process; + + kh_prc : process (all) + variable tmp_key_hash : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + if rising_edge(clk) then + case (kh_stage) is + when IDLE => + if (start_kh = '1') then + case (opcode_kh) is + when PUSH_DATA => + kh_stage <= READ_DATA; + kh_cnt <= 0; + kh_data <= EMPTY_TEST_PACKET; + when PUSH_SERIALIZED_KEY => + kh_stage <= READ_DATA; + kh_cnt <= 0; + kh_data <= EMPTY_TEST_PACKET; + when READ_KEY_HASH => + kh_stage <= PUSH_KEY_HASH; + kh_cnt <= 0; + when others => + Alert("Unexpected Key Holder Operation", FAILURE); + end case; + end if; + when READ_DATA => + if (valid_out_kh = '1') then + kh_data.data(kh_cnt) <= data_out_kh; + kh_data.last(kh_cnt) <= last_word_out_kh; + kh_data.length <= kh_data.length + 1; + + kh_cnt <= kh_cnt + 1; + if (last_word_out_kh = '1') then + kh_stage <= IDLE; + end if; + end if; + when PUSH_KEY_HASH => + if (ready_in_kh = '1') then + kh_cnt <= kh_cnt + 1; + if (kh_cnt = INSTANCE_HANDLE_TYPE'length-1) then + kh_stage <= IDLE; + end if; + end if; + end case; + end if; + + -- DEFAULT + ack_kh <= '0'; + ready_out_kh <= '0'; + valid_in_kh <= '0'; + data_in_kh <= (others => '0'); + last_word_in_kh <= '0'; + + case (kh_stage) is + when IDLE => + if (start_kh = '1') then + ack_kh <= '1'; + end if; + when READ_DATA => + ready_out_kh <= '1'; + when PUSH_KEY_HASH => + valid_in_kh <= '1'; + tmp_key_hash := extract_key_hash(kh_data); + data_in_kh <= tmp_key_hash(kh_cnt); + if (kh_cnt = INSTANCE_HANDLE_TYPE'length-1) then + last_word_in_kh <= '1'; + end if; + end case; + 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_dds_reader_test1_arzksiu.vhd b/src/Tests/Level_0/L0_dds_reader_test1_arzksiu.vhd new file mode 100644 index 0000000..23c7e7e --- /dev/null +++ b/src/Tests/Level_0/L0_dds_reader_test1_arzksiu.vhd @@ -0,0 +1,1440 @@ +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 RTPS handling of the DDS Reader. It tests the correctness of the RTPS ADD_CACHE_CHANGE, and REMOVE_WRITER Operations. +-- Implicitly some DDS Operations are also tested, since they are used for state checking. +-- More specifically the testbench covers following tests: +-- TEST: NORMAL ADD_CACHE_CHANGE +-- TEST: ADD_CACHE_CHANGE ON PAYLOAD MEMORY FULL +-- TEST: REMOVE_WRITER [UNKNOWN WRITER] +-- TEST: REMOVE_WRITER [KNOWN WRITER (1 Instance)] +-- TEST: REMOVE_WRITER [KNOWN WRITER (>1 Instances)] +-- TEST: SAMPLE WITH ALIGNED PAYLOAD +-- TEST: SAMPLE WITH UNALIGNED PAYLOAD [>1 SLOT] +-- TEST: SAMPLE WITH UNALIGNED PAYLOAD [<1 SLOT] +-- TEST: NORMAL SAMPLE [KNOWN INSTANCE] +-- TEST: NORMAL SAMPLE [UNKNOWN INSTANCE] +-- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, KNOWN WRITER] +-- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, UNKNOWN WRITER] +-- TEST: UNREGISTER SAMPLE [UNKNOWN INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE, STALE INSTANCE TRANSITION] +-- TEST: DISPOSE SAMPLE [KNOWN INSTANCE] +-- TEST: DISPOSE SAMPLE [UNKNOWN INSTANCE] +-- TEST: DISPOSE SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: DISPOSE SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: FILTER SAMPLE [KNOWN INSTANCE] +-- TEST: FILTER SAMPLE [UNKNOWN INSTANCE] +-- TEST: FILTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: FILTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: SAMPLE WITH KEY_HASH +-- TEST: SAMPLE WITHOUT KEY_HASH +-- TEST: SAMPLE WITH SERIALIZED KEY [WITH KEY_HASH] +-- TEST: SAMPLE WITH SERIALIZED KEY [WITHOUT KEY_HASH] +-- TEST: SAMPLE WITH EARLY TIMESTAMP [TIMESTAMP EARLIER THAN LAST READ] +-- TEST: TEST SAMPLE WITH SERIALIZED KEY EFFECT ON PAYLOAD MEMORY FULLNESS +-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE +-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES [UNKNOWN INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] +-- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE + +entity L0_dds_reader_test1_arzksiu is +end entity; + + +architecture testbench of L0_dds_reader_test1_arzksiu is + + -- *CONSTANT DECLARATION* + constant MAX_REMOTE_ENDPOINTS : natural := 3; + + -- *TYPE DECLARATION* + type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA); + type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE); + type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); + + -- *SIGNAL DECLARATION* + signal clk : std_logic := '0'; + signal reset : std_logic := '1'; + signal check_time : TIME_TYPE := TIME_ZERO; + signal start_rtps, start_dds, start_kh, ack_rtps, ack_dds, ack_kh, done_rtps, done_dds : std_logic := '0'; + signal opcode_rtps : HISTORY_CACHE_OPCODE_TYPE := NOP; + signal opcode_dds : DDS_READER_OPCODE_TYPE := NOP; + signal opcode_kh : KEY_HOLDER_OPCODE_TYPE := NOP; + signal ret_rtps : HISTORY_CACHE_RESPONSE_TYPE := ERROR; + signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic := '0'; + signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic := '0'; + signal ready_in_kh, ready_out_kh, valid_in_kh, valid_out_kh, last_word_in_kh, last_word_out_kh : std_logic := '0'; + signal data_in_rtps, data_out_dds, data_in_kh, data_out_kh : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal get_data_dds, si_valid_data, si_valid, si_last, abort_kh : std_logic := '0'; + signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); + signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); + signal instance_state_dds, si_instance_state : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0) := ANY_INSTANCE_STATE; + signal view_state_dds, si_view_state : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0) := ANY_VIEW_STATE; + signal sample_state_dds, si_sample_state : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := ANY_SAMPLE_STATE; + signal instance_handle_dds, si_instance_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + signal max_samples_dds : std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0) := (others => '0'); + signal si_source_timestamp : TIME_TYPE := TIME_INVALID; + signal si_publication_handle : PUBLICATION_HANDLE_TYPE := (others => (others => '0')); + signal si_disposed_generation_count : std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_no_writers_generation_count : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_sample_rank : std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0) := (others => '0'); + signal si_generation_rank : std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0) := (others => '0'); + signal si_absolute_generation_rank: std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + + signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, dds_cnt2, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; + signal kh_stage : KH_STAGE_TYPE := IDLE; + signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST; + shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST; + shared variable mem : DDS_READER_MEM_TYPE := DEFAULT_DDS_READER_MEM; + signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, last_id, valid_id : AlertLogIDType; + + -- *FUNCTION DECLARATION* + function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is + variable ret : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + for i in 0 to 3 loop + ret(i) := not payload.data(i); + end loop; + + return ret; + end function; + + 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.dds_reader(arch) + generic map ( + TIME_BASED_FILTER_QOS => DURATION_ZERO, + DEADLINE_QOS => DURATION_INFINITE, + MAX_SAMPLES => std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH)), + MAX_INSTANCES => std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH)), + MAX_SAMPLES_PER_INSTANCE => std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH)), + HISTORY_QOS => KEEP_ALL_HISTORY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, + PRESENTATION_QOS => INSTANCE_PRESENTATION_QOS, + DESTINATION_ORDER_QOS => BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS, + COHERENT_ACCESS => FALSE, + ORDERED_ACCESS => FALSE, + WITH_KEY => TRUE, + PAYLOAD_FRAME_SIZE => 11, + MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS + ) + port map ( + clk => clk, + reset => reset, + time => check_time, + start_rtps => start_rtps, + opcode_rtps => opcode_rtps, + ack_rtps => ack_rtps, + done_rtps => done_rtps, + ret_rtps => ret_rtps, + data_in_rtps => data_in_rtps, + valid_in_rtps => valid_in_rtps, + ready_in_rtps => ready_in_rtps, + last_word_in_rtps => last_word_in_rtps, + start_kh => start_kh, + opcode_kh => opcode_kh, + ack_kh => ack_kh, + data_in_kh => data_in_kh, + valid_in_kh => valid_in_kh, + ready_in_kh => ready_in_kh, + last_word_in_kh => last_word_in_kh, + data_out_kh => data_out_kh, + valid_out_kh => valid_out_kh, + ready_out_kh => ready_out_kh, + last_word_out_kh => last_word_out_kh, + abort_kh => abort_kh, + start_dds => start_dds, + ack_dds => ack_dds, + opcode_dds => opcode_dds, + instance_state_dds => instance_state_dds, + view_state_dds => view_state_dds, + sample_state_dds => sample_state_dds, + instance_handle_dds => instance_handle_dds, + max_samples_dds => max_samples_dds, + get_data_dds => get_data_dds, + done_dds => done_dds, + return_code_dds => return_code_dds, + ready_out_dds => ready_out_dds, + valid_out_dds => valid_out_dds, + data_out_dds => data_out_dds, + last_word_out_dds => last_word_out_dds, + si_sample_state => si_sample_state, + si_view_state => si_view_state, + si_instance_state => si_instance_state, + si_source_timestamp => si_source_timestamp, + si_instance_handle => si_instance_handle, + si_publication_handle => si_publication_handle, + si_disposed_generation_count => si_disposed_generation_count, + si_no_writers_generation_count => si_no_writers_generation_count, + si_sample_rank => si_sample_rank, + si_generation_rank => si_generation_rank, + si_absolute_generation_rank => si_absolute_generation_rank, + si_valid_data => si_valid_data, + si_valid => si_valid, + si_last => si_last, + status => status + ); + + stimulus_prc : process + variable RV : RandomPType; + variable kh1, kh2, kh3, kh4 : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + variable cc1, cc2, cc3, cc4, cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE; + variable s : SAMPLE_TYPE := DEFAULT_SAMPLE; + + impure function gen_payload(key_hash : INSTANCE_HANDLE_TYPE; len : natural) return TEST_PACKET_TYPE is + variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + assert (len >= 4) report "Payload length has to be at least 16 Bytes long" severity FAILURE; + + for i in 0 to len-1 loop + if (i < 4) then + -- NOTE: Beginning of payload is negated key to allow deterministic Key Hash generation from the kh_prc + ret.data(ret.length) := not key_hash(i); + else + ret.data(ret.length) := RV.RandSlv(WORD_WIDTH); + end if; + ret.length := ret.length + 1; + end loop; + ret.last(ret.length-1) := '1'; + + 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 start_dds is + begin + dds_start <= '1'; + wait until rising_edge(clk); + dds_start <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure start_rtps is + begin + rtps_start <= '1'; + wait until rising_edge(clk); + rtps_start <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure wait_on_dds is + begin + if (dds_done /= '1') then + wait until dds_done = '1'; + end if; + end procedure; + + procedure wait_on_rtps is + begin + if (rtps_done /= '1') then + wait until rtps_done = '1'; + end if; + end procedure; + + procedure wait_on_completion is + begin + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; + end if; + end procedure; + + begin + + SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS, ACCESS SCOPE Instance, Unordered) - Level 0 - RTPS Handling"); + SetAlertEnable(FAILURE, TRUE); + SetAlertEnable(ERROR, TRUE); + SetAlertEnable(WARNING, TRUE); + SetLogEnable(DEBUG, FALSE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, TRUE); + RV.InitSeed(RV'instance_name); + sstate_id <= GetAlertLogID("Sample State", ALERTLOG_BASE_ID); + vstate_id <= GetAlertLogID("View State", ALERTLOG_BASE_ID); + istate_id <= GetAlertLogID("Instance State", ALERTLOG_BASE_ID); + ts_id <= GetAlertLogID("Source Timestamp", ALERTLOG_BASE_ID); + inst_id <= GetAlertLogID("Instance Handle", ALERTLOG_BASE_ID); + pub_id <= GetAlertLogID("Publication Hanlde", ALERTLOG_BASE_ID); + dis_gen_cnt_id <= GetAlertLogID("Disposed Generation Count", ALERTLOG_BASE_ID); + no_w_gen_cnt_id <= GetAlertLogID("No Writers Generation Count", ALERTLOG_BASE_ID); + srank_id <= GetAlertLogID("Sample Rank", ALERTLOG_BASE_ID); + grank_id <= GetAlertLogID("Generation Rank", ALERTLOG_BASE_ID); + agrank_id <= GetAlertLogID("Absolute Generation Rank", ALERTLOG_BASE_ID); + last_id <= GetAlertLogID("Last Sample", ALERTLOG_BASE_ID); + valid_id <= GetAlertLogID("Valid Data", ALERTLOG_BASE_ID); + data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID); + ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID); + + -- Key Hashes + kh1 := gen_key_hash; + kh2 := gen_key_hash; + kh3 := gen_key_hash; + kh4 := gen_key_hash; + + + + Log("Initiating Test", INFO); + reset <= '1'; + wait until rising_edge(clk); + wait until rising_edge(clk); + reset <= '0'; + -- MEM: 0, 0, 0, 0 + -- ISTATE: - + -- WRITER: - + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(1,0); + + -- TEST: NORMAL ADD_CACHE_CHANGE + -- TEST: SAMPLE WITH ALIGNED PAYLOAD + -- TEST: NORMAL SAMPLE [UNKNOWN INSTANCE] + -- TEST: SAMPLE WITH KEY_HASH + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S1, 0, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := HANDLE_NIL; + cc.payload := gen_payload(kh1,18); + cc.src_timestamp := gen_duration(2,0); + + -- TEST: SAMPLE WITHOUT KEY_HASH + -- TEST: SAMPLE WITH UNALIGNED PAYLOAD [>1 SLOT] + -- TEST: NORMAL SAMPLE [KNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [NO KEY_HASH, Instance 1, Writer 0, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + s.inst := kh1; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S1, I1S2+, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + -- VAILDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(3,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 0] (REJECTED: MAX_SAMPLES_PER_INSTANCE exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I1S2+, 0, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + -- TEST: DISPOSE SAMPLE [KNOWN INSTANCE] + -- TEST: SAMPLE WITH SERIALIZED KEY [WITH KEY_HASH] + -- TEST: SAMPLE WITH UNALIGNED PAYLOAD [<1 SLOT] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + s.inst := kh1; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S2+, I1S3-, 0, 0 + -- ISTATE: I1:DISPOSED + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh2; + cc.payload := gen_payload(kh2,20); + cc.src_timestamp := gen_duration(4,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S2+, I1S3-, I2S1+, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE + -- WRITER: W0:I1, W1:I2 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(5,0); + + -- TEST: TEST SAMPLE WITH SERIALIZED KEY EFFECT ON PAYLOAD MEMORY FULLNESS + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2+, I1S3-, I2S1+, I3S1 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I1, W1:I2,I3 + + -- TEST: REMOVE_WRITER [UNKNOWN WRITER] + + Log("RTPS Operation REMOVE_WRITER [Writer 2] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, NOT_READ_SAMPLE_STATE, NOT_ALIVE_DISPOSED_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := NOT_READ_SAMPLE_STATE; + dds.istate := NOT_ALIVE_DISPOSED_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I1S2+, I2S1+, I3S1, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I1, W1:I2,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(6,0); + + -- TEST: ADD_CACHE_CHANGE ON PAYLOAD MEMORY FULL + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (REJECTED: Payload Memory Full)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I2S1+, I3S1, 0, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I1, W1:I2,I3 + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I1, W1:I2,I3, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh4; + cc.payload := gen_payload(kh4,10); + cc.src_timestamp := gen_duration(7,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + -- TEST: REMOVE_WRITER [KNOWN WRITER (1 Instance)] + + Log("RTPS Operation REMOVE_WRITER [Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 0; + change_istate(kh1, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3: ALIVE + -- WRITER: W1:I2,I3, W2:I3 + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + remove_inst(kh1, mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, I4S1 + -- ISTATE: I2:ALIVE, I3: ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I3S1, I3S2, I4S1, 0 + -- ISTATE: I2:ALIVE, I3: ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(8,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(8,0); + + -- TEST: DISPOSE SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 0] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh4; + cc.payload := gen_payload(kh4,10); + cc.src_timestamp := gen_duration(8,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S1, I4S2 + -- ISTATE: I2:ALIVE, I3: ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh2; + cc.payload := gen_payload(kh2,10); + cc.src_timestamp := gen_duration(9,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(9,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + -- TEST: REMOVE_WRITER [KNOWN WRITER (>1 Instances)] + + Log("RTPS Operation REMOVE_WRITER [Writer 1] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 1; + change_istate(kh2, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + change_istate(kh4, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S1, I4S2 + -- ISTATE: I2:NO_WRITER, I3: ALIVE, I4:NO_WRITER + -- WRITER: W2:I3 + + Log("DDS Operation TAKE_INSTANCE [Instance 4, MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE_INSTANCE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + dds.inst := kh4; + start_dds; + wait_on_dds; + -- MEM: I3S1, I3S2, I4S2, 0 + -- ISTATE: I2:NO_WRITER, I3: ALIVE, I4:NO_WRITER + -- WRITER: W2:I3 + + -- NOTE: We read the current KH4 Sample, so that we can easiy remove the new KH4 Sample + Log("DDS Operation READ_INSTANCE [Instance 4, MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ_INSTANCE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + dds.inst := kh4; + start_dds; + wait_on_dds; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := HANDLE_NIL; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(9,0); + + -- TEST: DISPOSE SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + -- TEST: SAMPLE WITH SERIALIZED KEY [WITHOUT KEY_HASH] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 4, Writer 1] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + s.inst := kh4; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S2, I4S3- + -- ISTATE: I2:NO_WRITER, I3: ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(10,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES [UNKNOWN INSTANCE] + -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, NOT_READ_SAMPLE_STATE, NOT_ALIVE_DISPOSED_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := NOT_READ_SAMPLE_STATE; + dds.istate := NOT_ALIVE_DISPOSED_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I3S1, I3S2, I4S2, 0 + -- ISTATE: I2:NO_WRITER, I3: ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,30); + cc.src_timestamp := gen_duration(9,0); + + -- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload (3 Slots)] (REJECTED: Payload Memory Full)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,20); + cc.src_timestamp := gen_duration(9,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + remove_inst(kh2, mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S2, I1S1+ + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(10,0); + + -- TEST: DISPOSE SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 4, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W0:I1,I4 W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(11,0); + + -- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, KNOWN WRITER] + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 4, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W0:I1 W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(12,0); + + -- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, UNKNOWN WRITER] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W0:I1 W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh2; + cc.payload := gen_payload(kh2,5); + cc.src_timestamp := gen_duration(13,0); + + -- TEST: UNREGISTER SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 2, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W0:I1 W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(14,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + s := to_sample(cc,NOT_ALIVE_NO_WRITERS_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, 0, 0, 0 + -- ISTATE: I1:NO_WRITERS, I3: ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(14,0); + + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 2] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(15,0); + + -- TEST: FILTER SAMPLE [KNOWN INSTANCE] + -- TEST: FILTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 1, Writer 2] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(16,0); + + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE, STALE INSTANCE TRANSITION] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 4, Writer 1] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, 0, 0 + -- ISTATE: I1:ALIVE, I3: ALIVE, I4:DISPOSED + -- WRITER: W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh2; + cc.payload := gen_payload(kh2,10); + cc.src_timestamp := gen_duration(17,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + remove_inst(kh4, mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, I2S1, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(18,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 2] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, 0, 0, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(19,0); + + -- TEST: FILTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 1, Writer 2] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, I1S5-, 0, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3: ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(20,0); + + -- TEST: FILTER SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 4, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + -- TEST: SAMPLE WITH EARLY TIMESTAMP [TIMESTAMP EARLIER THAN LAST READ] + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(10,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (IGNORED: Timestamp earlier than last read)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + 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; + + alert_prc : process(all) + begin + if rising_edge(clk) then + -- TODO + end if; + end process; + + dds_prc : process(all) + variable col : COLLECTION_TYPE := DEFAULT_COLLECTION; + begin + if rising_edge(clk) then + dds_done <= '0'; + case (dds_stage ) is + when IDLE => + if (dds_start = '1') then + dds_stage <= START; + else + dds_done <= '1'; + end if; + when START => + if (ack_dds = '1') then + dds_stage <= DONE; + dds_cnt <= 0; + end if; + when DONE => + if (done_dds = '1') then + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + case (dds.ret_code) is + when RETCODE_OK => + gen_collection(mem, col, dds, INSTANCE_PRESENTATION_QOS, FALSE); + dds_stage <= CHECK_SI; + dds_cnt <= 0; + when others => + dds_stage <= IDLE; + end case; + end if; + when CHECK_SI => + if (si_valid = '1') then + AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); + AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); + AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); + AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); + AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); + AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); + AffirmIfEqual(no_w_gen_cnt_id, si_no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH))); + AffirmIfEqual(srank_id, si_sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH))); + AffirmIfEqual(grank_id, si_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH))); + AffirmIfEqual(agrank_id, si_absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH))); + if (dds_cnt = col.len-1) then + AffirmIf(last_id, si_last = '1', "Last Signal not pulled High"); + else + AffirmIf(last_id, si_last = '0', "Last Signal pulled High"); + end if; + if (si_valid_data = '1') then + AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected"); + dds_stage <= CHECK_DATA; + dds_cnt2 <= 0; + else + AffirmIf(valid_id, col.s(dds_cnt).data = EMPTY_TEST_PACKET, "Sample with Data expected"); + if (dds_cnt = col.len-1) then + -- DONE + dds_stage <= IDLE; + else + dds_cnt <= dds_cnt + 1; + end if; + end if; + end if; + when CHECK_DATA => + if (valid_out_dds = '1') then + AffirmIfEqual(data_id, data_out_dds, col.s(dds_cnt).data.data(dds_cnt2)); + dds_cnt2 <= dds_cnt2 + 1; + if (dds_cnt2 = col.s(dds_cnt).data.length-1) then + AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); + if (dds_cnt = col.len-1) then + -- DONE + dds_stage <= IDLE; + else + dds_stage <= CHECK_SI; + dds_cnt <= dds_cnt + 1; + end if; + end if; + end if; + end case; + end if; + + -- DEFAULT + start_dds <= '0'; + opcode_dds <= NOP; + instance_state_dds <= ANY_INSTANCE_STATE; + view_state_dds <= ANY_VIEW_STATE; + sample_state_dds <= ANY_SAMPLE_STATE; + instance_handle_dds <= HANDLE_NIL; + max_samples_dds <= (others => '0'); + get_data_dds <= '0'; + ready_out_dds <= '0'; + + + case (dds_stage ) is + when START => + start_dds <= '1'; + opcode_dds <= dds.opcode; + instance_state_dds <= dds.istate; + view_state_dds <= dds.vstate; + sample_state_dds <= dds.sstate; + instance_handle_dds <= dds.inst; + max_samples_dds <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH)); + when CHECK_SI => + if (si_valid = '1' and si_valid_data = '1') then + get_data_dds <= '1'; + end if; + when CHECK_DATA => + ready_out_dds <= '1'; + when others => + null; + end case; + end process; + + rtps_prc : process(all) + variable stimulus : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + if rising_edge(clk) then + rtps_done <= '0'; + case (rtps_stage) is + when IDLE => + if (rtps_start = '1') then + rtps_stage <= START; + else + rtps_done <= '1'; + end if; + when START => + if (ack_rtps = '1') then + case (rtps.opcode) is + when ADD_CACHE_CHANGE => + gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus); + rtps_stage <= PUSH; + when others => + rtps_stage <= DONE; + end case; + end if; + when PUSH => + if (ready_in_rtps = '1') then + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = stimulus.length-1) then + rtps_stage <= DONE; + end if; + end if; + when DONE => + if (done_rtps = '1') then + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + rtps_stage <= IDLE; + end if; + end case; + end if; + + -- DEFAULT + start_rtps <= '0'; + opcode_rtps <= NOP; + valid_in_rtps <= '0'; + last_word_in_rtps <= '0'; + data_in_rtps <= (others => '0'); + + case (rtps_stage) is + when START => + start_rtps <= '1'; + opcode_rtps <= rtps.opcode; + case (rtps.opcode) is + when REMOVE_WRITER => + data_in_rtps <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH)); + when others => + null; + end case; + when PUSH => + valid_in_rtps <= '1'; + data_in_rtps <= stimulus.data(rtps_cnt); + last_word_in_rtps <= stimulus.last(rtps_cnt); + when others => + null; + end case; + end process; + + kh_prc : process (all) + variable tmp_key_hash : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + if rising_edge(clk) then + case (kh_stage) is + when IDLE => + if (start_kh = '1') then + case (opcode_kh) is + when PUSH_DATA => + kh_stage <= READ_DATA; + kh_cnt <= 0; + kh_data <= EMPTY_TEST_PACKET; + when PUSH_SERIALIZED_KEY => + kh_stage <= READ_DATA; + kh_cnt <= 0; + kh_data <= EMPTY_TEST_PACKET; + when READ_KEY_HASH => + kh_stage <= PUSH_KEY_HASH; + kh_cnt <= 0; + when others => + Alert("Unexpected Key Holder Operation", FAILURE); + end case; + end if; + when READ_DATA => + if (valid_out_kh = '1') then + kh_data.data(kh_cnt) <= data_out_kh; + kh_data.last(kh_cnt) <= last_word_out_kh; + kh_data.length <= kh_data.length + 1; + + kh_cnt <= kh_cnt + 1; + if (last_word_out_kh = '1') then + kh_stage <= IDLE; + end if; + end if; + when PUSH_KEY_HASH => + if (ready_in_kh = '1') then + kh_cnt <= kh_cnt + 1; + if (kh_cnt = INSTANCE_HANDLE_TYPE'length-1) then + kh_stage <= IDLE; + end if; + end if; + end case; + end if; + + -- DEFAULT + ack_kh <= '0'; + ready_out_kh <= '0'; + valid_in_kh <= '0'; + data_in_kh <= (others => '0'); + last_word_in_kh <= '0'; + + case (kh_stage) is + when IDLE => + if (start_kh = '1') then + ack_kh <= '1'; + end if; + when READ_DATA => + ready_out_kh <= '1'; + when PUSH_KEY_HASH => + valid_in_kh <= '1'; + tmp_key_hash := extract_key_hash(kh_data); + data_in_kh <= tmp_key_hash(kh_cnt); + if (kh_cnt = INSTANCE_HANDLE_TYPE'length-1) then + last_word_in_kh <= '1'; + end if; + end case; + 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_dds_reader_test1_arznriu.vhd b/src/Tests/Level_0/L0_dds_reader_test1_arznriu.vhd new file mode 100644 index 0000000..f6238c8 --- /dev/null +++ b/src/Tests/Level_0/L0_dds_reader_test1_arznriu.vhd @@ -0,0 +1,995 @@ +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 RTPS handling of the DDS Reader. It tests the correctness of the RTPS ADD_CACHE_CHANGE, and REMOVE_WRITER Operations. +-- Implicitly some DDS Operations are also tested, since they are used for state checking. +-- More specifically the testbench covers following tests: + +entity L0_dds_reader_test1_arznriu is +end entity; + + +architecture testbench of L0_dds_reader_test1_arznriu is + + -- *CONSTANT DECLARATION* + constant MAX_REMOTE_ENDPOINTS : natural := 3; + + -- *TYPE DECLARATION* + type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA); + type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE); + type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); + + -- *SIGNAL DECLARATION* + signal clk : std_logic := '0'; + signal reset : std_logic := '1'; + signal check_time : TIME_TYPE := TIME_ZERO; + signal start_rtps, start_dds, start_kh, ack_rtps, ack_dds, ack_kh, done_rtps, done_dds : std_logic := '0'; + signal opcode_rtps : HISTORY_CACHE_OPCODE_TYPE := NOP; + signal opcode_dds : DDS_READER_OPCODE_TYPE := NOP; + signal opcode_kh : KEY_HOLDER_OPCODE_TYPE := NOP; + signal ret_rtps : HISTORY_CACHE_RESPONSE_TYPE := ERROR; + signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic := '0'; + signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic := '0'; + signal ready_in_kh, ready_out_kh, valid_in_kh, valid_out_kh, last_word_in_kh, last_word_out_kh : std_logic := '0'; + signal data_in_rtps, data_out_dds, data_in_kh, data_out_kh : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal get_data_dds, si_valid_data, si_valid, si_last, abort_kh : std_logic := '0'; + signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); + signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); + signal instance_state_dds, si_instance_state : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0) := ANY_INSTANCE_STATE; + signal view_state_dds, si_view_state : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0) := ANY_VIEW_STATE; + signal sample_state_dds, si_sample_state : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := ANY_SAMPLE_STATE; + signal instance_handle_dds, si_instance_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + signal max_samples_dds : std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0) := (others => '0'); + signal si_source_timestamp : TIME_TYPE := TIME_INVALID; + signal si_publication_handle : PUBLICATION_HANDLE_TYPE := (others => (others => '0')); + signal si_disposed_generation_count : std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_no_writers_generation_count : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_sample_rank : std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0) := (others => '0'); + signal si_generation_rank : std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0) := (others => '0'); + signal si_absolute_generation_rank: std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + + signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, dds_cnt2, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; + signal kh_stage : KH_STAGE_TYPE := IDLE; + signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST; + shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST; + shared variable mem : DDS_READER_MEM_TYPE := DEFAULT_DDS_READER_MEM; + signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, last_id, valid_id : AlertLogIDType; + + -- *FUNCTION DECLARATION* + function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is + variable ret : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + for i in 0 to 3 loop + ret(i) := not payload.data(i); + end loop; + + return ret; + end function; + + 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.dds_reader(arch) + generic map ( + TIME_BASED_FILTER_QOS => DURATION_ZERO, + DEADLINE_QOS => DURATION_INFINITE, + MAX_SAMPLES => std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH)), + MAX_INSTANCES => std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH)), + MAX_SAMPLES_PER_INSTANCE => std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH)), + HISTORY_QOS => KEEP_ALL_HISTORY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, + PRESENTATION_QOS => INSTANCE_PRESENTATION_QOS, + DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, + COHERENT_ACCESS => FALSE, + ORDERED_ACCESS => FALSE, + WITH_KEY => FALSE, + PAYLOAD_FRAME_SIZE => 11, + MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS + ) + port map ( + clk => clk, + reset => reset, + time => check_time, + start_rtps => start_rtps, + opcode_rtps => opcode_rtps, + ack_rtps => ack_rtps, + done_rtps => done_rtps, + ret_rtps => ret_rtps, + data_in_rtps => data_in_rtps, + valid_in_rtps => valid_in_rtps, + ready_in_rtps => ready_in_rtps, + last_word_in_rtps => last_word_in_rtps, + start_kh => start_kh, + opcode_kh => opcode_kh, + ack_kh => ack_kh, + data_in_kh => data_in_kh, + valid_in_kh => valid_in_kh, + ready_in_kh => ready_in_kh, + last_word_in_kh => last_word_in_kh, + data_out_kh => data_out_kh, + valid_out_kh => valid_out_kh, + ready_out_kh => ready_out_kh, + last_word_out_kh => last_word_out_kh, + abort_kh => abort_kh, + start_dds => start_dds, + ack_dds => ack_dds, + opcode_dds => opcode_dds, + instance_state_dds => instance_state_dds, + view_state_dds => view_state_dds, + sample_state_dds => sample_state_dds, + instance_handle_dds => instance_handle_dds, + max_samples_dds => max_samples_dds, + get_data_dds => get_data_dds, + done_dds => done_dds, + return_code_dds => return_code_dds, + ready_out_dds => ready_out_dds, + valid_out_dds => valid_out_dds, + data_out_dds => data_out_dds, + last_word_out_dds => last_word_out_dds, + si_sample_state => si_sample_state, + si_view_state => si_view_state, + si_instance_state => si_instance_state, + si_source_timestamp => si_source_timestamp, + si_instance_handle => si_instance_handle, + si_publication_handle => si_publication_handle, + si_disposed_generation_count => si_disposed_generation_count, + si_no_writers_generation_count => si_no_writers_generation_count, + si_sample_rank => si_sample_rank, + si_generation_rank => si_generation_rank, + si_absolute_generation_rank => si_absolute_generation_rank, + si_valid_data => si_valid_data, + si_valid => si_valid, + si_last => si_last, + status => status + ); + + stimulus_prc : process + variable RV : RandomPType; + variable kh1, kh2, kh3, kh4 : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + variable cc1, cc2, cc3, cc4, cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE; + variable s : SAMPLE_TYPE := DEFAULT_SAMPLE; + + impure function gen_payload(key_hash : INSTANCE_HANDLE_TYPE; len : natural) return TEST_PACKET_TYPE is + variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + assert (len >= 4) report "Payload length has to be at least 16 Bytes long" severity FAILURE; + + for i in 0 to len-1 loop + if (i < 4) then + -- NOTE: Beginning of payload is negated key to allow deterministic Key Hash generation from the kh_prc + ret.data(ret.length) := not key_hash(i); + else + ret.data(ret.length) := RV.RandSlv(WORD_WIDTH); + end if; + ret.length := ret.length + 1; + end loop; + ret.last(ret.length-1) := '1'; + + 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 start_dds is + begin + dds_start <= '1'; + wait until rising_edge(clk); + dds_start <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure start_rtps is + begin + rtps_start <= '1'; + wait until rising_edge(clk); + rtps_start <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure wait_on_dds is + begin + if (dds_done /= '1') then + wait until dds_done = '1'; + end if; + end procedure; + + procedure wait_on_rtps is + begin + if (rtps_done /= '1') then + wait until rtps_done = '1'; + end if; + end procedure; + + procedure wait_on_completion is + begin + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; + end if; + end procedure; + + begin + + SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyless, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - RTPS Handling"); + SetAlertEnable(FAILURE, TRUE); + SetAlertEnable(ERROR, TRUE); + SetAlertEnable(WARNING, TRUE); + SetLogEnable(DEBUG, FALSE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, TRUE); + RV.InitSeed(RV'instance_name); + sstate_id <= GetAlertLogID("Sample State", ALERTLOG_BASE_ID); + vstate_id <= GetAlertLogID("View State", ALERTLOG_BASE_ID); + istate_id <= GetAlertLogID("Instance State", ALERTLOG_BASE_ID); + ts_id <= GetAlertLogID("Source Timestamp", ALERTLOG_BASE_ID); + inst_id <= GetAlertLogID("Instance Handle", ALERTLOG_BASE_ID); + pub_id <= GetAlertLogID("Publication Hanlde", ALERTLOG_BASE_ID); + dis_gen_cnt_id <= GetAlertLogID("Disposed Generation Count", ALERTLOG_BASE_ID); + no_w_gen_cnt_id <= GetAlertLogID("No Writers Generation Count", ALERTLOG_BASE_ID); + srank_id <= GetAlertLogID("Sample Rank", ALERTLOG_BASE_ID); + grank_id <= GetAlertLogID("Generation Rank", ALERTLOG_BASE_ID); + agrank_id <= GetAlertLogID("Absolute Generation Rank", ALERTLOG_BASE_ID); + last_id <= GetAlertLogID("Last Sample", ALERTLOG_BASE_ID); + valid_id <= GetAlertLogID("Valid Data", ALERTLOG_BASE_ID); + data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID); + ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID); + + -- Key Hashes + kh1 := gen_key_hash; + + Log("Initiating Test", INFO); + reset <= '1'; + wait until rising_edge(clk); + wait until rising_edge(clk); + reset <= '0'; + -- MEM: 0, 0 + -- ISTATE: - + -- WRITER: - + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.payload := gen_payload(HANDLE_NIL,10); + cc.src_timestamp := gen_duration(1,0); + + -- TEST: NORMAL ADD_CACHE_CHANGE + -- TEST: NORMAL SAMPLE + -- TEST: SAMPLE WITH ALIGNED PAYLOAD + + Log("RTPS Operation ADD_CACHE_CHANGE [Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: S1, 0 + -- ISTATE: ALIVE + -- WRITER: W0 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.payload := gen_payload(HANDLE_NIL,30); + cc.src_timestamp := gen_duration(2,0); + + -- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE + + Log("RTPS Operation ADD_CACHE_CHANGE [Writer 0, Aligned Payload (3 Slots)] (REJECTED: Payload Memory exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.payload := gen_payload(HANDLE_NIL,18); + cc.src_timestamp := gen_duration(2,0); + + -- TEST: SAMPLE WITH UNALIGNED PAYLOAD [>1 SLOT] + + Log("RTPS Operation ADD_CACHE_CHANGE [Writer 0, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: S1, S2 + -- ISTATE: ALIVE + -- WRITER: W0 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.payload := gen_payload(HANDLE_NIL,10); + cc.src_timestamp := gen_duration(3,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES + + Log("RTPS Operation ADD_CACHE_CHANGE [Writer 0, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 2, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 2; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0 + -- ISTATE: ALIVE + -- WRITER: W0 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.src_timestamp := gen_duration(3,0); + + -- TEST: DISPOSE SAMPLE + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: S3-, 0 + -- ISTATE: DISPOSED + -- WRITER: W0 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.src_timestamp := gen_duration(4,0); + + -- TEST: DISPOSE SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Writer 0] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := gen_duration(4,0); + + -- TEST: FILTER SAMPLE + -- TEST: FILTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Writer 0] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: S3-, S4- + -- ISTATE: ALIVE + -- WRITER: W0 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 2, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 2; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0 + -- ISTATE: ALIVE + -- WRITER: W0 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.payload := gen_payload(HANDLE_NIL,30); + cc.src_timestamp := gen_duration(5,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [Writer 0, Aligned Payload (3 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: S5++, 0 + -- ISTATE: ALIVE + -- WRITER: W0 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.payload := gen_payload(HANDLE_NIL,10); + cc.src_timestamp := gen_duration(6,0); + + -- TEST: ADD_CACHE_CHANGE ON PAYLOAD MEMORY FULL + + Log("RTPS Operation ADD_CACHE_CHANGE [Writer 0, Aligned Payload] (REJECTED: Payload Memory Full)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + -- TEST: REMOVE_WRITER [UNKNOWN WRITER] + + Log("RTPS Operation REMOVE_WRITER [Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0 + -- ISTATE: ALIVE + -- WRITER: W0 + + -- TEST: REMOVE_WRITER [KNOWN WRITER] + + Log("RTPS Operation REMOVE_WRITER [Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 0; + change_istate(HANDLE_NIL, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: S6-, 0 + -- ISTATE: NO_WRITERS + -- WRITER: - + + -- TEST: FILTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE_FILTERED; + cc.src_timestamp := gen_duration(7,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: S6-, S7- + -- ISTATE: ALIVE + -- WRITER: W1 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 2, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 2; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0 + -- ISTATE: ALIVE + -- WRITER: W1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.src_timestamp := gen_duration(8,0); + + -- TEST: UNREGISTER SAMPLE [UNKNOWN WRITER] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Writer 0] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.src_timestamp := gen_duration(8,0); + + -- TEST: UNREGISTER SAMPLE [KNOWN WRITER] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Writer 1] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + s := to_sample(cc,NOT_ALIVE_NO_WRITERS_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: S7-, 0 + -- ISTATE: NO_WRITERS + -- WRITER: - + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.src_timestamp := gen_duration(8,0); + + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Writer 0] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.src_timestamp := gen_duration(8,0); + + -- TEST: DISPOSE SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: S7-, S8- + -- ISTATE: DISPOSED + -- WRITER: W0 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 2, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 2; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0 + -- ISTATE: DISPOSED + -- WRITER: W0 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.src_timestamp := gen_duration(9,0); + + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Writer 0] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0 + -- ISTATE: DISPOSED + -- WRITER: - + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.payload := gen_payload(HANDLE_NIL,6); + cc.src_timestamp := gen_duration(9,0); + + -- TEST: SAMPLE WITH UNALIGNED PAYLOAD [<1 SLOT] + + Log("RTPS Operation ADD_CACHE_CHANGE [Writer 2, Unaligned Payload (1 Slot)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: S9, 0 + -- ISTATE: ALIVE + -- WRITER: W2 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.payload := gen_payload(HANDLE_NIL,10); + cc.src_timestamp := gen_duration(5,0); + + -- TEST: SAMPLE WITH EARLY TIMESTAMP [TIMESTAMP EARLIER THAN LAST READ] + + Log("RTPS Operation ADD_CACHE_CHANGE [Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: S9, S10 + -- ISTATE: ALIVE + -- WRITER: W1, W2 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 2, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 2; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + + 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; + + alert_prc : process(all) + begin + if rising_edge(clk) then + -- TODO + end if; + end process; + + dds_prc : process(all) + variable col : COLLECTION_TYPE := DEFAULT_COLLECTION; + begin + if rising_edge(clk) then + dds_done <= '0'; + case (dds_stage ) is + when IDLE => + if (dds_start = '1') then + dds_stage <= START; + else + dds_done <= '1'; + end if; + when START => + if (ack_dds = '1') then + dds_stage <= DONE; + dds_cnt <= 0; + end if; + when DONE => + if (done_dds = '1') then + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + case (dds.ret_code) is + when RETCODE_OK => + gen_collection(mem, col, dds, INSTANCE_PRESENTATION_QOS, FALSE); + dds_stage <= CHECK_SI; + dds_cnt <= 0; + when others => + dds_stage <= IDLE; + end case; + end if; + when CHECK_SI => + if (si_valid = '1') then + AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); + AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); + AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); + AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); + AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); + AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); + AffirmIfEqual(no_w_gen_cnt_id, si_no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH))); + AffirmIfEqual(srank_id, si_sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH))); + AffirmIfEqual(grank_id, si_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH))); + AffirmIfEqual(agrank_id, si_absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH))); + if (dds_cnt = col.len-1) then + AffirmIf(last_id, si_last = '1', "Last Signal not pulled High"); + else + AffirmIf(last_id, si_last = '0', "Last Signal pulled High"); + end if; + if (si_valid_data = '1') then + AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected"); + dds_stage <= CHECK_DATA; + dds_cnt2 <= 0; + else + AffirmIf(valid_id, col.s(dds_cnt).data = EMPTY_TEST_PACKET, "Sample with Data expected"); + if (dds_cnt = col.len-1) then + -- DONE + dds_stage <= IDLE; + else + dds_cnt <= dds_cnt + 1; + end if; + end if; + end if; + when CHECK_DATA => + if (valid_out_dds = '1') then + AffirmIfEqual(data_id, data_out_dds, col.s(dds_cnt).data.data(dds_cnt2)); + dds_cnt2 <= dds_cnt2 + 1; + if (dds_cnt2 = col.s(dds_cnt).data.length-1) then + AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); + if (dds_cnt = col.len-1) then + -- DONE + dds_stage <= IDLE; + else + dds_stage <= CHECK_SI; + dds_cnt <= dds_cnt + 1; + end if; + end if; + end if; + end case; + end if; + + -- DEFAULT + start_dds <= '0'; + opcode_dds <= NOP; + instance_state_dds <= ANY_INSTANCE_STATE; + view_state_dds <= ANY_VIEW_STATE; + sample_state_dds <= ANY_SAMPLE_STATE; + instance_handle_dds <= HANDLE_NIL; + max_samples_dds <= (others => '0'); + get_data_dds <= '0'; + ready_out_dds <= '0'; + + + case (dds_stage ) is + when START => + start_dds <= '1'; + opcode_dds <= dds.opcode; + instance_state_dds <= dds.istate; + view_state_dds <= dds.vstate; + sample_state_dds <= dds.sstate; + instance_handle_dds <= dds.inst; + max_samples_dds <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH)); + when CHECK_SI => + if (si_valid = '1' and si_valid_data = '1') then + get_data_dds <= '1'; + end if; + when CHECK_DATA => + ready_out_dds <= '1'; + when others => + null; + end case; + end process; + + rtps_prc : process(all) + variable stimulus : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + if rising_edge(clk) then + rtps_done <= '0'; + case (rtps_stage) is + when IDLE => + if (rtps_start = '1') then + rtps_stage <= START; + else + rtps_done <= '1'; + end if; + when START => + if (ack_rtps = '1') then + case (rtps.opcode) is + when ADD_CACHE_CHANGE => + gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus); + rtps_stage <= PUSH; + when others => + rtps_stage <= DONE; + end case; + end if; + when PUSH => + if (ready_in_rtps = '1') then + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = stimulus.length-1) then + rtps_stage <= DONE; + end if; + end if; + when DONE => + if (done_rtps = '1') then + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + rtps_stage <= IDLE; + end if; + end case; + end if; + + -- DEFAULT + start_rtps <= '0'; + opcode_rtps <= NOP; + valid_in_rtps <= '0'; + last_word_in_rtps <= '0'; + data_in_rtps <= (others => '0'); + + case (rtps_stage) is + when START => + start_rtps <= '1'; + opcode_rtps <= rtps.opcode; + case (rtps.opcode) is + when REMOVE_WRITER => + data_in_rtps <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH)); + when others => + null; + end case; + when PUSH => + valid_in_rtps <= '1'; + data_in_rtps <= stimulus.data(rtps_cnt); + last_word_in_rtps <= stimulus.last(rtps_cnt); + when others => + null; + end case; + end process; + + kh_prc : process (all) + variable tmp_key_hash : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + if rising_edge(clk) then + case (kh_stage) is + when IDLE => + if (start_kh = '1') then + case (opcode_kh) is + when PUSH_DATA => + kh_stage <= READ_DATA; + kh_cnt <= 0; + kh_data <= EMPTY_TEST_PACKET; + when PUSH_SERIALIZED_KEY => + kh_stage <= READ_DATA; + kh_cnt <= 0; + kh_data <= EMPTY_TEST_PACKET; + when READ_KEY_HASH => + kh_stage <= PUSH_KEY_HASH; + kh_cnt <= 0; + when others => + Alert("Unexpected Key Holder Operation", FAILURE); + end case; + end if; + when READ_DATA => + if (valid_out_kh = '1') then + kh_data.data(kh_cnt) <= data_out_kh; + kh_data.last(kh_cnt) <= last_word_out_kh; + kh_data.length <= kh_data.length + 1; + + kh_cnt <= kh_cnt + 1; + if (last_word_out_kh = '1') then + kh_stage <= IDLE; + end if; + end if; + when PUSH_KEY_HASH => + if (ready_in_kh = '1') then + kh_cnt <= kh_cnt + 1; + if (kh_cnt = INSTANCE_HANDLE_TYPE'length-1) then + kh_stage <= IDLE; + end if; + end if; + end case; + end if; + + -- DEFAULT + ack_kh <= '0'; + ready_out_kh <= '0'; + valid_in_kh <= '0'; + data_in_kh <= (others => '0'); + last_word_in_kh <= '0'; + + case (kh_stage) is + when IDLE => + if (start_kh = '1') then + ack_kh <= '1'; + end if; + when READ_DATA => + ready_out_kh <= '1'; + when PUSH_KEY_HASH => + valid_in_kh <= '1'; + tmp_key_hash := extract_key_hash(kh_data); + data_in_kh <= tmp_key_hash(kh_cnt); + if (kh_cnt = INSTANCE_HANDLE_TYPE'length-1) then + last_word_in_kh <= '1'; + end if; + end case; + 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_dds_reader_test1_lbzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test1_lbzkriu.vhd new file mode 100644 index 0000000..e2708b5 --- /dev/null +++ b/src/Tests/Level_0/L0_dds_reader_test1_lbzkriu.vhd @@ -0,0 +1,1435 @@ +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 RTPS handling of the DDS Reader. It tests the correctness of the RTPS ADD_CACHE_CHANGE, and REMOVE_WRITER Operations. +-- Implicitly some DDS Operations are also tested, since they are used for state checking. +-- More specifically the testbench covers following tests: +-- TEST: NORMAL ADD_CACHE_CHANGE +-- TEST: ADD_CACHE_CHANGE ON PAYLOAD MEMORY FULL +-- TEST: REMOVE_WRITER [UNKNOWN WRITER] +-- TEST: REMOVE_WRITER [KNOWN WRITER (1 Instance)] +-- TEST: REMOVE_WRITER [KNOWN WRITER (>1 Instances)] +-- TEST: SAMPLE WITH ALIGNED PAYLOAD +-- TEST: SAMPLE WITH UNALIGNED PAYLOAD [>1 SLOT] +-- TEST: SAMPLE WITH UNALIGNED PAYLOAD [<1 SLOT] +-- TEST: NORMAL SAMPLE [KNOWN INSTANCE] +-- TEST: NORMAL SAMPLE [UNKNOWN INSTANCE] +-- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, KNOWN WRITER] +-- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, UNKNOWN WRITER] +-- TEST: UNREGISTER SAMPLE [UNKNOWN INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE, STALE INSTANCE TRANSITION] +-- TEST: DISPOSE SAMPLE [KNOWN INSTANCE] +-- TEST: DISPOSE SAMPLE [UNKNOWN INSTANCE] +-- TEST: DISPOSE SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: DISPOSE SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: FILTER SAMPLE [KNOWN INSTANCE] +-- TEST: FILTER SAMPLE [UNKNOWN INSTANCE] +-- TEST: FILTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: FILTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: SAMPLE WITH KEY_HASH +-- TEST: SAMPLE WITHOUT KEY_HASH +-- TEST: SAMPLE WITH SERIALIZED KEY [WITH KEY_HASH] +-- TEST: SAMPLE WITH SERIALIZED KEY [WITHOUT KEY_HASH] +-- TEST: SAMPLE WITH EARLY TIMESTAMP [TIMESTAMP EARLIER THAN LAST READ] +-- TEST: TEST SAMPLE WITH SERIALIZED KEY EFFECT ON PAYLOAD MEMORY FULLNESS +-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE +-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES [UNKNOWN INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] +-- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE +-- TEST: ADD SAMPLE ON PAYLOAD MEMORY FULL & MAX_SAMPLES_PER_INSTANCE (Induce Double Remove) + +entity L0_dds_reader_test1_lbzkriu is +end entity; + + +architecture testbench of L0_dds_reader_test1_lbzkriu is + + -- *CONSTANT DECLARATION* + constant MAX_REMOTE_ENDPOINTS : natural := 3; + + -- *TYPE DECLARATION* + type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA); + type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE); + type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); + + -- *SIGNAL DECLARATION* + signal clk : std_logic := '0'; + signal reset : std_logic := '1'; + signal check_time : TIME_TYPE := TIME_ZERO; + signal start_rtps, start_dds, start_kh, ack_rtps, ack_dds, ack_kh, done_rtps, done_dds : std_logic := '0'; + signal opcode_rtps : HISTORY_CACHE_OPCODE_TYPE := NOP; + signal opcode_dds : DDS_READER_OPCODE_TYPE := NOP; + signal opcode_kh : KEY_HOLDER_OPCODE_TYPE := NOP; + signal ret_rtps : HISTORY_CACHE_RESPONSE_TYPE := ERROR; + signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic := '0'; + signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic := '0'; + signal ready_in_kh, ready_out_kh, valid_in_kh, valid_out_kh, last_word_in_kh, last_word_out_kh : std_logic := '0'; + signal data_in_rtps, data_out_dds, data_in_kh, data_out_kh : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal get_data_dds, si_valid_data, si_valid, si_last, abort_kh : std_logic := '0'; + signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); + signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); + signal instance_state_dds, si_instance_state : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0) := ANY_INSTANCE_STATE; + signal view_state_dds, si_view_state : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0) := ANY_VIEW_STATE; + signal sample_state_dds, si_sample_state : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := ANY_SAMPLE_STATE; + signal instance_handle_dds, si_instance_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + signal max_samples_dds : std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0) := (others => '0'); + signal si_source_timestamp : TIME_TYPE := TIME_INVALID; + signal si_publication_handle : PUBLICATION_HANDLE_TYPE := (others => (others => '0')); + signal si_disposed_generation_count : std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_no_writers_generation_count : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_sample_rank : std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0) := (others => '0'); + signal si_generation_rank : std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0) := (others => '0'); + signal si_absolute_generation_rank: std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + + signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, dds_cnt2, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; + signal kh_stage : KH_STAGE_TYPE := IDLE; + signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST; + shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST; + shared variable mem : DDS_READER_MEM_TYPE := DEFAULT_DDS_READER_MEM; + signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, last_id, valid_id : AlertLogIDType; + + -- *FUNCTION DECLARATION* + function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is + variable ret : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + for i in 0 to 3 loop + ret(i) := not payload.data(i); + end loop; + + return ret; + end function; + + 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.dds_reader(arch) + generic map ( + TIME_BASED_FILTER_QOS => DURATION_ZERO, + DEADLINE_QOS => DURATION_INFINITE, + MAX_SAMPLES => std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH)), + MAX_INSTANCES => std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH)), + MAX_SAMPLES_PER_INSTANCE => std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH)), + HISTORY_QOS => KEEP_LAST_HISTORY_QOS, + RELIABILITY_QOS => BEST_EFFORT_RELIABILITY_QOS, + PRESENTATION_QOS => INSTANCE_PRESENTATION_QOS, + DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, + COHERENT_ACCESS => FALSE, + ORDERED_ACCESS => FALSE, + WITH_KEY => TRUE, + PAYLOAD_FRAME_SIZE => 11, + MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS + ) + port map ( + clk => clk, + reset => reset, + time => check_time, + start_rtps => start_rtps, + opcode_rtps => opcode_rtps, + ack_rtps => ack_rtps, + done_rtps => done_rtps, + ret_rtps => ret_rtps, + data_in_rtps => data_in_rtps, + valid_in_rtps => valid_in_rtps, + ready_in_rtps => ready_in_rtps, + last_word_in_rtps => last_word_in_rtps, + start_kh => start_kh, + opcode_kh => opcode_kh, + ack_kh => ack_kh, + data_in_kh => data_in_kh, + valid_in_kh => valid_in_kh, + ready_in_kh => ready_in_kh, + last_word_in_kh => last_word_in_kh, + data_out_kh => data_out_kh, + valid_out_kh => valid_out_kh, + ready_out_kh => ready_out_kh, + last_word_out_kh => last_word_out_kh, + abort_kh => abort_kh, + start_dds => start_dds, + ack_dds => ack_dds, + opcode_dds => opcode_dds, + instance_state_dds => instance_state_dds, + view_state_dds => view_state_dds, + sample_state_dds => sample_state_dds, + instance_handle_dds => instance_handle_dds, + max_samples_dds => max_samples_dds, + get_data_dds => get_data_dds, + done_dds => done_dds, + return_code_dds => return_code_dds, + ready_out_dds => ready_out_dds, + valid_out_dds => valid_out_dds, + data_out_dds => data_out_dds, + last_word_out_dds => last_word_out_dds, + si_sample_state => si_sample_state, + si_view_state => si_view_state, + si_instance_state => si_instance_state, + si_source_timestamp => si_source_timestamp, + si_instance_handle => si_instance_handle, + si_publication_handle => si_publication_handle, + si_disposed_generation_count => si_disposed_generation_count, + si_no_writers_generation_count => si_no_writers_generation_count, + si_sample_rank => si_sample_rank, + si_generation_rank => si_generation_rank, + si_absolute_generation_rank => si_absolute_generation_rank, + si_valid_data => si_valid_data, + si_valid => si_valid, + si_last => si_last, + status => status + ); + + stimulus_prc : process + variable RV : RandomPType; + variable kh1, kh2, kh3, kh4 : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + variable cc1, cc2, cc3, cc4, cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE; + variable s : SAMPLE_TYPE := DEFAULT_SAMPLE; + + impure function gen_payload(key_hash : INSTANCE_HANDLE_TYPE; len : natural) return TEST_PACKET_TYPE is + variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + assert (len >= 4) report "Payload length has to be at least 16 Bytes long" severity FAILURE; + + for i in 0 to len-1 loop + if (i < 4) then + -- NOTE: Beginning of payload is negated key to allow deterministic Key Hash generation from the kh_prc + ret.data(ret.length) := not key_hash(i); + else + ret.data(ret.length) := RV.RandSlv(WORD_WIDTH); + end if; + ret.length := ret.length + 1; + end loop; + ret.last(ret.length-1) := '1'; + + 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 start_dds is + begin + dds_start <= '1'; + wait until rising_edge(clk); + dds_start <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure start_rtps is + begin + rtps_start <= '1'; + wait until rising_edge(clk); + rtps_start <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure wait_on_dds is + begin + if (dds_done /= '1') then + wait until dds_done = '1'; + end if; + end procedure; + + procedure wait_on_rtps is + begin + if (rtps_done /= '1') then + wait until rtps_done = '1'; + end if; + end procedure; + + procedure wait_on_completion is + begin + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; + end if; + end procedure; + + begin + + SetAlertLogName("dds_reader - (KEEP LAST, Best Effort, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - RTPS Handling"); + SetAlertEnable(FAILURE, TRUE); + SetAlertEnable(ERROR, TRUE); + SetAlertEnable(WARNING, TRUE); + SetLogEnable(DEBUG, FALSE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, TRUE); + RV.InitSeed(RV'instance_name); + sstate_id <= GetAlertLogID("Sample State", ALERTLOG_BASE_ID); + vstate_id <= GetAlertLogID("View State", ALERTLOG_BASE_ID); + istate_id <= GetAlertLogID("Instance State", ALERTLOG_BASE_ID); + ts_id <= GetAlertLogID("Source Timestamp", ALERTLOG_BASE_ID); + inst_id <= GetAlertLogID("Instance Handle", ALERTLOG_BASE_ID); + pub_id <= GetAlertLogID("Publication Hanlde", ALERTLOG_BASE_ID); + dis_gen_cnt_id <= GetAlertLogID("Disposed Generation Count", ALERTLOG_BASE_ID); + no_w_gen_cnt_id <= GetAlertLogID("No Writers Generation Count", ALERTLOG_BASE_ID); + srank_id <= GetAlertLogID("Sample Rank", ALERTLOG_BASE_ID); + grank_id <= GetAlertLogID("Generation Rank", ALERTLOG_BASE_ID); + agrank_id <= GetAlertLogID("Absolute Generation Rank", ALERTLOG_BASE_ID); + last_id <= GetAlertLogID("Last Sample", ALERTLOG_BASE_ID); + valid_id <= GetAlertLogID("Valid Data", ALERTLOG_BASE_ID); + data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID); + ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID); + + -- Key Hashes + kh1 := gen_key_hash; + kh2 := gen_key_hash; + kh3 := gen_key_hash; + kh4 := gen_key_hash; + + + + Log("Initiating Test", INFO); + reset <= '1'; + wait until rising_edge(clk); + wait until rising_edge(clk); + reset <= '0'; + -- MEM: 0, 0, 0, 0 + -- ISTATE: - + -- WRITER: - + + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(1,0); + + -- TEST: NORMAL ADD_CACHE_CHANGE + -- TEST: SAMPLE WITH ALIGNED PAYLOAD + -- TEST: NORMAL SAMPLE [UNKNOWN INSTANCE] + -- TEST: SAMPLE WITH KEY_HASH + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S1, 0, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := HANDLE_NIL; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(2,0); + + -- TEST: SAMPLE WITHOUT KEY_HASH + -- TEST: NORMAL SAMPLE [KNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [NO KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + s.inst := kh1; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S1, I1S2, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,18); + cc.src_timestamp := gen_duration(2,0); + + -- TEST: SAMPLE WITH UNALIGNED PAYLOAD [>1 SLOT] + -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S2, I1S3+, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I1S3+, 0, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(3,0); + + -- TEST: DISPOSE SAMPLE [KNOWN INSTANCE] + -- TEST: SAMPLE WITH SERIALIZED KEY [WITH KEY_HASH] + -- TEST: SAMPLE WITH UNALIGNED PAYLOAD [<1 SLOT] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + s.inst := kh1; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S3+, I1S4-, 0, 0 + -- ISTATE: I1:DISPOSED + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh2; + cc.payload := gen_payload(kh2,20); + cc.src_timestamp := gen_duration(4,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S3+, I1S4-, I2S1+, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE + -- WRITER: W0:I1, W1:I2 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(5,0); + + -- TEST: TEST SAMPLE WITH SERIALIZED KEY EFFECT ON PAYLOAD MEMORY FULLNESS + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S3+, I1S4-, I2S1+, I3S1 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I1, W1:I2,I3 + + -- TEST: REMOVE_WRITER [UNKNOWN WRITER] + + Log("RTPS Operation REMOVE_WRITER [Writer 2] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, NOT_READ_SAMPLE_STATE, NOT_ALIVE_DISPOSED_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := NOT_READ_SAMPLE_STATE; + dds.istate := NOT_ALIVE_DISPOSED_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I1S3+, I2S1+, I3S1, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I1, W1:I2,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(6,0); + + -- TEST: ADD_CACHE_CHANGE ON PAYLOAD MEMORY FULL + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I1, W1:I2,I3, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh4; + cc.payload := gen_payload(kh4,10); + cc.src_timestamp := gen_duration(7,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + -- TEST: REMOVE_WRITER [KNOWN WRITER (1 Instance)] + + Log("RTPS Operation REMOVE_WRITER [Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 0; + change_istate(kh1, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W1:I2,I3, W2:I3 + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + remove_inst(kh1, mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, I4S1 + -- ISTATE: I2:ALIVE, I3:ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I3S1, I3S2, I4S1, 0 + -- ISTATE: I2:ALIVE, I3:ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(8,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(8,0); + + -- TEST: DISPOSE SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 0] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh4; + cc.payload := gen_payload(kh4,10); + cc.src_timestamp := gen_duration(8,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S1, I4S2 + -- ISTATE: I2:ALIVE, I3:ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(9,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + -- TEST: REMOVE_WRITER [KNOWN WRITER (>1 Instances)] + + Log("RTPS Operation REMOVE_WRITER [Writer 1] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 1; + change_istate(kh2, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + change_istate(kh4, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S1, I4S2 + -- ISTATE: I2:NO_WRITERS, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W2:I3 + + -- TEST: ADD SAMPLE ON MAX_SAMPLES [UNKNOWN INSTANCE] + -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + remove_inst(kh2,mem); + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S2, I4S1, I4S2, I1S1 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W0:I1, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(10,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I4S1, I4S2, I1S1, I3S3 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W0:I1, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(11,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I4S2, I1S1, I3S3, I3S4 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W0:I1, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(12,0); + + -- TEST: ADD SAMPLE ON PAYLOAD MEMORY FULL & MAX_SAMPLES_PER_INSTANCE (Induce Double Remove) + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + remove_sample(2,mem); + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S1, I3S4, I3S5, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W0:I1, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,30); + cc.src_timestamp := gen_duration(13,0); + + -- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload (3 Slots)] (REJECTED: Payload memory Full)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := HANDLE_NIL; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(14,0); + + -- TEST: DISPOSE SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + -- TEST: SAMPLE WITH SERIALIZED KEY [WITHOUT KEY_HASH] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 4, Writer 1] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + s.inst := kh4; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S1, I3S4, I3S5, I4S3- + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(15,0); + + -- TEST: DISPOSE SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 4, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W0:I1,I4 W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(16,0); + + -- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, KNOWN WRITER] + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 4, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(17,0); + + -- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, UNKNOWN WRITER] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh2; + cc.payload := gen_payload(kh2,5); + cc.src_timestamp := gen_duration(18,0); + + -- TEST: UNREGISTER SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 2, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(19,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + s := to_sample(cc,NOT_ALIVE_NO_WRITERS_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, 0, 0, 0 + -- ISTATE: I1:NO_WRITERS, I3:ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(20,0); + + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 2] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(21,0); + + -- TEST: FILTER SAMPLE [KNOWN INSTANCE] + -- TEST: FILTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 1, Writer 2] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(22,0); + + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE, STALE INSTANCE TRANSITION] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 4, Writer 1] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh2; + cc.payload := gen_payload(kh2,10); + cc.src_timestamp := gen_duration(23,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + remove_inst(kh4, mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, I2S1, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(24,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 2] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, 0, 0, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(25,0); + + -- TEST: FILTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 1, Writer 2] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, I1S5-, 0, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(26,0); + + -- TEST: FILTER SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 4, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(10,0); + + -- TEST: SAMPLE WITH EARLY TIMESTAMP [TIMESTAMP EARLIER THAN LAST READ] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, I1S5-, I3S3, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + 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; + + alert_prc : process(all) + begin + if rising_edge(clk) then + -- TODO + end if; + end process; + + dds_prc : process(all) + variable col : COLLECTION_TYPE := DEFAULT_COLLECTION; + begin + if rising_edge(clk) then + dds_done <= '0'; + case (dds_stage ) is + when IDLE => + if (dds_start = '1') then + dds_stage <= START; + else + dds_done <= '1'; + end if; + when START => + if (ack_dds = '1') then + dds_stage <= DONE; + dds_cnt <= 0; + end if; + when DONE => + if (done_dds = '1') then + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + case (dds.ret_code) is + when RETCODE_OK => + gen_collection(mem, col, dds, INSTANCE_PRESENTATION_QOS, FALSE); + dds_stage <= CHECK_SI; + dds_cnt <= 0; + when others => + dds_stage <= IDLE; + end case; + end if; + when CHECK_SI => + if (si_valid = '1') then + AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); + AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); + AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); + AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); + AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); + AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); + AffirmIfEqual(no_w_gen_cnt_id, si_no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH))); + AffirmIfEqual(srank_id, si_sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH))); + AffirmIfEqual(grank_id, si_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH))); + AffirmIfEqual(agrank_id, si_absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH))); + if (dds_cnt = col.len-1) then + AffirmIf(last_id, si_last = '1', "Last Signal not pulled High"); + else + AffirmIf(last_id, si_last = '0', "Last Signal pulled High"); + end if; + if (si_valid_data = '1') then + AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected"); + dds_stage <= CHECK_DATA; + dds_cnt2 <= 0; + else + AffirmIf(valid_id, col.s(dds_cnt).data = EMPTY_TEST_PACKET, "Sample with Data expected"); + if (dds_cnt = col.len-1) then + -- DONE + dds_stage <= IDLE; + else + dds_cnt <= dds_cnt + 1; + end if; + end if; + end if; + when CHECK_DATA => + if (valid_out_dds = '1') then + AffirmIfEqual(data_id, data_out_dds, col.s(dds_cnt).data.data(dds_cnt2)); + dds_cnt2 <= dds_cnt2 + 1; + if (dds_cnt2 = col.s(dds_cnt).data.length-1) then + AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); + if (dds_cnt = col.len-1) then + -- DONE + dds_stage <= IDLE; + else + dds_stage <= CHECK_SI; + dds_cnt <= dds_cnt + 1; + end if; + end if; + end if; + end case; + end if; + + -- DEFAULT + start_dds <= '0'; + opcode_dds <= NOP; + instance_state_dds <= ANY_INSTANCE_STATE; + view_state_dds <= ANY_VIEW_STATE; + sample_state_dds <= ANY_SAMPLE_STATE; + instance_handle_dds <= HANDLE_NIL; + max_samples_dds <= (others => '0'); + get_data_dds <= '0'; + ready_out_dds <= '0'; + + + case (dds_stage ) is + when START => + start_dds <= '1'; + opcode_dds <= dds.opcode; + instance_state_dds <= dds.istate; + view_state_dds <= dds.vstate; + sample_state_dds <= dds.sstate; + instance_handle_dds <= dds.inst; + max_samples_dds <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH)); + when CHECK_SI => + if (si_valid = '1' and si_valid_data = '1') then + get_data_dds <= '1'; + end if; + when CHECK_DATA => + ready_out_dds <= '1'; + when others => + null; + end case; + end process; + + rtps_prc : process(all) + variable stimulus : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + if rising_edge(clk) then + rtps_done <= '0'; + case (rtps_stage) is + when IDLE => + if (rtps_start = '1') then + rtps_stage <= START; + else + rtps_done <= '1'; + end if; + when START => + if (ack_rtps = '1') then + case (rtps.opcode) is + when ADD_CACHE_CHANGE => + gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus); + rtps_stage <= PUSH; + when others => + rtps_stage <= DONE; + end case; + end if; + when PUSH => + if (ready_in_rtps = '1') then + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = stimulus.length-1) then + rtps_stage <= DONE; + end if; + end if; + when DONE => + if (done_rtps = '1') then + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + rtps_stage <= IDLE; + end if; + end case; + end if; + + -- DEFAULT + start_rtps <= '0'; + opcode_rtps <= NOP; + valid_in_rtps <= '0'; + last_word_in_rtps <= '0'; + data_in_rtps <= (others => '0'); + + case (rtps_stage) is + when START => + start_rtps <= '1'; + opcode_rtps <= rtps.opcode; + case (rtps.opcode) is + when REMOVE_WRITER => + data_in_rtps <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH)); + when others => + null; + end case; + when PUSH => + valid_in_rtps <= '1'; + data_in_rtps <= stimulus.data(rtps_cnt); + last_word_in_rtps <= stimulus.last(rtps_cnt); + when others => + null; + end case; + end process; + + kh_prc : process (all) + variable tmp_key_hash : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + if rising_edge(clk) then + case (kh_stage) is + when IDLE => + if (start_kh = '1') then + case (opcode_kh) is + when PUSH_DATA => + kh_stage <= READ_DATA; + kh_cnt <= 0; + kh_data <= EMPTY_TEST_PACKET; + when PUSH_SERIALIZED_KEY => + kh_stage <= READ_DATA; + kh_cnt <= 0; + kh_data <= EMPTY_TEST_PACKET; + when READ_KEY_HASH => + kh_stage <= PUSH_KEY_HASH; + kh_cnt <= 0; + when others => + Alert("Unexpected Key Holder Operation", FAILURE); + end case; + end if; + when READ_DATA => + if (valid_out_kh = '1') then + kh_data.data(kh_cnt) <= data_out_kh; + kh_data.last(kh_cnt) <= last_word_out_kh; + kh_data.length <= kh_data.length + 1; + + kh_cnt <= kh_cnt + 1; + if (last_word_out_kh = '1') then + kh_stage <= IDLE; + end if; + end if; + when PUSH_KEY_HASH => + if (ready_in_kh = '1') then + kh_cnt <= kh_cnt + 1; + if (kh_cnt = INSTANCE_HANDLE_TYPE'length-1) then + kh_stage <= IDLE; + end if; + end if; + end case; + end if; + + -- DEFAULT + ack_kh <= '0'; + ready_out_kh <= '0'; + valid_in_kh <= '0'; + data_in_kh <= (others => '0'); + last_word_in_kh <= '0'; + + case (kh_stage) is + when IDLE => + if (start_kh = '1') then + ack_kh <= '1'; + end if; + when READ_DATA => + ready_out_kh <= '1'; + when PUSH_KEY_HASH => + valid_in_kh <= '1'; + tmp_key_hash := extract_key_hash(kh_data); + data_in_kh <= tmp_key_hash(kh_cnt); + if (kh_cnt = INSTANCE_HANDLE_TYPE'length-1) then + last_word_in_kh <= '1'; + end if; + end case; + 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_dds_reader_test1_lrzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test1_lrzkriu.vhd new file mode 100644 index 0000000..60fa217 --- /dev/null +++ b/src/Tests/Level_0/L0_dds_reader_test1_lrzkriu.vhd @@ -0,0 +1,1436 @@ +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 RTPS handling of the DDS Reader. It tests the correctness of the RTPS ADD_CACHE_CHANGE, and REMOVE_WRITER Operations. +-- Implicitly some DDS Operations are also tested, since they are used for state checking. +-- More specifically the testbench covers following tests: +-- TEST: NORMAL ADD_CACHE_CHANGE +-- TEST: ADD_CACHE_CHANGE ON PAYLOAD MEMORY FULL +-- TEST: REMOVE_WRITER [UNKNOWN WRITER] +-- TEST: REMOVE_WRITER [KNOWN WRITER (1 Instance)] +-- TEST: REMOVE_WRITER [KNOWN WRITER (>1 Instances)] +-- TEST: SAMPLE WITH ALIGNED PAYLOAD +-- TEST: SAMPLE WITH UNALIGNED PAYLOAD [>1 SLOT] +-- TEST: SAMPLE WITH UNALIGNED PAYLOAD [<1 SLOT] +-- TEST: NORMAL SAMPLE [KNOWN INSTANCE] +-- TEST: NORMAL SAMPLE [UNKNOWN INSTANCE] +-- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, KNOWN WRITER] +-- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, UNKNOWN WRITER] +-- TEST: UNREGISTER SAMPLE [UNKNOWN INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE, STALE INSTANCE TRANSITION] +-- TEST: DISPOSE SAMPLE [KNOWN INSTANCE] +-- TEST: DISPOSE SAMPLE [UNKNOWN INSTANCE] +-- TEST: DISPOSE SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: DISPOSE SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: FILTER SAMPLE [KNOWN INSTANCE] +-- TEST: FILTER SAMPLE [UNKNOWN INSTANCE] +-- TEST: FILTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: FILTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: SAMPLE WITH KEY_HASH +-- TEST: SAMPLE WITHOUT KEY_HASH +-- TEST: SAMPLE WITH SERIALIZED KEY [WITH KEY_HASH] +-- TEST: SAMPLE WITH SERIALIZED KEY [WITHOUT KEY_HASH] +-- TEST: SAMPLE WITH EARLY TIMESTAMP [TIMESTAMP EARLIER THAN LAST READ] +-- TEST: TEST SAMPLE WITH SERIALIZED KEY EFFECT ON PAYLOAD MEMORY FULLNESS +-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE +-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES [UNKNOWN INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] +-- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE +-- TEST: ADD SAMPLE ON PAYLOAD MEMORY FULL & MAX_SAMPLES_PER_INSTANCE (Induce Double Remove) + +entity L0_dds_reader_test1_lrzkriu is +end entity; + + +architecture testbench of L0_dds_reader_test1_lrzkriu is + + -- *CONSTANT DECLARATION* + constant MAX_REMOTE_ENDPOINTS : natural := 3; + + -- *TYPE DECLARATION* + type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA); + type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE); + type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); + + -- *SIGNAL DECLARATION* + signal clk : std_logic := '0'; + signal reset : std_logic := '1'; + signal check_time : TIME_TYPE := TIME_ZERO; + signal start_rtps, start_dds, start_kh, ack_rtps, ack_dds, ack_kh, done_rtps, done_dds : std_logic := '0'; + signal opcode_rtps : HISTORY_CACHE_OPCODE_TYPE := NOP; + signal opcode_dds : DDS_READER_OPCODE_TYPE := NOP; + signal opcode_kh : KEY_HOLDER_OPCODE_TYPE := NOP; + signal ret_rtps : HISTORY_CACHE_RESPONSE_TYPE := ERROR; + signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic := '0'; + signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic := '0'; + signal ready_in_kh, ready_out_kh, valid_in_kh, valid_out_kh, last_word_in_kh, last_word_out_kh : std_logic := '0'; + signal data_in_rtps, data_out_dds, data_in_kh, data_out_kh : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); + signal get_data_dds, si_valid_data, si_valid, si_last, abort_kh : std_logic := '0'; + signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); + signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); + signal instance_state_dds, si_instance_state : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0) := ANY_INSTANCE_STATE; + signal view_state_dds, si_view_state : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0) := ANY_VIEW_STATE; + signal sample_state_dds, si_sample_state : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := ANY_SAMPLE_STATE; + signal instance_handle_dds, si_instance_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + signal max_samples_dds : std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0) := (others => '0'); + signal si_source_timestamp : TIME_TYPE := TIME_INVALID; + signal si_publication_handle : PUBLICATION_HANDLE_TYPE := (others => (others => '0')); + signal si_disposed_generation_count : std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_no_writers_generation_count : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_sample_rank : std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0) := (others => '0'); + signal si_generation_rank : std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0) := (others => '0'); + signal si_absolute_generation_rank: std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + + signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, dds_cnt2, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; + signal kh_stage : KH_STAGE_TYPE := IDLE; + signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST; + shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST; + shared variable mem : DDS_READER_MEM_TYPE := DEFAULT_DDS_READER_MEM; + signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, last_id, valid_id : AlertLogIDType; + + -- *FUNCTION DECLARATION* + function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is + variable ret : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + for i in 0 to 3 loop + ret(i) := not payload.data(i); + end loop; + + return ret; + end function; + + 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.dds_reader(arch) + generic map ( + TIME_BASED_FILTER_QOS => DURATION_ZERO, + DEADLINE_QOS => DURATION_INFINITE, + MAX_SAMPLES => std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH)), + MAX_INSTANCES => std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH)), + MAX_SAMPLES_PER_INSTANCE => std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH)), + HISTORY_QOS => KEEP_LAST_HISTORY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, + PRESENTATION_QOS => INSTANCE_PRESENTATION_QOS, + DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, + COHERENT_ACCESS => FALSE, + ORDERED_ACCESS => FALSE, + WITH_KEY => TRUE, + PAYLOAD_FRAME_SIZE => 11, + MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS + ) + port map ( + clk => clk, + reset => reset, + time => check_time, + start_rtps => start_rtps, + opcode_rtps => opcode_rtps, + ack_rtps => ack_rtps, + done_rtps => done_rtps, + ret_rtps => ret_rtps, + data_in_rtps => data_in_rtps, + valid_in_rtps => valid_in_rtps, + ready_in_rtps => ready_in_rtps, + last_word_in_rtps => last_word_in_rtps, + start_kh => start_kh, + opcode_kh => opcode_kh, + ack_kh => ack_kh, + data_in_kh => data_in_kh, + valid_in_kh => valid_in_kh, + ready_in_kh => ready_in_kh, + last_word_in_kh => last_word_in_kh, + data_out_kh => data_out_kh, + valid_out_kh => valid_out_kh, + ready_out_kh => ready_out_kh, + last_word_out_kh => last_word_out_kh, + abort_kh => abort_kh, + start_dds => start_dds, + ack_dds => ack_dds, + opcode_dds => opcode_dds, + instance_state_dds => instance_state_dds, + view_state_dds => view_state_dds, + sample_state_dds => sample_state_dds, + instance_handle_dds => instance_handle_dds, + max_samples_dds => max_samples_dds, + get_data_dds => get_data_dds, + done_dds => done_dds, + return_code_dds => return_code_dds, + ready_out_dds => ready_out_dds, + valid_out_dds => valid_out_dds, + data_out_dds => data_out_dds, + last_word_out_dds => last_word_out_dds, + si_sample_state => si_sample_state, + si_view_state => si_view_state, + si_instance_state => si_instance_state, + si_source_timestamp => si_source_timestamp, + si_instance_handle => si_instance_handle, + si_publication_handle => si_publication_handle, + si_disposed_generation_count => si_disposed_generation_count, + si_no_writers_generation_count => si_no_writers_generation_count, + si_sample_rank => si_sample_rank, + si_generation_rank => si_generation_rank, + si_absolute_generation_rank => si_absolute_generation_rank, + si_valid_data => si_valid_data, + si_valid => si_valid, + si_last => si_last, + status => status + ); + + stimulus_prc : process + variable RV : RandomPType; + variable kh1, kh2, kh3, kh4 : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + variable cc1, cc2, cc3, cc4, cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE; + variable s : SAMPLE_TYPE := DEFAULT_SAMPLE; + + impure function gen_payload(key_hash : INSTANCE_HANDLE_TYPE; len : natural) return TEST_PACKET_TYPE is + variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + assert (len >= 4) report "Payload length has to be at least 16 Bytes long" severity FAILURE; + + for i in 0 to len-1 loop + if (i < 4) then + -- NOTE: Beginning of payload is negated key to allow deterministic Key Hash generation from the kh_prc + ret.data(ret.length) := not key_hash(i); + else + ret.data(ret.length) := RV.RandSlv(WORD_WIDTH); + end if; + ret.length := ret.length + 1; + end loop; + ret.last(ret.length-1) := '1'; + + 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 start_dds is + begin + dds_start <= '1'; + wait until rising_edge(clk); + dds_start <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure start_rtps is + begin + rtps_start <= '1'; + wait until rising_edge(clk); + rtps_start <= '0'; + wait until rising_edge(clk); + end procedure; + + procedure wait_on_dds is + begin + if (dds_done /= '1') then + wait until dds_done = '1'; + end if; + end procedure; + + procedure wait_on_rtps is + begin + if (rtps_done /= '1') then + wait until rtps_done = '1'; + end if; + end procedure; + + procedure wait_on_completion is + begin + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; + end if; + end procedure; + + begin + + SetAlertLogName("dds_reader - (KEEP LAST, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - RTPS Handling"); + SetAlertEnable(FAILURE, TRUE); + SetAlertEnable(ERROR, TRUE); + SetAlertEnable(WARNING, TRUE); + SetLogEnable(DEBUG, FALSE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, TRUE); + RV.InitSeed(RV'instance_name); + sstate_id <= GetAlertLogID("Sample State", ALERTLOG_BASE_ID); + vstate_id <= GetAlertLogID("View State", ALERTLOG_BASE_ID); + istate_id <= GetAlertLogID("Instance State", ALERTLOG_BASE_ID); + ts_id <= GetAlertLogID("Source Timestamp", ALERTLOG_BASE_ID); + inst_id <= GetAlertLogID("Instance Handle", ALERTLOG_BASE_ID); + pub_id <= GetAlertLogID("Publication Hanlde", ALERTLOG_BASE_ID); + dis_gen_cnt_id <= GetAlertLogID("Disposed Generation Count", ALERTLOG_BASE_ID); + no_w_gen_cnt_id <= GetAlertLogID("No Writers Generation Count", ALERTLOG_BASE_ID); + srank_id <= GetAlertLogID("Sample Rank", ALERTLOG_BASE_ID); + grank_id <= GetAlertLogID("Generation Rank", ALERTLOG_BASE_ID); + agrank_id <= GetAlertLogID("Absolute Generation Rank", ALERTLOG_BASE_ID); + last_id <= GetAlertLogID("Last Sample", ALERTLOG_BASE_ID); + valid_id <= GetAlertLogID("Valid Data", ALERTLOG_BASE_ID); + data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID); + ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID); + + -- Key Hashes + kh1 := gen_key_hash; + kh2 := gen_key_hash; + kh3 := gen_key_hash; + kh4 := gen_key_hash; + + + + Log("Initiating Test", INFO); + reset <= '1'; + wait until rising_edge(clk); + wait until rising_edge(clk); + reset <= '0'; + -- MEM: 0, 0, 0, 0 + -- ISTATE: - + -- WRITER: - + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(1,0); + + -- TEST: NORMAL ADD_CACHE_CHANGE + -- TEST: SAMPLE WITH ALIGNED PAYLOAD + -- TEST: NORMAL SAMPLE [UNKNOWN INSTANCE] + -- TEST: SAMPLE WITH KEY_HASH + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S1, 0, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := HANDLE_NIL; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(2,0); + + -- TEST: SAMPLE WITHOUT KEY_HASH + -- TEST: NORMAL SAMPLE [KNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [NO KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + s.inst := kh1; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S1, I1S2, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,18); + cc.src_timestamp := gen_duration(2,0); + + -- TEST: SAMPLE WITH UNALIGNED PAYLOAD [>1 SLOT] + -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S2, I1S3+, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I1S3+, 0, 0, 0 + -- ISTATE: I1:ALIVE + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(3,0); + + -- TEST: DISPOSE SAMPLE [KNOWN INSTANCE] + -- TEST: SAMPLE WITH SERIALIZED KEY [WITH KEY_HASH] + -- TEST: SAMPLE WITH UNALIGNED PAYLOAD [<1 SLOT] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + s.inst := kh1; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S3+, I1S4-, 0, 0 + -- ISTATE: I1:DISPOSED + -- WRITER: W0:I1 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh2; + cc.payload := gen_payload(kh2,20); + cc.src_timestamp := gen_duration(4,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload (2 Slots)] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + start_rtps; + wait_on_rtps; + -- MEM: I1S3+, I1S4-, I2S1+, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE + -- WRITER: W0:I1, W1:I2 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(5,0); + + -- TEST: TEST SAMPLE WITH SERIALIZED KEY EFFECT ON PAYLOAD MEMORY FULLNESS + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S3+, I1S4-, I2S1+, I3S1 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I1, W1:I2,I3 + + -- TEST: REMOVE_WRITER [UNKNOWN WRITER] + + Log("RTPS Operation REMOVE_WRITER [Writer 2] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, NOT_READ_SAMPLE_STATE, NOT_ALIVE_DISPOSED_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := NOT_READ_SAMPLE_STATE; + dds.istate := NOT_ALIVE_DISPOSED_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I1S3+, I2S1+, I3S1, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I1, W1:I2,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(6,0); + + -- TEST: ADD_CACHE_CHANGE ON PAYLOAD MEMORY FULL + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I1, W1:I2,I3, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh4; + cc.payload := gen_payload(kh4,10); + cc.src_timestamp := gen_duration(7,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + -- TEST: REMOVE_WRITER [KNOWN WRITER (1 Instance)] + + Log("RTPS Operation REMOVE_WRITER [Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 0; + change_istate(kh1, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W1:I2,I3, W2:I3 + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + remove_inst(kh1, mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I2S1+, I3S1, I3S2, I4S1 + -- ISTATE: I2:ALIVE, I3:ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + Log("DDS Operation TAKE [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 1; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: I3S1, I3S2, I4S1, 0 + -- ISTATE: I2:ALIVE, I3:ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(8,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(8,0); + + -- TEST: DISPOSE SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 0] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh4; + cc.payload := gen_payload(kh4,10); + cc.src_timestamp := gen_duration(8,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S1, I4S2 + -- ISTATE: I2:ALIVE, I3:ALIVE, I4:ALIVE + -- WRITER: W1:I2,I3,I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,10); + cc.src_timestamp := gen_duration(9,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + -- TEST: REMOVE_WRITER [KNOWN WRITER (>1 Instances)] + + Log("RTPS Operation REMOVE_WRITER [Writer 1] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := REMOVE_WRITER; + rtps.writer_pos := 1; + change_istate(kh2, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + change_istate(kh4, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, mem); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S1, I3S2, I4S1, I4S2 + -- ISTATE: I2:NO_WRITERS, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W2:I3 + + -- TEST: ADD SAMPLE ON MAX_SAMPLES [UNKNOWN INSTANCE] + -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + remove_inst(kh2,mem); + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I3S2, I4S1, I4S2, I1S1 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W0:I1, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(10,0); + + -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I4S1, I4S2, I1S1, I3S3 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W0:I1, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(11,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I4S2, I1S1, I3S3, I3S4 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W0:I1, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(12,0); + + -- TEST: ADD SAMPLE ON PAYLOAD MEMORY FULL & MAX_SAMPLES_PER_INSTANCE (Induce Double Remove) + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + remove_sample(2,mem); + remove_sample(0,mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S1, I3S4, I3S5, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:NO_WRITERS + -- WRITER: W0:I1, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh1; + cc.payload := gen_payload(kh1,30); + cc.src_timestamp := gen_duration(13,0); + + -- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload (3 Slots)] (REJECTED: Payload memory Full)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := REJECTED; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := HANDLE_NIL; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(14,0); + + -- TEST: DISPOSE SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + -- TEST: SAMPLE WITH SERIALIZED KEY [WITHOUT KEY_HASH] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 4, Writer 1] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + s.inst := kh4; + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S1, I3S4, I3S5, I4S3- + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(15,0); + + -- TEST: DISPOSE SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 4, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W0:I1,I4 W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(16,0); + + -- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, KNOWN WRITER] + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 4, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W0:I1, W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(17,0); + + -- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, UNKNOWN WRITER] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh2; + cc.payload := gen_payload(kh2,5); + cc.src_timestamp := gen_duration(18,0); + + -- TEST: UNREGISTER SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 2, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(19,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 0] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + s := to_sample(cc,NOT_ALIVE_NO_WRITERS_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, 0, 0, 0 + -- ISTATE: I1:NO_WRITERS, I3:ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(20,0); + + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 2] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(21,0); + + -- TEST: FILTER SAMPLE [KNOWN INSTANCE] + -- TEST: FILTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 1, Writer 2] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W1:I4, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_UNREGISTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(22,0); + + -- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE, STALE INSTANCE TRANSITION] + + Log("RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 4, Writer 1] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, 0, 0 + -- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED + -- WRITER: W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh2; + cc.payload := gen_payload(kh2,10); + cc.src_timestamp := gen_duration(23,0); + + -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 0, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 0; + remove_inst(kh4, mem); + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S2-, I1S3-, I2S1, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + -- VALIDATE STATE + + Log("DDS Operation TAKE [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := TAKE; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + -- MEM: 0, 0, 0, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := NOT_ALIVE_DISPOSED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(24,0); + + Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Instance 1, Writer 2] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, 0, 0, 0 + -- ISTATE: I1:DISPOSED, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh1; + cc.payload := gen_payload(kh1,5); + cc.src_timestamp := gen_duration(25,0); + + -- TEST: FILTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 1, Writer 2] (ACCEPT)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.writer_pos := 2; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, I1S5-, 0, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := TRUE; + cc.kind := ALIVE_FILTERED; + cc.instance := kh4; + cc.payload := gen_payload(kh4,5); + cc.src_timestamp := gen_duration(26,0); + + -- TEST: FILTER SAMPLE [UNKNOWN INSTANCE] + + Log("RTPS Operation ADD_CACHE_CHANGE [FILTERED, Instance 4, Writer 1] (IGNORED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 1; + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + + cc := DEFAULT_CACHE_CHANGE; + cc.serialized_key := FALSE; + cc.kind := ALIVE; + cc.instance := kh3; + cc.payload := gen_payload(kh3,10); + cc.src_timestamp := gen_duration(10,0); + + -- TEST: SAMPLE WITH EARLY TIMESTAMP [TIMESTAMP EARLIER THAN LAST READ] + + Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO); + rtps := DEFAULT_RTPS_READER_TEST; + rtps.opcode := ADD_CACHE_CHANGE; + rtps.cc := cc; + rtps.writer_pos := 2; + s := to_sample(cc,ALIVE_INSTANCE_STATE); + add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS); + rtps.ret_code := OK; + start_rtps; + wait_on_rtps; + -- MEM: I1S4-, I1S5-, I3S3, 0 + -- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE + -- WRITER: W0:I2, W2:I1,I3 + + -- VALIDATE STATE + + Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO); + dds := DEFAULT_DDS_READER_TEST; + dds.opcode := READ; + dds.max_samples := 4; + dds.sstate := ANY_SAMPLE_STATE; + dds.istate := ANY_INSTANCE_STATE; + dds.vstate := ANY_VIEW_STATE; + start_dds; + wait_on_dds; + + 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; + + alert_prc : process(all) + begin + if rising_edge(clk) then + -- TODO + end if; + end process; + + dds_prc : process(all) + variable col : COLLECTION_TYPE := DEFAULT_COLLECTION; + begin + if rising_edge(clk) then + dds_done <= '0'; + case (dds_stage ) is + when IDLE => + if (dds_start = '1') then + dds_stage <= START; + else + dds_done <= '1'; + end if; + when START => + if (ack_dds = '1') then + dds_stage <= DONE; + dds_cnt <= 0; + end if; + when DONE => + if (done_dds = '1') then + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + case (dds.ret_code) is + when RETCODE_OK => + gen_collection(mem, col, dds, INSTANCE_PRESENTATION_QOS, FALSE); + dds_stage <= CHECK_SI; + dds_cnt <= 0; + when others => + dds_stage <= IDLE; + end case; + end if; + when CHECK_SI => + if (si_valid = '1') then + AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); + AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); + AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); + AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); + AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); + AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); + AffirmIfEqual(no_w_gen_cnt_id, si_no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH))); + AffirmIfEqual(srank_id, si_sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH))); + AffirmIfEqual(grank_id, si_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH))); + AffirmIfEqual(agrank_id, si_absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH))); + if (dds_cnt = col.len-1) then + AffirmIf(last_id, si_last = '1', "Last Signal not pulled High"); + else + AffirmIf(last_id, si_last = '0', "Last Signal pulled High"); + end if; + if (si_valid_data = '1') then + AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected"); + dds_stage <= CHECK_DATA; + dds_cnt2 <= 0; + else + AffirmIf(valid_id, col.s(dds_cnt).data = EMPTY_TEST_PACKET, "Sample with Data expected"); + if (dds_cnt = col.len-1) then + -- DONE + dds_stage <= IDLE; + else + dds_cnt <= dds_cnt + 1; + end if; + end if; + end if; + when CHECK_DATA => + if (valid_out_dds = '1') then + AffirmIfEqual(data_id, data_out_dds, col.s(dds_cnt).data.data(dds_cnt2)); + dds_cnt2 <= dds_cnt2 + 1; + if (dds_cnt2 = col.s(dds_cnt).data.length-1) then + AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); + if (dds_cnt = col.len-1) then + -- DONE + dds_stage <= IDLE; + else + dds_stage <= CHECK_SI; + dds_cnt <= dds_cnt + 1; + end if; + end if; + end if; + end case; + end if; + + -- DEFAULT + start_dds <= '0'; + opcode_dds <= NOP; + instance_state_dds <= ANY_INSTANCE_STATE; + view_state_dds <= ANY_VIEW_STATE; + sample_state_dds <= ANY_SAMPLE_STATE; + instance_handle_dds <= HANDLE_NIL; + max_samples_dds <= (others => '0'); + get_data_dds <= '0'; + ready_out_dds <= '0'; + + + case (dds_stage ) is + when START => + start_dds <= '1'; + opcode_dds <= dds.opcode; + instance_state_dds <= dds.istate; + view_state_dds <= dds.vstate; + sample_state_dds <= dds.sstate; + instance_handle_dds <= dds.inst; + max_samples_dds <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH)); + when CHECK_SI => + if (si_valid = '1' and si_valid_data = '1') then + get_data_dds <= '1'; + end if; + when CHECK_DATA => + ready_out_dds <= '1'; + when others => + null; + end case; + end process; + + rtps_prc : process(all) + variable stimulus : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; + begin + if rising_edge(clk) then + rtps_done <= '0'; + case (rtps_stage) is + when IDLE => + if (rtps_start = '1') then + rtps_stage <= START; + else + rtps_done <= '1'; + end if; + when START => + if (ack_rtps = '1') then + case (rtps.opcode) is + when ADD_CACHE_CHANGE => + gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus); + rtps_stage <= PUSH; + when others => + rtps_stage <= DONE; + end case; + end if; + when PUSH => + if (ready_in_rtps = '1') then + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = stimulus.length-1) then + rtps_stage <= DONE; + end if; + end if; + when DONE => + if (done_rtps = '1') then + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + rtps_stage <= IDLE; + end if; + end case; + end if; + + -- DEFAULT + start_rtps <= '0'; + opcode_rtps <= NOP; + valid_in_rtps <= '0'; + last_word_in_rtps <= '0'; + data_in_rtps <= (others => '0'); + + case (rtps_stage) is + when START => + start_rtps <= '1'; + opcode_rtps <= rtps.opcode; + case (rtps.opcode) is + when REMOVE_WRITER => + data_in_rtps <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH)); + when others => + null; + end case; + when PUSH => + valid_in_rtps <= '1'; + data_in_rtps <= stimulus.data(rtps_cnt); + last_word_in_rtps <= stimulus.last(rtps_cnt); + when others => + null; + end case; + end process; + + kh_prc : process (all) + variable tmp_key_hash : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + if rising_edge(clk) then + case (kh_stage) is + when IDLE => + if (start_kh = '1') then + case (opcode_kh) is + when PUSH_DATA => + kh_stage <= READ_DATA; + kh_cnt <= 0; + kh_data <= EMPTY_TEST_PACKET; + when PUSH_SERIALIZED_KEY => + kh_stage <= READ_DATA; + kh_cnt <= 0; + kh_data <= EMPTY_TEST_PACKET; + when READ_KEY_HASH => + kh_stage <= PUSH_KEY_HASH; + kh_cnt <= 0; + when others => + Alert("Unexpected Key Holder Operation", FAILURE); + end case; + end if; + when READ_DATA => + if (valid_out_kh = '1') then + kh_data.data(kh_cnt) <= data_out_kh; + kh_data.last(kh_cnt) <= last_word_out_kh; + kh_data.length <= kh_data.length + 1; + + kh_cnt <= kh_cnt + 1; + if (last_word_out_kh = '1') then + kh_stage <= IDLE; + end if; + end if; + when PUSH_KEY_HASH => + if (ready_in_kh = '1') then + kh_cnt <= kh_cnt + 1; + if (kh_cnt = INSTANCE_HANDLE_TYPE'length-1) then + kh_stage <= IDLE; + end if; + end if; + end case; + end if; + + -- DEFAULT + ack_kh <= '0'; + ready_out_kh <= '0'; + valid_in_kh <= '0'; + data_in_kh <= (others => '0'); + last_word_in_kh <= '0'; + + case (kh_stage) is + when IDLE => + if (start_kh = '1') then + ack_kh <= '1'; + end if; + when READ_DATA => + ready_out_kh <= '1'; + when PUSH_KEY_HASH => + valid_in_kh <= '1'; + tmp_key_hash := extract_key_hash(kh_data); + data_in_kh <= tmp_key_hash(kh_cnt); + if (kh_cnt = INSTANCE_HANDLE_TYPE'length-1) then + last_word_in_kh <= '1'; + end if; + end case; + 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_dds_writer_test1_afk.vhd b/src/Tests/Level_0/L0_dds_writer_test1_afk.vhd index 5821274..2013154 100644 --- a/src/Tests/Level_0/L0_dds_writer_test1_afk.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test1_afk.vhd @@ -87,15 +87,15 @@ architecture testbench of L0_dds_writer_test1_afk is constant MAX_REMOTE_ENDPOINTS : natural := 3; -- *TYPE DECLARATION* - type STIM_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK); - type REF_STAGE_TYPE is (IDLE, START, DONE, CHECK); + type DDS_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK); + type RTPS_STAGE_TYPE is (IDLE, START, DONE, CHECK); type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); - type RTPS_TEST_TYPE is record + type RTPS_WRITER_TEST_TYPE is record opcode : HISTORY_CACHE_OPCODE_TYPE; cc : CACHE_CHANGE_TYPE; ret_code : HISTORY_CACHE_RESPONSE_TYPE; end record; - constant DEFAULT_RTPS_TEST : RTPS_TEST_TYPE := ( + constant DEFAULT_RTPS_WRITER_TEST : RTPS_WRITER_TEST_TYPE := ( opcode => NOP, cc => DEFAULT_CACHE_CHANGE, ret_code => OK @@ -133,14 +133,14 @@ architecture testbench of L0_dds_writer_test1_afk is signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); - signal stim_start, stim_done, ref_start, ref_done : std_logic := '0'; - signal stim_cnt, ref_cnt, kh_cnt : natural := 0; - signal stim_stage : STIM_STAGE_TYPE := IDLE; - signal ref_stage : REF_STAGE_TYPE := IDLE; + signal dds_start, dds_done, rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; signal kh_stage : KH_STAGE_TYPE := IDLE; signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; - shared variable stimulus : DDS_TEST_TYPE := DEFAULT_DDS_TEST; - shared variable reference : RTPS_TEST_TYPE := DEFAULT_RTPS_TEST; + shared variable dds : DDS_TEST_TYPE := DEFAULT_DDS_TEST; + shared variable rtps : RTPS_WRITER_TEST_TYPE := DEFAULT_RTPS_WRITER_TEST; signal inst_id, kind_id, sn_id, ts_id, data_id, ret_id : AlertLogIDType; -- *FUNCTION DECLARATION* @@ -262,40 +262,40 @@ begin return ret; end function; - procedure start_stim is + procedure start_dds is begin - stim_start <= '1'; + dds_start <= '1'; wait until rising_edge(clk); - stim_start <= '0'; + dds_start <= '0'; wait until rising_edge(clk); end procedure; - procedure start_ref is + procedure start_rtps is begin - ref_start <= '1'; + rtps_start <= '1'; wait until rising_edge(clk); - ref_start <= '0'; + rtps_start <= '0'; wait until rising_edge(clk); end procedure; - procedure wait_on_stim is + procedure wait_on_dds is begin - if (stim_done /= '1') then - wait until stim_done = '1'; + if (dds_done /= '1') then + wait until dds_done = '1'; end if; end procedure; - procedure wait_on_ref is + procedure wait_on_rtps is begin - if (ref_done /= '1') then - wait until ref_done = '1'; + if (rtps_done /= '1') then + wait until rtps_done = '1'; end if; end procedure; procedure wait_on_completion is begin - if (ref_done /= '1' or stim_done /= '1') then - wait until ref_done = '1' and stim_done = '1'; + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; end if; end procedure; @@ -334,23 +334,24 @@ begin -- TEST: GET_MIN_SN/GET_MAX_SN ON EMPTY Log("RTPS Operation GET_MIN_SN (Expected SEQUENCENUMBER_UNKNOWN)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SEQUENCENUMBER_UNKNOWN)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; + start_rtps; + wait_on_rtps; -- TEST: WRITE ALIGNED PAYLOAD -- TEST: NORMAL WRITE -- TEST: ADD SAMPLE WITH KEY_HASH [UNKNOWN INSTANCE] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -359,44 +360,45 @@ begin cc.src_timestamp := gen_duration(1,0); Log("DDS Operation WRITE [TS 1s, Instance 1] (REJECTED: Instance not Registered)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_BAD_PARAMETER; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_BAD_PARAMETER; + start_dds; + wait_on_dds; -- TEST: ADD SAMPLE WITH HANDLE_NIL [UNKNOWN INSTANCE] Log("DDS Operation WRITE [TS 1s, Instance 1, HANDLE_NIL] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I1S1, 0, 0, 0 -- TEST: GET_MIN_SN/GET_MAX_SN ON 1 SAMPLE Log("RTPS Operation GET_MIN_SN (Expected SN 1)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(1); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(1); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 1)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(1); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(1); + start_rtps; + wait_on_rtps; -- TEST: WRITE UNALIGNED PAYLOAD [>1 SLOT] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -405,37 +407,38 @@ begin cc.src_timestamp := gen_duration(2,0); Log("DDS Operation WRITE [TS 2s, Instance 2, Unaligned Payload (2 Slots)] (REJECTED: Instance not Registered)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_BAD_PARAMETER; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_BAD_PARAMETER; + start_dds; + wait_on_dds; -- TEST: NORMAL REGISTER Log("DDS Operation REGISTER_INSTANCE 2 (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; -- TEST: ADD SAMPLE WITH KEY_HASH [KNOWN INSTANCE] Log("DDS Operation WRITE [TS 2s, Instance 2, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I1S1, I2S2, 0, 0 -- TEST: ADD SAMPLE WITH HANDLE_NIL [KNOWN INSTANCE] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -444,53 +447,54 @@ begin cc.src_timestamp := gen_duration(3,0); Log("DDS Operation WRITE [TS 3s, Instance 1, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I1S1, I2S2, I1S3, 0 -- TEST: GET_CACHE_CHANGE [UNKNOWN SN] Log("RTPS Operation GET_CACHE_CHANGE SN 4 (Invalid)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(4); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(4); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; -- TEST: GET_CACHE_CHANGE [KNOWN SN, ALIGNED PAYLOAD] Log("RTPS Operation GET_CACHE_CHANGE SN 1", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, >1 SLOT] Log("RTPS Operation GET_CACHE_CHANGE SN 2", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 3", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- TEST: WRITE UNALIGNED PAYLOAD [<1 SLOT] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -501,67 +505,68 @@ begin -- TEST: WRITE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] Log("DDS Operation WRITE [TS 4s, Instance 3, HANDLE_NIL, Unaligned Payload (1 Slot)] (REJECTED: Payload Memory Full)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; -- Stored CC: I1S1, I2S2, I1S3, 0 -- TEST: REMOVE_CACHE_CHANGE [UNKNOWN SN] Log("RTPS Operation REMOVE_CACHE_CHANGE SN 5 (Invalid)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(5); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(5); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; -- TEST: REMOVE_CACHE_CHANGE [KNOWN SN] Log("RTPS Operation REMOVE_CACHE_CHANGE SN 2", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- Stored CC: I1S1, 0, I1S3, 0 Log("DDS Operation WRITE [TS 4s, Instance 3, HANDLE_NIL, Unaligned Payload (1 Slot)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I1S1, I3S4, I1S3, 0 -- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, <1 SLOT] Log("RTPS Operation GET_CACHE_CHANGE SN 4", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: REGISTER INSTANCE [KNOWN INSTANCE] Log("DDS Operation REGISTER_INSTANCE 3 (No Change)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc2; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc2; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; -- TEST: NORMAL DISPOSE + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh1; @@ -572,48 +577,48 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITHOUT ACKed SAMPLES] Log("DDS Operation DISPOSE [TS 5s, Instance 1] (REJECTED: MAX_SAMPLES_PER_INSTANCE Exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; -- TEST: NORMAL ACK_CACHE_CHANGE Log("RTPS Operation ACK_CACHE_CHANGE SN 4", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed SAMPLES, WITHOUT ACKed INSTANCE SAMPLES] Log("DDS Operation DISPOSE [TS 5s, Instance 1] (REJECTED: MAX_SAMPLES_PER_INSTANCE Exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 1", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed INSTANCE SAMPLE] Log("DDS Operation DISPOSE [TS 5s, Instance 1] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I1S5, I3S4, I1S3, 0 @@ -621,26 +626,27 @@ begin -- TEST: GET_MIN_SN/GET_MAX_SN ON >1 SAMPLE Log("RTPS Operation GET_MIN_SN (Expected SN 3)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(3); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(3); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 5)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(5); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(5); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 5", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -651,50 +657,51 @@ begin -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCES] Log("DDS Operation WRITE [TS 6s, Instance 4, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 3", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- TEST: ACK_CACHE_CHANGE [ALREADY ACKed SN] Log("RTPS Operation ACK_CACHE_CHANGE SN 4", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 5", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH FULLY ACKed INSTANCE, WITHOUT STALE INSTANCE] Log("DDS Operation WRITE [TS 6s, Instance 4, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; -- TEST: NORMAL UNREGISTER + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh1; @@ -705,38 +712,39 @@ begin -- TEST: UNREGISTER ON DISPOSED INSTANCE Log("DDS Operation UNREGISTER_INSTANCE [TS 6s, Instance 1] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I1S5, I3S4, I1S6, 0 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 4)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(4); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(4); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 6)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(6); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(6); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 6", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -745,58 +753,59 @@ begin cc.src_timestamp := gen_duration(7,0); Log("DDS Operation WRITE [TS 7s, Instance 4, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 6", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] -- TEST: REMOVE STALE INSTANCE WITH >1 SAMPLES Log("DDS Operation WRITE [TS 7s, Instance 4, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I4S7, I3S4, 0, 0 Log("RTPS Operation GET_CACHE_CHANGE SN 5 (Invalid)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(5); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(5); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 6 (Invalid)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(6); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(6); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 7", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -805,15 +814,16 @@ begin cc.src_timestamp := gen_duration(8,0); Log("DDS Operation WRITE [TS 8s, Instance 2, Unaligned Payload (2 Slot)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I4S7, I3S4, I2S8, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -822,23 +832,24 @@ begin cc.src_timestamp := gen_duration(9,0); Log("DDS Operation WRITE [TS 9s, Instance 1, Aligned Payload] (REJECTED: Instance not Registered)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_BAD_PARAMETER; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_BAD_PARAMETER; + start_dds; + wait_on_dds; -- TEST: REGISTER INSTANCE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] Log("DDS Operation REGISTER_INSTANCE 1 (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh3; @@ -847,52 +858,53 @@ begin cc.src_timestamp := gen_duration(9,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 9s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I4S7, I3S4, I2S8, I3S9 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 4)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(4); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(4); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 9)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(9); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(9); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 8", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 9", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 9", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -903,23 +915,24 @@ begin -- TEST: REGISTER INSTANCE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] Log("DDS Operation REGISTER_INSTANCE 1 (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; Log("DDS Operation WRITE [TS 10s, Instance 1, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I4S7, I1S10, I2S8, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -928,15 +941,16 @@ begin cc.src_timestamp := gen_duration(11,0); Log("DDS Operation WRITE [TS 11s, Instance 1, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I4S7, I1S10, I2S8, I4S11 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -945,32 +959,33 @@ begin cc.src_timestamp := gen_duration(12,0); Log("DDS Operation WRITE [TS 12s, Instance 2, Aligned Payload] (REJECTED: Payload Memory Full)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 8", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- TEST: WRITE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] Log("DDS Operation WRITE [TS 12s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I4S7, I1S10, I2S12, I4S11 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -981,83 +996,84 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITHOUT ACKed SAMPLES] Log("DDS Operation WRITE [TS 13s, Instance 4, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 7", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLES] Log("DDS Operation WRITE [TS 13s, Instance 4, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I4S13, I1S10, I2S12, I4S11 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 4)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(10); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(10); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 9)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(13); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(13); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 10", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 11", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 12", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 13", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 12", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh2; @@ -1066,22 +1082,23 @@ begin cc.src_timestamp := gen_duration(14,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 14s, Instance 2] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I4S13, I1S10, I2S14, I4S11 Log("RTPS Operation ACK_CACHE_CHANGE SN 11", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -1092,33 +1109,34 @@ begin -- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE [WITH ACKed SAMPLES] Log("DDS Operation WRITE [TS 15s, Instance 4, Aligned Payload (2 Slots)] (REJECTED: Payload Memory Full)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation REMOVE_CACHE_CHANGE SN 11", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- Stored CC: I4S13, I1S10, I2S14, 0 Log("DDS Operation WRITE [TS 15s, Instance 4, Aligned Payload (2 Slots)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I4S13, I1S10, I2S14, I4S15 -- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh1; @@ -1127,33 +1145,33 @@ begin cc.src_timestamp := gen_duration(16,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 16s, Instance 1] (REJECTED: Payload memory Full, MAX_SAMPLES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 10", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 16s, Instance 1] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I4S13, I1S16, I2S14, I4S15 - + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh3; @@ -1164,88 +1182,89 @@ begin -- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] Log("DDS Operation DISPOSE [TS 17s, Instance 3] (REJECTED: Payload memory Full, MAX_SAMPLES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 13", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 14", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] -- TEST: ADD SAMPLE ON PAYLOAD FULL & MAX_INSTANCES [UNKNOWN INSTANCE,WITH ACKed SAMPLES,WITH STALE INSTANCE (>= 1 SAMPLE)] (Induce Double Remove) -- TEST: REMOVE STALE INSTANCE WITH 1 SAMPLES Log("DDS Operation DISPOSE [TS 17s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I3S17, I1S16, 0, I4S15 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 15)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(15); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(15); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 17)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(17); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(17); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 15", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 16", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 17", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation REMOVE_CACHE_CHANGE SN 15", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- Stored CC: I3S17, I1S16, 0, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -1256,15 +1275,16 @@ begin -- TEST: WRITE ON DISPOSED INSTANCE Log("DDS Operation WRITE [TS 18s, Instance 3, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I3S17, I1S16, I3S18, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -1273,15 +1293,16 @@ begin cc.src_timestamp := gen_duration(19,0); Log("DDS Operation WRITE [TS 19s, Instance 4, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I3S17, I1S16, I3S18, I4S19 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -1292,41 +1313,42 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITHOUT STALE INSTANCES,WITHOUT ACKed SAMPLES] Log("DDS Operation WRITE [TS 20s, Instance 2, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded, MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 16", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE (>0 SAMPLES)] Log("DDS Operation WRITE [TS 20s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I3S17, I2S20, I3S18, I4S19 Log("RTPS Operation ACK_CACHE_CHANGE SN 17", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh4; @@ -1335,22 +1357,23 @@ begin cc.src_timestamp := gen_duration(21,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 21s, Instance 4] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I4S21, I2S20, I3S18, I4S19 Log("RTPS Operation ACK_CACHE_CHANGE SN 19", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -1361,30 +1384,31 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITHOUT STALE INSTANCE, WITH ACKed SAMPLE] Log("DDS Operation WRITE [TS 22s, Instance 1, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded, MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation REMOVE_CACHE_CHANGE SN 19", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- Stored CC: I4S21, I2S20, I3S18, 0 Log("RTPS Operation REMOVE_CACHE_CHANGE SN 21", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- Stored CC: 0, I2S20, I3S18, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh2; @@ -1393,15 +1417,16 @@ begin cc.src_timestamp := gen_duration(22,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 22s, Instance 2] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I2S22, I2S20, I3S18, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh3; @@ -1410,17 +1435,18 @@ begin cc.src_timestamp := gen_duration(23,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 23s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I2S22, I2S20, I3S18, I3S23 -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE, WITHOUT ACKed SAMPLE] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -1429,51 +1455,52 @@ begin cc.src_timestamp := gen_duration(24,0); Log("DDS Operation WRITE [TS 24s, Instance 1, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded, MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 20", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: REMOVE STALE INSTANCE WITH 0 SAMPLES -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE, WITH ACKed SAMPLE] Log("DDS Operation WRITE [TS 24s, Instance 1, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I2S22, I1S24, I3S18, I3S23 Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: NORMAL NACK_CACHE_CHANGE Log("RTPS Operation NACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := NACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := NACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -1482,52 +1509,53 @@ begin cc.src_timestamp := gen_duration(25,0); Log("DDS Operation REGISTER_INSTANCE 4 (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: REGISTER ON UNREGISTERED INSTANCE Log("DDS Operation REGISTER_INSTANCE 2 (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc1; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc1; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; Log("DDS Operation REGISTER_INSTANCE 4 (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 18", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 23", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -1538,16 +1566,17 @@ begin -- TEST: WRITE ON UNREGISTERED INSTANCE Log("DDS Operation WRITE [TS 25s, Instance 3, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I2S22, I1S24, I3S25, I3S23 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -1556,13 +1585,14 @@ begin cc.src_timestamp := gen_duration(26,0); Log("DDS Operation REGISTER_INSTANCE 4 (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh4; @@ -1573,28 +1603,29 @@ begin -- TEST: UNREGISTER UNKNOWN INSTANCE Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, HANDLE_NIL, Instance 4] (IGNORED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; Log("RTPS Operation NACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := NACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := NACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation NACK_CACHE_CHANGE SN 23", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := NACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := NACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh3; @@ -1605,56 +1636,57 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITHOUT ACKed SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, Instance 3] (REJECTED: MAX_SAMPLES_PER_INSTANCE exceeded, MAX_SAMPLES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITH ACKed SAMPLES, WITHOUT ACKed INSTANCE SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, Instance 3] (REJECTED: MAX_SAMPLES_PER_INSTANCE exceeded, MAX_SAMPLES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 23", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITH ACKed INSTANCE SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I2S22, I1S24, I3S25, I3S26 Log("RTPS Operation ACK_CACHE_CHANGE SN 25", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh3; @@ -1665,29 +1697,30 @@ begin -- TEST: DISPOSE ON UNREGISTERED INSTANCE Log("DDS Operation DISPOSE [TS 27s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I2S22, I1S24, I3S27, I3S26 Log("RTPS Operation ACK_CACHE_CHANGE SN 26", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 27", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -1696,68 +1729,69 @@ begin cc.src_timestamp := gen_duration(28,0); Log("DDS Operation REGISTER_INSTANCE 4 (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; -- Stored CC: I2S22, I1S24, 0, 0 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 22)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(22); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(22); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 24)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(24); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(24); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 24", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation NACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := NACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := NACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation NACK_CACHE_CHANGE SN 24", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := NACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := NACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("DDS Operation WRITE [TS 28s, Instance 4, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I2S22, I1S24, I4S28, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -1766,29 +1800,30 @@ begin cc.src_timestamp := gen_duration(29,0); Log("DDS Operation WRITE [TS 29s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I2S22, I1S24, I4S28, I2S29 Log("RTPS Operation ACK_CACHE_CHANGE SN 24", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 28", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -1799,37 +1834,38 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLES (>1)] Log("DDS Operation WRITE [TS 30s, Instance 1, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I2S22, I1S30, I4S28, I2S29 Log("RTPS Operation REMOVE_CACHE_CHANGE SN 28", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- Stored CC: I2S22, I1S30, 0, I2S29 Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 29", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -1840,52 +1876,53 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed INSTANCE SAMPLES(>1)] Log("DDS Operation WRITE [TS 31s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I2S31, I1S30, 0, I2S29 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 29)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(29); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(29); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 31)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(31); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(31); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 29", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 30", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 31", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -1896,13 +1933,14 @@ begin -- TEST: INSTANCE LOOKUP [KNOWN INSTANCE] Log("DDS Operation LOOKUP_INSTANCE [Instance 1]", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := LOOKUP_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := LOOKUP_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -1913,12 +1951,12 @@ begin -- TEST: INSTANCE LOOKUP [UNKNOWN INSTANCE] Log("DDS Operation LOOKUP_INSTANCE [Unknown Instance]", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := LOOKUP_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_TEST; + dds.opcode := LOOKUP_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; wait_on_completion; TranscriptOpen(RESULTS_FILE, APPEND_MODE); @@ -1944,36 +1982,36 @@ begin end if; end process; - stim_prc : process(all) + dds_prc : process(all) begin if rising_edge(clk) then - stim_done <= '0'; - case (stim_stage) is + dds_done <= '0'; + case (dds_stage) is when IDLE => - if (stim_start = '1') then - stim_stage <= START; + if (dds_start = '1') then + dds_stage <= START; else - stim_done <= '1'; + dds_done <= '1'; end if; when START => if (ack_dds = '1') then - stim_stage <= PUSH; - stim_cnt <= 0; + dds_stage <= PUSH; + dds_cnt <= 0; end if; when PUSH => if (ready_in_dds = '1') then - stim_cnt <= stim_cnt + 1; - if (stim_cnt = stimulus.cc.payload.length-1) then + dds_cnt <= dds_cnt + 1; + if (dds_cnt = dds.cc.payload.length-1) then -- DEFAULT - stim_stage <= DONE; + dds_stage <= DONE; - case (stimulus.opcode) is + case (dds.opcode) is when REGISTER_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when LOOKUP_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when others => null; end case; @@ -1981,16 +2019,16 @@ begin end if; when DONE => if (done_dds = '1') then - AffirmIfEqual(ret_id, return_code_dds, stimulus.ret_code); - stim_stage <= IDLE; + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + dds_stage <= IDLE; end if; when CHECK => if (valid_out_dds = '1') then - AffirmIfEqual(data_id, data_out_dds, stimulus.cc.instance(stim_cnt)); - stim_cnt <= stim_cnt + 1; - if (stim_cnt = 3) then + AffirmIfEqual(data_id, data_out_dds, dds.cc.instance(dds_cnt)); + dds_cnt <= dds_cnt + 1; + if (dds_cnt = 3) then AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); - stim_stage <= IDLE; + dds_stage <= IDLE; end if; end if; end case; @@ -1998,6 +2036,7 @@ begin -- DEFAULT start_dds <= '0'; + opcode_dds <= NOP; valid_in_dds <= '0'; last_word_in_dds <= '0'; data_in_dds <= (others => '0'); @@ -2005,16 +2044,16 @@ begin source_ts_dds <= TIME_INVALID; ready_out_dds <= '0'; - case (stim_stage) is + case (dds_stage) is when START => start_dds <= '1'; - opcode_dds <= stimulus.opcode; - instance_handle_dds <= stimulus.cc.instance; - source_ts_dds <= stimulus.cc.src_timestamp; + opcode_dds <= dds.opcode; + instance_handle_dds <= dds.cc.instance; + source_ts_dds <= dds.cc.src_timestamp; when PUSH => valid_in_dds <= '1'; - data_in_dds <= stimulus.cc.payload.data(stim_cnt); - last_word_in_dds <= stimulus.cc.payload.last(stim_cnt); + data_in_dds <= dds.cc.payload.data(dds_cnt); + last_word_in_dds <= dds.cc.payload.last(dds_cnt); when CHECK => ready_out_dds <= '1'; when others => @@ -2022,54 +2061,51 @@ begin end case; end process; - ref_prc : process(all) + rtps_prc : process(all) begin if rising_edge(clk) then - ref_done <= '0'; - case (ref_stage) is + rtps_done <= '0'; + case (rtps_stage) is when IDLE => - if (ref_start = '1') then - ref_stage <= START; + if (rtps_start = '1') then + rtps_stage <= START; else - ref_done <= '1'; + rtps_done <= '1'; end if; when START => if (ack_rtps = '1') then - ref_stage <= DONE; + rtps_stage <= DONE; end if; when DONE => if (done_rtps = '1') then -- DEFAULT - ref_stage <= IDLE; + rtps_stage <= IDLE; - AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(reference.ret_code)); - case (reference.opcode) is + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + case (rtps.opcode) is when GET_CACHE_CHANGE => - if (reference.ret_code = OK) then - AffirmIfEqual(inst_id, cc_instance_handle(0), reference.cc.instance(0)); - AffirmIfEqual(inst_id, cc_instance_handle(1), reference.cc.instance(1)); - AffirmIfEqual(inst_id, cc_instance_handle(2), reference.cc.instance(2)); - AffirmIfEqual(inst_id, cc_instance_handle(3), reference.cc.instance(3)); - AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(reference.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(reference.cc.src_timestamp)); - ref_stage <= CHECK; - ref_cnt <= 0; + if (rtps.ret_code = OK) then + AffirmIfEqual(inst_id, to_unsigned(cc_instance_handle), to_unsigned(rtps.cc.instance)); + AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + rtps_stage <= CHECK; + rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when others => null; end case; end if; when CHECK => if (valid_out_rtps = '1') then - AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, reference.cc.payload.last(ref_cnt) & reference.cc.payload.data(ref_cnt)); - ref_cnt <= ref_cnt + 1; - if (ref_cnt = reference.cc.payload.length-1) then - ref_stage <= IDLE; + AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, rtps.cc.payload.last(rtps_cnt) & rtps.cc.payload.data(rtps_cnt)); + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = rtps.cc.payload.length-1) then + rtps_stage <= IDLE; end if; end if; end case; @@ -2077,17 +2113,19 @@ begin -- DEFAULT start_rtps <= '0'; + opcode_rtps <= NOP; + seq_nr_rtps <= SEQUENCENUMBER_UNKNOWN; get_data_rtps <= '0'; ready_out_rtps <= '0'; - case (ref_stage) is + case (rtps_stage) is when START => start_rtps <= '1'; - opcode_rtps <= reference.opcode; - seq_nr_rtps <= reference.cc.seq_nr; + opcode_rtps <= rtps.opcode; + seq_nr_rtps <= rtps.cc.seq_nr; when DONE => if (done_rtps = '1') then - case (reference.opcode) is + case (rtps.opcode) is when GET_CACHE_CHANGE => get_data_rtps <= '1'; when others => diff --git a/src/Tests/Level_0/L0_dds_writer_test1_aik.vhd b/src/Tests/Level_0/L0_dds_writer_test1_aik.vhd index 9700cf3..0306465 100644 --- a/src/Tests/Level_0/L0_dds_writer_test1_aik.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test1_aik.vhd @@ -87,29 +87,9 @@ architecture testbench of L0_dds_writer_test1_aik is constant MAX_REMOTE_ENDPOINTS : natural := 3; -- *TYPE DECLARATION* - type STIM_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK); - type REF_STAGE_TYPE is (IDLE, START, DONE, CHECK); + type DDS_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK); + type RTPS_STAGE_TYPE is (IDLE, START, DONE, CHECK); type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); - type RTPS_TEST_TYPE is record - opcode : HISTORY_CACHE_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : HISTORY_CACHE_RESPONSE_TYPE; - end record; - constant DEFAULT_RTPS_TEST : RTPS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => OK - ); - type DDS_TEST_TYPE is record - opcode : DDS_WRITER_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0); - end record; - constant DEFAULT_DDS_TEST : DDS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => RETCODE_OK - ); -- *SIGNAL DECLARATION* signal clk : std_logic := '0'; @@ -133,14 +113,14 @@ architecture testbench of L0_dds_writer_test1_aik is signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); - signal stim_start, stim_done, ref_start, ref_done : std_logic := '0'; - signal stim_cnt, ref_cnt, kh_cnt : natural := 0; - signal stim_stage : STIM_STAGE_TYPE := IDLE; - signal ref_stage : REF_STAGE_TYPE := IDLE; + signal dds_start, dds_done, rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; signal kh_stage : KH_STAGE_TYPE := IDLE; signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; - shared variable stimulus : DDS_TEST_TYPE := DEFAULT_DDS_TEST; - shared variable reference : RTPS_TEST_TYPE := DEFAULT_RTPS_TEST; + shared variable dds : DDS_WRITER_TEST_TYPE := DEFAULT_DDS_WRITER_TEST; + shared variable rtps : RTPS_WRITER_TEST_TYPE := DEFAULT_RTPS_WRITER_TEST; signal inst_id, kind_id, sn_id, ts_id, data_id, ret_id : AlertLogIDType; -- *FUNCTION DECLARATION* @@ -262,40 +242,40 @@ begin return ret; end function; - procedure start_stim is + procedure start_dds is begin - stim_start <= '1'; + dds_start <= '1'; wait until rising_edge(clk); - stim_start <= '0'; + dds_start <= '0'; wait until rising_edge(clk); end procedure; - procedure start_ref is + procedure start_rtps is begin - ref_start <= '1'; + rtps_start <= '1'; wait until rising_edge(clk); - ref_start <= '0'; + rtps_start <= '0'; wait until rising_edge(clk); end procedure; - procedure wait_on_stim is + procedure wait_on_dds is begin - if (stim_done /= '1') then - wait until stim_done = '1'; + if (dds_done /= '1') then + wait until dds_done = '1'; end if; end procedure; - procedure wait_on_ref is + procedure wait_on_rtps is begin - if (ref_done /= '1') then - wait until ref_done = '1'; + if (rtps_done /= '1') then + wait until rtps_done = '1'; end if; end procedure; procedure wait_on_completion is begin - if (ref_done /= '1' or stim_done /= '1') then - wait until ref_done = '1' and stim_done = '1'; + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; end if; end procedure; @@ -334,23 +314,24 @@ begin -- TEST: GET_MIN_SN/GET_MAX_SN ON EMPTY Log("RTPS Operation GET_MIN_SN (Expected SEQUENCENUMBER_UNKNOWN)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SEQUENCENUMBER_UNKNOWN)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; + start_rtps; + wait_on_rtps; -- TEST: WRITE ALIGNED PAYLOAD -- TEST: NORMAL WRITE -- TEST: ADD SAMPLE WITH KEY_HASH [UNKNOWN INSTANCE] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -359,44 +340,45 @@ begin cc.src_timestamp := gen_duration(1,0); Log("DDS Operation WRITE [TS 1s, Instance 1] (REJECTED: Instance not Registered)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_BAD_PARAMETER; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_BAD_PARAMETER; + start_dds; + wait_on_dds; -- TEST: ADD SAMPLE WITH HANDLE_NIL [UNKNOWN INSTANCE] Log("DDS Operation WRITE [TS 1s, Instance 1, HANDLE_NIL] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I1S1, 0, 0, 0 -- TEST: GET_MIN_SN/GET_MAX_SN ON 1 SAMPLE Log("RTPS Operation GET_MIN_SN (Expected SN 1)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(1); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(1); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 1)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(1); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(1); + start_rtps; + wait_on_rtps; -- TEST: WRITE UNALIGNED PAYLOAD [>1 SLOT] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -405,37 +387,38 @@ begin cc.src_timestamp := gen_duration(2,0); Log("DDS Operation WRITE [TS 2s, Instance 2, Unaligned Payload (2 Slots)] (REJECTED: Instance not Registered)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_BAD_PARAMETER; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_BAD_PARAMETER; + start_dds; + wait_on_dds; -- TEST: NORMAL REGISTER Log("DDS Operation REGISTER_INSTANCE 2 (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; -- TEST: ADD SAMPLE WITH KEY_HASH [KNOWN INSTANCE] Log("DDS Operation WRITE [TS 2s, Instance 2, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I1S1, I2S2, 0, 0 -- TEST: ADD SAMPLE WITH HANDLE_NIL [KNOWN INSTANCE] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -444,53 +427,54 @@ begin cc.src_timestamp := gen_duration(3,0); Log("DDS Operation WRITE [TS 3s, Instance 1, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I1S1, I2S2, I1S3, 0 -- TEST: GET_CACHE_CHANGE [UNKNOWN SN] Log("RTPS Operation GET_CACHE_CHANGE SN 4 (Invalid)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(4); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(4); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; -- TEST: GET_CACHE_CHANGE [KNOWN SN, ALIGNED PAYLOAD] Log("RTPS Operation GET_CACHE_CHANGE SN 1", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, >1 SLOT] Log("RTPS Operation GET_CACHE_CHANGE SN 2", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 3", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- TEST: WRITE UNALIGNED PAYLOAD [<1 SLOT] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -501,67 +485,68 @@ begin -- TEST: WRITE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] Log("DDS Operation WRITE [TS 4s, Instance 3, HANDLE_NIL, Unaligned Payload (1 Slot)] (REJECTED: Payload Memory Full)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; -- Stored CC: I1S1, I2S2, I1S3, 0 -- TEST: REMOVE_CACHE_CHANGE [UNKNOWN SN] Log("RTPS Operation REMOVE_CACHE_CHANGE SN 5 (Invalid)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(5); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(5); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; -- TEST: REMOVE_CACHE_CHANGE [KNOWN SN] Log("RTPS Operation REMOVE_CACHE_CHANGE SN 2", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- Stored CC: I1S1, 0, I1S3, 0 Log("DDS Operation WRITE [TS 4s, Instance 3, HANDLE_NIL, Unaligned Payload (1 Slot)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I1S1, I3S4, I1S3, 0 -- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, <1 SLOT] Log("RTPS Operation GET_CACHE_CHANGE SN 4", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: REGISTER INSTANCE [KNOWN INSTANCE] Log("DDS Operation REGISTER_INSTANCE 3 (No Change)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc2; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc2; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; -- TEST: NORMAL DISPOSE + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh1; @@ -572,48 +557,48 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITHOUT ACKed SAMPLES] Log("DDS Operation DISPOSE [TS 5s, Instance 1] (REJECTED: MAX_SAMPLES_PER_INSTANCE Exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; -- TEST: NORMAL ACK_CACHE_CHANGE Log("RTPS Operation ACK_CACHE_CHANGE SN 4", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed SAMPLES, WITHOUT ACKed INSTANCE SAMPLES] Log("DDS Operation DISPOSE [TS 5s, Instance 1] (REJECTED: MAX_SAMPLES_PER_INSTANCE Exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 1", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed INSTANCE SAMPLE] Log("DDS Operation DISPOSE [TS 5s, Instance 1] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I1S5, I3S4, I1S3, 0 @@ -621,26 +606,27 @@ begin -- TEST: GET_MIN_SN/GET_MAX_SN ON >1 SAMPLE Log("RTPS Operation GET_MIN_SN (Expected SN 3)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(3); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(3); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 5)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(5); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(5); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 5", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -651,50 +637,51 @@ begin -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCES] Log("DDS Operation WRITE [TS 6s, Instance 4, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 3", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- TEST: ACK_CACHE_CHANGE [ALREADY ACKed SN] Log("RTPS Operation ACK_CACHE_CHANGE SN 4", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 5", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH FULLY ACKed INSTANCE, WITHOUT STALE INSTANCE] Log("DDS Operation WRITE [TS 6s, Instance 4, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; -- TEST: NORMAL UNREGISTER + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh1; @@ -705,38 +692,39 @@ begin -- TEST: UNREGISTER ON DISPOSED INSTANCE Log("DDS Operation UNREGISTER_INSTANCE [TS 6s, Instance 1] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I1S5, I3S4, I1S6, 0 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 4)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(4); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(4); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 6)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(6); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(6); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 6", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -745,58 +733,59 @@ begin cc.src_timestamp := gen_duration(7,0); Log("DDS Operation WRITE [TS 7s, Instance 4, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 6", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] -- TEST: REMOVE STALE INSTANCE WITH >1 SAMPLES Log("DDS Operation WRITE [TS 7s, Instance 4, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I4S7, I3S4, 0, 0 Log("RTPS Operation GET_CACHE_CHANGE SN 5 (Invalid)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(5); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(5); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 6 (Invalid)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(6); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(6); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 7", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -805,15 +794,16 @@ begin cc.src_timestamp := gen_duration(8,0); Log("DDS Operation WRITE [TS 8s, Instance 2, Unaligned Payload (2 Slot)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I4S7, I3S4, I2S8, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -822,23 +812,24 @@ begin cc.src_timestamp := gen_duration(9,0); Log("DDS Operation WRITE [TS 9s, Instance 1, Aligned Payload] (REJECTED: Instance not Registered)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_BAD_PARAMETER; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_BAD_PARAMETER; + start_dds; + wait_on_dds; -- TEST: REGISTER INSTANCE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] Log("DDS Operation REGISTER_INSTANCE 1 (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh3; @@ -847,52 +838,53 @@ begin cc.src_timestamp := gen_duration(9,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 9s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I4S7, I3S4, I2S8, I3S9 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 4)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(4); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(4); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 9)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(9); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(9); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 8", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 9", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 9", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -903,23 +895,24 @@ begin -- TEST: REGISTER INSTANCE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] Log("DDS Operation REGISTER_INSTANCE 1 (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; Log("DDS Operation WRITE [TS 10s, Instance 1, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I4S7, I1S10, I2S8, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -928,15 +921,16 @@ begin cc.src_timestamp := gen_duration(11,0); Log("DDS Operation WRITE [TS 11s, Instance 1, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I4S7, I1S10, I2S8, I4S11 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -945,32 +939,33 @@ begin cc.src_timestamp := gen_duration(12,0); Log("DDS Operation WRITE [TS 12s, Instance 2, Aligned Payload] (REJECTED: Payload Memory Full)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 8", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- TEST: WRITE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] Log("DDS Operation WRITE [TS 12s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I4S7, I1S10, I2S12, I4S11 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -981,83 +976,84 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITHOUT ACKed SAMPLES] Log("DDS Operation WRITE [TS 13s, Instance 4, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 7", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLES] Log("DDS Operation WRITE [TS 13s, Instance 4, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I4S13, I1S10, I2S12, I4S11 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 4)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(10); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(10); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 9)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(13); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(13); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 10", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 11", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 12", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 13", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 12", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh2; @@ -1066,22 +1062,23 @@ begin cc.src_timestamp := gen_duration(14,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 14s, Instance 2] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I4S13, I1S10, I2S14, I4S11 Log("RTPS Operation ACK_CACHE_CHANGE SN 11", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -1092,33 +1089,34 @@ begin -- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE [WITH ACKed SAMPLES] Log("DDS Operation WRITE [TS 15s, Instance 4, Aligned Payload (2 Slots)] (REJECTED: Payload Memory Full)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation REMOVE_CACHE_CHANGE SN 11", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- Stored CC: I4S13, I1S10, I2S14, 0 Log("DDS Operation WRITE [TS 15s, Instance 4, Aligned Payload (2 Slots)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I4S13, I1S10, I2S14, I4S15 -- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh1; @@ -1127,33 +1125,33 @@ begin cc.src_timestamp := gen_duration(16,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 16s, Instance 1] (REJECTED: Payload memory Full, MAX_SAMPLES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 10", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 16s, Instance 1] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I4S13, I1S16, I2S14, I4S15 - + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh3; @@ -1164,88 +1162,89 @@ begin -- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] Log("DDS Operation DISPOSE [TS 17s, Instance 3] (REJECTED: Payload memory Full, MAX_SAMPLES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 13", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 14", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] -- TEST: ADD SAMPLE ON PAYLOAD FULL & MAX_INSTANCES [UNKNOWN INSTANCE,WITH ACKed SAMPLES,WITH STALE INSTANCE (>= 1 SAMPLE)] (Induce Double Remove) -- TEST: REMOVE STALE INSTANCE WITH 1 SAMPLES Log("DDS Operation DISPOSE [TS 17s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I3S17, I1S16, 0, I4S15 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 15)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(15); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(15); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 17)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(17); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(17); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 15", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 16", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 17", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation REMOVE_CACHE_CHANGE SN 15", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- Stored CC: I3S17, I1S16, 0, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -1256,15 +1255,16 @@ begin -- TEST: WRITE ON DISPOSED INSTANCE Log("DDS Operation WRITE [TS 18s, Instance 3, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I3S17, I1S16, I3S18, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -1273,15 +1273,16 @@ begin cc.src_timestamp := gen_duration(19,0); Log("DDS Operation WRITE [TS 19s, Instance 4, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I3S17, I1S16, I3S18, I4S19 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -1292,41 +1293,42 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITHOUT STALE INSTANCES,WITHOUT ACKed SAMPLES] Log("DDS Operation WRITE [TS 20s, Instance 2, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded, MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 16", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE (>0 SAMPLES)] Log("DDS Operation WRITE [TS 20s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I3S17, I2S20, I3S18, I4S19 Log("RTPS Operation ACK_CACHE_CHANGE SN 17", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh4; @@ -1335,22 +1337,23 @@ begin cc.src_timestamp := gen_duration(21,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 21s, Instance 4] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I4S21, I2S20, I3S18, I4S19 Log("RTPS Operation ACK_CACHE_CHANGE SN 19", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -1361,30 +1364,31 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITHOUT STALE INSTANCE, WITH ACKed SAMPLE] Log("DDS Operation WRITE [TS 22s, Instance 1, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded, MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation REMOVE_CACHE_CHANGE SN 19", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- Stored CC: I4S21, I2S20, I3S18, 0 Log("RTPS Operation REMOVE_CACHE_CHANGE SN 21", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- Stored CC: 0, I2S20, I3S18, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh2; @@ -1393,15 +1397,16 @@ begin cc.src_timestamp := gen_duration(22,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 22s, Instance 2] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I2S22, I2S20, I3S18, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh3; @@ -1410,17 +1415,18 @@ begin cc.src_timestamp := gen_duration(23,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 23s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I2S22, I2S20, I3S18, I3S23 -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE, WITHOUT ACKed SAMPLE] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -1429,51 +1435,52 @@ begin cc.src_timestamp := gen_duration(24,0); Log("DDS Operation WRITE [TS 24s, Instance 1, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded, MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 20", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: REMOVE STALE INSTANCE WITH 0 SAMPLES -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE, WITH ACKed SAMPLE] Log("DDS Operation WRITE [TS 24s, Instance 1, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I2S22, I1S24, I3S18, I3S23 Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: NORMAL NACK_CACHE_CHANGE Log("RTPS Operation NACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := NACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := NACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -1482,52 +1489,53 @@ begin cc.src_timestamp := gen_duration(25,0); Log("DDS Operation REGISTER_INSTANCE 4 (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: REGISTER ON UNREGISTERED INSTANCE Log("DDS Operation REGISTER_INSTANCE 2 (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc1; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc1; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; Log("DDS Operation REGISTER_INSTANCE 4 (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 18", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 23", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -1538,16 +1546,17 @@ begin -- TEST: WRITE ON UNREGISTERED INSTANCE Log("DDS Operation WRITE [TS 25s, Instance 3, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I2S22, I1S24, I3S25, I3S23 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -1556,13 +1565,14 @@ begin cc.src_timestamp := gen_duration(26,0); Log("DDS Operation REGISTER_INSTANCE 4 (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh4; @@ -1573,28 +1583,29 @@ begin -- TEST: UNREGISTER UNKNOWN INSTANCE Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, HANDLE_NIL, Instance 4] (IGNORED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; Log("RTPS Operation NACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := NACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := NACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation NACK_CACHE_CHANGE SN 23", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := NACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := NACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh3; @@ -1605,56 +1616,57 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITHOUT ACKed SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, Instance 3] (REJECTED: MAX_SAMPLES_PER_INSTANCE exceeded, MAX_SAMPLES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITH ACKed SAMPLES, WITHOUT ACKed INSTANCE SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, Instance 3] (REJECTED: MAX_SAMPLES_PER_INSTANCE exceeded, MAX_SAMPLES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 23", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITH ACKed INSTANCE SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I2S22, I1S24, I3S25, I3S26 Log("RTPS Operation ACK_CACHE_CHANGE SN 25", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh3; @@ -1665,29 +1677,30 @@ begin -- TEST: DISPOSE ON UNREGISTERED INSTANCE Log("DDS Operation DISPOSE [TS 27s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I2S22, I1S24, I3S27, I3S26 Log("RTPS Operation ACK_CACHE_CHANGE SN 26", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 27", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -1696,68 +1709,69 @@ begin cc.src_timestamp := gen_duration(28,0); Log("DDS Operation REGISTER_INSTANCE 4 (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; -- Stored CC: I2S22, I1S24, 0, 0 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 22)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(22); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(22); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 24)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(24); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(24); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 24", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation NACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := NACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := NACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation NACK_CACHE_CHANGE SN 24", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := NACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := NACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("DDS Operation WRITE [TS 28s, Instance 4, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I2S22, I1S24, I4S28, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -1766,29 +1780,30 @@ begin cc.src_timestamp := gen_duration(29,0); Log("DDS Operation WRITE [TS 29s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I2S22, I1S24, I4S28, I2S29 Log("RTPS Operation ACK_CACHE_CHANGE SN 24", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 28", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -1799,37 +1814,38 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLES (>1)] Log("DDS Operation WRITE [TS 30s, Instance 1, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I2S22, I1S30, I4S28, I2S29 Log("RTPS Operation REMOVE_CACHE_CHANGE SN 28", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- Stored CC: I2S22, I1S30, 0, I2S29 Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 29", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -1840,52 +1856,53 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed INSTANCE SAMPLES(>1)] Log("DDS Operation WRITE [TS 31s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I2S31, I1S30, 0, I2S29 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 29)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(29); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(29); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 31)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(31); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(31); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 29", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 30", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 31", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -1896,13 +1913,14 @@ begin -- TEST: INSTANCE LOOKUP [KNOWN INSTANCE] Log("DDS Operation LOOKUP_INSTANCE [Instance 1]", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := LOOKUP_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := LOOKUP_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -1913,12 +1931,12 @@ begin -- TEST: INSTANCE LOOKUP [UNKNOWN INSTANCE] Log("DDS Operation LOOKUP_INSTANCE [Unknown Instance]", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := LOOKUP_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := LOOKUP_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; wait_on_completion; TranscriptOpen(RESULTS_FILE, APPEND_MODE); @@ -1944,36 +1962,36 @@ begin end if; end process; - stim_prc : process(all) + dds_prc : process(all) begin if rising_edge(clk) then - stim_done <= '0'; - case (stim_stage) is + dds_done <= '0'; + case (dds_stage) is when IDLE => - if (stim_start = '1') then - stim_stage <= START; + if (dds_start = '1') then + dds_stage <= START; else - stim_done <= '1'; + dds_done <= '1'; end if; when START => if (ack_dds = '1') then - stim_stage <= PUSH; - stim_cnt <= 0; + dds_stage <= PUSH; + dds_cnt <= 0; end if; when PUSH => if (ready_in_dds = '1') then - stim_cnt <= stim_cnt + 1; - if (stim_cnt = stimulus.cc.payload.length-1) then + dds_cnt <= dds_cnt + 1; + if (dds_cnt = dds.cc.payload.length-1) then -- DEFAULT - stim_stage <= DONE; + dds_stage <= DONE; - case (stimulus.opcode) is + case (dds.opcode) is when REGISTER_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when LOOKUP_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when others => null; end case; @@ -1981,16 +1999,16 @@ begin end if; when DONE => if (done_dds = '1') then - AffirmIfEqual(ret_id, return_code_dds, stimulus.ret_code); - stim_stage <= IDLE; + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + dds_stage <= IDLE; end if; when CHECK => if (valid_out_dds = '1') then - AffirmIfEqual(data_id, data_out_dds, stimulus.cc.instance(stim_cnt)); - stim_cnt <= stim_cnt + 1; - if (stim_cnt = 3) then + AffirmIfEqual(data_id, data_out_dds, dds.cc.instance(dds_cnt)); + dds_cnt <= dds_cnt + 1; + if (dds_cnt = 3) then AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); - stim_stage <= IDLE; + dds_stage <= IDLE; end if; end if; end case; @@ -1998,6 +2016,7 @@ begin -- DEFAULT start_dds <= '0'; + opcode_dds <= NOP; valid_in_dds <= '0'; last_word_in_dds <= '0'; data_in_dds <= (others => '0'); @@ -2005,16 +2024,16 @@ begin source_ts_dds <= TIME_INVALID; ready_out_dds <= '0'; - case (stim_stage) is + case (dds_stage) is when START => start_dds <= '1'; - opcode_dds <= stimulus.opcode; - instance_handle_dds <= stimulus.cc.instance; - source_ts_dds <= stimulus.cc.src_timestamp; + opcode_dds <= dds.opcode; + instance_handle_dds <= dds.cc.instance; + source_ts_dds <= dds.cc.src_timestamp; when PUSH => valid_in_dds <= '1'; - data_in_dds <= stimulus.cc.payload.data(stim_cnt); - last_word_in_dds <= stimulus.cc.payload.last(stim_cnt); + data_in_dds <= dds.cc.payload.data(dds_cnt); + last_word_in_dds <= dds.cc.payload.last(dds_cnt); when CHECK => ready_out_dds <= '1'; when others => @@ -2022,54 +2041,51 @@ begin end case; end process; - ref_prc : process(all) + rtps_prc : process(all) begin if rising_edge(clk) then - ref_done <= '0'; - case (ref_stage) is + rtps_done <= '0'; + case (rtps_stage) is when IDLE => - if (ref_start = '1') then - ref_stage <= START; + if (rtps_start = '1') then + rtps_stage <= START; else - ref_done <= '1'; + rtps_done <= '1'; end if; when START => if (ack_rtps = '1') then - ref_stage <= DONE; + rtps_stage <= DONE; end if; when DONE => if (done_rtps = '1') then -- DEFAULT - ref_stage <= IDLE; + rtps_stage <= IDLE; - AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(reference.ret_code)); - case (reference.opcode) is + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + case (rtps.opcode) is when GET_CACHE_CHANGE => - if (reference.ret_code = OK) then - AffirmIfEqual(inst_id, cc_instance_handle(0), reference.cc.instance(0)); - AffirmIfEqual(inst_id, cc_instance_handle(1), reference.cc.instance(1)); - AffirmIfEqual(inst_id, cc_instance_handle(2), reference.cc.instance(2)); - AffirmIfEqual(inst_id, cc_instance_handle(3), reference.cc.instance(3)); - AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(reference.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(reference.cc.src_timestamp)); - ref_stage <= CHECK; - ref_cnt <= 0; + if (rtps.ret_code = OK) then + AffirmIfEqual(inst_id, to_unsigned(cc_instance_handle), to_unsigned(rtps.cc.instance)); + AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + rtps_stage <= CHECK; + rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when others => null; end case; end if; when CHECK => if (valid_out_rtps = '1') then - AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, reference.cc.payload.last(ref_cnt) & reference.cc.payload.data(ref_cnt)); - ref_cnt <= ref_cnt + 1; - if (ref_cnt = reference.cc.payload.length-1) then - ref_stage <= IDLE; + AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, rtps.cc.payload.last(rtps_cnt) & rtps.cc.payload.data(rtps_cnt)); + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = rtps.cc.payload.length-1) then + rtps_stage <= IDLE; end if; end if; end case; @@ -2077,17 +2093,19 @@ begin -- DEFAULT start_rtps <= '0'; + opcode_rtps <= NOP; + seq_nr_rtps <= SEQUENCENUMBER_UNKNOWN; get_data_rtps <= '0'; ready_out_rtps <= '0'; - case (ref_stage) is + case (rtps_stage) is when START => start_rtps <= '1'; - opcode_rtps <= reference.opcode; - seq_nr_rtps <= reference.cc.seq_nr; + opcode_rtps <= rtps.opcode; + seq_nr_rtps <= rtps.cc.seq_nr; when DONE => if (done_rtps = '1') then - case (reference.opcode) is + case (rtps.opcode) is when GET_CACHE_CHANGE => get_data_rtps <= '1'; when others => diff --git a/src/Tests/Level_0/L0_dds_writer_test1_ain.vhd b/src/Tests/Level_0/L0_dds_writer_test1_ain.vhd index 756b469..7405bb1 100644 --- a/src/Tests/Level_0/L0_dds_writer_test1_ain.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test1_ain.vhd @@ -17,16 +17,16 @@ use work.rtps_test_package.all; -- TEST: GET_MIN_SN/GET_MAX_SN ON EMPTY -- TEST: GET_MIN_SN/GET_MAX_SN ON 1 SAMPLE -- TEST: GET_MIN_SN/GET_MAX_SN ON >1 SAMPLE --- TEST: ADD SAMPLE WITH KEY_HASH --- TEST: ADD SAMPLE WITH HANDLE_NIL --- TEST: NORMAL WRITE --- TEST: WRITE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] --- TEST: WRITE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] --- TEST: WRITE ON DISPOSED INSTANCE --- TEST: WRITE ON UNREGISTERED INSTANCE -- TEST: WRITE ALIGNED PAYLOAD -- TEST: WRITE UNALIGNED PAYLOAD [>1 SLOT] -- TEST: WRITE UNALIGNED PAYLOAD [<1 SLOT] +-- TEST: NORMAL WRITE +-- TEST: WRITE ON DISPOSED INSTANCE +-- TEST: WRITE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] +-- TEST: WRITE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] +-- TEST: WRITE ON UNREGISTERED INSTANCE +-- TEST: ADD SAMPLE WITH KEY_HASH +-- TEST: ADD SAMPLE WITH HANDLE_NIL -- TEST: NORMAL REGISTER -- TEST: NORMAL DISPOSE -- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] @@ -36,28 +36,20 @@ use work.rtps_test_package.all; -- TEST: GET_CACHE_CHANGE [KNOWN SN, ALIGNED PAYLOAD] -- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, >1 SLOT] -- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, <1 SLOT] +-- TEST: NORMAL UNREGISTER +-- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] +-- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] +-- TEST: UNREGISTER ON DISPOSED INSTANCE -- TEST: NORMAL ACK_CACHE_CHANGE -- TEST: ACK_CACHE_CHANGE [ALREADY ACKed SN] -- TEST: NORMAL NACK_CACHE_CHANGE +-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITHOUT ACKed SAMPLES] +-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLES] +-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLES (>1)] +-- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE [WITH ACKed SAMPLES] -- TEST: REMOVE_CACHE_CHANGE [UNKNOWN SN] -- TEST: REMOVE_CACHE_CHANGE [KNOWN SN] --- TEST: NORMAL UNREGISTER --- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] --- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] --- TEST: UNREGISTER ON DISPOSED INSTANCE --- TEST: UNREGISTER UNKNOWN INSTANCE --- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [WITHOUT ACKed SAMPLES] --- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [WITH ACKed SAMPLES, WITHOUT ACKed INSTANCE SAMPLES] --- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [WITH ACKed INSTANCE SAMPLE] --- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [WITH ACKed INSTANCE SAMPLES(>1)] --- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITHOUT ACKed SAMPLES] --- TEST: ADD SAMPLE ON MAX_SAMPLES [WITH ACKed SAMPLE] --- TEST: ADD SAMPLE ON MAX_SAMPLES [WITH ACKed SAMPLES (>1)] --- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [WITHOUT ACKed SAMPLES] --- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [WITH ACKed SAMPLES, WITHOUT ACKed INSTANCE SAMPLES] --- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [WITH ACKed INSTANCE SAMPLES] --- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE [WITH ACKed SAMPLES] --- TEST: INSTANCE LOOKUP +-- TEST: INSTANCE LOOKUP [KNOWN INSTANCE] entity L0_dds_writer_test1_ain is end entity; @@ -68,29 +60,9 @@ architecture testbench of L0_dds_writer_test1_ain is constant MAX_REMOTE_ENDPOINTS : natural := 3; -- *TYPE DECLARATION* - type STIM_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK); - type REF_STAGE_TYPE is (IDLE, START, DONE, CHECK); + type DDS_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK); + type RTPS_STAGE_TYPE is (IDLE, START, DONE, CHECK); type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); - type RTPS_TEST_TYPE is record - opcode : HISTORY_CACHE_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : HISTORY_CACHE_RESPONSE_TYPE; - end record; - constant DEFAULT_RTPS_TEST : RTPS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => OK - ); - type DDS_TEST_TYPE is record - opcode : DDS_WRITER_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0); - end record; - constant DEFAULT_DDS_TEST : DDS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => RETCODE_OK - ); -- *SIGNAL DECLARATION* signal clk : std_logic := '0'; @@ -114,14 +86,14 @@ architecture testbench of L0_dds_writer_test1_ain is signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); - signal stim_start, stim_done, ref_start, ref_done : std_logic := '0'; - signal stim_cnt, ref_cnt, kh_cnt : natural := 0; - signal stim_stage : STIM_STAGE_TYPE := IDLE; - signal ref_stage : REF_STAGE_TYPE := IDLE; + signal dds_start, dds_done, rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; signal kh_stage : KH_STAGE_TYPE := IDLE; signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; - shared variable stimulus : DDS_TEST_TYPE := DEFAULT_DDS_TEST; - shared variable reference : RTPS_TEST_TYPE := DEFAULT_RTPS_TEST; + shared variable dds : DDS_WRITER_TEST_TYPE := DEFAULT_DDS_WRITER_TEST; + shared variable rtps : RTPS_WRITER_TEST_TYPE := DEFAULT_RTPS_WRITER_TEST; signal inst_id, kind_id, sn_id, ts_id, data_id, ret_id : AlertLogIDType; -- *FUNCTION DECLARATION* @@ -243,40 +215,40 @@ begin return ret; end function; - procedure start_stim is + procedure start_dds is begin - stim_start <= '1'; + dds_start <= '1'; wait until rising_edge(clk); - stim_start <= '0'; + dds_start <= '0'; wait until rising_edge(clk); end procedure; - procedure start_ref is + procedure start_rtps is begin - ref_start <= '1'; + rtps_start <= '1'; wait until rising_edge(clk); - ref_start <= '0'; + rtps_start <= '0'; wait until rising_edge(clk); end procedure; - procedure wait_on_stim is + procedure wait_on_dds is begin - if (stim_done /= '1') then - wait until stim_done = '1'; + if (dds_done /= '1') then + wait until dds_done = '1'; end if; end procedure; - procedure wait_on_ref is + procedure wait_on_rtps is begin - if (ref_done /= '1') then - wait until ref_done = '1'; + if (rtps_done /= '1') then + wait until rtps_done = '1'; end if; end procedure; procedure wait_on_completion is begin - if (ref_done /= '1' or stim_done /= '1') then - wait until ref_done = '1' and stim_done = '1'; + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; end if; end procedure; @@ -314,23 +286,24 @@ begin -- TEST: GET_MIN_SN/GET_MAX_SN ON EMPTY Log("RTPS Operation GET_MIN_SN (Expected SEQUENCENUMBER_UNKNOWN)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SEQUENCENUMBER_UNKNOWN)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; + start_rtps; + wait_on_rtps; -- TEST: WRITE ALIGNED PAYLOAD -- TEST: NORMAL WRITE -- TEST: ADD SAMPLE WITH KEY_HASH + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -339,34 +312,35 @@ begin cc.src_timestamp := gen_duration(1,0); Log("DDS Operation WRITE [TS 1s, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: S1, 0, 0, 0 -- TEST: GET_MIN_SN/GET_MAX_SN ON 1 SAMPLE Log("RTPS Operation GET_MIN_SN (Expected SN 1)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(1); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(1); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 1)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(1); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(1); + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE WITH HANDLE_NIL -- TEST: WRITE UNALIGNED PAYLOAD [>1 SLOT] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -375,16 +349,17 @@ begin cc.src_timestamp := gen_duration(2,0); Log("DDS Operation WRITE [TS 2s, Unaligned Payload (2 Slots)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: S1, S2, 0, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -395,16 +370,17 @@ begin -- TEST: NORMAL REGISTER Log("DDS Operation REGISTER_INSTANCE 2 (Illegal Operation)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; -- TEST: NORMAL DISPOSE -- TEST: WRITE UNALIGNED PAYLOAD [<1 SLOT] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh1; @@ -413,68 +389,69 @@ begin cc.src_timestamp := gen_duration(3,0); Log("DDS Operation DISPOSE [TS 3s] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: S1, S2, S3, 0 -- TEST: GET_MIN_SN/GET_MAX_SN ON >1 SAMPLE Log("RTPS Operation GET_MIN_SN (Expected SN 1)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(1); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(1); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 3)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(3); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(3); + start_rtps; + wait_on_rtps; -- TEST: GET_CACHE_CHANGE [UNKNOWN SN] Log("RTPS Operation GET_CACHE_CHANGE SN 4 (Invalid)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(4); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(4); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; -- TEST: GET_CACHE_CHANGE [KNOWN SN, ALIGNED PAYLOAD] Log("RTPS Operation GET_CACHE_CHANGE SN 1", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, >1 SLOT] Log("RTPS Operation GET_CACHE_CHANGE SN 2", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, <1 SLOT] Log("RTPS Operation GET_CACHE_CHANGE SN 3", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -485,16 +462,17 @@ begin -- TEST: WRITE ON DISPOSED INSTANCE Log("DDS Operation WRITE [TS 2s, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: S1, S2, S3, S4 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh1; @@ -505,35 +483,36 @@ begin -- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 5s] (REJECTED: Payload Memory Full)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; -- TEST: NORMAL ACK_CACHE_CHANGE Log("RTPS Operation ACK_CACHE_CHANGE SN 1", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] -- TEST: NORMAL UNREGISTER Log("DDS Operation UNREGISTER_INSTANCE [TS 5s] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: S5, S2, S3, S4 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -544,51 +523,52 @@ begin -- TEST: WRITE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] Log("DDS Operation WRITE [TS 6s, Aligned Payload] (REJECTED: Payload Memory Full)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 2", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 3", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- TEST: NORMAL NACK_CACHE_CHANGE Log("RTPS Operation NACK_CACHE_CHANGE SN 2", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := NACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := NACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: WRITE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] -- TEST: WRITE ON UNREGISTERED INSTANCE Log("DDS Operation WRITE [TS 6s, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: S5, S2, S6, S4 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh1; @@ -599,41 +579,42 @@ begin -- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] Log("DDS Operation DISPOSE [TS 7s] (REJECTED: Payload Memory Full)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 2", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: ACK_CACHE_CHANGE [ALREADY ACKed SN] Log("RTPS Operation ACK_CACHE_CHANGE SN 2", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] Log("DDS Operation DISPOSE [TS 7s] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: S5, S7, S6, S4 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh1; @@ -644,91 +625,92 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITHOUT ACKed SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 8s] (REJECTED: MAX_SAMPLES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 5", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLES] -- TEST: UNREGISTER ON DISPOSED INSTANCE Log("DDS Operation UNREGISTER_INSTANCE [TS 8s] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: S8, S7, S6, S4 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 4)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(4); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(4); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 8)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(8); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(8); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 4", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 6", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 7", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 8", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 6", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 8", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh1; @@ -739,15 +721,16 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLES (>1)] Log("DDS Operation DISPOSE [TS 9s] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: S8, S7, S9, S4 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh1; @@ -758,22 +741,23 @@ begin -- TEST: DISPOSE ON UNREGISTERED INSTANCE Log("DDS Operation UNREGISTER_INSTANCE [TS 10s] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: S10, S7, S9, S4 Log("RTPS Operation ACK_CACHE_CHANGE SN 7", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -784,97 +768,97 @@ begin -- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE [WITH ACKed SAMPLES] Log("DDS Operation WRITE [TS 11s, Aligned Payload (2 Slots)] (REJECTED: Payload Memory Full)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; -- TEST: REMOVE_CACHE_CHANGE [UNKNOWN SN] Log("RTPS Operation REMOVE_CACHE_CHANGE SN 12 (Invalid)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(12); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(12); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; -- TEST: REMOVE_CACHE_CHANGE [KNOWN SN] Log("RTPS Operation REMOVE_CACHE_CHANGE SN 4", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- Stored CC: S10, S7, S9, 0 Log("DDS Operation WRITE [TS 11s, Aligned Payload (2 Slots)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: S10, S7, S9, S11 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 7)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(7); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(7); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 11)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(11); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(11); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 7", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 9", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 10", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 11", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- TEST: INSTANCE LOOKUP [KNOWN INSTANCE] Log("DDS Operation LOOKUP_INSTANCE [Illegal Operation]", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := LOOKUP_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := LOOKUP_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; wait_on_completion; TranscriptOpen(RESULTS_FILE, APPEND_MODE); @@ -900,56 +884,56 @@ begin end if; end process; - stim_prc : process(all) + dds_prc : process(all) begin if rising_edge(clk) then - stim_done <= '0'; - case (stim_stage) is + dds_done <= '0'; + case (dds_stage) is when IDLE => - if (stim_start = '1') then - stim_stage <= START; + if (dds_start = '1') then + dds_stage <= START; else - stim_done <= '1'; + dds_done <= '1'; end if; when START => if (ack_dds = '1') then - stim_stage <= PUSH; - stim_cnt <= 0; + dds_stage <= PUSH; + dds_cnt <= 0; end if; when PUSH => if (ready_in_dds = '1') then - stim_cnt <= stim_cnt + 1; - if (stim_cnt = stimulus.cc.payload.length-1) then + dds_cnt <= dds_cnt + 1; + if (dds_cnt = dds.cc.payload.length-1) then -- DEFAULT - stim_stage <= DONE; + dds_stage <= DONE; - case (stimulus.opcode) is + case (dds.opcode) is when REGISTER_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when LOOKUP_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when others => null; end case; end if; elsif (done_dds = '1') then - AffirmIfEqual(ret_id, return_code_dds, stimulus.ret_code); - stim_stage <= IDLE; + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + dds_stage <= IDLE; end if; when DONE => if (done_dds = '1') then - AffirmIfEqual(ret_id, return_code_dds, stimulus.ret_code); - stim_stage <= IDLE; + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + dds_stage <= IDLE; end if; when CHECK => if (valid_out_dds = '1') then - AffirmIfEqual(data_id, data_out_dds, stimulus.cc.instance(stim_cnt)); - stim_cnt <= stim_cnt + 1; - if (stim_cnt = 3) then + AffirmIfEqual(data_id, data_out_dds, dds.cc.instance(dds_cnt)); + dds_cnt <= dds_cnt + 1; + if (dds_cnt = 3) then AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); - stim_stage <= IDLE; + dds_stage <= IDLE; end if; end if; end case; @@ -957,6 +941,7 @@ begin -- DEFAULT start_dds <= '0'; + opcode_dds <= NOP; valid_in_dds <= '0'; last_word_in_dds <= '0'; data_in_dds <= (others => '0'); @@ -964,16 +949,16 @@ begin source_ts_dds <= TIME_INVALID; ready_out_dds <= '0'; - case (stim_stage) is + case (dds_stage) is when START => start_dds <= '1'; - opcode_dds <= stimulus.opcode; - instance_handle_dds <= stimulus.cc.instance; - source_ts_dds <= stimulus.cc.src_timestamp; + opcode_dds <= dds.opcode; + instance_handle_dds <= dds.cc.instance; + source_ts_dds <= dds.cc.src_timestamp; when PUSH => valid_in_dds <= '1'; - data_in_dds <= stimulus.cc.payload.data(stim_cnt); - last_word_in_dds <= stimulus.cc.payload.last(stim_cnt); + data_in_dds <= dds.cc.payload.data(dds_cnt); + last_word_in_dds <= dds.cc.payload.last(dds_cnt); when CHECK => ready_out_dds <= '1'; when others => @@ -981,50 +966,50 @@ begin end case; end process; - ref_prc : process(all) + rtps_prc : process(all) begin if rising_edge(clk) then - ref_done <= '0'; - case (ref_stage) is + rtps_done <= '0'; + case (rtps_stage) is when IDLE => - if (ref_start = '1') then - ref_stage <= START; + if (rtps_start = '1') then + rtps_stage <= START; else - ref_done <= '1'; + rtps_done <= '1'; end if; when START => if (ack_rtps = '1') then - ref_stage <= DONE; + rtps_stage <= DONE; end if; when DONE => if (done_rtps = '1') then -- DEFAULT - ref_stage <= IDLE; + rtps_stage <= IDLE; - AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(reference.ret_code)); - case (reference.opcode) is + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + case (rtps.opcode) is when GET_CACHE_CHANGE => - if (reference.ret_code = OK) then - AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(reference.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(reference.cc.src_timestamp)); - ref_stage <= CHECK; - ref_cnt <= 0; + if (rtps.ret_code = OK) then + AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + rtps_stage <= CHECK; + rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when others => null; end case; end if; when CHECK => if (valid_out_rtps = '1') then - AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, reference.cc.payload.last(ref_cnt) & reference.cc.payload.data(ref_cnt)); - ref_cnt <= ref_cnt + 1; - if (ref_cnt = reference.cc.payload.length-1) then - ref_stage <= IDLE; + AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, rtps.cc.payload.last(rtps_cnt) & rtps.cc.payload.data(rtps_cnt)); + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = rtps.cc.payload.length-1) then + rtps_stage <= IDLE; end if; end if; end case; @@ -1032,17 +1017,19 @@ begin -- DEFAULT start_rtps <= '0'; + opcode_rtps <= NOP; + seq_nr_rtps <= SEQUENCENUMBER_UNKNOWN; get_data_rtps <= '0'; ready_out_rtps <= '0'; - case (ref_stage) is + case (rtps_stage) is when START => start_rtps <= '1'; - opcode_rtps <= reference.opcode; - seq_nr_rtps <= reference.cc.seq_nr; + opcode_rtps <= rtps.opcode; + seq_nr_rtps <= rtps.cc.seq_nr; when DONE => if (done_rtps = '1') then - case (reference.opcode) is + case (rtps.opcode) is when GET_CACHE_CHANGE => get_data_rtps <= '1'; when others => diff --git a/src/Tests/Level_0/L0_dds_writer_test1_lik.vhd b/src/Tests/Level_0/L0_dds_writer_test1_lik.vhd index 22a6cd4..397fb72 100644 --- a/src/Tests/Level_0/L0_dds_writer_test1_lik.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test1_lik.vhd @@ -87,29 +87,9 @@ architecture testbench of L0_dds_writer_test1_lik is constant MAX_REMOTE_ENDPOINTS : natural := 3; -- *TYPE DECLARATION* - type STIM_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK); - type REF_STAGE_TYPE is (IDLE, START, DONE, CHECK); + type DDS_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK); + type RTPS_STAGE_TYPE is (IDLE, START, DONE, CHECK); type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); - type RTPS_TEST_TYPE is record - opcode : HISTORY_CACHE_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : HISTORY_CACHE_RESPONSE_TYPE; - end record; - constant DEFAULT_RTPS_TEST : RTPS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => OK - ); - type DDS_TEST_TYPE is record - opcode : DDS_WRITER_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0); - end record; - constant DEFAULT_DDS_TEST : DDS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => RETCODE_OK - ); -- *SIGNAL DECLARATION* signal clk : std_logic := '0'; @@ -133,14 +113,14 @@ architecture testbench of L0_dds_writer_test1_lik is signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); - signal stim_start, stim_done, ref_start, ref_done : std_logic := '0'; - signal stim_cnt, ref_cnt, kh_cnt : natural := 0; - signal stim_stage : STIM_STAGE_TYPE := IDLE; - signal ref_stage : REF_STAGE_TYPE := IDLE; + signal dds_start, dds_done, rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; signal kh_stage : KH_STAGE_TYPE := IDLE; signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; - shared variable stimulus : DDS_TEST_TYPE := DEFAULT_DDS_TEST; - shared variable reference : RTPS_TEST_TYPE := DEFAULT_RTPS_TEST; + shared variable dds : DDS_WRITER_TEST_TYPE := DEFAULT_DDS_WRITER_TEST; + shared variable rtps : RTPS_WRITER_TEST_TYPE := DEFAULT_RTPS_WRITER_TEST; signal inst_id, kind_id, sn_id, ts_id, data_id, ret_id : AlertLogIDType; -- *FUNCTION DECLARATION* @@ -262,40 +242,40 @@ begin return ret; end function; - procedure start_stim is + procedure start_dds is begin - stim_start <= '1'; + dds_start <= '1'; wait until rising_edge(clk); - stim_start <= '0'; + dds_start <= '0'; wait until rising_edge(clk); end procedure; - procedure start_ref is + procedure start_rtps is begin - ref_start <= '1'; + rtps_start <= '1'; wait until rising_edge(clk); - ref_start <= '0'; + rtps_start <= '0'; wait until rising_edge(clk); end procedure; - procedure wait_on_stim is + procedure wait_on_dds is begin - if (stim_done /= '1') then - wait until stim_done = '1'; + if (dds_done /= '1') then + wait until dds_done = '1'; end if; end procedure; - procedure wait_on_ref is + procedure wait_on_rtps is begin - if (ref_done /= '1') then - wait until ref_done = '1'; + if (rtps_done /= '1') then + wait until rtps_done = '1'; end if; end procedure; procedure wait_on_completion is begin - if (ref_done /= '1' or stim_done /= '1') then - wait until ref_done = '1' and stim_done = '1'; + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; end if; end procedure; @@ -334,21 +314,22 @@ begin -- TEST: GET_MIN_SN/GET_MAX_SN ON EMPTY Log("RTPS Operation GET_MIN_SN (Expected SEQUENCENUMBER_UNKNOWN)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SEQUENCENUMBER_UNKNOWN)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := SEQUENCENUMBER_UNKNOWN; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE WITH KEY_HASH [UNKNOWN INSTANCE] + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -357,44 +338,45 @@ begin cc.src_timestamp := gen_duration(1,0); Log("DDS Operation WRITE [TS 1s, Instance 1, Aligned Payload] (REJECTED: Instance not Registered)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_BAD_PARAMETER; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_BAD_PARAMETER; + start_dds; + wait_on_dds; -- TEST: ADD SAMPLE WITH HANDLE_NIL [UNKNOWN INSTANCE] -- TEST: NORMAL WRITE -- TEST: WRITE ALIGNED PAYLOAD Log("DDS Operation WRITE [TS 1s, Instance 1, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I1S1, 0, 0, 0 -- TEST: GET_MIN_SN/GET_MAX_SN ON 1 SAMPLE Log("RTPS Operation GET_MIN_SN (Expected SN 1)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(1); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(1); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 1)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(1); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(1); + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -406,15 +388,16 @@ begin -- TEST: WRITE UNALIGNED PAYLOAD [>1 SLOT] Log("DDS Operation WRITE [TS 2s, Instance 1, Unaligned Payload (2 Slot)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I1S1, I1S2, 0, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh2; @@ -423,34 +406,34 @@ begin cc.src_timestamp := gen_duration(3,0); Log("DDS Operation DISPOSE [TS 3s, Instance 2] (REJECTED: Instance not Registered)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_BAD_PARAMETER; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_BAD_PARAMETER; + start_dds; + wait_on_dds; -- TEST: NORMAL REGISTER Log("DDS Operation REGISTER_INSTANCE 2 (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; -- TEST: NORMAL DISPOSE -- TEST: WRITE UNALIGNED PAYLOAD [<1 SLOT] Log("DDS Operation DISPOSE [TS 3s, Instance 2] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I1S1, I1S2, I2S3, 0 @@ -458,56 +441,57 @@ begin -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 1)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(1); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(1); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 3)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(3); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(3); + start_rtps; + wait_on_rtps; -- TEST: GET_CACHE_CHANGE [UNKNOWN SN] Log("RTPS Operation GET_CACHE_CHANGE SN 4 (Invalid)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(4); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(4); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; -- TEST: GET_CACHE_CHANGE [KNOWN SN, ALIGNED PAYLOAD] Log("RTPS Operation GET_CACHE_CHANGE SN 1", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, >1 SLOT] Log("RTPS Operation GET_CACHE_CHANGE SN 2", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: GET_CACHE_CHANGE [KNOWN SN, UNALIGNED PAYLOAD, <1 SLOT] Log("RTPS Operation GET_CACHE_CHANGE SN 3", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -519,16 +503,17 @@ begin -- TEST: ADD SAMPLE WITH HANDLE_NIL [KNOWN INSTANCE] Log("DDS Operation WRITE [TS 4s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I1S1, I1S2, I2S3, I2S4 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -539,25 +524,26 @@ begin -- TEST: WRITE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] Log("DDS Operation WRITE [TS 5s, Instance 3, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I3S5, I1S2, I2S3, I2S4 -- TEST: NORMAL ACK_CACHE_CHANGE Log("RTPS Operation ACK_CACHE_CHANGE SN 3", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -568,59 +554,60 @@ begin -- TEST: WRITE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] Log("DDS Operation WRITE [TS 6s, Instance 3, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I3S5, I1S2, I3S6, I2S4 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 2)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(2); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(2); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 6)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(6); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(6); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 2", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 4", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 5", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 6", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh1; @@ -631,22 +618,23 @@ begin -- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] Log("DDS Operation DISPOSE [TS 7s, Instance 1] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I3S5, I1S7, I3S6, I2S4 Log("RTPS Operation ACK_CACHE_CHANGE SN 5", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -657,50 +645,51 @@ begin -- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE [WITH ACKed SAMPLES] Log("DDS Operation WRITE [TS 8s, Instance 2, Aligned Payload (2 Slots)] (REJECTED: Payload Memory Full)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; -- TEST: REMOVE_CACHE_CHANGE [UNKNOWN SN] Log("RTPS Operation REMOVE_CACHE_CHANGE SN 3 (Invalid)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(3); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(3); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; -- TEST: REMOVE_CACHE_CHANGE [KNOWN SN] Log("RTPS Operation REMOVE_CACHE_CHANGE SN 5", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- Stored CC: 0, I1S7, I3S6, I2S4 Log("DDS Operation WRITE [TS 8s, Instance 2, Aligned Payload (2 Slots)] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I2S8, I1S7, I3S6, I2S4 Log("RTPS Operation ACK_CACHE_CHANGE SN 7", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh3; @@ -711,59 +700,60 @@ begin -- TEST: DISPOSE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] Log("DDS Operation DISPOSE [TS 9s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I2S8, I3S9, I3S6, I2S4 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 4)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(4); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(4); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 9)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(9); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(9); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 4", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 6", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 8", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 9", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh1; @@ -775,22 +765,23 @@ begin -- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITHOUT ACKed SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 10s, Instance 1] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I2S8, I3S9, I3S6, I1S10 Log("RTPS Operation ACK_CACHE_CHANGE SN 9", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh2; @@ -801,36 +792,37 @@ begin -- TEST: UNREGISTER INSTANCE ON PAYLOAD MEMORY FULL [WITH ACKed SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 11s, Instance 2] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I2S8, I2S11, I3S6, I1S10 Log("RTPS Operation ACK_CACHE_CHANGE SN 6", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 8", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 11", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -843,46 +835,47 @@ begin -- TEST: REMOVE STALE INSTANCE WITH >1 SAMPLES Log("DDS Operation WRITE [TS 12s, Instance 4, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I4S12, 0, 0, I1S10 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 10)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(10); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(10); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 12)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(12); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(12); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 10", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 12", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -893,52 +886,53 @@ begin -- TEST: REGISTER INSTANCE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] Log("DDS Operation REGISTER_INSTANCE 2 (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 10", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- TEST: REGISTER INSTANCE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] -- TEST: REMOVE STALE INSTANCE WITH 1 SAMPLES Log("DDS Operation REGISTER_INSTANCE 2 (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; -- Stored CC: I4S12, 0, 0, 0 Log("DDS Operation WRITE [TS 13s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I4S12, I2S13, 0, 0 -- TEST: REGISTER INSTANCE [KNOWN INSTANCE] Log("DDS Operation REGISTER_INSTANCE 2 (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -947,15 +941,16 @@ begin cc.src_timestamp := gen_duration(14,0); Log("DDS Operation WRITE [TS 14s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I4S12, I2S13, I2S14, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -966,22 +961,23 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITHOUT ACKed SAMPLES] Log("DDS Operation WRITE [TS 15s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I4S12, I2S15, I2S14, 0 Log("RTPS Operation ACK_CACHE_CHANGE SN 15", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -992,22 +988,23 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed INSTANCE SAMPLE] Log("DDS Operation WRITE [TS 16s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I4S12, I2S16, I2S14, 0 Log("RTPS Operation ACK_CACHE_CHANGE SN 12", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh2; @@ -1019,52 +1016,53 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed SAMPLES, WITHOUT ACKed INSTANCE SAMPLES] Log("DDS Operation UNREGISTER_INSTANCE [TS 17s, Instance 2] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I4S12, I2S16, I2S17, 0 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 12)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(12); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(12); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 17)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(17); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(17); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 12", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 16", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 17", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh4; @@ -1073,15 +1071,16 @@ begin cc.src_timestamp := gen_duration(18,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 18s, Instance 4] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I4S12, I2S16, I2S17, I4S18 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh3; @@ -1092,31 +1091,32 @@ begin -- TEST: NORMAL NACK_CACHE_CHANGE Log("RTPS Operation NACK_CACHE_CHANGE SN 12", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := NACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := NACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 18", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLE] Log("DDS Operation UNREGISTER_INSTANCE [TS 19s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I4S12, I2S16, I2S17, I3S19 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -1128,15 +1128,16 @@ begin -- TEST: WRITE ON UNREGISTERED INSTANCE Log("DDS Operation WRITE [TS 20s, Instance 3, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I3S20, I2S16, I2S17, I3S19 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -1147,22 +1148,23 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITHOUT ACKed SAMPLES] Log("DDS Operation WRITE [TS 21s, Instance 3, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I3S20, I2S16, I2S17, I3S21 Log("RTPS Operation ACK_CACHE_CHANGE SN 16", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -1173,22 +1175,23 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITH ACKed SAMPLES, WITHOUT ACKed INSTANCE SAMPLES] Log("DDS Operation WRITE [TS 22s, Instance 3, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I3S22, I2S16, I2S17, I3S21 Log("RTPS Operation ACK_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -1199,53 +1202,54 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE,WITH ACKed INSTANCE SAMPLES] Log("DDS Operation WRITE [TS 23s, Instance 3, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I3S23, I2S16, I2S17, I3S21 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 16)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(16); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(16); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 23)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(23); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(23); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 21", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 22", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc.seq_nr := gen_sn(22); - reference.ret_code := INVALID; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc.seq_nr := gen_sn(22); + rtps.ret_code := INVALID; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 23", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh1; @@ -1256,14 +1260,15 @@ begin -- TEST: UNREGISTER UNKNOWN INSTANCE Log("DDS Operation UNREGISTER_INSTANCE [TS 24s, HANDLE_NIL, Instance 1] (IGNORED: Instance not Registered)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -1275,16 +1280,17 @@ begin -- TEST: REMOVE STALE INSTANCE WITH 0 SAMPLES Log("DDS Operation WRITE [TS 24s, Instance 1, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I3S23, I1S24, I2S17, I3S21 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -1295,62 +1301,63 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITHOUT STALE INSTANCES,WITHOUT ACKed SAMPLES] Log("DDS Operation WRITE [TS 25s, Instance 4, HANDLE_NIL Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 21", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITHOUT STALE INSTANCE, WITH ACKed SAMPLE] Log("DDS Operation WRITE [TS 25s, Instance 4, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 17", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE (>0 SAMPLES)] -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE, WITH ACKed SAMPLE] Log("DDS Operation WRITE [TS 25s, Instance 4, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I3S23, I1S24, I4S25, I3S21 -- TEST: ACK_CACHE_CHANGE [ALREADY ACKed SN] Log("RTPS Operation ACK_CACHE_CHANGE SN 21", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -1361,32 +1368,33 @@ begin -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCES] Log("DDS Operation WRITE [TS 26s, Instance 2, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 24", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH FULLY ACKed INSTANCE, WITHOUT STALE INSTANCE] Log("DDS Operation WRITE [TS 26s, Instance 2, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh1; @@ -1395,32 +1403,33 @@ begin cc.src_timestamp := gen_duration(26,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 26s, Instance 1] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I3S23, I1S24, I4S25, I1S26 Log("RTPS Operation ACK_CACHE_CHANGE SN 26", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; -- TEST: REGISTER ON UNREGISTERED INSTANCE Log("DDS Operation REGISTER_INSTANCE 1 (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := REGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := REGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -1429,14 +1438,15 @@ begin cc.src_timestamp := gen_duration(27,0); Log("DDS Operation WRITE [TS 27s, Instance 2, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh3; @@ -1445,15 +1455,16 @@ begin cc.src_timestamp := gen_duration(27,0); Log("DDS Operation UNREGISTER_INSTANCE [TS 27s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I3S23, I3S27, I4S25, I1S26 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh3; @@ -1464,29 +1475,30 @@ begin -- TEST: DISPOSE ON UNREGISTERED INSTANCE Log("DDS Operation DISPOSE [TS 28s, Instance 3] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I3S28, I3S27, I4S25, I1S26 Log("RTPS Operation ACK_CACHE_CHANGE SN 27", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 28", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -1495,53 +1507,54 @@ begin cc.src_timestamp := gen_duration(29,0); Log("DDS Operation WRITE [TS 29s, Instance 2, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I2S29, 0, I4S25, I1S26 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 25)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(25); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(25); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 28)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(29); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(29); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 25", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 26", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 29", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -1550,29 +1563,30 @@ begin cc.src_timestamp := gen_duration(30,0); Log("DDS Operation WRITE [TS 30s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I2S29, I2S30, I4S25, I1S26 Log("RTPS Operation ACK_CACHE_CHANGE SN 25", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 26", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh4; @@ -1583,37 +1597,38 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE,WITH ACKed SAMPLES (>1)] Log("DDS Operation WRITE [TS 31s, Instance 4, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I2S29, I2S30, I4S31, I1S26 Log("RTPS Operation REMOVE_CACHE_CHANGE SN 31", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := REMOVE_CACHE_CHANGE; - reference.cc := cc3; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := REMOVE_CACHE_CHANGE; + rtps.cc := cc3; + start_rtps; + wait_on_rtps; -- Stored CC: I2S29, I2S30, 0, I1S26 Log("RTPS Operation ACK_CACHE_CHANGE SN 29", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("RTPS Operation ACK_CACHE_CHANGE SN 30", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -1624,61 +1639,62 @@ begin -- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE [KNOWN INSTANCE, WITH ACKed INSTANCE SAMPLES(>1)] Log("DDS Operation WRITE [TS 32s, Instance 2, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I2S32, I2S30, 0, I1S26 -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 26)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(26); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(26); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 32)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(32); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(32); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 26", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc4; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc4; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 30", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_CACHE_CHANGE SN 32", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; -- TEST: INSTANCE LOOKUP [KNOWN INSTANCE] Log("DDS Operation LOOKUP_INSTANCE [Instance 2]", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := LOOKUP_INSTANCE; - stimulus.cc := cc; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := LOOKUP_INSTANCE; + dds.cc := cc; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -1687,12 +1703,12 @@ begin -- TEST: INSTANCE LOOKUP [UNKNOWN INSTANCE] Log("DDS Operation LOOKUP_INSTANCE [Unknown Instance]", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := LOOKUP_INSTANCE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := LOOKUP_INSTANCE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + start_dds; + wait_on_dds; wait_on_completion; TranscriptOpen(RESULTS_FILE, APPEND_MODE); @@ -1718,36 +1734,36 @@ begin end if; end process; - stim_prc : process(all) + dds_prc : process(all) begin if rising_edge(clk) then - stim_done <= '0'; - case (stim_stage) is + dds_done <= '0'; + case (dds_stage) is when IDLE => - if (stim_start = '1') then - stim_stage <= START; + if (dds_start = '1') then + dds_stage <= START; else - stim_done <= '1'; + dds_done <= '1'; end if; when START => if (ack_dds = '1') then - stim_stage <= PUSH; - stim_cnt <= 0; + dds_stage <= PUSH; + dds_cnt <= 0; end if; when PUSH => if (ready_in_dds = '1') then - stim_cnt <= stim_cnt + 1; - if (stim_cnt = stimulus.cc.payload.length-1) then + dds_cnt <= dds_cnt + 1; + if (dds_cnt = dds.cc.payload.length-1) then -- DEFAULT - stim_stage <= DONE; + dds_stage <= DONE; - case (stimulus.opcode) is + case (dds.opcode) is when REGISTER_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when LOOKUP_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when others => null; end case; @@ -1755,16 +1771,16 @@ begin end if; when DONE => if (done_dds = '1') then - AffirmIfEqual(ret_id, return_code_dds, stimulus.ret_code); - stim_stage <= IDLE; + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + dds_stage <= IDLE; end if; when CHECK => if (valid_out_dds = '1') then - AffirmIfEqual(data_id, data_out_dds, stimulus.cc.instance(stim_cnt)); - stim_cnt <= stim_cnt + 1; - if (stim_cnt = 3) then + AffirmIfEqual(data_id, data_out_dds, dds.cc.instance(dds_cnt)); + dds_cnt <= dds_cnt + 1; + if (dds_cnt = 3) then AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); - stim_stage <= IDLE; + dds_stage <= IDLE; end if; end if; end case; @@ -1772,6 +1788,7 @@ begin -- DEFAULT start_dds <= '0'; + opcode_dds <= NOP; valid_in_dds <= '0'; last_word_in_dds <= '0'; data_in_dds <= (others => '0'); @@ -1779,16 +1796,16 @@ begin source_ts_dds <= TIME_INVALID; ready_out_dds <= '0'; - case (stim_stage) is + case (dds_stage) is when START => start_dds <= '1'; - opcode_dds <= stimulus.opcode; - instance_handle_dds <= stimulus.cc.instance; - source_ts_dds <= stimulus.cc.src_timestamp; + opcode_dds <= dds.opcode; + instance_handle_dds <= dds.cc.instance; + source_ts_dds <= dds.cc.src_timestamp; when PUSH => valid_in_dds <= '1'; - data_in_dds <= stimulus.cc.payload.data(stim_cnt); - last_word_in_dds <= stimulus.cc.payload.last(stim_cnt); + data_in_dds <= dds.cc.payload.data(dds_cnt); + last_word_in_dds <= dds.cc.payload.last(dds_cnt); when CHECK => ready_out_dds <= '1'; when others => @@ -1796,54 +1813,51 @@ begin end case; end process; - ref_prc : process(all) + rtps_prc : process(all) begin if rising_edge(clk) then - ref_done <= '0'; - case (ref_stage) is + rtps_done <= '0'; + case (rtps_stage) is when IDLE => - if (ref_start = '1') then - ref_stage <= START; + if (rtps_start = '1') then + rtps_stage <= START; else - ref_done <= '1'; + rtps_done <= '1'; end if; when START => if (ack_rtps = '1') then - ref_stage <= DONE; + rtps_stage <= DONE; end if; when DONE => if (done_rtps = '1') then -- DEFAULT - ref_stage <= IDLE; + rtps_stage <= IDLE; - AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(reference.ret_code)); - case (reference.opcode) is + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + case (rtps.opcode) is when GET_CACHE_CHANGE => - if (reference.ret_code = OK) then - AffirmIfEqual(inst_id, cc_instance_handle(0), reference.cc.instance(0)); - AffirmIfEqual(inst_id, cc_instance_handle(1), reference.cc.instance(1)); - AffirmIfEqual(inst_id, cc_instance_handle(2), reference.cc.instance(2)); - AffirmIfEqual(inst_id, cc_instance_handle(3), reference.cc.instance(3)); - AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(reference.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(reference.cc.src_timestamp)); - ref_stage <= CHECK; - ref_cnt <= 0; + if (rtps.ret_code = OK) then + AffirmIfEqual(inst_id, to_unsigned(cc_instance_handle), to_unsigned(rtps.cc.instance)); + AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + rtps_stage <= CHECK; + rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when others => null; end case; end if; when CHECK => if (valid_out_rtps = '1') then - AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, reference.cc.payload.last(ref_cnt) & reference.cc.payload.data(ref_cnt)); - ref_cnt <= ref_cnt + 1; - if (ref_cnt = reference.cc.payload.length-1) then - ref_stage <= IDLE; + AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, rtps.cc.payload.last(rtps_cnt) & rtps.cc.payload.data(rtps_cnt)); + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = rtps.cc.payload.length-1) then + rtps_stage <= IDLE; end if; end if; end case; @@ -1851,17 +1865,19 @@ begin -- DEFAULT start_rtps <= '0'; + opcode_rtps <= NOP; + seq_nr_rtps <= SEQUENCENUMBER_UNKNOWN; get_data_rtps <= '0'; ready_out_rtps <= '0'; - case (ref_stage) is + case (rtps_stage) is when START => start_rtps <= '1'; - opcode_rtps <= reference.opcode; - seq_nr_rtps <= reference.cc.seq_nr; + opcode_rtps <= rtps.opcode; + seq_nr_rtps <= rtps.cc.seq_nr; when DONE => if (done_rtps = '1') then - case (reference.opcode) is + case (rtps.opcode) is when GET_CACHE_CHANGE => get_data_rtps <= '1'; when others => diff --git a/src/Tests/Level_0/L0_dds_writer_test2_aik.vhd b/src/Tests/Level_0/L0_dds_writer_test2_aik.vhd index 7e9b403..178a134 100644 --- a/src/Tests/Level_0/L0_dds_writer_test2_aik.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test2_aik.vhd @@ -19,29 +19,9 @@ architecture testbench of L0_dds_writer_test2_aik is constant MAX_REMOTE_ENDPOINTS : natural := 3; -- *TYPE DECLARATION* - type STIM_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK); - type REF_STAGE_TYPE is (IDLE, START, DONE, CHECK); + type DDS_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK); + type RTPS_STAGE_TYPE is (IDLE, START, DONE, CHECK); type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); - type RTPS_TEST_TYPE is record - opcode : HISTORY_CACHE_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : HISTORY_CACHE_RESPONSE_TYPE; - end record; - constant DEFAULT_RTPS_TEST : RTPS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => OK - ); - type DDS_TEST_TYPE is record - opcode : DDS_WRITER_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0); - end record; - constant DEFAULT_DDS_TEST : DDS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => RETCODE_OK - ); -- *SIGNAL DECLARATION* signal clk : std_logic := '0'; @@ -65,14 +45,14 @@ architecture testbench of L0_dds_writer_test2_aik is signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); - signal stim_start, stim_done, ref_start, ref_done : std_logic := '0'; - signal stim_cnt, ref_cnt, kh_cnt : natural := 0; - signal stim_stage : STIM_STAGE_TYPE := IDLE; - signal ref_stage : REF_STAGE_TYPE := IDLE; + signal dds_start, dds_done, rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; signal kh_stage : KH_STAGE_TYPE := IDLE; signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; - shared variable stimulus : DDS_TEST_TYPE := DEFAULT_DDS_TEST; - shared variable reference : RTPS_TEST_TYPE := DEFAULT_RTPS_TEST; + shared variable dds : DDS_WRITER_TEST_TYPE := DEFAULT_DDS_WRITER_TEST; + shared variable rtps : RTPS_WRITER_TEST_TYPE := DEFAULT_RTPS_WRITER_TEST; signal inst_id, kind_id, sn_id, ts_id, data_id, ret_id : AlertLogIDType; -- *FUNCTION DECLARATION* @@ -194,40 +174,40 @@ begin return ret; end function; - procedure start_stim is + procedure start_dds is begin - stim_start <= '1'; + dds_start <= '1'; wait until rising_edge(clk); - stim_start <= '0'; + dds_start <= '0'; wait until rising_edge(clk); end procedure; - procedure start_ref is + procedure start_rtps is begin - ref_start <= '1'; + rtps_start <= '1'; wait until rising_edge(clk); - ref_start <= '0'; + rtps_start <= '0'; wait until rising_edge(clk); end procedure; - procedure wait_on_stim is + procedure wait_on_dds is begin - if (stim_done /= '1') then - wait until stim_done = '1'; + if (dds_done /= '1') then + wait until dds_done = '1'; end if; end procedure; - procedure wait_on_ref is + procedure wait_on_rtps is begin - if (ref_done /= '1') then - wait until ref_done = '1'; + if (rtps_done /= '1') then + wait until rtps_done = '1'; end if; end procedure; procedure wait_on_completion is begin - if (ref_done /= '1' or stim_done /= '1') then - wait until ref_done = '1' and stim_done = '1'; + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; end if; end procedure; @@ -266,13 +246,14 @@ begin -- Stored CC: 0, 0, 0, 0 Log("DDS Operation WAIT_FOR_ACKNOWLEDGEMENTS [max_wait 0s] (OK)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WAIT_FOR_ACKNOWLEDGEMENTS; - stimulus.ret_code := RETCODE_OK; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WAIT_FOR_ACKNOWLEDGEMENTS; + dds.ret_code := RETCODE_OK; max_wait_dds <= gen_duration(0,0); - start_stim; - wait_on_stim; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -281,16 +262,17 @@ begin cc.src_timestamp := gen_duration(1,0); Log("DDS Operation WRITE [TS 1s, Instance 1, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I1S1, 0, 0, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -299,59 +281,59 @@ begin cc.src_timestamp := gen_duration(2,0); Log("DDS Operation WRITE [TS 2s, Instance 2, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I1S1, I2S2, 0, 0 Log("DDS Operation WAIT_FOR_ACKNOWLEDGEMENTS [max_wait 0s] (TIMEOUT)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WAIT_FOR_ACKNOWLEDGEMENTS; - stimulus.ret_code := RETCODE_TIMEOUT; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WAIT_FOR_ACKNOWLEDGEMENTS; + dds.ret_code := RETCODE_TIMEOUT; max_wait_dds <= gen_duration(0,0); - start_stim; - wait_on_stim; + start_dds; + wait_on_dds; Log("DDS Operation WAIT_FOR_ACKNOWLEDGEMENTS [max_wait 1s]", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WAIT_FOR_ACKNOWLEDGEMENTS; - stimulus.ret_code := RETCODE_TIMEOUT; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WAIT_FOR_ACKNOWLEDGEMENTS; + dds.ret_code := RETCODE_TIMEOUT; max_wait_dds <= gen_duration(1,0); - start_stim; + start_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 1", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc1; - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc1; + start_rtps; + wait_on_rtps; Log("Current Time: 1s", INFO); Log("WAIT_FOR_ACKNOWLEDGEMENTS Return (TIMEOUT)", INFO); check_time <= gen_duration(1,0); wait until rising_edge(clk); - wait_on_stim; + wait_on_dds; Log("DDS Operation WAIT_FOR_ACKNOWLEDGEMENTS [max_wait 1s]", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WAIT_FOR_ACKNOWLEDGEMENTS; - stimulus.ret_code := RETCODE_OK; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WAIT_FOR_ACKNOWLEDGEMENTS; + dds.ret_code := RETCODE_OK; max_wait_dds <= gen_duration(1,0); - start_stim; + start_dds; Log("RTPS Operation ACK_CACHE_CHANGE SN 2", INFO); Log("WAIT_FOR_ACKNOWLEDGEMENTS Return (OK)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := ACK_CACHE_CHANGE; - reference.cc := cc2; - start_ref; - wait_on_ref; - wait_on_stim; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := ACK_CACHE_CHANGE; + rtps.cc := cc2; + start_rtps; + wait_on_rtps; + wait_on_dds; wait_on_completion; TranscriptOpen(RESULTS_FILE, APPEND_MODE); @@ -377,42 +359,42 @@ begin end if; end process; - stim_prc : process(all) + dds_prc : process(all) begin if rising_edge(clk) then - stim_done <= '0'; - case (stim_stage) is + dds_done <= '0'; + case (dds_stage) is when IDLE => - if (stim_start = '1') then - stim_stage <= START; + if (dds_start = '1') then + dds_stage <= START; else - stim_done <= '1'; + dds_done <= '1'; end if; when START => if (ack_dds = '1') then - case (stimulus.opcode) is + case (dds.opcode) is when WAIT_FOR_ACKNOWLEDGEMENTS => - stim_stage <= DONE; - stim_cnt <= 0; + dds_stage <= DONE; + dds_cnt <= 0; when others => - stim_stage <= PUSH; - stim_cnt <= 0; + dds_stage <= PUSH; + dds_cnt <= 0; end case; end if; when PUSH => if (ready_in_dds = '1') then - stim_cnt <= stim_cnt + 1; - if (stim_cnt = stimulus.cc.payload.length-1) then + dds_cnt <= dds_cnt + 1; + if (dds_cnt = dds.cc.payload.length-1) then -- DEFAULT - stim_stage <= DONE; + dds_stage <= DONE; - case (stimulus.opcode) is + case (dds.opcode) is when REGISTER_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when LOOKUP_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when others => null; end case; @@ -420,16 +402,16 @@ begin end if; when DONE => if (done_dds = '1') then - AffirmIfEqual(ret_id, return_code_dds, stimulus.ret_code); - stim_stage <= IDLE; + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + dds_stage <= IDLE; end if; when CHECK => if (valid_out_dds = '1') then - AffirmIfEqual(data_id, data_out_dds, stimulus.cc.instance(stim_cnt)); - stim_cnt <= stim_cnt + 1; - if (stim_cnt = 3) then + AffirmIfEqual(data_id, data_out_dds, dds.cc.instance(dds_cnt)); + dds_cnt <= dds_cnt + 1; + if (dds_cnt = 3) then AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); - stim_stage <= IDLE; + dds_stage <= IDLE; end if; end if; end case; @@ -437,6 +419,7 @@ begin -- DEFAULT start_dds <= '0'; + opcode_dds <= NOP; valid_in_dds <= '0'; last_word_in_dds <= '0'; data_in_dds <= (others => '0'); @@ -444,16 +427,16 @@ begin source_ts_dds <= TIME_INVALID; ready_out_dds <= '0'; - case (stim_stage) is + case (dds_stage) is when START => start_dds <= '1'; - opcode_dds <= stimulus.opcode; - instance_handle_dds <= stimulus.cc.instance; - source_ts_dds <= stimulus.cc.src_timestamp; + opcode_dds <= dds.opcode; + instance_handle_dds <= dds.cc.instance; + source_ts_dds <= dds.cc.src_timestamp; when PUSH => valid_in_dds <= '1'; - data_in_dds <= stimulus.cc.payload.data(stim_cnt); - last_word_in_dds <= stimulus.cc.payload.last(stim_cnt); + data_in_dds <= dds.cc.payload.data(dds_cnt); + last_word_in_dds <= dds.cc.payload.last(dds_cnt); when CHECK => ready_out_dds <= '1'; when others => @@ -461,54 +444,51 @@ begin end case; end process; - ref_prc : process(all) + rtps_prc : process(all) begin if rising_edge(clk) then - ref_done <= '0'; - case (ref_stage) is + rtps_done <= '0'; + case (rtps_stage) is when IDLE => - if (ref_start = '1') then - ref_stage <= START; + if (rtps_start = '1') then + rtps_stage <= START; else - ref_done <= '1'; + rtps_done <= '1'; end if; when START => if (ack_rtps = '1') then - ref_stage <= DONE; + rtps_stage <= DONE; end if; when DONE => if (done_rtps = '1') then -- DEFAULT - ref_stage <= IDLE; + rtps_stage <= IDLE; - AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(reference.ret_code)); - case (reference.opcode) is + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + case (rtps.opcode) is when GET_CACHE_CHANGE => - if (reference.ret_code = OK) then - AffirmIfEqual(inst_id, cc_instance_handle(0), reference.cc.instance(0)); - AffirmIfEqual(inst_id, cc_instance_handle(1), reference.cc.instance(1)); - AffirmIfEqual(inst_id, cc_instance_handle(2), reference.cc.instance(2)); - AffirmIfEqual(inst_id, cc_instance_handle(3), reference.cc.instance(3)); - AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(reference.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(reference.cc.src_timestamp)); - ref_stage <= CHECK; - ref_cnt <= 0; + if (rtps.ret_code = OK) then + AffirmIfEqual(inst_id, to_unsigned(cc_instance_handle), to_unsigned(rtps.cc.instance)); + AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + rtps_stage <= CHECK; + rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when others => null; end case; end if; when CHECK => if (valid_out_rtps = '1') then - AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, reference.cc.payload.last(ref_cnt) & reference.cc.payload.data(ref_cnt)); - ref_cnt <= ref_cnt + 1; - if (ref_cnt = reference.cc.payload.length-1) then - ref_stage <= IDLE; + AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, rtps.cc.payload.last(rtps_cnt) & rtps.cc.payload.data(rtps_cnt)); + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = rtps.cc.payload.length-1) then + rtps_stage <= IDLE; end if; end if; end case; @@ -516,17 +496,19 @@ begin -- DEFAULT start_rtps <= '0'; + opcode_rtps <= NOP; + seq_nr_rtps <= SEQUENCENUMBER_UNKNOWN; get_data_rtps <= '0'; ready_out_rtps <= '0'; - case (ref_stage) is + case (rtps_stage) is when START => start_rtps <= '1'; - opcode_rtps <= reference.opcode; - seq_nr_rtps <= reference.cc.seq_nr; + opcode_rtps <= rtps.opcode; + seq_nr_rtps <= rtps.cc.seq_nr; when DONE => if (done_rtps = '1') then - case (reference.opcode) is + case (rtps.opcode) is when GET_CACHE_CHANGE => get_data_rtps <= '1'; when others => diff --git a/src/Tests/Level_0/L0_dds_writer_test3_aik.vhd b/src/Tests/Level_0/L0_dds_writer_test3_aik.vhd index 38d4a50..0518310 100644 --- a/src/Tests/Level_0/L0_dds_writer_test3_aik.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test3_aik.vhd @@ -19,35 +19,9 @@ architecture testbench of L0_dds_writer_test3_aik is constant MAX_REMOTE_ENDPOINTS : natural := 3; -- *TYPE DECLARATION* - type STIM_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK, CHECK_DEADLINE); - type REF_STAGE_TYPE is (IDLE, START, DONE, CHECK); + type DDS_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK, CHECK_DEADLINE); + type RTPS_STAGE_TYPE is (IDLE, START, DONE, CHECK); type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); - type RTPS_TEST_TYPE is record - opcode : HISTORY_CACHE_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : HISTORY_CACHE_RESPONSE_TYPE; - end record; - constant DEFAULT_RTPS_TEST : RTPS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => OK - ); - type DDS_TEST_TYPE is record - opcode : DDS_WRITER_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0); - count : natural; - change : natural; - instance : INSTANCE_HANDLE_TYPE; - end record; - constant DEFAULT_DDS_TEST : DDS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => RETCODE_OK, - count => 0, - change => 0, - instance => HANDLE_NIL - ); -- *SIGNAL DECLARATION* signal clk : std_logic := '0'; @@ -71,14 +45,14 @@ architecture testbench of L0_dds_writer_test3_aik is signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); - signal stim_start, stim_done, ref_start, ref_done : std_logic := '0'; - signal stim_cnt, ref_cnt, kh_cnt : natural := 0; - signal stim_stage : STIM_STAGE_TYPE := IDLE; - signal ref_stage : REF_STAGE_TYPE := IDLE; + signal dds_start, dds_done, rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; signal kh_stage : KH_STAGE_TYPE := IDLE; signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; - shared variable stimulus : DDS_TEST_TYPE := DEFAULT_DDS_TEST; - shared variable reference : RTPS_TEST_TYPE := DEFAULT_RTPS_TEST; + shared variable dds : DDS_WRITER_TEST_TYPE := DEFAULT_DDS_WRITER_TEST; + shared variable rtps : RTPS_WRITER_TEST_TYPE := DEFAULT_RTPS_WRITER_TEST; signal inst_id, kind_id, sn_id, ts_id, data_id, ret_id, status_id : AlertLogIDType; -- *FUNCTION DECLARATION* @@ -202,40 +176,40 @@ begin return ret; end function; - procedure start_stim is + procedure start_dds is begin - stim_start <= '1'; + dds_start <= '1'; wait until rising_edge(clk); - stim_start <= '0'; + dds_start <= '0'; wait until rising_edge(clk); end procedure; - procedure start_ref is + procedure start_rtps is begin - ref_start <= '1'; + rtps_start <= '1'; wait until rising_edge(clk); - ref_start <= '0'; + rtps_start <= '0'; wait until rising_edge(clk); end procedure; - procedure wait_on_stim is + procedure wait_on_dds is begin - if (stim_done /= '1') then - wait until stim_done = '1'; + if (dds_done /= '1') then + wait until dds_done = '1'; end if; end procedure; - procedure wait_on_ref is + procedure wait_on_rtps is begin - if (ref_done /= '1') then - wait until ref_done = '1'; + if (rtps_done /= '1') then + wait until rtps_done = '1'; end if; end procedure; procedure wait_on_completion is begin - if (ref_done /= '1' or stim_done /= '1') then - wait until ref_done = '1' and stim_done = '1'; + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; end if; end procedure; @@ -300,6 +274,7 @@ begin AffirmIf(status_id,(status and OFFERED_DEADLINE_MISSED_STATUS) /= OFFERED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received 1"); + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -307,16 +282,17 @@ begin cc.seq_nr := gen_sn(1); Log("DDS Operation WRITE [Instance 1, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I1S1, 0, 0, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -324,13 +300,13 @@ begin cc.seq_nr := gen_sn(2); Log("DDS Operation WRITE [Instance 2, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I1S1, I2S2, 0, 0 @@ -342,6 +318,7 @@ begin AffirmIf(status_id,(status and OFFERED_DEADLINE_MISSED_STATUS) /= OFFERED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received 1"); + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -349,13 +326,13 @@ begin cc.seq_nr := gen_sn(3); Log("DDS Operation WRITE [Instance 1, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I1S1, I2S2, I1S3, 0 @@ -368,18 +345,19 @@ begin AffirmIf(status_id,(status and OFFERED_DEADLINE_MISSED_STATUS) = OFFERED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received 0"); Log("DDS Operation GET_OFFERED_DEADLINE_MISSED_STATUS (Expected: count 1, change 1, Instance 2)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := GET_OFFERED_DEADLINE_MISSED_STATUS; - stimulus.ret_code := RETCODE_OK; - stimulus.count := 1; - stimulus.change := 1; - stimulus.instance := kh2; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := GET_OFFERED_DEADLINE_MISSED_STATUS; + dds.ret_code := RETCODE_OK; + dds.count := 1; + dds.change := 1; + dds.inst := kh2; + start_dds; + wait_on_dds; wait_on_idle; AffirmIf(status_id,(status and OFFERED_DEADLINE_MISSED_STATUS) /= OFFERED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received 1"); + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -387,13 +365,13 @@ begin cc.seq_nr := gen_sn(4); Log("DDS Operation WRITE [Instance 3, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I1S1, I2S2, I1S3, I3S4 @@ -406,14 +384,14 @@ begin AffirmIf(status_id,(status and OFFERED_DEADLINE_MISSED_STATUS) = OFFERED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received 0"); Log("DDS Operation GET_OFFERED_DEADLINE_MISSED_STATUS (Expected: count 3, change 2, Instance 2)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := GET_OFFERED_DEADLINE_MISSED_STATUS; - stimulus.ret_code := RETCODE_OK; - stimulus.count := 3; - stimulus.change := 2; - stimulus.instance := kh1; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := GET_OFFERED_DEADLINE_MISSED_STATUS; + dds.ret_code := RETCODE_OK; + dds.count := 3; + dds.change := 2; + dds.inst := kh1; + start_dds; + wait_on_dds; wait_on_idle; AffirmIf(status_id,(status and OFFERED_DEADLINE_MISSED_STATUS) /= OFFERED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received 1"); @@ -435,14 +413,14 @@ begin AffirmIf(status_id,(status and OFFERED_DEADLINE_MISSED_STATUS) = OFFERED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received 0"); Log("DDS Operation GET_OFFERED_DEADLINE_MISSED_STATUS (Expected: count 3, change 2, Instance 2)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := GET_OFFERED_DEADLINE_MISSED_STATUS; - stimulus.ret_code := RETCODE_OK; - stimulus.count := 9; - stimulus.change := 6; - stimulus.instance := kh1; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := GET_OFFERED_DEADLINE_MISSED_STATUS; + dds.ret_code := RETCODE_OK; + dds.count := 9; + dds.change := 6; + dds.inst := kh1; + start_dds; + wait_on_dds; wait_on_idle; AffirmIf(status_id,(status and OFFERED_DEADLINE_MISSED_STATUS) /= OFFERED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received 1"); @@ -471,42 +449,42 @@ begin end if; end process; - stim_prc : process(all) + dds_prc : process(all) begin if rising_edge(clk) then - stim_done <= '0'; - case (stim_stage) is + dds_done <= '0'; + case (dds_stage) is when IDLE => - if (stim_start = '1') then - stim_stage <= START; + if (dds_start = '1') then + dds_stage <= START; else - stim_done <= '1'; + dds_done <= '1'; end if; when START => if (ack_dds = '1') then - case (stimulus.opcode) is + case (dds.opcode) is when GET_OFFERED_DEADLINE_MISSED_STATUS => - stim_stage <= DONE; - stim_cnt <= 0; + dds_stage <= DONE; + dds_cnt <= 0; when others => - stim_stage <= PUSH; - stim_cnt <= 0; + dds_stage <= PUSH; + dds_cnt <= 0; end case; end if; when PUSH => if (ready_in_dds = '1') then - stim_cnt <= stim_cnt + 1; - if (stim_cnt = stimulus.cc.payload.length-1) then + dds_cnt <= dds_cnt + 1; + if (dds_cnt = dds.cc.payload.length-1) then -- DEFAULT - stim_stage <= DONE; + dds_stage <= DONE; - case (stimulus.opcode) is + case (dds.opcode) is when REGISTER_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when LOOKUP_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when others => null; end case; @@ -514,46 +492,46 @@ begin end if; when DONE => if (done_dds = '1') then - AffirmIfEqual(ret_id, return_code_dds, stimulus.ret_code); - case (stimulus.opcode) is + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + case (dds.opcode) is when GET_OFFERED_DEADLINE_MISSED_STATUS => - if (stimulus.ret_code = RETCODE_OK) then - stim_stage <= CHECK_DEADLINE; - stim_cnt <= 0; + if (dds.ret_code = RETCODE_OK) then + dds_stage <= CHECK_DEADLINE; + dds_cnt <= 0; else - stim_stage <= IDLE; + dds_stage <= IDLE; end if; when others => - stim_stage <= IDLE; + dds_stage <= IDLE; end case; end if; when CHECK => if (valid_out_dds = '1') then - AffirmIfEqual(data_id, data_out_dds, stimulus.cc.instance(stim_cnt)); - stim_cnt <= stim_cnt + 1; - if (stim_cnt = 3) then + AffirmIfEqual(data_id, data_out_dds, dds.cc.instance(dds_cnt)); + dds_cnt <= dds_cnt + 1; + if (dds_cnt = 3) then AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); - stim_stage <= IDLE; + dds_stage <= IDLE; end if; end if; when CHECK_DEADLINE => if (valid_out_dds = '1') then - stim_cnt <= stim_cnt + 1; - case (stim_cnt) is + dds_cnt <= dds_cnt + 1; + case (dds_cnt) is when 0 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(stimulus.count,CDR_LONG_WIDTH))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(dds.count,CDR_LONG_WIDTH))); when 1 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(stimulus.change,CDR_LONG_WIDTH))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(dds.change,CDR_LONG_WIDTH))); when 2 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(stimulus.instance(0))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst (0))); when 3 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(stimulus.instance(1))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst (1))); when 4 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(stimulus.instance(2))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst (2))); when 5 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(stimulus.instance(3))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst (3))); AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); - stim_stage <= IDLE; + dds_stage <= IDLE; when others => null; end case; @@ -563,6 +541,7 @@ begin -- DEFAULT start_dds <= '0'; + opcode_dds <= NOP; valid_in_dds <= '0'; last_word_in_dds <= '0'; data_in_dds <= (others => '0'); @@ -570,16 +549,16 @@ begin source_ts_dds <= TIME_INVALID; ready_out_dds <= '0'; - case (stim_stage) is + case (dds_stage) is when START => start_dds <= '1'; - opcode_dds <= stimulus.opcode; - instance_handle_dds <= stimulus.cc.instance; - source_ts_dds <= stimulus.cc.src_timestamp; + opcode_dds <= dds.opcode; + instance_handle_dds <= dds.cc.instance; + source_ts_dds <= dds.cc.src_timestamp; when PUSH => valid_in_dds <= '1'; - data_in_dds <= stimulus.cc.payload.data(stim_cnt); - last_word_in_dds <= stimulus.cc.payload.last(stim_cnt); + data_in_dds <= dds.cc.payload.data(dds_cnt); + last_word_in_dds <= dds.cc.payload.last(dds_cnt); when CHECK => ready_out_dds <= '1'; when CHECK_DEADLINE => @@ -589,54 +568,54 @@ begin end case; end process; - ref_prc : process(all) + rtps_prc : process(all) begin if rising_edge(clk) then - ref_done <= '0'; - case (ref_stage) is + rtps_done <= '0'; + case (rtps_stage) is when IDLE => - if (ref_start = '1') then - ref_stage <= START; + if (rtps_start = '1') then + rtps_stage <= START; else - ref_done <= '1'; + rtps_done <= '1'; end if; when START => if (ack_rtps = '1') then - ref_stage <= DONE; + rtps_stage <= DONE; end if; when DONE => if (done_rtps = '1') then -- DEFAULT - ref_stage <= IDLE; + rtps_stage <= IDLE; - AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(reference.ret_code)); - case (reference.opcode) is + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + case (rtps.opcode) is when GET_CACHE_CHANGE => - if (reference.ret_code = OK) then - AffirmIfEqual(inst_id, cc_instance_handle(0), reference.cc.instance(0)); - AffirmIfEqual(inst_id, cc_instance_handle(1), reference.cc.instance(1)); - AffirmIfEqual(inst_id, cc_instance_handle(2), reference.cc.instance(2)); - AffirmIfEqual(inst_id, cc_instance_handle(3), reference.cc.instance(3)); - AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(reference.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(reference.cc.src_timestamp)); - ref_stage <= CHECK; - ref_cnt <= 0; + if (rtps.ret_code = OK) then + AffirmIfEqual(inst_id, cc_instance_handle(0), rtps.cc.instance(0)); + AffirmIfEqual(inst_id, cc_instance_handle(1), rtps.cc.instance(1)); + AffirmIfEqual(inst_id, cc_instance_handle(2), rtps.cc.instance(2)); + AffirmIfEqual(inst_id, cc_instance_handle(3), rtps.cc.instance(3)); + AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + rtps_stage <= CHECK; + rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when others => null; end case; end if; when CHECK => if (valid_out_rtps = '1') then - AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, reference.cc.payload.last(ref_cnt) & reference.cc.payload.data(ref_cnt)); - ref_cnt <= ref_cnt + 1; - if (ref_cnt = reference.cc.payload.length-1) then - ref_stage <= IDLE; + AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, rtps.cc.payload.last(rtps_cnt) & rtps.cc.payload.data(rtps_cnt)); + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = rtps.cc.payload.length-1) then + rtps_stage <= IDLE; end if; end if; end case; @@ -644,17 +623,19 @@ begin -- DEFAULT start_rtps <= '0'; + opcode_rtps <= NOP; + seq_nr_rtps <= SEQUENCENUMBER_UNKNOWN; get_data_rtps <= '0'; ready_out_rtps <= '0'; - case (ref_stage) is + case (rtps_stage) is when START => start_rtps <= '1'; - opcode_rtps <= reference.opcode; - seq_nr_rtps <= reference.cc.seq_nr; + opcode_rtps <= rtps.opcode; + seq_nr_rtps <= rtps.cc.seq_nr; when DONE => if (done_rtps = '1') then - case (reference.opcode) is + case (rtps.opcode) is when GET_CACHE_CHANGE => get_data_rtps <= '1'; when others => diff --git a/src/Tests/Level_0/L0_dds_writer_test3_ain.vhd b/src/Tests/Level_0/L0_dds_writer_test3_ain.vhd index b5de08e..b62c13b 100644 --- a/src/Tests/Level_0/L0_dds_writer_test3_ain.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test3_ain.vhd @@ -19,35 +19,9 @@ architecture testbench of L0_dds_writer_test3_ain is constant MAX_REMOTE_ENDPOINTS : natural := 3; -- *TYPE DECLARATION* - type STIM_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK, CHECK_DEADLINE); - type REF_STAGE_TYPE is (IDLE, START, DONE, CHECK); + type DDS_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK, CHECK_DEADLINE); + type RTPS_STAGE_TYPE is (IDLE, START, DONE, CHECK); type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); - type RTPS_TEST_TYPE is record - opcode : HISTORY_CACHE_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : HISTORY_CACHE_RESPONSE_TYPE; - end record; - constant DEFAULT_RTPS_TEST : RTPS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => OK - ); - type DDS_TEST_TYPE is record - opcode : DDS_WRITER_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0); - count : natural; - change : natural; - instance : INSTANCE_HANDLE_TYPE; - end record; - constant DEFAULT_DDS_TEST : DDS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => RETCODE_OK, - count => 0, - change => 0, - instance => HANDLE_NIL - ); -- *SIGNAL DECLARATION* signal clk : std_logic := '0'; @@ -71,14 +45,14 @@ architecture testbench of L0_dds_writer_test3_ain is signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); - signal stim_start, stim_done, ref_start, ref_done : std_logic := '0'; - signal stim_cnt, ref_cnt, kh_cnt : natural := 0; - signal stim_stage : STIM_STAGE_TYPE := IDLE; - signal ref_stage : REF_STAGE_TYPE := IDLE; + signal dds_start, dds_done, rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; signal kh_stage : KH_STAGE_TYPE := IDLE; signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; - shared variable stimulus : DDS_TEST_TYPE := DEFAULT_DDS_TEST; - shared variable reference : RTPS_TEST_TYPE := DEFAULT_RTPS_TEST; + shared variable dds : DDS_WRITER_TEST_TYPE := DEFAULT_DDS_WRITER_TEST; + shared variable rtps : RTPS_WRITER_TEST_TYPE := DEFAULT_RTPS_WRITER_TEST; signal inst_id, kind_id, sn_id, ts_id, data_id, ret_id, status_id : AlertLogIDType; -- *FUNCTION DECLARATION* @@ -202,40 +176,40 @@ begin return ret; end function; - procedure start_stim is + procedure start_dds is begin - stim_start <= '1'; + dds_start <= '1'; wait until rising_edge(clk); - stim_start <= '0'; + dds_start <= '0'; wait until rising_edge(clk); end procedure; - procedure start_ref is + procedure start_rtps is begin - ref_start <= '1'; + rtps_start <= '1'; wait until rising_edge(clk); - ref_start <= '0'; + rtps_start <= '0'; wait until rising_edge(clk); end procedure; - procedure wait_on_stim is + procedure wait_on_dds is begin - if (stim_done /= '1') then - wait until stim_done = '1'; + if (dds_done /= '1') then + wait until dds_done = '1'; end if; end procedure; - procedure wait_on_ref is + procedure wait_on_rtps is begin - if (ref_done /= '1') then - wait until ref_done = '1'; + if (rtps_done /= '1') then + wait until rtps_done = '1'; end if; end procedure; procedure wait_on_completion is begin - if (ref_done /= '1' or stim_done /= '1') then - wait until ref_done = '1' and stim_done = '1'; + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; end if; end procedure; @@ -301,17 +275,18 @@ begin AffirmIf(status_id,(status and OFFERED_DEADLINE_MISSED_STATUS) = OFFERED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received 0"); Log("DDS Operation GET_OFFERED_DEADLINE_MISSED_STATUS (Expected: count 3, change 2, Instance 2)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := GET_OFFERED_DEADLINE_MISSED_STATUS; - stimulus.ret_code := RETCODE_OK; - stimulus.count := 1; - stimulus.change := 1; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := GET_OFFERED_DEADLINE_MISSED_STATUS; + dds.ret_code := RETCODE_OK; + dds.count := 1; + dds.change := 1; + start_dds; + wait_on_dds; wait_on_idle; AffirmIf(status_id,(status and OFFERED_DEADLINE_MISSED_STATUS) /= OFFERED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received 1"); + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -319,13 +294,13 @@ begin cc.seq_nr := gen_sn(1); Log("DDS Operation WRITE [Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I1S1, 0, 0, 0 @@ -354,13 +329,13 @@ begin AffirmIf(status_id,(status and OFFERED_DEADLINE_MISSED_STATUS) = OFFERED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received 0"); Log("DDS Operation GET_OFFERED_DEADLINE_MISSED_STATUS (Expected: count 3, change 2, Instance 2)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := GET_OFFERED_DEADLINE_MISSED_STATUS; - stimulus.ret_code := RETCODE_OK; - stimulus.count := 3; - stimulus.change := 2; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := GET_OFFERED_DEADLINE_MISSED_STATUS; + dds.ret_code := RETCODE_OK; + dds.count := 3; + dds.change := 2; + start_dds; + wait_on_dds; wait_on_idle; AffirmIf(status_id,(status and OFFERED_DEADLINE_MISSED_STATUS) /= OFFERED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received 1"); @@ -389,42 +364,42 @@ begin end if; end process; - stim_prc : process(all) + dds_prc : process(all) begin if rising_edge(clk) then - stim_done <= '0'; - case (stim_stage) is + dds_done <= '0'; + case (dds_stage) is when IDLE => - if (stim_start = '1') then - stim_stage <= START; + if (dds_start = '1') then + dds_stage <= START; else - stim_done <= '1'; + dds_done <= '1'; end if; when START => if (ack_dds = '1') then - case (stimulus.opcode) is + case (dds.opcode) is when GET_OFFERED_DEADLINE_MISSED_STATUS => - stim_stage <= DONE; - stim_cnt <= 0; + dds_stage <= DONE; + dds_cnt <= 0; when others => - stim_stage <= PUSH; - stim_cnt <= 0; + dds_stage <= PUSH; + dds_cnt <= 0; end case; end if; when PUSH => if (ready_in_dds = '1') then - stim_cnt <= stim_cnt + 1; - if (stim_cnt = stimulus.cc.payload.length-1) then + dds_cnt <= dds_cnt + 1; + if (dds_cnt = dds.cc.payload.length-1) then -- DEFAULT - stim_stage <= DONE; + dds_stage <= DONE; - case (stimulus.opcode) is + case (dds.opcode) is when REGISTER_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when LOOKUP_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when others => null; end case; @@ -432,46 +407,46 @@ begin end if; when DONE => if (done_dds = '1') then - AffirmIfEqual(ret_id, return_code_dds, stimulus.ret_code); - case (stimulus.opcode) is + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + case (dds.opcode) is when GET_OFFERED_DEADLINE_MISSED_STATUS => - if (stimulus.ret_code = RETCODE_OK) then - stim_stage <= CHECK_DEADLINE; - stim_cnt <= 0; + if (dds.ret_code = RETCODE_OK) then + dds_stage <= CHECK_DEADLINE; + dds_cnt <= 0; else - stim_stage <= IDLE; + dds_stage <= IDLE; end if; when others => - stim_stage <= IDLE; + dds_stage <= IDLE; end case; end if; when CHECK => if (valid_out_dds = '1') then - AffirmIfEqual(data_id, data_out_dds, stimulus.cc.instance(stim_cnt)); - stim_cnt <= stim_cnt + 1; - if (stim_cnt = 3) then + AffirmIfEqual(data_id, data_out_dds, dds.cc.instance(dds_cnt)); + dds_cnt <= dds_cnt + 1; + if (dds_cnt = 3) then AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); - stim_stage <= IDLE; + dds_stage <= IDLE; end if; end if; when CHECK_DEADLINE => if (valid_out_dds = '1') then - stim_cnt <= stim_cnt + 1; - case (stim_cnt) is + dds_cnt <= dds_cnt + 1; + case (dds_cnt) is when 0 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(stimulus.count,CDR_LONG_WIDTH))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(dds.count,CDR_LONG_WIDTH))); when 1 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(stimulus.change,CDR_LONG_WIDTH))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(dds.change,CDR_LONG_WIDTH))); when 2 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(stimulus.instance(0))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst (0))); when 3 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(stimulus.instance(1))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst (1))); when 4 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(stimulus.instance(2))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst (2))); when 5 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(stimulus.instance(3))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst (3))); AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); - stim_stage <= IDLE; + dds_stage <= IDLE; when others => null; end case; @@ -481,6 +456,7 @@ begin -- DEFAULT start_dds <= '0'; + opcode_dds <= NOP; valid_in_dds <= '0'; last_word_in_dds <= '0'; data_in_dds <= (others => '0'); @@ -488,16 +464,16 @@ begin source_ts_dds <= TIME_INVALID; ready_out_dds <= '0'; - case (stim_stage) is + case (dds_stage) is when START => start_dds <= '1'; - opcode_dds <= stimulus.opcode; - instance_handle_dds <= stimulus.cc.instance; - source_ts_dds <= stimulus.cc.src_timestamp; + opcode_dds <= dds.opcode; + instance_handle_dds <= dds.cc.instance; + source_ts_dds <= dds.cc.src_timestamp; when PUSH => valid_in_dds <= '1'; - data_in_dds <= stimulus.cc.payload.data(stim_cnt); - last_word_in_dds <= stimulus.cc.payload.last(stim_cnt); + data_in_dds <= dds.cc.payload.data(dds_cnt); + last_word_in_dds <= dds.cc.payload.last(dds_cnt); when CHECK => ready_out_dds <= '1'; when CHECK_DEADLINE => @@ -507,54 +483,54 @@ begin end case; end process; - ref_prc : process(all) + rtps_prc : process(all) begin if rising_edge(clk) then - ref_done <= '0'; - case (ref_stage) is + rtps_done <= '0'; + case (rtps_stage) is when IDLE => - if (ref_start = '1') then - ref_stage <= START; + if (rtps_start = '1') then + rtps_stage <= START; else - ref_done <= '1'; + rtps_done <= '1'; end if; when START => if (ack_rtps = '1') then - ref_stage <= DONE; + rtps_stage <= DONE; end if; when DONE => if (done_rtps = '1') then -- DEFAULT - ref_stage <= IDLE; + rtps_stage <= IDLE; - AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(reference.ret_code)); - case (reference.opcode) is + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + case (rtps.opcode) is when GET_CACHE_CHANGE => - if (reference.ret_code = OK) then - AffirmIfEqual(inst_id, cc_instance_handle(0), reference.cc.instance(0)); - AffirmIfEqual(inst_id, cc_instance_handle(1), reference.cc.instance(1)); - AffirmIfEqual(inst_id, cc_instance_handle(2), reference.cc.instance(2)); - AffirmIfEqual(inst_id, cc_instance_handle(3), reference.cc.instance(3)); - AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(reference.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(reference.cc.src_timestamp)); - ref_stage <= CHECK; - ref_cnt <= 0; + if (rtps.ret_code = OK) then + AffirmIfEqual(inst_id, cc_instance_handle(0), rtps.cc.instance(0)); + AffirmIfEqual(inst_id, cc_instance_handle(1), rtps.cc.instance(1)); + AffirmIfEqual(inst_id, cc_instance_handle(2), rtps.cc.instance(2)); + AffirmIfEqual(inst_id, cc_instance_handle(3), rtps.cc.instance(3)); + AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + rtps_stage <= CHECK; + rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when others => null; end case; end if; when CHECK => if (valid_out_rtps = '1') then - AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, reference.cc.payload.last(ref_cnt) & reference.cc.payload.data(ref_cnt)); - ref_cnt <= ref_cnt + 1; - if (ref_cnt = reference.cc.payload.length-1) then - ref_stage <= IDLE; + AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, rtps.cc.payload.last(rtps_cnt) & rtps.cc.payload.data(rtps_cnt)); + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = rtps.cc.payload.length-1) then + rtps_stage <= IDLE; end if; end if; end case; @@ -562,17 +538,19 @@ begin -- DEFAULT start_rtps <= '0'; + opcode_rtps <= NOP; + seq_nr_rtps <= SEQUENCENUMBER_UNKNOWN; get_data_rtps <= '0'; ready_out_rtps <= '0'; - case (ref_stage) is + case (rtps_stage) is when START => start_rtps <= '1'; - opcode_rtps <= reference.opcode; - seq_nr_rtps <= reference.cc.seq_nr; + opcode_rtps <= rtps.opcode; + seq_nr_rtps <= rtps.cc.seq_nr; when DONE => if (done_rtps = '1') then - case (reference.opcode) is + case (rtps.opcode) is when GET_CACHE_CHANGE => get_data_rtps <= '1'; when others => diff --git a/src/Tests/Level_0/L0_dds_writer_test4_aik.vhd b/src/Tests/Level_0/L0_dds_writer_test4_aik.vhd index 1296f87..f3af439 100644 --- a/src/Tests/Level_0/L0_dds_writer_test4_aik.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test4_aik.vhd @@ -19,35 +19,9 @@ architecture testbench of L0_dds_writer_test4_aik is constant MAX_REMOTE_ENDPOINTS : natural := 3; -- *TYPE DECLARATION* - type STIM_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK, CHECK_LIVELINESS); - type REF_STAGE_TYPE is (IDLE, START, DONE, CHECK); + type DDS_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK, CHECK_LIVELINESS); + type RTPS_STAGE_TYPE is (IDLE, START, DONE, CHECK); type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); - type RTPS_TEST_TYPE is record - opcode : HISTORY_CACHE_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : HISTORY_CACHE_RESPONSE_TYPE; - end record; - constant DEFAULT_RTPS_TEST : RTPS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => OK - ); - type DDS_TEST_TYPE is record - opcode : DDS_WRITER_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0); - count : natural; - change : natural; - assertion : std_logic; - end record; - constant DEFAULT_DDS_TEST : DDS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => RETCODE_OK, - count => 0, - change => 0, - assertion => '0' - ); -- *SIGNAL DECLARATION* signal clk : std_logic := '0'; @@ -71,14 +45,14 @@ architecture testbench of L0_dds_writer_test4_aik is signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); - signal stim_start, stim_done, ref_start, ref_done : std_logic := '0'; - signal stim_cnt, ref_cnt, kh_cnt : natural := 0; - signal stim_stage : STIM_STAGE_TYPE := IDLE; - signal ref_stage : REF_STAGE_TYPE := IDLE; + signal dds_start, dds_done, rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; signal kh_stage : KH_STAGE_TYPE := IDLE; signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; - shared variable stimulus : DDS_TEST_TYPE := DEFAULT_DDS_TEST; - shared variable reference : RTPS_TEST_TYPE := DEFAULT_RTPS_TEST; + shared variable dds : DDS_WRITER_TEST_TYPE := DEFAULT_DDS_WRITER_TEST; + shared variable rtps : RTPS_WRITER_TEST_TYPE := DEFAULT_RTPS_WRITER_TEST; signal inst_id, kind_id, sn_id, ts_id, data_id, ret_id, status_id, assert_id : AlertLogIDType; -- *FUNCTION DECLARATION* @@ -202,40 +176,40 @@ begin return ret; end function; - procedure start_stim is + procedure start_dds is begin - stim_start <= '1'; + dds_start <= '1'; wait until rising_edge(clk); - stim_start <= '0'; + dds_start <= '0'; wait until rising_edge(clk); end procedure; - procedure start_ref is + procedure start_rtps is begin - ref_start <= '1'; + rtps_start <= '1'; wait until rising_edge(clk); - ref_start <= '0'; + rtps_start <= '0'; wait until rising_edge(clk); end procedure; - procedure wait_on_stim is + procedure wait_on_dds is begin - if (stim_done /= '1') then - wait until stim_done = '1'; + if (dds_done /= '1') then + wait until dds_done = '1'; end if; end procedure; - procedure wait_on_ref is + procedure wait_on_rtps is begin - if (ref_done /= '1') then - wait until ref_done = '1'; + if (rtps_done /= '1') then + wait until rtps_done = '1'; end if; end procedure; procedure wait_on_completion is begin - if (ref_done /= '1' or stim_done /= '1') then - wait until ref_done = '1' and stim_done = '1'; + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; end if; end procedure; @@ -300,13 +274,13 @@ begin AffirmIf(status_id,(status and LIVELINESS_LOST_STATUS) = LIVELINESS_LOST_STATUS, "Expected: 1", "Received 0"); Log("DDS Operation GET_LIVELINESS_LOST_STATUS (Expected: count 1, change 1)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := GET_LIVELINESS_LOST_STATUS; - stimulus.ret_code := RETCODE_OK; - stimulus.count := 1; - stimulus.change := 1; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := GET_LIVELINESS_LOST_STATUS; + dds.ret_code := RETCODE_OK; + dds.count := 1; + dds.change := 1; + start_dds; + wait_on_dds; wait_on_idle; AffirmIf(status_id,(status and LIVELINESS_LOST_STATUS) /= LIVELINESS_LOST_STATUS, "Expected: 0", "Received 1"); @@ -319,6 +293,7 @@ begin AffirmIf(status_id,(status and LIVELINESS_LOST_STATUS) /= LIVELINESS_LOST_STATUS, "Expected: 0", "Received 1"); + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -326,13 +301,13 @@ begin cc.seq_nr := gen_sn(1); Log("DDS Operation WRITE [Instance 1, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I1S1, 0, 0, 0 @@ -352,6 +327,7 @@ begin AffirmIf(status_id,(status and LIVELINESS_LOST_STATUS) /= LIVELINESS_LOST_STATUS, "Expected: 0", "Received 1"); + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_DISPOSED; cc.instance := kh1; @@ -359,12 +335,12 @@ begin cc.seq_nr := gen_sn(2); Log("DDS Operation DISPOSE [Instance 1] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := DISPOSE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := DISPOSE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I1S1, I1S2, 0, 0 @@ -384,6 +360,7 @@ begin AffirmIf(status_id,(status and LIVELINESS_LOST_STATUS) /= LIVELINESS_LOST_STATUS, "Expected: 0", "Received 1"); + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh1; @@ -391,12 +368,12 @@ begin cc.seq_nr := gen_sn(3); Log("DDS Operation UNREGISTER_INSTANCE [Instance 1] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I1S1, I1S2, I1S3, 0 @@ -425,13 +402,13 @@ begin AffirmIf(status_id,(status and LIVELINESS_LOST_STATUS) = LIVELINESS_LOST_STATUS, "Expected: 1", "Received 0"); Log("DDS Operation GET_LIVELINESS_LOST_STATUS (Expected: count 3, change 2)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := GET_LIVELINESS_LOST_STATUS; - stimulus.ret_code := RETCODE_OK; - stimulus.count := 3; - stimulus.change := 2; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := GET_LIVELINESS_LOST_STATUS; + dds.ret_code := RETCODE_OK; + dds.count := 3; + dds.change := 2; + start_dds; + wait_on_dds; wait_on_idle; AffirmIf(status_id,(status and LIVELINESS_LOST_STATUS) /= LIVELINESS_LOST_STATUS, "Expected: 0", "Received 1"); @@ -445,12 +422,12 @@ begin AffirmIf(status_id,(status and LIVELINESS_LOST_STATUS) /= LIVELINESS_LOST_STATUS, "Expected: 0", "Received 1"); Log("DDS Operation ASSERT_LIVELINESS (OK)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := ASSERT_LIVELINESS; - stimulus.ret_code := RETCODE_OK; - stimulus.assertion := '1'; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := ASSERT_LIVELINESS; + dds.ret_code := RETCODE_OK; + dds.assertion := '1'; + start_dds; + wait_on_dds; Log("Current Time: 7s", INFO); check_time <= gen_duration(7,0); @@ -484,45 +461,45 @@ begin end if; end process; - stim_prc : process(all) + dds_prc : process(all) begin if rising_edge(clk) then - stim_done <= '0'; - case (stim_stage) is + dds_done <= '0'; + case (dds_stage) is when IDLE => - if (stim_start = '1') then - stim_stage <= START; + if (dds_start = '1') then + dds_stage <= START; else - stim_done <= '1'; + dds_done <= '1'; end if; when START => if (ack_dds = '1') then - case (stimulus.opcode) is + case (dds.opcode) is when GET_LIVELINESS_LOST_STATUS => - stim_stage <= DONE; - stim_cnt <= 0; + dds_stage <= DONE; + dds_cnt <= 0; when ASSERT_LIVELINESS => - stim_stage <= DONE; - stim_cnt <= 0; + dds_stage <= DONE; + dds_cnt <= 0; when others => - stim_stage <= PUSH; - stim_cnt <= 0; + dds_stage <= PUSH; + dds_cnt <= 0; end case; end if; when PUSH => if (ready_in_dds = '1') then - stim_cnt <= stim_cnt + 1; - if (stim_cnt = stimulus.cc.payload.length-1) then + dds_cnt <= dds_cnt + 1; + if (dds_cnt = dds.cc.payload.length-1) then -- DEFAULT - stim_stage <= DONE; + dds_stage <= DONE; - case (stimulus.opcode) is + case (dds.opcode) is when REGISTER_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when LOOKUP_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when others => null; end case; @@ -530,41 +507,41 @@ begin end if; when DONE => if (done_dds = '1') then - AffirmIfEqual(ret_id, return_code_dds, stimulus.ret_code); - case (stimulus.opcode) is + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + case (dds.opcode) is when GET_LIVELINESS_LOST_STATUS => - if (stimulus.ret_code = RETCODE_OK) then - stim_stage <= CHECK_LIVELINESS; - stim_cnt <= 0; + if (dds.ret_code = RETCODE_OK) then + dds_stage <= CHECK_LIVELINESS; + dds_cnt <= 0; else - stim_stage <= IDLE; + dds_stage <= IDLE; end if; when ASSERT_LIVELINESS => - AffirmIfEqual(assert_id, liveliness_assertion, stimulus.assertion); - stim_stage <= IDLE; + AffirmIfEqual(assert_id, liveliness_assertion, dds.assertion); + dds_stage <= IDLE; when others => - stim_stage <= IDLE; + dds_stage <= IDLE; end case; end if; when CHECK => if (valid_out_dds = '1') then - AffirmIfEqual(data_id, data_out_dds, stimulus.cc.instance(stim_cnt)); - stim_cnt <= stim_cnt + 1; - if (stim_cnt = 3) then + AffirmIfEqual(data_id, data_out_dds, dds.cc.instance(dds_cnt)); + dds_cnt <= dds_cnt + 1; + if (dds_cnt = 3) then AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); - stim_stage <= IDLE; + dds_stage <= IDLE; end if; end if; when CHECK_LIVELINESS => if (valid_out_dds = '1') then - stim_cnt <= stim_cnt + 1; - case (stim_cnt) is + dds_cnt <= dds_cnt + 1; + case (dds_cnt) is when 0 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(stimulus.count,CDR_LONG_WIDTH))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(dds.count,CDR_LONG_WIDTH))); when 1 => - AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(stimulus.change,CDR_LONG_WIDTH))); + AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(dds.change,CDR_LONG_WIDTH))); AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); - stim_stage <= IDLE; + dds_stage <= IDLE; when others => null; end case; @@ -574,6 +551,7 @@ begin -- DEFAULT start_dds <= '0'; + opcode_dds <= NOP; valid_in_dds <= '0'; last_word_in_dds <= '0'; data_in_dds <= (others => '0'); @@ -581,16 +559,16 @@ begin source_ts_dds <= TIME_INVALID; ready_out_dds <= '0'; - case (stim_stage) is + case (dds_stage) is when START => start_dds <= '1'; - opcode_dds <= stimulus.opcode; - instance_handle_dds <= stimulus.cc.instance; - source_ts_dds <= stimulus.cc.src_timestamp; + opcode_dds <= dds.opcode; + instance_handle_dds <= dds.cc.instance; + source_ts_dds <= dds.cc.src_timestamp; when PUSH => valid_in_dds <= '1'; - data_in_dds <= stimulus.cc.payload.data(stim_cnt); - last_word_in_dds <= stimulus.cc.payload.last(stim_cnt); + data_in_dds <= dds.cc.payload.data(dds_cnt); + last_word_in_dds <= dds.cc.payload.last(dds_cnt); when CHECK => ready_out_dds <= '1'; when CHECK_LIVELINESS => @@ -600,54 +578,54 @@ begin end case; end process; - ref_prc : process(all) + rtps_prc : process(all) begin if rising_edge(clk) then - ref_done <= '0'; - case (ref_stage) is + rtps_done <= '0'; + case (rtps_stage) is when IDLE => - if (ref_start = '1') then - ref_stage <= START; + if (rtps_start = '1') then + rtps_stage <= START; else - ref_done <= '1'; + rtps_done <= '1'; end if; when START => if (ack_rtps = '1') then - ref_stage <= DONE; + rtps_stage <= DONE; end if; when DONE => if (done_rtps = '1') then -- DEFAULT - ref_stage <= IDLE; + rtps_stage <= IDLE; - AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(reference.ret_code)); - case (reference.opcode) is + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + case (rtps.opcode) is when GET_CACHE_CHANGE => - if (reference.ret_code = OK) then - AffirmIfEqual(inst_id, cc_instance_handle(0), reference.cc.instance(0)); - AffirmIfEqual(inst_id, cc_instance_handle(1), reference.cc.instance(1)); - AffirmIfEqual(inst_id, cc_instance_handle(2), reference.cc.instance(2)); - AffirmIfEqual(inst_id, cc_instance_handle(3), reference.cc.instance(3)); - AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(reference.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(reference.cc.src_timestamp)); - ref_stage <= CHECK; - ref_cnt <= 0; + if (rtps.ret_code = OK) then + AffirmIfEqual(inst_id, cc_instance_handle(0), rtps.cc.instance(0)); + AffirmIfEqual(inst_id, cc_instance_handle(1), rtps.cc.instance(1)); + AffirmIfEqual(inst_id, cc_instance_handle(2), rtps.cc.instance(2)); + AffirmIfEqual(inst_id, cc_instance_handle(3), rtps.cc.instance(3)); + AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + rtps_stage <= CHECK; + rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when others => null; end case; end if; when CHECK => if (valid_out_rtps = '1') then - AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, reference.cc.payload.last(ref_cnt) & reference.cc.payload.data(ref_cnt)); - ref_cnt <= ref_cnt + 1; - if (ref_cnt = reference.cc.payload.length-1) then - ref_stage <= IDLE; + AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, rtps.cc.payload.last(rtps_cnt) & rtps.cc.payload.data(rtps_cnt)); + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = rtps.cc.payload.length-1) then + rtps_stage <= IDLE; end if; end if; end case; @@ -655,17 +633,19 @@ begin -- DEFAULT start_rtps <= '0'; + opcode_rtps <= NOP; + seq_nr_rtps <= SEQUENCENUMBER_UNKNOWN; get_data_rtps <= '0'; ready_out_rtps <= '0'; - case (ref_stage) is + case (rtps_stage) is when START => start_rtps <= '1'; - opcode_rtps <= reference.opcode; - seq_nr_rtps <= reference.cc.seq_nr; + opcode_rtps <= rtps.opcode; + seq_nr_rtps <= rtps.cc.seq_nr; when DONE => if (done_rtps = '1') then - case (reference.opcode) is + case (rtps.opcode) is when GET_CACHE_CHANGE => get_data_rtps <= '1'; when others => diff --git a/src/Tests/Level_0/L0_dds_writer_test5_afk.vhd b/src/Tests/Level_0/L0_dds_writer_test5_afk.vhd index 2e3ea19..124fd7b 100644 --- a/src/Tests/Level_0/L0_dds_writer_test5_afk.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test5_afk.vhd @@ -19,29 +19,9 @@ architecture testbench of L0_dds_writer_test5_afk is constant MAX_REMOTE_ENDPOINTS : natural := 3; -- *TYPE DECLARATION* - type STIM_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK); - type REF_STAGE_TYPE is (IDLE, START, DONE, CHECK); + type DDS_STAGE_TYPE is (IDLE, START, PUSH, DONE, CHECK); + type RTPS_STAGE_TYPE is (IDLE, START, DONE, CHECK); type KH_STAGE_TYPE is (IDLE, READ_DATA, PUSH_KEY_HASH); - type RTPS_TEST_TYPE is record - opcode : HISTORY_CACHE_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : HISTORY_CACHE_RESPONSE_TYPE; - end record; - constant DEFAULT_RTPS_TEST : RTPS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => OK - ); - type DDS_TEST_TYPE is record - opcode : DDS_WRITER_OPCODE_TYPE; - cc : CACHE_CHANGE_TYPE; - ret_code : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0); - end record; - constant DEFAULT_DDS_TEST : DDS_TEST_TYPE := ( - opcode => NOP, - cc => DEFAULT_CACHE_CHANGE, - ret_code => RETCODE_OK - ); -- *SIGNAL DECLARATION* signal clk : std_logic := '0'; @@ -65,14 +45,14 @@ architecture testbench of L0_dds_writer_test5_afk is signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0'); signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0'); - signal stim_start, stim_done, ref_start, ref_done : std_logic := '0'; - signal stim_cnt, ref_cnt, kh_cnt : natural := 0; - signal stim_stage : STIM_STAGE_TYPE := IDLE; - signal ref_stage : REF_STAGE_TYPE := IDLE; + signal dds_start, dds_done, rtps_start, rtps_done : std_logic := '0'; + signal dds_cnt, rtps_cnt, kh_cnt : natural := 0; + signal dds_stage : DDS_STAGE_TYPE := IDLE; + signal rtps_stage : RTPS_STAGE_TYPE := IDLE; signal kh_stage : KH_STAGE_TYPE := IDLE; signal kh_data : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; - shared variable stimulus : DDS_TEST_TYPE := DEFAULT_DDS_TEST; - shared variable reference : RTPS_TEST_TYPE := DEFAULT_RTPS_TEST; + shared variable dds : DDS_WRITER_TEST_TYPE := DEFAULT_DDS_WRITER_TEST; + shared variable rtps : RTPS_WRITER_TEST_TYPE := DEFAULT_RTPS_WRITER_TEST; signal inst_id, kind_id, sn_id, ts_id, data_id, ret_id, status_id, assert_id : AlertLogIDType; -- *FUNCTION DECLARATION* @@ -196,40 +176,40 @@ begin return ret; end function; - procedure start_stim is + procedure start_dds is begin - stim_start <= '1'; + dds_start <= '1'; wait until rising_edge(clk); - stim_start <= '0'; + dds_start <= '0'; wait until rising_edge(clk); end procedure; - procedure start_ref is + procedure start_rtps is begin - ref_start <= '1'; + rtps_start <= '1'; wait until rising_edge(clk); - ref_start <= '0'; + rtps_start <= '0'; wait until rising_edge(clk); end procedure; - procedure wait_on_stim is + procedure wait_on_dds is begin - if (stim_done /= '1') then - wait until stim_done = '1'; + if (dds_done /= '1') then + wait until dds_done = '1'; end if; end procedure; - procedure wait_on_ref is + procedure wait_on_rtps is begin - if (ref_done /= '1') then - wait until ref_done = '1'; + if (rtps_done /= '1') then + wait until rtps_done = '1'; end if; end procedure; procedure wait_on_completion is begin - if (ref_done /= '1' or stim_done /= '1') then - wait until ref_done = '1' and stim_done = '1'; + if (rtps_done /= '1' or dds_done /= '1') then + wait until rtps_done = '1' and dds_done = '1'; end if; end procedure; @@ -283,6 +263,7 @@ begin wait_on_idle; -- Stored CC: 0, 0, 0, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -290,16 +271,17 @@ begin cc.seq_nr := gen_sn(1); Log("DDS Operation WRITE [Instance 1, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I1S1, 0, 0, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh2; @@ -307,13 +289,13 @@ begin cc.seq_nr := gen_sn(2); Log("DDS Operation WRITE [Instance 2, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I1S1, I2S2, 0, 0 @@ -323,6 +305,7 @@ begin wait until rising_edge(clk); wait_on_idle; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -330,16 +313,17 @@ begin cc.seq_nr := gen_sn(3); Log("DDS Operation WRITE [Instance 1, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc3 := cc; -- Stored CC: I1S1, I2S2, I1S3, 0 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -347,14 +331,15 @@ begin cc.seq_nr := gen_sn(4); Log("DDS Operation WRITE [Instance 1, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_SAMPLES_PER_INSTANCE exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := TRUE; cc.kind := NOT_ALIVE_UNREGISTERED; cc.instance := kh2; @@ -362,12 +347,12 @@ begin cc.seq_nr := gen_sn(4); Log("DDS Operation UNREGISTER_INSTANCE [Instance 2] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := UNREGISTER_INSTANCE; - stimulus.cc := cc; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := UNREGISTER_INSTANCE; + dds.cc := cc; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc4 := cc; -- Stored CC: I1S1, I2S2, I1S3, I2S4 @@ -381,19 +366,20 @@ begin -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 3)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(3); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(3); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 4)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(4); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(4); + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh1; @@ -401,16 +387,17 @@ begin cc.seq_nr := gen_sn(5); Log("DDS Operation WRITE [Instance 1, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc1 := cc; -- Stored CC: I1S5, 0, I1S3, I2S4 + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -418,13 +405,13 @@ begin cc.seq_nr := gen_sn(6); Log("DDS Operation WRITE [Instance 3, HANDLE_NIL, Aligned Payload] (REJECTED: MAX_INSTANCES exceeded)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OUT_OF_RESOURCES; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OUT_OF_RESOURCES; + start_dds; + wait_on_dds; Log("Current Time: 3s", INFO); check_time <= gen_duration(3,0); @@ -436,19 +423,20 @@ begin -- VALIDATE STATE Log("RTPS Operation GET_MIN_SN (Expected SN 5)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MIN_SN; - reference.cc.seq_nr := gen_sn(5); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MIN_SN; + rtps.cc.seq_nr := gen_sn(5); + start_rtps; + wait_on_rtps; Log("RTPS Operation GET_MAX_SN (Expected SN 5)", INFO); - reference := DEFAULT_RTPS_TEST; - reference.opcode := GET_MAX_SN; - reference.cc.seq_nr := gen_sn(5); - start_ref; - wait_on_ref; + rtps := DEFAULT_RTPS_WRITER_TEST; + rtps.opcode := GET_MAX_SN; + rtps.cc.seq_nr := gen_sn(5); + start_rtps; + wait_on_rtps; + cc := DEFAULT_CACHE_CHANGE; cc.serialized_key := FALSE; cc.kind := ALIVE; cc.instance := kh3; @@ -456,13 +444,13 @@ begin cc.seq_nr := gen_sn(6); Log("DDS Operation WRITE [Instance 3, HANDLE_NIL, Aligned Payload] (ACCEPTED)", INFO); - stimulus := DEFAULT_DDS_TEST; - stimulus.opcode := WRITE; - stimulus.cc := cc; - stimulus.cc.instance:= HANDLE_NIL; - stimulus.ret_code := RETCODE_OK; - start_stim; - wait_on_stim; + dds := DEFAULT_DDS_WRITER_TEST; + dds.opcode := WRITE; + dds.cc := cc; + dds.cc.instance:= HANDLE_NIL; + dds.ret_code := RETCODE_OK; + start_dds; + wait_on_dds; cc2 := cc; -- Stored CC: I1S5, I3S6, 0, 0 @@ -490,39 +478,39 @@ begin end if; end process; - stim_prc : process(all) + dds_prc : process(all) begin if rising_edge(clk) then - stim_done <= '0'; - case (stim_stage) is + dds_done <= '0'; + case (dds_stage) is when IDLE => - if (stim_start = '1') then - stim_stage <= START; + if (dds_start = '1') then + dds_stage <= START; else - stim_done <= '1'; + dds_done <= '1'; end if; when START => if (ack_dds = '1') then - case (stimulus.opcode) is + case (dds.opcode) is when others => - stim_stage <= PUSH; - stim_cnt <= 0; + dds_stage <= PUSH; + dds_cnt <= 0; end case; end if; when PUSH => if (ready_in_dds = '1') then - stim_cnt <= stim_cnt + 1; - if (stim_cnt = stimulus.cc.payload.length-1) then + dds_cnt <= dds_cnt + 1; + if (dds_cnt = dds.cc.payload.length-1) then -- DEFAULT - stim_stage <= DONE; + dds_stage <= DONE; - case (stimulus.opcode) is + case (dds.opcode) is when REGISTER_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when LOOKUP_INSTANCE => - stim_stage <= CHECK; - stim_cnt <= 0; + dds_stage <= CHECK; + dds_cnt <= 0; when others => null; end case; @@ -530,19 +518,19 @@ begin end if; when DONE => if (done_dds = '1') then - AffirmIfEqual(ret_id, return_code_dds, stimulus.ret_code); - case (stimulus.opcode) is + AffirmIfEqual(ret_id, return_code_dds, dds.ret_code); + case (dds.opcode) is when others => - stim_stage <= IDLE; + dds_stage <= IDLE; end case; end if; when CHECK => if (valid_out_dds = '1') then - AffirmIfEqual(data_id, data_out_dds, stimulus.cc.instance(stim_cnt)); - stim_cnt <= stim_cnt + 1; - if (stim_cnt = 3) then + AffirmIfEqual(data_id, data_out_dds, dds.cc.instance(dds_cnt)); + dds_cnt <= dds_cnt + 1; + if (dds_cnt = 3) then AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR); - stim_stage <= IDLE; + dds_stage <= IDLE; end if; end if; end case; @@ -550,6 +538,7 @@ begin -- DEFAULT start_dds <= '0'; + opcode_dds <= NOP; valid_in_dds <= '0'; last_word_in_dds <= '0'; data_in_dds <= (others => '0'); @@ -557,16 +546,16 @@ begin source_ts_dds <= TIME_INVALID; ready_out_dds <= '0'; - case (stim_stage) is + case (dds_stage) is when START => start_dds <= '1'; - opcode_dds <= stimulus.opcode; - instance_handle_dds <= stimulus.cc.instance; - source_ts_dds <= stimulus.cc.src_timestamp; + opcode_dds <= dds.opcode; + instance_handle_dds <= dds.cc.instance; + source_ts_dds <= dds.cc.src_timestamp; when PUSH => valid_in_dds <= '1'; - data_in_dds <= stimulus.cc.payload.data(stim_cnt); - last_word_in_dds <= stimulus.cc.payload.last(stim_cnt); + data_in_dds <= dds.cc.payload.data(dds_cnt); + last_word_in_dds <= dds.cc.payload.last(dds_cnt); when CHECK => ready_out_dds <= '1'; when others => @@ -574,54 +563,51 @@ begin end case; end process; - ref_prc : process(all) + rtps_prc : process(all) begin if rising_edge(clk) then - ref_done <= '0'; - case (ref_stage) is + rtps_done <= '0'; + case (rtps_stage) is when IDLE => - if (ref_start = '1') then - ref_stage <= START; + if (rtps_start = '1') then + rtps_stage <= START; else - ref_done <= '1'; + rtps_done <= '1'; end if; when START => if (ack_rtps = '1') then - ref_stage <= DONE; + rtps_stage <= DONE; end if; when DONE => if (done_rtps = '1') then -- DEFAULT - ref_stage <= IDLE; + rtps_stage <= IDLE; - AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(reference.ret_code)); - case (reference.opcode) is + AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code)); + case (rtps.opcode) is when GET_CACHE_CHANGE => - if (reference.ret_code = OK) then - AffirmIfEqual(inst_id, cc_instance_handle(0), reference.cc.instance(0)); - AffirmIfEqual(inst_id, cc_instance_handle(1), reference.cc.instance(1)); - AffirmIfEqual(inst_id, cc_instance_handle(2), reference.cc.instance(2)); - AffirmIfEqual(inst_id, cc_instance_handle(3), reference.cc.instance(3)); - AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(reference.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(reference.cc.src_timestamp)); - ref_stage <= CHECK; - ref_cnt <= 0; + if (rtps.ret_code = OK) then + AffirmIfEqual(inst_id, to_unsigned(cc_instance_handle), to_unsigned(rtps.cc.instance)); + AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + rtps_stage <= CHECK; + rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(reference.cc.seq_nr)); + AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); when others => null; end case; end if; when CHECK => if (valid_out_rtps = '1') then - AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, reference.cc.payload.last(ref_cnt) & reference.cc.payload.data(ref_cnt)); - ref_cnt <= ref_cnt + 1; - if (ref_cnt = reference.cc.payload.length-1) then - ref_stage <= IDLE; + AffirmIfEqual(data_id, last_word_out_rtps & data_out_rtps, rtps.cc.payload.last(rtps_cnt) & rtps.cc.payload.data(rtps_cnt)); + rtps_cnt <= rtps_cnt + 1; + if (rtps_cnt = rtps.cc.payload.length-1) then + rtps_stage <= IDLE; end if; end if; end case; @@ -629,17 +615,19 @@ begin -- DEFAULT start_rtps <= '0'; + opcode_rtps <= NOP; + seq_nr_rtps <= SEQUENCENUMBER_UNKNOWN; get_data_rtps <= '0'; ready_out_rtps <= '0'; - case (ref_stage) is + case (rtps_stage) is when START => start_rtps <= '1'; - opcode_rtps <= reference.opcode; - seq_nr_rtps <= reference.cc.seq_nr; + opcode_rtps <= rtps.opcode; + seq_nr_rtps <= rtps.cc.seq_nr; when DONE => if (done_rtps = '1') then - case (reference.opcode) is + case (rtps.opcode) is when GET_CACHE_CHANGE => get_data_rtps <= '1'; when others => diff --git a/src/Tests/Level_0/dds_reader_tests.txt b/src/Tests/Level_0/dds_reader_tests.txt new file mode 100644 index 0000000..91bf68e --- /dev/null +++ b/src/Tests/Level_0/dds_reader_tests.txt @@ -0,0 +1,57 @@ +-- TEST: NORMAL ADD_CACHE_CHANGE +-- TEST: ADD_CACHE_CHANGE ON PAYLOAD MEMORY FULL + +-- TEST: REMOVE_WRITER [UNKNOWN WRITER] +-- TEST: REMOVE_WRITER [KNOWN WRITER (1 Instance)] +-- TEST: REMOVE_WRITER [KNOWN WRITER (>1 Instances)] + +-- TEST: SAMPLE WITH ALIGNED PAYLOAD +-- TEST: SAMPLE WITH UNALIGNED PAYLOAD [>1 SLOT] +-- TEST: SAMPLE WITH UNALIGNED PAYLOAD [<1 SLOT] + +-- TEST: NORMAL SAMPLE [KNOWN INSTANCE] +-- TEST: NORMAL SAMPLE [UNKNOWN INSTANCE] + +-- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, KNOWN WRITER] +-- TEST: UNREGISTER SAMPLE [KNOWN INSTANCE, UNKNOWN WRITER] +-- TEST: UNREGISTER SAMPLE [UNKNOWN INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: UNREGISTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE, STALE INSTANCE TRANSITION] + +-- TEST: DISPOSE SAMPLE [KNOWN INSTANCE] +-- TEST: DISPOSE SAMPLE [UNKNOWN INSTANCE] +-- TEST: DISPOSE SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] +-- TEST: DISPOSE SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] + +-- TEST: FILTER SAMPLE [KNOWN INSTANCE] +-- TEST: FILTER SAMPLE [UNKNOWN INSTANCE] +-- TEST: FILTER SAMPLE [NOT_ALIVE_DISPOSED INSTANCE] +-- TEST: FILTER SAMPLE [NOT_ALIVE_NO_WRITERS INSTANCE] + +-- TEST: SAMPLE WITH KEY_HASH +-- TEST: SAMPLE WITHOUT KEY_HASH +-- TEST: SAMPLE WITH SERIALIZED KEY [WITH KEY_HASH] +-- TEST: SAMPLE WITH SERIALIZED KEY [WITHOUT KEY_HASH] +-- TEST: SAMPLE WITH EARLY TIMESTAMP [TIMESTAMP EARLIER THAN LAST READ] + +-- TEST: TEST SAMPLE WITH SERIALIZED KEY EFFECT ON PAYLOAD MEMORY FULLNESS + +-- TEST: ADD SAMPLE ON MAX_SAMPLES_PER_INSTANCE + +-- TEST: ADD SAMPLE ON MAX_SAMPLES [KNOWN INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES [UNKNOWN INSTANCE] + +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE] +-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE] + +-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE] +-- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE] + +-- TEST: WRITER_BITMAP SPLIT + +-- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE + +-- TEST: ADD SAMPLE ON PAYLOAD MEMORY FULL & MAX_SAMPLES_PER_INSTANCE (Induce Double Remove) \ No newline at end of file diff --git a/src/Tests/Level_0/dds_writer_tests.txt b/src/Tests/Level_0/dds_writer_tests.txt index e3cee7e..740cf5a 100644 --- a/src/Tests/Level_0/dds_writer_tests.txt +++ b/src/Tests/Level_0/dds_writer_tests.txt @@ -73,7 +73,7 @@ -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE (>0 SAMPLES)] -- TEST: ADD SAMPLE ON MAX_SAMPLES & MAX_INSTANCES [UNKNOWN INSTANCE,WITH STALE INSTANCE, WITH ACKed SAMPLE] --- TEST: ADD SAMPLE ON PAYLOAD FULL & MAX_INSTANCES [UNKNOWN INSTANCE,WITH ACKed SAMPLES,WITH STALE INSTANCE (>= 1 SAMPLE)] (Induce Double Remove) +-- TEST: ADD SAMPLE ON PAYLOAD MEMORY FULL & MAX_INSTANCES [UNKNOWN INSTANCE,WITH ACKed SAMPLES,WITH STALE INSTANCE (>= 1 SAMPLE)] (Induce Double Remove) -- TEST: ADD SAMPLE BIGGER THAN AVAILABLE MEMORY SPACE [WITH ACKed SAMPLES] diff --git a/src/Tests/testbench.pro b/src/Tests/testbench.pro index 5c886e4..5b6df30 100644 --- a/src/Tests/testbench.pro +++ b/src/Tests/testbench.pro @@ -19,6 +19,7 @@ analyze ../rtps_out.vhd analyze ../rtps_reader.vhd analyze ../rtps_writer.vhd analyze ../dds_writer.vhd +analyze ../dds_reader.vhd #analyze Level_0/L0_rtps_handler_test1.vhd #analyze Level_0/L0_rtps_handler_test2.vhd #analyze Level_0/L0_rtps_builtin_endpoint_test1.vhd @@ -62,7 +63,13 @@ analyze ../dds_writer.vhd #analyze Level_0/L0_dds_writer_test3_aik.vhd #analyze Level_0/L0_dds_writer_test3_ain.vhd #analyze Level_0/L0_dds_writer_test4_aik.vhd -analyze Level_0/L0_dds_writer_test5_afk.vhd +#analyze Level_0/L0_dds_writer_test5_afk.vhd +analyze Level_0/L0_dds_reader_test1_arzkriu.vhd +analyze Level_0/L0_dds_reader_test1_lrzkriu.vhd +analyze Level_0/L0_dds_reader_test1_lbzkriu.vhd +analyze Level_0/L0_dds_reader_test1_abzkriu.vhd +analyze Level_0/L0_dds_reader_test1_arznriu.vhd +analyze Level_0/L0_dds_reader_test1_arzksiu.vhd #simulate L0_rtps_handler_test1 #simulate L0_rtps_handler_test2 @@ -107,4 +114,10 @@ analyze Level_0/L0_dds_writer_test5_afk.vhd #simulate L0_dds_writer_test3_aik #simulate L0_dds_writer_test3_ain #simulate L0_dds_writer_test4_aik -simulate L0_dds_writer_test5_afk \ No newline at end of file +#simulate L0_dds_writer_test5_afk +simulate L0_dds_reader_test1_arzkriu +#simulate L0_dds_reader_test1_lrzkriu +#simulate L0_dds_reader_test1_lbzkriu +#simulate L0_dds_reader_test1_abzkriu +#simulate L0_dds_reader_test1_arznriu +#simulate L0_dds_reader_test1_arzksiu \ No newline at end of file diff --git a/src/dds_reader.vhd b/src/dds_reader.vhd index 1155396..ac9ed45 100644 --- a/src/dds_reader.vhd +++ b/src/dds_reader.vhd @@ -81,11 +81,12 @@ entity dds_reader is si_no_writers_generation_count : out std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0); si_sample_rank : out std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0); si_generation_rank : out std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0); - si_absolute_generation_count : out std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0); + si_absolute_generation_rank : out std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0); si_valid_data : out std_logic; si_valid : out std_logic; + si_last : out std_logic; -- Communication Status - status : out std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) + status : out std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) ); end entity; @@ -207,7 +208,7 @@ architecture arch of dds_reader is --*****TYPE DECLARATION***** -- FSM states. Explained below in detail - type STAGE_TYPE is (IDLE, UNKNOWN_OPERATION, ADD_SAMPLE_INFO, ADD_PAYLOAD_ADDRESS, ADD_PAYLOAD, NEXT_PAYLOAD_SLOT, ALIGN_PAYLOAD, GET_KEY_HASH, INITIATE_INSTANCE_SEARCH, + type STAGE_TYPE is (IDLE, RETURN_DDS, RETURN_RTPS, ADD_SAMPLE_INFO, ADD_PAYLOAD_ADDRESS, ADD_PAYLOAD, NEXT_PAYLOAD_SLOT, ALIGN_PAYLOAD, GET_KEY_HASH, INITIATE_INSTANCE_SEARCH, FILTER_STAGE, UPDATE_INSTANCE, FINALIZE_PAYLOAD, PRE_SAMPLE_FINALIZE, FIND_POS, FIX_POINTERS, FINALIZE_SAMPLE, GET_OLDEST_SAMPLE_INSTANCE, FIND_OLDEST_INST_SAMPLE, REMOVE_SAMPLE, POST_SAMPLE_REMOVE, SKIP_AND_RETURN, REMOVE_WRITER, REMOVE_STALE_INSTANCE, GET_NEXT_SAMPLE, PRE_CALCULATE, FINALIZE_SAMPLE_INFO, GET_PAYLOAD, FIND_NEXT_INSTANCE, CHECK_INSTANCE, CHECK_LIFESPAN, GET_SAMPLE_REJECTED_STATUS, GET_REQUESTED_DEADLINE_MISSED_STATUS, CHECK_DEADLINE, RESET_SAMPLE_MEMORY, @@ -228,8 +229,9 @@ architecture arch of dds_reader is -- UNMARK_INSTANCES Reset the MARK_FLAG of all stored Instances type INSTANCE_OPCODE_TYPE is (NOP, SEARCH_INSTANCE_HASH, SEARCH_INSTANCE_ADDR, INSERT_INSTANCE, UPDATE_INSTANCE, GET_FIRST_INSTANCE, GET_NEXT_INSTANCE, REMOVE_INSTANCE, GET_INSTANCE, UNMARK_INSTANCES); - type WRITER_BITMAP_ARRAY_TYPE is array (0 to round_div(MAX_REMOTE_ENDPOINTS-1, WORD_WIDTH)-1) of std_logic_vector(0 to WORD_WIDTH-1); + type WRITER_BITMAP_ARRAY_TYPE is array (0 to round_div(MAX_REMOTE_ENDPOINTS, WORD_WIDTH)-1) of std_logic_vector(0 to WORD_WIDTH-1); constant ZERO_WRITER_BITMAP_ARRAY : WRITER_BITMAP_ARRAY_TYPE := (others => (others => '0')); + constant WRITER_BITMAP_WIDTH : natural := WRITER_BITMAP_ARRAY_TYPE'length*WORD_WIDTH; -- Record of Instance Data type INSTANCE_DATA_TYPE is record key_hash : KEY_HASH_TYPE; @@ -291,7 +293,7 @@ architecture arch of dds_reader is signal payload_abort_read : std_logic := '0'; -- *INSTANCE MEMORY CONNECTION SIGNALS* - signal inst_addr : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) := (others => '0'); + signal inst_addr : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0) := (others => '0'); signal inst_read : std_logic := '0'; signal inst_read_data, inst_write_data : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0'); signal inst_ready_in, inst_valid_in : std_logic := '0'; @@ -327,8 +329,10 @@ architecture arch of dds_reader is signal writer_pos, writer_pos_next : natural range 0 to MAX_REMOTE_ENDPOINTS-1 := 0; -- Key Hash Latch signal key_hash, key_hash_next : KEY_HASH_TYPE := HANDLE_NIL; - -- Return Code Latch - signal return_code_latch, return_code_latch_next : HISTORY_CACHE_RESPONSE_TYPE := ERROR; + -- RTPS Return Code Latch + signal rtps_return_code_latch, rtps_return_code_latch_next : HISTORY_CACHE_RESPONSE_TYPE := ERROR; + -- DDS Return Code Latch + signal dds_return_code_latch, dds_return_code_latch_next : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := RETCODE_ERROR; -- Source Timestamp Latch signal ts_latch, ts_latch_next : TIME_TYPE := TIME_INVALID; -- Lifespan Latch @@ -435,9 +439,10 @@ architecture arch of dds_reader is signal si_no_writers_generation_count_sig, si_no_writers_generation_count_sig_next : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); signal si_sample_rank_sig, si_sample_rank_sig_next : unsigned(SAMPLE_RANK_WIDTH-1 downto 0) := (others => '0'); signal si_generation_rank_sig, si_generation_rank_sig_next : unsigned(GENERATION_RANK_WIDTH-1 downto 0) := (others => '0'); - signal si_absolute_generation_count_sig, si_absolute_generation_count_sig_next : unsigned(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); + signal si_absolute_generation_rank_sig, si_absolute_generation_rank_sig_next : unsigned(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0'); signal si_valid_data_sig, si_valid_data_sig_next : std_logic := '0'; signal si_valid_sig, si_valid_sig_next : std_logic := '0'; + signal si_last_sig, si_last_sig_next : std_logic := '0'; -- *INSTANCE MEMORY PROCESS* -- Instance Memory FSM state @@ -464,41 +469,38 @@ architecture arch of dds_reader is signal inst_cnt2, inst_cnt2_next : natural range 0 to WRITER_BITMAP_ARRAY_TYPE'length := 0; -- General Purpose Long Latch signal inst_long_latch, inst_long_latch_next : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := (others => '0'); + -- Instance Memory Flag Array denoting which inst_data Fields are up-to-date with the respective fields of the Instance (Pointed by inst_addr_base) + signal current_imf, current_imf_next : std_logic_vector(0 to IMF_FLAG_WIDTH-1) := (others => '0'); --*****ALIAS DECLARATION***** - alias prev_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_1; - alias prev_sample_next : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_1_next; - alias first_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_1; - alias first_sample_next : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_1_next; - alias next_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_2; - alias next_sample_next : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_2_next; - alias cur_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_3; - alias cur_sample_next : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_3_next; - alias second_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_4; - alias second_sample_next: unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_4_next; - alias cur_payload : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) is payload_addr_latch_1; - alias cur_payload_next : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) is payload_addr_latch_1_next; - alias next_payload : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) is payload_addr_latch_2; - alias next_payload_next : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) is payload_addr_latch_2_next; - alias cur_inst : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0) is inst_addr_latch_1; - alias cur_inst_next : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0) is inst_addr_latch_1_next; - alias next_inst : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0) is inst_addr_latch_2; - alias next_inst_next : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0) is inst_addr_latch_2_next; - alias has_data : std_logic is sample_status_info(SSI_PAYLOAD_FLAG); - alias has_key_hash : std_logic is sample_status_info(SSI_KEY_HASH_FLAG); + alias prev_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_1; + alias prev_sample_next : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_1_next; + alias first_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_1; + alias first_sample_next : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_1_next; + alias next_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_2; + alias next_sample_next : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_2_next; + alias cur_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_3; + alias cur_sample_next : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_3_next; + alias second_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_4; + alias second_sample_next : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_4_next; + alias cur_payload : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) is payload_addr_latch_1; + alias cur_payload_next : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) is payload_addr_latch_1_next; + alias next_payload : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) is payload_addr_latch_2; + alias next_payload_next : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) is payload_addr_latch_2_next; + alias cur_inst : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0) is inst_addr_latch_1; + alias cur_inst_next : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0) is inst_addr_latch_1_next; + alias next_inst : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0) is inst_addr_latch_2; + alias next_inst_next : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0) is inst_addr_latch_2_next; + alias first_payload : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) is payload_addr_latch_2; + alias first_payload_next : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) is payload_addr_latch_2_next; + alias has_data : std_logic is sample_status_info(SSI_PAYLOAD_FLAG); + alias has_key_hash : std_logic is sample_status_info(SSI_KEY_HASH_FLAG); -- *FUNCTION DECLARATION* - function to_unsigned(input : KEY_HASH_TYPE) return unsigned is - variable ret : unsigned((KEY_HASH_WIDTH*WORD_WIDTH)-1 downto 0) := (others => '0'); - begin - for i in 0 to KEY_HASH_WIDTH-1 loop - ret(((KEY_HASH_WIDTH-i)*WORD_WIDTH)-1 downto (KEY_HASH_WIDTH-1-i)*WORD_WIDTH) := unsigned(input(i)); - end loop; - return ret; - end function; function from_writer_bitmap_array (input : WRITER_BITMAP_ARRAY_TYPE) return std_logic_vector is - variable ret : std_logic_vector(0 to MAX_REMOTE_ENDPOINTS-1) := (others => '0'); + variable ret : std_logic_vector(0 to WRITER_BITMAP_WIDTH-1) := (others => '0'); + begin for i in 0 to input'length-1 loop ret(i*WORD_WIDTH to ((i+1)*WORD_WIDTH)-1) := input(i); @@ -506,7 +508,7 @@ architecture arch of dds_reader is return ret; end function; - function to_writer_bitmap_array (input : std_logic_vector(0 to MAX_REMOTE_ENDPOINTS-1)) return WRITER_BITMAP_ARRAY_TYPE is + function to_writer_bitmap_array (input : std_logic_vector(0 to WRITER_BITMAP_WIDTH-1)) return WRITER_BITMAP_ARRAY_TYPE is variable ret : WRITER_BITMAP_ARRAY_TYPE := ZERO_WRITER_BITMAP_ARRAY; begin for i in 0 to ret'length-1 loop @@ -591,15 +593,17 @@ begin si_no_writers_generation_count <= si_no_writers_generation_count_sig; si_sample_rank <= std_logic_vector(si_sample_rank_sig); si_generation_rank <= std_logic_vector(si_generation_rank_sig); - si_absolute_generation_count <= std_logic_vector(si_absolute_generation_count_sig); + si_absolute_generation_rank <= std_logic_vector(si_absolute_generation_rank_sig); si_valid_data <= si_valid_data_sig; si_valid <= si_valid_sig; + si_last <= si_last_sig; status <= status_sig; -- *Main State Machine* -- STATE DESCRIPTION -- IDLE Idle State. Initiates Deadline Miss Checks, Lifespan Expiry Checks, RTPS Operation handling, and DDS Operation handling, in that priority order. - -- UNKNOWN_OPERATION Dummy State for not supported/unknown DDS Operations + -- RETURN_DDS Return latched DDS Return Code + -- RETURN_RTPS Return latched RTPS Return Code -- ADD_SAMPLE_INFO Latch and store Cache Change (pre-payload) -- ADD_PAYLOAD_ADDRESS Store payload pointer. -- ADD_PAYLOAD Push payload to memory and key hash generator (as needed) @@ -635,7 +639,7 @@ begin -- RESET_PAYLOAD_MEMORY Reset Payload Memory to Empty State parse_a_prc : process (all) variable tmp_dw : DOUBLE_WORD_ARRAY := (others => (others => '0')); - variable tmp_bitmap : std_logic_vector(0 to MAX_REMOTE_ENDPOINTS-1) := (others => '0'); + variable tmp_bitmap : std_logic_vector(0 to WRITER_BITMAP_WIDTH-1) := (others => '0'); variable tmp_update : std_logic_vector(0 to IMF_FLAG_WIDTH-1) := (others => '0'); variable tmp_bool : boolean := FALSE; begin @@ -668,9 +672,10 @@ begin si_no_writers_generation_count_sig_next <= si_no_writers_generation_count_sig; si_sample_rank_sig_next <= si_sample_rank_sig; si_generation_rank_sig_next <= si_generation_rank_sig; - si_absolute_generation_count_sig_next <= si_absolute_generation_count_sig; + si_absolute_generation_rank_sig_next <= si_absolute_generation_rank_sig; si_valid_data_sig_next <= si_valid_data_sig; si_valid_sig_next <= si_valid_sig; + si_last_sig_next <= si_last_sig; sample_state_next <= sample_state; view_state_next <= view_state; instance_state_next <= instance_state; @@ -706,7 +711,8 @@ begin stale_inst_cnt_next <= stale_inst_cnt; inst_data_next2 <= inst_data; oldest_sample_next <= oldest_sample; - return_code_latch_next <= return_code_latch; + rtps_return_code_latch_next <= rtps_return_code_latch; + dds_return_code_latch_next <= dds_return_code_latch; -- DEFAULT Unregistered inst_opcode <= NOP; opcode_kh <= NOP; @@ -731,6 +737,9 @@ begin ready_in_kh <= '0'; valid_out_kh <= '0'; last_word_out_kh <= '0'; + valid_out_dds <= '0'; + last_word_out_dds <= '0'; + data_out_dds <= (others => '0'); data_out_kh <= (others => '0'); writer_bitmap <= ZERO_WRITER_BITMAP_ARRAY; inst_addr_update <= (others => '0'); @@ -776,7 +785,7 @@ begin -- Samples Available if (oldest_sample /= SAMPLE_MEMORY_MAX_ADDRESS) then - cur_sample <= oldest_sample; + cur_sample_next <= oldest_sample; stage_next <= CHECK_LIFESPAN; cnt_next <= 0; end if; @@ -793,7 +802,7 @@ begin -- Reject Change stage_next <= SKIP_AND_RETURN; cnt_next <= 0; - return_code_latch_next <= REJECTED; + rtps_return_code_latch_next <= REJECTED; else assert (oldest_sample /= SAMPLE_MEMORY_MAX_ADDRESS) severity FAILURE; -- Do not ACK Operation @@ -838,6 +847,9 @@ begin if (tmp_bitmap = (tmp_bitmap'range => '0') and inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) = '0') then inst_data_next2.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '1'; end if; + + stage_next <= RETURN_RTPS; + rtps_return_code_latch_next <= OK; end if; when others => null; @@ -859,6 +871,8 @@ begin max_samples_latch_next <= unsigned(max_samples_dds); -- Reset + first_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; + second_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; single_sample_next <= '0'; single_instance_next <= '0' when WITH_KEY else '1'; collection_cnt_next <= (others => '0'); @@ -867,13 +881,14 @@ begin si_view_state_sig_next <= (others => '0'); si_instance_state_sig_next <= (others => '0'); si_source_timestamp_sig_next <= TIME_ZERO; - si_instance_handle_sig_next <= (others => (others => '0')); + si_instance_handle_sig_next <= HANDLE_NIL; si_publication_handle_sig_next <= (others => (others => '0')); si_sample_rank_sig_next <= (others => '0'); si_generation_rank_sig_next <= (others => '0'); si_valid_data_sig_next <= '0'; si_valid_sig_next <= '0'; - si_absolute_generation_count_sig_next <= (others => '0'); + si_last_sig_next <= '0'; + si_absolute_generation_rank_sig_next <= (others => '0'); si_disposed_generation_count_sig_next <= (others => '0'); si_no_writers_generation_count_sig_next <= (others => '0'); @@ -924,8 +939,9 @@ begin stage_next <= CHECK_INSTANCE; cnt_next <= 0; else - ack_dds <= '1'; - stage_next <= UNKNOWN_OPERATION; + ack_dds <= '1'; + stage_next <= RETURN_DDS; + dds_return_code_latch_next <= RETCODE_ILLEGAL_OPERATION; end if; when TAKE_INSTANCE => -- Synthesis Guard @@ -938,8 +954,9 @@ begin stage_next <= CHECK_INSTANCE; cnt_next <= 0; else - ack_dds <= '1'; - stage_next <= UNKNOWN_OPERATION; + ack_dds <= '1'; + stage_next <= RETURN_DDS; + dds_return_code_latch_next <= RETCODE_ILLEGAL_OPERATION; end if; when READ_NEXT_INSTANCE => -- Synthesis Guard @@ -952,8 +969,9 @@ begin stage_next <= FIND_NEXT_INSTANCE; cnt_next <= 0; else - ack_dds <= '1'; - stage_next <= UNKNOWN_OPERATION; + ack_dds <= '1'; + stage_next <= RETURN_DDS; + dds_return_code_latch_next <= RETCODE_ILLEGAL_OPERATION; end if; when TAKE_NEXT_INSTANCE => -- Synthesis Guard @@ -967,8 +985,9 @@ begin stage_next <= FIND_NEXT_INSTANCE; cnt_next <= 0; else - ack_dds <= '1'; - stage_next <= UNKNOWN_OPERATION; + ack_dds <= '1'; + stage_next <= RETURN_DDS; + dds_return_code_latch_next <= RETCODE_ILLEGAL_OPERATION; end if; when GET_SAMPLE_REJECTED_STATUS => ack_dds <= '1'; @@ -979,24 +998,31 @@ begin stage_next <= GET_REQUESTED_DEADLINE_MISSED_STATUS; cnt_next <= 0; when others => - ack_dds <= '1'; - stage_next <= UNKNOWN_OPERATION; + ack_dds <= '1'; + stage_next <= RETURN_DDS; + dds_return_code_latch_next <= RETCODE_UNSUPPORTED; end case; end if; - when UNKNOWN_OPERATION => + when RETURN_DDS => done_dds <= '1'; - return_code_dds <= RETCODE_ILLEGAL_OPERATION; + return_code_dds <= dds_return_code_latch; + + -- DONE + stage_next <= IDLE; + when RETURN_RTPS => + done_rtps <= '1'; + ret_rtps <= rtps_return_code_latch; -- DONE stage_next <= IDLE; when ADD_SAMPLE_INFO => -- Precondition: cur_sample set - -- Input Guard - if (valid_in_rtps = '1') then - case (cnt) is - -- Status Info - when 0 => + case (cnt) is + -- SET Status Info + when 0 => + -- Input Guard + if (valid_in_rtps = '1') then -- NOTE: The PAYLOAD_FLAG and KEY_HASH_FLAG are set by the RTPS Reader -- NOTE: The ALIGNED_FLAG is set by default. if actual Payload is not aligned, need to reset. sample_valid_in <= '1'; @@ -1013,8 +1039,11 @@ begin ready_in_rtps <= '1'; cnt_next <= cnt + 1; end if; - -- Timestamp 1/2 - when 1 => + end if; + -- SET Timestamp 1/2 + when 1 => + -- Input Guard + if (valid_in_rtps = '1') then sample_valid_in <= '1'; sample_addr <= cur_sample + SMF_TIMESTAMP_OFFSET; sample_write_data <= data_in_rtps; @@ -1025,8 +1054,11 @@ begin ready_in_rtps <= '1'; cnt_next <= cnt + 1; end if; - -- Timestamp 2/2 - when 2 => + end if; + -- SET Timestamp 2/2 + when 2 => + -- Input Guard + if (valid_in_rtps = '1') then sample_valid_in <= '1'; sample_addr <= cur_sample + SMF_TIMESTAMP_OFFSET + 1; sample_write_data <= data_in_rtps; @@ -1045,16 +1077,19 @@ begin -- last read sample. -- Timestamp is smaller than highest last read (Or is Invalid) - if (tmp_dw /= TIME_INVALID or tmp_dw < last_read_ts) then + if (tmp_dw = TIME_INVALID or (tmp_dw /= TIME_INVALID and tmp_dw < last_read_ts)) then -- Drop Sample - return_code_latch_next <= OK; - stage_next <= SKIP_AND_RETURN; - cnt_next <= 0; + rtps_return_code_latch_next <= OK; + stage_next <= SKIP_AND_RETURN; + cnt_next <= 0; end if; end if; end if; - -- Lifespan Deadline 1/2 - when 3 => + end if; + -- SET Lifespan Deadline 1/2 + when 3 => + -- Input Guard + if (valid_in_rtps = '1') then sample_valid_in <= '1'; sample_addr <= cur_sample + SMF_LIFESPAN_DEADLINE_OFFSET; sample_write_data <= data_in_rtps; @@ -1065,8 +1100,11 @@ begin ready_in_rtps <= '1'; cnt_next <= cnt + 1; end if; - -- Lifespan Deadline 2/2 - when 4 => + end if; + -- SET Lifespan Deadline 2/2 + when 4 => + -- Input Guard + if (valid_in_rtps = '1') then sample_valid_in <= '1'; sample_addr <= cur_sample + SMF_LIFESPAN_DEADLINE_OFFSET + 1; sample_write_data <= data_in_rtps; @@ -1082,92 +1120,112 @@ begin cnt_next <= cnt + 1; end if; end if; - -- Key Hash 1/4 - when 5 => + end if; + -- Key Hash 1/4 + when 5 => + -- Input Guard + if (valid_in_rtps = '1') then + ready_in_rtps <= '1'; -- Latch Input, but do not pass to Memory key_hash_next(0) <= data_in_rtps; cnt_next <= cnt + 1; - -- Key Hash 2/4 - when 6 => + end if; + -- Key Hash 2/4 + when 6 => + -- Input Guard + if (valid_in_rtps = '1') then + ready_in_rtps <= '1'; -- Latch Input, but do not pass to Memory key_hash_next(1) <= data_in_rtps; cnt_next <= cnt + 1; - -- Key Hash 3/4 - when 7 => + end if; + -- Key Hash 3/4 + when 7 => + -- Input Guard + if (valid_in_rtps = '1') then + ready_in_rtps <= '1'; -- Latch Input, but do not pass to Memory key_hash_next(2) <= data_in_rtps; cnt_next <= cnt + 1; - -- Key Hash 4/4 - when 8 => + end if; + -- Key Hash 4/4 + when 8 => + -- Input Guard + if (valid_in_rtps = '1') then + ready_in_rtps <= '1'; -- Latch Input, but do not pass to Memory key_hash_next(3) <= data_in_rtps; cnt_next <= cnt + 1; - -- Writer Endpoint Position - when 9 => + end if; + -- Writer Endpoint Position + when 9 => + -- Input Guard + if (valid_in_rtps = '1') then + ready_in_rtps <= '1'; -- Latch Input, but do not pass to Memory writer_pos_next <= to_integer(unsigned(data_in_rtps)); cnt_next <= cnt + 1; - -- Payload Address - when 10 => - assert (empty_payload_list_head /= PAYLOAD_MEMORY_MAX_ADDRESS) severity FAILURE; - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_PAYLOAD_ADDR_OFFSET; - if (has_data = '1') then - -- Store Payload Address - sample_write_data <= std_logic_vector(resize(empty_payload_list_head, WORD_WIDTH)); - - cur_payload_next <= empty_payload_list_head; + end if; + -- SET Payload Address + when 10 => + assert (empty_payload_list_head /= PAYLOAD_MEMORY_MAX_ADDRESS) severity FAILURE; + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_PAYLOAD_ADDR_OFFSET; + if (has_data = '1') then + -- Store Payload Address + sample_write_data <= std_logic_vector(resize(empty_payload_list_head, WORD_WIDTH)); + + cur_payload_next <= empty_payload_list_head; + else + -- Mark Sample with no Payload + sample_write_data <= std_logic_vector(resize(PAYLOAD_MEMORY_MAX_ADDRESS, WORD_WIDTH)); + end if; + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + -- If Key Hash is available, start the Instance Search first + if (WITH_KEY and has_key_hash = '1') then + stage_next <= INITIATE_INSTANCE_SEARCH; + -- Key Hash Needs to be Calculated + elsif (WITH_KEY and has_key_hash = '0') then + cnt_next <= cnt + 1; + elsif (has_data = '1') then + assert (not WITH_KEY) severity FAILURE; + stage_next <= ADD_PAYLOAD; + cnt_next <= 0; + cnt2_next <= 1; + else -- has_data = '0' + assert (not WITH_KEY) severity FAILURE; + stage_next <= FILTER_STAGE; + end if; + end if; + -- Initiate KH Operation + when 11 => + -- Synthesis Guard + if (WITH_KEY) then + start_kh <= '1'; + -- Payload is Serialized Key + if (has_data = '0') then + opcode_kh <= PUSH_SERIALIZED_KEY; else - -- Mark Sample with no Payload - sample_write_data <= std_logic_vector(resize(PAYLOAD_MEMORY_MAX_ADDRESS, WORD_WIDTH)); + opcode_kh <= PUSH_DATA; end if; - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - -- If Key Hash is available, start the Instance Search first - if (WITH_KEY and has_key_hash = '1') then - stage_next <= INITIATE_INSTANCE_SEARCH; - -- Key Hash Needs to be Calculated - elsif (WITH_KEY and has_key_hash = '0') then - cnt_next <= cnt + 1; - elsif (has_data = '1') then - assert (not WITH_KEY) severity FAILURE; + if (ack_kh = '1') then + -- Payload is Serialized Key + if (has_data = '0') then + stage_next <= ADD_PAYLOAD; + cnt_next <= 1; + else stage_next <= ADD_PAYLOAD; cnt_next <= 0; cnt2_next <= 1; - else -- has_data = '0' - assert (not WITH_KEY) severity FAILURE; - stage_next <= FILTER_STAGE; end if; end if; - -- Initiate KH Operation - when 11 => - -- Synthesis Guard - if (WITH_KEY) then - start_kh <= '1'; - -- Payload is Serialized Key - if (has_data = '0') then - opcode_kh <= PUSH_SERIALIZED_KEY; - else - opcode_kh <= PUSH_DATA; - end if; - - if (ack_kh = '1') then - -- Payload is Serialized Key - if (has_data = '0') then - stage_next <= ADD_PAYLOAD; - cnt_next <= 1; - else - stage_next <= ADD_PAYLOAD; - cnt_next <= 0; - cnt2_next <= 1; - end if; - end if; - end if; - when others => - null; - end case; - end if; + end if; + when others => + null; + end case; when ADD_PAYLOAD => -- Precondition (if has_data = '1'): cur_payload set (Current Slot) @@ -1295,7 +1353,7 @@ begin -- No Empty Payload Slots available if (resize(unsigned(payload_read_data),PAYLOAD_MEMORY_ADDR_WIDTH) = PAYLOAD_MEMORY_MAX_ADDRESS) then -- Reject Change - return_code_latch_next <= REJECTED; + rtps_return_code_latch_next <= REJECTED; stage_next <= SKIP_AND_RETURN; cnt_next <= 0; -- Abort Key Hash Generation @@ -1401,7 +1459,7 @@ begin end if; end if; when FILTER_STAGE => - -- Precondition: cur_sample set + -- Precondition: cur_sample set, inst_data set (IMF_IGNORE_DEADLINE_FLAG, IMF_SAMPLE_CNT_FLAG) -- Wait for Instance Search to finish if (not WITH_KEY or inst_op_done = '1') then @@ -1426,10 +1484,10 @@ begin stage_next <= IDLE; -- Update Sample Reject Status status_sig_next <= status_sig and SAMPLE_REJECTED_STATUS; - sample_rej_cnt_next <= sample_rej_cnt + 1; - sample_rej_cnt_change_next <= sample_rej_cnt_change + 1; - sample_rej_last_reason_next <= REJECTED_BY_SAMPLES_PER_INSTANCE_LIMIT; - sample_rej_last_inst_next <= key_hash; + sample_rej_cnt_next <= sample_rej_cnt + 1; + sample_rej_cnt_change_next <= sample_rej_cnt_change + 1; + sample_rej_last_reason_next <= REJECTED_BY_SAMPLES_PER_INSTANCE_LIMIT; + sample_rej_last_inst_next <= key_hash; else -- Accept Change (Remove Oldest Instance Sample) remove_oldest_inst_sample_next <= '1'; @@ -1446,10 +1504,10 @@ begin stage_next <= IDLE; -- Update Sample Reject Status status_sig_next <= status_sig and SAMPLE_REJECTED_STATUS; - sample_rej_cnt_next <= sample_rej_cnt + 1; - sample_rej_cnt_change_next <= sample_rej_cnt_change + 1; - sample_rej_last_reason_next <= REJECTED_BY_SAMPLES_LIMIT; - sample_rej_last_inst_next <= key_hash; + sample_rej_cnt_next <= sample_rej_cnt + 1; + sample_rej_cnt_change_next <= sample_rej_cnt_change + 1; + sample_rej_last_reason_next <= REJECTED_BY_SAMPLES_LIMIT; + sample_rej_last_inst_next <= key_hash; else -- Accept Change (Remove Oldest Sample) remove_oldest_sample_next <= '1'; @@ -1468,8 +1526,8 @@ begin cur_inst_next <= inst_empty_head; -- Only Insert Sample/Instance if Instance is ALIVE - if (sample_status_info(SSI_DISPOSED_FLAG) /= '1' and sample_status_info(SSI_UNREGISTERED_FLAG) /= '1' and sample_status_info(SSI_FILTERED_FLAG) /= '1') then - -- NOTE: Ignore Sample if Sample unregisters/disposes an instance that we do not have + if (sample_status_info(SSI_DISPOSED_FLAG) = '1' or sample_status_info(SSI_UNREGISTERED_FLAG) = '1' or sample_status_info(SSI_FILTERED_FLAG) = '1') then + -- NOTE: Ignore Sample if Sample unregisters/disposes an instance that we do not know -- Drop Change done_rtps <= '1'; ret_rtps <= OK; @@ -1484,10 +1542,10 @@ begin stage_next <= IDLE; -- Update Sample Reject Status status_sig_next <= status_sig and SAMPLE_REJECTED_STATUS; - sample_rej_cnt_next <= sample_rej_cnt + 1; - sample_rej_cnt_change_next <= sample_rej_cnt_change + 1; - sample_rej_last_reason_next <= REJECTED_BY_SAMPLES_LIMIT; - sample_rej_last_inst_next <= key_hash; + sample_rej_cnt_next <= sample_rej_cnt + 1; + sample_rej_cnt_change_next <= sample_rej_cnt_change + 1; + sample_rej_last_reason_next <= REJECTED_BY_SAMPLES_LIMIT; + sample_rej_last_inst_next <= key_hash; else -- RESOURCE_LIMITS_QOS (MAX_INSTANCES) (Instance Memory Full) if (inst_empty_head = INSTANCE_MEMORY_MAX_ADDRESS) then @@ -1500,10 +1558,10 @@ begin stage_next <= IDLE; -- Update Sample Reject Status status_sig_next <= status_sig and SAMPLE_REJECTED_STATUS; - sample_rej_cnt_next <= sample_rej_cnt + 1; - sample_rej_cnt_change_next <= sample_rej_cnt_change + 1; - sample_rej_last_reason_next <= REJECTED_BY_INSTANCES_LIMIT; - sample_rej_last_inst_next <= key_hash; + sample_rej_cnt_next <= sample_rej_cnt + 1; + sample_rej_cnt_change_next <= sample_rej_cnt_change + 1; + sample_rej_last_reason_next <= REJECTED_BY_INSTANCES_LIMIT; + sample_rej_last_inst_next <= key_hash; else -- Accept Change (Remove Oldest Sample) remove_oldest_sample_next <= '1'; @@ -1559,27 +1617,15 @@ begin sample_rej_last_reason_next <= REJECTED_BY_INSTANCES_LIMIT; sample_rej_last_inst_next <= key_hash; else - -- Accept Change done_rtps <= '1'; ret_rtps <= OK; - -- Insert New Instance - inst_op_start <= '1'; - inst_opcode <= INSERT_INSTANCE; - status_info_update <= (ISI_LIVELINESS_FLAG => '1', others => '0'); - sample_cnt <= to_unsigned(1, WORD_WIDTH); - deadline <= (time + TIME_BASED_FILTER_QOS) when (TIME_BASED_FILTER_QOS /= DURATION_ZERO) else TIME_INVALID; - tmp_bitmap := (others => '0'); - tmp_bitmap(writer_pos) := '1'; - writer_bitmap <= to_writer_bitmap_array(tmp_bitmap); - - if (has_data = '1') then - stage_next <= FINALIZE_PAYLOAD; - cnt_next <= 0; - else - stage_next <= PRE_SAMPLE_FINALIZE; - cnt_next <= 0; - end if; + -- Remove Stale Instance and Insert Instance + inst_op_start <= '1'; + inst_opcode <= GET_FIRST_INSTANCE; + inst_mem_fields <= IMF_SAMPLE_CNT_FLAG or IMF_WRITER_BITMAP_FLAG; + stage_next <= REMOVE_STALE_INSTANCE; + cnt_next <= 0; end if; else -- Accept Change @@ -1608,10 +1654,14 @@ begin end if; end if; when UPDATE_INSTANCE => + -- Precondition inst_data set (IMF_STATUS_FLAG, IMF_WRITER_BITMAP_FLAG, IMF_DISPOSED_CNT_FLAG, IMF_NO_WRITERS_CNT_FLAG, IMF_SAMPLE_CNT_FLAG, IMF_IGNORE_DEADLINE_FLAG) + + -- Mark if Sample is stored in memory + tmp_bool := TRUE; + -- Memory Operation Guard if (not WITH_KEY or inst_op_done = '1') then - -- DEFAULT - -- STATUS INFO (LIVELINESS) + -- DEFAULT STATUS INFO (LIVELINESS) if (WITH_KEY) then tmp_update := IMF_STATUS_FLAG; status_info_update <= inst_data.status_info; @@ -1620,87 +1670,11 @@ begin inst_data_next2.status_info(ISI_LIVELINESS_FLAG) <= '1'; end if; - - -- Instance DISPOSED - if (sample_status_info(SSI_DISPOSED_FLAG) = '1') then - -- ALIVE -> NOT_ALIVE_DISPOSED Transition - if (inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) /= '1' and inst_data.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) /= '1') then - -- STATUS INFO (INSTANCE STATE) - -- Synthesis Guard - if (WITH_KEY) then - status_info_update(ISI_NOT_ALIVE_DISPOSED_FLAG) <= '1'; - else - inst_data_next2.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) <= '1'; - end if; - end if; - -- Instance UNREGISTERED - elsif (sample_status_info(SSI_UNREGISTERED_FLAG) = '1') then - -- WRITER BITMAP - -- Convert Writer Bitmap to SLV - tmp_bitmap := from_writer_bitmap_array(inst_data.writer_bitmap); - -- Remove Writer - tmp_bitmap(writer_pos) := '0'; - - -- Convert Back - -- Synthesis Guard - if (WITH_KEY) then - writer_bitmap <= to_writer_bitmap_array(tmp_bitmap); - tmp_update := tmp_update or IMF_WRITER_BITMAP_FLAG; - else - inst_data_next2.writer_bitmap <= to_writer_bitmap_array(tmp_bitmap); - end if; - - -- ALIVE -> NOT_ALIVE_NO_WRITERS Transition - if (inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) /= '1' and inst_data.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) /= '1' and tmp_bitmap = (tmp_bitmap'range => '0')) then - -- STATUS INFO (INSTANCE STATE) - -- Synthesis Guard - if (WITH_KEY) then - status_info_update(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '1'; - else - inst_data_next2.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '1'; - end if; - end if; - -- Instance ALIVE/FILTERED - else - -- STATUS INFO - -- Synthesis Guard - if (WITH_KEY) then - status_info_update(ISI_NOT_ALIVE_DISPOSED_FLAG) <= '0'; - status_info_update(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '0'; - else - inst_data_next2.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) <= '0'; - inst_data_next2.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '0'; - end if; - - - -- GENERATION COUNTERS / VIEW STATE - -- NOT_ALIVE_DISPOSED -> ALIVE Transition - if (inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) = '1') then - -- Synthesis Guard - if (WITH_KEY) then - tmp_update := tmp_update or IMF_DISPOSED_CNT_FLAG; - gen_cnt <= inst_data.disposed_gen_cnt + 1; - status_info_update(ISI_VIEW_FLAG) <= '0'; - else - inst_data_next2.disposed_gen_cnt <= inst_data.disposed_gen_cnt + 1; - inst_data_next2.status_info(ISI_VIEW_FLAG) <= '0'; - end if; - -- NOT_ALIVE_NO_WRITERS -> ALIVE Transition - elsif (inst_data.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) = '1') then - -- Synthesis Guard - if (WITH_KEY) then - tmp_update := tmp_update or IMF_NO_WRITERS_CNT_FLAG; - gen_cnt <= inst_data.no_writers_gen_cnt + 1; - status_info_update(ISI_VIEW_FLAG) <= '0'; - else - inst_data_next2.no_writers_gen_cnt <= inst_data.no_writers_gen_cnt + 1; - inst_data_next2.status_info(ISI_VIEW_FLAG) <= '0'; - end if; - end if; - - -- WRITER BITMAP - -- Convert Writer Bitmap to SLV - tmp_bitmap := from_writer_bitmap_array(inst_data.writer_bitmap); + -- *WRITER BITMAP* + -- Convert Writer Bitmap to SLV + tmp_bitmap := from_writer_bitmap_array(inst_data.writer_bitmap); + -- ALIVE/FILTERED/DISPOSE Operation + if (sample_status_info(SSI_UNREGISTERED_FLAG) /= '1') then -- Write if Writer New for Instance if (tmp_bitmap(writer_pos) /= '1') then -- Insert Writer @@ -1714,18 +1688,114 @@ begin inst_data_next2.writer_bitmap <= to_writer_bitmap_array(tmp_bitmap); end if; end if; - end if; - - -- INSTANCE SAMPLE COUNT - -- Synthesis Guard - if (WITH_KEY) then - tmp_update := tmp_update or IMF_SAMPLE_CNT_FLAG; - sample_cnt <= inst_data.sample_cnt + 1; else - inst_data_next2.sample_cnt <= inst_data.sample_cnt + 1; + -- Write if Writer New for Instance + if (tmp_bitmap(writer_pos) /= '0') then + -- Insert Writer + tmp_bitmap(writer_pos) := '0'; + -- Convert Back + -- Synthesis Guard + if (WITH_KEY) then + writer_bitmap <= to_writer_bitmap_array(tmp_bitmap); + tmp_update := tmp_update or IMF_WRITER_BITMAP_FLAG; + else + inst_data_next2.writer_bitmap <= to_writer_bitmap_array(tmp_bitmap); + end if; + end if; end if; - -- IGNORE DEADLINE + -- *GENERATION COUNTERS / VIEW STATE* + -- NOT_ALIVE_DISPOSED -> ALIVE Transition + if (sample_status_info(SSI_DISPOSED_FLAG) = '0' and sample_status_info(SSI_UNREGISTERED_FLAG) = '0' and inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) = '1') then + -- Synthesis Guard + if (WITH_KEY) then + tmp_update := tmp_update or IMF_DISPOSED_CNT_FLAG; + gen_cnt <= inst_data.disposed_gen_cnt + 1; + status_info_update(ISI_VIEW_FLAG) <= '0'; + else + inst_data_next2.disposed_gen_cnt <= inst_data.disposed_gen_cnt + 1; + inst_data_next2.status_info(ISI_VIEW_FLAG) <= '0'; + end if; + -- NOT_ALIVE_NO_WRITERS -> ALIVE Transition OR NOT_ALIVE_NO_WRITERS -> NOT_ALIVE_DISPOSED Transition + elsif (sample_status_info(SSI_UNREGISTERED_FLAG) = '0' and inst_data.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) = '1') then + -- Synthesis Guard + if (WITH_KEY) then + tmp_update := tmp_update or IMF_NO_WRITERS_CNT_FLAG; + gen_cnt <= inst_data.no_writers_gen_cnt + 1; + status_info_update(ISI_VIEW_FLAG) <= '0'; + else + inst_data_next2.no_writers_gen_cnt <= inst_data.no_writers_gen_cnt + 1; + inst_data_next2.status_info(ISI_VIEW_FLAG) <= '0'; + end if; + end if; + + -- *STATUS INFO* + -- * -> NOT_ALIVE_DISPOSED Transition + if (sample_status_info(SSI_DISPOSED_FLAG) = '1') then + -- NOT_ALIVE_DISPOSED -> NOT_ALIVE_DISPOSED + if (inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) = '1') then + tmp_bool := FALSE; + else + -- Synthesis Guard + if (WITH_KEY) then + status_info_update(ISI_NOT_ALIVE_DISPOSED_FLAG) <= '1'; + status_info_update(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '0'; + else + inst_data_next2.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) <= '1'; + inst_data_next2.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '0'; + end if; + end if; + -- * -> NOT_ALIVE_NO_WRITERS Transition + elsif (sample_status_info(SSI_UNREGISTERED_FLAG) = '1' and tmp_bitmap = (tmp_bitmap'range => '0')) then + -- NOT_ALIVE -> NOT_ALIVE_NO_WRITERS + if (inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) = '1' or inst_data.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) = '1') then + tmp_bool := FALSE; + else + -- Synthesis Guard + if (WITH_KEY) then + status_info_update(ISI_NOT_ALIVE_DISPOSED_FLAG) <= '0'; + status_info_update(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '1'; + else + inst_data_next2.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) <= '0'; + inst_data_next2.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '1'; + end if; + end if; + -- * -> ALIVE Transition + elsif (sample_status_info(SSI_UNREGISTERED_FLAG) = '0' and sample_status_info(SSI_DISPOSED_FLAG) = '0') then + -- ALIVE -> ALIVE + if (inst_data.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) /= '1' and inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) /= '1') then + -- Filtered Sample + if (sample_status_info(SSI_FILTERED_FLAG) = '1') then + tmp_bool := FALSE; + else + assert (has_data = '1') severity FAILURE; + end if; + else + -- Synthesis Guard + if (WITH_KEY) then + status_info_update(ISI_NOT_ALIVE_DISPOSED_FLAG) <= '0'; + status_info_update(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '0'; + else + inst_data_next2.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) <= '0'; + inst_data_next2.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '0'; + end if; + end if; + else + tmp_bool := FALSE; + end if; + + -- *INSTANCE SAMPLE COUNT* + if (tmp_bool) then + -- Synthesis Guard + if (WITH_KEY) then + tmp_update := tmp_update or IMF_SAMPLE_CNT_FLAG; + sample_cnt <= inst_data.sample_cnt + 1; + else + inst_data_next2.sample_cnt <= inst_data.sample_cnt + 1; + end if; + end if; + + -- *IGNORE DEADLINE* if (TIME_BASED_FILTER_QOS /= DURATION_ZERO) then -- Synthesis Guard if (WITH_KEY) then @@ -1736,23 +1806,40 @@ begin end if; end if; + -- *STALE INSTANCE COUNT* + if (tmp_bool) then + -- Synthesis Guard + if (WITH_KEY) then + -- Instance was Stale + if (inst_data.sample_cnt = 0 and inst_data.writer_bitmap = ZERO_WRITER_BITMAP_ARRAY) then + assert (stale_inst_cnt /= 0) severity FAILURE; + -- NOTE: The UPDATE_INSTANCE state is only taken if a new Sample is added to an existing Instance. + -- Since Instances with Samples are not stale, we have to unmark the Instance. + stale_inst_cnt_next <= stale_inst_cnt - 1; + end if; + end if; + else + -- Synthesis Guard + if (WITH_KEY) then + -- Stale Instance Transition + if (inst_data.sample_cnt = 0 and inst_data.writer_bitmap /= ZERO_WRITER_BITMAP_ARRAY and tmp_bitmap = (tmp_bitmap'range => '0')) then + stale_inst_cnt_next <= stale_inst_cnt + 1; + end if; + end if; + end if; + -- Synthesis Guard if (WITH_KEY) then - -- STALE INSTANCE COUNT - -- Instance was Stale - if (inst_data.sample_cnt = 0 and inst_data.writer_bitmap = ZERO_WRITER_BITMAP_ARRAY) then - assert (stale_inst_cnt /= 0) severity FAILURE; - -- NOTE: The UPDATE_INSTANCE state is only taken if a new Sample is added to an existing Instance. - -- Since Instances with Samples are not stale, we have to unmark the Instance. - stale_inst_cnt_next <= stale_inst_cnt - 1; - end if; - + -- UPDATE Instance inst_op_start <= '1'; inst_opcode <= UPDATE_INSTANCE; inst_mem_fields <= tmp_update; end if; - if (has_data = '1') then + if (not tmp_bool) then + -- DONE (Drop Sample) + stage_next <= IDLE; + elsif (has_data = '1') then stage_next <= FINALIZE_PAYLOAD; cnt_next <= 0; else @@ -1801,13 +1888,13 @@ begin null; end case; when PRE_SAMPLE_FINALIZE => - -- Precondition: cur_sample set + -- Precondition: cur_sample set, inst_data set (IMF_DISPOSED_CNT_FLAG, IMF_NO_WRITERS_CNT_FLAG) -- Wait for instance Update to Complete if (not WITH_KEY or inst_op_done = '1') then case (cnt) is - -- Disposed Generation Counter + -- SET Disposed Generation Counter when 0 => sample_valid_in <= '1'; sample_addr <= cur_sample + SMF_DISPOSED_GEN_CNT_OFFSET; @@ -1818,7 +1905,7 @@ begin if (sample_ready_in = '1') then cnt_next <= cnt + 1; end if; - -- No Writer Generation Counter + -- SET No Writer Generation Counter when 1 => sample_valid_in <= '1'; sample_addr <= cur_sample + SMF_NO_WRITERS_GEN_CNT_OFFSET; @@ -1827,28 +1914,26 @@ begin -- Memory Flow Control Guard if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - when 2 => - -- First Sample - if (newest_sample = SAMPLE_MEMORY_MAX_ADDRESS) then - stage_next <= FINALIZE_SAMPLE; - cur_sample_next <= empty_sample_list_head; - next_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; - prev_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; - cnt_next <= 0; - elsif (DESTINATION_ORDER_QOS = BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS) then - stage_next <= FIX_POINTERS; - next_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; - prev_sample_next <= newest_sample; - cur_sample_next <= newest_sample; - cnt_next <= 0; - else - stage_next <= FIND_POS; - next_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; - prev_sample_next <= newest_sample; - cur_sample_next <= newest_sample; - cnt_next <= 0; + -- First Sample + if (newest_sample = SAMPLE_MEMORY_MAX_ADDRESS) then + stage_next <= FINALIZE_SAMPLE; + cur_sample_next <= empty_sample_list_head; + next_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; + prev_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; + cnt_next <= 0; + elsif (DESTINATION_ORDER_QOS = BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS) then + stage_next <= FIX_POINTERS; + next_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; + prev_sample_next <= newest_sample; + cur_sample_next <= newest_sample; + cnt_next <= 0; + else + stage_next <= FIND_POS; + next_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; + prev_sample_next <= newest_sample; + cur_sample_next <= newest_sample; + cnt_next <= 0; + end if; end if; when others => null; @@ -2051,6 +2136,9 @@ begin -- If newest Sample is now previous, select current sample as new newest if (newest_sample = prev_sample) then newest_sample_next <= cur_sample; + if (oldest_sample = SAMPLE_MEMORY_MAX_ADDRESS) then + oldest_sample_next <= cur_sample; + end if; end if; -- Signal Data Available @@ -2062,9 +2150,14 @@ begin end if; if (WITH_KEY and remove_oldest_inst_sample = '1') then - cur_sample <= oldest_sample; - stage_next <= FIND_OLDEST_INST_SAMPLE; + assert (oldest_sample /= SAMPLE_MEMORY_MAX_ADDRESS) severity FAILURE; + + cur_sample_next <= oldest_sample; + stage_next <= FIND_OLDEST_INST_SAMPLE; + cnt_next <= 0; elsif (remove_oldest_sample = '1') then + assert (oldest_sample /= SAMPLE_MEMORY_MAX_ADDRESS) severity FAILURE; + -- Synthesis Guard if (WITH_KEY) then stage_next <= GET_OLDEST_SAMPLE_INSTANCE; @@ -2104,14 +2197,7 @@ begin -- Memory Flow Control Guard if (sample_valid_out = '1') then - -- NOTE: We have to initiate an instance "search" despite having direct access to the instance - -- in order to set up the 'previous' instance pointer required by the removal procedure - -- (Since we do not store previous pointers in the memory frame format) - inst_op_start <= '1'; - inst_opcode <= SEARCH_INSTANCE_ADDR; - inst_mem_fields <= IMF_SAMPLE_CNT_FLAG or IMF_WRITER_BITMAP_FLAG; - inst_addr_update <= resize(unsigned(sample_read_data),INSTANCE_MEMORY_ADDR_WIDTH); - + cur_inst_next <= resize(unsigned(sample_read_data),INSTANCE_MEMORY_ADDR_WIDTH); cur_sample_next <= oldest_sample; stage_next <= REMOVE_SAMPLE; cnt_next <= 0; @@ -2129,7 +2215,7 @@ begin case (cnt) is -- GET Instance Pointer when 0 => - sample_ready_in <= '1'; + sample_valid_in <= '1'; sample_addr <= cur_sample + SMF_INSTANCE_ADDR_OFFSET; sample_read <= '1'; @@ -2139,7 +2225,7 @@ begin end if; -- GET Next Sample when 1 => - sample_ready_in <= '1'; + sample_valid_in <= '1'; sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; sample_read <= '1'; @@ -2155,8 +2241,9 @@ begin if (sample_valid_out = '1') then -- Oldest Instance Sample Found if (resize(unsigned(sample_read_data),INSTANCE_MEMORY_ADDR_WIDTH) = cur_inst) then - stage_next <= REMOVE_SAMPLE; sample_abort_read <= '1'; + stage_next <= REMOVE_SAMPLE; + cnt_next <= 0; else cnt_next <= cnt + 1; end if; @@ -2175,211 +2262,228 @@ begin end case; end if; when REMOVE_SAMPLE => - -- Precondition: cur_sample set, sample_addr (Previous Pointer of cur_sample) - - -- Wait for Instance Search to finish - if (not WITH_KEY or inst_op_done = '1') then + -- Precondition: cur_sample set, cur_inst set - case (cnt) is - -- GET Previous Sample - when 0 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_PREV_ADDR_OFFSET; - sample_read <= '1'; - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- GET Next Sample - when 1 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; - sample_read <= '1'; - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- GET Payload Pointer - when 2 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_PAYLOAD_ADDR_OFFSET; - sample_read <= '1'; - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- READ Previous Sample - when 3 => - sample_ready_out <= '1'; - -- Memory Flow Control Guard - if (sample_valid_out = '1') then - prev_sample_next <= resize(unsigned(sample_read_data),SAMPLE_MEMORY_ADDR_WIDTH); + case (cnt) is + -- GET Instance Data + when 0 => + if (not WITH_KEY or (cur_inst = inst_addr_base and check_mask(current_imf, IMF_SAMPLE_CNT_FLAG or IMF_WRITER_BITMAP_FLAG))) then + cnt_next <= cnt + 1; + else + -- Memory Operation Guard + if (inst_op_done = '1') then + inst_op_start <= '1'; + inst_opcode <= GET_INSTANCE; + inst_mem_fields <= IMF_SAMPLE_CNT_FLAG or IMF_WRITER_BITMAP_FLAG; + inst_addr_update <= cur_inst; cnt_next <= cnt + 1; end if; - -- READ Next Sample - when 4 => - sample_ready_out <= '1'; - -- Memory Flow Control Guard - if (sample_valid_out = '1') then - next_sample_next <= resize(unsigned(sample_read_data),SAMPLE_MEMORY_ADDR_WIDTH); - - -- Sample Memory Full - if (empty_sample_list_head = SAMPLE_MEMORY_MAX_ADDRESS) then - empty_sample_list_head_next <= cur_sample; - empty_sample_list_tail_next <= cur_sample; - cnt_next <= cnt + 2; --Skip Next Step - else - cnt_next <= cnt + 1; - end if; - end if; - -- Next Pointer (Empty List Tail) - when 5 => - -- Add Current Sample after Empty List Tail - sample_valid_in <= '1'; - sample_addr <= empty_sample_list_tail + SMF_NEXT_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(cur_sample,WORD_WIDTH)); + end if; + -- GET Previous Sample + when 1 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_PREV_ADDR_OFFSET; + sample_read <= '1'; + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- GET Next Sample + when 2 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; + sample_read <= '1'; + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- GET Payload Pointer + when 3 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_PAYLOAD_ADDR_OFFSET; + sample_read <= '1'; + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- READ Previous Sample + when 4 => + sample_ready_out <= '1'; + -- Memory Flow Control Guard + if (sample_valid_out = '1') then + prev_sample_next <= resize(unsigned(sample_read_data),SAMPLE_MEMORY_ADDR_WIDTH); + cnt_next <= cnt + 1; + end if; + -- READ Next Sample + when 5 => + sample_ready_out <= '1'; + -- Memory Flow Control Guard + if (sample_valid_out = '1') then + next_sample_next <= resize(unsigned(sample_read_data),SAMPLE_MEMORY_ADDR_WIDTH); - -- Memory Flow Control Guard - if (sample_ready_in = '1') then + -- Sample Memory Full + if (empty_sample_list_head = SAMPLE_MEMORY_MAX_ADDRESS) then + empty_sample_list_head_next <= cur_sample; + empty_sample_list_tail_next <= cur_sample; + cnt_next <= cnt + 2; --Skip Next Step + else cnt_next <= cnt + 1; end if; - -- Next Pointer (Current Sample) - when 6 => - -- Make Current Sample Empty List Tail - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(INSTANCE_MEMORY_MAX_ADDRESS,WORD_WIDTH)); + end if; + -- SET Next Pointer (Empty List Tail) + when 6 => + -- Add Current Sample after Empty List Tail + sample_valid_in <= '1'; + sample_addr <= empty_sample_list_tail + SMF_NEXT_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(cur_sample,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- SET Next Pointer (Current Sample) + when 7 => + -- Make Current Sample Empty List Tail + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(SAMPLE_MEMORY_MAX_ADDRESS,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + -- Fix Empty List Pointers + empty_sample_list_tail_next <= cur_sample; - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - -- Fix Empty List Pointers - empty_sample_list_tail_next <= cur_sample; + -- Current Sample is Newest (Occupied List Tail) + if (next_sample = SAMPLE_MEMORY_MAX_ADDRESS) then + assert (cur_sample = newest_sample) report "Next Sample is MAX_ADDR, but cur_sample /= newest_sample" severity FAILURE; - -- Current Sample is Newest (Occupied List Tail) - if (next_sample = SAMPLE_MEMORY_MAX_ADDRESS) then - assert (cur_sample = newest_sample) report "Next Sample is MAX_ADDR, but cur_sample /= newest_sample" severity FAILURE; - - -- Fix Newest Pointer - newest_sample_next <= prev_sample; - - -- Current Sample is Oldest (List Head) - if (prev_sample = SAMPLE_MEMORY_MAX_ADDRESS) then - assert (cur_sample = oldest_sample) report "Previous Sample is MAX_ADDR, but cur_sample /= oldest_sample" severity FAILURE; - assert (newest_sample = oldest_sample) report "Previous and Next Sample is MAX_ADDR, but cur_sample /= newest_sample /= oldest_sample" severity FAILURE; - -- NOTE: Sample Memory Empty (newest_sample also set to MAX_ADDR) - - -- Fix Oldest Pointer - oldest_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; - - cnt_next <= cnt + 3; -- Skip next 2 steps - else - cnt_next <= cnt + 2; -- Skip next step - end if; - else - cnt_next <= cnt + 1; - end if; - end if; - -- Previous Address (Next Sample) - when 7 => - -- Remove link to cur_sample - sample_valid_in <= '1'; - sample_addr <= next_sample + SMF_PREV_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(prev_sample,WORD_WIDTH)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - -- Current Sample is oldest sample (List Head) + -- Fix Newest Pointer + newest_sample_next <= prev_sample; + + -- Current Sample is Oldest (List Head) if (prev_sample = SAMPLE_MEMORY_MAX_ADDRESS) then assert (cur_sample = oldest_sample) report "Previous Sample is MAX_ADDR, but cur_sample /= oldest_sample" severity FAILURE; + assert (newest_sample = oldest_sample) report "Previous and Next Sample is MAX_ADDR, but cur_sample /= newest_sample /= oldest_sample" severity FAILURE; + -- NOTE: Sample Memory Empty (newest_sample also set to MAX_ADDR) -- Fix Oldest Pointer - oldest_sample_next <= next_sample; + oldest_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; + cnt_next <= cnt + 3; -- Skip next 2 steps + else cnt_next <= cnt + 2; -- Skip next step - else - cnt_next <= cnt + 1; end if; - end if; - -- Next Address (Previous Sample) - when 8 => - -- Remove link to cur_sample - sample_valid_in <= '1'; - sample_addr <= prev_sample + SMF_NEXT_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(next_sample,WORD_WIDTH)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then + else cnt_next <= cnt + 1; end if; - -- READ Payload Pointer - when 9 => - sample_ready_out <= '1'; - - -- Memory Flow Control Guard - if (sample_valid_out = '1') then - cur_payload_next <= resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); - -- Sample has no Data - if (resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH) = PAYLOAD_MEMORY_MAX_ADDRESS) then - stage_next <= POST_SAMPLE_REMOVE; - -- Payload Memory Full - elsif (empty_payload_list_head = PAYLOAD_MEMORY_MAX_ADDRESS) then - empty_payload_list_head_next <= resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); - - stage_next <= POST_SAMPLE_REMOVE; - else - empty_payload_list_head_next <= resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); - cnt_next <= cnt + 1; - end if; - end if; - -- GET Next Payload - when 10 => - payload_valid_in <= '1'; - payload_addr <= cur_payload + PMF_NEXT_ADDR_OFFSET; - payload_read <= '1'; - - -- Memory Flow Control Guard - if (payload_ready_in = '1') then + end if; + -- SET Previous Address (Next Sample) + when 8 => + -- Remove link to cur_sample + sample_valid_in <= '1'; + sample_addr <= next_sample + SMF_PREV_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(prev_sample,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + -- Current Sample is oldest sample (List Head) + if (prev_sample = SAMPLE_MEMORY_MAX_ADDRESS) then + assert (cur_sample = oldest_sample) report "Previous Sample is MAX_ADDR, but cur_sample /= oldest_sample" severity FAILURE; + + -- Fix Oldest Pointer + oldest_sample_next <= next_sample; + + cnt_next <= cnt + 2; -- Skip next step + else cnt_next <= cnt + 1; end if; - -- READ Next Payload - when 11 => - payload_ready_out <= '1'; - - -- Memory Flow Control Guard - if (payload_valid_out = '1') then - -- Found Empty List Tail - if (resize(unsigned(payload_read_data),PAYLOAD_MEMORY_ADDR_WIDTH) = PAYLOAD_MEMORY_MAX_ADDRESS) then - cnt_next <= cnt + 1; - else - cur_payload_next <= resize(unsigned(payload_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); - cnt_next <= cnt - 1; - end if; - end if; - -- Next Payload Pointer (Last Payload of Current Sample) - when 12 => - payload_valid_in <= '1'; - payload_addr <= cur_payload + PMF_NEXT_ADDR_OFFSET; - payload_write_data <= std_logic_vector(resize(empty_payload_list_head,WORD_WIDTH)); - - -- Memory Flow Control Guard - if (payload_ready_in = '1') then + end if; + -- SET Next Address (Previous Sample) + when 9 => + -- Remove link to cur_sample + sample_valid_in <= '1'; + sample_addr <= prev_sample + SMF_NEXT_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(next_sample,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- READ Payload Pointer + when 10 => + sample_ready_out <= '1'; + + -- Memory Flow Control Guard + if (sample_valid_out = '1') then + cur_payload_next <= resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); + -- Sample has no Data + if (resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH) = PAYLOAD_MEMORY_MAX_ADDRESS) then stage_next <= POST_SAMPLE_REMOVE; + -- Payload Memory Full + elsif (empty_payload_list_head = PAYLOAD_MEMORY_MAX_ADDRESS) then + -- Fix Empty List Head + empty_payload_list_head_next <= resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); + + stage_next <= POST_SAMPLE_REMOVE; + else + -- Latch First Payload Slot for later use + first_payload_next <= resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); + cnt_next <= cnt + 1; end if; - when others => - null; - end case; - end if; + end if; + -- GET Next Payload + when 11 => + payload_valid_in <= '1'; + payload_addr <= cur_payload + PMF_NEXT_ADDR_OFFSET; + payload_read <= '1'; + + -- Memory Flow Control Guard + if (payload_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- READ Next Payload + when 12 => + payload_ready_out <= '1'; + + -- Memory Flow Control Guard + if (payload_valid_out = '1') then + -- Found Empty List Tail + if (resize(unsigned(payload_read_data),PAYLOAD_MEMORY_ADDR_WIDTH) = PAYLOAD_MEMORY_MAX_ADDRESS) then + cnt_next <= cnt + 1; + else + cur_payload_next <= resize(unsigned(payload_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); + cnt_next <= cnt - 1; + end if; + end if; + -- SET Next Payload Pointer (Last Payload of Current Sample) + when 13 => + payload_valid_in <= '1'; + payload_addr <= cur_payload + PMF_NEXT_ADDR_OFFSET; + payload_write_data <= std_logic_vector(resize(empty_payload_list_head,WORD_WIDTH)); + + -- Fix Empty List Head + empty_payload_list_head_next <= first_payload; + + -- Memory Flow Control Guard + if (payload_ready_in = '1') then + stage_next <= POST_SAMPLE_REMOVE; + end if; + when others => + null; + end case; when POST_SAMPLE_REMOVE => + -- Precondition: inst_data set (IMF_SAMPLE_CNT_FLAG, IMF_WRITER_BITMAP_FLAG) + -- Memory Operation Guard if (not WITH_KEY or inst_op_done = '1') then -- Synthesis Guard if (WITH_KEY) then -- Stale Instance Update if (inst_data.sample_cnt = 1 and inst_data.writer_bitmap = ZERO_WRITER_BITMAP_ARRAY) then - stale_inst_cnt_next <= stale_inst_cnt - 1; + stale_inst_cnt_next <= stale_inst_cnt + 1; end if; inst_op_start <= '1'; @@ -2391,6 +2495,9 @@ begin end if; if (is_take = '1') then + if (si_sample_rank_sig = 0) then + cur_inst_next <= INSTANCE_MEMORY_MAX_ADDRESS; + end if; -- Continue Processing cur_sample_next <= second_sample; stage_next <= GET_NEXT_SAMPLE; @@ -2423,7 +2530,7 @@ begin -- Return Code when 1 => done_rtps <= '1'; - ret_rtps <= return_code_latch; + ret_rtps <= rtps_return_code_latch; -- DONE stage_next <= IDLE; @@ -2440,7 +2547,9 @@ begin -- No More Instances if (inst_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then -- DONE - stage_next <= IDLE; + done_rtps <= '1'; + ret_rtps <= OK; + stage_next <= IDLE; else -- Convert Writer Bitmap to SLV tmp_bitmap := from_writer_bitmap_array(inst_data.writer_bitmap); @@ -2492,6 +2601,8 @@ begin end if; end if; when REMOVE_STALE_INSTANCE => + -- Precondition: inst_data set (IMF_SAMPLE_CNT_FLAG, IMF_WRITER_BITMAP_FLAG) + -- Synthesis Guard if (WITH_KEY) then -- Wait for Instance Data @@ -2715,8 +2826,9 @@ begin if (inst_op_done = '1') then inst_op_start <= '1'; inst_opcode <= GET_INSTANCE; - inst_mem_fields <= IMF_KEY_HASH_FLAG or IMF_STATUS_FLAG or IMF_DISPOSED_CNT_FLAG or IMF_NO_WRITERS_CNT_FLAG; + inst_mem_fields <= IMF_STATUS_FLAG; inst_addr_update <= next_inst; + cur_inst_next <= next_inst; cnt_next <= cnt + 1; end if; end if; @@ -2754,11 +2866,11 @@ begin -- Check View State case (view_state) is when NEW_VIEW_STATE => - if (inst_data.status_info(ISI_VIEW_FLAG) = '0') then + if (inst_data.status_info(ISI_VIEW_FLAG) = '1') then tmp_bool := FALSE; end if; when NOT_NEW_VIEW_STATE => - if (inst_data.status_info(ISI_VIEW_FLAG) = '1') then + if (inst_data.status_info(ISI_VIEW_FLAG) = '0') then tmp_bool := FALSE; end if; when ANY_VIEW_STATE => @@ -2840,7 +2952,7 @@ begin -- GET No Writers Generation Count when 12 => sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_STATUS_INFO_OFFSET; + sample_addr <= cur_sample + SMF_NO_WRITERS_GEN_CNT_OFFSET; sample_read <= '1'; -- Memory Control Flow Guard @@ -2892,8 +3004,10 @@ begin if (sample_valid_out = '1') then si_no_writers_generation_count_sig_next <= sample_read_data; cur_generation_rank_next <= unsigned(si_disposed_generation_count_sig) + unsigned(sample_read_data); - -- Calculate highest collection generation rank - collection_generation_rank_next <= unsigned(si_disposed_generation_count_sig) + unsigned(sample_read_data); + if (si_sample_rank_sig = 0) then + -- Reset + collection_generation_rank_next <= unsigned(si_disposed_generation_count_sig) + unsigned(sample_read_data); + end if; cnt_next <= cnt + 1; end if; -- Exit State @@ -2905,9 +3019,9 @@ begin -- Sample not marked as Read if (sample_status_info(SSI_READ_FLAG) /= '1') then -- Mark Sample as Read - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_STATUS_INFO_OFFSET; - sample_write_data <= sample_status_info; + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_STATUS_INFO_OFFSET; + sample_write_data <= sample_status_info; sample_write_data(SSI_READ_FLAG) <= '1'; -- Memory Control Flow Guard if (sample_ready_in = '1') then @@ -2947,9 +3061,9 @@ begin -- Sample not marked as Read if (sample_status_info(SSI_READ_FLAG) /= '1') then -- Mark Sample as Read - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_STATUS_INFO_OFFSET; - sample_write_data <= sample_status_info; + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_STATUS_INFO_OFFSET; + sample_write_data <= sample_status_info; sample_write_data(SSI_READ_FLAG) <= '1'; -- Memory Control Flow Guard if (sample_ready_in = '1') then @@ -3193,11 +3307,11 @@ begin -- Check View State case (view_state) is when NEW_VIEW_STATE => - if (inst_data.status_info(ISI_VIEW_FLAG) = '0') then + if (inst_data.status_info(ISI_VIEW_FLAG) = '1') then tmp_bool := FALSE; end if; when NOT_NEW_VIEW_STATE => - if (inst_data.status_info(ISI_VIEW_FLAG) = '1') then + if (inst_data.status_info(ISI_VIEW_FLAG) = '0') then tmp_bool := FALSE; end if; when ANY_VIEW_STATE => @@ -3235,9 +3349,7 @@ begin null; end case; when FINALIZE_SAMPLE_INFO => - -- Precondition: cur_inst set - - -- TODO: Explicitly get the required instance data. + -- Precondition: cur_inst set case (cnt) is -- Finalize Sample Info Data @@ -3245,9 +3357,12 @@ begin -- Wait for Instance Data if (not WITH_KEY or inst_op_done = '1') then -- Instance Data valid - if (not WITH_KEY or inst_addr_base = cur_inst) then + if (not WITH_KEY or (inst_addr_base = cur_inst and check_mask(current_imf,IMF_STATUS_FLAG or IMF_KEY_HASH_FLAG or IMF_DISPOSED_CNT_FLAG or IMF_NO_WRITERS_CNT_FLAG))) then + done_dds <= '1'; + return_code_dds <= RETCODE_OK; + -- Sample Info View State - if (inst_data.status_info(ISI_VIEW_FLAG) = '1') then + if (inst_data.status_info(ISI_VIEW_FLAG) = '0') then si_view_state_sig_next <= NEW_VIEW_STATE; else si_view_state_sig_next <= NOT_NEW_VIEW_STATE; @@ -3270,7 +3385,7 @@ begin -- Sample Info Absolut Generation Rank -- XXX: Possible Worst Case Path (2 32-bit Operations in same clock) - si_absolute_generation_count_sig_next <= (inst_data.disposed_gen_cnt + inst_data.no_writers_gen_cnt) - cur_generation_rank; + si_absolute_generation_rank_sig_next <= (inst_data.disposed_gen_cnt + inst_data.no_writers_gen_cnt) - cur_generation_rank; -- Sample Info Valid Data if (cur_payload /= PAYLOAD_MEMORY_MAX_ADDRESS) then @@ -3279,6 +3394,11 @@ begin si_valid_data_sig_next <= '0'; end if; + -- Collection End + if (collection_cnt = max_samples_latch or second_sample = SAMPLE_MEMORY_MAX_ADDRESS or (si_sample_rank_sig = 0 and single_instance = '1')) then + si_last_sig_next <= '1'; + end if; + si_valid_sig_next <= '1'; cnt_next <= 1; else @@ -3291,9 +3411,6 @@ begin end if; -- Present Data when 1 => - -- Invalidate Data - si_valid_sig_next <= '0'; - -- Synthesis Guard if (DESTINATION_ORDER_QOS = BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS) then -- Update Last Read Timestamp @@ -3307,10 +3424,12 @@ begin -- Sample Data Request if (get_data_dds = '1') then - stage_next <= GET_PAYLOAD; - cnt_next <= 0; + stage_next <= GET_PAYLOAD; + cnt_next <= 0; else cnt_next <= 2; + -- Invalidate Data + si_valid_sig_next <= '0'; end if; -- Post-Present Data when 2 => @@ -3320,7 +3439,7 @@ begin -- mark the instances we have already handled, in order to prevent the GET_NEXT_SAMPLE state to -- re-process them. -- Last Sample of Instance in Collection - if (si_sample_rank_sig = 1) then + if (si_sample_rank_sig = 0) then -- Synthesis Guard if (WITH_KEY) then inst_op_start <= '1'; @@ -3331,7 +3450,7 @@ begin -- Consecutive Instance Sample Order of multiple Instances if ((not ORDERED_ACCESS or PRESENTATION_QOS = INSTANCE_PRESENTATION_QOS) and single_instance = '0' and single_sample = '0') then -- Completed Collection - if (collection_cnt = max_samples_latch) then + if (si_last_sig = '1') then -- Unmark Instances unmark_instances_flag_next <= '1'; else @@ -3341,65 +3460,45 @@ begin end if; -- Instance is NOT_VIEWED and sample is from last generation of Instance - if (inst_data.status_info(ISI_VIEW_FLAG) = '0' and si_absolute_generation_count_sig = 0) then + if (inst_data.status_info(ISI_VIEW_FLAG) = '0' and si_absolute_generation_rank_sig = 0) then -- Mark Instance as VIEWED status_info_update(ISI_VIEW_FLAG) <= '1'; end if; else -- Instance is NOT_VIEWED and sample is from last generation of Instance - if (inst_data.status_info(ISI_VIEW_FLAG) = '0' and si_absolute_generation_count_sig = 0) then + if (inst_data.status_info(ISI_VIEW_FLAG) = '0' and si_absolute_generation_rank_sig = 0) then -- Mark Instance as VIEWED inst_data_next2.status_info(ISI_VIEW_FLAG) <= '1'; end if; end if; end if; - -- Collection Completed - if (collection_cnt = max_samples_latch) then - done_dds <= '1'; - return_code_dds <= RETCODE_OK; - is_take_next <= '0'; -- Return to IDLE from REMOVE - + -- End of Collection + if (si_last_sig = '1') then if (is_take = '1') then - cur_sample_next <= first_sample; - stage_next <= REMOVE_SAMPLE; - cnt_next <= 0; + cur_sample_next <= first_sample; + stage_next <= REMOVE_SAMPLE; + cnt_next <= 0; + is_take_next <= '0'; -- Return to IDLE from REMOVE else -- DONE stage_next <= IDLE; end if; else - -- Reached End of Samples - if (next_sample = SAMPLE_MEMORY_MAX_ADDRESS) then - -- DONE - done_dds <= '1'; - return_code_dds <= RETCODE_OK; - is_take_next <= '0'; -- Return to IDLE from REMOVE - end if; - - -- cur_inst has no more samples in collection - if (si_sample_rank_sig = 0) then - -- Present only single Instance - if (single_instance = '1') then - -- DONE - done_dds <= '1'; - return_code_dds <= RETCODE_OK; - is_take_next <= '0'; -- Return to IDLE from REMOVE - else - cur_inst_next <= INSTANCE_MEMORY_MAX_ADDRESS; - end if; - end if; - if (is_take = '1') then -- Remove Sample cur_sample_next <= first_sample; stage_next <= REMOVE_SAMPLE; cnt_next <= 0; else + -- cur_inst has no more samples in collection + if (si_sample_rank_sig = 0) then + cur_inst_next <= INSTANCE_MEMORY_MAX_ADDRESS; + end if; -- Continue Processing - cur_sample <= second_sample; - stage_next <= GET_NEXT_SAMPLE; - cnt_next <= 0; + cur_sample_next <= second_sample; + stage_next <= GET_NEXT_SAMPLE; + cnt_next <= 0; end if; end if; end if; @@ -3520,14 +3619,17 @@ begin cnt3_next <= cnt3; -- Override increment else cnt3_next <= cnt3 - 1; + -- Exit Condition + if (cnt3 = 1 and cnt = 5) then + -- Exit + stage_next <= FINALIZE_SAMPLE_INFO; + cnt_next <= 2; + -- Invalidate Data + si_valid_sig_next <= '0'; + end if; end if; end if; end if; - -- Finished Reading - elsif (cnt = 5) then - assert (cnt3 = 0) severity FAILURE; - -- DONE - stage_next <= IDLE; end if; when FIND_NEXT_INSTANCE => -- Synthesis Guard @@ -3539,13 +3641,13 @@ begin -- NOTE: The Generation Counters are not used directly in this state, but will be needed by the FINALIZE_SAMPLE_INFO state. inst_op_start <= '1'; inst_opcode <= GET_FIRST_INSTANCE; - inst_mem_fields <= IMF_KEY_HASH_FLAG or IMF_STATUS_FLAG or IMF_DISPOSED_CNT_FLAG or IMF_NO_WRITERS_CNT_FLAG; + inst_mem_fields <= IMF_STATUS_FLAG or IMF_KEY_HASH_FLAG; cnt_next <= 2; when 1 => -- NOTE: The Generation Counters are not used directly in this state, but will be needed by the FINALIZE_SAMPLE_INFO state. inst_op_start <= '1'; inst_opcode <= GET_NEXT_INSTANCE; - inst_mem_fields <= IMF_KEY_HASH_FLAG or IMF_STATUS_FLAG or IMF_DISPOSED_CNT_FLAG or IMF_NO_WRITERS_CNT_FLAG; + inst_mem_fields <= IMF_STATUS_FLAG or IMF_KEY_HASH_FLAG; cnt_next <= 2; when 2 => -- Instance Found @@ -3586,11 +3688,11 @@ begin -- Check View State case (view_state) is when NEW_VIEW_STATE => - if (inst_data.status_info(ISI_VIEW_FLAG) = '0') then + if (inst_data.status_info(ISI_VIEW_FLAG) = '1') then tmp_bool := FALSE; end if; when NOT_NEW_VIEW_STATE => - if (inst_data.status_info(ISI_VIEW_FLAG) = '1') then + if (inst_data.status_info(ISI_VIEW_FLAG) = '0') then tmp_bool := FALSE; end if; when ANY_VIEW_STATE => @@ -3601,14 +3703,14 @@ begin -- Instance Passes Checks if (tmp_bool) then - cur_inst <= inst_addr_base; - stage_next <= GET_NEXT_SAMPLE; - cnt_next <= 0; + cur_inst_next <= inst_addr_base; + stage_next <= GET_NEXT_SAMPLE; + cnt_next <= 0; else -- NOTE: The Generation Counters are not used directly in this state, but will be needed by the FINALIZE_SAMPLE_INFO state. inst_op_start <= '1'; inst_opcode <= GET_NEXT_INSTANCE; - inst_mem_fields <= IMF_KEY_HASH_FLAG or IMF_STATUS_FLAG or IMF_DISPOSED_CNT_FLAG or IMF_NO_WRITERS_CNT_FLAG; + inst_mem_fields <= IMF_STATUS_FLAG or IMF_KEY_HASH_FLAG; end if; else -- DONE @@ -3631,8 +3733,8 @@ begin -- NOTE: The Generation Counters are not used directly in this state, but will be needed by the FINALIZE_SAMPLE_INFO state. inst_op_start <= '1'; inst_opcode <= SEARCH_INSTANCE_HASH; - inst_mem_fields <= IMF_KEY_HASH_FLAG or IMF_STATUS_FLAG or IMF_DISPOSED_CNT_FLAG or IMF_NO_WRITERS_CNT_FLAG; - cnt_next <= 1; + inst_mem_fields <= IMF_STATUS_FLAG; + cnt_next <= cnt + 1; when 1 => -- Instance Found if (inst_addr_base /= SAMPLE_MEMORY_MAX_ADDRESS) then @@ -3666,11 +3768,11 @@ begin -- Check View State case (view_state) is when NEW_VIEW_STATE => - if (inst_data.status_info(ISI_VIEW_FLAG) = '0') then + if (inst_data.status_info(ISI_VIEW_FLAG) = '1') then tmp_bool := FALSE; end if; when NOT_NEW_VIEW_STATE => - if (inst_data.status_info(ISI_VIEW_FLAG) = '1') then + if (inst_data.status_info(ISI_VIEW_FLAG) = '0') then tmp_bool := FALSE; end if; when ANY_VIEW_STATE => @@ -3682,9 +3784,9 @@ begin -- Instance Passes Checks if (tmp_bool) then -- Get Instance Samples - cur_inst <= inst_addr_base; - stage_next <= GET_NEXT_SAMPLE; - cnt_next <= 0; + cur_inst_next <= inst_addr_base; + stage_next <= GET_NEXT_SAMPLE; + cnt_next <= 0; else -- DONE done_dds <= '1'; @@ -4052,7 +4154,7 @@ begin null; end case; when RESET_PAYLOAD_MEMORY => - case (inst_cnt) is + case (cnt) is -- Initialize when 0 => cur_payload_next <= (others => '0'); @@ -4113,7 +4215,9 @@ begin inst_cnt2_next <= inst_cnt2; inst_data_next <= inst_data; inst_long_latch_next <= inst_long_latch; + current_imf_next <= current_imf; -- DEFAULT Unregistered + inst_abort_read <= '0'; inst_ready_out <= '0'; inst_valid_in <= '0'; inst_read <= '0'; @@ -4142,48 +4246,57 @@ begin case(inst_opcode) is when SEARCH_INSTANCE_HASH => -- Reset Data - inst_data_next <= ZERO_INSTANCE_DATA; + current_imf_next <= inst_mem_fields; + inst_data_next <= ZERO_INSTANCE_DATA; -- No Instances avialable if (inst_occupied_head = INSTANCE_MEMORY_MAX_ADDRESS) then - inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; + inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; else - inst_prev_addr_base <= INSTANCE_MEMORY_MAX_ADDRESS; - inst_addr_base_next <= inst_occupied_head; - inst_stage_next <= SEARCH_INSTANCE_HASH; - inst_cnt_next <= 0; + inst_prev_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; + inst_addr_base_next <= inst_occupied_head; + inst_stage_next <= SEARCH_INSTANCE_HASH; + inst_cnt_next <= 0; end if; when SEARCH_INSTANCE_ADDR => -- Reset Data - inst_data_next <= ZERO_INSTANCE_DATA; + current_imf_next <= inst_mem_fields; + inst_data_next <= ZERO_INSTANCE_DATA; -- No Instances avialable if (inst_occupied_head = INSTANCE_MEMORY_MAX_ADDRESS) then - inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; + inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; else - inst_prev_addr_base <= INSTANCE_MEMORY_MAX_ADDRESS; - inst_addr_base_next <= inst_occupied_head; - inst_stage_next <= SEARCH_INSTANCE_ADDR; - inst_cnt_next <= 0; + inst_prev_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; + inst_addr_base_next <= inst_occupied_head; + inst_stage_next <= SEARCH_INSTANCE_ADDR; + inst_cnt_next <= 0; end if; when INSERT_INSTANCE => -- NOTE: Since this process has no way to communicate a failed insert to the main process, it has to be made sure -- by the main process that the operation can succeed (Memory is available) assert (inst_empty_head /= INSTANCE_MEMORY_MAX_ADDRESS) report "Instance Insertion while memory Full" severity FAILURE; + -- Reset Data + current_imf_next <= (others => '1'); + inst_data_next <= ZERO_INSTANCE_DATA; + -- First Instance if (inst_occupied_head = INSTANCE_MEMORY_MAX_ADDRESS) then - inst_addr_base_next <= inst_empty_head; - inst_stage_next <= INSERT_INSTANCE; - inst_cnt_next <= 1; -- Skip first Step + inst_prev_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; + inst_next_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; + inst_addr_base_next <= inst_empty_head; + inst_stage_next <= INSERT_INSTANCE; + inst_cnt_next <= 1; -- Skip first Step + inst_occupied_head_next <= inst_empty_head; else - inst_addr_base_next <= inst_occupied_head; - inst_stage_next <= FIND_POS; - inst_cnt_next <= 0; + inst_prev_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; + inst_addr_base_next <= inst_occupied_head; + inst_stage_next <= FIND_POS; + inst_cnt_next <= 0; end if; - -- TODO: Set Instance Data - -- TODO: Fix Instance Insertion/Deletion (List Pointers) when UPDATE_INSTANCE => + current_imf_next <= current_imf or inst_mem_fields; inst_stage_next <= UPDATE_INSTANCE; if check_mask(inst_mem_fields,IMF_STATUS_FLAG) then inst_cnt_next <= 0; @@ -4203,37 +4316,25 @@ begin inst_stage_next <= IDLE; end if; when GET_FIRST_INSTANCE => - -- No Instances avialable + -- Reset + current_imf_next <= inst_mem_fields; + inst_data_next <= ZERO_INSTANCE_DATA; + + -- No Instances available if (inst_occupied_head = INSTANCE_MEMORY_MAX_ADDRESS) then - inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; + inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; else - inst_prev_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; - inst_addr_base_next <= inst_occupied_head; - -- Get Instance Data - inst_stage_next <= GET_INSTANCE_DATA; - inst_data_next <= ZERO_INSTANCE_DATA; - if check_mask(inst_mem_fields,IMF_KEY_HASH_FLAG) then - inst_cnt_next <= 0; - elsif check_mask(inst_mem_fields,IMF_STATUS_FLAG) then - inst_cnt_next <= 4; - elsif check_mask(inst_mem_fields,IMF_SAMPLE_CNT_FLAG) then - inst_cnt_next <= 5; - elsif check_mask(inst_mem_fields,IMF_DISPOSED_CNT_FLAG) then - inst_cnt_next <= 6; - elsif check_mask(inst_mem_fields,IMF_NO_WRITERS_CNT_FLAG) then - inst_cnt_next <= 7; - elsif (TIME_BASED_FILTER_QOS /= DURATION_ZERO and check_mask(inst_mem_fields,IMF_IGNORE_DEADLINE_FLAG)) then - inst_cnt_next <= 8; - elsif check_mask(inst_mem_fields,IMF_WRITER_BITMAP_FLAG) then - inst_cnt_next <= 10; - inst_cnt2_next <= 0; - else - -- DONE - inst_stage_next <= IDLE; - end if; + inst_prev_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; + inst_addr_base_next <= inst_occupied_head; + inst_stage_next <= GET_NEXT_INSTANCE; + inst_cnt_next <= 0; end if; when GET_NEXT_INSTANCE => - -- No Instances avialable + -- Reset + current_imf_next <= inst_mem_fields; + inst_data_next <= ZERO_INSTANCE_DATA; + + -- No Instances available if (inst_next_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; else @@ -4243,13 +4344,23 @@ begin inst_cnt_next <= 0; end if; when REMOVE_INSTANCE => + -- Reset + current_imf_next <= (others => '0'); + inst_data_next <= ZERO_INSTANCE_DATA; + inst_stage_next <= REMOVE_INSTANCE; inst_cnt_next <= 0; when GET_INSTANCE => inst_addr_base_next <= inst_addr_update; + if (inst_addr_base /= inst_addr_update) then + -- Reset + current_imf_next <= inst_mem_fields; + inst_data_next <= ZERO_INSTANCE_DATA; + else + current_imf_next <= current_imf or inst_mem_fields; + end if; -- Get Instance Data - inst_stage_next <= GET_INSTANCE_DATA; - inst_data_next <= ZERO_INSTANCE_DATA; + inst_stage_next <= GET_INSTANCE_DATA; if check_mask(inst_mem_fields,IMF_KEY_HASH_FLAG) then inst_cnt_next <= 0; elsif check_mask(inst_mem_fields,IMF_STATUS_FLAG) then @@ -4272,6 +4383,10 @@ begin when UNMARK_INSTANCES => -- Empty Memory Guard if (inst_occupied_head /= INSTANCE_MEMORY_MAX_ADDRESS) then + -- Reset + inst_data_next <= ZERO_INSTANCE_DATA; + current_imf_next <= (others => '0'); + inst_addr_base_next <= inst_occupied_head; inst_stage_next <= UNMARK_INSTANCES; inst_cnt_next <= 0; @@ -4350,6 +4465,7 @@ begin if (inst_valid_out = '1') then -- No Match if (inst_read_data /= inst_latch_data.key_hash(0)) then + inst_abort_read <= '1'; -- Reached List Tail, No Match if (inst_next_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; --No match @@ -4360,7 +4476,6 @@ begin inst_prev_addr_base_next <= inst_addr_base; inst_addr_base_next <= inst_next_addr_base; inst_cnt_next <= 0; - inst_abort_read <= '1'; end if; else inst_cnt_next <= inst_cnt + 1; @@ -4374,6 +4489,7 @@ begin if (inst_valid_out = '1') then -- No Match if (inst_read_data /= inst_latch_data.key_hash(1)) then + inst_abort_read <= '1'; -- Reached List Tail, No Match if (inst_next_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; --No match @@ -4384,7 +4500,6 @@ begin inst_prev_addr_base_next <= inst_addr_base; inst_addr_base_next <= inst_next_addr_base; inst_cnt_next <= 0; - inst_abort_read <= '1'; end if; else inst_cnt_next <= inst_cnt + 1; @@ -4398,6 +4513,7 @@ begin if (inst_valid_out = '1') then -- No Match if (inst_read_data /= inst_latch_data.key_hash(2)) then + inst_abort_read <= '1'; -- Reached List Tail, No Match if (inst_next_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; --No match @@ -4408,7 +4524,6 @@ begin inst_prev_addr_base_next <= inst_addr_base; inst_addr_base_next <= inst_next_addr_base; inst_cnt_next <= 0; - inst_abort_read <= '1'; end if; else inst_cnt_next <= inst_cnt + 1; @@ -4432,12 +4547,10 @@ begin inst_prev_addr_base_next <= inst_addr_base; inst_addr_base_next <= inst_next_addr_base; inst_cnt_next <= 0; - inst_abort_read <= '1'; end if; else -- Get Instance Data inst_stage_next <= GET_INSTANCE_DATA; - inst_data_next <= ZERO_INSTANCE_DATA; if check_mask(inst_latch_data.field_flags,IMF_KEY_HASH_FLAG) then inst_cnt_next <= 0; elsif check_mask(inst_latch_data.field_flags,IMF_STATUS_FLAG) then @@ -4488,7 +4601,6 @@ begin if (resize(unsigned(inst_read_data),INSTANCE_MEMORY_ADDR_WIDTH) = inst_latch_data.addr) then -- Get Instance Data inst_stage_next <= GET_INSTANCE_DATA; - inst_data_next <= ZERO_INSTANCE_DATA; if check_mask(inst_latch_data.field_flags,IMF_KEY_HASH_FLAG) then inst_cnt_next <= 0; elsif check_mask(inst_latch_data.field_flags,IMF_STATUS_FLAG) then @@ -4545,7 +4657,6 @@ begin inst_next_addr_base_next <= resize(unsigned(inst_read_data),INSTANCE_MEMORY_ADDR_WIDTH); -- Get Instance Data inst_stage_next <= GET_INSTANCE_DATA; - inst_data_next <= ZERO_INSTANCE_DATA; if check_mask(inst_latch_data.field_flags,IMF_KEY_HASH_FLAG) then inst_cnt_next <= 0; elsif check_mask(inst_latch_data.field_flags,IMF_STATUS_FLAG) then @@ -5048,7 +5159,7 @@ begin -- Memory Flow Control Guard if (inst_valid_out = '1') then inst_next_addr_base_next <= resize(unsigned(inst_read_data),INSTANCE_MEMORY_ADDR_WIDTH); - inst_cnt_next <= inst_cnt + 1; + inst_cnt_next <= inst_cnt + 1; end if; -- READ Key Hash 1/4 when 6 => @@ -5224,7 +5335,7 @@ begin -- Precondition: inst_addr_base set, inst_prev_addr_base set (Only if first Step executed), inst_next_addr_base set case (inst_cnt) is - -- Next Pointer (Previous Instance) + -- SET Next Pointer (Previous Instance) when 0 => inst_valid_in <= '1'; inst_addr <= inst_prev_addr_base + IMF_NEXT_ADDR_OFFSET; @@ -5242,14 +5353,9 @@ begin -- Memory Flow Control Guard if (inst_ready_in = '1') then - -- Insert to Occupied List Head - if (inst_prev_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then - inst_cnt_next <= inst_cnt + 2; - else - inst_cnt_next <= inst_cnt + 1; - end if; + inst_cnt_next <= inst_cnt + 1; end if; - -- Next Pointer (New Instance) + -- SET Next Pointer (New Instance) when 2 => inst_valid_in <= '1'; inst_addr <= inst_addr_base + IMF_NEXT_ADDR_OFFSET; @@ -5275,6 +5381,7 @@ begin inst_valid_in <= '1'; inst_addr <= inst_addr_base + IMF_KEY_HASH_OFFSET; inst_write_data <= inst_latch_data.key_hash(0); + inst_data_next.key_hash(0) <= inst_latch_data.key_hash(0); -- Memory Flow Control Guard if (inst_ready_in = '1') then @@ -5285,6 +5392,7 @@ begin inst_valid_in <= '1'; inst_addr <= inst_addr_base + IMF_KEY_HASH_OFFSET + 1; inst_write_data <= inst_latch_data.key_hash(1); + inst_data_next.key_hash(1) <= inst_latch_data.key_hash(1); -- Memory Flow Control Guard if (inst_ready_in = '1') then @@ -5295,6 +5403,7 @@ begin inst_valid_in <= '1'; inst_addr <= inst_addr_base + IMF_KEY_HASH_OFFSET + 2; inst_write_data <= inst_latch_data.key_hash(2); + inst_data_next.key_hash(2) <= inst_latch_data.key_hash(2); -- Memory Flow Control Guard if (inst_ready_in = '1') then @@ -5305,6 +5414,7 @@ begin inst_valid_in <= '1'; inst_addr <= inst_addr_base + IMF_KEY_HASH_OFFSET + 3; inst_write_data <= inst_latch_data.key_hash(3); + inst_data_next.key_hash(3) <= inst_latch_data.key_hash(3); -- Memory Flow Control Guard if (inst_ready_in = '1') then @@ -5315,6 +5425,7 @@ begin inst_valid_in <= '1'; inst_addr <= inst_addr_base + IMF_STATUS_INFO_OFFSET; inst_write_data <= inst_latch_data.status_info; + inst_data_next.status_info <= inst_latch_data.status_info; -- Memory Flow Control Guard if (inst_ready_in = '1') then @@ -5325,6 +5436,7 @@ begin inst_valid_in <= '1'; inst_addr <= inst_addr_base + IMF_SAMPLE_CNT_OFFSET; inst_write_data <= std_logic_vector(inst_latch_data.sample_cnt); + inst_data_next.sample_cnt <= inst_latch_data.sample_cnt; -- Memory Flow Control Guard if (inst_ready_in = '1') then @@ -5335,6 +5447,7 @@ begin inst_valid_in <= '1'; inst_addr <= inst_addr_base + IMF_DISPOSED_GEN_CNT_OFFSET; inst_write_data <= (others => '0'); + inst_data_next.disposed_gen_cnt <= (others => '0'); -- Memory Flow Control Guard if (inst_ready_in = '1') then @@ -5345,6 +5458,7 @@ begin inst_valid_in <= '1'; inst_addr <= inst_addr_base + IMF_NO_WRITERS_GEN_CNT_OFFSET; inst_write_data <= (others => '0'); + inst_data_next.no_writers_gen_cnt <= (others => '0'); -- Memory Flow Control Guard if (inst_ready_in = '1') then @@ -5363,6 +5477,7 @@ begin inst_valid_in <= '1'; inst_addr <= inst_addr_base + IMF_IGNORE_DEADLINE_OFFSET; inst_write_data <= std_logic_vector(inst_latch_data.deadline(0)); + inst_data_next.ignore_deadline(0) <= inst_latch_data.deadline(0); -- Memory Flow Control Guard if (inst_ready_in = '1') then @@ -5376,6 +5491,7 @@ begin inst_valid_in <= '1'; inst_addr <= inst_addr_base + IMF_IGNORE_DEADLINE_OFFSET + 1; inst_write_data <= std_logic_vector(inst_latch_data.deadline(1)); + inst_data_next.ignore_deadline(1) <= inst_latch_data.deadline(1); -- Memory Flow Control Guard if (inst_ready_in = '1') then @@ -5389,6 +5505,7 @@ begin inst_valid_in <= '1'; inst_addr <= inst_addr_base + IMF_WRITER_BITMAP_OFFSET + inst_cnt2; inst_write_data <= inst_latch_data.writer_bitmap(inst_cnt2); + inst_data_next.writer_bitmap <= inst_latch_data.writer_bitmap; -- Memory Flow Control Guard if (inst_ready_in = '1') then @@ -5560,9 +5677,20 @@ begin -- Memory Flow Control Guard if (inst_valid_out = '1') then inst_next_addr_base_next <= resize(unsigned(inst_read_data),INSTANCE_MEMORY_ADDR_WIDTH); - inst_cnt_next <= inst_cnt + 1; + + -- Removed Instance is List Head + if (inst_prev_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then + assert (inst_addr_base = inst_occupied_head) severity FAILURE; + + -- Fix Occupied Head + inst_occupied_head_next <= resize(unsigned(inst_read_data),INSTANCE_MEMORY_ADDR_WIDTH); + + inst_cnt_next <= inst_cnt + 2; -- Skip Next Step + else + inst_cnt_next <= inst_cnt + 1; + end if; end if; - -- Next Pointer (Previous Instance) + -- SET Next Pointer (Previous Instance) when 2 => -- Point Previous instance to Next Instance (Remove current Instance from inbetween) inst_valid_in <= '1'; @@ -5573,7 +5701,7 @@ begin if (inst_ready_in = '1') then inst_cnt_next <= inst_cnt + 1; end if; - -- Next Pointer (Current/Removed Instance) + -- SET Next Pointer (Current/Removed Instance) when 3 => -- Point Current Instance to Empty List Head (Make Removed Instance Head of the Empty List) inst_valid_in <= '1'; @@ -5586,7 +5714,6 @@ begin inst_empty_head_next <= inst_addr_base; -- Reset - inst_data_next <= ZERO_INSTANCE_DATA; inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; -- DONE @@ -5647,8 +5774,8 @@ begin inst_stage_next <= IDLE; else -- Continue - inst_addr_base <= inst_next_addr_base; - inst_cnt_next <= 0; + inst_addr_base_next <= inst_next_addr_base; + inst_cnt_next <= 0; end if; end if; end if; @@ -5666,8 +5793,8 @@ begin inst_stage_next <= IDLE; else -- Continue - inst_addr_base <= inst_next_addr_base; - inst_cnt_next <= 0; + inst_addr_base_next <= inst_next_addr_base; + inst_cnt_next <= 0; end if; end if; when others => @@ -5715,17 +5842,9 @@ begin inst_stage <= RESET_MEMORY; newest_sample <= SAMPLE_MEMORY_MAX_ADDRESS; oldest_sample <= SAMPLE_MEMORY_MAX_ADDRESS; - sample_addr_latch_1 <= SAMPLE_MEMORY_MAX_ADDRESS; - sample_addr_latch_2 <= SAMPLE_MEMORY_MAX_ADDRESS; - sample_addr_latch_3 <= SAMPLE_MEMORY_MAX_ADDRESS; - sample_addr_latch_4 <= SAMPLE_MEMORY_MAX_ADDRESS; empty_sample_list_head <= FIRST_SAMPLE_ADDRESS; empty_sample_list_tail <= MAX_SAMPLE_ADDRESS; - payload_addr_latch_1 <= PAYLOAD_MEMORY_MAX_ADDRESS; - payload_addr_latch_2 <= PAYLOAD_MEMORY_MAX_ADDRESS; empty_payload_list_head <= FIRST_PAYLOAD_ADDRESS; - inst_addr_latch_1 <= INSTANCE_MEMORY_MAX_ADDRESS; - inst_addr_latch_2 <= INSTANCE_MEMORY_MAX_ADDRESS; inst_addr_base <= INSTANCE_MEMORY_MAX_ADDRESS; inst_occupied_head <= INSTANCE_MEMORY_MAX_ADDRESS; inst_next_addr_base <= INSTANCE_MEMORY_MAX_ADDRESS; @@ -5751,7 +5870,8 @@ begin inst_data <= ZERO_INSTANCE_DATA; inst_latch_data <= ZERO_INST_LATCH_DATA; sample_rej_last_reason <= NOT_REJECTED; - return_code_latch <= ERROR; + rtps_return_code_latch <= ERROR; + dds_return_code_latch <= RETCODE_ERROR; writer_pos <= 0; cnt <= 0; cnt2 <= 0; @@ -5764,18 +5884,28 @@ begin remove_oldest_inst_sample <= '0'; si_valid_data_sig <= '0'; si_valid_sig <= '0'; + si_last_sig <= '0'; is_take <= '0'; single_instance <= '0'; single_sample <= '0'; unmark_instances_flag <= '0'; dynamic_next_instance <= '0'; + current_imf <= (others => '0'); + sample_addr_latch_1 <= (others => '0'); + sample_addr_latch_2 <= (others => '0'); + sample_addr_latch_3 <= (others => '0'); + sample_addr_latch_4 <= (others => '0'); + payload_addr_latch_1 <= (others => '0'); + payload_addr_latch_2 <= (others => '0'); + inst_addr_latch_1 <= (others => '0'); + inst_addr_latch_2 <= (others => '0'); long_latch <= (others => '0'); sample_status_info <= (others => '0'); si_disposed_generation_count_sig <= (others => '0'); si_no_writers_generation_count_sig <= (others => '0'); si_sample_rank_sig <= (others => '0'); si_generation_rank_sig <= (others => '0'); - si_absolute_generation_count_sig <= (others => '0'); + si_absolute_generation_rank_sig <= (others => '0'); max_samples_latch <= (others => '0'); collection_cnt <= (others => '0'); collection_cnt_max <= (others => '0'); @@ -5793,17 +5923,9 @@ begin inst_stage <= inst_stage_next; newest_sample <= newest_sample_next; oldest_sample <= oldest_sample_next; - sample_addr_latch_1 <= sample_addr_latch_1_next; - sample_addr_latch_2 <= sample_addr_latch_2_next; - sample_addr_latch_3 <= sample_addr_latch_3_next; - sample_addr_latch_4 <= sample_addr_latch_4_next; - empty_sample_list_head <= empty_payload_list_head_next; + empty_sample_list_head <= empty_sample_list_head_next; empty_sample_list_tail <= empty_sample_list_tail_next; - payload_addr_latch_1 <= payload_addr_latch_1_next; - payload_addr_latch_2 <= payload_addr_latch_2_next; empty_payload_list_head <= empty_payload_list_head_next; - inst_addr_latch_1 <= inst_addr_latch_1_next; - inst_addr_latch_2 <= inst_addr_latch_2_next; inst_addr_base <= inst_addr_base_next; inst_occupied_head <= inst_occupied_head_next; inst_next_addr_base <= inst_next_addr_base_next; @@ -5829,7 +5951,8 @@ begin inst_data <= inst_data_next when WITH_KEY else inst_data_next2; inst_latch_data <= inst_latch_data_next; sample_rej_last_reason <= sample_rej_last_reason_next; - return_code_latch <= return_code_latch_next; + rtps_return_code_latch <= rtps_return_code_latch_next; + dds_return_code_latch <= dds_return_code_latch_next; writer_pos <= writer_pos_next; cnt <= cnt_next; cnt2 <= cnt2_next; @@ -5838,22 +5961,32 @@ begin inst_cnt2 <= inst_cnt2_next; stale_inst_cnt <= stale_inst_cnt_next; is_lifespan_check <= is_lifespan_check_next; - remove_oldest_sample <= remove_oldest_inst_sample_next; + remove_oldest_sample <= remove_oldest_sample_next; remove_oldest_inst_sample <= remove_oldest_inst_sample_next; si_valid_data_sig <= si_valid_data_sig_next; - si_valid_sig <= si_valid_data_sig_next; + si_valid_sig <= si_valid_sig_next; + si_last_sig <= si_last_sig_next; is_take <= is_take_next; single_instance <= single_instance_next; single_sample <= single_sample_next; unmark_instances_flag <= unmark_instances_flag_next; dynamic_next_instance <= dynamic_next_instance_next; + current_imf <= current_imf_next; + sample_addr_latch_1 <= sample_addr_latch_1_next; + sample_addr_latch_2 <= sample_addr_latch_2_next; + sample_addr_latch_3 <= sample_addr_latch_3_next; + sample_addr_latch_4 <= sample_addr_latch_4_next; + payload_addr_latch_1 <= payload_addr_latch_1_next; + payload_addr_latch_2 <= payload_addr_latch_2_next; + inst_addr_latch_1 <= inst_addr_latch_1_next; + inst_addr_latch_2 <= inst_addr_latch_2_next; long_latch <= long_latch_next; sample_status_info <= sample_status_info_next; si_disposed_generation_count_sig <= si_disposed_generation_count_sig_next; si_no_writers_generation_count_sig <= si_no_writers_generation_count_sig_next; si_sample_rank_sig <= si_sample_rank_sig_next; si_generation_rank_sig <= si_generation_rank_sig_next; - si_absolute_generation_count_sig <= si_absolute_generation_count_sig_next; + si_absolute_generation_rank_sig <= si_absolute_generation_rank_sig_next; max_samples_latch <= max_samples_latch_next; collection_cnt <= collection_cnt_next; collection_cnt_max <= collection_cnt_max_next; diff --git a/src/dds_writer.vhd b/src/dds_writer.vhd index 6bbc50f..788d7d5 100644 --- a/src/dds_writer.vhd +++ b/src/dds_writer.vhd @@ -84,7 +84,7 @@ architecture arch of dds_writer is --*****CONSTANT DECLARATION***** -- *SAMPLE MEMORY* - -- 4-Byte Word Size of a Remote Endpoint Entry in Memory + -- 4-Byte Word Size of a Sample Info Entry in Memory function gen_frame_size(lifespan : DURATION_TYPE; WITH_KEY : boolean) return natural is variable ret : natural := 0; begin @@ -123,7 +123,7 @@ architecture arch of dds_writer is constant FIRST_PAYLOAD_ADDRESS : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) := (others => '0'); -- *INSTANCE MEMORY* - -- 4-Byte Word Size of a Remote Endpoint Entry in Memory + -- 4-Byte Word Size of a Instance Entry in Memory constant INSTANCE_FRAME_SIZE : natural := 8; -- Instance Memory Size in 4-Byte Words constant INSTANCE_MEMORY_SIZE : natural := to_integer(unsigned(MAX_INSTANCES)) * INSTANCE_FRAME_SIZE; @@ -149,14 +149,14 @@ architecture arch of dds_writer is return ret; end function; constant SMF_PAYLOAD_ADDR_OFFSET : natural := gen_smf_payload_addr_offset(LIFESPAN_QOS); - function gen_smf_instance_addr_offset(WITH_KEY : boolean) return natural is + constant SMF_INSTANCE_ADDR_OFFSET : natural := SMF_PAYLOAD_ADDR_OFFSET + 1; + function gen_smf_prev_addr_offset(WITH_KEY : boolean) return natural is variable ret : natural := 0; begin - ret := (SMF_PAYLOAD_ADDR_OFFSET + 1) when WITH_KEY else SMF_PAYLOAD_ADDR_OFFSET; + ret := (SMF_INSTANCE_ADDR_OFFSET + 1) when WITH_KEY else SMF_INSTANCE_ADDR_OFFSET; return ret; end function; - constant SMF_INSTANCE_ADDR_OFFSET : natural := gen_smf_instance_addr_offset(WITH_KEY); - constant SMF_PREV_ADDR_OFFSET : natural := SMF_INSTANCE_ADDR_OFFSET + 1; + constant SMF_PREV_ADDR_OFFSET : natural := gen_smf_prev_addr_offset(WITH_KEY); constant SMF_NEXT_ADDR_OFFSET : natural := SMF_PREV_ADDR_OFFSET + 1; -- *PAYLOAD MEMORY FRAME FORMAT* @@ -416,8 +416,6 @@ architecture arch of dds_writer is signal inst_data, inst_data_next, inst_data_next2 : INSTANCE_DATA_TYPE := ZERO_INSTANCE_DATA; -- General Purpose Counter signal inst_cnt, inst_cnt_next : natural range 0 to 13 := 0; - -- Counter used to read/write the Writer Bitmap - signal inst_cnt2, inst_cnt2_next : natural range 0 to ENDPOINT_BITMAP_ARRAY_TYPE'length := 0; -- General Purpose Long Latch signal inst_long_latch, inst_long_latch_next : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := (others => '0'); @@ -569,8 +567,6 @@ begin -- RESET_PAYLOAD_MEMORY Reset Payload Memory to Empty State parse_a_prc : process (all) variable tmp_dw : DOUBLE_WORD_ARRAY := (others => (others => '0')); - variable tmp_bitmap : std_logic_vector(0 to ENDPOINT_BITMAP_WIDTH-1) := (others => '0'); - variable tmp_update : std_logic_vector(0 to IMF_FLAG_WIDTH-1) := (others => '0'); variable tmp_bool : boolean := FALSE; begin -- DEFAULT Registered @@ -903,7 +899,7 @@ begin if (global_ack_cnt /= 0) then - -- Accept Change (Remove Oldest ACKed Sample) + -- Remove Oldest ACKed Sample remove_oldest_sample_next <= '1'; remove_ack_sample_next <= '1'; @@ -958,7 +954,7 @@ begin ack_dds <= '0'; if (global_ack_cnt /= 0) then - -- Accept Change (Remove Oldest ACKed Sample) + -- Remove Oldest ACKed Sample remove_oldest_sample_next <= '1'; remove_ack_sample_next <= '1'; @@ -1013,7 +1009,7 @@ begin ack_dds <= '0'; if (global_ack_cnt /= 0) then - -- Accept Change (Remove Oldest ACKed Sample) + -- Remove Oldest ACKed Sample remove_oldest_sample_next <= '1'; remove_ack_sample_next <= '1'; @@ -2207,258 +2203,177 @@ begin when REMOVE_SAMPLE => -- Precondition: cur_sample set - -- Wait for Instance Search to finish - if (not WITH_KEY or inst_op_done = '1') then - - case (cnt) is - -- GET Status Info - when 0 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_STATUS_INFO_OFFSET; - sample_read <= '1'; + case (cnt) is + -- GET Status Info + when 0 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_STATUS_INFO_OFFSET; + sample_read <= '1'; + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- GET Previous Pointer + when 1 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_PREV_ADDR_OFFSET; + sample_read <= '1'; + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- GET Next Pointer + when 2 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; + sample_read <= '1'; + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- GET Payload Pointer + when 3 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_PAYLOAD_ADDR_OFFSET; + sample_read <= '1'; + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- READ Status Info + when 4 => + sample_ready_out <= '1'; + -- Memory Flow Control Guard + if (sample_valid_out = '1') then + -- Latch Sample Status Info (For POST_SAMPLE_REMOVE State) + sample_status_info_next <= sample_read_data; + cnt_next <= cnt + 1; + end if; + -- READ Previous Pointer + when 5 => + sample_ready_out <= '1'; + -- Memory Flow Control Guard + if (sample_valid_out = '1') then + prev_sample_next <= resize(unsigned(sample_read_data),SAMPLE_MEMORY_ADDR_WIDTH); + cnt_next <= cnt + 1; + end if; + -- READ Next Pointer + when 6 => + sample_ready_out <= '1'; + -- Memory Flow Control Guard + if (sample_valid_out = '1') then + next_sample_next <= resize(unsigned(sample_read_data),SAMPLE_MEMORY_ADDR_WIDTH); - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- GET Previous Pointer - when 1 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_PREV_ADDR_OFFSET; - sample_read <= '1'; - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- GET Next Pointer - when 2 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; - sample_read <= '1'; - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- GET Payload Pointer - when 3 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_PAYLOAD_ADDR_OFFSET; - sample_read <= '1'; - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- READ Status Info - when 4 => - sample_ready_out <= '1'; - -- Memory Flow Control Guard - if (sample_valid_out = '1') then - -- Latch Sample Status Info (For POST_SAMPLE_REMOVE State) - sample_status_info_next <= sample_read_data; - cnt_next <= cnt + 1; - end if; - -- READ Previous Pointer - when 5 => - sample_ready_out <= '1'; - -- Memory Flow Control Guard - if (sample_valid_out = '1') then - prev_sample_next <= resize(unsigned(sample_read_data),SAMPLE_MEMORY_ADDR_WIDTH); - cnt_next <= cnt + 1; - end if; - -- READ Next Pointer - when 6 => - sample_ready_out <= '1'; - -- Memory Flow Control Guard - if (sample_valid_out = '1') then - next_sample_next <= resize(unsigned(sample_read_data),SAMPLE_MEMORY_ADDR_WIDTH); - - -- Sample Memory Full - if (empty_sample_list_head = SAMPLE_MEMORY_MAX_ADDRESS) then - empty_sample_list_head_next <= cur_sample; - empty_sample_list_tail_next <= cur_sample; - cnt_next <= cnt + 2; --Skip Next Step - else - cnt_next <= cnt + 1; - end if; - end if; - -- SET Next Pointer (Empty List Tail) - when 7 => - -- Add Current Sample after Empty List Tail - sample_valid_in <= '1'; - sample_addr <= empty_sample_list_tail + SMF_NEXT_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(cur_sample,WORD_WIDTH)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- SET Next Pointer - when 8 => - -- Make Current Sample Empty List Tail - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(SAMPLE_MEMORY_MAX_ADDRESS,WORD_WIDTH)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - -- Fix Empty List Pointers + -- Sample Memory Full + if (empty_sample_list_head = SAMPLE_MEMORY_MAX_ADDRESS) then + empty_sample_list_head_next <= cur_sample; empty_sample_list_tail_next <= cur_sample; - - -- Current Sample is Newest (Occupied List Tail) - if (next_sample = SAMPLE_MEMORY_MAX_ADDRESS) then - assert (cur_sample = newest_sample) severity FAILURE; - - -- Fix Newest Pointer - newest_sample_next <= prev_sample; - - -- Current Sample is Oldest (List Head) - if (prev_sample = SAMPLE_MEMORY_MAX_ADDRESS) then - assert (cur_sample = oldest_sample) severity FAILURE; - assert (newest_sample = oldest_sample) severity FAILURE; - -- NOTE: Sample Memory Empty (newest_sample also set to MAX_ADDR) - - -- Fix Oldest Pointer - oldest_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; - - cnt_next <= cnt + 3; -- Skip next 2 steps - else - cnt_next <= cnt + 2; -- Skip next step - end if; - else - cnt_next <= cnt + 1; - end if; + cnt_next <= cnt + 2; --Skip Next Step + else + cnt_next <= cnt + 1; end if; - -- SET Previous Pointer (Next Sample) - when 9 => - -- Remove link to cur_sample - sample_valid_in <= '1'; - sample_addr <= next_sample + SMF_PREV_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(prev_sample,WORD_WIDTH)); + end if; + -- SET Next Pointer (Empty List Tail) + when 7 => + -- Add Current Sample after Empty List Tail + sample_valid_in <= '1'; + sample_addr <= empty_sample_list_tail + SMF_NEXT_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(cur_sample,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- SET Next Pointer + when 8 => + -- Make Current Sample Empty List Tail + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(SAMPLE_MEMORY_MAX_ADDRESS,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + -- Fix Empty List Pointers + empty_sample_list_tail_next <= cur_sample; - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - -- Current Sample is oldest sample (List Head) + -- Current Sample is Newest (Occupied List Tail) + if (next_sample = SAMPLE_MEMORY_MAX_ADDRESS) then + assert (cur_sample = newest_sample) severity FAILURE; + + -- Fix Newest Pointer + newest_sample_next <= prev_sample; + + -- Current Sample is Oldest (List Head) if (prev_sample = SAMPLE_MEMORY_MAX_ADDRESS) then - assert (cur_sample = oldest_sample) report "Previous Sample is MAX_ADDR, but cur_sample /= oldest_sample" severity FAILURE; + assert (cur_sample = oldest_sample) severity FAILURE; + assert (newest_sample = oldest_sample) severity FAILURE; + -- NOTE: Sample Memory Empty (newest_sample also set to MAX_ADDR) -- Fix Oldest Pointer - oldest_sample_next <= next_sample; + oldest_sample_next <= SAMPLE_MEMORY_MAX_ADDRESS; + cnt_next <= cnt + 3; -- Skip next 2 steps + else cnt_next <= cnt + 2; -- Skip next step - else - cnt_next <= cnt + 1; end if; - end if; - -- SET Next Pointer (Previous Sample) - when 10 => - -- Remove link to cur_sample - sample_valid_in <= '1'; - sample_addr <= prev_sample + SMF_NEXT_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(next_sample,WORD_WIDTH)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then + else cnt_next <= cnt + 1; end if; - -- READ Payload Pointer - when 11 => - sample_ready_out <= '1'; - - -- Memory Flow Control Guard - if (sample_valid_out = '1') then - -- Update Global Sample Count - global_sample_cnt_next <= global_sample_cnt - 1; + end if; + -- SET Previous Pointer (Next Sample) + when 9 => + -- Remove link to cur_sample + sample_valid_in <= '1'; + sample_addr <= next_sample + SMF_PREV_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(prev_sample,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + -- Current Sample is oldest sample (List Head) + if (prev_sample = SAMPLE_MEMORY_MAX_ADDRESS) then + assert (cur_sample = oldest_sample) report "Previous Sample is MAX_ADDR, but cur_sample /= oldest_sample" severity FAILURE; - -- Update Global ACK Count - -- Sample was ACKed - if (sample_status_info(SSI_ACK_FLAG) = '1') then - global_ack_cnt_next <= global_ack_cnt - 1; - end if; + -- Fix Oldest Pointer + oldest_sample_next <= next_sample; - cur_payload_next <= resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); - -- Sample has no Data - if (resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH) = PAYLOAD_MEMORY_MAX_ADDRESS) then - -- Orphan Sample Removal in progress - if (orphan_samples = '1') then - -- End of Samples - if (next_sample = SAMPLE_MEMORY_MAX_ADDRESS) then - -- DONE - orphan_samples_next <= '0'; - stage_next <= IDLE; - else - -- Continue - stage_next <= REMOVE_ORPHAN_SAMPLES; - cur_sample_next <= next_sample; - cnt_next <= 0; - end if; - else - stage_next <= POST_SAMPLE_REMOVE; - end if; - -- Payload Memory Full - elsif (empty_payload_list_head = PAYLOAD_MEMORY_MAX_ADDRESS) then - -- Fix Empty List Head - empty_payload_list_head_next <= resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); - - -- Orphan Sample Removal in progress - if (orphan_samples = '1') then - -- End of Samples - if (next_sample = SAMPLE_MEMORY_MAX_ADDRESS) then - -- DONE - orphan_samples_next <= '0'; - stage_next <= IDLE; - else - -- Continue - stage_next <= REMOVE_ORPHAN_SAMPLES; - cur_sample_next <= next_sample; - cnt_next <= 0; - end if; - else - stage_next <= POST_SAMPLE_REMOVE; - end if; - else - -- Latch First Payload Slot for later use - first_payload_next <= resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); - cnt_next <= cnt + 1; - end if; - end if; - -- GET Next Payload - when 12 => - payload_valid_in <= '1'; - payload_addr <= cur_payload + PMF_NEXT_ADDR_OFFSET; - payload_read <= '1'; - - -- Memory Flow Control Guard - if (payload_ready_in = '1') then + cnt_next <= cnt + 2; -- Skip next step + else cnt_next <= cnt + 1; end if; - -- READ Next Payload - when 13 => - payload_ready_out <= '1'; + end if; + -- SET Next Pointer (Previous Sample) + when 10 => + -- Remove link to cur_sample + sample_valid_in <= '1'; + sample_addr <= prev_sample + SMF_NEXT_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(next_sample,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- READ Payload Pointer + when 11 => + sample_ready_out <= '1'; + + -- Memory Flow Control Guard + if (sample_valid_out = '1') then + -- Update Global Sample Count + global_sample_cnt_next <= global_sample_cnt - 1; - -- Memory Flow Control Guard - if (payload_valid_out = '1') then - -- Found Empty List Tail - if (resize(unsigned(payload_read_data),PAYLOAD_MEMORY_ADDR_WIDTH) = PAYLOAD_MEMORY_MAX_ADDRESS) then - cnt_next <= cnt + 1; - else - cur_payload_next <= resize(unsigned(payload_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); - cnt_next <= cnt - 1; - end if; + -- Update Global ACK Count + -- Sample was ACKed + if (sample_status_info(SSI_ACK_FLAG) = '1') then + global_ack_cnt_next <= global_ack_cnt - 1; end if; - -- Next Payload Pointer (Last Payload of Current Sample) - when 14 => - payload_valid_in <= '1'; - payload_addr <= cur_payload + PMF_NEXT_ADDR_OFFSET; - payload_write_data <= std_logic_vector(resize(empty_payload_list_head,WORD_WIDTH)); - -- Fix Empty List Head - empty_payload_list_head_next <= first_payload; - - -- Memory Flow Control Guard - if (payload_ready_in = '1') then + cur_payload_next <= resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); + -- Sample has no Data + if (resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH) = PAYLOAD_MEMORY_MAX_ADDRESS) then -- Orphan Sample Removal in progress if (orphan_samples = '1') then -- End of Samples @@ -2475,11 +2390,88 @@ begin else stage_next <= POST_SAMPLE_REMOVE; end if; + -- Payload Memory Full + elsif (empty_payload_list_head = PAYLOAD_MEMORY_MAX_ADDRESS) then + -- Fix Empty List Head + empty_payload_list_head_next <= resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); + + -- Orphan Sample Removal in progress + if (orphan_samples = '1') then + -- End of Samples + if (next_sample = SAMPLE_MEMORY_MAX_ADDRESS) then + -- DONE + orphan_samples_next <= '0'; + stage_next <= IDLE; + else + -- Continue + stage_next <= REMOVE_ORPHAN_SAMPLES; + cur_sample_next <= next_sample; + cnt_next <= 0; + end if; + else + stage_next <= POST_SAMPLE_REMOVE; + end if; + else + -- Latch First Payload Slot for later use + first_payload_next <= resize(unsigned(sample_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); + cnt_next <= cnt + 1; end if; - when others => - null; - end case; - end if; + end if; + -- GET Next Payload + when 12 => + payload_valid_in <= '1'; + payload_addr <= cur_payload + PMF_NEXT_ADDR_OFFSET; + payload_read <= '1'; + + -- Memory Flow Control Guard + if (payload_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- READ Next Payload + when 13 => + payload_ready_out <= '1'; + + -- Memory Flow Control Guard + if (payload_valid_out = '1') then + -- Found Empty List Tail + if (resize(unsigned(payload_read_data),PAYLOAD_MEMORY_ADDR_WIDTH) = PAYLOAD_MEMORY_MAX_ADDRESS) then + cnt_next <= cnt + 1; + else + cur_payload_next <= resize(unsigned(payload_read_data),PAYLOAD_MEMORY_ADDR_WIDTH); + cnt_next <= cnt - 1; + end if; + end if; + -- SET Next Payload Pointer (Last Payload of Current Sample) + when 14 => + payload_valid_in <= '1'; + payload_addr <= cur_payload + PMF_NEXT_ADDR_OFFSET; + payload_write_data <= std_logic_vector(resize(empty_payload_list_head,WORD_WIDTH)); + + -- Fix Empty List Head + empty_payload_list_head_next <= first_payload; + + -- Memory Flow Control Guard + if (payload_ready_in = '1') then + -- Orphan Sample Removal in progress + if (orphan_samples = '1') then + -- End of Samples + if (next_sample = SAMPLE_MEMORY_MAX_ADDRESS) then + -- DONE + orphan_samples_next <= '0'; + stage_next <= IDLE; + else + -- Continue + stage_next <= REMOVE_ORPHAN_SAMPLES; + cur_sample_next <= next_sample; + cnt_next <= 0; + end if; + else + stage_next <= POST_SAMPLE_REMOVE; + end if; + end if; + when others => + null; + end case; when POST_SAMPLE_REMOVE => -- Precondition: inst_data set (Status Info, Sample Count, ACK Count) @@ -2556,7 +2548,7 @@ begin if (last_word_in_dds = '1') then stage_next <= return_stage; cnt_next <= 0; - end if; + end if; when REMOVE_STALE_INSTANCE => -- Synthesis Guard if (WITH_KEY) then @@ -3526,7 +3518,6 @@ begin inst_next_addr_base_next <= inst_next_addr_base; inst_prev_addr_base_next <= inst_prev_addr_base; inst_cnt_next <= inst_cnt; - inst_cnt2_next <= inst_cnt2; inst_data_next <= inst_data; inst_long_latch_next <= inst_long_latch; -- DEFAULT Unregistered @@ -4409,7 +4400,6 @@ begin global_ack_cnt <= 0; stale_inst_cnt <= 0; inst_cnt <= 0; - inst_cnt2 <= 0; remove_oldest_sample <= '0'; remove_oldest_inst_sample <= '0'; remove_ack_sample <= '0'; @@ -4480,7 +4470,6 @@ begin global_ack_cnt <= global_ack_cnt_next; stale_inst_cnt <= stale_inst_cnt_next; inst_cnt <= inst_cnt_next; - inst_cnt2 <= inst_cnt2_next; remove_oldest_sample <= remove_oldest_sample_next; remove_oldest_inst_sample <= remove_oldest_inst_sample_next; remove_ack_sample <= remove_ack_sample_next; diff --git a/src/rtps_builtin_endpoint.vhd b/src/rtps_builtin_endpoint.vhd index 2d0c318..64ac5cd 100644 --- a/src/rtps_builtin_endpoint.vhd +++ b/src/rtps_builtin_endpoint.vhd @@ -1768,6 +1768,8 @@ begin -- Ignore null; when PID_SENTINEL => + parameter_end_next <= (others => '1'); + -- If Processing in-line QoS until now, start processing data if(qos_flag = '1') then -- Override QoS Flag @@ -1777,7 +1779,6 @@ begin else stage_next <= CHECK_DEFAULT; end if; - when PID_LIST_END => -- TODO null; diff --git a/src/rtps_package.vhd b/src/rtps_package.vhd index 2a8ea2c..3ae6c73 100644 --- a/src/rtps_package.vhd +++ b/src/rtps_package.vhd @@ -488,6 +488,8 @@ package rtps_package is function min(L, R : DOUBLE_WORD_ARRAY) return DOUBLE_WORD_ARRAY; function max(L, R : DOUBLE_WORD_ARRAY) return DOUBLE_WORD_ARRAY; function to_integer(dw : DOUBLE_WORD_ARRAY) return integer; + function to_unsigned(input : KEY_HASH_TYPE) return unsigned; + function to_unsigned(input : GUID_TYPE) return unsigned; end package; package body rtps_package is @@ -691,4 +693,22 @@ package body rtps_package is return ret; end function; + function to_unsigned(input : KEY_HASH_TYPE) return unsigned is + variable ret : unsigned(KEY_HASH_WIDTH-1 downto 0) := (others => '0'); + begin + + for i in 0 to KEY_HASH_TYPE'length-1 loop + ret(((KEY_HASH_TYPE'length-i)*WORD_WIDTH)-1 downto (KEY_HASH_TYPE'length-1-i)*WORD_WIDTH) := unsigned(input(i)); + end loop; + return ret; + end function; + + function to_unsigned(input : GUID_TYPE) return unsigned is + variable ret : unsigned(GUID_WIDTH-1 downto 0) := (others => '0'); + begin + for i in 0 to GUID_TYPE'length-1 loop + ret(((GUID_TYPE'length-i)*WORD_WIDTH)-1 downto (GUID_TYPE'length-1-i)*WORD_WIDTH) := unsigned(input(i)); + end loop; + return ret; + end function; end package body; diff --git a/src/rtps_test_package.vhd b/src/rtps_test_package.vhd index b576280..afefcc8 100644 --- a/src/rtps_test_package.vhd +++ b/src/rtps_test_package.vhd @@ -227,7 +227,95 @@ package rtps_test_package is payload : TEST_PACKET_TYPE; end record; - constant DEFAULT_CACHE_CHANGE : CACHE_CHANGE_TYPE; -- Defeered to Package Body + constant DEFAULT_CACHE_CHANGE : CACHE_CHANGE_TYPE; -- Deferred to Package Body + + type SAMPLE_TYPE is record + inst : INSTANCE_HANDLE_TYPE; + data : TEST_PACKET_TYPE; + sstate : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0); + istate : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0); + vstate : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0); + dis_gen_cnt : natural; + no_w_gen_cnt : natural; + srank : natural; + grank : natural; + agrank : natural; + ts : TIME_TYPE; + end record; + + constant DEFAULT_SAMPLE : SAMPLE_TYPE; -- Deferred to Package Body + + type SAMPLE_ARRAY_TYPE is array (0 to 10) of SAMPLE_TYPE; + + type COLLECTION_TYPE is record + s : SAMPLE_ARRAY_TYPE; + len : natural; + end record; + + constant DEFAULT_COLLECTION : COLLECTION_TYPE; -- Deferred to Package Body + + type INSTANCE_CACHE_TYPE is record + inst : INSTANCE_HANDLE_TYPE; + istate : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0); + vstate : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0); + dis_gen_cnt : natural; + no_w_gen_cnt : natural; + end record; + + constant DEFAULT_INSTANCE_CACHE_TYPE : INSTANCE_CACHE_TYPE; -- Deferred to Package Body + + type INSTANCE_CACHE_ARRAY_TYPE is array (0 to 10) of INSTANCE_CACHE_TYPE; + + type DDS_READER_MEM_TYPE is record + s : SAMPLE_ARRAY_TYPE; + slen : natural; + inst : INSTANCE_CACHE_ARRAY_TYPE; + ilen : natural; + end record; + + constant DEFAULT_DDS_READER_MEM : DDS_READER_MEM_TYPE; -- Deferred to Package Body + + type DDS_READER_TEST_TYPE is record + opcode : DDS_READER_OPCODE_TYPE; + sstate : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0); + istate : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0); + vstate : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0); + max_samples : natural; + inst : INSTANCE_HANDLE_TYPE; + ret_code : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0); + end record; + + constant DEFAULT_DDS_READER_TEST : DDS_READER_TEST_TYPE; -- Deferred to Package Body + + type RTPS_WRITER_TEST_TYPE is record + opcode : HISTORY_CACHE_OPCODE_TYPE; + cc : CACHE_CHANGE_TYPE; + ret_code : HISTORY_CACHE_RESPONSE_TYPE; + end record; + + constant DEFAULT_RTPS_WRITER_TEST : RTPS_WRITER_TEST_TYPE; -- Deferred to Package Body + + type RTPS_READER_TEST_TYPE is record + opcode : HISTORY_CACHE_OPCODE_TYPE; + cc : CACHE_CHANGE_TYPE; + lifespan : DURATION_TYPE; + writer_pos : natural; + ret_code : HISTORY_CACHE_RESPONSE_TYPE; + end record; + + constant DEFAULT_RTPS_READER_TEST : RTPS_READER_TEST_TYPE; -- Deferred to Package Body + + type DDS_WRITER_TEST_TYPE is record + opcode : DDS_WRITER_OPCODE_TYPE; + cc : CACHE_CHANGE_TYPE; + ret_code : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0); + count : natural; + change : natural; + inst : INSTANCE_HANDLE_TYPE; + assertion : std_logic; + end record; + + constant DEFAULT_DDS_WRITER_TEST : DDS_WRITER_TEST_TYPE; -- Deferred to Package Body function test_memory_match (A,B : TEST_MEMORY_TYPE) return boolean; function to_string (input : TEST_MEMORY_TYPE) return string; @@ -276,6 +364,17 @@ package rtps_test_package is function int(n : integer; width : natural) return std_logic_vector; function to_string1 (input : std_logic_vector) return string; + --procedure add_instance(inst : inout INSTANCE_HANDLE_TYPE; mem : inout DDS_READER_MEM_TYPE); + function to_sample(cc : CACHE_CHANGE_TYPE; istate : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0)) return SAMPLE_TYPE; + procedure change_istate(inst : INSTANCE_HANDLE_TYPE; istate : in std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0); mem : inout DDS_READER_MEM_TYPE); + procedure add_sample(sample : inout SAMPLE_TYPE; mem : inout DDS_READER_MEM_TYPE; DESTINATION_ORDER_QOS : in std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0)); + procedure remove_sample(ind : in natural; mem : inout DDS_READER_MEM_TYPE); + procedure remove_inst(inst : in INSTANCE_HANDLE_TYPE; mem : inout DDS_READER_MEM_TYPE); + --function check_instance(istate : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0); vstate : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0); mem : DDS_READER_MEM_TYPE; inst : INSTANCE_HANDLE_TYPE) return boolean; + --function find_instance(mem : DDS_READER_MEM_TYPE; inst : INSTANCE_HANDLE_TYPE) return natural; + --procedure gen_collection (mem : inout DDS_READER_MEM_TYPE; col : inout COLLECTION_TYPE; inst : INSTANCE_HANDLE_TYPE; sstate : in std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0); istate : in std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0); vstate : in std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0); max_samples : in natural; remove : in boolean; sort : in boolean); + procedure gen_collection (mem : inout DDS_READER_MEM_TYPE; col : inout COLLECTION_TYPE; opcode : in DDS_READER_TEST_TYPE; PRESENTATION_QOS : in std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0); ordered : in boolean); + -- NOTE: This assume a specific sending order (Multicast before Unicast)! function get_loc (ref : PARTICIPANT_DATA_TYPE; meta : boolean) return LOCATOR_TYPE; function get_loc (ref : ENDPOINT_DATA_TYPE) return LOCATOR_TYPE; @@ -524,6 +623,74 @@ package body rtps_test_package is payload => EMPTY_TEST_PACKET ); + constant DEFAULT_SAMPLE : SAMPLE_TYPE := ( + inst => HANDLE_NIL, + data => EMPTY_TEST_PACKET, + sstate => NOT_READ_SAMPLE_STATE, + istate => ALIVE_INSTANCE_STATE, + vstate => NEW_VIEW_STATE, + dis_gen_cnt => 0, + no_w_gen_cnt => 0, + srank => 0, + grank => 0, + agrank => 0, + ts => TIME_INVALID + ); + + constant DEFAULT_COLLECTION : COLLECTION_TYPE := ( + s => (others => DEFAULT_SAMPLE), + len => 0 + ); + + constant DEFAULT_INSTANCE_CACHE_TYPE : INSTANCE_CACHE_TYPE := ( + inst => HANDLE_NIL, + istate => ALIVE_INSTANCE_STATE, + vstate => NEW_VIEW_STATE, + dis_gen_cnt => 0, + no_w_gen_cnt => 0 + ); + + constant DEFAULT_DDS_READER_MEM : DDS_READER_MEM_TYPE := ( + s => (others => DEFAULT_SAMPLE), + slen => 0, + inst => (others => DEFAULT_INSTANCE_CACHE_TYPE), + ilen => 0 + ); + + constant DEFAULT_DDS_READER_TEST : DDS_READER_TEST_TYPE := ( + opcode => NOP, + sstate => ANY_SAMPLE_STATE, + istate => ANY_INSTANCE_STATE, + vstate => ANY_VIEW_STATE, + max_samples => 1, + inst => HANDLE_NIL, + ret_code => RETCODE_OK + ); + + constant DEFAULT_RTPS_WRITER_TEST : RTPS_WRITER_TEST_TYPE := ( + opcode => NOP, + cc => DEFAULT_CACHE_CHANGE, + ret_code => OK + ); + + constant DEFAULT_RTPS_READER_TEST : RTPS_READER_TEST_TYPE := ( + opcode => NOP, + cc => DEFAULT_CACHE_CHANGE, + lifespan => DURATION_INFINITE, + writer_pos => 0, + ret_code => OK + ); + + constant DEFAULT_DDS_WRITER_TEST : DDS_WRITER_TEST_TYPE := ( + opcode => NOP, + cc => DEFAULT_CACHE_CHANGE, + ret_code => RETCODE_OK, + count => 0, + change => 0, + inst => HANDLE_NIL, + assertion => '0' + ); + -- *PACKAGE INTERNAL HELPER FUNCTIONS* procedure store_byte(in_off : in natural range 0 to 3; input : in std_logic_vector(WORD_WIDTH-1 downto 0); out_off : in natural range 0 to 3; output : inout TEST_PACKET_TYPE) is @@ -2619,4 +2786,374 @@ package body rtps_test_package is return "wr: " & to_string(input(0 to NUM_ENDPOINTS-1)) & ", last_word: " & to_string(input(NUM_ENDPOINTS)) & ", data: " & to_hstring(input(NUM_ENDPOINTS+1 to input'length-1)); end function; + procedure add_instance(inst : in INSTANCE_HANDLE_TYPE; mem : inout DDS_READER_MEM_TYPE) is + variable ind : natural := 0; + begin + -- Find Position + ind := mem.ilen; + for i in 0 to mem.ilen-1 loop + if (to_unsigned(inst) < to_unsigned(mem.inst(i).inst)) then + ind := i; + exit; + end if; + end loop; + + -- Move elements to make Space + for i in mem.ilen-1 downto ind loop + mem.inst(i+1) := mem.inst(i); + end loop; + -- Insert at desired index + mem.inst(ind) := DEFAULT_INSTANCE_CACHE_TYPE; + mem.inst(ind).inst := inst; + mem.ilen := mem.ilen + 1; + end procedure; + + function to_sample(cc : CACHE_CHANGE_TYPE; istate : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0)) return SAMPLE_TYPE is + variable ret : SAMPLE_TYPE := DEFAULT_SAMPLE; + begin + ret.inst := cc.instance; + if (not cc.serialized_key) then + ret.data := cc.payload; + end if; + ret.ts := cc.src_timestamp; + ret.istate := istate; + return ret; + end function; + + procedure change_istate(inst : in INSTANCE_HANDLE_TYPE; istate : in std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0); mem : inout DDS_READER_MEM_TYPE) is + begin + -- Check Instance State + for i in 0 to mem.ilen-1 loop + -- Instance Found + if (inst = mem.inst(i).inst) then + case (istate) is + when ALIVE_INSTANCE_STATE => + case (mem.inst(i).istate) is + when NOT_ALIVE_DISPOSED_INSTANCE_STATE => + mem.inst(i).dis_gen_cnt := mem.inst(i).dis_gen_cnt + 1; + mem.inst(i).istate := ALIVE_INSTANCE_STATE; + mem.inst(i).vstate := NEW_VIEW_STATE; + when NOT_ALIVE_NO_WRITERS_INSTANCE_STATE => + mem.inst(i).no_w_gen_cnt := mem.inst(i).no_w_gen_cnt + 1; + mem.inst(i).istate := ALIVE_INSTANCE_STATE; + mem.inst(i).vstate := NEW_VIEW_STATE; + when others => + null; + end case; + when NOT_ALIVE_DISPOSED_INSTANCE_STATE => + case (mem.inst(i).istate) is + when ALIVE_INSTANCE_STATE => + mem.inst(i).istate := NOT_ALIVE_DISPOSED_INSTANCE_STATE; + when NOT_ALIVE_NO_WRITERS_INSTANCE_STATE => + mem.inst(i).istate := NOT_ALIVE_DISPOSED_INSTANCE_STATE; + mem.inst(i).no_w_gen_cnt := mem.inst(i).no_w_gen_cnt + 1; + mem.inst(i).vstate := NEW_VIEW_STATE; + when others => + null; + end case; + when NOT_ALIVE_NO_WRITERS_INSTANCE_STATE => + case (mem.inst(i).istate) is + when ALIVE_INSTANCE_STATE => + mem.inst(i).istate := NOT_ALIVE_NO_WRITERS_INSTANCE_STATE; + when others => + null; + end case; + when others => + null; + end case; + exit; + end if; + end loop; + end procedure; + + procedure add_sample(sample : inout SAMPLE_TYPE; mem : inout DDS_READER_MEM_TYPE; DESTINATION_ORDER_QOS : in std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0)) is + variable found : boolean := FALSE; + variable ind : natural := 0; + begin + -- Zero Meta Data + sample.dis_gen_cnt := 0; + sample.no_w_gen_cnt := 0; + sample.srank := 0; + sample.grank := 0; + sample.agrank := 0; + sample.sstate := NOT_READ_SAMPLE_STATE; + + change_istate(sample.inst, sample.istate, mem); + + -- Check Instance State + for i in 0 to mem.ilen-1 loop + -- Instance Found + if (sample.inst = mem.inst(i).inst) then + found := TRUE; + sample.vstate := mem.inst(i).vstate; + sample.dis_gen_cnt := mem.inst(i).dis_gen_cnt; + sample.no_w_gen_cnt := mem.inst(i).no_w_gen_cnt; + exit; + end if; + end loop; + + -- New Instance + if (not found) then + add_instance(sample.inst, mem); + end if; + + -- Add Sample + ind := mem.slen; + case (DESTINATION_ORDER_QOS) is + when BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS => + -- Insert at End of Array + mem.s(ind) := sample; + when BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS => + -- Find Position + for i in 0 to mem.slen-1 loop + if (sample.ts > mem.s(i).ts) then + ind := i; + exit; + end if; + end loop; + + -- Move elements to make Space + for i in mem.slen-1 downto ind loop + mem.s(i+1) := mem.s(i); + end loop; + -- Insert at desired index + mem.s(ind) := sample; + when others => + assert FALSE report "Unkown DESTINATION_ORDER_QOS" severity FAILURE; + end case; + mem.slen := mem.slen + 1; + end procedure; + + procedure remove_sample(ind : in natural; mem : inout DDS_READER_MEM_TYPE) is + begin + assert (ind < mem.slen) report "Index is out of Bounds" severity FAILURE; + assert (mem.slen /= 0) report "Remove on empty array" severity FAILURE; + + -- NOTE: Assumes i+1 is in bounds + for i in ind to mem.slen-1 loop + mem.s(i) := mem.s(i+1); + end loop; + mem.slen := mem.slen - 1; + end procedure; + + procedure remove_inst(inst : in INSTANCE_HANDLE_TYPE; mem : inout DDS_READER_MEM_TYPE) is + variable ind : natural := 0; + begin + assert (mem.ilen /= 0) report "Remove on empty array" severity FAILURE; + + ind := mem.ilen; + for i in 0 to mem.ilen-1 loop + -- Instance Found + if (mem.inst(i).inst = inst) then + ind := i; + exit; + end if; + end loop; + + if (ind /= mem.ilen) then + -- NOTE: Assumes i+1 is in bounds + for i in ind to mem.ilen-1 loop + mem.inst(i) := mem.inst(i+1); + end loop; + mem.ilen := mem.ilen - 1; + end if; + end procedure; + + function check_instance(istate : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0); vstate : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0); mem : DDS_READER_MEM_TYPE; inst : INSTANCE_HANDLE_TYPE) return boolean is + begin + for i in 0 to mem.ilen-1 loop + -- Instance Found + if (inst = mem.inst(i).inst) then + if (((mem.inst(i).istate and istate) /= (istate'range => '0')) and ((mem.inst(i).vstate and vstate) /= (vstate'range => '0'))) then + return TRUE; + end if; + end if; + end loop; + return FALSE; + end function; + + function find_instance(mem : DDS_READER_MEM_TYPE; inst : INSTANCE_HANDLE_TYPE) return natural is + begin + for i in 0 to mem.ilen-1 loop + -- Instance Found + if (inst = mem.inst(i).inst) then + return i; + end if; + end loop; + assert FALSE report "Instance not in Memory" severity FAILURE; + end function; + + procedure gen_collection (mem : inout DDS_READER_MEM_TYPE; col : inout COLLECTION_TYPE; inst : INSTANCE_HANDLE_TYPE; sstate : in std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0); istate : in std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0); vstate : in std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0); max_samples : in natural; remove : in boolean; sort : in boolean) is + variable i,j : natural := 0; + variable tmp_inst : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + variable tmp_col : COLLECTION_TYPE := DEFAULT_COLLECTION; + variable rank, mrsic_gen, mrs_gen : natural := 0; + variable done : std_logic_vector(0 to max_samples-1) := (others => '0'); + variable no_inst : boolean := FALSE; + begin + col := DEFAULT_COLLECTION; + + i := 0; + loop + -- Sample is in Collection + if (((mem.s(i).sstate and sstate) /= (sstate'range => '0')) and check_instance(istate, vstate, mem, mem.s(i).inst) and ((inst /= HANDLE_NIL and inst = mem.s(i).inst) or inst = HANDLE_NIL)) then + col.s(col.len) := mem.s(i); + col.s(col.len).istate := mem.inst(find_instance(mem,mem.s(i).inst)).istate; + col.s(col.len).vstate := mem.inst(find_instance(mem,mem.s(i).inst)).vstate; + col.len := col.len + 1; + -- Change READ STATE + mem.s(i).sstate := READ_SAMPLE_STATE; + + -- Remove Sample + if (remove) then + remove_sample(i, mem); + -- NOTE: We do not increment the loop invariant + else + i := i + 1; + end if; + else + i := i + 1; + end if; + + -- Loop Exit Condition + if (i >= mem.slen or col.len >= max_samples) then + exit; + end if; + end loop; + + if (col.len = 0) then + report "Empty Collection" severity NOTE; + return; + end if; + + -- No Instances (WITH_KEY=FALSE testing) + if (col.s(0).inst = HANDLE_NIL) then + no_inst := TRUE; + end if; + + -- Sort + if (sort and not no_inst) then + i := 1; + j := 1; + tmp_inst := col.s(0).inst; + tmp_col := DEFAULT_COLLECTION; + tmp_col.len := col.len; + tmp_col.s(0):= col.s(0); + col.s(0) := DEFAULT_SAMPLE; + loop + -- Select Next Instance + if (tmp_inst = HANDLE_NIL) then + if (col.s(i).inst /= HANDLE_NIL) then + tmp_inst := col.s(i).inst; + i := 0; --Reset + end if; + elsif (col.s(i).inst = tmp_inst) then + tmp_col.s(j) := col.s(i); + col.s(i) := DEFAULT_SAMPLE; + j := j + 1; + end if; + i := i + 1; + + -- DONE + if (j >= col.len) then + col := tmp_col; + exit; + -- Reset Index + elsif (i >= col.len) then + i := 0; + tmp_inst := HANDLE_NIL; + end if; + end loop; + end if; + + -- Calculate Ranks + i := col.len-1; + tmp_inst := col.s(i).inst; + j := find_instance(mem,tmp_inst); + rank := 1; + mrs_gen := mem.inst(j).dis_gen_cnt + mem.inst(j).no_w_gen_cnt; + mrsic_gen := col.s(i).dis_gen_cnt + col.s(i).no_w_gen_cnt; + col.s(i).agrank := mrs_gen - mrsic_gen; + if (mrs_gen - mrsic_gen = 0) then + -- Change VIEW STATE + mem.inst(j).vstate := NOT_NEW_VIEW_STATE; + end if; + done(col.len-1 to done'length-1) := (others => '1'); + -- Single Sample + if (col.len-1 = 0) then + return; + else + loop + i := i - 1; + -- Select Next Instance + if (not no_inst and tmp_inst = HANDLE_NIL) then + if (done(i) = '0') then + tmp_inst := col.s(i).inst; + j := find_instance(mem, tmp_inst); + -- Reset + rank := 1; + mrs_gen := mem.inst(j).dis_gen_cnt + mem.inst(j).no_w_gen_cnt; + mrsic_gen := col.s(i).dis_gen_cnt + col.s(i).no_w_gen_cnt; + col.s(i).agrank := mrs_gen - mrsic_gen; + if (mrs_gen - mrsic_gen = 0) then + -- Change VIEW STATE + mem.inst(j).vstate := NOT_NEW_VIEW_STATE; + end if; + done(i) := '1'; + end if; + elsif (done(i) = '0' and col.s(i).inst = tmp_inst) then + col.s(i).srank := rank; + rank := rank + 1; + col.s(i).grank := mrsic_gen - (col.s(i).dis_gen_cnt + col.s(i).no_w_gen_cnt); + col.s(i).agrank := mrs_gen - (col.s(i).dis_gen_cnt + col.s(i).no_w_gen_cnt); + done(i) := '1'; + end if; + -- Exit Condition + if (done = (done'range => '1')) then + exit; + -- Reset + elsif (i = 0) then + tmp_inst := HANDLE_NIL; + i := col.len-1; + end if; + end loop; + end if; + end procedure; + + procedure gen_collection (mem : inout DDS_READER_MEM_TYPE; col : inout COLLECTION_TYPE; opcode : in DDS_READER_TEST_TYPE; PRESENTATION_QOS : in std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0); ordered : in boolean) is + variable sort : boolean := FALSE; + variable tmp_inst : INSTANCE_HANDLE_TYPE := HANDLE_NIL; + begin + col := DEFAULT_COLLECTION; + + sort := TRUE when (not ordered or PRESENTATION_QOS = INSTANCE_PRESENTATION_QOS) else FALSE; + + case (opcode.opcode) is + when READ => + gen_collection(mem, col, HANDLE_NIL, opcode.sstate, opcode.istate, opcode.vstate, opcode.max_samples, FALSE, sort); + when TAKE => + gen_collection(mem, col, HANDLE_NIL, opcode.sstate, opcode.istate, opcode.vstate, opcode.max_samples, TRUE, sort); + when READ_NEXT_SAMPLE => + gen_collection(mem, col, HANDLE_NIL, NOT_READ_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE, 1, FALSE, FALSE); + when TAKE_NEXT_SAMPLE => + gen_collection(mem, col, HANDLE_NIL, NOT_READ_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE, 1, TRUE, FALSE); + when READ_INSTANCE => + gen_collection(mem, col, opcode.inst, opcode.sstate, opcode.istate, opcode.vstate, opcode.max_samples, FALSE, sort); + when TAKE_INSTANCE => + gen_collection(mem, col, opcode.inst, opcode.sstate, opcode.istate, opcode.vstate, opcode.max_samples, TRUE, sort); + when READ_NEXT_INSTANCE => + tmp_inst := mem.inst(find_instance(mem,opcode.inst)+1).inst; + if (tmp_inst /= HANDLE_NIL) then + gen_collection(mem, col, tmp_inst, opcode.sstate, opcode.istate, opcode.vstate, opcode.max_samples, FALSE, sort); + end if; + when TAKE_NEXT_INSTANCE => + tmp_inst := mem.inst(find_instance(mem,opcode.inst)+1).inst; + if (tmp_inst /= HANDLE_NIL) then + gen_collection(mem, col, tmp_inst, opcode.sstate, opcode.istate, opcode.vstate, opcode.max_samples, TRUE, sort); + end if; + when others => + assert FALSE report "Unknown DDS Reader Operation" severity FAILURE; + end case; + end procedure; + end package body; \ No newline at end of file