Documentation Refactoring (Fix Typos)
This commit is contained in:
parent
ca80910494
commit
d537cd7460
@ -13,7 +13,7 @@ The 'GET_PAYLOAD_HEADER' stage jumps to the stage handling the first declared me
|
||||
Each stage jumps to the decode_stage of the next declared member.
|
||||
If there is no next declared member, stage 'SKIP_PAYLOAD' is selected.
|
||||
|
||||
The signal 'align_offset' keeps track of the current alignement offset (Basically byte_count mod 8).
|
||||
The signal 'align_offset' keeps track of the current alignment offset (Basically byte_count mod 8).
|
||||
|
||||
The general procedure is that the input is latched ('data_in_latch') allowing to work Byte-oriented, since
|
||||
the input is word-sized. Each time the 'align_offset' reaches b"X11" a new input word is latched.
|
||||
@ -23,10 +23,10 @@ The CDR Encodings of all types are Byte aligned.
|
||||
PRIMITIVES TYPES
|
||||
================
|
||||
|
||||
Primitive Types are directly latched into registers of equal size (name <NAME>_lach), that are
|
||||
accesible directly via a port of the same name (i.e. <NAME>).
|
||||
Primitive Types are directly latched into registers of equal size (name <NAME>_latch), that are
|
||||
accessible directly via a port of the same name (i.e. <NAME>).
|
||||
The name of the generated decode_stage is GET_<NAME>.
|
||||
The generated decode_stage first checks the alignement and aligns the stream using the 'ALIGN_STREAM' stage.
|
||||
The generated decode_stage first checks the alignment and aligns the stream using the 'ALIGN_STREAM' stage.
|
||||
* Primitive size 1
|
||||
The input is directly latched using the get_sub_vector function together with the current 'align_offset',
|
||||
1 is added to the 'align_offset', the decode_stage of the next declared member is taken, and the 'FETCH'
|
||||
@ -54,9 +54,9 @@ The generated decode_stage first checks the alignement and aligns the stream usi
|
||||
NOTE: The extra sub-stage is used to push the signal to a memory in a single operation
|
||||
|
||||
NOTE: If there is no next declared member, the last sub-stage should not call the "FETCH" stage.
|
||||
(Should be overriden by "SKIP_PAYLOAD")
|
||||
(Should be overridden by "SKIP_PAYLOAD")
|
||||
|
||||
The alignements and sizes for IDL primitive types are following:
|
||||
The alignments and sizes for IDL primitive types are following:
|
||||
|
||||
IDL TYPE SIZE ALIGNMENT [2]
|
||||
int8/uint8 1 1
|
||||
@ -88,7 +88,7 @@ BIT_BOUND PRIMITIVE [3]
|
||||
COLLECTION TYPES
|
||||
================
|
||||
|
||||
In contrast to primitive types, collection types are latched into memories of equal width and depth
|
||||
In contrast to primitive types, collection types are latched into same width memories and with a depth
|
||||
equal to the maximum length. Memory access port signals are made available to the user to allow to access
|
||||
the contents.
|
||||
|
||||
@ -101,7 +101,7 @@ Following Port signals are defined:
|
||||
NAME DIRECTION CONNECTED
|
||||
<NAME>_len out <NAME>_len_latch
|
||||
<NAME>_addr in <NAME>_mem_addr in 'IDLE' stage
|
||||
<NAME>_ready out <NAME>_mem_ready_in in 'IDLE' stage, else '0' [NOTE: ANDing for aggregated elment types (see Structures below)]
|
||||
<NAME>_ready out <NAME>_mem_ready_in in 'IDLE' stage, else '0' [NOTE: ANDing for aggregated element types (see Structures below)]
|
||||
<NAME>_ren in <NAME>_mem_read and <NAME>_mem_valid_in in 'IDLE' stage
|
||||
<NAME>_valid out <NAME>_mem_valid_out [NOTE: ANDing for aggregated element types (see Structures below)]
|
||||
<NAME>_ack in <NAME>_mem_ready_out in 'IDLE' stage
|
||||
@ -116,8 +116,8 @@ NAME DIRECTION CONNECTED
|
||||
type package. A special <NAME>_cnt counter (used to index the type specific memory) is initialized to 0.
|
||||
NOTE: It could be configured, that instead of truncating larger sequences, a decode error is triggered.
|
||||
* GET_<NAME>
|
||||
This stage is similar to the respective primitive decode_stage with following valiations:
|
||||
The <NAME>_cnt is used to set the current <NAME>_mem_addr. On sucessful latch
|
||||
This stage is similar to the respective primitive decode_stage with following variations:
|
||||
The <NAME>_cnt is used to set the current <NAME>_mem_addr. On successful latch
|
||||
(<NAME>_mem_valid_in and <NAME>_ready_in = '1') the align_offset is incremented by the
|
||||
respective size, the <NAME>_cnt is incremented, and if the current <NAME>_cnt is equal to
|
||||
<NAME>_len-1, the decode_stage of the next declared member is taken.
|
||||
@ -212,7 +212,7 @@ A new <NAME>_opt port signal is defined, that is connected to a <NAME>_opt_latch
|
||||
The previous decode_stage selects the 'GET_OPTIONAL_HEADER' decode_stage, and sets the 'return_stage'
|
||||
to the actual next decode_stage (The decode_stage of the optional member).
|
||||
The first generated decode_stage of the <NAME> (i.e. the stage that was in return_stage) checks
|
||||
the 'optional' signal before anything else (even before the alignement). If 'optional' is '0', it sets
|
||||
the 'optional' signal before anything else (even before the alignment). If 'optional' is '0', it sets
|
||||
the <NAME>_opt_latch to '0' and selects the decode_stage of the next declared member. Otherwise
|
||||
the <NAME>_opt_latch is set to '1'.
|
||||
|
||||
@ -229,7 +229,7 @@ In General the writer_interface is a similar layout to the reader_interface with
|
||||
All "GET_*" stages are renamed to "WRITE_*".
|
||||
The "FETCH" stage is renamed to "PUSH".
|
||||
'write_sub_vector' is used to write into 'data_out_latch' (instead of 'get_sub_vector' and 'data_in_latch').
|
||||
The direction of the <NAME> port signals are inverted (i.e. in).
|
||||
The direction of the <NAME> port signals are inverted.
|
||||
Instead of calling 'SKIP_PAYLOAD' stage on the last declared member, the 'PUSH' stage is explicitly called
|
||||
and the 'encode_done' and 'finalize_payload' signals are set.
|
||||
|
||||
@ -248,7 +248,7 @@ The <NAME>_len_latch is removed (Since the Length is now an input).
|
||||
The 'WRITE_<NAME>' encode_stage is divided with the help of 'cnt' into 2 sub-stages.
|
||||
The first sub-stage is responsible for requesting the value from the memory (Memory READ request).
|
||||
The second sub-stage waits until the value is valid (<NAME>_mem_valid_out) and does the usual write
|
||||
procedure. On sucessfull write the <NAME>_mem_ready_out has to be pulsed high to finalize the memory
|
||||
procedure. On successful write the <NAME>_mem_ready_out has to be pulsed high to finalize the memory
|
||||
operation.
|
||||
NOTE: If the encode_stage already is divided into sub-stages (due to the primitive type), a single
|
||||
sub-stage is added that does the Memory fetch operation, and the <NAME>_mem_ready_out is pulled high
|
||||
@ -264,7 +264,7 @@ for storing the individual sequence lengths, similar to the reader_interface.
|
||||
The memory signal connections are similar to the normal write_interface collection case, allowing the
|
||||
length to be stored when a write to the outer collection happens.
|
||||
The WRITE_<INNER_COLLECTION_NAME>_LENGTH stage has to be implemented, similar to the normal collection
|
||||
case, with a extra sub-stage for the memory fetch operation.
|
||||
case, with an extra sub-stage for the memory fetch operation.
|
||||
|
||||
|
||||
OPTIONALS
|
||||
@ -305,7 +305,7 @@ The second - taken on a 'PUSH_SERIALIZED_KEY' opcode - follows the reader_interf
|
||||
KeyHolder(<NAME>) directly.
|
||||
Since the decode_stages for the second decoding procedure are a subset of the first decoding procedure,
|
||||
the same decode stages are used, and only the 'decode_stage_next' signal is set depending on the
|
||||
'opcode_latch' signal. The 'GET_PAYLAOD_HEADER' stage selects the correct first decode stage.
|
||||
'opcode_latch' signal. The 'GET_PAYLOAD_HEADER' stage selects the correct first decode stage.
|
||||
|
||||
Similarly the encode procedure also follows 2 different encoding procedures.
|
||||
The first - taken on a 'READ_SERIALIZED_KEY' opcode - follows the write_interface procedure of the
|
||||
|
||||
@ -51,10 +51,10 @@ use work.rtps_test_package.all;
|
||||
-- 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_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE]
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE]
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE]
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN 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
|
||||
@ -377,7 +377,7 @@ begin
|
||||
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);
|
||||
pub_id <= GetAlertLogID("Publication Handle", 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);
|
||||
@ -534,7 +534,7 @@ begin
|
||||
AffirmIf(status_id,(status(0) and DATA_AVAILABLE_STATUS) = DATA_AVAILABLE_STATUS, "Expected: 1", "Received: 0");
|
||||
AffirmIf(status_id,(status(5) and DATA_AVAILABLE_STATUS) = DATA_AVAILABLE_STATUS, "Expected: 1", "Received: 0");
|
||||
|
||||
-- VAILDATE STATE
|
||||
-- VALIDATE STATE
|
||||
|
||||
Log("R0,R5: DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO);
|
||||
dds := DEFAULT_DDS_READER_TEST;
|
||||
@ -1013,7 +1013,7 @@ begin
|
||||
cc.payload := gen_payload(kh4,10);
|
||||
cc.src_timestamp := gen_duration(7 sec);
|
||||
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE]
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE]
|
||||
|
||||
Log("R0,R5: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload]", INFO);
|
||||
Log("R0,R5: REJECTED [MAX_INSTANCES exceeded]", DEBUG);
|
||||
@ -1094,7 +1094,7 @@ begin
|
||||
AffirmIf(status_id,(status(0) and DATA_AVAILABLE_STATUS) = DATA_AVAILABLE_STATUS, "Expected: 1", "Received: 0");
|
||||
AffirmIf(status_id,(status(5) and DATA_AVAILABLE_STATUS) = DATA_AVAILABLE_STATUS, "Expected: 1", "Received: 0");
|
||||
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE]
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE]
|
||||
|
||||
Log("R0,R5: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload]", INFO);
|
||||
Log("R0,R5: ACCEPTED", DEBUG);
|
||||
@ -1224,7 +1224,7 @@ begin
|
||||
cc.payload := gen_payload(kh1,10);
|
||||
cc.src_timestamp := gen_duration(8 sec);
|
||||
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE]
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE]
|
||||
|
||||
Log("R0,R5: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload]", INFO);
|
||||
Log("R0,R5: REJECTED [MAX_INSTANCES exceeded]", DEBUG);
|
||||
@ -2344,7 +2344,7 @@ begin
|
||||
cc.payload := gen_payload(kh2,10);
|
||||
cc.src_timestamp := gen_duration(25 sec);
|
||||
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE]
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE]
|
||||
|
||||
Log("R0,R5: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 0, Aligned Payload]", INFO);
|
||||
Log("R0,R5: ACCEPTED", DEBUG);
|
||||
@ -3520,7 +3520,7 @@ begin
|
||||
cc.payload := gen_payload(kh4,10);
|
||||
cc.src_timestamp := gen_duration(8 sec);
|
||||
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE]
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE, WITH EMPTY INSTANCE]
|
||||
|
||||
Log("R1,R2,R3: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload]", INFO);
|
||||
Log("R1,R2,R3: REJECTED [MAX_INSTANCES exceeded]", DEBUG);
|
||||
@ -3630,7 +3630,7 @@ begin
|
||||
AffirmIf(status_id,(status(2) and DATA_AVAILABLE_STATUS) = DATA_AVAILABLE_STATUS, "Expected: 1", "Received: 0");
|
||||
AffirmIf(status_id,(status(3) and DATA_AVAILABLE_STATUS) = DATA_AVAILABLE_STATUS, "Expected: 1", "Received: 0");
|
||||
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITH STALE INSTANCE]
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITH STALE INSTANCE]
|
||||
|
||||
Log("R1,R2,R3: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload]", INFO);
|
||||
Log("R1,R2,R3: ACCEPTED", DEBUG);
|
||||
@ -3804,7 +3804,7 @@ begin
|
||||
cc.payload := gen_payload(kh1,10);
|
||||
cc.src_timestamp := gen_duration(9 sec);
|
||||
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, WITHOUT STALE INSTANCE]
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, WITHOUT STALE INSTANCE]
|
||||
|
||||
Log("R1,R2,R3: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload]", INFO);
|
||||
Log("R1,R2,R3: REJECTED [MAX_INSTANCES exceeded]", DEBUG);
|
||||
@ -5295,7 +5295,7 @@ begin
|
||||
cc.payload := gen_payload(kh2,10);
|
||||
cc.src_timestamp := gen_duration(27 sec);
|
||||
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE]
|
||||
-- TEST: ADD SAMPLE ON MAX_INSTANCES [UNKNOWN INSTANCE, NOT_ALIVE_DISPOSED & STALE INSTANCE]
|
||||
|
||||
Log("R1,R2,R3: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 0, Aligned Payload]", INFO);
|
||||
Log("R1,R2,R3: ACCEPTED", DEBUG);
|
||||
|
||||
@ -260,7 +260,7 @@ begin
|
||||
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);
|
||||
pub_id <= GetAlertLogID("Publication Handle", 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);
|
||||
@ -538,7 +538,7 @@ begin
|
||||
-- ISTATE: I1:ALIVE, I2:ALIVE
|
||||
-- WRITER: W0:I1, W1:I2
|
||||
|
||||
-- VAILDATE STATE
|
||||
-- VALIDATE STATE
|
||||
|
||||
Log("R0,R1: DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO);
|
||||
dds := DEFAULT_DDS_READER_TEST;
|
||||
|
||||
@ -33,13 +33,13 @@ use work.rtps_test_package.all;
|
||||
-- TEST: TAKE_NEXT_SAMPLE [NO SAMPLE]
|
||||
-- TEST: TAKE_NEXT_SAMPLE
|
||||
-- TEST: READ_INSTANCE [UNKNOWN INSTANCE]
|
||||
-- TEST: READ_INSTANCE [KNOWN INSTANCE, UNCOMPATIBLE SAMPLES]
|
||||
-- TEST: READ_INSTANCE [KNOWN INSTANCE, INCOMPATIBLE SAMPLES]
|
||||
-- TEST: READ_INSTANCE [KNOWN INSTANCE, COMPATIBLE SAMPLES]
|
||||
-- TEST: READ_INSTANCE [NO SAMPLES]
|
||||
-- TEST: TAKE_INSTANCE [NO SAMPLES]
|
||||
-- TEST: TAKE_INSTANCE
|
||||
-- TEST: READ_NEXT_INSTANCE [WITH SAMPLES, WITHOUT NEXT INSTANCE]
|
||||
-- TEST: READ_NEXT_INSTANCE [WITH NEXT INSTANCE, UNCOMPATIBLE SAMPLES]
|
||||
-- TEST: READ_NEXT_INSTANCE [WITH NEXT INSTANCE, INCOMPATIBLE SAMPLES]
|
||||
-- TEST: READ_NEXT_INSTANCE [WITH NEXT INSTANCE, COMPATIBLE SAMPLES]
|
||||
-- TEST: READ_NEXT_INSTANCE [HANDLE_NIL]
|
||||
-- TEST: READ_NEXT_INSTANCE [WITH NEXT INSTANCE, WITH COMPATIBLE SAMPLE, NOT DIRECT NEXT INSTANCE]
|
||||
@ -350,7 +350,7 @@ begin
|
||||
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);
|
||||
pub_id <= GetAlertLogID("Publication Handle", 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);
|
||||
@ -1393,7 +1393,7 @@ begin
|
||||
-- VIEW: I1:NOT_NEW, I2:NOT_NEW, I3:NOT_NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W1:I2, W2:I3,I4
|
||||
|
||||
-- TEST: READ_INSTANCE [KNOWN INSTANCE, UNCOMPATIBLE SAMPLES]
|
||||
-- TEST: READ_INSTANCE [KNOWN INSTANCE, INCOMPATIBLE SAMPLES]
|
||||
|
||||
Log("R0,R1,R2,R3: DDS Operation READ_INSTANCE [MAX_SAMPLES 20, NOT_READ_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE, Instance 1]", INFO);
|
||||
dds := DEFAULT_DDS_READER_TEST;
|
||||
@ -1430,7 +1430,7 @@ begin
|
||||
-- VIEW: I1:NOT_NEW, I2:NOT_NEW, I3:NOT_NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W1:I2, W2:I3,I4
|
||||
|
||||
-- TEST: READ_NEXT_INSTANCE [WITH NEXT INSTANCE, UNCOMPATIBLE SAMPLES]
|
||||
-- TEST: READ_NEXT_INSTANCE [WITH NEXT INSTANCE, INCOMPATIBLE SAMPLES]
|
||||
|
||||
Log("R0,R1,R2,R3: DDS Operation READ_NEXT_INSTANCE [MAX_SAMPLES 20, ANY_SAMPLE_STATE, NOT_ALIVE_DISPOSED_INSTANCE_STATE, ANY_VIEW_STATE, Instance 2]", INFO);
|
||||
dds := DEFAULT_DDS_READER_TEST;
|
||||
@ -2695,7 +2695,7 @@ begin
|
||||
wait_on_sig(rtps_done);
|
||||
wait_on_idle;
|
||||
-- MEM: I4S2-(7)
|
||||
-- ISTATE: I4:DISOSED
|
||||
-- ISTATE: I4:DISPOSED
|
||||
-- VIEW: I4:NEW
|
||||
-- WRITER: W2:I4
|
||||
|
||||
@ -2727,7 +2727,7 @@ begin
|
||||
wait_on_sig(rtps_done);
|
||||
wait_on_idle;
|
||||
-- MEM: I1S1(0), I4S2-(7)
|
||||
-- ISTATE: I1:ALIVE, I4:DISOSED
|
||||
-- ISTATE: I1:ALIVE, I4:DISPOSED
|
||||
-- VIEW: I1:NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W2:I4
|
||||
|
||||
@ -2759,7 +2759,7 @@ begin
|
||||
wait_on_sig(rtps_done);
|
||||
wait_on_idle;
|
||||
-- MEM: I1S1(0), I1S2-(1), I4S2-(7)
|
||||
-- ISTATE: I1:DISPOSED, I4:DISOSED
|
||||
-- ISTATE: I1:DISPOSED, I4:DISPOSED
|
||||
-- VIEW: I1:NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W2:I4
|
||||
|
||||
@ -2791,7 +2791,7 @@ begin
|
||||
wait_on_sig(rtps_done);
|
||||
wait_on_idle;
|
||||
-- MEM: I1S1(0), I1S2-(1), I4S2-(7), I1S3(9)
|
||||
-- ISTATE: I1:ALIVE, I4:DISOSED
|
||||
-- ISTATE: I1:ALIVE, I4:DISPOSED
|
||||
-- VIEW: I1:NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W2:I4
|
||||
|
||||
@ -2823,7 +2823,7 @@ begin
|
||||
wait_on_sig(rtps_done);
|
||||
wait_on_idle;
|
||||
-- MEM: I1S1(0), I1S2-(1), I4S1(4), I4S2-(7), I1S3(9)
|
||||
-- ISTATE: I1:ALIVE, I4:DISOSED
|
||||
-- ISTATE: I1:ALIVE, I4:DISPOSED
|
||||
-- VIEW: I1:NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W2:I4
|
||||
|
||||
@ -2845,7 +2845,7 @@ begin
|
||||
wait_on_sig(dds_done);
|
||||
wait_on_idle;
|
||||
-- MEM: I1S1(0), I1S2-(1), I4S1(4), I4S2-(7), I1S3(9)
|
||||
-- ISTATE: I1:ALIVE, I4:DISOSED
|
||||
-- ISTATE: I1:ALIVE, I4:DISPOSED
|
||||
-- VIEW: I1:NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W2:I4
|
||||
|
||||
@ -2877,7 +2877,7 @@ begin
|
||||
wait_on_sig(rtps_done);
|
||||
wait_on_idle;
|
||||
-- MEM: I1S1(0), I1S2-(1), I3S1(3), I4S1(4), I4S2-(7), I1S3(9)
|
||||
-- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISOSED
|
||||
-- ISTATE: I1:ALIVE, I3:ALIVE, I4:DISPOSED
|
||||
-- VIEW: I1:NEW, I3:NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W2:I3,I4
|
||||
|
||||
@ -2909,7 +2909,7 @@ begin
|
||||
wait_on_sig(rtps_done);
|
||||
wait_on_idle;
|
||||
-- MEM: I1S1(0), I1S2-(1), I2S1(2), I3S1(3), I4S1(4), I4S2-(7), I1S3(9)
|
||||
-- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE, I4:DISOSED
|
||||
-- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE, I4:DISPOSED
|
||||
-- VIEW: I1:NEW, I2:NEW, I3:NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W2:I3,I4
|
||||
|
||||
@ -2941,7 +2941,7 @@ begin
|
||||
wait_on_sig(rtps_done);
|
||||
wait_on_idle;
|
||||
-- MEM: I1S1(0), I1S2-(1), I2S1(2), I3S1(3), I4S1(4), I2S2-(5), I4S2-(7), I1S3(9)
|
||||
-- ISTATE: I1:ALIVE, I2:DISPOSED, I3:ALIVE, I4:DISOSED
|
||||
-- ISTATE: I1:ALIVE, I2:DISPOSED, I3:ALIVE, I4:DISPOSED
|
||||
-- VIEW: I1:NEW, I2:NEW, I3:NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W2:I3,I4
|
||||
|
||||
@ -2973,7 +2973,7 @@ begin
|
||||
wait_on_sig(rtps_done);
|
||||
wait_on_idle;
|
||||
-- MEM: I1S1(0), I1S2-(1), I2S1(2), I3S1(3), I4S1(4), I2S2-(5), I3S2-(6), I4S2-(7), I1S3(9)
|
||||
-- ISTATE: I1:ALIVE, I2:DISPOSED, I3:DISPOSED, I4:DISOSED
|
||||
-- ISTATE: I1:ALIVE, I2:DISPOSED, I3:DISPOSED, I4:DISPOSED
|
||||
-- VIEW: I1:NEW, I2:NEW, I3:NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W2:I3,I4
|
||||
|
||||
@ -3069,7 +3069,7 @@ begin
|
||||
wait_on_sig(rtps_done);
|
||||
wait_on_idle;
|
||||
-- MEM: I1S1(0), I1S2-(1), I2S1(2), I3S1(3), I4S1(4), I2S2-(5), I3S2-(6), I4S2-(7), I4S3(8), I1S3(9), I2S3(10), I2S4-(11)
|
||||
-- ISTATE: I1:ALIVE, I2:DISPSOED, I3:DISPOSED, I4:ALIVE
|
||||
-- ISTATE: I1:ALIVE, I2:DISPOSED, I3:DISPOSED, I4:ALIVE
|
||||
-- VIEW: I1:NEW, I2:NEW, I3:NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W2:I3,I4
|
||||
|
||||
@ -3318,7 +3318,7 @@ begin
|
||||
-- VIEW: I1:NOT_NEW, I2:NOT_NEW, I3:NOT_NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W1:I2, W2:I3,I4
|
||||
|
||||
-- TEST: READ_INSTANCE [KNOWN INSTANCE, UNCOMPATIBLE SAMPLES]
|
||||
-- TEST: READ_INSTANCE [KNOWN INSTANCE, INCOMPATIBLE SAMPLES]
|
||||
|
||||
Log("R5: DDS Operation READ_INSTANCE [MAX_SAMPLES 20, NOT_READ_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE, Instance 1]", INFO);
|
||||
dds := DEFAULT_DDS_READER_TEST;
|
||||
@ -3340,7 +3340,7 @@ begin
|
||||
-- VIEW: I1:NOT_NEW, I2:NOT_NEW, I3:NOT_NEW, I4:NEW
|
||||
-- WRITER: W0:I1, W1:I2, W2:I3,I4
|
||||
|
||||
-- TEST: READ_NEXT_INSTANCE [WITH NEXT INSTANCE, UNCOMPATIBLE SAMPLES]
|
||||
-- TEST: READ_NEXT_INSTANCE [WITH NEXT INSTANCE, INCOMPATIBLE SAMPLES]
|
||||
|
||||
Log("R5: DDS Operation READ_NEXT_INSTANCE [MAX_SAMPLES 20, ANY_SAMPLE_STATE, NOT_ALIVE_DISPOSED_INSTANCE_STATE, ANY_VIEW_STATE, Instance 2]", INFO);
|
||||
dds := DEFAULT_DDS_READER_TEST;
|
||||
|
||||
@ -268,7 +268,7 @@ begin
|
||||
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);
|
||||
pub_id <= GetAlertLogID("Publication Handle", 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);
|
||||
|
||||
@ -240,7 +240,7 @@ begin
|
||||
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);
|
||||
pub_id <= GetAlertLogID("Publication Handle", 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);
|
||||
@ -326,7 +326,7 @@ begin
|
||||
AffirmIf(status_id,(status(0) and SAMPLE_REJECTED_STATUS) = SAMPLE_REJECTED_STATUS, "Expected: 1", "Received: 0");
|
||||
|
||||
Log("R0: DDS Operation GET_SAMPLE_REJECTED_STATUS", INFO);
|
||||
Log("R0: Expected [Count 1, Change 1, HANDLE_NIL, REJECTED_BY_PAYOAD_MEMORY_LIMIT]", DEBUG);
|
||||
Log("R0: Expected [Count 1, Change 1, HANDLE_NIL, REJECTED_BY_PAYLOAD_MEMORY_LIMIT]", DEBUG);
|
||||
dds := DEFAULT_DDS_READER_TEST;
|
||||
dds.opcode := GET_SAMPLE_REJECTED_STATUS;
|
||||
dds.ret_code := RETCODE_OK;
|
||||
@ -384,7 +384,7 @@ begin
|
||||
AffirmIf(status_id,(status(0) and SAMPLE_REJECTED_STATUS) = SAMPLE_REJECTED_STATUS, "Expected: 1", "Received: 0");
|
||||
|
||||
Log("R0: DDS Operation GET_SAMPLE_REJECTED_STATUS", INFO);
|
||||
Log("R0: Expected [Count 2, Change 1, Instance 2, REJECTED_BY_PAYOAD_MEMORY_LIMIT]", DEBUG);
|
||||
Log("R0: Expected [Count 2, Change 1, Instance 2, REJECTED_BY_PAYLOAD_MEMORY_LIMIT]", DEBUG);
|
||||
dds := DEFAULT_DDS_READER_TEST;
|
||||
dds.opcode := GET_SAMPLE_REJECTED_STATUS;
|
||||
dds.ret_code := RETCODE_OK;
|
||||
|
||||
@ -240,7 +240,7 @@ begin
|
||||
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);
|
||||
pub_id <= GetAlertLogID("Publication Handle", 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);
|
||||
|
||||
@ -240,7 +240,7 @@ begin
|
||||
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);
|
||||
pub_id <= GetAlertLogID("Publication Handle", 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);
|
||||
|
||||
@ -251,7 +251,7 @@ begin
|
||||
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);
|
||||
pub_id <= GetAlertLogID("Publication Handle", 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);
|
||||
|
||||
@ -2531,11 +2531,11 @@ begin
|
||||
rtps := DEFAULT_RTPS_WRITER_TEST;
|
||||
rtps.opcode := ACK_CACHE_CHANGE;
|
||||
rtps.cc.seq_nr := gen_sn(19);
|
||||
-- WRIITER 0
|
||||
-- WRITER 0
|
||||
ind <= 0;
|
||||
start_rtps;
|
||||
wait_on_sig(rtps_done);
|
||||
-- WRIITER 3
|
||||
-- WRITER 3
|
||||
ind <= 3;
|
||||
start_rtps;
|
||||
wait_on_sig(rtps_done);
|
||||
|
||||
@ -7,7 +7,7 @@ context osvvm.OsvvmContext;
|
||||
|
||||
use work.rtps_test_package.all;
|
||||
|
||||
-- This testbench tests the general operation of thr Memory Controler.
|
||||
-- This testbench tests the general operation of thr Memory Controller.
|
||||
|
||||
entity L0_mem_ctrl_test1 is
|
||||
end entity;
|
||||
|
||||
@ -13,7 +13,7 @@ use work.rtps_test_package.all;
|
||||
-- This testbench tests the matching of remote participants. Due to the fact, that participant matching does not have an immediate effect visible to the outside,
|
||||
-- this testbench is using external names to access the memory of the rtps_discovery_module directly and check the contents at the supposed participant locations.
|
||||
-- This testbench covers following:
|
||||
-- * Mathing compatible Participants
|
||||
-- * Matching compatible Participants
|
||||
-- * Ignoring incompatible Participants
|
||||
-- * Unmatching previously matched Participants (Due to incompatibility)
|
||||
-- * Unmatching previously matched Participants (Due to Unregister/Dispose Status Updates)
|
||||
|
||||
@ -13,7 +13,7 @@ use work.rtps_test_package.all;
|
||||
-- This testbench tests the matching of remote participants. Due to the fact, that participant matching does not have an immediate effect visible to the outside,
|
||||
-- this testbench is using external names to access the memory of the rtps_discovery_module directly and check the contents at the supposed participant locations.
|
||||
-- This testbench covers following:
|
||||
-- * Mathing compatible Participants
|
||||
-- * Matching compatible Participants
|
||||
-- * Ignoring incompatible Participants
|
||||
-- * Unmatching previously matched Participants (Due to incompatibility)
|
||||
-- * Unmatching previously matched Participants (Due to Unregister/Dispose Status Updates)
|
||||
|
||||
@ -313,7 +313,7 @@ begin
|
||||
p1.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_DETECTOR) := '1';
|
||||
p1.availableBuiltinEndpoints(DISC_BUILTIN_ENDPOINT_PUBLICATIONS_ANNOUNCER) := '1';
|
||||
|
||||
-- Participant 2 (Used for dyncamic Endpoints)
|
||||
-- Participant 2 (Used for dynamic Endpoints)
|
||||
p2.guidPrefix := gen_rand_guid_prefix;
|
||||
p2.nr := 2;
|
||||
p2.defaultUnicastLocatorList := (numLocators => int(1,CDR_LONG_WIDTH), locator => (0 => gen_rand_loc_2, others => EMPTY_LOCATOR));
|
||||
|
||||
@ -13,7 +13,7 @@ use work.rtps_test_package.all;
|
||||
-- This testbench tests the input handling of parameter lists. We issue one parameter list with invalid parameter length (less than expected)
|
||||
-- and one with valid larger parameter length (extra Bytes after expected parameter end) for each of the parameters that are handled by the Discovery Module by checking if the Participant/Endpoint matched.
|
||||
-- (We also issue a parameter list that is missing its sentinel)
|
||||
-- Particpant matches are checked by memory content, and Endpoint matches by the generated match frame.
|
||||
-- Participant matches are checked by memory content, and Endpoint matches by the generated match frame.
|
||||
-- The PIDs handled are:
|
||||
-- * PID_PARTICIPANT_GUID
|
||||
-- * PID_DOMAIN_ID
|
||||
|
||||
@ -16,7 +16,7 @@ use work.rtps_test_package.all;
|
||||
-- * The Message has less than the required number of octets to contain a full Header
|
||||
-- * Its protocol value does not match the value of PROTOCOL_RTPS
|
||||
-- * The major protocol version is larger than the major protocol version supported by the implementation
|
||||
-- DATA SUBEMSSAGE
|
||||
-- DATA SUBMESSAGE
|
||||
-- * Empty DATA Submessage (No payload/inline-QoS)
|
||||
-- * META/USER Traffic
|
||||
-- * Little/Big Endian
|
||||
@ -50,11 +50,11 @@ use work.rtps_test_package.all;
|
||||
-- * lastSN.value < firstSN.value - 1
|
||||
-- INFO_SOURCE SUBMESSAGE
|
||||
-- * Little/Big Endian
|
||||
-- * Protocol Version missmatch
|
||||
-- * Protocol Version mismatch
|
||||
-- * SubmessageLength invalid
|
||||
-- INFO_DESTINATION SUBMESSAGE
|
||||
-- * Little/Big Endian
|
||||
-- * Destination GUID Prefix missmatch
|
||||
-- * Destination GUID Prefix mismatch
|
||||
-- * SubmessageLength invalid
|
||||
-- INFO_REPLY SUBMESSAGE
|
||||
-- * Little/Big Endian
|
||||
@ -73,11 +73,11 @@ use work.rtps_test_package.all;
|
||||
-- * SubmessageLength invalid
|
||||
-- PAD SUBMESSAGE
|
||||
-- * 28 Padding Bytes
|
||||
-- UKNOWN SUBMESSAGE
|
||||
-- UNKNOWN SUBMESSAGE
|
||||
-- * DATA_FRAG Submessage
|
||||
-- * HEARTBEAT_FRAG Submessage
|
||||
-- * NACK_FRAG Submessage
|
||||
-- * UKNOWN SID
|
||||
-- * UNKNOWN SID
|
||||
|
||||
entity L0_rtps_handler_test1 is
|
||||
end entity;
|
||||
@ -207,7 +207,7 @@ begin
|
||||
stimulus := EMPTY_TEST_PACKET;
|
||||
reference := EMPTY_TEST_PACKET;
|
||||
|
||||
Log("Sending invalid RTPS Header [Protocol Missmatch]", INFO);
|
||||
Log("Sending invalid RTPS Header [Protocol Mismatch]", INFO);
|
||||
-- UDP Header
|
||||
gen_output_header(UDP_META, stimulus);
|
||||
-- RTPS Header [Incompatible Protocol]
|
||||
@ -225,7 +225,7 @@ begin
|
||||
stimulus := EMPTY_TEST_PACKET;
|
||||
reference := EMPTY_TEST_PACKET;
|
||||
|
||||
Log("Sending invalid RTPS Header [Protocol Major Version Missmatch]", INFO);
|
||||
Log("Sending invalid RTPS Header [Protocol Major Version Mismatch]", INFO);
|
||||
-- UDP Header
|
||||
gen_output_header(UDP_META, stimulus);
|
||||
-- RTPS Header [Incompatible Version]
|
||||
@ -243,7 +243,7 @@ begin
|
||||
stimulus := EMPTY_TEST_PACKET;
|
||||
reference := EMPTY_TEST_PACKET;
|
||||
|
||||
Log("Sending valid RTPS Header [Protocol Minor Version Missmatch]", INFO);
|
||||
Log("Sending valid RTPS Header [Protocol Minor Version Mismatch]", INFO);
|
||||
-- UDP Header
|
||||
gen_output_header(UDP_META, stimulus);
|
||||
-- RTPS Header
|
||||
@ -382,7 +382,7 @@ begin
|
||||
gen_output_header(UDP_META, stimulus);
|
||||
-- RTPS Header
|
||||
gen_rtps_header(rtps_header, stimulus);
|
||||
-- Valid DATA [SubLength > PackeSize] (Dropped)
|
||||
-- Valid DATA [SubLength > PacketSize] (Dropped)
|
||||
rtps_sub := DEFAULT_RTPS_SUBMESSAGE;
|
||||
rtps_sub.submessageID := SID_DATA;
|
||||
rtps_sub.writerId := DEFAULT_WRITER_ENTITYID;
|
||||
@ -930,7 +930,7 @@ begin
|
||||
gen_output_header(UDP_META, stimulus);
|
||||
-- RTPS Header
|
||||
gen_rtps_header(rtps_header, stimulus);
|
||||
-- Invalid HEARTBEAT [SubLength > PackeSize] (Dropped)
|
||||
-- Invalid HEARTBEAT [SubLength > PacketSize] (Dropped)
|
||||
rtps_sub := DEFAULT_RTPS_SUBMESSAGE;
|
||||
rtps_sub.submessageID := SID_HEARTBEAT;
|
||||
rtps_sub.writerId := DEFAULT_WRITER_ENTITYID;
|
||||
@ -1082,7 +1082,7 @@ begin
|
||||
gen_rtps_submessage(rtps_data, stimulus);
|
||||
gen_rtps_handler_out(rtps_data, UDP_META.src, TRUE, TIME_INVALID, rtps_sub.guidPrefix, reference);
|
||||
rtps_data.writerSN := rtps_data.writerSN + 1;
|
||||
-- Valid INFO_SOURCE [Protocol Major Version Missmatch] (Dropped)
|
||||
-- Valid INFO_SOURCE [Protocol Major Version Mismatch] (Dropped)
|
||||
rtps_sub := DEFAULT_RTPS_SUBMESSAGE;
|
||||
rtps_sub.submessageID := SID_INFO_SRC;
|
||||
rtps_sub.version := PROTOCOLVERSION_1_0;
|
||||
@ -1382,7 +1382,7 @@ begin
|
||||
stimulus := EMPTY_TEST_PACKET;
|
||||
reference := EMPTY_TEST_PACKET;
|
||||
|
||||
Log("Sending invalid INFO_TMESTAMP [Submessage Length too small]", INFO);
|
||||
Log("Sending invalid INFO_TIMESTAMP [Submessage Length too small]", INFO);
|
||||
-- UDP Header
|
||||
gen_output_header(UDP_META, stimulus);
|
||||
-- RTPS Header
|
||||
@ -1469,7 +1469,7 @@ begin
|
||||
gen_rtps_submessage(rtps_data, stimulus);
|
||||
gen_rtps_handler_out(rtps_data, UDP_META.src, TRUE, TIME_INVALID, rtps_header.guidPrefix, reference);
|
||||
rtps_data.writerSN := rtps_data.writerSN + 1;
|
||||
-- UKNOWN (Dropped)
|
||||
-- UNKNOWN (Dropped)
|
||||
rtps_sub := DEFAULT_RTPS_SUBMESSAGE;
|
||||
rtps_sub.submessageID := (others => '1');
|
||||
rtps_sub.submessageLength := int(28,16);
|
||||
|
||||
@ -127,7 +127,7 @@ begin
|
||||
wait until rising_edge(clk);
|
||||
reset <= '0';
|
||||
|
||||
for i in 0 to 2 loop -- USER/META/UKNOWN Traffic
|
||||
for i in 0 to 2 loop -- USER/META/UNKNOWN Traffic
|
||||
case (i) is
|
||||
-- META TRAFFIC ADDRESSES
|
||||
when 0 =>
|
||||
@ -139,7 +139,7 @@ begin
|
||||
tmp_loc_list := DEST_LOC.user;
|
||||
ref1 := (NUM_ENDPOINTS => '0', others => '1');
|
||||
is_meta := FALSE;
|
||||
-- UKNOWN ADDRESSES
|
||||
-- UNKNOWN ADDRESSES
|
||||
when others =>
|
||||
ref1 := (others => '0');
|
||||
tmp_loc_list := ( numLocators => int(2,CDR_LONG_WIDTH),
|
||||
@ -164,13 +164,13 @@ begin
|
||||
|
||||
for k in 0 to NUM_ENDPOINTS+2 loop -- Destination Entity ID
|
||||
case (k) is
|
||||
-- UKNOWN
|
||||
-- UNKNOWN
|
||||
when NUM_ENDPOINTS =>
|
||||
ref2 := (others => '0');
|
||||
tmp_id := RV.RandSlv(ENTITYID_WIDTH);
|
||||
tmp_id(ENTITY_KIND_H_RANGE) := USER_DEFINED_ENTITY;
|
||||
tmp_id(ENTITY_KIND_L_RANGE) := UNKNOWN_KIND;
|
||||
-- ENTITYID_UKNOWN
|
||||
-- ENTITYID_UNKNOWN
|
||||
when NUM_ENDPOINTS+1 =>
|
||||
tmp_id := ENTITYID_UNKNOWN;
|
||||
ref2 := (others => '1');
|
||||
|
||||
@ -199,7 +199,7 @@ begin
|
||||
-- Push T3 Packet 1
|
||||
push_reference(1, stimulus(t3));
|
||||
start_test;
|
||||
-- Wait until begining of t3 sending
|
||||
-- Wait until beginning of t3 sending
|
||||
tmp := (others => '1');
|
||||
tmp(t3) := '0';
|
||||
wait on rd_sig until packet_sent = tmp and rd_sig = not tmp;
|
||||
|
||||
@ -13,7 +13,7 @@ use work.rtps_test_package.all;
|
||||
-- This testbench tests the metatraffic operation behaviour of the RTPS Reader. (Remote Endpoint matching and memory behaviour)
|
||||
-- This testbench is using external names to access the memory of the rtps_reader directly and check the contents at the supposed locations.
|
||||
-- This testbench covers following:
|
||||
-- * Mathing Endpoint
|
||||
-- * Matching Endpoint
|
||||
-- * Memory Full Behaviour
|
||||
-- * Unmatching Endpoint
|
||||
-- * Unmatching Participant
|
||||
@ -369,7 +369,7 @@ begin
|
||||
-- MEMORY 0 STATE 0(P1E2),34(P1E3)/17
|
||||
-- MEMORY 1 STATE 17(P1E3)/0,34
|
||||
|
||||
Log("Unknown Metatraffic Operation followed by insertion of Enpoint 1 Participant 0 {READER 0, READER 1}", INFO);
|
||||
Log("Unknown Metatraffic Operation followed by insertion of Endpoint 1 Participant 0 {READER 0, READER 1}", INFO);
|
||||
for i in 0 to 9 loop
|
||||
stimulus.data(i) := RV.RandSlv(WORD_WIDTH);
|
||||
end loop;
|
||||
@ -542,7 +542,7 @@ begin
|
||||
case (stage_hc) is
|
||||
when IDLE =>
|
||||
if (start_hc /= (start_hc'range => '0')) then
|
||||
-- HACK: We trigger all acks because we cannot use 'ind' variable in the same clock cycle
|
||||
-- HACK: We trigger all ACKs because we cannot use 'ind' variable in the same clock cycle
|
||||
-- Since the uut only interfaces with 1 HC at a time (one-hot encoded start_hc) this
|
||||
-- is still valid.
|
||||
ack_hc <= (others => '1');
|
||||
|
||||
@ -1736,7 +1736,7 @@ begin
|
||||
case (stage_hc) is
|
||||
when IDLE =>
|
||||
if (start_hc /= (start_hc'range => '0')) then
|
||||
-- HACK: We trigger all acks because we cannot use 'ind' variable in the same clock cycle
|
||||
-- HACK: We trigger all ACKs because we cannot use 'ind' variable in the same clock cycle
|
||||
-- Since the uut only interfaces with 1 HC at a time (one-hot encoded start_hc) this
|
||||
-- is still valid.
|
||||
ack_hc <= (others => '1');
|
||||
|
||||
@ -13,7 +13,7 @@ use work.rtps_test_package.all;
|
||||
-- This testbench tests the metatraffic operation behaviour of the RTPS Writer. (Remote Endpoint matching and Memory behaviour)
|
||||
-- This testbench is using external names to access the memory of the rtps_reader directly and check the contents at the supposed locations.
|
||||
-- This testbench covers following:
|
||||
-- * Mathing Endpoint
|
||||
-- * Matching Endpoint
|
||||
-- * Memory Full Behaviour
|
||||
-- * Unmatching Endpoint
|
||||
-- * Unmatching Participant
|
||||
@ -356,7 +356,7 @@ begin
|
||||
-- MEMORY 0 STATE 0(P1E2),34(P1E3)/17
|
||||
-- MEMORY 1 STATE 17(P1E3)/0,34
|
||||
|
||||
Log("Unknown Metatraffic Operation followed by insertion of Enpoint 1 Participant 0 {WRITER 0, WRITER 1}", INFO);
|
||||
Log("Unknown Metatraffic Operation followed by insertion of Endpoint 1 Participant 0 {WRITER 0, WRITER 1}", INFO);
|
||||
for i in 0 to 9 loop
|
||||
stimulus.data(i) := RV.RandSlv(WORD_WIDTH);
|
||||
end loop;
|
||||
|
||||
@ -338,7 +338,7 @@ begin
|
||||
wait_on_idle;
|
||||
|
||||
Log("Current Time: 1s", INFO);
|
||||
Log("WRITER 0: Removal of Enpoint 0", INFO);
|
||||
Log("WRITER 0: Removal of Endpoint 0", INFO);
|
||||
test_time <= gen_duration(1 sec);
|
||||
wait until rising_edge(clk);
|
||||
wait until rising_edge(clk); -- Allow idle_sig to go low
|
||||
@ -369,7 +369,7 @@ begin
|
||||
-- MEMORY 1 STATE 34(E2),17(E1),0(E0)/-
|
||||
|
||||
Log("Current Time: 1.5s", INFO);
|
||||
Log("WRITER 0: Removal of Enpoint 2", INFO);
|
||||
Log("WRITER 0: Removal of Endpoint 2", INFO);
|
||||
test_time <= gen_duration(1.5 sec);
|
||||
wait until rising_edge(clk);
|
||||
wait until rising_edge(clk); -- Allow idle_sig to go low
|
||||
|
||||
@ -13,7 +13,7 @@ use work.Type2_package.all;
|
||||
|
||||
-- This testbench tests the KEY_HOLDER commands of TYPE1.
|
||||
-- It uses the writer_interface to send a valid payload, then reads the serialized key and the key hash. The returned serialized key is compared to a "handcrafted" reference, and the key hash is latched for later comparison.
|
||||
-- Then the reference serialized key is pushed (resetting the internaly generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previosuly compared).
|
||||
-- Then the reference serialized key is pushed (resetting the internally generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previously compared).
|
||||
-- The payload is sent in Big Endian.
|
||||
|
||||
entity L1_Type1_key_holder_test1 is
|
||||
@ -133,7 +133,7 @@ begin
|
||||
|
||||
-- Serialized Key Payload Header
|
||||
gen_CDR(SERIALIZED_KEY_HEADER, ALIGN_4, align_offset, serialized_key);
|
||||
-- Reset Alignement
|
||||
-- Reset Alignment
|
||||
align_offset := (others => '0');
|
||||
|
||||
Log("Setting Data in Writer Side", INFO);
|
||||
|
||||
@ -13,7 +13,7 @@ use work.Type2_package.all;
|
||||
|
||||
-- This testbench tests the KEY_HOLDER commands of TYPE1.
|
||||
-- It uses the writer_interface to send a valid payload, then reads the serialized key and the key hash. The returned serialized key is compared to a "handcrafted" reference, and the key hash is latched for later comparison.
|
||||
-- Then the reference serialized key is pushed (resetting the internaly generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previosuly compared).
|
||||
-- Then the reference serialized key is pushed (resetting the internally generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previously compared).
|
||||
-- The payload is sent in Little Endian.
|
||||
|
||||
entity L1_Type1_key_holder_test2 is
|
||||
@ -139,7 +139,7 @@ begin
|
||||
|
||||
-- Serialized Key Payload Header
|
||||
gen_CDR(SERIALIZED_KEY_HEADER, ALIGN_4, align_offset, serialized_key);
|
||||
-- Reset Alignement
|
||||
-- Reset Alignment
|
||||
align_offset := (others => '0');
|
||||
|
||||
Log("Setting Data in Writer Side", INFO);
|
||||
|
||||
@ -13,7 +13,7 @@ use work.Type2_package.all;
|
||||
|
||||
-- This testbench tests the KEY_HOLDER commands of TYPE2.
|
||||
-- It uses the writer_interface to send a valid payload, then reads the serialized key and the key hash. The returned serialized key is compared to a "handcrafted" reference, and the key hash is latched for later comparison.
|
||||
-- Then the reference serialized key is pushed (resetting the internaly generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previosuly compared).
|
||||
-- Then the reference serialized key is pushed (resetting the internally generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previously compared).
|
||||
-- The payload is sent in Big Endian.
|
||||
|
||||
entity L1_Type2_key_holder_test1 is
|
||||
@ -205,7 +205,7 @@ begin
|
||||
|
||||
-- Serialized Key Payload Header
|
||||
gen_CDR(SERIALIZED_KEY_HEADER, ALIGN_4, align_offset, serialized_key);
|
||||
-- Reset Alignement
|
||||
-- Reset Alignment
|
||||
align_offset := (others => '0');
|
||||
|
||||
Log("Setting Data in Writer Side", INFO);
|
||||
|
||||
@ -13,7 +13,7 @@ use work.Type2_package.all;
|
||||
|
||||
-- This testbench tests the KEY_HOLDER commands of TYPE2.
|
||||
-- It uses the writer_interface to send a valid payload, then reads the serialized key and the key hash. The returned serialized key is compared to a "handcrafted" reference, and the key hash is latched for later comparison.
|
||||
-- Then the reference serialized key is pushed (resetting the internaly generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previosuly compared).
|
||||
-- Then the reference serialized key is pushed (resetting the internally generated key hash), and the serialized key and key hash are re-read and compared (The key hash is compared to the previously compared).
|
||||
-- The payload is sent in Little Endian.
|
||||
|
||||
entity L1_Type2_key_holder_test2 is
|
||||
@ -211,7 +211,7 @@ begin
|
||||
|
||||
-- Serialized Key Payload Header
|
||||
gen_CDR(SERIALIZED_KEY_HEADER, ALIGN_4, align_offset, serialized_key);
|
||||
-- Reset Alignement
|
||||
-- Reset Alignment
|
||||
align_offset := (others => '0');
|
||||
|
||||
Log("Setting Data in Writer Side", INFO);
|
||||
|
||||
@ -12,11 +12,11 @@ use work.rtps_test_package.all;
|
||||
|
||||
-- This testbench tests the rtps output of the Discovery Module (Local Liveliness Assertion, Local Heartbeat Generation, Local Participant Announcement, Remote HEARTBEAT Response, Remote ACKNACK Response).
|
||||
-- This test is a Level 1 Test (Meaning the input/output is not connected directly to the uut) in order to have output in the same format as the input of the system and allow us to compare using existing data generators.
|
||||
-- The testflow is as follows:
|
||||
-- The test flow is as follows:
|
||||
-- * 0s
|
||||
-- - Local participant Announcement
|
||||
-- - Match a remote participant
|
||||
-- - Send HEARTBEAT 0 (Publisher, Empty, Final Flag) [Test Final Flag pasing]
|
||||
-- - Send HEARTBEAT 0 (Publisher, Empty, Final Flag) [Test Final Flag passing]
|
||||
-- * 0.105s
|
||||
-- - No HEARTBEAT 0 Response
|
||||
-- - Send HEARTBEAT 1 (Publisher, Empty) [Test empty HEARTBEAT Response]
|
||||
@ -30,16 +30,16 @@ use work.rtps_test_package.all;
|
||||
-- - Send HEARTBEAT 3 (Publisher, First SN 1, Last SN 5) [Test HEARTBEAT Suppression Delay]
|
||||
-- * 0.415s
|
||||
-- - No HEARTBEAT 3 Response
|
||||
-- - Send HEARTBEAT 4 (Publisher, First SN 1, Last SN 5) [Test normal HARTBEAT Response]
|
||||
-- - Send HEARTBEAT 4 (Publisher, First SN 1, Last SN 5) [Test normal HEARTBEAT Response]
|
||||
-- - Send ACKNACK 2 (Publisher, Expecting 1) [Test ACKNACK Suppression Delay]
|
||||
-- * 0.450s
|
||||
-- - Send HEARTBEAT 5 (Subscriber, First Sn 2, Last SN 5) [Test HEARTBEAT Response Delay, Test HEARTBEAT Resposne Update]
|
||||
-- - Send HEARTBEAT 5 (Subscriber, First Sn 2, Last SN 5) [Test HEARTBEAT Response Delay, Test HEARTBEAT Response Update]
|
||||
-- * 0.520s
|
||||
-- - HEARTBEAT 4/5 Response
|
||||
-- - Send ACKNACK 3 (Publisher, Expecting SN 1) [Test normal ACKNACK Response]
|
||||
-- * 0.620s
|
||||
-- - No ACKNACK 2 Response
|
||||
-- - Send ACKNACK 4 (Subscriber, Expecting SN 1) [Test ACKNACK Resposne Delay, Test ACKNACK Response Update]
|
||||
-- - Send ACKNACK 4 (Subscriber, Expecting SN 1) [Test ACKNACK Response Delay, Test ACKNACK Response Update]
|
||||
-- * 0.725s
|
||||
-- - ACKNACK 3/4 Response
|
||||
-- * 1.000s
|
||||
@ -49,14 +49,14 @@ use work.rtps_test_package.all;
|
||||
-- * 1.205s
|
||||
-- - ACKNACK 5 Response
|
||||
-- * 1.500s
|
||||
-- - Send ACKNACK 6 (Publihser, Expecting SN 18) [Test ACKNACK SN Response]
|
||||
-- - Send ACKNACK 6 (Publisher, Expecting SN 18) [Test ACKNACK SN Response]
|
||||
-- * 1.705s
|
||||
-- - No ACKNACK 6 Response
|
||||
-- * 2.000s
|
||||
-- - Local HEARTBEAT generation
|
||||
-- - Liveliness Assertion (Auto only)
|
||||
-- - Send ACKNACK 7 (Message, Expecting SN 5) [Test GAP sending on ACKNACK Response]
|
||||
-- - Send ACKNACK 8 (Publihser, Expecing SN 2) [Test full ACKNACK Response]
|
||||
-- - Send ACKNACK 8 (Publisher, Expecting SN 2) [Test full ACKNACK Response]
|
||||
-- - Send ACKNACK 9 (Subscriber, Expecting SN 8) [Test full ACKNACK Response]
|
||||
-- * 2.205s
|
||||
-- - ACKNACK 7/8/9 Response
|
||||
|
||||
@ -12,7 +12,7 @@ use work.rtps_test_package.all;
|
||||
|
||||
-- This testbench tests the output handling (ACKNACK) of the RTPS Reader
|
||||
-- This test is a Level 1 Test (Meaning the input/output is not connected directly to the uut) in order to have output in the same format as the input of the system and allow us to compare using existing data generators.
|
||||
-- The testflow is as follows (Heartbeat Suppression and Response delay are configured to 5s):
|
||||
-- The test flow is as follows (Heartbeat Suppression and Response delay are configured to 5s):
|
||||
-- * 0s
|
||||
-- - Match Remote Endpoints 0,1,2
|
||||
-- - Send HEARTBEAT 0 from Endpoint 0 (Empty, Final Flag) [Test Final Flag Handling]
|
||||
|
||||
@ -19,7 +19,7 @@ use work.Type1_package.all;
|
||||
-- Both Libraries have compatible settings for matching.
|
||||
-- The testbench first registers 2 instances, and writes 2 samples for each instance (once using the instance handle, and onc using HANDLE_NIL). This initial 4 writes are done before
|
||||
-- the two systems have discovered each other (due to the initial Participant Announcement happening at 50k ns), and are thus considered historical data (Data that will be sent to the
|
||||
-- Reader immediately on matching due to trasient local durability setting).
|
||||
-- Reader immediately on matching due to transient local durability setting).
|
||||
-- After data has arrived on the reader side, the data is read out and compared to the original.
|
||||
-- Afterwards another sample on an unknown instance is written, and the instance handle is fetched via a register lookup operation. After the sample has arrived at the reader side the data is again
|
||||
-- compared to the original.
|
||||
|
||||
@ -14,7 +14,7 @@ use work.rtps_config_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
use work.Type1_package.all;
|
||||
|
||||
-- This testbench tests the general system operation by interconnecting two complete systems with a reader and a writer respectively, and perforing a loopback operation.
|
||||
-- This testbench tests the general system operation by interconnecting two complete systems with a reader and a writer respectively, and performing a loopback operation.
|
||||
-- Libraries are used to allow to use systems with different configurations.
|
||||
-- The testbench is interfacing with the reader and writer of Testbench_Lib5, and the loopback entity (test_loopback) is interfacing with the reader and writer of Testbench_Lib4.
|
||||
-- The testbench->test_loopback communication uses a Type1 Instance with id=1, and the test_loopback->testbench communication uses a Type1 Instance with id=2.
|
||||
@ -236,7 +236,7 @@ begin
|
||||
wait until rising_edge(clk);
|
||||
reset <= '0';
|
||||
|
||||
Log("Register Target Instance (Get Instance Handle of Responce)", INFO);
|
||||
Log("Register Target Instance (Get Instance Handle of Response)", INFO);
|
||||
start_w <= '1';
|
||||
opcode_w <= REGISTER_INSTANCE;
|
||||
id_w <= int(2,CDR_LONG_WIDTH);
|
||||
|
||||
@ -787,7 +787,7 @@ begin
|
||||
TestSequence_TestArray_cnt_next <= 0;
|
||||
cnt_next <= 0;
|
||||
end if;
|
||||
-- "Comsume" input word
|
||||
-- "Consume" input word
|
||||
TestSequence_TestLongDouble_mem_ready_out <= '1';
|
||||
end if;
|
||||
-- Reset Alignment
|
||||
|
||||
@ -13,7 +13,7 @@ use UNIMACRO.vcomponents.all;
|
||||
|
||||
-- Add/Sub
|
||||
-- This entity adds or subtracts inputs 'A' and 'B', depending on 'mode' (1 = add, 0 = sub).
|
||||
-- If 'cap' is high, on Overfolw/Underflow conditions the result is capped at max/min value.
|
||||
-- If 'cap' is high, on Overflow/Underflow conditions the result is capped at max/min value.
|
||||
|
||||
entity addsub is
|
||||
generic (
|
||||
|
||||
@ -843,7 +843,7 @@ architecture arch of dds_reader is
|
||||
signal cur_generation_rank, cur_generation_rank_next : unsigned(GENERATION_RANK_WIDTH-1 downto 0);
|
||||
-- Denotes if a TAKE operation is in progress
|
||||
signal is_take, is_take_next : std_logic;
|
||||
-- NOTE: We use this signal to prevent the costly Instance Marking in the case that we only need to ouptput samples of one Instance.
|
||||
-- NOTE: We use this signal to prevent the costly Instance Marking in the case that we only need to output samples of one Instance.
|
||||
-- Denotes if the READ/TAKE operation applies to a single Instance
|
||||
signal single_instance, single_instance_next : std_logic;
|
||||
-- Denotes if the READ/TAKE operation does not apply to a specific Instance
|
||||
@ -2301,7 +2301,7 @@ begin
|
||||
prev_sample_next <= resize(unsigned(sample_read_data),SAMPLE_MEMORY_ADDR_WIDTH);
|
||||
cnt_next <= cnt + 1;
|
||||
end if;
|
||||
-- READ Instance Poiner
|
||||
-- READ Instance Pointer
|
||||
when 7 =>
|
||||
sample_ready_out1 <= '1';
|
||||
|
||||
@ -2775,7 +2775,7 @@ begin
|
||||
when GENERATE_SAMPLE =>
|
||||
-- Precondition: cur_sample set, cur_inst set, inst_data set (IMF_DISPOSED_CNT_FLAG, IMF_NO_WRITERS_CNT_FLAG)
|
||||
|
||||
-- Wait for Instane Data
|
||||
-- Wait for Instance Data
|
||||
if (inst_op_done = '1') then
|
||||
assert (inst_data.addr /= INSTANCE_MEMORY_MAX_ADDRESS) severity FAILURE;
|
||||
assert (stable(clk, inst_data.i = ind and check_mask(inst_data.field_flags, IMF_DISPOSED_CNT_FLAG or IMF_NO_WRITERS_CNT_FLAG))) severity FAILURE;
|
||||
@ -3521,7 +3521,7 @@ begin
|
||||
case (cnt) is
|
||||
-- GET Next Pointer
|
||||
when 0 =>
|
||||
-- NOTE: We have to make sure that no pending Reads are in the Memory Controler Buffer,
|
||||
-- NOTE: We have to make sure that no pending Reads are in the Memory Controller Buffer,
|
||||
-- else the Next Payload Pointer cannot be read.
|
||||
-- No Pending Reads
|
||||
if (payload_cnt2 = 0) then
|
||||
@ -3584,7 +3584,7 @@ begin
|
||||
if (payload_cnt = unsigned(long_latch)) then
|
||||
-- End of Payload
|
||||
if (next_payload = PAYLOAD_MEMORY_MAX_ADDRESS) then
|
||||
-- DONE (Wait for Output to finidh reading)
|
||||
-- DONE (Wait for Output to finish reading)
|
||||
cnt_next <= cnt + 1;
|
||||
else
|
||||
-- Next Payload Slot
|
||||
@ -4512,7 +4512,7 @@ begin
|
||||
end if;
|
||||
when ANY_SAMPLE_STATE =>
|
||||
null;
|
||||
-- Uknown Sample State
|
||||
-- Unknown Sample State
|
||||
when others =>
|
||||
tmp_bool := FALSE;
|
||||
end case;
|
||||
@ -4935,7 +4935,7 @@ begin
|
||||
end if;
|
||||
when ANY_SAMPLE_STATE =>
|
||||
null;
|
||||
-- Uknown Sample State
|
||||
-- Unknown Sample State
|
||||
when others =>
|
||||
tmp_bool := FALSE;
|
||||
end case;
|
||||
@ -5124,7 +5124,7 @@ begin
|
||||
-- Sample Info Generation Rank
|
||||
si_generation_rank_sig_next <= collection_generation_rank - cur_generation_rank;
|
||||
|
||||
-- Sample Info Absolut Generation Rank
|
||||
-- Sample Info Absolute Generation Rank
|
||||
-- XXX: Possible Worst Case Path (2 32-bit Operations in same clock)
|
||||
si_absolute_generation_rank_sig_next <= (inst_data.disposed_gen_cnt + inst_data.no_writers_gen_cnt) - cur_generation_rank;
|
||||
|
||||
@ -5537,7 +5537,7 @@ begin
|
||||
-- INSERT_INSTANCE See Memory OPCODE Description
|
||||
-- UPDATE_INSTANCE See Memory OPCODE Description
|
||||
-- REMOVE_INSTANCE See Memory OPCODE Description
|
||||
-- UNMARK_INTANCES See Memory OPCODE Description
|
||||
-- UNMARK_INSTANCES See Memory OPCODE Description
|
||||
-- RESET_MEMORY Reset Endpoint Memory to Empty State
|
||||
inst_ctrl_prc : process(all)
|
||||
begin
|
||||
@ -6302,7 +6302,7 @@ begin
|
||||
inst_stage_next <= IDLE;
|
||||
end if;
|
||||
end if;
|
||||
-- READ Writer Bitamp
|
||||
-- READ Writer Bitmap
|
||||
when 21 =>
|
||||
inst_ready_out <= '1';
|
||||
|
||||
|
||||
@ -166,7 +166,7 @@ use work.rtps_config_package.all;
|
||||
-- +-+-+-+---------------------------------------------------+-+-+-+
|
||||
-- R...Sample has been ACKed
|
||||
-- P...Sample has associated DATA Payload
|
||||
-- A...Associated Payload is aligned (Payload does extend until end of last Palyload Slot)
|
||||
-- A...Associated Payload is aligned (Payload does extend until end of last Payload Slot)
|
||||
-- F...FilteredFlag (1:1 PID_STATUS_INFO Mapping)
|
||||
-- U...UnregisteredFlag (1:1 PID_STATUS_INFO Mapping)
|
||||
-- D...DisposedFlag (1:1 PID_STATUS_INFO Mapping)
|
||||
@ -640,7 +640,7 @@ architecture arch of dds_writer is
|
||||
signal remove_oldest_sample, remove_oldest_sample_next : std_logic;
|
||||
-- Denotes if the oldest sample of the Instance with 'key_hash' should be removed
|
||||
signal remove_oldest_inst_sample, remove_oldest_inst_sample_next : std_logic;
|
||||
-- Denotes if the Sample tobe removed should be ACKed
|
||||
-- Denotes if the Sample to be removed should be ACKed
|
||||
signal remove_ack_sample, remove_ack_sample_next : std_logic;
|
||||
-- Lifespan Latch
|
||||
signal lifespan, lifespan_next : TIME_TYPE;
|
||||
@ -3379,7 +3379,7 @@ begin
|
||||
done_rtps(ind) <= '1';
|
||||
ret_rtps(ind) <= OK;
|
||||
|
||||
-- RTPS Requestes Payload
|
||||
-- RTPS requests Payload
|
||||
if (get_data_rtps(ind) = '1') then
|
||||
if (cur_payload /= PAYLOAD_MEMORY_MAX_ADDRESS) then
|
||||
-- Get Payload
|
||||
@ -3412,7 +3412,7 @@ begin
|
||||
case (cnt) is
|
||||
-- GET Next Pointer
|
||||
when 0 =>
|
||||
-- NOTE: We have to make sure that no pending Reads are in the Memory Controler Buffer,
|
||||
-- NOTE: We have to make sure that no pending Reads are in the Memory Controller Buffer,
|
||||
-- else the Next Payload Pointer cannot be read.
|
||||
-- No Pending Reads
|
||||
if (cnt3 = 0) then
|
||||
@ -3475,7 +3475,7 @@ begin
|
||||
if (cnt2 = unsigned(long_latch)) then
|
||||
-- End of Payload
|
||||
if (next_payload = PAYLOAD_MEMORY_MAX_ADDRESS) then
|
||||
-- DONE (Wait for Output to finidh reading)
|
||||
-- DONE (Wait for Output to finish reading)
|
||||
cnt_next <= cnt + 1;
|
||||
else
|
||||
-- Next Payload Slot
|
||||
|
||||
@ -20,7 +20,7 @@ entity history_cache is
|
||||
|
||||
start_a : in std_logic;
|
||||
opcode_a : in HISTORY_CACHE_OPCODE_TYPE;
|
||||
res_a : out HISTORY_CACHE_RESPOSNE_TYPE;
|
||||
res_a : out HISTORY_CACHE_RESPONSE_TYPE;
|
||||
data_in_a : in std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
valid_in_a : in std_logic;
|
||||
ready_in_a : out std_logic;
|
||||
@ -28,7 +28,7 @@ entity history_cache is
|
||||
|
||||
start_b : in std_logic;
|
||||
opcode_b : in HISTORY_CACHE_OPCODE_TYPE;
|
||||
res_b : out HISTORY_CACHE_RESPOSNE_TYPE;
|
||||
res_b : out HISTORY_CACHE_RESPONSE_TYPE;
|
||||
data_out_b : out std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
last_word_out_b : in std_logic;
|
||||
);
|
||||
@ -382,7 +382,7 @@ begin
|
||||
res_a <= ACK;
|
||||
end if;
|
||||
when REMOVE_WRITER =>
|
||||
-- Input and Memory Gurad
|
||||
-- Input and Memory Guard
|
||||
if (valid_in_a = '1' and inst_op_done_a = '1') then
|
||||
-- Latch Writer Pos
|
||||
writer_pos_next <= to_integer(unsigned(data_in_a));
|
||||
@ -425,7 +425,7 @@ begin
|
||||
-- Timestamp 2/2
|
||||
when 2 =>
|
||||
ts_latch_next(1) <= data_in_a;
|
||||
-- Lifespna Deadline 2/2
|
||||
-- Lifespan Deadline 2/2
|
||||
when 4 =>
|
||||
-- Skip Key Hash, if not available
|
||||
if (has_key_hash = '0') then
|
||||
@ -484,7 +484,7 @@ begin
|
||||
sample_write_data_a <= PAYLOAD_MEMORY_MAX_ADDRESS;
|
||||
end if;
|
||||
|
||||
-- If key Hash is avialable, start the Instacne Search first
|
||||
-- If key Hash is available, start the Instance Search first
|
||||
if (has_key_hash = '1') then
|
||||
stage_a_next <= INITIATE_INSTANCE_SEARCH;
|
||||
else
|
||||
@ -737,7 +737,7 @@ begin
|
||||
end if;
|
||||
end if;
|
||||
|
||||
-- INSANCE SAMPLE COUNT
|
||||
-- INSTANCE SAMPLE COUNT
|
||||
if (MAX_SAMPLES_PER_INSTANCE /= LENGTH_UNLIMITED) then
|
||||
tmp_update := tmp_update or SAMPLE_CNT_FLAG;
|
||||
end if;
|
||||
@ -939,7 +939,7 @@ begin
|
||||
when 2 =>
|
||||
-- No empty Sample Slot Available
|
||||
if (sample_read_data_a = SAMPLE_MEMORY_MAX_ADDRESS) then
|
||||
-- Signal Smaple Memory Full
|
||||
-- Signal Sample Memory Full
|
||||
sample_mem_full_next <= '1';
|
||||
else
|
||||
empty_sample_list_head_next <= sample_read_data_a;
|
||||
@ -1101,7 +1101,7 @@ begin
|
||||
end if;
|
||||
|
||||
if (inst_op_start_a = '1') then
|
||||
-- Latch Signals needed for Mermory Operation (Use _next signals, because some signals are set in same clk)
|
||||
-- Latch Signals needed for Memory Operation (Use _next signals, because some signals are set in same clk)
|
||||
inst_latch_data_next <= (
|
||||
key_hash => key_hash_next,
|
||||
instance_state => instance_state,
|
||||
@ -1122,17 +1122,17 @@ begin
|
||||
-- Reset Data
|
||||
inst_data_next <= ZERO_INSTANCE_DATA;
|
||||
-- NOTE: This process gets the lock implicitly when the SEARCH_INSTANCE, or GET_FIRST_INSTANCE operation is called, and has to be released explicitly
|
||||
-- by the main process. There are two ways to release the lock: 1) The man process explicitly calles the RELEASE_LOCK operation 2) The main
|
||||
-- process pulls the release_inst_lock signal high during the issuing of the last memory operation (Lock will be release after the opration finishes)
|
||||
-- by the main process. There are two ways to release the lock: 1) The man process explicitly calls the RELEASE_LOCK operation 2) The main
|
||||
-- process pulls the release_inst_lock signal high during the issuing of the last memory operation (Lock will be release after the operation finishes)
|
||||
-- Process B has lock
|
||||
if (inst_delete_lock_b = '1') then
|
||||
-- Wait until process B releases lock
|
||||
inst_stage_a_next <= WAIT_FOR_LOCK_1;
|
||||
else
|
||||
-- NOTE: The case that both processes aqcuire the lock at the same time is handled by the B process in the next clock cycle.
|
||||
-- NOTE: The case that both processes acquire the lock at the same time is handled by the B process in the next clock cycle.
|
||||
-- Get Lock
|
||||
inst_delete_lock_a_next <= '1';
|
||||
-- No Instances avialable
|
||||
-- No Instances available
|
||||
if (inst_occupied_head = INSTANCE_MEMORY_MAX_ADDRESS) then
|
||||
inst_addr_base_a_next <= INSTANCE_MEMORY_MAX_ADDRESS;
|
||||
else
|
||||
@ -1187,10 +1187,10 @@ begin
|
||||
-- Wait until process B releases lock
|
||||
inst_stage_a_next <= WAIT_FOR_LOCK_2;
|
||||
else
|
||||
-- NOTE: The case that both processes aqcuire the lock at the same time is handled by the B process in the next clock cycle.
|
||||
-- NOTE: The case that both processes acquire the lock at the same time is handled by the B process in the next clock cycle.
|
||||
-- Get Lock
|
||||
inst_delete_lock_a_next <= '1';
|
||||
-- No Instances avialable
|
||||
-- No Instances available
|
||||
if (inst_occupied_head = INSTANCE_MEMORY_MAX_ADDRESS) then
|
||||
inst_addr_base_a_next <= INSTANCE_MEMORY_MAX_ADDRESS;
|
||||
else
|
||||
@ -1232,7 +1232,7 @@ begin
|
||||
if (inst_delete_lock_b = '0') then
|
||||
-- Get Lock
|
||||
inst_delete_lock_a_next <= '1';
|
||||
-- No Instances avialable
|
||||
-- No Instances available
|
||||
if (inst_occupied_head = INSTANCE_MEMORY_MAX_ADDRESS) then
|
||||
inst_addr_base_a_next <= INSTANCE_MEMORY_MAX_ADDRESS;
|
||||
else
|
||||
|
||||
@ -7,7 +7,7 @@ use ieee.numeric_std.all;
|
||||
|
||||
package ip_package is
|
||||
|
||||
-- TODO : Fix assignemnt of 1 wide array
|
||||
-- TODO : Fix assignment of 1 wide array
|
||||
constant LAYER3_PROTOCOL_NUM : integer := 1;
|
||||
type LAYER3_PROTOCOL_TYPE is array (LAYER3_PROTOCOL_NUM-1 downto 0) of std_logic_vector(7 downto 0);
|
||||
constant LAYER3_PROTOCOLS : LAYER3_PROTOCOL_TYPE := (0 => x"11");
|
||||
|
||||
@ -104,7 +104,7 @@ architecture with_frag of ipv4_in_handler is
|
||||
constant RAM_ADDR_WIDTH : integer := max(log2c(MAX_PARALLEL_FRAG*MAX_FRAG_SIZE), 14);
|
||||
|
||||
--*****TYPE DECLARATION*****
|
||||
-- FSM states. Explained delow in detail
|
||||
-- FSM states. Explained below in detail
|
||||
type PARSER_STAGE_TYPE is (IPv4_INIT, IPv4_HEADER_1, IPv4_HEADER_2, IPv4_HEADER_3, IPv4_HEADER_4,
|
||||
IPv4_HEADER_5, IPv4_PAYLOAD_LENGTH, IPv4_PAYLOAD, IPv4_FRAGMENT_PRE, IPv4_FRAGMENT,
|
||||
IPv4_FRAGMENT_POST, IPv4_BUFFER_SRC, IPv4_BUFFER_DEST, IPv4_BUFFER_LENGTH, IPv4_BUFFER_PAYLOAD,
|
||||
@ -120,7 +120,7 @@ architecture with_frag of ipv4_in_handler is
|
||||
type BUFFER_ADDR_OFFSET_TYPE is array (MAX_PARALLEL_FRAG-1 downto 0) of unsigned(RAM_ADDR_WIDTH-1 downto 0);
|
||||
-- Array of packet sizes in buffers
|
||||
type FRAG_SIZE_ARRAY is array (MAX_PARALLEL_FRAG-1 downto 0) of std_logic_vector(13 downto 0);
|
||||
-- Array of 32-bit buffer word counters. Used for counting new received fragments and determining if the packet is completely re-assebled
|
||||
-- Array of 32-bit buffer word counters. Used for counting new received fragments and determining if the packet is completely re-assembled
|
||||
type BUFFER_WORD_COUNTER_ARRAY is array (MAX_PARALLEL_FRAG-1 downto 0) of integer range 0 to (MAX_FRAG_SIZE/4);
|
||||
|
||||
|
||||
@ -183,7 +183,7 @@ architecture with_frag of ipv4_in_handler is
|
||||
signal buffer_addr_old, buffer_addr_old_next : unsigned(RAM_ADDR_WIDTH-1 downto 0);
|
||||
|
||||
|
||||
--*****ALIAS DEFINATION*****
|
||||
--*****ALIAS DEFINITION*****
|
||||
--IPv4 HEADER
|
||||
alias ip_version : std_logic_vector(3 downto 0) is data_in(31 downto 28);
|
||||
alias ip_ihl : std_logic_vector(3 downto 0) is data_in(27 downto 24);
|
||||
@ -292,7 +292,7 @@ begin
|
||||
end process;
|
||||
|
||||
-- Main State Machine
|
||||
-- STATE DESCRIPSION
|
||||
-- STATE DESCRIPTION
|
||||
-- IPv4_INIT Initial and idle state. Responsible for checking the buffer timers, and reading the packet length from the input FIFO
|
||||
-- IPv4_HEADER_1 Parsing first word of IPv4 HEADER
|
||||
-- IPv4_HEADER_2 Parsing second word of IPv4 HEADER
|
||||
@ -301,7 +301,7 @@ begin
|
||||
-- IPv4_HEADER_5 Parsing fifth word of IPv4 HEADER and writing DEST Addr to output FIFO (if not a fragment)
|
||||
-- IPv4_PAYLOAD_LENGTH Writing packet(payload) length to output FIFO
|
||||
-- IPv4_PAYLOAD Writing of packet(payload) from input FIFO to output FIFO
|
||||
-- IPv4_FRAGMENT_PRE Fragment pre-processing. Checking if fragment is part of already initiated packet re-assembly, initiating new packetre-assembly, or dropping packet if no resources available
|
||||
-- IPv4_FRAGMENT_PRE Fragment pre-processing. Checking if fragment is part of already initiated packet re-assembly, initiating new packet re-assembly, or dropping packet if no resources available
|
||||
-- IPv4_FRAGMENT Writing fragment from input FIFO to RAM buffer
|
||||
-- IPv4_FRAGMENT_POST Fragment post-processing. Checking if received fragment completes the re-assembled packet.
|
||||
-- IPv4_BUFFER_SRC Writing re-assembled packet(payload) SRC Address to output FIFO
|
||||
@ -369,7 +369,7 @@ begin
|
||||
when IPv4_HEADER_1 =>
|
||||
if (empty = '0') then
|
||||
rd_sig <= '1';
|
||||
-- Wrong IP Version or Packet Length missmatch, skip packet
|
||||
-- Wrong IP Version or Packet Length mismatch, skip packet
|
||||
if (ip_version /= "0100" or normalize_length(ip_length) /= std_logic_vector(packet_length)) then
|
||||
stage_next <= SKIP_PACKET;
|
||||
-- Store data and continue Parsing
|
||||
@ -382,7 +382,7 @@ begin
|
||||
when IPv4_HEADER_2 =>
|
||||
if (empty = '0') then
|
||||
rd_sig <= '1';
|
||||
-- No fragmentation, continue parsing normaly
|
||||
-- No fragmentation, continue parsing normally
|
||||
if (ip_MF_flag = '0' and ip_frag_offset = (ip_frag_offset'reverse_range => '0')) then
|
||||
stage_next <= IPv4_HEADER_3;
|
||||
-- IP Fragmentation
|
||||
@ -528,7 +528,7 @@ begin
|
||||
reset_buffer_timer_id <= tmp;
|
||||
-- Reset Maximum Fragment Size
|
||||
frag_size_next(tmp) <= (others => '0');
|
||||
-- Reset fragment word cntouer
|
||||
-- Reset fragment word counter
|
||||
buffer_word_cnt_next(tmp) <= 0;
|
||||
-- Calculate buffer address
|
||||
tmp_frag_offset := (others => '0');
|
||||
@ -779,7 +779,7 @@ architecture no_frag of ipv4_in_handler is
|
||||
|
||||
|
||||
--*****TYPE DECLARATION*****
|
||||
-- FSM states. Explained delow in detail
|
||||
-- FSM states. Explained below in detail
|
||||
type PARSER_STAGE_TYPE is (IPv4_INIT, IPv4_HEADER_1, IPv4_HEADER_2, IPv4_HEADER_3, IPv4_HEADER_4,
|
||||
IPv4_HEADER_5, IPv4_PAYLOAD_LENGTH, IPv4_PAYLOAD, SKIP_HEADER, SKIP_PACKET);
|
||||
|
||||
@ -803,7 +803,7 @@ architecture no_frag of ipv4_in_handler is
|
||||
-- Intermediate output signal, and its 1 clk cycle delayed variant
|
||||
signal wr_sig : std_logic;
|
||||
|
||||
--*****ALIAS DEFINATION*****
|
||||
--*****ALIAS DEFINITION*****
|
||||
--IPv4 HEADER
|
||||
alias ip_version : std_logic_vector(3 downto 0) is data_in(31 downto 28);
|
||||
alias ip_ihl : std_logic_vector(3 downto 0) is data_in(27 downto 24);
|
||||
@ -844,7 +844,7 @@ begin
|
||||
end process;
|
||||
|
||||
-- Main State Machine
|
||||
-- STATE DESCRIPSION
|
||||
-- STATE DESCRIPTION
|
||||
-- IPv4_INIT Initial and idle state. Responsible for checking the buffer timers, and reading the packet length from the input FIFO
|
||||
-- IPv4_HEADER_1 Parsing first word of IPv4 HEADER
|
||||
-- IPv4_HEADER_2 Parsing second word of IPv4 HEADER
|
||||
@ -885,7 +885,7 @@ begin
|
||||
when IPv4_HEADER_1 =>
|
||||
if (empty = '0') then
|
||||
rd_sig <= '1';
|
||||
-- Wrong IP Version or Packet Length missmatch, skip packet
|
||||
-- Wrong IP Version or Packet Length mismatch, skip packet
|
||||
if (ip_version /= "0100" or normalize_length(ip_length) /= std_logic_vector(packet_length)) then
|
||||
stage_next <= SKIP_PACKET;
|
||||
-- Store data and continue Parsing
|
||||
@ -898,7 +898,7 @@ begin
|
||||
when IPv4_HEADER_2 =>
|
||||
if (empty = '0') then
|
||||
rd_sig <= '1';
|
||||
-- No fragmentation, continue parsing normaly
|
||||
-- No fragmentation, continue parsing normally
|
||||
if (ip_MF_flag = '0' and ip_frag_offset = (ip_frag_offset'reverse_range => '0')) then
|
||||
stage_next <= IPv4_HEADER_3;
|
||||
-- IP Fragmentation
|
||||
|
||||
@ -12,7 +12,7 @@ package math_pkg is
|
||||
-- returns the minimum of the two operands
|
||||
function min(constant value1, value2 : in integer) return integer;
|
||||
|
||||
function round_div(constant divident, divisor : in integer) return integer;
|
||||
function round_div(constant dividend, divisor : in integer) return integer;
|
||||
end package;
|
||||
|
||||
|
||||
@ -72,11 +72,11 @@ package body math_pkg is
|
||||
end function;
|
||||
|
||||
-- TODO: Rename to ceil_div, since we do not actually round
|
||||
function round_div(constant divident, divisor : in integer) return integer is
|
||||
function round_div(constant dividend, divisor : in integer) return integer is
|
||||
variable ret : integer;
|
||||
begin
|
||||
ret := divident / divisor;
|
||||
if (divident mod divisor /= 0) then
|
||||
ret := dividend / divisor;
|
||||
if (dividend mod divisor /= 0) then
|
||||
ret := ret + 1;
|
||||
end if;
|
||||
return ret;
|
||||
|
||||
@ -344,7 +344,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
@ -417,7 +417,7 @@ begin
|
||||
end if;
|
||||
end if;
|
||||
when GET_RR_STAMP =>
|
||||
-- We intepret the TIME as a double word for efficiency
|
||||
-- We interpret the TIME as a double word for efficiency
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_4)) then
|
||||
target_align_next <= ALIGN_4;
|
||||
@ -620,7 +620,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when WRITE_RQ_GOAL_ID =>
|
||||
-- Special Encoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Encoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
|
||||
@ -338,7 +338,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
@ -396,7 +396,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when GET_RQ_GOAL_ID =>
|
||||
-- Special Decoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Decoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
@ -615,7 +615,7 @@ begin
|
||||
end if;
|
||||
end if;
|
||||
when WRITE_RR_STAMP =>
|
||||
-- We intepret the TIME as a double word for efficiency
|
||||
-- We interpret the TIME as a double word for efficiency
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_4)) then
|
||||
target_align_next <= ALIGN_4;
|
||||
|
||||
@ -340,7 +340,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
@ -592,7 +592,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when WRITE_RQ_GOAL_ID =>
|
||||
-- Special Encoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Encoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
|
||||
@ -335,7 +335,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
@ -392,7 +392,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when GET_RQ_GOAL_ID =>
|
||||
-- Special Decoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Decoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
|
||||
@ -336,7 +336,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
|
||||
@ -331,7 +331,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
|
||||
@ -14,7 +14,7 @@ use work.GoalStatusArray_package;
|
||||
|
||||
-- NOTE: Even though this Test instantiates other components, we only (mis-) use them for the memory they instantiate, and thus this Test only tests the uut device (Level 0)
|
||||
|
||||
-- This testbench tests the General Behavour of ROS Action Server.
|
||||
-- This testbench tests the General Behaviour of ROS Action Server.
|
||||
-- More specifically following tests are done:
|
||||
-- TEST: NEW GOAL [MEMORY EMPTY]
|
||||
-- TEST: NEW GOAL [ACCEPT]
|
||||
|
||||
@ -14,7 +14,7 @@ use work.GoalStatusArray_package;
|
||||
|
||||
-- NOTE: Even though this Test instantiates other components, we only (mis-) use them for the memory they instantiate, and thus this Test only tests the uut device (Level 0)
|
||||
|
||||
-- This testbench tests the General Behavour of ROS Action Server.
|
||||
-- This testbench tests the General Behaviour of ROS Action Server.
|
||||
-- More specifically following tests are done:
|
||||
-- TEST: NEW GOAL [MEMORY EMPTY]
|
||||
-- TEST: NEW GOAL [ACCEPT]
|
||||
|
||||
@ -9,9 +9,9 @@ use work.rtps_package.all;
|
||||
use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of ROS Services.
|
||||
-- This testbench tests the General Behaviour of ROS Services.
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
|
||||
@ -9,9 +9,9 @@ use work.rtps_package.all;
|
||||
use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of ROS Services.
|
||||
-- This testbench tests the General Behaviour of ROS Services.
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
|
||||
@ -10,9 +10,9 @@ use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
use work.CancelGoal_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of the ROS Services.
|
||||
-- This testbench tests the General Behaviour of the ROS Services.
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
|
||||
@ -10,9 +10,9 @@ use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
use work.CancelGoal_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of ROS Services.
|
||||
-- This testbench tests the General Behaviour of ROS Services.
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
|
||||
@ -10,9 +10,9 @@ use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
use work.Fibonacci_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of ROS publishers and subscribers
|
||||
-- This testbench tests the General Behaviour of ROS publishers and subscribers
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
|
||||
@ -10,9 +10,9 @@ use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
use work.Fibonacci_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of ROS publishers and subscribers
|
||||
-- This testbench tests the General Behaviour of ROS publishers and subscribers
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
|
||||
@ -9,9 +9,9 @@ use work.rtps_package.all;
|
||||
use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of ROS Services.
|
||||
-- This testbench tests the General Behaviour of ROS Services.
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
|
||||
@ -9,9 +9,9 @@ use work.rtps_package.all;
|
||||
use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of ROS Services.
|
||||
-- This testbench tests the General Behaviour of ROS Services.
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
|
||||
@ -10,9 +10,9 @@ use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
use work.Fibonacci_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of ROS Services.
|
||||
-- This testbench tests the General Behaviour of ROS Services.
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
|
||||
@ -10,9 +10,9 @@ use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
use work.Fibonacci_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of ROS Services.
|
||||
-- This testbench tests the General Behaviour of ROS Services.
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
|
||||
@ -13,7 +13,7 @@ use work.GoalStatus_package;
|
||||
|
||||
-- This testbench tests the General Behaviour of ROS Action.
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unsuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test Take Failure on Client TAKE_* Operations
|
||||
-- * Test multiple concurrent Goals
|
||||
-- * Test Encoding/Decoding of Action Messages
|
||||
|
||||
@ -13,7 +13,7 @@ use work.GoalStatus_package;
|
||||
|
||||
-- This testbench tests the General Behaviour of ROS Action.
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unsuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test Take Failure on Client TAKE_* Operations
|
||||
-- * Test multiple concurrent Goals
|
||||
-- * Test Encoding/Decoding of Action Messages
|
||||
|
||||
@ -10,9 +10,9 @@ use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
use work.GoalStatusArray_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of ROS publishers and subscribers
|
||||
-- This testbench tests the General Behaviour of ROS publishers and subscribers
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
|
||||
@ -10,9 +10,9 @@ use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
use work.GoalStatusArray_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of ROS publishers and subscribers
|
||||
-- This testbench tests the General Behaviour of ROS publishers and subscribers
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test Unsupported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
|
||||
@ -12,10 +12,10 @@ use work.rtps_package.all;
|
||||
use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
|
||||
-- This testbench test the general the general ROS Action operation by interconnecting a system with a action client, with a system with a action server.
|
||||
-- This testbench test the general ROS Action operation by interconnecting a system with a action client, with a system with a action server.
|
||||
-- Libraries are used to allow to use systems with different configurations. Testbench_ROS_Lib4 contains the ROS service server, and Testbench_ROS_Lib5
|
||||
-- contains the ROS service client.
|
||||
-- The ROS Service is the Fibonacci service used in the example tutorials, which sends a a goal request of order 10, and gets the fibonacci sequence as
|
||||
-- The ROS Action is the Fibonacci action used in the example tutorials, which sends a a goal request of order 10, and gets the fibonacci sequence as
|
||||
-- result.
|
||||
|
||||
|
||||
|
||||
@ -333,7 +333,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
|
||||
@ -331,7 +331,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
|
||||
@ -253,7 +253,7 @@ begin
|
||||
case (encode_stage) is
|
||||
-- ###GENERATED START###
|
||||
when WRITE_GOAL_ID =>
|
||||
-- Special Encoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Encoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
|
||||
@ -331,7 +331,7 @@ begin
|
||||
case (decode_stage) is
|
||||
-- ###GENERATED START###
|
||||
when GET_GOAL_ID =>
|
||||
-- Special Decoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Decoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
|
||||
@ -342,7 +342,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
@ -415,7 +415,7 @@ begin
|
||||
end if;
|
||||
end if;
|
||||
when GET_RR_STAMP =>
|
||||
-- We intepret the TIME as a double word for efficiency
|
||||
-- We interpret the TIME as a double word for efficiency
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_4)) then
|
||||
target_align_next <= ALIGN_4;
|
||||
@ -618,7 +618,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when WRITE_RQ_GOAL_ID =>
|
||||
-- Special Encoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Encoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
|
||||
@ -338,7 +338,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
@ -396,7 +396,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when GET_RQ_GOAL_ID =>
|
||||
-- Special Decoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Decoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
@ -627,7 +627,7 @@ begin
|
||||
end if;
|
||||
end if;
|
||||
when WRITE_RR_STAMP =>
|
||||
-- We intepret the TIME as a double word for efficiency
|
||||
-- We interpret the TIME as a double word for efficiency
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_4)) then
|
||||
target_align_next <= ALIGN_4;
|
||||
|
||||
@ -383,7 +383,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
@ -681,7 +681,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when WRITE_RQ_GOAL_ID =>
|
||||
-- Special Encoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Encoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
|
||||
@ -377,7 +377,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
@ -434,7 +434,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when GET_RQ_GOAL_ID =>
|
||||
-- Special Decoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Decoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
|
||||
@ -422,7 +422,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
@ -524,7 +524,7 @@ begin
|
||||
end if;
|
||||
end if;
|
||||
when GET_RR_GOALS_CANCELING_GOAL_ID =>
|
||||
-- Special Decoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Decoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
@ -560,7 +560,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when GET_RR_GOALS_CANCELING_STAMP =>
|
||||
-- We intepret the TIME as a double word for efficiency
|
||||
-- We interpret the TIME as a double word for efficiency
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_4)) then
|
||||
target_align_next <= ALIGN_4;
|
||||
@ -780,7 +780,7 @@ begin
|
||||
end if;
|
||||
-- ###GENERATED START###
|
||||
when WRITE_RQ_GOAL_INFO_GOAL_ID =>
|
||||
-- Special Encoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Encoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
@ -803,7 +803,7 @@ begin
|
||||
end if;
|
||||
end if;
|
||||
when WRITE_RQ_GOAL_INFO_STAMP =>
|
||||
-- We intepret the TIME as a double word for efficiency
|
||||
-- We interpret the TIME as a double word for efficiency
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_4)) then
|
||||
target_align_next <= ALIGN_4;
|
||||
|
||||
@ -419,7 +419,7 @@ begin
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Note that the publication handle is useless for the server, since it is only meaningful locally (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
@ -479,7 +479,7 @@ begin
|
||||
end if;
|
||||
-- ###GENERATED START###
|
||||
when GET_RQ_GOAL_INFO_GOAL_ID =>
|
||||
-- Special Decoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Decoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
@ -502,7 +502,7 @@ begin
|
||||
end if;
|
||||
end if;
|
||||
when GET_RQ_GOAL_INFO_STAMP =>
|
||||
-- We intepret the TIME as a double word for efficiency
|
||||
-- We interpret the TIME as a double word for efficiency
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_4)) then
|
||||
target_align_next <= ALIGN_4;
|
||||
@ -742,7 +742,7 @@ begin
|
||||
end if;
|
||||
end if;
|
||||
when WRITE_RR_GOALS_CANCELING_GOAL_ID =>
|
||||
-- Special Encoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Encoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
@ -784,7 +784,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when WRITE_RR_GOALS_CANCELING_STAMP =>
|
||||
-- We intepret the TIME as a double word for efficiency
|
||||
-- We interpret the TIME as a double word for efficiency
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_4)) then
|
||||
target_align_next <= ALIGN_4;
|
||||
|
||||
@ -345,7 +345,7 @@ begin
|
||||
end if;
|
||||
end if;
|
||||
when WRITE_STATUS_LIST_GOAL_INFO_GOAL_ID =>
|
||||
-- Special Encoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Encoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
@ -386,7 +386,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when WRITE_STATUS_LIST_GOAL_INFO_STAMP =>
|
||||
-- We intepret the TIME as a double word for efficiency
|
||||
-- We interpret the TIME as a double word for efficiency
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_4)) then
|
||||
target_align_next <= ALIGN_4;
|
||||
|
||||
@ -426,7 +426,7 @@ begin
|
||||
end if;
|
||||
end if;
|
||||
when GET_STATUS_LIST_GOAL_INFO_GOAL_ID =>
|
||||
-- Special Decoding for effieciency (Prevent having to define memory for UUID)
|
||||
-- Special Decoding for efficiency (Prevent having to define memory for UUID)
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_1)) then
|
||||
target_align_next <= ALIGN_1;
|
||||
@ -462,7 +462,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when GET_STATUS_LIST_GOAL_INFO_STAMP =>
|
||||
-- We intepret the TIME as a double word for efficiency
|
||||
-- We interpret the TIME as a double word for efficiency
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_4)) then
|
||||
target_align_next <= ALIGN_4;
|
||||
|
||||
@ -340,7 +340,7 @@ architecture arch of ros_action_server is
|
||||
-- *Cancel Process Search Types*
|
||||
-- SEARCH_GOAL_ID Search goal list for a specific goal id
|
||||
-- SEARCH_STAMP Search goal list for first goal that was accepted at or before a provided timestamp
|
||||
-- SEARCH_NONE No search criteria. All goals are valid candites (Applies from current list position)
|
||||
-- SEARCH_NONE No search criteria. All goals are valid candidates (Applies from current list position)
|
||||
type SEARCH_TYPE is (SEARCH_GOAL_ID, SEARCH_STAMP, SEARCH_NONE);
|
||||
-- *Instance Memory Opcodes*
|
||||
-- OPCODE DESCRIPTION
|
||||
@ -422,7 +422,7 @@ architecture arch of ros_action_server is
|
||||
signal trigger_result, trigger_result_next : std_logic;
|
||||
-- Result service Request ID latch
|
||||
signal request_id_latch, request_id_latch_next : REQUEST_ID_TYPE;
|
||||
-- Time of next goal expiration dealine
|
||||
-- Time of next goal expiration deadline
|
||||
signal check_time, check_time_next : ROS_TIME_TYPE;
|
||||
-- Temporal time latch (used in time addition calculation)
|
||||
signal time_latch, time_latch_next : ROS_TIME_TYPE;
|
||||
@ -442,7 +442,7 @@ architecture arch of ros_action_server is
|
||||
signal cancel_ret_code, cancel_ret_code_next : std_logic_vector(CDR_INT8_WIDTH-1 downto 0);
|
||||
-- Toggle latch that latches status update requests from other processes
|
||||
signal trigger_status, trigger_status_next : std_logic;
|
||||
-- Index of statusl list sequence
|
||||
-- Index of status list sequence
|
||||
signal status_list_cnt, status_list_cnt_next : natural range 0 to MAX_GOALS;
|
||||
-- Test signal used for testbench synchronisation
|
||||
signal idle_sig : std_logic;
|
||||
@ -462,7 +462,7 @@ architecture arch of ros_action_server is
|
||||
signal mem_cnt, mem_cnt_next : natural range 0 to 19;
|
||||
-- Pointer to currently relevant goal memory frame
|
||||
signal mem_addr_base, mem_addr_base_next : unsigned(GOAL_MEMORY_ADDR_WIDTH-1 downto 0);
|
||||
-- Goal memory fram pointer latch
|
||||
-- Goal memory frame pointer latch
|
||||
signal mem_addr_latch, mem_addr_latch_next : unsigned(GOAL_MEMORY_ADDR_WIDTH-1 downto 0);
|
||||
-- Result index of current empty head goal
|
||||
signal empty_head_res_ind, empty_head_res_ind_next : unsigned(WORD_WIDTH-1 downto 0);
|
||||
@ -1957,7 +1957,7 @@ begin
|
||||
cnt_next <= 0; -- GET_FIRST
|
||||
end if;
|
||||
when SEARCH_STAMP =>
|
||||
-- NOTE: Since the goals are added chronologically, we don't have to check the timetsamps from now on
|
||||
-- NOTE: Since the goals are added chronologically, we don't have to check the timestamps from now on
|
||||
search_type_c_next <= SEARCH_NONE;
|
||||
stage_next <= GET_C_DATA;
|
||||
cnt_next <= 1; -- GET_NEXT
|
||||
@ -2000,13 +2000,13 @@ begin
|
||||
cancel_ret_code_next <= CancelGoal_package.RR_ERROR_NONE;
|
||||
stage_next <= SEND_C_RESPONSE;
|
||||
else
|
||||
-- Search for Timetamps
|
||||
-- Search for Timestamps
|
||||
search_type_c_next <= SEARCH_STAMP;
|
||||
stage_next <= GET_C_DATA;
|
||||
cnt_next <= 0; -- GET_FIRST
|
||||
end if;
|
||||
when SEARCH_STAMP =>
|
||||
-- NOTE: Since the goals are added chronologically, we don't have to check the timetsamps from now on
|
||||
-- NOTE: Since the goals are added chronologically, we don't have to check the timestamps from now on
|
||||
search_type_c_next <= SEARCH_NONE;
|
||||
stage_next <= GET_C_DATA;
|
||||
cnt_next <= 1; -- GET_NEXT
|
||||
|
||||
@ -215,7 +215,7 @@ architecture arch of ros_action_server is
|
||||
-- *Cancel Process Search Types*
|
||||
-- SEARCH_GOAL_ID Search goal list for a specific goal id
|
||||
-- SEARCH_STAMP Search goal list for first goal that was accepted at or before a provided timestamp
|
||||
-- SEARCH_NONE No search criteria. All goals are valid candites (Applies from current list position)
|
||||
-- SEARCH_NONE No search criteria. All goals are valid candidates (Applies from current list position)
|
||||
type SEARCH_TYPE is (SEARCH_GOAL_ID, SEARCH_STAMP, SEARCH_NONE);
|
||||
-- *Instance Memory Opcodes*
|
||||
-- OPCODE DESCRIPTION
|
||||
@ -300,7 +300,7 @@ architecture arch of ros_action_server is
|
||||
signal trigger_status_r : std_logic;
|
||||
-- Result service Request ID latch
|
||||
signal request_id_latch, request_id_latch_next : REQUEST_ID_TYPE;
|
||||
-- Time of next goal expiration dealine
|
||||
-- Time of next goal expiration deadline
|
||||
signal check_time, check_time_next : ROS_TIME_TYPE;
|
||||
-- Temporal time latch (used in time addition calculation)
|
||||
signal time_latch, time_latch_next : ROS_TIME_TYPE;
|
||||
@ -354,7 +354,7 @@ architecture arch of ros_action_server is
|
||||
signal status_stage, status_stage_next : STATUS_STAGE_TYPE;
|
||||
-- Toggle latch that latches status update requests from other processes
|
||||
signal trigger_status, trigger_status_next : std_logic;
|
||||
-- Index of statusl list sequence
|
||||
-- Index of status list sequence
|
||||
signal status_list_cnt, status_list_cnt_next : natural range 0 to MAX_GOALS-1;
|
||||
-- Request memory operation
|
||||
signal mem_start_s : std_logic;
|
||||
@ -370,7 +370,7 @@ architecture arch of ros_action_server is
|
||||
-- *GOAL MEMORY PROCESS*
|
||||
-- Memory process FSM state
|
||||
signal mem_stage, mem_stage_next : MEM_STAGE_TYPE;
|
||||
-- Acknoledge memoryrequest from respective process
|
||||
-- Acknowledge memory request from respective process
|
||||
signal mem_ack_r, mem_ack_s, mem_ack_c, mem_ack_g : std_logic;
|
||||
-- Head of occupied goal list
|
||||
signal mem_occupied_head, mem_occupied_head_next : unsigned(GOAL_MEMORY_ADDR_WIDTH-1 downto 0);
|
||||
@ -384,7 +384,7 @@ architecture arch of ros_action_server is
|
||||
signal mem_cnt, mem_cnt_next : natural range 0 to 19;
|
||||
-- Pointer to currently relevant goal memory frame
|
||||
signal mem_addr_base, mem_addr_base_next : unsigned(GOAL_MEMORY_ADDR_WIDTH-1 downto 0);
|
||||
-- Goal memory fram pointer latch
|
||||
-- Goal memory frame pointer latch
|
||||
signal mem_addr_latch, mem_addr_latch_next : unsigned(GOAL_MEMORY_ADDR_WIDTH-1 downto 0);
|
||||
-- Result index of current empty head goal
|
||||
signal empty_head_res_ind, empty_head_res_ind_next : unsigned(WORD_WIDTH-1 downto 0);
|
||||
@ -1295,7 +1295,7 @@ begin
|
||||
null;
|
||||
end case;
|
||||
when REMOVE_REQUEST =>
|
||||
-- NOTE: After thsi stage the rrq_addr_base is set to the Next request
|
||||
-- NOTE: After this stage the rrq_addr_base is set to the Next request
|
||||
case (cnt) is
|
||||
-- GET Next Addr
|
||||
when 0 =>
|
||||
@ -1873,7 +1873,7 @@ begin
|
||||
|
||||
mem_data_c_next <= mem_data;
|
||||
|
||||
-- NOTE: If both the Main and Cancel FSM enter the atomic operation zone at the smae time, the cancel FSM gives way and waits.
|
||||
-- NOTE: If both the Main and Cancel FSM enter the atomic operation zone at the same time, the cancel FSM gives way and waits.
|
||||
if (atomic_op_r = '1' and mem_data.addr = mem_data_r.addr) then
|
||||
cancel_stage_next <= GET;
|
||||
else
|
||||
@ -1971,7 +1971,7 @@ begin
|
||||
mem_data_c_next.addr <= mem_occupied_head;
|
||||
end if;
|
||||
when SEARCH_STAMP =>
|
||||
-- NOTE: Since the goals are added chronologically, we don't have to check the timetsamps from now on
|
||||
-- NOTE: Since the goals are added chronologically, we don't have to check the timestamps from now on
|
||||
search_type_c_next <= SEARCH_NONE;
|
||||
cancel_stage_next <= GET_NEXT;
|
||||
when SEARCH_NONE =>
|
||||
@ -2018,13 +2018,13 @@ begin
|
||||
else
|
||||
assert (mem_occupied_head /= GOAL_MEMORY_MAX_ADDRESS) severity FAILURE;
|
||||
|
||||
-- Search for Timetamps
|
||||
-- Search for Timestamps
|
||||
search_type_c_next <= SEARCH_STAMP;
|
||||
cancel_stage_next <= GET;
|
||||
mem_data_c_next.addr <= mem_occupied_head;
|
||||
end if;
|
||||
when SEARCH_STAMP =>
|
||||
-- NOTE: Since the goals are added chronologically, we don't have to check the timetsamps from now on
|
||||
-- NOTE: Since the goals are added chronologically, we don't have to check the timestamps from now on
|
||||
search_type_c_next <= SEARCH_NONE;
|
||||
cancel_stage_next <= GET_NEXT;
|
||||
when SEARCH_NONE =>
|
||||
@ -2208,7 +2208,7 @@ begin
|
||||
|
||||
case (mem_stage) is
|
||||
-- NOTE: The REMOVE opcode sets mem_data.addr to the previous slot (or GOAL_MEMORY_MAX_ADDRESS if no previous goals)
|
||||
-- This allows defined behavious of GET_NEXT when removing goals.
|
||||
-- This allows defined behaviours of GET_NEXT when removing goals.
|
||||
when IDLE =>
|
||||
mem_done <= '1';
|
||||
if (mem_start_g = '1') then
|
||||
|
||||
@ -543,7 +543,7 @@ package body ros_package is
|
||||
function to_UUID(input : std_logic_vector) return UUID_TYPE is
|
||||
variable ret : UUID_TYPE;
|
||||
begin
|
||||
assert (input'length = UUID_WIDTH) report "SLV Length missmatch" severity FAILURE;
|
||||
assert (input'length = UUID_WIDTH) report "SLV Length mismatch" severity FAILURE;
|
||||
ret := UUID_UNKNOWN;
|
||||
for i in 0 to ret'length-1 loop
|
||||
ret(i) := get_sub_vector(input, i, ret(i)'length, TRUE);
|
||||
@ -563,7 +563,7 @@ package body ros_package is
|
||||
function to_ROS_TIME(input : std_logic_vector) return ROS_TIME_TYPE is
|
||||
variable ret : ROS_TIME_TYPE;
|
||||
begin
|
||||
assert (input'length = ROS_TIME_WIDTH) report "SLV Length missmatch" severity FAILURE;
|
||||
assert (input'length = ROS_TIME_WIDTH) report "SLV Length mismatch" severity FAILURE;
|
||||
ret.sec := get_sub_vector(input, 0, ret.sec'length, TRUE);
|
||||
ret.nanosec := get_sub_vector(input, 1, ret.nanosec'length, TRUE);
|
||||
return ret;
|
||||
|
||||
@ -184,7 +184,7 @@ package body rtps_config_package is
|
||||
return ret;
|
||||
end function;
|
||||
|
||||
function gen_entyid return ENTITYID_TYPE is
|
||||
function gen_entityid return ENTITYID_TYPE is
|
||||
variable ret : ENTITYID_TYPE;
|
||||
begin
|
||||
ret := (others => (others => '0'));
|
||||
@ -211,7 +211,7 @@ package body rtps_config_package is
|
||||
return ret;
|
||||
end function;
|
||||
|
||||
constant ENTITYID : ENTITYID_TYPE := gen_entyid;
|
||||
constant ENTITYID : ENTITYID_TYPE := gen_entityid;
|
||||
|
||||
function gen_guidprefix return GUIDPREFIX_TYPE is
|
||||
variable tmp : std_logic_vector(GUIDPREFIX_WIDTH-1 downto 0) := (others => '0');
|
||||
|
||||
@ -315,13 +315,13 @@ architecture arch of rtps_discovery_module is
|
||||
-- SEARCH_PARTICIPANT Search memory for Participant Entry with GUID Prefix equal to "guid" signal.
|
||||
-- Set "participant_data.addr" to Base Address of found Participant Entry or PARTICIPANT_MEMORY_MAX_ADDRESS if nothing found.
|
||||
-- "participant_data" contains memory Participant Data according to "mem_r.field_flags".
|
||||
-- INSERT_PARTICIPANT Write Participant Data to next avialable empty slot.
|
||||
-- INSERT_PARTICIPANT Write Participant Data to next available empty slot.
|
||||
-- UPDATE_PARTICIPANT Update the Participant Data of the Participant Entry pointed by "participant_data.addr" according to the "mem_r.field_flags" flags.
|
||||
-- REMOVE_PARTICIPANT Remove the Participant Entry pointed by "participant_data.addr".
|
||||
-- "participant_data.addr" is set to the next Endpoint (or ENDPOINT_MEMORY_MAX_ADDRESS if no next Endpoint exists)
|
||||
-- GET_NEXT_PARTICIPANT Get Participant Data of next participant (from the one pointed by "participant_data.addr") according to "mem_r.field_flags".
|
||||
-- "participant_data.addr" is set to the Address of the Participant, or PARTICIPANT_MEMORY_MAX_ADDRESS if no Participant in Memory
|
||||
-- GET_PATICIPANT Get Participant Data of participant pointed by "mem_r.addr" according to "mem_r.field_flags".
|
||||
-- GET_PARTICIPANT Get Participant Data of participant pointed by "mem_r.addr" according to "mem_r.field_flags".
|
||||
-- Already fetched Data of the same Participant is not modified
|
||||
type MEM_OPCODE_TYPE is (NOP, SEARCH_PARTICIPANT, INSERT_PARTICIPANT, UPDATE_PARTICIPANT, GET_NEXT_PARTICIPANT, REMOVE_PARTICIPANT, GET_PARTICIPANT);
|
||||
-- RTPS Data Submessage Content:
|
||||
@ -412,7 +412,7 @@ architecture arch of rtps_discovery_module is
|
||||
signal endpoint_mask, endpoint_mask_next : std_logic_vector(0 to NUM_ENDPOINTS-1);
|
||||
-- Signifies if the source of the Participant Data is compatible with our Participant
|
||||
signal participant_match, participant_match_next : std_logic;
|
||||
-- Signifies if the Packet is comming from a Subscriber Endpoint
|
||||
-- Signifies if the Packet is coming from a Subscriber Endpoint
|
||||
signal is_subscriber, is_subscriber_next : std_logic;
|
||||
-- Signifies that the read Locator is a Metatraffic Locator
|
||||
signal is_meta_addr, is_meta_addr_next : std_logic;
|
||||
@ -549,7 +549,7 @@ architecture arch of rtps_discovery_module is
|
||||
signal mem_read : std_logic;
|
||||
signal mem_abort_read : std_logic;
|
||||
|
||||
--*****ALIAS DEFINATION*****
|
||||
--*****ALIAS DEFINITION*****
|
||||
-- ENDPOINT FRAME HEADER
|
||||
alias header_opcode : std_logic_vector(7 downto 0) is data_in(31 downto 24);
|
||||
alias header_flags : std_logic_vector(7 downto 0) is data_in(23 downto 16);
|
||||
@ -776,7 +776,7 @@ begin
|
||||
variable tmp_default_qos_match : DEFAULT_QOS_MATCH_TYPE;
|
||||
variable tmp_dw : DOUBLE_WORD_ARRAY;
|
||||
variable mem_seq_nr : SEQUENCENUMBER_TYPE;
|
||||
-- NOTE: We convert the bitamp to a slv to make operations easier (The tool should handle both cases equally)
|
||||
-- NOTE: We convert the bitmap to a slv to make operations easier (The tool should handle both cases equally)
|
||||
variable tmp_bitmap : std_logic_vector(0 to MAX_BITMAP_WIDTH-1);
|
||||
begin
|
||||
--DEFAULT Registered
|
||||
@ -954,7 +954,7 @@ begin
|
||||
reader_flags_next <= (READER_EXPECTS_INLINE_QOS_FLAG => DEFAULT_EXPECTS_INLINE_QOS, READER_EXPECTS_HISTORICAL_DATA_FLAG => DEFAULT_EXPECTS_HISTORICAL_DATA_FLAG, READER_IS_BEST_EFFORT_FLAG => DEFAULT_IS_BEST_EFFORT_FLAG, others => '0');
|
||||
rcvd_next <= (others => '0');
|
||||
ud_status_next <= '0';
|
||||
-- NOTE: We work with a "mark by default, and unmark on first missmatch" System.
|
||||
-- NOTE: We work with a "mark by default, and unmark on first mismatch" System.
|
||||
-- This assumes that each RxO QoS parameter occur only once in the list, else the behavior is undefined.
|
||||
participant_match_next <= '1';
|
||||
endpoint_mask_next <= (others => '1');
|
||||
@ -1493,13 +1493,13 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
elsif (ud_status = '1') then
|
||||
-- NOTE: If the DATA message has a paylaod with DATA, the parsed in-line QoS (i.e. PID_STATUS_INFO) is ignored
|
||||
-- NOTE: If the DATA message has a payload with DATA, the parsed in-line QoS (i.e. PID_STATUS_INFO) is ignored
|
||||
-- NOTE: A Sanity check is made on the GUID. It is expected that the GUID is correctly configured by parsing of an PID_KEY_HASH.
|
||||
-- According to the specification the PID_KEY_HASH is not a requirement, and the Key should be sent as serialized key in the DATA
|
||||
-- message payload. We do not parse the serialized key (because, quite frankly, we can't since we do not have a definition of it...)
|
||||
-- This means that if the sender does not send a PID_KEY_HASH and the sanity check here fails, the Packet will be skipped, and thus
|
||||
-- processing from the sender will effectively stall, since the SN will never be acknowledged.
|
||||
-- Participant Unamtch
|
||||
-- Participant Unmatch
|
||||
if (message_type = PDP and guid(3) = ENTITYID_PARTICIPANT) then
|
||||
participant_match_next <= '0';
|
||||
stage_next <= PARTICIPANT_MATCH_STAGE;
|
||||
@ -1574,7 +1574,7 @@ begin
|
||||
else
|
||||
cnt_next <= cnt + 1;
|
||||
end if;
|
||||
-- Participant Mesasge Kind
|
||||
-- Participant Message Kind
|
||||
when 3 =>
|
||||
-- NOTE: Rest of Participant Message is ignored
|
||||
-- XXX: The Participant Message Data may contain additional data, and according to DDSI-RTPS 2.3
|
||||
@ -1635,7 +1635,7 @@ begin
|
||||
end case;
|
||||
end if;
|
||||
when PROCESS_GAP =>
|
||||
-- NOTE: Data is already endain swapped by rtps_handler
|
||||
-- NOTE: Data is already endian swapped by rtps_handler
|
||||
|
||||
-- Input FIFO Guard
|
||||
if (empty = '0') then
|
||||
@ -1738,7 +1738,7 @@ begin
|
||||
end if;
|
||||
end if;
|
||||
when PROCESS_HEARTBEAT =>
|
||||
-- NOTE: Data is already endain swapped by rtps_handler
|
||||
-- NOTE: Data is already endian swapped by rtps_handler
|
||||
|
||||
-- Input FIFO Guard
|
||||
if (empty = '0') then
|
||||
@ -1776,7 +1776,7 @@ begin
|
||||
if (participant_data.heartbeat_res_time = TIME_INVALID) then
|
||||
-- If current Sequence Number obsolete (removed from source history cache)
|
||||
if (first_seq_nr > mem_seq_nr) then
|
||||
-- Store new expected Sequence Number and set Response Dealy
|
||||
-- Store new expected Sequence Number and set Response Delay
|
||||
mem_op_start <= '1';
|
||||
mem_opcode <= UPDATE_PARTICIPANT;
|
||||
mem_r.addr <= participant_data.addr;
|
||||
@ -1854,7 +1854,7 @@ begin
|
||||
stage_next <= SKIP_PACKET;
|
||||
end if;
|
||||
when PROCESS_ACKNACK =>
|
||||
-- NOTE: Data is already endain swapped by rtps_handler
|
||||
-- NOTE: Data is already endian swapped by rtps_handler
|
||||
|
||||
-- Input FIFO Guard
|
||||
if (empty = '0') then
|
||||
@ -2165,7 +2165,7 @@ begin
|
||||
check_time_next <= participant_data.acknack_res_time;
|
||||
end if;
|
||||
end if;
|
||||
-- HELPER STAGE (Lacthes Participant GUID for participant Unmatching)
|
||||
-- HELPER STAGE (Latches Participant GUID for participant Unmatching)
|
||||
when 6 =>
|
||||
assert stable(clk, check_mask(participant_data.field_flags, PMF_GUIDPREFIX_FLAG)) severity FAILURE;
|
||||
|
||||
@ -2199,7 +2199,7 @@ begin
|
||||
|
||||
-- NOTE: The HEARTBEAT Time is re-checked in order to update the check_time
|
||||
-- Continue
|
||||
cnt_next <= 4; -- CHECK HERTBEAT Response Time
|
||||
cnt_next <= 4; -- CHECK HEARTBEAT Response Time
|
||||
-- POST-DATA-SENT
|
||||
when 8 =>
|
||||
assert stable(clk, check_mask(participant_data.field_flags, PMF_EXTRA_FLAGS_FLAG)) severity FAILURE;
|
||||
@ -2611,7 +2611,7 @@ begin
|
||||
null;
|
||||
end case;
|
||||
when SELECT_LOCATOR =>
|
||||
-- NOTE: If port is set to something other than UDP_PORT_INVALID, the addr is also guarranteed to be unequal IPv4_ADDRESS_INVALID (and vice versa)
|
||||
-- NOTE: If port is set to something other than UDP_PORT_INVALID, the addr is also guaranteed to be unequal IPv4_ADDRESS_INVALID (and vice versa)
|
||||
-- We compare only the port to save on resources (If necessary we could define a bit for that).
|
||||
|
||||
-- DEFAULT
|
||||
@ -2621,7 +2621,7 @@ begin
|
||||
-- Participant Data
|
||||
when PDP =>
|
||||
if (PREFER_MULTICAST) then
|
||||
--*METATRAFIC*
|
||||
--*METATRAFFIC*
|
||||
-- Multicast Locator Valid
|
||||
if (meta_mc_port /= UDP_PORT_INVALID) then
|
||||
meta_addr_next <= meta_mc_addr;
|
||||
@ -2650,7 +2650,7 @@ begin
|
||||
def_port_next <= USER_IPv4_MULTICAST_PORT;
|
||||
end if;
|
||||
else
|
||||
--*METATRAFIC*
|
||||
--*METATRAFFIC*
|
||||
-- Unicast Locator Valid
|
||||
if (meta_uc_port /= UDP_PORT_INVALID) then
|
||||
meta_addr_next <= meta_uc_addr;
|
||||
@ -2733,7 +2733,7 @@ begin
|
||||
-- NOTE: This assumes that the Parameter is padded with zeroes (Since we also compare the padding)
|
||||
-- XTypes 7.4.1.1 requires padding bytes for "PLAIN_CDR" to be zero, but does not specify the value for "PL_CDR"
|
||||
|
||||
-- Unmark matches on string comparison missmatch
|
||||
-- Unmark matches on string comparison mismatch
|
||||
case (string_content) is
|
||||
when TOPIC_NAME_TYPE =>
|
||||
for i in 0 to NUM_ENDPOINTS-1 loop
|
||||
@ -4194,7 +4194,7 @@ begin
|
||||
mem_op_done <= '1';
|
||||
|
||||
if (mem_op_start = '1') then
|
||||
-- Latch Signals needed for Mermory Operation
|
||||
-- Latch Signals needed for Memory Operation
|
||||
participant_latch_data_next <= mem_r;
|
||||
|
||||
case(mem_opcode) is
|
||||
|
||||
@ -191,9 +191,9 @@ architecture arch of rtps_handler is
|
||||
signal align_sig, align_sig_next : std_logic_vector((3*BYTE_WIDTH)-1 downto 0);
|
||||
-- 4-Byte Aligned Input (see align_prc)
|
||||
signal data_in_aligned : std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
-- 4-Byte Alignement offset (see align_prc)
|
||||
-- 4-Byte Alignment offset (see align_prc)
|
||||
signal align_offset, align_offset_next : std_logic_vector(1 downto 0);
|
||||
-- 4-Byte Alignement offset latch
|
||||
-- 4-Byte Alignment offset latch
|
||||
signal offset_latch, offset_latch_next : std_logic_vector(1 downto 0);
|
||||
-- IPv4 Source Address latch
|
||||
signal src_addr, src_addr_next : std_logic_vector(IPv4_ADDRESS_WIDTH-1 downto 0);
|
||||
@ -234,7 +234,7 @@ architecture arch of rtps_handler is
|
||||
signal sn_latch_2, sn_latch_2_next : SEQUENCENUMBER_TYPE;
|
||||
-- Sequence Number latch
|
||||
signal sn_latch_3, sn_latch_3_next : SEQUENCENUMBER_TYPE;
|
||||
-- Long atch
|
||||
-- Long latch
|
||||
signal long_latch, long_latch_next : std_logic_vector(CDR_LONG_WIDTH-1 downto 0);
|
||||
-- Unsigned long latch
|
||||
signal ulong_latch, ulong_latch_next : unsigned(CDR_LONG_WIDTH-1 downto 0);
|
||||
@ -300,7 +300,7 @@ begin
|
||||
last_word_out_rtps <= last_word_out_sig;
|
||||
|
||||
-- This process is responsible for reading the input FIFO 4-Byte Word aligned.
|
||||
-- Even though DDSI-RTPS 2.3 defines that Submessages begin at 4-byte boundries, meaning that the
|
||||
-- Even though DDSI-RTPS 2.3 defines that Submessages begin at 4-byte boundaries, meaning that the
|
||||
-- submessage length is always a multiple of 4, the same is not defined for the "octetstoinlineQoS".
|
||||
-- Therefore alignment is not guaranteed from the "SKIP_DATA_HEADER" stage onwards and has to be ensured explicitly.
|
||||
-- We store the lower 2 bits of the octet length (Which denotes the 4-Byte alignment offset), and together
|
||||
@ -341,7 +341,7 @@ begin
|
||||
-- PARSE_ACKNACK Parse AckNack Submessage
|
||||
-- PARSE_GAP Parse GAP Submessage
|
||||
-- PARSE_DATA Parse DATA Submessage
|
||||
-- SKIP_DATA_HEADER Skip uknown DATA Submessage Sub-Header part
|
||||
-- SKIP_DATA_HEADER Skip unknown DATA Submessage Sub-Header part
|
||||
-- MATCH_DST_ENDPOINT Determine destination of Submessage
|
||||
-- PUSH_PAYLOAD_HEADER Write Payload Header into relevant output FIFOs
|
||||
-- PUSH_PAYLOAD Write Payload into relevant output FIFOs (May read directly from input FIFO)
|
||||
@ -485,7 +485,7 @@ begin
|
||||
stage_next <= SKIP_PACKET;
|
||||
end case;
|
||||
end if;
|
||||
-- First RTPS Header word (Fields: Protocolld)
|
||||
-- First RTPS Header word (Fields: ProtocolID)
|
||||
when RTPS_HEADER_1 =>
|
||||
-- Input FIFO Guard
|
||||
if (empty = '0') then
|
||||
@ -697,11 +697,11 @@ begin
|
||||
rd_guard := '1';
|
||||
|
||||
case (cnt) is
|
||||
-- Timesatmp 1/2
|
||||
-- Timestamp 1/2
|
||||
when 0 =>
|
||||
src_ts_next(0) <= unsigned(data_in_swapped);
|
||||
cnt_next <= cnt + 1;
|
||||
-- Timesatmp 2/2
|
||||
-- Timestamp 2/2
|
||||
when 1 =>
|
||||
src_ts_next(1) <= unsigned(data_in_swapped);
|
||||
|
||||
@ -1087,7 +1087,7 @@ begin
|
||||
if ((read_cnt & "00") >= data_header_end) then
|
||||
stage_next <= MATCH_DST_ENDPOINT;
|
||||
cnt_next <= 0;
|
||||
-- Fix alignement
|
||||
-- Fix alignment
|
||||
align_offset_next <= offset_latch;
|
||||
-- Input Guard
|
||||
elsif(empty = '0') then
|
||||
@ -1363,7 +1363,7 @@ begin
|
||||
if (read_cnt = sub_end) then
|
||||
-- Begin parsing of next submessage
|
||||
stage_next <= RTPS_SUB_HEADER;
|
||||
-- Reset alignement
|
||||
-- Reset alignment
|
||||
align_offset_next <= (others => '0');
|
||||
-- Reset Submessage End
|
||||
sub_end_next <= (others => '1');
|
||||
@ -1382,7 +1382,7 @@ begin
|
||||
last_word_out_sig <= '1';
|
||||
-- Begin parsing of next submessage
|
||||
stage_next <= RTPS_SUB_HEADER;
|
||||
-- Reset alignement
|
||||
-- Reset alignment
|
||||
align_offset_next <= (others => '0');
|
||||
-- Reset Submessage End
|
||||
sub_end_next <= (others => '1');
|
||||
|
||||
@ -158,7 +158,7 @@ begin
|
||||
when IDLE =>
|
||||
-- Currently Selected Input FIFO is empty
|
||||
if (empty(selector) = '1') then
|
||||
-- Wrap from End to BEgining (Circular selection)
|
||||
-- Wrap from End to Beginning (Circular selection)
|
||||
if (selector = RTPS_OUT_WIDTH-1) then
|
||||
selector_next <= 0;
|
||||
else
|
||||
|
||||
@ -254,7 +254,7 @@ package rtps_package is
|
||||
constant SID_DATA_FRAG : std_logic_vector(SUBMESSAGE_ID_WIDTH-1 downto 0) := x"16";
|
||||
|
||||
-- *SUBMESSAGE FLAG POSITIONS*
|
||||
-- NOTE: The KEY and NON_STANDARD_PAYOAD Flags for the DATA_FRAG Submessage are off by one (-1) from this positions
|
||||
-- NOTE: The KEY and NON_STANDARD_PAYLOAD Flags for the DATA_FRAG Submessage are off by one (-1) from this positions
|
||||
constant SUBMESSAGE_ENDIAN_FLAG_POS : natural := 0;
|
||||
constant SUBMESSAGE_FINAL_FLAG_POS : natural := 1;
|
||||
constant SUBMESSAGE_INLINE_QOS_FLAG_POS : natural := 1;
|
||||
@ -373,7 +373,7 @@ package rtps_package is
|
||||
|
||||
-- *LOCATOR KIND*
|
||||
constant LOCATOR_KIND_INVALID : std_logic_vector := std_logic_vector(to_signed(-1,LOCATOR_KIND_WIDTH));
|
||||
constant LOCATOR_KIND_RESERVERD : std_logic_vector := std_logic_vector(to_signed(0,LOCATOR_KIND_WIDTH));
|
||||
constant LOCATOR_KIND_RESERVED : std_logic_vector := std_logic_vector(to_signed(0,LOCATOR_KIND_WIDTH));
|
||||
constant LOCATOR_KIND_UDPv4 : std_logic_vector := std_logic_vector(to_signed(1,LOCATOR_KIND_WIDTH));
|
||||
constant LOCATOR_KIND_UDPv6 : std_logic_vector := std_logic_vector(to_signed(2,LOCATOR_KIND_WIDTH));
|
||||
|
||||
@ -517,7 +517,7 @@ package rtps_package is
|
||||
function substr(first : natural; last : natural; str : string) return USER_STRING_TYPE;
|
||||
|
||||
type CONFIG_TYPE is record
|
||||
-- If Endpoint uses Keye Topics
|
||||
-- If Endpoint uses Keyed Topics
|
||||
WITH_KEY : boolean;
|
||||
-- If Writer pushes new Cache Changes/Samples immediately (without waiting for reader ACKNACK first)
|
||||
PUSH_MODE : boolean; -- (only relevant to Writers)
|
||||
@ -591,7 +591,7 @@ package rtps_package is
|
||||
-- Quartus cannot handle arrays of records containing subtypes of strings (USER_STRING_ARRAY_TYPE) in generics.
|
||||
-- We define a special record type that does not contain string subtypes (TOPIC and TYPE) and a conversion function as a workaround.
|
||||
type QUARTUS_CONFIG_TYPE is record
|
||||
-- If Endpoint uses Keye Topics
|
||||
-- If Endpoint uses Keyed Topics
|
||||
WITH_KEY : boolean;
|
||||
-- If Writer pushes new Cache Changes/Samples immediately (without waiting for reader ACKNACK first)
|
||||
PUSH_MODE : boolean; -- (only relevant to Writers)
|
||||
@ -737,7 +737,7 @@ package body rtps_package is
|
||||
ret(0) := to_unsigned(s, WORD_WIDTH);
|
||||
|
||||
-- If Fraction Bit is >= 500 ms it cannot be represented as a natural (because naturals/integers are signed).
|
||||
-- So we handle that manualy
|
||||
-- So we handle that manually
|
||||
if (ns >= half_sec) then
|
||||
ret(1) := to_unsigned(natural(CEIL(real(ns-half_sec)*unit)),WORD_WIDTH);
|
||||
ret(1)(31) := '1';
|
||||
@ -1202,7 +1202,7 @@ package body rtps_package is
|
||||
function to_guid(A : std_logic_vector) return GUID_TYPE is
|
||||
variable ret : GUID_TYPE;
|
||||
begin
|
||||
assert (A'length = GUID_WIDTH) report "SLV Length missmatch" severity FAILURE;
|
||||
assert (A'length = GUID_WIDTH) report "SLV Length mismatch" severity FAILURE;
|
||||
ret := GUID_UNKNOWN;
|
||||
for i in 0 to ret'length-1 loop
|
||||
ret(i) := get_sub_vector(A, i, ret(i)'length, TRUE);
|
||||
|
||||
@ -357,13 +357,13 @@ architecture arch of rtps_reader is
|
||||
signal mem_addr_base, mem_addr_base_next : unsigned(ENDPOINT_MEMORY_ADDR_WIDTH-1 downto 0);
|
||||
-- General Memory Address Latch
|
||||
signal mem_addr_latch, mem_addr_latch_next : unsigned(ENDPOINT_MEMORY_ADDR_WIDTH-1 downto 0);
|
||||
-- General Purpose Couter
|
||||
-- General Purpose Counter
|
||||
signal mem_cnt, mem_cnt_next : natural range 0 to 29;
|
||||
-- Latch for Endpoint Data from Memory
|
||||
signal mem_endpoint_data, mem_endpoint_data_next : ENDPOINT_DATA_TYPE;
|
||||
-- Latch for Endpoint Data from main process
|
||||
signal mem_endpoint_latch_data, mem_endpoint_latch_data_next : ENDPOINT_DATA_TYPE;
|
||||
-- Signal used to write to ALL memories simutanously
|
||||
-- Signal used to write to ALL memories simultaneously
|
||||
signal multi_w : std_logic;
|
||||
|
||||
-- *ENDPOINT MEMORY CONNECTION SIGNALS*
|
||||
@ -550,12 +550,12 @@ begin
|
||||
-- INITIATE_ENDPOINT_SEARCH Initiate Endpoint Search Memory Operation. This state is used to start the Search operation as soon as the required data is available
|
||||
-- METATRAFFIC_OPERATION State handling the Metatraffic Operations
|
||||
-- PROCESS_HEARTBEAT Parse RTPS HEARTBEAT Message. Update stored Sequence Number if necessary. Set HEARTBEAT response time accordingly.
|
||||
-- PROCESS_GAP Parse RTPS GAP Submsessage. Initiates search for next valid Sequence Number if currently expected Sequence Number is in GAP
|
||||
-- PROCESS_GAP Parse RTPS GAP Submessage. Initiates search for next valid Sequence Number if currently expected Sequence Number is in GAP
|
||||
-- FIND_NEXT_VALID_IN_BITMAP Iterate through Bitmap and find the next valid Sequence Number.
|
||||
-- INITIATE_ADD_CACHE_CHANGE_REQUEST Initiate an ADD_CACHE_CHANGE Operation
|
||||
-- ADD_CACHE_CHANGE Send CACHE_CHANGE Data
|
||||
-- PUSH_PAYLOAD Send CACHE_CHANGE Data (Direct Input Passthrough)
|
||||
-- FINALIZE_ADD_CACHE_CHANGE_REQUEST Wait for ADD_CACHE_CHANGE Operation Results. Update Endpoint Data if successfull.
|
||||
-- FINALIZE_ADD_CACHE_CHANGE_REQUEST Wait for ADD_CACHE_CHANGE Operation Results. Update Endpoint Data if successful.
|
||||
-- ENDPOINT_STALE_CHECK Check remote Endpoint Entries for Liveliness Lease Expiration, and Response Timeouts.
|
||||
-- SEND_HEADER Send Output Data Header and RTPS Message Header
|
||||
-- SEND_ACKNACK Send ACKNACK Submessage
|
||||
@ -564,7 +564,7 @@ begin
|
||||
-- SKIP_META_OPERATION Skip Metatraffic Operation
|
||||
parse_prc : process(all)
|
||||
variable tmp_dw : DOUBLE_WORD_ARRAY;
|
||||
-- NOTE: We convert the bitamp to a slv to make operations easier (The synthesizer should handle both cases equally)
|
||||
-- NOTE: We convert the bitmap to a slv to make operations easier (The synthesizer should handle both cases equally)
|
||||
variable tmp_bitmap : std_logic_vector(0 to MAX_BITMAP_WIDTH-1);
|
||||
variable rd_guard : std_logic;
|
||||
begin
|
||||
@ -2058,7 +2058,7 @@ begin
|
||||
-- XXX: Possible Worst Case Path (64-bit addition and comparison in same clock)
|
||||
-- Update Check Time
|
||||
if (tmp_dw < check_time) then
|
||||
-- NOTE: Strictly speaking the check time may not EXACTLY represent the res_time (Since the last bit is ovverriden for a different functionality)
|
||||
-- NOTE: Strictly speaking the check time may not EXACTLY represent the res_time (Since the last bit is overridden for a different functionality)
|
||||
-- Since the difference is at most 1/10^(-32) seconds, this will never practically impose any problem (since the time will most certainly have
|
||||
-- progressed beyond that difference from the check_time trigger to the actual res_time check).
|
||||
-- Nevertheless this has to be taken into account in testbenches that use "static" time.
|
||||
@ -2319,7 +2319,7 @@ begin
|
||||
mem_op_done <= '1';
|
||||
|
||||
if (mem_op_start = '1') then
|
||||
-- Latch Signals needed for Mermory Operation
|
||||
-- Latch Signals needed for Memory Operation
|
||||
mem_endpoint_latch_data_next <= mem_r;
|
||||
|
||||
case(mem_opcode) is
|
||||
|
||||
@ -205,7 +205,7 @@ package rtps_test_package is
|
||||
|
||||
-- Generic RTPS Endpoint Container
|
||||
type ENDPOINT_DATA_TYPE is record
|
||||
-- Signifies if the Endoint Data represented by this Record is a Reader Endpoint
|
||||
-- Signifies if the Endpoint Data represented by this Record is a Reader Endpoint
|
||||
reader : boolean;
|
||||
-- Signifies if the Data should be written in Little Endian
|
||||
littleEndian : std_logic;
|
||||
@ -284,7 +284,7 @@ package rtps_test_package is
|
||||
srank : natural;
|
||||
-- Generation Rank
|
||||
grank : natural;
|
||||
-- Absolut Generation Rank
|
||||
-- Absolute Generation Rank
|
||||
agrank : natural;
|
||||
-- Source Timestamp
|
||||
ts : TIME_TYPE;
|
||||
@ -313,7 +313,7 @@ package rtps_test_package is
|
||||
vstate : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0);
|
||||
-- Disposed Generation Count
|
||||
dis_gen_cnt : natural;
|
||||
-- No Writers Geneation Count
|
||||
-- No Writers Generation Count
|
||||
no_w_gen_cnt : natural;
|
||||
end record;
|
||||
|
||||
@ -355,7 +355,7 @@ package rtps_test_package is
|
||||
|
||||
constant DEFAULT_DDS_READER_TEST : DDS_READER_TEST_TYPE; -- Deferred to Package Body
|
||||
|
||||
-- Represntation of RTPS Writer Operations
|
||||
-- Representation of RTPS Writer Operations
|
||||
type RTPS_WRITER_TEST_TYPE is record
|
||||
opcode : HISTORY_CACHE_OPCODE_TYPE;
|
||||
cc : CACHE_CHANGE_TYPE;
|
||||
@ -399,7 +399,7 @@ package rtps_test_package is
|
||||
-- Writes RTPS Output Header based on "ref" to "output"
|
||||
procedure gen_output_header(ref : in OUTPUT_HEADER_TYPE; output : inout TEST_PACKET_TYPE);
|
||||
-- Fixes the "Packet Length" Field of the RTPS Output Reader with the current Packet Length
|
||||
-- This function should be called to fnalize the RTPS packet
|
||||
-- This function should be called to finalize the RTPS packet
|
||||
procedure fix_output_packet(output : inout TEST_PACKET_TYPE);
|
||||
-- Writes RTPS Header based on "ref" to "output"
|
||||
procedure gen_rtps_header( ref : in RTPS_HEADER_TYPE; output : inout TEST_PACKET_TYPE);
|
||||
@ -423,7 +423,7 @@ package rtps_test_package is
|
||||
-- participant participant to assert Liveliness
|
||||
-- manual TRUE if MANUAL_LIVELINESS_UPDATE, FALSE if AUTOMATIC_LIVELINESS_UPDATE
|
||||
-- extra_data Extra Data in Participant Message
|
||||
-- output Destination of generated ouput
|
||||
-- output Destination of generated output
|
||||
procedure gen_liveliness_assertion(participant : in PARTICIPANT_DATA_TYPE; manual : in boolean; extra_data : in TEST_PACKET_TYPE; output : inout TEST_PACKET_TYPE);
|
||||
-- Same as previous procedure, but extra_data is EMPTY
|
||||
procedure gen_liveliness_assertion(participant : in PARTICIPANT_DATA_TYPE; manual : in boolean; output : inout TEST_PACKET_TYPE);
|
||||
@ -442,7 +442,7 @@ package rtps_test_package is
|
||||
procedure gen_inline_qos(ref : in CACHE_CHANGE_TYPE; endpoint : in ENDPOINT_DATA_TYPE; expectsInlineQoS : in boolean; littleEndian : in std_logic; output : inout TEST_PACKET_TYPE; pid : in std_logic_vector(PARAMETER_ID_WIDTH-1 downto 0); offset : in integer);
|
||||
-- Like previous procedure, but no Endpoint Data related PIDs are generated (only PID_KEY_HASH, PID_STATUS_INFO)
|
||||
procedure gen_inline_qos(ref : in CACHE_CHANGE_TYPE; output : inout TEST_PACKET_TYPE);
|
||||
-- Like previous procedure, but the data for PID_STATUS_INFO andf PID_KEY_HASH are given directly.
|
||||
-- Like previous procedure, but the data for PID_STATUS_INFO and PID_KEY_HASH are given directly.
|
||||
procedure gen_inline_qos(status : in CACHE_CHANGE_KIND_TYPE; key : in INSTANCE_HANDLE_TYPE; output : inout TEST_PACKET_TYPE);
|
||||
-- Like previous procedure but with "pid" and "offset" parameters.
|
||||
procedure gen_inline_qos(status : in CACHE_CHANGE_KIND_TYPE; key : in INSTANCE_HANDLE_TYPE; output : inout TEST_PACKET_TYPE; pid : in std_logic_vector(PARAMETER_ID_WIDTH-1 downto 0); offset : in integer);
|
||||
@ -569,7 +569,7 @@ package rtps_test_package is
|
||||
function int(n : integer; width : natural) return std_logic_vector;
|
||||
-- to_string Function for ScoreBoardPkg_discovery_module
|
||||
function to_string1 (input : std_logic_vector) return string;
|
||||
-- Find first valid Locator of Particiapnt Data
|
||||
-- Find first valid Locator of Participant Data
|
||||
-- ref Participant Data to extract Locator from
|
||||
-- meta If TRUE extracts metatraffic Locator
|
||||
-- NOTE: This assumes a specific sending order (Multicast before Unicast)!
|
||||
@ -1198,7 +1198,7 @@ package body rtps_test_package is
|
||||
output.length := output.length + 1;
|
||||
-- *HEARTBEAT_FRAG*
|
||||
elsif (ref.submessageID = SID_HEARTBEAT_FRAG) then
|
||||
-- Last Fargment Number
|
||||
-- Last Fragment Number
|
||||
output.data(output.length) := endian_swap(ref.flags(SUBMESSAGE_ENDIAN_FLAG_POS), ref.lastFragmentNum);
|
||||
output.length := output.length + 1;
|
||||
end if;
|
||||
@ -1225,7 +1225,7 @@ package body rtps_test_package is
|
||||
-- Fragment Number
|
||||
output.data(output.length) := endian_swap(ref.flags(SUBMESSAGE_ENDIAN_FLAG_POS), ref.fragmentStartingNumber);
|
||||
output.length := output.length + 1;
|
||||
-- FragmentsinSubmessage & FragmentSize
|
||||
-- FragmentsInSubmessage & FragmentSize
|
||||
output.data(output.length) := endian_swap(ref.flags(SUBMESSAGE_ENDIAN_FLAG_POS), ref.fragmentsInSubmessage) & endian_swap(ref.flags(SUBMESSAGE_ENDIAN_FLAG_POS), ref.fragmentSize);
|
||||
output.length := output.length + 1;
|
||||
-- Sample Size
|
||||
@ -1266,7 +1266,7 @@ package body rtps_test_package is
|
||||
end if;
|
||||
end loop;
|
||||
end if;
|
||||
-- Fix Alignement
|
||||
-- Fix Alignment
|
||||
if ((tmp + (ref.data.length*4)) mod 4 /= 0) then
|
||||
output.length := output.length + 1;
|
||||
end if;
|
||||
@ -1334,7 +1334,7 @@ package body rtps_test_package is
|
||||
elsif (ref.submessageLength /= (ref.submessageLength'reverse_range => '0')) then
|
||||
output.length := start + to_integer(unsigned(ref.submessageLength));
|
||||
end if;
|
||||
-- *PAD/UKNOWN*
|
||||
-- *PAD/UNKNOWN*
|
||||
else
|
||||
-- Padding
|
||||
tmp := to_integer(unsigned(ref.submessageLength));
|
||||
@ -1369,7 +1369,7 @@ package body rtps_test_package is
|
||||
output.data(output.length) := ref.writerId;
|
||||
output.length := output.length + 1;
|
||||
end if;
|
||||
-- Destination Enity ID
|
||||
-- Destination Entity ID
|
||||
if (is_meta) then
|
||||
if (ref.submessageID = SID_ACKNACK or ref.submessageID = SID_NACK_FRAG) then
|
||||
output.data(output.length) := ref.writerId;
|
||||
@ -3053,7 +3053,7 @@ package body rtps_test_package is
|
||||
-- Insert at desired index
|
||||
mem.s(ind) := sample;
|
||||
when others =>
|
||||
assert FALSE report "Unkown DESTINATION_ORDER_QOS" severity FAILURE;
|
||||
assert FALSE report "Unknown DESTINATION_ORDER_QOS" severity FAILURE;
|
||||
end case;
|
||||
mem.slen := mem.slen + 1;
|
||||
end procedure;
|
||||
|
||||
@ -33,7 +33,7 @@ use work.rtps_config_package.all;
|
||||
-- This entity interacts with the HistoryCache via a start/done operation schema.
|
||||
-- The allowed operations are GET_CACHE_CHANGE, ACK_CACHE_CHANGE, NACK_CACHE_CHANGE, REMOVE_CACHE_CHANGE, GET_MIN_SN,
|
||||
-- and GET_MAX_SN.
|
||||
-- Everytime new data is available ('data_available' signal of the HistoryCache is high), or data needs to be fetched to
|
||||
-- every time new data is available ('data_available' signal of the HistoryCache is high), or data needs to be fetched to
|
||||
-- satisfy a request the GET_CACHE_CHANGE operation is executed.
|
||||
-- Once a SN has been acknowledged by all matched remote (reliable) readers, either the ACK_CACHE_CHANGE operation is
|
||||
-- performed on the HistoryCache to convey this information, or the REMOVE_CACHE_CHANGE operation is executed to remove
|
||||
@ -104,7 +104,7 @@ use work.rtps_config_package.all;
|
||||
entity rtps_writer is
|
||||
generic (
|
||||
-- HACK: FIXME: Quartus Workaround
|
||||
-- Quartus does not allow to reference a generic insisde the generic block.
|
||||
-- Quartus does not allow to reference a generic inside the generic block.
|
||||
-- So we constrain the range later as constant
|
||||
NUM_WRITERS : natural;
|
||||
CONFIG_ARRAY : QUARTUS_CONFIG_ARRAY_TYPE;
|
||||
@ -172,7 +172,7 @@ architecture arch of rtps_writer is
|
||||
constant INLINE_QOS_T : OUTPUT_DATA_ARRAY_TYPE(0 to NUM_WRITERS-1) := INLINE_QOS;
|
||||
|
||||
--*****CONSTANT DECLARATION*****
|
||||
function gen_manual_by_topic_livelines_writers(qos : QUARTUS_CONFIG_ARRAY_TYPE) return std_logic_vector is
|
||||
function gen_manual_by_topic_liveliness_writers(qos : QUARTUS_CONFIG_ARRAY_TYPE) return std_logic_vector is
|
||||
variable ret : std_logic_vector(0 to NUM_WRITERS-1) := (others => '0');
|
||||
begin
|
||||
assert (qos'length = NUM_WRITERS) severity FAILURE;
|
||||
@ -184,7 +184,7 @@ architecture arch of rtps_writer is
|
||||
end loop;
|
||||
return ret;
|
||||
end function;
|
||||
constant MANUAL_BY_TOPIC_LIVELINESS_WRITERS : std_logic_vector(0 to NUM_WRITERS-1) := gen_manual_by_topic_livelines_writers(CONFIG_ARRAY_T);
|
||||
constant MANUAL_BY_TOPIC_LIVELINESS_WRITERS : std_logic_vector(0 to NUM_WRITERS-1) := gen_manual_by_topic_liveliness_writers(CONFIG_ARRAY_T);
|
||||
|
||||
function gen_reliable_writers(qos : QUARTUS_CONFIG_ARRAY_TYPE) return std_logic_vector is
|
||||
variable ret : std_logic_vector(0 to NUM_WRITERS-1) := (others => '0');
|
||||
@ -420,13 +420,13 @@ architecture arch of rtps_writer is
|
||||
signal mem_addr_base, mem_addr_base_next : unsigned(ENDPOINT_MEMORY_ADDR_WIDTH-1 downto 0);
|
||||
-- General Memory Address Latch
|
||||
signal mem_addr_latch, mem_addr_latch_next : unsigned(ENDPOINT_MEMORY_ADDR_WIDTH-1 downto 0);
|
||||
-- General Purpose Couter
|
||||
-- General Purpose Counter
|
||||
signal mem_cnt, mem_cnt_next : natural range 0 to 29;
|
||||
-- Latch for Endpoint Data from Memory
|
||||
signal mem_endpoint_data, mem_endpoint_data_next : ENDPOINT_DATA_TYPE;
|
||||
-- Latch for Endpoint Data from main process
|
||||
signal mem_endpoint_latch_data, mem_endpoint_latch_data_next : ENDPOINT_DATA_TYPE;
|
||||
-- Signal used to write to ALL memories simutanously
|
||||
-- Signal used to write to ALL memories simultaneously
|
||||
signal multi_w : std_logic;
|
||||
|
||||
-- *MEMORY CONTROL CONNECTION SIGNALS*
|
||||
@ -584,7 +584,7 @@ begin
|
||||
-- INITIATE_ENDPOINT_SEARCH Initiate Endpoint Search Memory Operation. This state is used to start the Search operation as soon as the required data is available
|
||||
-- METATRAFFIC_OPERATION State handling the Metatraffic Operations
|
||||
-- PROCESS_NACK Process Requested (Negatively Acknowledged) Sequence Numbers
|
||||
-- PROCESS_ACK Process Acknowledged Sequence Numbers. Assert Liveliness of remore Reader.
|
||||
-- PROCESS_ACK Process Acknowledged Sequence Numbers. Assert Liveliness of remote Reader.
|
||||
-- UPDATE_GLOBAL_ACK Iterate over all remote Readers and update the global_ack_seq_nr_base to the lowest common ACKed Sequence Number
|
||||
-- ENDPOINT_STALE_CHECK Check remote Endpoint Entries for Liveliness Lease Expiration, and Response Timeouts.
|
||||
-- HANDLE_REQUESTS Send requested Cache Changes to remote Reader
|
||||
@ -603,7 +603,7 @@ begin
|
||||
-- SKIP_META_OPERATION Skip Metatraffic Operation
|
||||
parse_prc : process(all)
|
||||
variable tmp_dw : DOUBLE_WORD_ARRAY;
|
||||
-- NOTE: We convert the bitamp to a slv to make operations easier (The tool should handle both cases equally)
|
||||
-- NOTE: We convert the bitmap to a slv to make operations easier (The tool should handle both cases equally)
|
||||
variable tmp_bitmap : std_logic_vector(0 to MAX_BITMAP_WIDTH-1);
|
||||
variable tmp_flags : std_logic_vector(0 to EMF_FLAG_WIDTH-1);
|
||||
begin
|
||||
@ -1151,7 +1151,7 @@ begin
|
||||
|
||||
-- HC Empty (No cache Changes Available)
|
||||
if (cc_seq_nr(ind) = SEQUENCENUMBER_UNKNOWN) then
|
||||
-- NOTE: Identifies the lowest SN that is yet to be written by the writter.
|
||||
-- NOTE: Identifies the lowest SN that is yet to be written by the writer.
|
||||
min_sn_next <= last_seq_nr(ind) + 1;
|
||||
else
|
||||
min_sn_next <= cc_seq_nr(ind);
|
||||
@ -1360,7 +1360,7 @@ begin
|
||||
mem_r.ack_seq_nr_base <= ack_base;
|
||||
-- NOTE: The global_ack_seq_nr_base contains the lowest SN of all remote Endpoints.
|
||||
-- It only needs to be updated, if the remote Endpoint with the lowest ACKed SN is updated.
|
||||
-- This does not necesserily mean, that the Global ACK SN will change, as there can
|
||||
-- This does not necessarily mean, that the Global ACK SN will change, as there can
|
||||
-- be multiple remote Endpoints with the same lowest ACK SN.
|
||||
-- Global ACK SN needs updating
|
||||
if (mem_endpoint_data.ack_seq_nr_base = global_ack_seq_nr_base(ind)) then
|
||||
@ -1788,7 +1788,7 @@ begin
|
||||
|
||||
-- HC Empty (No cache Changes Available)
|
||||
if (cc_seq_nr(ind) = SEQUENCENUMBER_UNKNOWN) then
|
||||
-- NOTE: Identifies the lowest SN that is yet to be written by the writter.
|
||||
-- NOTE: Identifies the lowest SN that is yet to be written by the writer.
|
||||
min_sn_next <= last_seq_nr(ind) + 1;
|
||||
else
|
||||
min_sn_next <= cc_seq_nr(ind);
|
||||
@ -1900,7 +1900,7 @@ begin
|
||||
-- NOTE: If PUSH_MODE false and remote reliable endpoints are available, this just does NOPs
|
||||
-- (leaves the CCs NACKed in the HC) and updates the last_seq_nr.
|
||||
|
||||
-- ACK newly sent Cache Changes if Writer is BEST_EFFORT, or if all remore Readers are BEST_EFFORT
|
||||
-- ACK newly sent Cache Changes if Writer is BEST_EFFORT, or if all remote Readers are BEST_EFFORT
|
||||
if (CONFIG_ARRAY_T(ind).RELIABILITY_QOS /= RELIABLE_RELIABILITY_QOS or global_ack_seq_nr_base(ind) = SEQUENCENUMBER_UNKNOWN) then
|
||||
start_hc(ind) <= '1';
|
||||
if (CONFIG_ARRAY_T(ind).DURABILITY_QOS = VOLATILE_DURABILITY_QOS) then
|
||||
@ -2079,7 +2079,7 @@ begin
|
||||
end if;
|
||||
return_cnt_next <= 0;
|
||||
end if;
|
||||
-- Cache Change unavialable
|
||||
-- Cache Change unavailable
|
||||
else
|
||||
assert (ret_hc(ind) = INVALID) report "Unexpected HC response" severity WARNING;
|
||||
|
||||
@ -2681,7 +2681,7 @@ begin
|
||||
mem_op_done <= '1';
|
||||
|
||||
if (mem_op_start = '1') then
|
||||
-- Latch Signals needed for Mermory Operation
|
||||
-- Latch Signals needed for Memory Operation
|
||||
mem_endpoint_latch_data_next <= mem_r;
|
||||
|
||||
case(mem_opcode) is
|
||||
|
||||
Loading…
Reference in New Issue
Block a user