Convert dds_reader to Vector Endpoint

This commit is contained in:
John Ring 2022-04-10 11:04:59 +02:00
parent bc745fdcd9
commit d388e29c36
58 changed files with 18523 additions and 27416 deletions

190
sim/L0_dds_reader_test1.do Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

190
sim/L0_dds_reader_test2.do Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

190
sim/L0_dds_reader_test3.do Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

184
sim/L0_dds_reader_test4.do Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

190
sim/L0_dds_reader_test5.do Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

190
sim/L0_dds_reader_test6.do Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -469,6 +469,12 @@ DESIGN DECISIONS
writer (Writer ID, Lifespan Deadline), we cannot write to multiple DDS endpoints at the same time.
This means that we have to temporarily store the payload and push it to each DDS Endpoint individually.
* Since the DDS Reader is waiting on USER via the 'sample_info_ack' signal before continuing, a singel
user can stall all other USERs/Readers (DoS) of a vector entity of the DDS Reader.
* The DEADLINE check times of the DDS Entities are aligned to the release of the reset, and not on the
addition of a new instance. That means that all Instances are checked at the smae time, non depending
on when they were added.
BRAINSTORMING
-------------

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,776 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library osvvm; -- Utility Library
context osvvm.OsvvmContext;
use work.rtps_package.all;
use work.user_config.all;
use work.rtps_config_package.all;
use work.rtps_test_package.all;
-- This testbench tests the handling of the TIME_BASED_FILTER QoS of the DDS Reader.
entity L0_dds_reader_test2 is
end entity;
architecture testbench of L0_dds_reader_test2 is
-- *CONSTANT DECLARATION*
constant MAX_REMOTE_ENDPOINTS : natural := 3;
constant NUM_READERS : natural := 2;
impure function gen_test_config return CONFIG_ARRAY_TYPE is
variable ret : CONFIG_ARRAY_TYPE(0 to NUM_READERS-1) := (others => DEFAULT_WRITER_CONFIG);
begin
-- arpkriu
ret(0).TIME_BASED_FILTER_QOS := gen_duration(2 sec);
ret(0).DEADLINE_QOS := DURATION_INFINITE;
ret(0).MAX_SAMPLES := std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH));
ret(0).MAX_INSTANCES := std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH));
ret(0).MAX_SAMPLES_PER_INSTANCE := std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH));
ret(0).HISTORY_QOS := KEEP_ALL_HISTORY_QOS;
ret(0).RELIABILITY_QOS := RELIABLE_RELIABILITY_QOS;
ret(0).PRESENTATION_QOS := INSTANCE_PRESENTATION_QOS;
ret(0).DESTINATION_ORDER_QOS := BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS;
ret(0).COHERENT_ACCESS := FALSE;
ret(0).ORDERED_ACCESS := FALSE;
ret(0).WITH_KEY := TRUE;
ret(0).MAX_PAYLOAD_SIZE := 40;
-- arpkriu
ret(1).TIME_BASED_FILTER_QOS := gen_duration(1 sec);
ret(1).DEADLINE_QOS := DURATION_INFINITE;
ret(1).MAX_SAMPLES := std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH));
ret(1).MAX_INSTANCES := std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH));
ret(1).MAX_SAMPLES_PER_INSTANCE := std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH));
ret(1).HISTORY_QOS := KEEP_ALL_HISTORY_QOS;
ret(1).RELIABILITY_QOS := RELIABLE_RELIABILITY_QOS;
ret(1).PRESENTATION_QOS := INSTANCE_PRESENTATION_QOS;
ret(1).DESTINATION_ORDER_QOS := BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS;
ret(1).COHERENT_ACCESS := FALSE;
ret(1).ORDERED_ACCESS := FALSE;
ret(1).WITH_KEY := TRUE;
ret(1).MAX_PAYLOAD_SIZE := 40;
return ret;
end function;
constant TEST_CONFIG : CONFIG_ARRAY_TYPE := gen_test_config;
-- *TYPE DECLARATION*
type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA, WAIT_EOC);
type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE);
type EMPTY_HEAD_SIG_ARRAY_TYPE is array (0 to NUM_READERS-1) of natural;
type DDS_READER_MEM_ARRAY_TYPE is array (0 to NUM_READERS-1) of DDS_READER_MEM_TYPE;
-- *SIGNAL DECLARATION*
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal check_time : TIME_TYPE := TIME_ZERO;
signal start_rtps, start_dds, ack_rtps, ack_dds, done_rtps, done_dds : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal opcode_rtps : HISTORY_CACHE_OPCODE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => NOP);
signal opcode_dds : DDS_READER_OPCODE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => NOP);
signal ret_rtps : HISTORY_CACHE_RESPONSE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ERROR);
signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal data_in_rtps, data_out_dds : WORD_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal get_data_dds, si_valid, eoc : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal return_code_dds : RETURN_CODE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal status : STATUS_KIND_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal instance_state_dds : INSTANCE_STATE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ANY_INSTANCE_STATE);
signal view_state_dds : VIEW_STATE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ANY_VIEW_STATE);
signal sample_state_dds : SAMPLE_STATE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ANY_SAMPLE_STATE);
signal instance_handle_dds : INSTANCE_HANDLE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => HANDLE_NIL);
signal max_samples_dds : MAX_SAMPLES_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal sample_info : SAMPLE_INFO_ARRAY_TYPE(0 to NUM_READERS-1);
signal ind : natural := 0;
signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0';
signal dds_cnt, dds_cnt2, rtps_cnt : natural := 0;
signal dds_stage : DDS_STAGE_TYPE := IDLE;
signal rtps_stage : RTPS_STAGE_TYPE := IDLE;
shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST;
shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST;
shared variable mem : DDS_READER_MEM_ARRAY_TYPE := (others => DEFAULT_DDS_READER_MEM);
signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, eoc_id, valid_id : AlertLogIDType;
-- *FUNCTION DECLARATION*
function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is
variable ret : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
begin
for i in 0 to 3 loop
ret(i) := not payload.data(i);
end loop;
return ret;
end function;
function gen_sn(input : natural) return SEQUENCENUMBER_TYPE is
variable ret : SEQUENCENUMBER_TYPE;
begin
ret(0) := (others => '0');
ret(1) := unsigned(int(input, WORD_WIDTH));
return ret;
end function;
procedure wait_on_sig(signal sig : std_logic) is
begin
if (sig /= '1') then
wait on sig until sig = '1';
end if;
end procedure;
begin
-- Unit Under Test
uut : entity work.dds_reader(arch)
generic map (
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(TEST_CONFIG),
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
clk => clk,
reset => reset,
time => check_time,
start_rtps => start_rtps,
opcode_rtps => opcode_rtps,
ack_rtps => ack_rtps,
done_rtps => done_rtps,
ret_rtps => ret_rtps,
data_in_rtps => data_in_rtps,
valid_in_rtps => valid_in_rtps,
ready_in_rtps => ready_in_rtps,
last_word_in_rtps => last_word_in_rtps,
start_dds => start_dds,
ack_dds => ack_dds,
opcode_dds => opcode_dds,
instance_state_dds => instance_state_dds,
view_state_dds => view_state_dds,
sample_state_dds => sample_state_dds,
instance_handle_dds => instance_handle_dds,
max_samples_dds => max_samples_dds,
get_data_dds => get_data_dds,
done_dds => done_dds,
return_code_dds => return_code_dds,
ready_out_dds => ready_out_dds,
valid_out_dds => valid_out_dds,
data_out_dds => data_out_dds,
last_word_out_dds => last_word_out_dds,
sample_info => sample_info,
sample_info_valid => si_valid,
sample_info_ack => (others => '1'),
eoc => eoc,
status => status
);
stimulus_prc : process
variable RV : RandomPType;
variable cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE;
variable s : SAMPLE_TYPE := DEFAULT_SAMPLE;
variable kh1, kh2, kh3, kh4, kh5 : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
alias idle_sig is <<signal uut.idle_sig : std_logic>>;
alias inst_op_done is <<signal uut.inst_op_done : std_logic>>;
alias empty_inst_head is <<signal uut.empty_inst_head_sig : EMPTY_HEAD_SIG_ARRAY_TYPE>>;
alias empty_sample_head is <<signal uut.empty_sample_head_sig : EMPTY_HEAD_SIG_ARRAY_TYPE>>;
alias empty_payload_head is <<signal uut.empty_payload_head_sig : EMPTY_HEAD_SIG_ARRAY_TYPE>>;
impure function gen_payload(key_hash : INSTANCE_HANDLE_TYPE; len : natural) return TEST_PACKET_TYPE is
variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
begin
assert (len >= 4) report "Payload length has to be at least 16 Bytes long" severity FAILURE;
for i in 0 to len-1 loop
if (i < 4) then
-- NOTE: Beginning of payload is negated key to allow deterministic Key Hash generation from the kh_prc
ret.data(ret.length) := not key_hash(i);
else
ret.data(ret.length) := RV.RandSlv(WORD_WIDTH);
end if;
ret.length := ret.length + 1;
end loop;
ret.last(ret.length-1) := '1';
return ret;
end function;
impure function gen_key_hash return KEY_HASH_TYPE is
variable ret : KEY_HASH_TYPE := KEY_HASH_NIL;
begin
for i in 0 to KEY_HASH_TYPE'length-1 loop
ret(i) := RV.RandSlv(WORD_WIDTH);
end loop;
return ret;
end function;
procedure start_dds is
begin
dds_start <= '1';
wait until rising_edge(clk);
dds_start <= '0';
wait until rising_edge(clk);
end procedure;
procedure start_rtps is
begin
rtps_start <= '1';
wait until rising_edge(clk);
rtps_start <= '0';
wait until rising_edge(clk);
end procedure;
procedure wait_on_completion is
begin
if (rtps_done /= '1' or dds_done /= '1') then
wait until rtps_done = '1' and dds_done = '1';
end if;
end procedure;
-- NOTE: This procedure waits until the idle_sig is high for at least
-- two consecutive clock cycles.
procedure wait_on_idle is
variable first : boolean := TRUE;
begin
loop
if (idle_sig /= '1') then
wait until idle_sig = '1';
elsif (not first) then
exit;
end if;
wait until rising_edge(clk);
wait until rising_edge(clk);
first := FALSE;
end loop;
wait_on_sig(inst_op_done);
end procedure;
begin
SetAlertLogName("L0_dds_reader_test2 - TIME_BASED_FILTER QoS Handling");
SetAlertEnable(FAILURE, TRUE);
SetAlertEnable(ERROR, TRUE);
SetAlertEnable(WARNING, TRUE);
SetLogEnable(DEBUG, FALSE);
SetLogEnable(PASSED, FALSE);
SetLogEnable(INFO, TRUE);
RV.InitSeed(RV'instance_name);
sstate_id <= GetAlertLogID("Sample State", ALERTLOG_BASE_ID);
vstate_id <= GetAlertLogID("View State", ALERTLOG_BASE_ID);
istate_id <= GetAlertLogID("Instance State", ALERTLOG_BASE_ID);
ts_id <= GetAlertLogID("Source Timestamp", ALERTLOG_BASE_ID);
inst_id <= GetAlertLogID("Instance Handle", ALERTLOG_BASE_ID);
pub_id <= GetAlertLogID("Publication Hanlde", ALERTLOG_BASE_ID);
dis_gen_cnt_id <= GetAlertLogID("Disposed Generation Count", ALERTLOG_BASE_ID);
no_w_gen_cnt_id <= GetAlertLogID("No Writers Generation Count", ALERTLOG_BASE_ID);
srank_id <= GetAlertLogID("Sample Rank", ALERTLOG_BASE_ID);
grank_id <= GetAlertLogID("Generation Rank", ALERTLOG_BASE_ID);
agrank_id <= GetAlertLogID("Absolute Generation Rank", ALERTLOG_BASE_ID);
eoc_id <= GetAlertLogID("End Of Collection", ALERTLOG_BASE_ID);
valid_id <= GetAlertLogID("Valid Data", ALERTLOG_BASE_ID);
data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID);
ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID);
-- Key Hashes
kh3 := (x"0CEAB0C6", x"FA04B9AD", x"A96EB495", x"4E0EB999");
kh4 := (x"A7EB605C", x"FF4BEF3A", x"3C5E8724", x"CCA0CA67");
kh2 := (x"BC070AC4", x"0BAB5811", x"14EA8D61", x"F669189B");
kh1 := (x"F12C31DA", x"E3FE0F3F", x"01F36685", x"446518CA");
Log("Initiating Test", INFO);
Log("Current Time: 0s", INFO);
check_time <= TIME_ZERO;
reset <= '1';
wait until rising_edge(clk);
wait until rising_edge(clk);
reset <= '0';
wait_on_idle;
-- READER 0
AlertIf(empty_sample_head(0) /= 0, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(0) /= 0, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(0) /= 0, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: -/0,11,22,33,44
-- PAYLOAD MEMORY: -/0,11,22,33,44
-- INSTANCE MEMORY: -/0,13,26
-- ISTATE: -
-- WRITER: -
-- READER 1
AlertIf(empty_sample_head(1) /= 0, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(1) /= 0, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(1) /= 0, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: -/0,11,22,33,44
-- PAYLOAD MEMORY: -/0,11,22,33,44
-- INSTANCE MEMORY: -/0,13,26
-- ISTATE: -
-- WRITER: -
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
Log("R0,R1: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO);
Log("R0,R1: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(1), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
-- READER 1
ind <= 1;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- READER 0
AlertIf(empty_sample_head(0) /= 11, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(0) /= 11, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(0) /= 13, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: 0(I1S1)/11,22,33,44
-- PAYLOAD MEMORY: 0(I1S1)/11,22,33,44
-- INSTANCE MEMORY: 0(I1)/13,26
-- ISTATE: I1:ALIVE
-- WRITER: W0:I1
-- READER 1
AlertIf(empty_sample_head(1) /= 11, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(1) /= 11, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(1) /= 13, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: 0(I1S1)/11,22,33,44
-- PAYLOAD MEMORY: 0(I1S1)/11,22,33,44
-- INSTANCE MEMORY: 0(I1)/13,26
-- ISTATE: I1:ALIVE
-- WRITER: W0:I1
Log("Current Time: 1s", INFO);
check_time <= gen_duration(1 sec);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
Log("R0,R1: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload]", INFO);
Log("R0: DROPPED [Time Based Filter]", DEBUG);
Log("R0: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem(1), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
-- READER 1
ind <= 1;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- READER 0
AlertIf(empty_sample_head(0) /= 11, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(0) /= 11, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(0) /= 13, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: 0(I1S1)/11,22,33,44
-- PAYLOAD MEMORY: 0(I1S1)/11,22,33,44
-- INSTANCE MEMORY: 0(I1)/13,26
-- ISTATE: I1:ALIVE
-- WRITER: W0:I1
-- READER 1
AlertIf(empty_sample_head(1) /= 22, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(1) /= 22, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(1) /= 13, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: 0(I1S1),11(I1S2)/22,33,44
-- PAYLOAD MEMORY: 0(I1S1),11(I1S2)/22,33,44
-- INSTANCE MEMORY: 0(I1)/13,26
-- ISTATE: I1:ALIVE
-- WRITER: W0:I1
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,10);
Log("R0,R1: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload]", INFO);
Log("R0,R1: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 1;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(1), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
-- READER 1
ind <= 1;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- READER 0
AlertIf(empty_sample_head(0) /= 22, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(0) /= 22, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(0) /= 26, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: 0(I1S1),11(I2S1)/22,33,44
-- PAYLOAD MEMORY: 0(I1S1),11(I2S1)/22,33,44
-- INSTANCE MEMORY: 0(I1),13(I2)/26
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
-- READER 1
AlertIf(empty_sample_head(1) /= 33, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(1) /= 33, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(1) /= 26, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: 0(I1S1),11(I1S2),22(I2S1)/33,44
-- PAYLOAD MEMORY: 0(I1S1),11(I1S2),22(I2S1)/33,44
-- INSTANCE MEMORY: 0(I1),13(I2)/26
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
Log("Current Time: 2s", INFO);
check_time <= gen_duration(2 sec);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,10);
Log("R0,R1: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 0, Aligned Payload]", INFO);
Log("R0: DROPPED [Time Based Filter]", DEBUG);
Log("R1: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 1;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem(1), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
-- READER 1
ind <= 1;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- READER 0
AlertIf(empty_sample_head(0) /= 22, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(0) /= 22, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(0) /= 26, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: 0(I1S1),11(I2S1)/22,33,44
-- PAYLOAD MEMORY: 0(I1S1),11(I2S1)/22,33,44
-- INSTANCE MEMORY: 0(I1),13(I2)/26
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
-- READER 1
AlertIf(empty_sample_head(1) /= 44, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(1) /= 44, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(1) /= 26, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: 0(I1S1),11(I1S2),22(I2S1),33(I2S2)/44
-- PAYLOAD MEMORY: 0(I1S1),11(I1S2),22(I2S1),33(I2S2)/44
-- INSTANCE MEMORY: 0(I1),13(I2)/26
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
Log("R0,R1: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload]", INFO);
Log("R0: ACCEPTED", DEBUG);
Log("R1: REJECTED [MAX_SAMPLES_PER_INSTANCE/MAX_SAMPLES exceeded]", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
-- READER 0
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
-- READER 1
rtps.ret_code := REJECTED;
ind <= 1;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- READER 0
AlertIf(empty_sample_head(0) /= 33, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(0) /= 33, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(0) /= 26, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: 0(I1S1),11(I2S1),22(I1S2)/33,44
-- PAYLOAD MEMORY: 0(I1S1),11(I2S1),22(I1S2)/33,44
-- INSTANCE MEMORY: 0(I1),13(I2)/26
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
-- READER 1
AlertIf(empty_sample_head(1) /= 44, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(1) /= 44, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(1) /= 26, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: 0(I1S1),11(I1S2),22(I2S1),33(I2S2)/44
-- PAYLOAD MEMORY: 0(I1S1),11(I1S2),22(I2S1),33(I2S2)/44
-- INSTANCE MEMORY: 0(I1),13(I2)/26
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
-- VAILDATE 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;
dds.opcode := READ;
dds.max_samples := 4;
dds.sstate := ANY_SAMPLE_STATE;
dds.istate := ANY_INSTANCE_STATE;
dds.vstate := ANY_VIEW_STATE;
-- READER 0
ind <= 0;
start_dds;
wait_on_sig(dds_done);
-- READER 1
ind <= 1;
start_dds;
wait_on_sig(dds_done);
wait_on_idle;
-- READER 0
AlertIf(empty_sample_head(0) /= 33, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(0) /= 33, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(0) /= 26, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: 0(I1S1),11(I2S1),22(I1S2)/33,44
-- PAYLOAD MEMORY: 0(I1S1),11(I2S1),22(I1S2)/33,44
-- INSTANCE MEMORY: 0(I1),13(I2)/26
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
-- READER 1
AlertIf(empty_sample_head(1) /= 44, "Sample Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_payload_head(1) /= 44, "Payload Memory Empty List Head incorrect", FAILURE);
AlertIf(empty_inst_head(1) /= 26, "Instance Memory Empty List Head incorrect", FAILURE);
-- SAMPLE MEMORY: 0(I1S1),11(I1S2),22(I2S1),33(I2S2)/44
-- PAYLOAD MEMORY: 0(I1S1),11(I1S2),22(I2S1),33(I2S2)/44
-- INSTANCE MEMORY: 0(I1),13(I2)/26
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
wait_on_completion;
TranscriptOpen(RESULTS_FILE, APPEND_MODE);
SetTranscriptMirror;
ReportAlerts;
TranscriptClose;
std.env.stop;
wait;
end process;
clock_prc : process
begin
clk <= '0';
wait for 25 ns;
clk <= '1';
wait for 25 ns;
end process;
dds_prc : process(all)
variable col : COLLECTION_TYPE := DEFAULT_COLLECTION;
begin
if rising_edge(clk) then
dds_done <= '0';
case (dds_stage ) is
when IDLE =>
if (dds_start = '1') then
dds_stage <= START;
else
dds_done <= '1';
end if;
when START =>
if (ack_dds(ind) = '1') then
dds_stage <= DONE;
dds_cnt <= 0;
end if;
when DONE =>
if (done_dds(ind) = '1') then
AffirmIfEqual(ret_id, return_code_dds(ind), dds.ret_code);
case (dds.ret_code) is
when RETCODE_OK =>
gen_collection(mem(ind), col, dds, TEST_CONFIG(ind).PRESENTATION_QOS, TEST_CONFIG(ind).ORDERED_ACCESS);
dds_stage <= CHECK_SI;
dds_cnt <= 0;
when others =>
dds_stage <= IDLE;
end case;
end if;
when CHECK_SI =>
if (si_valid(ind) = '1') then
AffirmIfEqual(sstate_id, sample_info(ind).sample_state, col.s(dds_cnt).sstate);
AffirmIfEqual(vstate_id, sample_info(ind).view_state, col.s(dds_cnt).vstate);
AffirmIfEqual(istate_id, sample_info(ind).instance_state, col.s(dds_cnt).istate);
AffirmIfEqual(ts_id, to_unsigned(sample_info(ind).source_timestamp), to_unsigned(col.s(dds_cnt).ts));
AffirmIfEqual(inst_id, to_unsigned(sample_info(ind).instance_handle), to_unsigned(col.s(dds_cnt).inst));
AffirmIfEqual(pub_id, to_unsigned(sample_info(ind).publication_handle), to_unsigned(HANDLE_NIL));
AffirmIfEqual(dis_gen_cnt_id, sample_info(ind).disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(no_w_gen_cnt_id, sample_info(ind).no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(srank_id, sample_info(ind).sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH)));
AffirmIfEqual(grank_id, sample_info(ind).generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH)));
AffirmIfEqual(agrank_id, sample_info(ind).absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH)));
if (sample_info(ind).valid_data = '1') then
AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected");
dds_stage <= CHECK_DATA;
dds_cnt2 <= 0;
else
AffirmIf(valid_id, col.s(dds_cnt).data = EMPTY_TEST_PACKET, "Sample with Data expected");
if (dds_cnt = col.len-1) then
-- DONE
dds_stage <= WAIT_EOC;
else
dds_cnt <= dds_cnt + 1;
end if;
end if;
end if;
AffirmIf(eoc_id, eoc(ind) = '0', "EOC pulled high");
when CHECK_DATA =>
if (valid_out_dds(ind) = '1') then
AffirmIfEqual(data_id, data_out_dds(ind), col.s(dds_cnt).data.data(dds_cnt2));
dds_cnt2 <= dds_cnt2 + 1;
if (dds_cnt2 = col.s(dds_cnt).data.length-1) then
AlertIf(data_id, last_word_out_dds(ind) /= '1', "Last Word Signal not pulled High", ERROR);
if (dds_cnt = col.len-1) then
-- DONE
dds_stage <= WAIT_EOC;
else
dds_stage <= CHECK_SI;
dds_cnt <= dds_cnt + 1;
end if;
end if;
end if;
when WAIT_EOC =>
if (eoc(ind) = '1') then
dds_stage <= IDLE;
end if;
end case;
end if;
-- DEFAULT
start_dds <= (others => '0');
opcode_dds <= (others => NOP);
instance_state_dds <= (others => ANY_INSTANCE_STATE);
view_state_dds <= (others => ANY_VIEW_STATE);
sample_state_dds <= (others => ANY_SAMPLE_STATE);
instance_handle_dds <= (others => HANDLE_NIL);
max_samples_dds <= (others => (others => '0'));
get_data_dds <= (others => '0');
ready_out_dds <= (others => '0');
case (dds_stage ) is
when START =>
start_dds(ind) <= '1';
opcode_dds(ind) <= dds.opcode;
instance_state_dds(ind) <= dds.istate;
view_state_dds(ind) <= dds.vstate;
sample_state_dds(ind) <= dds.sstate;
instance_handle_dds(ind) <= dds.inst;
max_samples_dds(ind) <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH));
when CHECK_SI =>
if (si_valid(ind) = '1' and sample_info(ind).valid_data = '1') then
get_data_dds(ind) <= '1';
end if;
when CHECK_DATA =>
ready_out_dds(ind) <= '1';
when others =>
null;
end case;
end process;
rtps_prc : process(all)
variable stimulus : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
begin
if rising_edge(clk) then
rtps_done <= '0';
case (rtps_stage) is
when IDLE =>
if (rtps_start = '1') then
rtps_stage <= START;
else
rtps_done <= '1';
end if;
when START =>
if (ack_rtps(ind) = '1') then
case (rtps.opcode) is
when ADD_CACHE_CHANGE =>
gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus);
rtps_stage <= PUSH;
when others =>
rtps_stage <= DONE;
end case;
end if;
when PUSH =>
if (ready_in_rtps(ind) = '1') then
rtps_cnt <= rtps_cnt + 1;
if (rtps_cnt = stimulus.length-1) then
rtps_stage <= DONE;
end if;
end if;
when DONE =>
if (done_rtps(ind) = '1') then
AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps(ind)), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code));
rtps_stage <= IDLE;
end if;
end case;
end if;
-- DEFAULT
start_rtps <= (others => '0');
opcode_rtps <= (others => NOP);
valid_in_rtps <= (others => '0');
last_word_in_rtps <= (others => '0');
data_in_rtps <= (others => (others => '0'));
case (rtps_stage) is
when START =>
start_rtps(ind) <= '1';
opcode_rtps(ind) <= rtps.opcode;
case (rtps.opcode) is
when REMOVE_WRITER =>
data_in_rtps(ind) <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH));
when others =>
null;
end case;
when PUSH =>
valid_in_rtps(ind) <= '1';
data_in_rtps(ind) <= stimulus.data(rtps_cnt);
last_word_in_rtps(ind) <= stimulus.last(rtps_cnt);
when others =>
null;
end case;
end process;
watchdog : process
begin
wait for 1 ms;
Alert("Test timeout", FAILURE);
std.env.stop;
end process;
end architecture;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,841 +0,0 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library osvvm; -- Utility Library
context osvvm.OsvvmContext;
use work.rtps_package.all;
use work.user_config.all;
use work.rtps_config_package.all;
use work.rtps_test_package.all;
-- This testbench tests the DDS handling of the DDS Reader. It tests the correctness of the DDS READ, TAKE, READ_NEXT_SAMPLE, TAKE_NEXT_SAMPLE,
-- READ_INSTANCE, TAKE_INSTANCE, READ_NEXT_INSTANCE, TAKE_NEXT_INSTANCE Operations.
-- More specifically the testbench covers following tests:
-- TEST: READ [MAX_SAMPLES < SAMPLES]
-- TEST: READ [MAX_SAMPLES > SAMPLES]
-- TEST: READ [NO COMPATIBLE SAMPLES]
-- TEST: READ [NO SAMPLES]
-- TEST: TAKE
-- TEST: TAKE [NO SAMPLES]
-- TEST: TAKE_NEXT_SAMPLE
-- TEST: TAKE_NEXT_SAMPLE [NO SAMPLE]
-- TEST: READ_NEXT_SAMPLE [WITH UNREAD SAMPLE]
-- TEST: READ_NEXT_SAMPLE [WITHOUT UNREAD SAMPLE]
-- TEST: READ_NEXT_SAMPLE [NO SAMPLE]
-- TEST: READ_INSTANCE
-- TEST: TAKE_INSTANCE
-- TEST: READ_NEXT_INSTANCE
-- TEST: TAKE_NEXT_INSTANCE
-- TEST: READ MARKS SAMPLES AS READ
-- TEST: TAKE REMOVES SAMPLE
-- TEST: READ MODIFIES VIEW STATE [READ CURRENT GENERATION]
-- TEST: READ MODIFIES VIEW STATE [READ PREVIOUS GENERATION]
entity L0_dds_reader_test3_arznriu is
end entity;
architecture testbench of L0_dds_reader_test3_arznriu is
-- *CONSTANT DECLARATION*
constant MAX_REMOTE_ENDPOINTS : natural := 3;
-- *TYPE DECLARATION*
type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA, WAIT_EOC);
type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE);
-- *SIGNAL DECLARATION*
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal check_time : TIME_TYPE := TIME_ZERO;
signal start_rtps, start_dds, ack_rtps, ack_dds, done_rtps, done_dds : std_logic := '0';
signal opcode_rtps : HISTORY_CACHE_OPCODE_TYPE := NOP;
signal opcode_dds : DDS_READER_OPCODE_TYPE := NOP;
signal ret_rtps : HISTORY_CACHE_RESPONSE_TYPE := ERROR;
signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic := '0';
signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic := '0';
signal data_in_rtps, data_out_dds : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal get_data_dds, si_valid_data, si_valid, eoc : std_logic := '0';
signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0');
signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0');
signal instance_state_dds, si_instance_state : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0) := ANY_INSTANCE_STATE;
signal view_state_dds, si_view_state : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0) := ANY_VIEW_STATE;
signal sample_state_dds, si_sample_state : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := ANY_SAMPLE_STATE;
signal instance_handle_dds, si_instance_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
signal max_samples_dds : std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0) := (others => '0');
signal si_source_timestamp : TIME_TYPE := TIME_INVALID;
signal si_publication_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
signal si_disposed_generation_count : std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal si_no_writers_generation_count : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal si_sample_rank : std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0) := (others => '0');
signal si_generation_rank : std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0) := (others => '0');
signal si_absolute_generation_rank: std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0';
signal dds_cnt, dds_cnt2, rtps_cnt : natural := 0;
signal dds_stage : DDS_STAGE_TYPE := IDLE;
signal rtps_stage : RTPS_STAGE_TYPE := IDLE;
shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST;
shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST;
shared variable mem : DDS_READER_MEM_TYPE := DEFAULT_DDS_READER_MEM;
signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, eoc_id, valid_id : AlertLogIDType;
-- *FUNCTION DECLARATION*
function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is
variable ret : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
begin
for i in 0 to 3 loop
ret(i) := not payload.data(i);
end loop;
return ret;
end function;
function gen_sn(input : natural) return SEQUENCENUMBER_TYPE is
variable ret : SEQUENCENUMBER_TYPE;
begin
ret(0) := (others => '0');
ret(1) := unsigned(int(input, WORD_WIDTH));
return ret;
end function;
begin
-- Unit Under Test
uut : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => DURATION_ZERO,
DEADLINE_QOS => DURATION_INFINITE,
MAX_SAMPLES => std_logic_vector(to_unsigned(15,CDR_LONG_WIDTH)),
MAX_INSTANCES => std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH)),
MAX_SAMPLES_PER_INSTANCE => std_logic_vector(to_unsigned(15,CDR_LONG_WIDTH)),
HISTORY_QOS => KEEP_ALL_HISTORY_QOS,
RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS,
PRESENTATION_QOS => INSTANCE_PRESENTATION_QOS,
DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS,
COHERENT_ACCESS => FALSE,
ORDERED_ACCESS => FALSE,
WITH_KEY => FALSE,
PAYLOAD_FRAME_SIZE => 11,
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
clk => clk,
reset => reset,
time => check_time,
start_rtps => start_rtps,
opcode_rtps => opcode_rtps,
ack_rtps => ack_rtps,
done_rtps => done_rtps,
ret_rtps => ret_rtps,
data_in_rtps => data_in_rtps,
valid_in_rtps => valid_in_rtps,
ready_in_rtps => ready_in_rtps,
last_word_in_rtps => last_word_in_rtps,
start_dds => start_dds,
ack_dds => ack_dds,
opcode_dds => opcode_dds,
instance_state_dds => instance_state_dds,
view_state_dds => view_state_dds,
sample_state_dds => sample_state_dds,
instance_handle_dds => instance_handle_dds,
max_samples_dds => max_samples_dds,
get_data_dds => get_data_dds,
done_dds => done_dds,
return_code_dds => return_code_dds,
ready_out_dds => ready_out_dds,
valid_out_dds => valid_out_dds,
data_out_dds => data_out_dds,
last_word_out_dds => last_word_out_dds,
sample_info.sample_state => si_sample_state,
sample_info.view_state => si_view_state,
sample_info.instance_state => si_instance_state,
sample_info.source_timestamp => si_source_timestamp,
sample_info.instance_handle => si_instance_handle,
sample_info.publication_handle => si_publication_handle,
sample_info.disposed_generation_count => si_disposed_generation_count,
sample_info.no_writers_generation_count => si_no_writers_generation_count,
sample_info.sample_rank => si_sample_rank,
sample_info.generation_rank => si_generation_rank,
sample_info.absolute_generation_rank => si_absolute_generation_rank,
sample_info.valid_data => si_valid_data,
sample_info_valid => si_valid,
sample_info_ack => '1',
eoc => eoc,
status => status
);
stimulus_prc : process
variable RV : RandomPType;
variable cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE;
variable s : SAMPLE_TYPE := DEFAULT_SAMPLE;
variable kh1, kh2, kh3, kh4, kh5 : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
alias idle_sig is <<signal uut.idle_sig : std_logic>>;
impure function gen_payload(key_hash : INSTANCE_HANDLE_TYPE; len : natural) return TEST_PACKET_TYPE is
variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
begin
assert (len >= 4) report "Payload length has to be at least 16 Bytes long" severity FAILURE;
for i in 0 to len-1 loop
if (i < 4) then
-- NOTE: Beginning of payload is negated key to allow deterministic Key Hash generation from the kh_prc
ret.data(ret.length) := not key_hash(i);
else
ret.data(ret.length) := RV.RandSlv(WORD_WIDTH);
end if;
ret.length := ret.length + 1;
end loop;
ret.last(ret.length-1) := '1';
return ret;
end function;
impure function gen_key_hash return KEY_HASH_TYPE is
variable ret : KEY_HASH_TYPE := KEY_HASH_NIL;
begin
for i in 0 to KEY_HASH_TYPE'length-1 loop
ret(i) := RV.RandSlv(WORD_WIDTH);
end loop;
return ret;
end function;
procedure start_dds is
begin
dds_start <= '1';
wait until rising_edge(clk);
dds_start <= '0';
wait until rising_edge(clk);
end procedure;
procedure start_rtps is
begin
rtps_start <= '1';
wait until rising_edge(clk);
rtps_start <= '0';
wait until rising_edge(clk);
end procedure;
procedure wait_on_dds is
begin
if (dds_done /= '1') then
wait until dds_done = '1';
end if;
end procedure;
procedure wait_on_rtps is
begin
if (rtps_done /= '1') then
wait until rtps_done = '1';
end if;
end procedure;
procedure wait_on_completion is
begin
if (rtps_done /= '1' or dds_done /= '1') then
wait until rtps_done = '1' and dds_done = '1';
end if;
end procedure;
-- NOTE: This procedure waits until the idle_sig is high for at least
-- two consecutive clock cycles.
procedure wait_on_idle is
variable first : boolean := TRUE;
begin
loop
if (idle_sig /= '1') then
wait until idle_sig = '1';
elsif (not first) then
exit;
end if;
wait until rising_edge(clk);
wait until rising_edge(clk);
first := FALSE;
end loop;
end procedure;
begin
SetAlertLogName("L0_dds_reader_test3_arznriu - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyless, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - DDS Handling");
SetAlertEnable(FAILURE, TRUE);
SetAlertEnable(ERROR, TRUE);
SetAlertEnable(WARNING, TRUE);
SetLogEnable(DEBUG, TRUE);
SetLogEnable(PASSED, FALSE);
SetLogEnable(INFO, TRUE);
RV.InitSeed(RV'instance_name);
sstate_id <= GetAlertLogID("Sample State", ALERTLOG_BASE_ID);
vstate_id <= GetAlertLogID("View State", ALERTLOG_BASE_ID);
istate_id <= GetAlertLogID("Instance State", ALERTLOG_BASE_ID);
ts_id <= GetAlertLogID("Source Timestamp", ALERTLOG_BASE_ID);
inst_id <= GetAlertLogID("Instance Handle", ALERTLOG_BASE_ID);
pub_id <= GetAlertLogID("Publication Hanlde", ALERTLOG_BASE_ID);
dis_gen_cnt_id <= GetAlertLogID("Disposed Generation Count", ALERTLOG_BASE_ID);
no_w_gen_cnt_id <= GetAlertLogID("No Writers Generation Count", ALERTLOG_BASE_ID);
srank_id <= GetAlertLogID("Sample Rank", ALERTLOG_BASE_ID);
grank_id <= GetAlertLogID("Generation Rank", ALERTLOG_BASE_ID);
agrank_id <= GetAlertLogID("Absolute Generation Rank", ALERTLOG_BASE_ID);
eoc_id <= GetAlertLogID("End Of Collection", ALERTLOG_BASE_ID);
valid_id <= GetAlertLogID("Valid Data", ALERTLOG_BASE_ID);
data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID);
ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID);
-- Key Hashes
kh1 := (x"F12C31DA", x"E3FE0F3F", x"01F36685", x"446518CA");
kh2 := (x"BC070AC4", x"0BAB5811", x"14EA8D61", x"F669189B");
kh3 := (x"0CEAB0C6", x"FA04B9AD", x"A96EB495", x"4E0EB999");
kh4 := (x"A7EB605C", x"FF4BEF3A", x"3C5E8724", x"CCA0CA67");
kh5 := gen_key_hash;
Log("Initiating Test", INFO);
Log("Current Time: 0s", INFO);
check_time <= TIME_ZERO;
reset <= '1';
wait until rising_edge(clk);
wait until rising_edge(clk);
reset <= '0';
-- MEM: -
-- ISTATE: -
-- VIEW: -
-- WRITER: -
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.payload := gen_payload(KEY_HASH_NIL,10);
cc.src_timestamp := gen_duration(0,0);
Log("RTPS Operation ADD_CACHE_CHANGE [Writer 0, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: S0
-- ISTATE: ALIVE
-- VIEW: NEW
-- WRITER: 0
Log("Current Time: 1s", INFO);
check_time <= gen_duration(1,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := NOT_ALIVE_DISPOSED;
cc.src_timestamp := gen_duration(1,0);
Log("RTPS Operation ADD_CACHE_CHANGE [DISPOSE, Writer 0, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,NOT_ALIVE_DISPOSED_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: S0, S1-
-- ISTATE: DISPOSED
-- VIEW: NEW
-- WRITER: 0
-- TEST: READ [MAX_SAMPLES < SAMPLES]
Log("DDS Operation READ [MAX_SAMPLES 1, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE] (Expected ID0)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := READ;
dds.max_samples := 1;
dds.sstate := ANY_SAMPLE_STATE;
dds.istate := ANY_INSTANCE_STATE;
dds.vstate := ANY_VIEW_STATE;
start_dds;
wait_on_dds;
-- MEM: S0, S1-
-- ISTATE: DISPOSED
-- VIEW: NOT_NEW
-- WRITER: 0
-- TEST: READ [NO COMPATIBLE SAMPLES]
-- TEST: READ MODIFIES VIEW STATE [READ CURRENT GENERATION]
Log("DDS Operation READ [MAX_SAMPLES 20, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, NEW_VIEW_STATE] (No Data)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := READ;
dds.max_samples := 20;
dds.sstate := ANY_SAMPLE_STATE;
dds.istate := ANY_INSTANCE_STATE;
dds.vstate := NEW_VIEW_STATE;
dds.ret_code := RETCODE_NO_DATA;
start_dds;
wait_on_dds;
-- MEM: S0, S1-
-- ISTATE: DISPOSED
-- VIEW: NOT_NEW
-- WRITER: 0
Log("Current Time: 2s", INFO);
check_time <= gen_duration(2,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.payload := gen_payload(KEY_HASH_NIL,10);
cc.src_timestamp := gen_duration(2,0);
Log("RTPS Operation ADD_CACHE_CHANGE [Writer 0, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: S0, S1-, S2
-- ISTATE: ALIVE
-- VIEW: NEW
-- WRITER: 0
-- TEST: READ_NEXT_SAMPLE [WITH UNREAD SAMPLE]
Log("DDS Operation READ_NEXT_SAMPLE (Expected ID1)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := READ_NEXT_SAMPLE;
start_dds;
wait_on_dds;
-- MEM: S0, S1-, S2
-- ISTATE: ALIVE
-- VIEW: NEW
-- WRITER: 0
-- TEST: READ MARKS SAMPLES AS READ
-- TEST: READ MODIFIES VIEW STATE [READ PREVIOUS GENERATION]
-- TEST: READ [MAX_SAMPLES > SAMPLES]
Log("DDS Operation READ [MAX_SAMPLES 20, READ_SAMPLE_STATE, ALIVE_INSTANCE_STATE, NEW_VIEW_STATE] (Expected ID0,ID1)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := READ;
dds.max_samples := 20;
dds.sstate := READ_SAMPLE_STATE;
dds.istate := ALIVE_INSTANCE_STATE;
dds.vstate := NEW_VIEW_STATE;
start_dds;
wait_on_dds;
-- MEM: S0, S1-, S2
-- ISTATE: ALIVE
-- VIEW: NEW
-- WRITER: 0
-- TEST: TAKE
Log("DDS Operation TAKE [MAX_SAMPLES 1, READ_SAMPLE_STATE, ALIVE_INSTANCE_STATE, NEW_VIEW_STATE] (Expected ID0)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := TAKE;
dds.max_samples := 1;
dds.sstate := READ_SAMPLE_STATE;
dds.istate := ALIVE_INSTANCE_STATE;
dds.vstate := NEW_VIEW_STATE;
start_dds;
wait_on_dds;
-- MEM: S1-, S2
-- ISTATE: ALIVE
-- VIEW: NEW
-- WRITER: 0
-- TEST: TAKE_NEXT_SAMPLE
Log("DDS Operation TAKE_NEXT_SAMPLE (Expected ID2)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := TAKE_NEXT_SAMPLE;
start_dds;
wait_on_dds;
-- MEM: S1-
-- ISTATE: ALIVE
-- VIEW: NOT_NEW
-- WRITER: 0
-- TEST: READ_NEXT_SAMPLE [WITHOUT UNREAD SAMPLE]
Log("DDS Operation READ_NEXT_SAMPLE (No Data)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := READ_NEXT_SAMPLE;
dds.ret_code := RETCODE_NO_DATA;
start_dds;
wait_on_dds;
-- MEM: S1-
-- ISTATE: ALIVE
-- VIEW: NOT_NEW
-- WRITER: 0
Log("DDS Operation TAKE [MAX_SAMPLES 20, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE] (Expected ID1)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := TAKE;
dds.max_samples := 20;
dds.sstate := ANY_SAMPLE_STATE;
dds.istate := ANY_INSTANCE_STATE;
dds.vstate := ANY_VIEW_STATE;
start_dds;
wait_on_dds;
-- MEM: -
-- ISTATE: ALIVE
-- VIEW: NOT_NEW
-- WRITER: 0
-- TEST: TAKE REMOVES SAMPLE
-- TEST: TAKE [NO SAMPLES]
Log("DDS Operation TAKE [MAX_SAMPLES 20, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE] (No Data)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := TAKE;
dds.max_samples := 20;
dds.sstate := ANY_SAMPLE_STATE;
dds.istate := ANY_INSTANCE_STATE;
dds.vstate := ANY_VIEW_STATE;
dds.ret_code := RETCODE_NO_DATA;
start_dds;
wait_on_dds;
-- MEM: -
-- ISTATE: ALIVE
-- VIEW: NOT_NEW
-- WRITER: 0
-- TEST: READ [NO SAMPLES]
Log("DDS Operation READ [MAX_SAMPLES 20, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE] (No Data)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := READ;
dds.max_samples := 20;
dds.sstate := ANY_SAMPLE_STATE;
dds.istate := ANY_INSTANCE_STATE;
dds.vstate := ANY_VIEW_STATE;
dds.ret_code := RETCODE_NO_DATA;
start_dds;
wait_on_dds;
-- MEM: -
-- ISTATE: ALIVE
-- VIEW: NOT_NEW
-- WRITER: 0
-- TEST: READ_NEXT_SAMPLE [NO SAMPLE]
Log("DDS Operation READ_NEXT_SAMPLE (No Data)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := READ_NEXT_SAMPLE;
dds.ret_code := RETCODE_NO_DATA;
start_dds;
wait_on_dds;
-- MEM: -
-- ISTATE: ALIVE
-- VIEW: NOT_NEW
-- WRITER: 0
-- TEST: TAKE_NEXT_SAMPLE [NO SAMPLE]
Log("DDS Operation TAKE_NEXT_SAMPLE (No Data)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := TAKE_NEXT_SAMPLE;
dds.ret_code := RETCODE_NO_DATA;
start_dds;
wait_on_dds;
-- MEM: -
-- ISTATE: ALIVE
-- VIEW: NOT_NEW
-- WRITER: 0
-- TEST: READ_INSTANCE
Log("DDS Operation READ_INSTANCE [MAX_SAMPLES 20, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE, Instance 1] (Illegal Operation)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := READ_INSTANCE;
dds.max_samples := 20;
dds.sstate := ANY_SAMPLE_STATE;
dds.istate := ANY_INSTANCE_STATE;
dds.vstate := ANY_VIEW_STATE;
dds.inst := kh1;
dds.ret_code := RETCODE_ILLEGAL_OPERATION;
start_dds;
wait_on_dds;
-- MEM: -
-- ISTATE: ALIVE
-- VIEW: NOT_NEW
-- WRITER: 0
-- TEST: TAKE_INSTANCE
Log("DDS Operation TAKE_INSTANCE [MAX_SAMPLES 20, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE, Instance 1] (Illegal Operation)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := TAKE_INSTANCE;
dds.max_samples := 20;
dds.sstate := ANY_SAMPLE_STATE;
dds.istate := ANY_INSTANCE_STATE;
dds.vstate := ANY_VIEW_STATE;
dds.inst := kh1;
dds.ret_code := RETCODE_ILLEGAL_OPERATION;
start_dds;
wait_on_dds;
-- MEM: -
-- ISTATE: ALIVE
-- VIEW: NOT_NEW
-- WRITER: 0
-- TEST: READ_NEXT_INSTANCE
Log("DDS Operation READ_NEXT_INSTANCE [MAX_SAMPLES 20, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE, Instance 1] (Illegal Operation)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := READ_NEXT_INSTANCE;
dds.max_samples := 20;
dds.sstate := ANY_SAMPLE_STATE;
dds.istate := ANY_INSTANCE_STATE;
dds.vstate := ANY_VIEW_STATE;
dds.inst := kh1;
dds.ret_code := RETCODE_ILLEGAL_OPERATION;
start_dds;
wait_on_dds;
-- MEM: -
-- ISTATE: ALIVE
-- VIEW: NOT_NEW
-- WRITER: 0
-- TEST: TAKE_NEXT_INSTANCE
Log("DDS Operation TAKE_NEXT_INSTANCE [MAX_SAMPLES 20, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE, Instance 1] (Illegal Operation)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := TAKE_NEXT_INSTANCE;
dds.max_samples := 20;
dds.sstate := ANY_SAMPLE_STATE;
dds.istate := ANY_INSTANCE_STATE;
dds.vstate := ANY_VIEW_STATE;
dds.inst := kh1;
dds.ret_code := RETCODE_ILLEGAL_OPERATION;
start_dds;
wait_on_dds;
-- MEM: -
-- ISTATE: ALIVE
-- VIEW: NOT_NEW
-- WRITER: 0
wait_on_completion;
TranscriptOpen(RESULTS_FILE, APPEND_MODE);
SetTranscriptMirror;
ReportAlerts;
TranscriptClose;
std.env.stop;
wait;
end process;
clock_prc : process
begin
clk <= '0';
wait for 25 ns;
clk <= '1';
wait for 25 ns;
end process;
alert_prc : process(all)
begin
if rising_edge(clk) then
-- TODO
end if;
end process;
dds_prc : process(all)
variable col : COLLECTION_TYPE := DEFAULT_COLLECTION;
begin
if rising_edge(clk) then
dds_done <= '0';
case (dds_stage ) is
when IDLE =>
if (dds_start = '1') then
dds_stage <= START;
else
dds_done <= '1';
end if;
when START =>
if (ack_dds = '1') then
dds_stage <= DONE;
dds_cnt <= 0;
end if;
when DONE =>
if (done_dds = '1') then
AffirmIfEqual(ret_id, return_code_dds, dds.ret_code);
case (dds.ret_code) is
when RETCODE_OK =>
gen_collection(mem, col, dds, INSTANCE_PRESENTATION_QOS, FALSE);
dds_stage <= CHECK_SI;
dds_cnt <= 0;
when others =>
dds_stage <= IDLE;
end case;
end if;
when CHECK_SI =>
if (si_valid = '1') then
Log("Read Sample ID" & to_string(to_integer(si_source_timestamp(0))), DEBUG);
AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate);
AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate);
AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate);
AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts));
AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst));
AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL));
AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(no_w_gen_cnt_id, si_no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(srank_id, si_sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH)));
AffirmIfEqual(grank_id, si_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH)));
AffirmIfEqual(agrank_id, si_absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH)));
if (si_valid_data = '1') then
AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected");
dds_stage <= CHECK_DATA;
dds_cnt2 <= 0;
else
AffirmIf(valid_id, col.s(dds_cnt).data = EMPTY_TEST_PACKET, "Sample with Data expected");
if (dds_cnt = col.len-1) then
-- DONE
dds_stage <= WAIT_EOC;
else
dds_cnt <= dds_cnt + 1;
end if;
end if;
end if;
AffirmIf(eoc_id, eoc = '0', "EOC pulled high");
when CHECK_DATA =>
if (valid_out_dds = '1') then
AffirmIfEqual(data_id, data_out_dds, col.s(dds_cnt).data.data(dds_cnt2));
dds_cnt2 <= dds_cnt2 + 1;
if (dds_cnt2 = col.s(dds_cnt).data.length-1) then
AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR);
if (dds_cnt = col.len-1) then
-- DONE
dds_stage <= WAIT_EOC;
else
dds_stage <= CHECK_SI;
dds_cnt <= dds_cnt + 1;
end if;
end if;
end if;
when WAIT_EOC =>
if (eoc = '1') then
dds_stage <= IDLE;
end if;
end case;
end if;
-- DEFAULT
start_dds <= '0';
opcode_dds <= NOP;
instance_state_dds <= ANY_INSTANCE_STATE;
view_state_dds <= ANY_VIEW_STATE;
sample_state_dds <= ANY_SAMPLE_STATE;
instance_handle_dds <= HANDLE_NIL;
max_samples_dds <= (others => '0');
get_data_dds <= '0';
ready_out_dds <= '0';
case (dds_stage ) is
when START =>
start_dds <= '1';
opcode_dds <= dds.opcode;
instance_state_dds <= dds.istate;
view_state_dds <= dds.vstate;
sample_state_dds <= dds.sstate;
instance_handle_dds <= dds.inst;
max_samples_dds <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH));
when CHECK_SI =>
if (si_valid = '1' and si_valid_data = '1') then
get_data_dds <= '1';
end if;
when CHECK_DATA =>
ready_out_dds <= '1';
when others =>
null;
end case;
end process;
rtps_prc : process(all)
variable stimulus : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
begin
if rising_edge(clk) then
rtps_done <= '0';
case (rtps_stage) is
when IDLE =>
if (rtps_start = '1') then
rtps_stage <= START;
else
rtps_done <= '1';
end if;
when START =>
if (ack_rtps = '1') then
case (rtps.opcode) is
when ADD_CACHE_CHANGE =>
gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus);
rtps_stage <= PUSH;
when others =>
rtps_stage <= DONE;
end case;
end if;
when PUSH =>
if (ready_in_rtps = '1') then
rtps_cnt <= rtps_cnt + 1;
if (rtps_cnt = stimulus.length-1) then
rtps_stage <= DONE;
end if;
end if;
when DONE =>
if (done_rtps = '1') then
AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code));
rtps_stage <= IDLE;
end if;
end case;
end if;
-- DEFAULT
start_rtps <= '0';
opcode_rtps <= NOP;
valid_in_rtps <= '0';
last_word_in_rtps <= '0';
data_in_rtps <= (others => '0');
case (rtps_stage) is
when START =>
start_rtps <= '1';
opcode_rtps <= rtps.opcode;
case (rtps.opcode) is
when REMOVE_WRITER =>
data_in_rtps <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH));
when others =>
null;
end case;
when PUSH =>
valid_in_rtps <= '1';
data_in_rtps <= stimulus.data(rtps_cnt);
last_word_in_rtps <= stimulus.last(rtps_cnt);
when others =>
null;
end case;
end process;
watchdog : process
begin
wait for 1 ms;
Alert("Test timeout", FAILURE);
std.env.stop;
end process;
end architecture;

View File

@ -0,0 +1,957 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library osvvm; -- Utility Library
context osvvm.OsvvmContext;
use work.rtps_package.all;
use work.user_config.all;
use work.rtps_config_package.all;
use work.rtps_test_package.all;
-- This testbench tests the Deadline Handling of the DDS Reader, and more specifically the GET_REQUESTED_DEADLINE_MISSED_STATUS DDS Operation.
entity L0_dds_reader_test4 is
end entity;
architecture testbench of L0_dds_reader_test4 is
-- *CONSTANT DECLARATION*
constant MAX_REMOTE_ENDPOINTS : natural := 3;
constant NUM_READERS : natural := 3;
impure function gen_test_config return CONFIG_ARRAY_TYPE is
variable ret : CONFIG_ARRAY_TYPE(0 to NUM_READERS-1) := (others => DEFAULT_WRITER_CONFIG);
begin
-- arzkriu
ret(0).TIME_BASED_FILTER_QOS := DURATION_ZERO;
ret(0).DEADLINE_QOS := gen_duration(1 sec);
ret(0).MAX_SAMPLES := std_logic_vector(to_unsigned(10,CDR_LONG_WIDTH));
ret(0).MAX_INSTANCES := std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH));
ret(0).MAX_SAMPLES_PER_INSTANCE := std_logic_vector(to_unsigned(10,CDR_LONG_WIDTH));
ret(0).HISTORY_QOS := KEEP_ALL_HISTORY_QOS;
ret(0).RELIABILITY_QOS := RELIABLE_RELIABILITY_QOS;
ret(0).PRESENTATION_QOS := INSTANCE_PRESENTATION_QOS;
ret(0).DESTINATION_ORDER_QOS := BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS;
ret(0).COHERENT_ACCESS := FALSE;
ret(0).ORDERED_ACCESS := FALSE;
ret(0).WITH_KEY := TRUE;
ret(0).MAX_PAYLOAD_SIZE := 40;
-- arznriu
ret(1).TIME_BASED_FILTER_QOS := DURATION_ZERO;
ret(1).DEADLINE_QOS := gen_duration(1 sec);
ret(1).MAX_SAMPLES := std_logic_vector(to_unsigned(10,CDR_LONG_WIDTH));
ret(1).MAX_INSTANCES := std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH));
ret(1).MAX_SAMPLES_PER_INSTANCE := std_logic_vector(to_unsigned(10,CDR_LONG_WIDTH));
ret(1).HISTORY_QOS := KEEP_ALL_HISTORY_QOS;
ret(1).RELIABILITY_QOS := RELIABLE_RELIABILITY_QOS;
ret(1).PRESENTATION_QOS := INSTANCE_PRESENTATION_QOS;
ret(1).DESTINATION_ORDER_QOS := BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS;
ret(1).COHERENT_ACCESS := FALSE;
ret(1).ORDERED_ACCESS := FALSE;
ret(1).WITH_KEY := FALSE;
ret(1).MAX_PAYLOAD_SIZE := 40;
-- arzkriu
ret(2).TIME_BASED_FILTER_QOS := DURATION_ZERO;
ret(2).DEADLINE_QOS := gen_duration(2 sec);
ret(2).MAX_SAMPLES := std_logic_vector(to_unsigned(10,CDR_LONG_WIDTH));
ret(2).MAX_INSTANCES := std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH));
ret(2).MAX_SAMPLES_PER_INSTANCE := std_logic_vector(to_unsigned(10,CDR_LONG_WIDTH));
ret(2).HISTORY_QOS := KEEP_ALL_HISTORY_QOS;
ret(2).RELIABILITY_QOS := RELIABLE_RELIABILITY_QOS;
ret(2).PRESENTATION_QOS := INSTANCE_PRESENTATION_QOS;
ret(2).DESTINATION_ORDER_QOS := BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS;
ret(2).COHERENT_ACCESS := FALSE;
ret(2).ORDERED_ACCESS := FALSE;
ret(2).WITH_KEY := TRUE;
ret(2).MAX_PAYLOAD_SIZE := 40;
return ret;
end function;
constant TEST_CONFIG : CONFIG_ARRAY_TYPE := gen_test_config;
-- *TYPE DECLARATION*
type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA, WAIT_EOC, CHECK_DEADLINE);
type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE);
type DDS_READER_MEM_ARRAY_TYPE is array (0 to NUM_READERS-1) of DDS_READER_MEM_TYPE;
-- *SIGNAL DECLARATION*
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal check_time : TIME_TYPE := TIME_ZERO;
signal start_rtps, start_dds, ack_rtps, ack_dds, done_rtps, done_dds : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal opcode_rtps : HISTORY_CACHE_OPCODE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => NOP);
signal opcode_dds : DDS_READER_OPCODE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => NOP);
signal ret_rtps : HISTORY_CACHE_RESPONSE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ERROR);
signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal data_in_rtps, data_out_dds : WORD_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal get_data_dds, si_valid, eoc : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal return_code_dds : RETURN_CODE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal status : STATUS_KIND_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal instance_state_dds : INSTANCE_STATE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ANY_INSTANCE_STATE);
signal view_state_dds : VIEW_STATE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ANY_VIEW_STATE);
signal sample_state_dds : SAMPLE_STATE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ANY_SAMPLE_STATE);
signal instance_handle_dds : INSTANCE_HANDLE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => HANDLE_NIL);
signal max_samples_dds : MAX_SAMPLES_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal sample_info : SAMPLE_INFO_ARRAY_TYPE(0 to NUM_READERS-1);
signal ind : natural := 0;
signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0';
signal dds_cnt, dds_cnt2, rtps_cnt : natural := 0;
signal dds_stage : DDS_STAGE_TYPE := IDLE;
signal rtps_stage : RTPS_STAGE_TYPE := IDLE;
shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST;
shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST;
shared variable mem : DDS_READER_MEM_ARRAY_TYPE := (others => DEFAULT_DDS_READER_MEM);
signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, eoc_id, valid_id, status_id : AlertLogIDType;
-- *FUNCTION DECLARATION*
function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is
variable ret : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
begin
for i in 0 to 3 loop
ret(i) := not payload.data(i);
end loop;
return ret;
end function;
function gen_sn(input : natural) return SEQUENCENUMBER_TYPE is
variable ret : SEQUENCENUMBER_TYPE;
begin
ret(0) := (others => '0');
ret(1) := unsigned(int(input, WORD_WIDTH));
return ret;
end function;
procedure wait_on_sig(signal sig : std_logic) is
begin
if (sig /= '1') then
wait on sig until sig = '1';
end if;
end procedure;
begin
-- Unit Under Test
uut : entity work.dds_reader(arch)
generic map (
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(TEST_CONFIG),
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
clk => clk,
reset => reset,
time => check_time,
start_rtps => start_rtps,
opcode_rtps => opcode_rtps,
ack_rtps => ack_rtps,
done_rtps => done_rtps,
ret_rtps => ret_rtps,
data_in_rtps => data_in_rtps,
valid_in_rtps => valid_in_rtps,
ready_in_rtps => ready_in_rtps,
last_word_in_rtps => last_word_in_rtps,
start_dds => start_dds,
ack_dds => ack_dds,
opcode_dds => opcode_dds,
instance_state_dds => instance_state_dds,
view_state_dds => view_state_dds,
sample_state_dds => sample_state_dds,
instance_handle_dds => instance_handle_dds,
max_samples_dds => max_samples_dds,
get_data_dds => get_data_dds,
done_dds => done_dds,
return_code_dds => return_code_dds,
ready_out_dds => ready_out_dds,
valid_out_dds => valid_out_dds,
data_out_dds => data_out_dds,
last_word_out_dds => last_word_out_dds,
sample_info => sample_info,
sample_info_valid => si_valid,
sample_info_ack => (others => '1'),
eoc => eoc,
status => status
);
stimulus_prc : process
variable RV : RandomPType;
variable cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE;
variable s : SAMPLE_TYPE := DEFAULT_SAMPLE;
variable kh1, kh2, kh3, kh4, kh5 : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
alias idle_sig is <<signal uut.idle_sig : std_logic>>;
impure function gen_payload(key_hash : INSTANCE_HANDLE_TYPE; len : natural) return TEST_PACKET_TYPE is
variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
begin
assert (len >= 4) report "Payload length has to be at least 16 Bytes long" severity FAILURE;
for i in 0 to len-1 loop
if (i < 4) then
-- NOTE: Beginning of payload is negated key to allow deterministic Key Hash generation from the kh_prc
ret.data(ret.length) := not key_hash(i);
else
ret.data(ret.length) := RV.RandSlv(WORD_WIDTH);
end if;
ret.length := ret.length + 1;
end loop;
ret.last(ret.length-1) := '1';
return ret;
end function;
impure function gen_key_hash return KEY_HASH_TYPE is
variable ret : KEY_HASH_TYPE := KEY_HASH_NIL;
begin
for i in 0 to KEY_HASH_TYPE'length-1 loop
ret(i) := RV.RandSlv(WORD_WIDTH);
end loop;
return ret;
end function;
procedure start_dds is
begin
dds_start <= '1';
wait until rising_edge(clk);
dds_start <= '0';
wait until rising_edge(clk);
end procedure;
procedure start_rtps is
begin
rtps_start <= '1';
wait until rising_edge(clk);
rtps_start <= '0';
wait until rising_edge(clk);
end procedure;
procedure wait_on_completion is
begin
if (rtps_done /= '1' or dds_done /= '1') then
wait until rtps_done = '1' and dds_done = '1';
end if;
end procedure;
-- NOTE: This procedure waits until the idle_sig is high for at least
-- two consecutive clock cycles.
procedure wait_on_idle is
variable first : boolean := TRUE;
begin
loop
if (idle_sig /= '1') then
wait until idle_sig = '1';
elsif (not first) then
exit;
end if;
wait until rising_edge(clk);
wait until rising_edge(clk);
first := FALSE;
end loop;
end procedure;
begin
SetAlertLogName("L0_dds_reader_test4 - Deadline Handling");
SetAlertEnable(FAILURE, TRUE);
SetAlertEnable(ERROR, TRUE);
SetAlertEnable(WARNING, TRUE);
SetLogEnable(DEBUG, FALSE);
SetLogEnable(PASSED, FALSE);
SetLogEnable(INFO, TRUE);
RV.InitSeed(RV'instance_name);
sstate_id <= GetAlertLogID("Sample State", ALERTLOG_BASE_ID);
vstate_id <= GetAlertLogID("View State", ALERTLOG_BASE_ID);
istate_id <= GetAlertLogID("Instance State", ALERTLOG_BASE_ID);
ts_id <= GetAlertLogID("Source Timestamp", ALERTLOG_BASE_ID);
inst_id <= GetAlertLogID("Instance Handle", ALERTLOG_BASE_ID);
pub_id <= GetAlertLogID("Publication Hanlde", ALERTLOG_BASE_ID);
dis_gen_cnt_id <= GetAlertLogID("Disposed Generation Count", ALERTLOG_BASE_ID);
no_w_gen_cnt_id <= GetAlertLogID("No Writers Generation Count", ALERTLOG_BASE_ID);
srank_id <= GetAlertLogID("Sample Rank", ALERTLOG_BASE_ID);
grank_id <= GetAlertLogID("Generation Rank", ALERTLOG_BASE_ID);
agrank_id <= GetAlertLogID("Absolute Generation Rank", ALERTLOG_BASE_ID);
eoc_id <= GetAlertLogID("End of Collection", ALERTLOG_BASE_ID);
valid_id <= GetAlertLogID("Valid Data", ALERTLOG_BASE_ID);
data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID);
ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID);
status_id <= GetAlertLogID("Communication Status", ALERTLOG_BASE_ID);
-- Key Hashes
kh3 := (x"0CEAB0C6", x"FA04B9AD", x"A96EB495", x"4E0EB999");
kh4 := (x"A7EB605C", x"FF4BEF3A", x"3C5E8724", x"CCA0CA67");
kh2 := (x"BC070AC4", x"0BAB5811", x"14EA8D61", x"F669189B");
kh1 := (x"F12C31DA", x"E3FE0F3F", x"01F36685", x"446518CA");
Log("Initiating Test", INFO);
Log("Current Time: 0s", INFO);
check_time <= TIME_ZERO;
reset <= '1';
wait until rising_edge(clk);
wait until rising_edge(clk);
reset <= '0';
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
Log("Current Time: 1s", INFO);
check_time <= gen_duration(1 sec);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.src_timestamp := gen_duration(1 sec);
Log("R0,R1,R2: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload]", INFO);
Log("R0,R1,R2: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(1), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(2), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
-- READER 1
ind <= 1;
start_rtps;
wait_on_sig(rtps_done);
-- READER 2
ind <= 2;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,10);
cc.src_timestamp := gen_duration(2 sec);
Log("R0,R2: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload]", INFO);
Log("R0,R2: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 1;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(2), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
-- READER 2
ind <= 2;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.src_timestamp := gen_duration(3 sec);
Log("R0,R2: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 0, Aligned Payload]", INFO);
Log("R0,R2: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(2), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
-- READER 2
ind <= 2;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
Log("Current Time: 2s", INFO);
check_time <= gen_duration(2 sec);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.src_timestamp := gen_duration(4 sec);
Log("R0,R2: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload]", INFO);
Log("R0,R2: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(2), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
-- READER 2
ind <= 2;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.src_timestamp := gen_duration(5 sec);
Log("R0,R1,R2: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 1, Aligned Payload]", INFO);
Log("R0,R1,R2: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 1;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(1), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(2), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
-- READER 1
ind <= 1;
start_rtps;
wait_on_sig(rtps_done);
-- READER 2
ind <= 2;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
Log("Current Time: 3s", INFO);
check_time <= gen_duration(3 sec);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
Log("R0: DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS", INFO);
Log("R0: Expected: count 1, change 1, Instance 2", DEBUG);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 1;
dds.change := 1;
dds.inst := kh2;
-- READER 0
ind <= 0;
start_dds;
wait_on_sig(dds_done);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
Log("R1: DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS", INFO);
Log("R1: Expected: count 0, change 0", DEBUG);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 0;
dds.change := 0;
dds.inst := HANDLE_NIL;
-- READER 1
ind <= 1;
start_dds;
wait_on_sig(dds_done);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
Log("R2: DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS", INFO);
Log("R2: Expected: count 0, change 0, HANDLE_NIL", DEBUG);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 0;
dds.change := 0;
dds.inst := HANDLE_NIL;
-- READER 2
ind <= 2;
start_dds;
wait_on_sig(dds_done);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh3;
cc.payload := gen_payload(kh3,10);
cc.src_timestamp := gen_duration(6 sec);
Log("R0,R2: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload]", INFO);
Log("R0,R2: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 2;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(2), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
-- READER 2
ind <= 2;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
Log("Current Time: 4s", INFO);
check_time <= gen_duration(4 sec);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("R0: DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS", INFO);
Log("R0: Expected: count 4, change 3, Instance 1", DEBUG);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 4;
dds.change := 3;
dds.inst := kh1;
-- READER 0
ind <= 0;
start_dds;
wait_on_sig(dds_done);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("R1: DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS", INFO);
Log("R1: Expected: count 1, change 1", DEBUG);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 1;
dds.change := 1;
dds.inst := HANDLE_NIL;
-- READER 1
ind <= 1;
start_dds;
wait_on_sig(dds_done);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("R2: DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS", INFO);
Log("R2: Expected: count 1, change 1, Instance 2", DEBUG);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 1;
dds.change := 1;
dds.inst := kh2;
-- READER 2
ind <= 2;
start_dds;
wait_on_sig(dds_done);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.src_timestamp := gen_duration(7 sec);
Log("R0,R1,R2: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 2, Aligned Payload]", INFO);
Log("R0,R1,R2: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 2;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(1), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(2), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
-- READER 1
ind <= 1;
start_rtps;
wait_on_sig(rtps_done);
-- READER 2
ind <= 2;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
Log("Current Time: 5s", INFO);
check_time <= gen_duration(5 sec);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
Log("Current Time: 6s", INFO);
check_time <= gen_duration(6 sec);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("R0: DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS", INFO);
Log("R0: Expected: count 11, change 7, Instance 1", DEBUG);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 11;
dds.change := 7;
dds.inst := kh1;
-- READER 0
ind <= 0;
start_dds;
wait_on_sig(dds_done);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("R1: DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS", INFO);
Log("R1: Expected: count 2, change 1", DEBUG);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 2;
dds.change := 1;
dds.inst := HANDLE_NIL;
-- READER 1
ind <= 1;
start_dds;
wait_on_sig(dds_done);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("R2: DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS", INFO);
Log("R2: Expected: count 3, change 2", DEBUG);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 4;
dds.change := 3;
dds.inst := kh1;
-- READER 2
ind <= 2;
start_dds;
wait_on_sig(dds_done);
wait_on_idle;
AffirmIf(status_id,(status(0) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(1) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
AffirmIf(status_id,(status(2) and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
wait_on_completion;
TranscriptOpen(RESULTS_FILE, APPEND_MODE);
SetTranscriptMirror;
ReportAlerts;
TranscriptClose;
std.env.stop;
wait;
end process;
clock_prc : process
begin
clk <= '0';
wait for 25 ns;
clk <= '1';
wait for 25 ns;
end process;
dds_prc : process(all)
variable col : COLLECTION_TYPE := DEFAULT_COLLECTION;
begin
if rising_edge(clk) then
dds_done <= '0';
case (dds_stage ) is
when IDLE =>
if (dds_start = '1') then
dds_stage <= START;
else
dds_done <= '1';
end if;
when START =>
if (ack_dds(ind) = '1') then
dds_stage <= DONE;
dds_cnt <= 0;
end if;
when DONE =>
if (done_dds(ind) = '1') then
AffirmIfEqual(ret_id, return_code_dds(ind), dds.ret_code);
case (dds.ret_code) is
when RETCODE_OK =>
case (dds.opcode) is
when GET_REQUESTED_DEADLINE_MISSED_STATUS =>
dds_stage <= CHECK_DEADLINE;
dds_cnt <= 0;
when others =>
gen_collection(mem(ind), col, dds, TEST_CONFIG(ind).PRESENTATION_QOS, TEST_CONFIG(ind).ORDERED_ACCESS);
dds_stage <= CHECK_SI;
dds_cnt <= 0;
end case;
when others =>
dds_stage <= IDLE;
end case;
end if;
when CHECK_SI =>
if (si_valid(ind) = '1') then
AffirmIfEqual(sstate_id, sample_info(ind).sample_state, col.s(dds_cnt).sstate);
AffirmIfEqual(vstate_id, sample_info(ind).view_state, col.s(dds_cnt).vstate);
AffirmIfEqual(istate_id, sample_info(ind).instance_state, col.s(dds_cnt).istate);
AffirmIfEqual(ts_id, to_unsigned(sample_info(ind).source_timestamp), to_unsigned(col.s(dds_cnt).ts));
AffirmIfEqual(inst_id, to_unsigned(sample_info(ind).instance_handle), to_unsigned(col.s(dds_cnt).inst));
AffirmIfEqual(pub_id, to_unsigned(sample_info(ind).publication_handle), to_unsigned(HANDLE_NIL));
AffirmIfEqual(dis_gen_cnt_id, sample_info(ind).disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(no_w_gen_cnt_id, sample_info(ind).no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(srank_id, sample_info(ind).sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH)));
AffirmIfEqual(grank_id, sample_info(ind).generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH)));
AffirmIfEqual(agrank_id, sample_info(ind).absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH)));
if (sample_info(ind).valid_data = '1') then
AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected");
dds_stage <= CHECK_DATA;
dds_cnt2 <= 0;
else
AffirmIf(valid_id, col.s(dds_cnt).data = EMPTY_TEST_PACKET, "Sample with Data expected");
if (dds_cnt = col.len-1) then
-- DONE
dds_stage <= WAIT_EOC;
else
dds_cnt <= dds_cnt + 1;
end if;
end if;
end if;
AffirmIf(eoc_id, eoc(ind) = '0', "EOC pulled high");
when CHECK_DATA =>
if (valid_out_dds(ind) = '1') then
AffirmIfEqual(data_id, data_out_dds(ind), col.s(dds_cnt).data.data(dds_cnt2));
dds_cnt2 <= dds_cnt2 + 1;
if (dds_cnt2 = col.s(dds_cnt).data.length-1) then
AlertIf(data_id, last_word_out_dds(ind) /= '1', "Last Word Signal not pulled High", ERROR);
if (dds_cnt = col.len-1) then
-- DONE
dds_stage <= WAIT_EOC;
else
dds_stage <= CHECK_SI;
dds_cnt <= dds_cnt + 1;
end if;
end if;
end if;
when WAIT_EOC =>
if (eoc(ind) = '1') then
dds_stage <= IDLE;
end if;
when CHECK_DEADLINE =>
if (valid_out_dds(ind) = '1') then
dds_cnt <= dds_cnt + 1;
case (dds_cnt) is
when 0 =>
AffirmIfEqual(data_id, data_out_dds(ind), std_logic_vector(to_unsigned(dds.count,CDR_LONG_WIDTH)));
when 1 =>
AffirmIfEqual(data_id, data_out_dds(ind), std_logic_vector(to_unsigned(dds.change,CDR_LONG_WIDTH)));
when 2 =>
AffirmIfEqual(data_id, data_out_dds(ind), std_logic_vector(dds.inst(0)));
when 3 =>
AffirmIfEqual(data_id, data_out_dds(ind), std_logic_vector(dds.inst(1)));
when 4 =>
AffirmIfEqual(data_id, data_out_dds(ind), std_logic_vector(dds.inst(2)));
when 5 =>
AffirmIfEqual(data_id, data_out_dds(ind), std_logic_vector(dds.inst(3)));
AlertIf(data_id, last_word_out_dds(ind) /= '1', "Last Word Signal not pulled High", ERROR);
dds_stage <= IDLE;
when others =>
null;
end case;
end if;
end case;
end if;
-- DEFAULT
start_dds <= (others => '0');
opcode_dds <= (others => NOP);
instance_state_dds <= (others => ANY_INSTANCE_STATE);
view_state_dds <= (others => ANY_VIEW_STATE);
sample_state_dds <= (others => ANY_SAMPLE_STATE);
instance_handle_dds <= (others => HANDLE_NIL);
max_samples_dds <= (others => (others => '0'));
get_data_dds <= (others => '0');
ready_out_dds <= (others => '0');
case (dds_stage ) is
when START =>
start_dds(ind) <= '1';
opcode_dds(ind) <= dds.opcode;
instance_state_dds(ind) <= dds.istate;
view_state_dds(ind) <= dds.vstate;
sample_state_dds(ind) <= dds.sstate;
instance_handle_dds(ind) <= dds.inst;
max_samples_dds(ind) <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH));
when CHECK_SI =>
if (si_valid(ind) = '1' and sample_info(ind).valid_data = '1') then
get_data_dds(ind) <= '1';
end if;
when CHECK_DATA =>
ready_out_dds(ind) <= '1';
when CHECK_DEADLINE =>
ready_out_dds(ind) <= '1';
when others =>
null;
end case;
end process;
rtps_prc : process(all)
variable stimulus : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
begin
if rising_edge(clk) then
rtps_done <= '0';
case (rtps_stage) is
when IDLE =>
if (rtps_start = '1') then
rtps_stage <= START;
else
rtps_done <= '1';
end if;
when START =>
if (ack_rtps(ind) = '1') then
case (rtps.opcode) is
when ADD_CACHE_CHANGE =>
gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus);
rtps_stage <= PUSH;
when others =>
rtps_stage <= DONE;
end case;
end if;
when PUSH =>
if (ready_in_rtps(ind) = '1') then
rtps_cnt <= rtps_cnt + 1;
if (rtps_cnt = stimulus.length-1) then
rtps_stage <= DONE;
end if;
end if;
when DONE =>
if (done_rtps(ind) = '1') then
AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps(ind)), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code));
rtps_stage <= IDLE;
end if;
end case;
end if;
-- DEFAULT
start_rtps <= (others => '0');
opcode_rtps <= (others => NOP);
valid_in_rtps <= (others => '0');
last_word_in_rtps <= (others => '0');
data_in_rtps <= (others => (others => '0'));
case (rtps_stage) is
when START =>
start_rtps(ind) <= '1';
opcode_rtps(ind) <= rtps.opcode;
case (rtps.opcode) is
when REMOVE_WRITER =>
data_in_rtps(ind) <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH));
when others =>
null;
end case;
when PUSH =>
valid_in_rtps(ind) <= '1';
data_in_rtps(ind) <= stimulus.data(rtps_cnt);
last_word_in_rtps(ind) <= stimulus.last(rtps_cnt);
when others =>
null;
end case;
end process;
watchdog : process
begin
wait for 1 ms;
Alert("Test timeout", FAILURE);
std.env.stop;
end process;
end architecture;

View File

@ -1,764 +0,0 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library osvvm; -- Utility Library
context osvvm.OsvvmContext;
use work.rtps_package.all;
use work.user_config.all;
use work.rtps_config_package.all;
use work.rtps_test_package.all;
-- This testbench tests the Deadline Handling of the DDS Reader, and more specifically the GET_REQUESTED_DEADLINE_MISSED_STATUS DDS Operation.
entity L0_dds_reader_test4_arzkriu is
end entity;
architecture testbench of L0_dds_reader_test4_arzkriu is
-- *CONSTANT DECLARATION*
constant MAX_REMOTE_ENDPOINTS : natural := 3;
-- *TYPE DECLARATION*
type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA, WAIT_EOC, CHECK_DEADLINE);
type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE);
-- *SIGNAL DECLARATION*
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal check_time : TIME_TYPE := TIME_ZERO;
signal start_rtps, start_dds, ack_rtps, ack_dds, done_rtps, done_dds : std_logic := '0';
signal opcode_rtps : HISTORY_CACHE_OPCODE_TYPE := NOP;
signal opcode_dds : DDS_READER_OPCODE_TYPE := NOP;
signal ret_rtps : HISTORY_CACHE_RESPONSE_TYPE := ERROR;
signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic := '0';
signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic := '0';
signal data_in_rtps, data_out_dds : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal get_data_dds, si_valid_data, si_valid, eoc : std_logic := '0';
signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0');
signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0');
signal instance_state_dds, si_instance_state : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0) := ANY_INSTANCE_STATE;
signal view_state_dds, si_view_state : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0) := ANY_VIEW_STATE;
signal sample_state_dds, si_sample_state : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := ANY_SAMPLE_STATE;
signal instance_handle_dds, si_instance_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
signal max_samples_dds : std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0) := (others => '0');
signal si_source_timestamp : TIME_TYPE := TIME_INVALID;
signal si_publication_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
signal si_disposed_generation_count : std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal si_no_writers_generation_count : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal si_sample_rank : std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0) := (others => '0');
signal si_generation_rank : std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0) := (others => '0');
signal si_absolute_generation_rank: std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0';
signal dds_cnt, dds_cnt2, rtps_cnt : natural := 0;
signal dds_stage : DDS_STAGE_TYPE := IDLE;
signal rtps_stage : RTPS_STAGE_TYPE := IDLE;
shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST;
shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST;
shared variable mem : DDS_READER_MEM_TYPE := DEFAULT_DDS_READER_MEM;
signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, eoc_id, valid_id, status_id : AlertLogIDType;
-- *FUNCTION DECLARATION*
function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is
variable ret : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
begin
for i in 0 to 3 loop
ret(i) := not payload.data(i);
end loop;
return ret;
end function;
function gen_sn(input : natural) return SEQUENCENUMBER_TYPE is
variable ret : SEQUENCENUMBER_TYPE;
begin
ret(0) := (others => '0');
ret(1) := unsigned(int(input, WORD_WIDTH));
return ret;
end function;
begin
-- Unit Under Test
uut : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => DURATION_ZERO,
DEADLINE_QOS => gen_duration(1,0),
MAX_SAMPLES => std_logic_vector(to_unsigned(10,CDR_LONG_WIDTH)),
MAX_INSTANCES => std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH)),
MAX_SAMPLES_PER_INSTANCE => std_logic_vector(to_unsigned(10,CDR_LONG_WIDTH)),
HISTORY_QOS => KEEP_ALL_HISTORY_QOS,
RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS,
PRESENTATION_QOS => INSTANCE_PRESENTATION_QOS,
DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS,
COHERENT_ACCESS => FALSE,
ORDERED_ACCESS => FALSE,
WITH_KEY => TRUE,
PAYLOAD_FRAME_SIZE => 11,
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
clk => clk,
reset => reset,
time => check_time,
start_rtps => start_rtps,
opcode_rtps => opcode_rtps,
ack_rtps => ack_rtps,
done_rtps => done_rtps,
ret_rtps => ret_rtps,
data_in_rtps => data_in_rtps,
valid_in_rtps => valid_in_rtps,
ready_in_rtps => ready_in_rtps,
last_word_in_rtps => last_word_in_rtps,
start_dds => start_dds,
ack_dds => ack_dds,
opcode_dds => opcode_dds,
instance_state_dds => instance_state_dds,
view_state_dds => view_state_dds,
sample_state_dds => sample_state_dds,
instance_handle_dds => instance_handle_dds,
max_samples_dds => max_samples_dds,
get_data_dds => get_data_dds,
done_dds => done_dds,
return_code_dds => return_code_dds,
ready_out_dds => ready_out_dds,
valid_out_dds => valid_out_dds,
data_out_dds => data_out_dds,
last_word_out_dds => last_word_out_dds,
sample_info.sample_state => si_sample_state,
sample_info.view_state => si_view_state,
sample_info.instance_state => si_instance_state,
sample_info.source_timestamp => si_source_timestamp,
sample_info.instance_handle => si_instance_handle,
sample_info.publication_handle => si_publication_handle,
sample_info.disposed_generation_count => si_disposed_generation_count,
sample_info.no_writers_generation_count => si_no_writers_generation_count,
sample_info.sample_rank => si_sample_rank,
sample_info.generation_rank => si_generation_rank,
sample_info.absolute_generation_rank => si_absolute_generation_rank,
sample_info.valid_data => si_valid_data,
sample_info_valid => si_valid,
sample_info_ack => '1',
eoc => eoc,
status => status
);
stimulus_prc : process
variable RV : RandomPType;
variable cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE;
variable s : SAMPLE_TYPE := DEFAULT_SAMPLE;
variable kh1, kh2, kh3, kh4, kh5 : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
alias idle_sig is <<signal uut.idle_sig : std_logic>>;
impure function gen_payload(key_hash : INSTANCE_HANDLE_TYPE; len : natural) return TEST_PACKET_TYPE is
variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
begin
assert (len >= 4) report "Payload length has to be at least 16 Bytes long" severity FAILURE;
for i in 0 to len-1 loop
if (i < 4) then
-- NOTE: Beginning of payload is negated key to allow deterministic Key Hash generation from the kh_prc
ret.data(ret.length) := not key_hash(i);
else
ret.data(ret.length) := RV.RandSlv(WORD_WIDTH);
end if;
ret.length := ret.length + 1;
end loop;
ret.last(ret.length-1) := '1';
return ret;
end function;
impure function gen_key_hash return KEY_HASH_TYPE is
variable ret : KEY_HASH_TYPE := KEY_HASH_NIL;
begin
for i in 0 to KEY_HASH_TYPE'length-1 loop
ret(i) := RV.RandSlv(WORD_WIDTH);
end loop;
return ret;
end function;
procedure start_dds is
begin
dds_start <= '1';
wait until rising_edge(clk);
dds_start <= '0';
wait until rising_edge(clk);
end procedure;
procedure start_rtps is
begin
rtps_start <= '1';
wait until rising_edge(clk);
rtps_start <= '0';
wait until rising_edge(clk);
end procedure;
procedure wait_on_dds is
begin
if (dds_done /= '1') then
wait until dds_done = '1';
end if;
end procedure;
procedure wait_on_rtps is
begin
if (rtps_done /= '1') then
wait until rtps_done = '1';
end if;
end procedure;
procedure wait_on_completion is
begin
if (rtps_done /= '1' or dds_done /= '1') then
wait until rtps_done = '1' and dds_done = '1';
end if;
end procedure;
-- NOTE: This procedure waits until the idle_sig is high for at least
-- two consecutive clock cycles.
procedure wait_on_idle is
variable first : boolean := TRUE;
begin
loop
if (idle_sig /= '1') then
wait until idle_sig = '1';
elsif (not first) then
exit;
end if;
wait until rising_edge(clk);
wait until rising_edge(clk);
first := FALSE;
end loop;
end procedure;
begin
SetAlertLogName("L0_dds_reader_test4_arzkriu - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Deadline Handling");
SetAlertEnable(FAILURE, TRUE);
SetAlertEnable(ERROR, TRUE);
SetAlertEnable(WARNING, TRUE);
SetLogEnable(DEBUG, FALSE);
SetLogEnable(PASSED, FALSE);
SetLogEnable(INFO, TRUE);
RV.InitSeed(RV'instance_name);
sstate_id <= GetAlertLogID("Sample State", ALERTLOG_BASE_ID);
vstate_id <= GetAlertLogID("View State", ALERTLOG_BASE_ID);
istate_id <= GetAlertLogID("Instance State", ALERTLOG_BASE_ID);
ts_id <= GetAlertLogID("Source Timestamp", ALERTLOG_BASE_ID);
inst_id <= GetAlertLogID("Instance Handle", ALERTLOG_BASE_ID);
pub_id <= GetAlertLogID("Publication Hanlde", ALERTLOG_BASE_ID);
dis_gen_cnt_id <= GetAlertLogID("Disposed Generation Count", ALERTLOG_BASE_ID);
no_w_gen_cnt_id <= GetAlertLogID("No Writers Generation Count", ALERTLOG_BASE_ID);
srank_id <= GetAlertLogID("Sample Rank", ALERTLOG_BASE_ID);
grank_id <= GetAlertLogID("Generation Rank", ALERTLOG_BASE_ID);
agrank_id <= GetAlertLogID("Absolute Generation Rank", ALERTLOG_BASE_ID);
eoc_id <= GetAlertLogID("End of Collection", ALERTLOG_BASE_ID);
valid_id <= GetAlertLogID("Valid Data", ALERTLOG_BASE_ID);
data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID);
ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID);
status_id <= GetAlertLogID("Communication Status", ALERTLOG_BASE_ID);
-- Key Hashes
kh1 := (x"F12C31DA", x"E3FE0F3F", x"01F36685", x"446518CA");
kh2 := (x"BC070AC4", x"0BAB5811", x"14EA8D61", x"F669189B");
kh3 := (x"0CEAB0C6", x"FA04B9AD", x"A96EB495", x"4E0EB999");
kh4 := (x"A7EB605C", x"FF4BEF3A", x"3C5E8724", x"CCA0CA67");
Log("Initiating Test", INFO);
Log("Current Time: 0s", INFO);
check_time <= TIME_ZERO;
reset <= '1';
wait until rising_edge(clk);
wait until rising_edge(clk);
reset <= '0';
wait_on_idle;
-- MEM: 0, 0, 0, 0
-- ISTATE: -
-- WRITER: -
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
Log("Current Time: 1s", INFO);
check_time <= gen_duration(1,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.src_timestamp := gen_duration(1,0);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: I1S1
-- ISTATE: I1:ALIVE
-- WRITER: W0:I1
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,10);
cc.src_timestamp := gen_duration(2,0);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 1;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: I1S1, I2S1
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.src_timestamp := gen_duration(3,0);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 0, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: I1S1, I2S1, I4S1
-- ISTATE: I1:ALIVE, I2:ALIVE, I4:ALIVE
-- WRITER: W0:I1,I4, W1:I2
Log("Current Time: 2s", INFO);
check_time <= gen_duration(2,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.src_timestamp := gen_duration(4,0);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: I1S1, I2S1, I4S1, I1S2
-- ISTATE: I1:ALIVE, I2:ALIVE, I4:ALIVE
-- WRITER: W0:I1,I4, W1:I2
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.src_timestamp := gen_duration(5,0);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 1, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 1;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: I1S1, I2S1, I4S1, I1S2, I4S2
-- ISTATE: I1:ALIVE, I2:ALIVE, I4:ALIVE
-- WRITER: W0:I1,I4, W1:I2,I4
Log("Current Time: 3s", INFO);
check_time <= gen_duration(3,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS (Expected: count 1, change 1, Instance 2)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 1;
dds.change := 1;
dds.inst := kh2;
start_dds;
wait_on_dds;
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh3;
cc.payload := gen_payload(kh3,10);
cc.src_timestamp := gen_duration(6,0);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 2;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: I1S1, I2S1, I4S1, I1S2, I4S2, I3S1
-- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE, I4:ALIVE
-- WRITER: W0:I1,I4, W1:I2,I4, W2:I3
Log("Current Time: 4s", INFO);
check_time <= gen_duration(4,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS (Expected: count 4, change 3, Instance 1)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 4;
dds.change := 3;
dds.inst := kh1;
start_dds;
wait_on_dds;
wait_on_idle;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh4;
cc.payload := gen_payload(kh4,10);
cc.src_timestamp := gen_duration(7,0);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 4, Writer 2, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 2;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: I1S1, I2S1, I4S1, I1S2, I4S2, I3S1, I4S3
-- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE, I4:ALIVE
-- WRITER: W0:I1,I4, W1:I2,I4, W2:I3,I4
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
Log("Current Time: 5s", INFO);
check_time <= gen_duration(5,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("Current Time: 6s", INFO);
check_time <= gen_duration(6,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS (Expected: count 11, change 7, Instance 1)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 11;
dds.change := 7;
dds.inst := kh1;
start_dds;
wait_on_dds;
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
wait_on_completion;
TranscriptOpen(RESULTS_FILE, APPEND_MODE);
SetTranscriptMirror;
ReportAlerts;
TranscriptClose;
std.env.stop;
wait;
end process;
clock_prc : process
begin
clk <= '0';
wait for 25 ns;
clk <= '1';
wait for 25 ns;
end process;
alert_prc : process(all)
begin
if rising_edge(clk) then
-- TODO
end if;
end process;
dds_prc : process(all)
variable col : COLLECTION_TYPE := DEFAULT_COLLECTION;
begin
if rising_edge(clk) then
dds_done <= '0';
case (dds_stage ) is
when IDLE =>
if (dds_start = '1') then
dds_stage <= START;
else
dds_done <= '1';
end if;
when START =>
if (ack_dds = '1') then
dds_stage <= DONE;
dds_cnt <= 0;
end if;
when DONE =>
if (done_dds = '1') then
AffirmIfEqual(ret_id, return_code_dds, dds.ret_code);
case (dds.ret_code) is
when RETCODE_OK =>
case (dds.opcode) is
when GET_REQUESTED_DEADLINE_MISSED_STATUS =>
dds_stage <= CHECK_DEADLINE;
dds_cnt <= 0;
when others =>
gen_collection(mem, col, dds, INSTANCE_PRESENTATION_QOS, FALSE);
dds_stage <= CHECK_SI;
dds_cnt <= 0;
end case;
when others =>
dds_stage <= IDLE;
end case;
end if;
when CHECK_SI =>
if (si_valid = '1') then
AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate);
AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate);
AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate);
AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts));
AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst));
AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL));
AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(no_w_gen_cnt_id, si_no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(srank_id, si_sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH)));
AffirmIfEqual(grank_id, si_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH)));
AffirmIfEqual(agrank_id, si_absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH)));
if (si_valid_data = '1') then
AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected");
dds_stage <= CHECK_DATA;
dds_cnt2 <= 0;
else
AffirmIf(valid_id, col.s(dds_cnt).data = EMPTY_TEST_PACKET, "Sample with Data expected");
if (dds_cnt = col.len-1) then
-- DONE
dds_stage <= WAIT_EOC;
else
dds_cnt <= dds_cnt + 1;
end if;
end if;
end if;
AffirmIf(eoc_id, eoc = '0', "EOC pulled high");
when CHECK_DATA =>
if (valid_out_dds = '1') then
AffirmIfEqual(data_id, data_out_dds, col.s(dds_cnt).data.data(dds_cnt2));
dds_cnt2 <= dds_cnt2 + 1;
if (dds_cnt2 = col.s(dds_cnt).data.length-1) then
AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR);
if (dds_cnt = col.len-1) then
-- DONE
dds_stage <= WAIT_EOC;
else
dds_stage <= CHECK_SI;
dds_cnt <= dds_cnt + 1;
end if;
end if;
end if;
when WAIT_EOC =>
if (eoc = '1') then
dds_stage <= IDLE;
end if;
when CHECK_DEADLINE =>
if (valid_out_dds = '1') then
dds_cnt <= dds_cnt + 1;
case (dds_cnt) is
when 0 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(dds.count,CDR_LONG_WIDTH)));
when 1 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(dds.change,CDR_LONG_WIDTH)));
when 2 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst(0)));
when 3 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst(1)));
when 4 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst(2)));
when 5 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst(3)));
AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR);
dds_stage <= IDLE;
when others =>
null;
end case;
end if;
end case;
end if;
-- DEFAULT
start_dds <= '0';
opcode_dds <= NOP;
instance_state_dds <= ANY_INSTANCE_STATE;
view_state_dds <= ANY_VIEW_STATE;
sample_state_dds <= ANY_SAMPLE_STATE;
instance_handle_dds <= HANDLE_NIL;
max_samples_dds <= (others => '0');
get_data_dds <= '0';
ready_out_dds <= '0';
case (dds_stage ) is
when START =>
start_dds <= '1';
opcode_dds <= dds.opcode;
instance_state_dds <= dds.istate;
view_state_dds <= dds.vstate;
sample_state_dds <= dds.sstate;
instance_handle_dds <= dds.inst;
max_samples_dds <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH));
when CHECK_SI =>
if (si_valid = '1' and si_valid_data = '1') then
get_data_dds <= '1';
end if;
when CHECK_DATA =>
ready_out_dds <= '1';
when CHECK_DEADLINE =>
ready_out_dds <= '1';
when others =>
null;
end case;
end process;
rtps_prc : process(all)
variable stimulus : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
begin
if rising_edge(clk) then
rtps_done <= '0';
case (rtps_stage) is
when IDLE =>
if (rtps_start = '1') then
rtps_stage <= START;
else
rtps_done <= '1';
end if;
when START =>
if (ack_rtps = '1') then
case (rtps.opcode) is
when ADD_CACHE_CHANGE =>
gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus);
rtps_stage <= PUSH;
when others =>
rtps_stage <= DONE;
end case;
end if;
when PUSH =>
if (ready_in_rtps = '1') then
rtps_cnt <= rtps_cnt + 1;
if (rtps_cnt = stimulus.length-1) then
rtps_stage <= DONE;
end if;
end if;
when DONE =>
if (done_rtps = '1') then
AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code));
rtps_stage <= IDLE;
end if;
end case;
end if;
-- DEFAULT
start_rtps <= '0';
opcode_rtps <= NOP;
valid_in_rtps <= '0';
last_word_in_rtps <= '0';
data_in_rtps <= (others => '0');
case (rtps_stage) is
when START =>
start_rtps <= '1';
opcode_rtps <= rtps.opcode;
case (rtps.opcode) is
when REMOVE_WRITER =>
data_in_rtps <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH));
when others =>
null;
end case;
when PUSH =>
valid_in_rtps <= '1';
data_in_rtps <= stimulus.data(rtps_cnt);
last_word_in_rtps <= stimulus.last(rtps_cnt);
when others =>
null;
end case;
end process;
watchdog : process
begin
wait for 1 ms;
Alert("Test timeout", FAILURE);
std.env.stop;
end process;
end architecture;

View File

@ -1,633 +0,0 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library osvvm; -- Utility Library
context osvvm.OsvvmContext;
use work.rtps_package.all;
use work.user_config.all;
use work.rtps_config_package.all;
use work.rtps_test_package.all;
-- This testbench tests the Deadline Handling of the DDS Reader, and more specifically the GET_REQUESTED_DEADLINE_MISSED_STATUS DDS Operation.
entity L0_dds_reader_test4_arznriu is
end entity;
architecture testbench of L0_dds_reader_test4_arznriu is
-- *CONSTANT DECLARATION*
constant MAX_REMOTE_ENDPOINTS : natural := 3;
-- *TYPE DECLARATION*
type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA, WAIT_EOC, CHECK_DEADLINE);
type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE);
-- *SIGNAL DECLARATION*
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal check_time : TIME_TYPE := TIME_ZERO;
signal start_rtps, start_dds, ack_rtps, ack_dds, done_rtps, done_dds : std_logic := '0';
signal opcode_rtps : HISTORY_CACHE_OPCODE_TYPE := NOP;
signal opcode_dds : DDS_READER_OPCODE_TYPE := NOP;
signal ret_rtps : HISTORY_CACHE_RESPONSE_TYPE := ERROR;
signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic := '0';
signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic := '0';
signal data_in_rtps, data_out_dds : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal get_data_dds, si_valid_data, si_valid, eoc : std_logic := '0';
signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0');
signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0');
signal instance_state_dds, si_instance_state : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0) := ANY_INSTANCE_STATE;
signal view_state_dds, si_view_state : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0) := ANY_VIEW_STATE;
signal sample_state_dds, si_sample_state : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := ANY_SAMPLE_STATE;
signal instance_handle_dds, si_instance_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
signal max_samples_dds : std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0) := (others => '0');
signal si_source_timestamp : TIME_TYPE := TIME_INVALID;
signal si_publication_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
signal si_disposed_generation_count : std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal si_no_writers_generation_count : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal si_sample_rank : std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0) := (others => '0');
signal si_generation_rank : std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0) := (others => '0');
signal si_absolute_generation_rank: std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0';
signal dds_cnt, dds_cnt2, rtps_cnt : natural := 0;
signal dds_stage : DDS_STAGE_TYPE := IDLE;
signal rtps_stage : RTPS_STAGE_TYPE := IDLE;
shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST;
shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST;
shared variable mem : DDS_READER_MEM_TYPE := DEFAULT_DDS_READER_MEM;
signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, eoc_id, valid_id, status_id : AlertLogIDType;
-- *FUNCTION DECLARATION*
function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is
variable ret : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
begin
for i in 0 to 3 loop
ret(i) := not payload.data(i);
end loop;
return ret;
end function;
function gen_sn(input : natural) return SEQUENCENUMBER_TYPE is
variable ret : SEQUENCENUMBER_TYPE;
begin
ret(0) := (others => '0');
ret(1) := unsigned(int(input, WORD_WIDTH));
return ret;
end function;
begin
-- Unit Under Test
uut : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => DURATION_ZERO,
DEADLINE_QOS => gen_duration(1,0),
MAX_SAMPLES => std_logic_vector(to_unsigned(10,CDR_LONG_WIDTH)),
MAX_INSTANCES => std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH)),
MAX_SAMPLES_PER_INSTANCE => std_logic_vector(to_unsigned(10,CDR_LONG_WIDTH)),
HISTORY_QOS => KEEP_ALL_HISTORY_QOS,
RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS,
PRESENTATION_QOS => INSTANCE_PRESENTATION_QOS,
DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS,
COHERENT_ACCESS => FALSE,
ORDERED_ACCESS => FALSE,
WITH_KEY => FALSE,
PAYLOAD_FRAME_SIZE => 11,
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
clk => clk,
reset => reset,
time => check_time,
start_rtps => start_rtps,
opcode_rtps => opcode_rtps,
ack_rtps => ack_rtps,
done_rtps => done_rtps,
ret_rtps => ret_rtps,
data_in_rtps => data_in_rtps,
valid_in_rtps => valid_in_rtps,
ready_in_rtps => ready_in_rtps,
last_word_in_rtps => last_word_in_rtps,
start_dds => start_dds,
ack_dds => ack_dds,
opcode_dds => opcode_dds,
instance_state_dds => instance_state_dds,
view_state_dds => view_state_dds,
sample_state_dds => sample_state_dds,
instance_handle_dds => instance_handle_dds,
max_samples_dds => max_samples_dds,
get_data_dds => get_data_dds,
done_dds => done_dds,
return_code_dds => return_code_dds,
ready_out_dds => ready_out_dds,
valid_out_dds => valid_out_dds,
data_out_dds => data_out_dds,
last_word_out_dds => last_word_out_dds,
sample_info.sample_state => si_sample_state,
sample_info.view_state => si_view_state,
sample_info.instance_state => si_instance_state,
sample_info.source_timestamp => si_source_timestamp,
sample_info.instance_handle => si_instance_handle,
sample_info.publication_handle => si_publication_handle,
sample_info.disposed_generation_count => si_disposed_generation_count,
sample_info.no_writers_generation_count => si_no_writers_generation_count,
sample_info.sample_rank => si_sample_rank,
sample_info.generation_rank => si_generation_rank,
sample_info.absolute_generation_rank => si_absolute_generation_rank,
sample_info.valid_data => si_valid_data,
sample_info_valid => si_valid,
sample_info_ack => '1',
eoc => eoc,
status => status
);
stimulus_prc : process
variable RV : RandomPType;
variable cc : CACHE_CHANGE_TYPE := DEFAULT_CACHE_CHANGE;
variable s : SAMPLE_TYPE := DEFAULT_SAMPLE;
variable kh1, kh2, kh3, kh4, kh5 : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
alias idle_sig is <<signal uut.idle_sig : std_logic>>;
impure function gen_payload(key_hash : INSTANCE_HANDLE_TYPE; len : natural) return TEST_PACKET_TYPE is
variable ret : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
begin
assert (len >= 4) report "Payload length has to be at least 16 Bytes long" severity FAILURE;
for i in 0 to len-1 loop
if (i < 4) then
-- NOTE: Beginning of payload is negated key to allow deterministic Key Hash generation from the kh_prc
ret.data(ret.length) := not key_hash(i);
else
ret.data(ret.length) := RV.RandSlv(WORD_WIDTH);
end if;
ret.length := ret.length + 1;
end loop;
ret.last(ret.length-1) := '1';
return ret;
end function;
impure function gen_key_hash return KEY_HASH_TYPE is
variable ret : KEY_HASH_TYPE := KEY_HASH_NIL;
begin
for i in 0 to KEY_HASH_TYPE'length-1 loop
ret(i) := RV.RandSlv(WORD_WIDTH);
end loop;
return ret;
end function;
procedure start_dds is
begin
dds_start <= '1';
wait until rising_edge(clk);
dds_start <= '0';
wait until rising_edge(clk);
end procedure;
procedure start_rtps is
begin
rtps_start <= '1';
wait until rising_edge(clk);
rtps_start <= '0';
wait until rising_edge(clk);
end procedure;
procedure wait_on_dds is
begin
if (dds_done /= '1') then
wait until dds_done = '1';
end if;
end procedure;
procedure wait_on_rtps is
begin
if (rtps_done /= '1') then
wait until rtps_done = '1';
end if;
end procedure;
procedure wait_on_completion is
begin
if (rtps_done /= '1' or dds_done /= '1') then
wait until rtps_done = '1' and dds_done = '1';
end if;
end procedure;
-- NOTE: This procedure waits until the idle_sig is high for at least
-- two consecutive clock cycles.
procedure wait_on_idle is
variable first : boolean := TRUE;
begin
loop
if (idle_sig /= '1') then
wait until idle_sig = '1';
elsif (not first) then
exit;
end if;
wait until rising_edge(clk);
wait until rising_edge(clk);
first := FALSE;
end loop;
end procedure;
begin
SetAlertLogName("L0_dds_reader_test4_arznriu - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyless, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Deadline Handling");
SetAlertEnable(FAILURE, TRUE);
SetAlertEnable(ERROR, TRUE);
SetAlertEnable(WARNING, TRUE);
SetLogEnable(DEBUG, FALSE);
SetLogEnable(PASSED, FALSE);
SetLogEnable(INFO, TRUE);
RV.InitSeed(RV'instance_name);
sstate_id <= GetAlertLogID("Sample State", ALERTLOG_BASE_ID);
vstate_id <= GetAlertLogID("View State", ALERTLOG_BASE_ID);
istate_id <= GetAlertLogID("Instance State", ALERTLOG_BASE_ID);
ts_id <= GetAlertLogID("Source Timestamp", ALERTLOG_BASE_ID);
inst_id <= GetAlertLogID("Instance Handle", ALERTLOG_BASE_ID);
pub_id <= GetAlertLogID("Publication Hanlde", ALERTLOG_BASE_ID);
dis_gen_cnt_id <= GetAlertLogID("Disposed Generation Count", ALERTLOG_BASE_ID);
no_w_gen_cnt_id <= GetAlertLogID("No Writers Generation Count", ALERTLOG_BASE_ID);
srank_id <= GetAlertLogID("Sample Rank", ALERTLOG_BASE_ID);
grank_id <= GetAlertLogID("Generation Rank", ALERTLOG_BASE_ID);
agrank_id <= GetAlertLogID("Absolute Generation Rank", ALERTLOG_BASE_ID);
eoc_id <= GetAlertLogID("End of Collection", ALERTLOG_BASE_ID);
valid_id <= GetAlertLogID("Valid Data", ALERTLOG_BASE_ID);
data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID);
ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID);
status_id <= GetAlertLogID("Communication Status", ALERTLOG_BASE_ID);
-- Key Hashes
kh1 := (x"F12C31DA", x"E3FE0F3F", x"01F36685", x"446518CA");
kh2 := (x"BC070AC4", x"0BAB5811", x"14EA8D61", x"F669189B");
kh3 := (x"0CEAB0C6", x"FA04B9AD", x"A96EB495", x"4E0EB999");
kh4 := (x"A7EB605C", x"FF4BEF3A", x"3C5E8724", x"CCA0CA67");
Log("Initiating Test", INFO);
Log("Current Time: 0s", INFO);
check_time <= TIME_ZERO;
reset <= '1';
wait until rising_edge(clk);
wait until rising_edge(clk);
reset <= '0';
wait_on_idle;
-- MEM: -
-- ISTATE: -
-- WRITER: -
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
Log("Current Time: 1s", INFO);
check_time <= gen_duration(1,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS (Expected: count 1, change 1)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 1;
dds.change := 1;
dds.inst := HANDLE_NIL;
start_dds;
wait_on_dds;
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := HANDLE_NIL;
cc.payload := gen_payload(KEY_HASH_NIL,10);
cc.src_timestamp := gen_duration(1,0);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Writer 0, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: S1
-- ISTATE: ALIVE
-- WRITER: W0
Log("Current Time: 2s", INFO);
check_time <= gen_duration(2,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := HANDLE_NIL;
cc.payload := gen_payload(KEY_HASH_NIL,10);
cc.src_timestamp := gen_duration(2,0);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Writer 1, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 1;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: S1, S2
-- ISTATE: ALIVE
-- WRITER: W0, W1
Log("Current Time: 3s", INFO);
check_time <= gen_duration(3,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
Log("Current Time: 4s", INFO);
check_time <= gen_duration(4,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("Current Time: 5s", INFO);
check_time <= gen_duration(5,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) = REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 1", "Received: 0");
Log("DDS Operation GET_REQUESTED_DEADLINE_MISSED_STATUS (Expected: count 3, change 2)", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := GET_REQUESTED_DEADLINE_MISSED_STATUS;
dds.ret_code := RETCODE_OK;
dds.count := 3;
dds.change := 2;
dds.inst := HANDLE_NIL;
start_dds;
wait_on_dds;
wait_on_idle;
AffirmIf(status_id,(status and REQUESTED_DEADLINE_MISSED_STATUS) /= REQUESTED_DEADLINE_MISSED_STATUS, "Expected: 0", "Received: 1");
wait_on_completion;
TranscriptOpen(RESULTS_FILE, APPEND_MODE);
SetTranscriptMirror;
ReportAlerts;
TranscriptClose;
std.env.stop;
wait;
end process;
clock_prc : process
begin
clk <= '0';
wait for 25 ns;
clk <= '1';
wait for 25 ns;
end process;
alert_prc : process(all)
begin
if rising_edge(clk) then
-- TODO
end if;
end process;
dds_prc : process(all)
variable col : COLLECTION_TYPE := DEFAULT_COLLECTION;
begin
if rising_edge(clk) then
dds_done <= '0';
case (dds_stage ) is
when IDLE =>
if (dds_start = '1') then
dds_stage <= START;
else
dds_done <= '1';
end if;
when START =>
if (ack_dds = '1') then
dds_stage <= DONE;
dds_cnt <= 0;
end if;
when DONE =>
if (done_dds = '1') then
AffirmIfEqual(ret_id, return_code_dds, dds.ret_code);
case (dds.ret_code) is
when RETCODE_OK =>
case (dds.opcode) is
when GET_REQUESTED_DEADLINE_MISSED_STATUS =>
dds_stage <= CHECK_DEADLINE;
dds_cnt <= 0;
when others =>
gen_collection(mem, col, dds, INSTANCE_PRESENTATION_QOS, FALSE);
dds_stage <= CHECK_SI;
dds_cnt <= 0;
end case;
when others =>
dds_stage <= IDLE;
end case;
end if;
when CHECK_SI =>
if (si_valid = '1') then
AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate);
AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate);
AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate);
AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts));
AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst));
AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL));
AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(no_w_gen_cnt_id, si_no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(srank_id, si_sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH)));
AffirmIfEqual(grank_id, si_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH)));
AffirmIfEqual(agrank_id, si_absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH)));
if (si_valid_data = '1') then
AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected");
dds_stage <= CHECK_DATA;
dds_cnt2 <= 0;
else
AffirmIf(valid_id, col.s(dds_cnt).data = EMPTY_TEST_PACKET, "Sample with Data expected");
if (dds_cnt = col.len-1) then
-- DONE
dds_stage <= WAIT_EOC;
else
dds_cnt <= dds_cnt + 1;
end if;
end if;
end if;
AffirmIf(eoc_id, eoc = '0', "EOC pulled high");
when CHECK_DATA =>
if (valid_out_dds = '1') then
AffirmIfEqual(data_id, data_out_dds, col.s(dds_cnt).data.data(dds_cnt2));
dds_cnt2 <= dds_cnt2 + 1;
if (dds_cnt2 = col.s(dds_cnt).data.length-1) then
AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR);
if (dds_cnt = col.len-1) then
-- DONE
dds_stage <= WAIT_EOC;
else
dds_stage <= CHECK_SI;
dds_cnt <= dds_cnt + 1;
end if;
end if;
end if;
when WAIT_EOC =>
if (eoc = '1') then
dds_stage <= IDLE;
end if;
when CHECK_DEADLINE =>
if (valid_out_dds = '1') then
dds_cnt <= dds_cnt + 1;
case (dds_cnt) is
when 0 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(dds.count,CDR_LONG_WIDTH)));
when 1 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(dds.change,CDR_LONG_WIDTH)));
when 2 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst(0)));
when 3 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst(1)));
when 4 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst(2)));
when 5 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst(3)));
AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR);
dds_stage <= IDLE;
when others =>
null;
end case;
end if;
end case;
end if;
-- DEFAULT
start_dds <= '0';
opcode_dds <= NOP;
instance_state_dds <= ANY_INSTANCE_STATE;
view_state_dds <= ANY_VIEW_STATE;
sample_state_dds <= ANY_SAMPLE_STATE;
instance_handle_dds <= HANDLE_NIL;
max_samples_dds <= (others => '0');
get_data_dds <= '0';
ready_out_dds <= '0';
case (dds_stage ) is
when START =>
start_dds <= '1';
opcode_dds <= dds.opcode;
instance_state_dds <= dds.istate;
view_state_dds <= dds.vstate;
sample_state_dds <= dds.sstate;
instance_handle_dds <= dds.inst;
max_samples_dds <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH));
when CHECK_SI =>
if (si_valid = '1' and si_valid_data = '1') then
get_data_dds <= '1';
end if;
when CHECK_DATA =>
ready_out_dds <= '1';
when CHECK_DEADLINE =>
ready_out_dds <= '1';
when others =>
null;
end case;
end process;
rtps_prc : process(all)
variable stimulus : TEST_PACKET_TYPE := EMPTY_TEST_PACKET;
begin
if rising_edge(clk) then
rtps_done <= '0';
case (rtps_stage) is
when IDLE =>
if (rtps_start = '1') then
rtps_stage <= START;
else
rtps_done <= '1';
end if;
when START =>
if (ack_rtps = '1') then
case (rtps.opcode) is
when ADD_CACHE_CHANGE =>
gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus);
rtps_stage <= PUSH;
when others =>
rtps_stage <= DONE;
end case;
end if;
when PUSH =>
if (ready_in_rtps = '1') then
rtps_cnt <= rtps_cnt + 1;
if (rtps_cnt = stimulus.length-1) then
rtps_stage <= DONE;
end if;
end if;
when DONE =>
if (done_rtps = '1') then
AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code));
rtps_stage <= IDLE;
end if;
end case;
end if;
-- DEFAULT
start_rtps <= '0';
opcode_rtps <= NOP;
valid_in_rtps <= '0';
last_word_in_rtps <= '0';
data_in_rtps <= (others => '0');
case (rtps_stage) is
when START =>
start_rtps <= '1';
opcode_rtps <= rtps.opcode;
case (rtps.opcode) is
when REMOVE_WRITER =>
data_in_rtps <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH));
when others =>
null;
end case;
when PUSH =>
valid_in_rtps <= '1';
data_in_rtps <= stimulus.data(rtps_cnt);
last_word_in_rtps <= stimulus.last(rtps_cnt);
when others =>
null;
end case;
end process;
watchdog : process
begin
wait for 1 ms;
Alert("Test timeout", FAILURE);
std.env.stop;
end process;
end architecture;

View File

@ -12,53 +12,71 @@ use work.rtps_test_package.all;
-- This testbench tests the Lifespan Handling of the DDS Reader.
entity L0_dds_reader_test6_arzkriu is
entity L0_dds_reader_test6 is
end entity;
architecture testbench of L0_dds_reader_test6_arzkriu is
architecture testbench of L0_dds_reader_test6 is
-- *CONSTANT DECLARATION*
constant MAX_REMOTE_ENDPOINTS : natural := 3;
constant NUM_READERS : natural := 1;
impure function gen_test_config return CONFIG_ARRAY_TYPE is
variable ret : CONFIG_ARRAY_TYPE(0 to NUM_READERS-1) := (others => DEFAULT_WRITER_CONFIG);
begin
-- arzkriu
ret(0).TIME_BASED_FILTER_QOS := DURATION_ZERO;
ret(0).DEADLINE_QOS := DURATION_INFINITE;
ret(0).MAX_SAMPLES := std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH));
ret(0).MAX_INSTANCES := std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH));
ret(0).MAX_SAMPLES_PER_INSTANCE := std_logic_vector(to_unsigned(1,CDR_LONG_WIDTH));
ret(0).HISTORY_QOS := KEEP_ALL_HISTORY_QOS;
ret(0).RELIABILITY_QOS := RELIABLE_RELIABILITY_QOS;
ret(0).PRESENTATION_QOS := INSTANCE_PRESENTATION_QOS;
ret(0).DESTINATION_ORDER_QOS := BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS;
ret(0).COHERENT_ACCESS := FALSE;
ret(0).ORDERED_ACCESS := FALSE;
ret(0).WITH_KEY := TRUE;
ret(0).MAX_PAYLOAD_SIZE := 40;
return ret;
end function;
constant TEST_CONFIG : CONFIG_ARRAY_TYPE := gen_test_config;
-- *TYPE DECLARATION*
type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA, WAIT_EOC, CHECK_SAMPLE_REJECT);
type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA, WAIT_EOC);
type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE);
type DDS_READER_MEM_ARRAY_TYPE is array (0 to NUM_READERS-1) of DDS_READER_MEM_TYPE;
-- *SIGNAL DECLARATION*
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal check_time : TIME_TYPE := TIME_ZERO;
signal start_rtps, start_dds, ack_rtps, ack_dds, done_rtps, done_dds : std_logic := '0';
signal opcode_rtps : HISTORY_CACHE_OPCODE_TYPE := NOP;
signal opcode_dds : DDS_READER_OPCODE_TYPE := NOP;
signal ret_rtps : HISTORY_CACHE_RESPONSE_TYPE := ERROR;
signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic := '0';
signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic := '0';
signal data_in_rtps, data_out_dds : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal get_data_dds, si_valid_data, si_valid, eoc : std_logic := '0';
signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0');
signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0');
signal instance_state_dds, si_instance_state : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0) := ANY_INSTANCE_STATE;
signal view_state_dds, si_view_state : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0) := ANY_VIEW_STATE;
signal sample_state_dds, si_sample_state : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := ANY_SAMPLE_STATE;
signal instance_handle_dds, si_instance_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
signal max_samples_dds : std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0) := (others => '0');
signal si_source_timestamp : TIME_TYPE := TIME_INVALID;
signal si_publication_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
signal si_disposed_generation_count : std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal si_no_writers_generation_count : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal si_sample_rank : std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0) := (others => '0');
signal si_generation_rank : std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0) := (others => '0');
signal si_absolute_generation_rank: std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal start_rtps, start_dds, ack_rtps, ack_dds, done_rtps, done_dds : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal opcode_rtps : HISTORY_CACHE_OPCODE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => NOP);
signal opcode_dds : DDS_READER_OPCODE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => NOP);
signal ret_rtps : HISTORY_CACHE_RESPONSE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ERROR);
signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal data_in_rtps, data_out_dds : WORD_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal get_data_dds, si_valid, eoc : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal return_code_dds : RETURN_CODE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal status : STATUS_KIND_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal instance_state_dds : INSTANCE_STATE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ANY_INSTANCE_STATE);
signal view_state_dds : VIEW_STATE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ANY_VIEW_STATE);
signal sample_state_dds : SAMPLE_STATE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ANY_SAMPLE_STATE);
signal instance_handle_dds : INSTANCE_HANDLE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => HANDLE_NIL);
signal max_samples_dds : MAX_SAMPLES_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal sample_info : SAMPLE_INFO_ARRAY_TYPE(0 to NUM_READERS-1);
signal ind : natural := 0;
signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0';
signal dds_cnt, dds_cnt2, rtps_cnt : natural := 0;
signal dds_stage : DDS_STAGE_TYPE := IDLE;
signal rtps_stage : RTPS_STAGE_TYPE := IDLE;
shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST;
shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST;
shared variable mem : DDS_READER_MEM_TYPE := DEFAULT_DDS_READER_MEM;
shared variable mem : DDS_READER_MEM_ARRAY_TYPE := (others => DEFAULT_DDS_READER_MEM);
signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, eoc_id, valid_id, status_id : AlertLogIDType;
-- *FUNCTION DECLARATION*
@ -80,70 +98,55 @@ architecture testbench of L0_dds_reader_test6_arzkriu is
return ret;
end function;
procedure wait_on_sig(signal sig : std_logic) is
begin
if (sig /= '1') then
wait on sig until sig = '1';
end if;
end procedure;
begin
-- Unit Under Test
uut : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => DURATION_ZERO,
DEADLINE_QOS => DURATION_INFINITE,
MAX_SAMPLES => std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH)),
MAX_INSTANCES => std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH)),
MAX_SAMPLES_PER_INSTANCE => std_logic_vector(to_unsigned(1,CDR_LONG_WIDTH)),
HISTORY_QOS => KEEP_ALL_HISTORY_QOS,
RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS,
PRESENTATION_QOS => INSTANCE_PRESENTATION_QOS,
DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS,
COHERENT_ACCESS => FALSE,
ORDERED_ACCESS => FALSE,
WITH_KEY => TRUE,
PAYLOAD_FRAME_SIZE => 11,
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(TEST_CONFIG),
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
clk => clk,
reset => reset,
time => check_time,
start_rtps => start_rtps,
opcode_rtps => opcode_rtps,
ack_rtps => ack_rtps,
done_rtps => done_rtps,
ret_rtps => ret_rtps,
data_in_rtps => data_in_rtps,
valid_in_rtps => valid_in_rtps,
ready_in_rtps => ready_in_rtps,
last_word_in_rtps => last_word_in_rtps,
start_dds => start_dds,
ack_dds => ack_dds,
opcode_dds => opcode_dds,
instance_state_dds => instance_state_dds,
view_state_dds => view_state_dds,
sample_state_dds => sample_state_dds,
instance_handle_dds => instance_handle_dds,
max_samples_dds => max_samples_dds,
get_data_dds => get_data_dds,
done_dds => done_dds,
return_code_dds => return_code_dds,
ready_out_dds => ready_out_dds,
valid_out_dds => valid_out_dds,
data_out_dds => data_out_dds,
last_word_out_dds => last_word_out_dds,
sample_info.sample_state => si_sample_state,
sample_info.view_state => si_view_state,
sample_info.instance_state => si_instance_state,
sample_info.source_timestamp => si_source_timestamp,
sample_info.instance_handle => si_instance_handle,
sample_info.publication_handle => si_publication_handle,
sample_info.disposed_generation_count => si_disposed_generation_count,
sample_info.no_writers_generation_count => si_no_writers_generation_count,
sample_info.sample_rank => si_sample_rank,
sample_info.generation_rank => si_generation_rank,
sample_info.absolute_generation_rank => si_absolute_generation_rank,
sample_info.valid_data => si_valid_data,
sample_info_valid => si_valid,
sample_info_ack => '1',
eoc => eoc,
status => status
clk => clk,
reset => reset,
time => check_time,
start_rtps => start_rtps,
opcode_rtps => opcode_rtps,
ack_rtps => ack_rtps,
done_rtps => done_rtps,
ret_rtps => ret_rtps,
data_in_rtps => data_in_rtps,
valid_in_rtps => valid_in_rtps,
ready_in_rtps => ready_in_rtps,
last_word_in_rtps => last_word_in_rtps,
start_dds => start_dds,
ack_dds => ack_dds,
opcode_dds => opcode_dds,
instance_state_dds => instance_state_dds,
view_state_dds => view_state_dds,
sample_state_dds => sample_state_dds,
instance_handle_dds => instance_handle_dds,
max_samples_dds => max_samples_dds,
get_data_dds => get_data_dds,
done_dds => done_dds,
return_code_dds => return_code_dds,
ready_out_dds => ready_out_dds,
valid_out_dds => valid_out_dds,
data_out_dds => data_out_dds,
last_word_out_dds => last_word_out_dds,
sample_info => sample_info,
sample_info_valid => si_valid,
sample_info_ack => (others => '1'),
eoc => eoc,
status => status
);
stimulus_prc : process
@ -198,20 +201,6 @@ begin
wait until rising_edge(clk);
end procedure;
procedure wait_on_dds is
begin
if (dds_done /= '1') then
wait until dds_done = '1';
end if;
end procedure;
procedure wait_on_rtps is
begin
if (rtps_done /= '1') then
wait until rtps_done = '1';
end if;
end procedure;
procedure wait_on_completion is
begin
if (rtps_done /= '1' or dds_done /= '1') then
@ -238,7 +227,7 @@ begin
begin
SetAlertLogName("L0_dds_reader_test6_arzkriu - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Sample Rejected Status Handling");
SetAlertLogName("L0_dds_reader_test6 - Sample Rejected Status Handling");
SetAlertEnable(FAILURE, TRUE);
SetAlertEnable(ERROR, TRUE);
SetAlertEnable(WARNING, TRUE);
@ -279,6 +268,7 @@ begin
wait until rising_edge(clk);
wait until rising_edge(clk);
reset <= '0';
wait_on_idle;
-- MEM: -
-- ISTATE: -
-- WRITER: -
@ -288,19 +278,22 @@ begin
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.src_timestamp := gen_duration(1,0);
cc.src_timestamp := gen_duration(1 sec);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO);
Log("R0: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload]", INFO);
Log("R0: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.lifespan := gen_duration(2,0);
rtps.lifespan := gen_duration(2 sec);
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- MEM: I1S1
-- ISTATE: I1:ALIVE
@ -311,26 +304,29 @@ begin
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,10);
cc.src_timestamp := gen_duration(2,0);
cc.src_timestamp := gen_duration(2 sec);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload] (ACCEPTED)", INFO);
Log("R0: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload]", INFO);
Log("R0: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 1;
rtps.lifespan := gen_duration(3,0);
rtps.lifespan := gen_duration(3 sec);
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- MEM: I1S1, I2S1
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
Log("Current Time: 1s", INFO);
check_time <= gen_duration(1,0);
check_time <= gen_duration(1 sec);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
@ -340,24 +336,27 @@ begin
cc.kind := ALIVE;
cc.instance := kh3;
cc.payload := gen_payload(kh3,10);
cc.src_timestamp := gen_duration(3,0);
cc.src_timestamp := gen_duration(3 sec);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded)", INFO);
Log("R0: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload]", INFO);
Log("R0: REJECTED [MAX_SAMPLES exceeded]", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 2;
rtps.lifespan := gen_duration(1,0);
rtps.lifespan := gen_duration(1 sec);
rtps.ret_code := REJECTED;
-- READER 0
ind <= 0;
start_rtps;
wait_on_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- MEM: I1S1, I2S1
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
Log("Current Time: 2s", INFO);
check_time <= gen_duration(2,0);
check_time <= gen_duration(2 sec);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
@ -367,19 +366,22 @@ begin
cc.kind := ALIVE;
cc.instance := kh3;
cc.payload := gen_payload(kh3,10);
cc.src_timestamp := gen_duration(4,0);
cc.src_timestamp := gen_duration(4 sec);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO);
Log("R0: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload]", INFO);
Log("R0: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 2;
rtps.lifespan := gen_duration(1,0);
rtps.lifespan := gen_duration(1 sec);
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- MEM: I2S1, I3S1
-- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE
@ -390,24 +392,27 @@ begin
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.src_timestamp := gen_duration(5,0);
cc.src_timestamp := gen_duration(5 sec);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (REJECTED: MAX_SAMPLES exceeded)", INFO);
Log("R0: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload]", INFO);
Log("R0: REJECTED [MAX_SAMPLES exceeded]", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.lifespan := gen_duration(1,0);
rtps.lifespan := gen_duration(1 sec);
rtps.ret_code := REJECTED;
-- READER 0
ind <= 0;
start_rtps;
wait_on_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- MEM: I2S1, I3S1
-- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE
-- WRITER: W0:I1, W1:I2, W2:I3
Log("Current Time: 3s", INFO);
check_time <= gen_duration(3,0);
check_time <= gen_duration(3 sec);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
@ -417,19 +422,22 @@ begin
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.src_timestamp := gen_duration(6,0);
cc.src_timestamp := gen_duration(6 sec);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO);
Log("R0: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload]", INFO);
Log("R0: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.lifespan := gen_duration(2,0);
rtps.lifespan := gen_duration(2 sec);
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- MEM: I1S2, 0
-- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE
@ -440,19 +448,22 @@ begin
cc.kind := ALIVE;
cc.instance := kh3;
cc.payload := gen_payload(kh3,10);
cc.src_timestamp := gen_duration(7,0);
cc.src_timestamp := gen_duration(7 sec);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload] (ACCEPTED)", INFO);
Log("R0: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 3, Writer 2, Aligned Payload]", INFO);
Log("R0: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 2;
rtps.lifespan := gen_duration(1,0);
rtps.lifespan := gen_duration(1 sec);
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- MEM: I1S2, I3S2
-- ISTATE: I1:ALIVE, I2:ALIVE, I3:ALIVE
@ -475,13 +486,6 @@ begin
wait for 25 ns;
end process;
alert_prc : process(all)
begin
if rising_edge(clk) then
-- TODO
end if;
end process;
dds_prc : process(all)
variable col : COLLECTION_TYPE := DEFAULT_COLLECTION;
begin
@ -495,42 +499,36 @@ begin
dds_done <= '1';
end if;
when START =>
if (ack_dds = '1') then
if (ack_dds(ind) = '1') then
dds_stage <= DONE;
dds_cnt <= 0;
end if;
when DONE =>
if (done_dds = '1') then
AffirmIfEqual(ret_id, return_code_dds, dds.ret_code);
if (done_dds(ind) = '1') then
AffirmIfEqual(ret_id, return_code_dds(ind), dds.ret_code);
case (dds.ret_code) is
when RETCODE_OK =>
case (dds.opcode) is
when GET_SAMPLE_REJECTED_STATUS =>
dds_stage <= CHECK_SAMPLE_REJECT;
dds_cnt <= 0;
when others =>
gen_collection(mem, col, dds, INSTANCE_PRESENTATION_QOS, FALSE);
dds_stage <= CHECK_SI;
dds_cnt <= 0;
end case;
gen_collection(mem(ind), col, dds, TEST_CONFIG(ind).PRESENTATION_QOS, TEST_CONFIG(ind).ORDERED_ACCESS);
dds_stage <= CHECK_SI;
dds_cnt <= 0;
when others =>
dds_stage <= IDLE;
end case;
end if;
when CHECK_SI =>
if (si_valid = '1') then
AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate);
AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate);
AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate);
AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts));
AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst));
AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL));
AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(no_w_gen_cnt_id, si_no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(srank_id, si_sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH)));
AffirmIfEqual(grank_id, si_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH)));
AffirmIfEqual(agrank_id, si_absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH)));
if (si_valid_data = '1') then
if (si_valid(ind) = '1') then
AffirmIfEqual(sstate_id, sample_info(ind).sample_state, col.s(dds_cnt).sstate);
AffirmIfEqual(vstate_id, sample_info(ind).view_state, col.s(dds_cnt).vstate);
AffirmIfEqual(istate_id, sample_info(ind).instance_state, col.s(dds_cnt).istate);
AffirmIfEqual(ts_id, to_unsigned(sample_info(ind).source_timestamp), to_unsigned(col.s(dds_cnt).ts));
AffirmIfEqual(inst_id, to_unsigned(sample_info(ind).instance_handle), to_unsigned(col.s(dds_cnt).inst));
AffirmIfEqual(pub_id, to_unsigned(sample_info(ind).publication_handle), to_unsigned(HANDLE_NIL));
AffirmIfEqual(dis_gen_cnt_id, sample_info(ind).disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(no_w_gen_cnt_id, sample_info(ind).no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(srank_id, sample_info(ind).sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH)));
AffirmIfEqual(grank_id, sample_info(ind).generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH)));
AffirmIfEqual(agrank_id, sample_info(ind).absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH)));
if (sample_info(ind).valid_data = '1') then
AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected");
dds_stage <= CHECK_DATA;
dds_cnt2 <= 0;
@ -544,13 +542,13 @@ begin
end if;
end if;
end if;
AffirmIf(eoc_id, eoc = '0', "EOC pulled high");
AffirmIf(eoc_id, eoc(ind) = '0', "EOC pulled high");
when CHECK_DATA =>
if (valid_out_dds = '1') then
AffirmIfEqual(data_id, data_out_dds, col.s(dds_cnt).data.data(dds_cnt2));
if (valid_out_dds(ind) = '1') then
AffirmIfEqual(data_id, data_out_dds(ind), col.s(dds_cnt).data.data(dds_cnt2));
dds_cnt2 <= dds_cnt2 + 1;
if (dds_cnt2 = col.s(dds_cnt).data.length-1) then
AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR);
AlertIf(data_id, last_word_out_dds(ind) /= '1', "Last Word Signal not pulled High", ERROR);
if (dds_cnt = col.len-1) then
-- DONE
dds_stage <= WAIT_EOC;
@ -561,65 +559,39 @@ begin
end if;
end if;
when WAIT_EOC =>
if (eoc = '1') then
if (eoc(ind) = '1') then
dds_stage <= IDLE;
end if;
when CHECK_SAMPLE_REJECT =>
if (valid_out_dds = '1') then
dds_cnt <= dds_cnt + 1;
case (dds_cnt) is
when 0 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(dds.count,CDR_LONG_WIDTH)));
when 1 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(to_unsigned(dds.change,CDR_LONG_WIDTH)));
when 2 =>
AffirmIfEqual(data_id, data_out_dds, dds.last_reason);
when 3 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst(0)));
when 4 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst(1)));
when 5 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst(2)));
when 6 =>
AffirmIfEqual(data_id, data_out_dds, std_logic_vector(dds.inst(3)));
AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR);
dds_stage <= IDLE;
when others =>
null;
end case;
end if;
end case;
end if;
-- DEFAULT
start_dds <= '0';
opcode_dds <= NOP;
instance_state_dds <= ANY_INSTANCE_STATE;
view_state_dds <= ANY_VIEW_STATE;
sample_state_dds <= ANY_SAMPLE_STATE;
instance_handle_dds <= HANDLE_NIL;
max_samples_dds <= (others => '0');
get_data_dds <= '0';
ready_out_dds <= '0';
start_dds <= (others => '0');
opcode_dds <= (others => NOP);
instance_state_dds <= (others => ANY_INSTANCE_STATE);
view_state_dds <= (others => ANY_VIEW_STATE);
sample_state_dds <= (others => ANY_SAMPLE_STATE);
instance_handle_dds <= (others => HANDLE_NIL);
max_samples_dds <= (others => (others => '0'));
get_data_dds <= (others => '0');
ready_out_dds <= (others => '0');
case (dds_stage ) is
when START =>
start_dds <= '1';
opcode_dds <= dds.opcode;
instance_state_dds <= dds.istate;
view_state_dds <= dds.vstate;
sample_state_dds <= dds.sstate;
instance_handle_dds <= dds.inst;
max_samples_dds <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH));
start_dds(ind) <= '1';
opcode_dds(ind) <= dds.opcode;
instance_state_dds(ind) <= dds.istate;
view_state_dds(ind) <= dds.vstate;
sample_state_dds(ind) <= dds.sstate;
instance_handle_dds(ind) <= dds.inst;
max_samples_dds(ind) <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH));
when CHECK_SI =>
if (si_valid = '1' and si_valid_data = '1') then
get_data_dds <= '1';
if (si_valid(ind) = '1' and sample_info(ind).valid_data = '1') then
get_data_dds(ind) <= '1';
end if;
when CHECK_DATA =>
ready_out_dds <= '1';
when CHECK_SAMPLE_REJECT =>
ready_out_dds <= '1';
ready_out_dds(ind) <= '1';
when others =>
null;
end case;
@ -638,7 +610,7 @@ begin
rtps_done <= '1';
end if;
when START =>
if (ack_rtps = '1') then
if (ack_rtps(ind) = '1') then
case (rtps.opcode) is
when ADD_CACHE_CHANGE =>
gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus);
@ -648,41 +620,41 @@ begin
end case;
end if;
when PUSH =>
if (ready_in_rtps = '1') then
if (ready_in_rtps(ind) = '1') then
rtps_cnt <= rtps_cnt + 1;
if (rtps_cnt = stimulus.length-1) then
rtps_stage <= DONE;
end if;
end if;
when DONE =>
if (done_rtps = '1') then
AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code));
if (done_rtps(ind) = '1') then
AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps(ind)), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code));
rtps_stage <= IDLE;
end if;
end case;
end if;
-- DEFAULT
start_rtps <= '0';
opcode_rtps <= NOP;
valid_in_rtps <= '0';
last_word_in_rtps <= '0';
data_in_rtps <= (others => '0');
start_rtps <= (others => '0');
opcode_rtps <= (others => NOP);
valid_in_rtps <= (others => '0');
last_word_in_rtps <= (others => '0');
data_in_rtps <= (others => (others => '0'));
case (rtps_stage) is
when START =>
start_rtps <= '1';
opcode_rtps <= rtps.opcode;
start_rtps(ind) <= '1';
opcode_rtps(ind) <= rtps.opcode;
case (rtps.opcode) is
when REMOVE_WRITER =>
data_in_rtps <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH));
data_in_rtps(ind) <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH));
when others =>
null;
end case;
when PUSH =>
valid_in_rtps <= '1';
data_in_rtps <= stimulus.data(rtps_cnt);
last_word_in_rtps <= stimulus.last(rtps_cnt);
valid_in_rtps(ind) <= '1';
data_in_rtps(ind) <= stimulus.data(rtps_cnt);
last_word_in_rtps(ind) <= stimulus.last(rtps_cnt);
when others =>
null;
end case;

View File

@ -10,56 +10,74 @@ use work.user_config.all;
use work.rtps_config_package.all;
use work.rtps_test_package.all;
-- This testbench tests the handling of the TIME_BASED_FILTER QoS of the DDS Reader.
-- This testbench tests the bitmap writer handling (bitmap conversion to/from memory)
entity L0_dds_reader_test2_arpkriu is
entity L0_dds_reader_test7 is
end entity;
architecture testbench of L0_dds_reader_test2_arpkriu is
architecture testbench of L0_dds_reader_test7 is
-- *CONSTANT DECLARATION*
constant MAX_REMOTE_ENDPOINTS : natural := 3;
constant MAX_REMOTE_ENDPOINTS : natural := 33;
constant NUM_READERS : natural := 1;
impure function gen_test_config return CONFIG_ARRAY_TYPE is
variable ret : CONFIG_ARRAY_TYPE(0 to NUM_READERS-1) := (others => DEFAULT_WRITER_CONFIG);
begin
-- arzkriu
ret(0).TIME_BASED_FILTER_QOS := DURATION_ZERO;
ret(0).DEADLINE_QOS := DURATION_INFINITE;
ret(0).MAX_SAMPLES := std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH));
ret(0).MAX_INSTANCES := std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH));
ret(0).MAX_SAMPLES_PER_INSTANCE := std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH));
ret(0).HISTORY_QOS := KEEP_ALL_HISTORY_QOS;
ret(0).RELIABILITY_QOS := RELIABLE_RELIABILITY_QOS;
ret(0).PRESENTATION_QOS := INSTANCE_PRESENTATION_QOS;
ret(0).DESTINATION_ORDER_QOS := BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS;
ret(0).COHERENT_ACCESS := FALSE;
ret(0).ORDERED_ACCESS := FALSE;
ret(0).WITH_KEY := TRUE;
ret(0).MAX_PAYLOAD_SIZE := 40;
return ret;
end function;
constant TEST_CONFIG : CONFIG_ARRAY_TYPE := gen_test_config;
-- *TYPE DECLARATION*
type DDS_STAGE_TYPE is (IDLE, START, DONE, CHECK_SI, CHECK_DATA, WAIT_EOC);
type RTPS_STAGE_TYPE is (IDLE, START, PUSH, DONE);
type DDS_READER_MEM_ARRAY_TYPE is array (0 to NUM_READERS-1) of DDS_READER_MEM_TYPE;
-- *SIGNAL DECLARATION*
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal check_time : TIME_TYPE := TIME_ZERO;
signal start_rtps, start_dds, ack_rtps, ack_dds, done_rtps, done_dds : std_logic := '0';
signal opcode_rtps : HISTORY_CACHE_OPCODE_TYPE := NOP;
signal opcode_dds : DDS_READER_OPCODE_TYPE := NOP;
signal ret_rtps : HISTORY_CACHE_RESPONSE_TYPE := ERROR;
signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic := '0';
signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic := '0';
signal data_in_rtps, data_out_dds : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
signal get_data_dds, si_valid_data, si_valid, eoc : std_logic := '0';
signal return_code_dds : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0');
signal status : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := (others => '0');
signal instance_state_dds, si_instance_state : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0) := ANY_INSTANCE_STATE;
signal view_state_dds, si_view_state : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0) := ANY_VIEW_STATE;
signal sample_state_dds, si_sample_state : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := ANY_SAMPLE_STATE;
signal instance_handle_dds, si_instance_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
signal max_samples_dds : std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0) := (others => '0');
signal si_source_timestamp : TIME_TYPE := TIME_INVALID;
signal si_publication_handle : INSTANCE_HANDLE_TYPE := HANDLE_NIL;
signal si_disposed_generation_count : std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal si_no_writers_generation_count : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal si_sample_rank : std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0) := (others => '0');
signal si_generation_rank : std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0) := (others => '0');
signal si_absolute_generation_rank: std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0) := (others => '0');
signal start_rtps, start_dds, ack_rtps, ack_dds, done_rtps, done_dds : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal opcode_rtps : HISTORY_CACHE_OPCODE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => NOP);
signal opcode_dds : DDS_READER_OPCODE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => NOP);
signal ret_rtps : HISTORY_CACHE_RESPONSE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ERROR);
signal ready_in_rtps, valid_in_rtps, last_word_in_rtps : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal ready_out_dds, valid_out_dds, last_word_out_dds : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal data_in_rtps, data_out_dds : WORD_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal get_data_dds, si_valid, eoc : std_logic_vector(0 to NUM_READERS-1) := (others => '0');
signal return_code_dds : RETURN_CODE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal status : STATUS_KIND_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal instance_state_dds : INSTANCE_STATE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ANY_INSTANCE_STATE);
signal view_state_dds : VIEW_STATE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ANY_VIEW_STATE);
signal sample_state_dds : SAMPLE_STATE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => ANY_SAMPLE_STATE);
signal instance_handle_dds : INSTANCE_HANDLE_ARRAY_TYPE(0 to NUM_READERS-1) := (others => HANDLE_NIL);
signal max_samples_dds : MAX_SAMPLES_ARRAY_TYPE(0 to NUM_READERS-1) := (others => (others => '0'));
signal sample_info : SAMPLE_INFO_ARRAY_TYPE(0 to NUM_READERS-1);
signal ind : natural := 0;
signal dds_start , dds_done , rtps_start, rtps_done : std_logic := '0';
signal dds_cnt, dds_cnt2, rtps_cnt : natural := 0;
signal dds_stage : DDS_STAGE_TYPE := IDLE;
signal rtps_stage : RTPS_STAGE_TYPE := IDLE;
shared variable dds : DDS_READER_TEST_TYPE := DEFAULT_DDS_READER_TEST;
shared variable rtps : RTPS_READER_TEST_TYPE := DEFAULT_RTPS_READER_TEST;
shared variable mem : DDS_READER_MEM_TYPE := DEFAULT_DDS_READER_MEM;
signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, eoc_id, valid_id : AlertLogIDType;
shared variable mem : DDS_READER_MEM_ARRAY_TYPE := (others => DEFAULT_DDS_READER_MEM);
signal data_id, ret_id, sstate_id, vstate_id, istate_id, inst_id, ts_id, pub_id, dis_gen_cnt_id, no_w_gen_cnt_id, srank_id, grank_id, agrank_id, eoc_id, valid_id, status_id : AlertLogIDType;
-- *FUNCTION DECLARATION*
function extract_key_hash (payload : TEST_PACKET_TYPE) return INSTANCE_HANDLE_TYPE is
@ -80,70 +98,55 @@ architecture testbench of L0_dds_reader_test2_arpkriu is
return ret;
end function;
procedure wait_on_sig(signal sig : std_logic) is
begin
if (sig /= '1') then
wait on sig until sig = '1';
end if;
end procedure;
begin
-- Unit Under Test
uut : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => gen_duration(2,0),
DEADLINE_QOS => DURATION_INFINITE,
MAX_SAMPLES => std_logic_vector(to_unsigned(4,CDR_LONG_WIDTH)),
MAX_INSTANCES => std_logic_vector(to_unsigned(3,CDR_LONG_WIDTH)),
MAX_SAMPLES_PER_INSTANCE => std_logic_vector(to_unsigned(2,CDR_LONG_WIDTH)),
HISTORY_QOS => KEEP_ALL_HISTORY_QOS,
RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS,
PRESENTATION_QOS => INSTANCE_PRESENTATION_QOS,
DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS,
COHERENT_ACCESS => FALSE,
ORDERED_ACCESS => FALSE,
WITH_KEY => TRUE,
PAYLOAD_FRAME_SIZE => 11,
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(TEST_CONFIG),
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
clk => clk,
reset => reset,
time => check_time,
start_rtps => start_rtps,
opcode_rtps => opcode_rtps,
ack_rtps => ack_rtps,
done_rtps => done_rtps,
ret_rtps => ret_rtps,
data_in_rtps => data_in_rtps,
valid_in_rtps => valid_in_rtps,
ready_in_rtps => ready_in_rtps,
last_word_in_rtps => last_word_in_rtps,
start_dds => start_dds,
ack_dds => ack_dds,
opcode_dds => opcode_dds,
instance_state_dds => instance_state_dds,
view_state_dds => view_state_dds,
sample_state_dds => sample_state_dds,
instance_handle_dds => instance_handle_dds,
max_samples_dds => max_samples_dds,
get_data_dds => get_data_dds,
done_dds => done_dds,
return_code_dds => return_code_dds,
ready_out_dds => ready_out_dds,
valid_out_dds => valid_out_dds,
data_out_dds => data_out_dds,
last_word_out_dds => last_word_out_dds,
sample_info.sample_state => si_sample_state,
sample_info.view_state => si_view_state,
sample_info.instance_state => si_instance_state,
sample_info.source_timestamp => si_source_timestamp,
sample_info.instance_handle => si_instance_handle,
sample_info.publication_handle => si_publication_handle,
sample_info.disposed_generation_count => si_disposed_generation_count,
sample_info.no_writers_generation_count => si_no_writers_generation_count,
sample_info.sample_rank => si_sample_rank,
sample_info.generation_rank => si_generation_rank,
sample_info.absolute_generation_rank => si_absolute_generation_rank,
sample_info.valid_data => si_valid_data,
sample_info_valid => si_valid,
sample_info_ack => '1',
eoc => eoc,
status => status
clk => clk,
reset => reset,
time => check_time,
start_rtps => start_rtps,
opcode_rtps => opcode_rtps,
ack_rtps => ack_rtps,
done_rtps => done_rtps,
ret_rtps => ret_rtps,
data_in_rtps => data_in_rtps,
valid_in_rtps => valid_in_rtps,
ready_in_rtps => ready_in_rtps,
last_word_in_rtps => last_word_in_rtps,
start_dds => start_dds,
ack_dds => ack_dds,
opcode_dds => opcode_dds,
instance_state_dds => instance_state_dds,
view_state_dds => view_state_dds,
sample_state_dds => sample_state_dds,
instance_handle_dds => instance_handle_dds,
max_samples_dds => max_samples_dds,
get_data_dds => get_data_dds,
done_dds => done_dds,
return_code_dds => return_code_dds,
ready_out_dds => ready_out_dds,
valid_out_dds => valid_out_dds,
data_out_dds => data_out_dds,
last_word_out_dds => last_word_out_dds,
sample_info => sample_info,
sample_info_valid => si_valid,
sample_info_ack => (others => '1'),
eoc => eoc,
status => status
);
stimulus_prc : process
@ -198,20 +201,6 @@ begin
wait until rising_edge(clk);
end procedure;
procedure wait_on_dds is
begin
if (dds_done /= '1') then
wait until dds_done = '1';
end if;
end procedure;
procedure wait_on_rtps is
begin
if (rtps_done /= '1') then
wait until rtps_done = '1';
end if;
end procedure;
procedure wait_on_completion is
begin
if (rtps_done /= '1' or dds_done /= '1') then
@ -238,7 +227,7 @@ begin
begin
SetAlertLogName("L0_dds_reader_test2_arpkriu - (KEEP ALL, Reliable, Positive TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - TIME_BASED_FILTER QoS Handling");
SetAlertLogName("L0_dds_reader_test7 - Sample Rejected Status Handling");
SetAlertEnable(FAILURE, TRUE);
SetAlertEnable(ERROR, TRUE);
SetAlertEnable(WARNING, TRUE);
@ -257,17 +246,18 @@ begin
srank_id <= GetAlertLogID("Sample Rank", ALERTLOG_BASE_ID);
grank_id <= GetAlertLogID("Generation Rank", ALERTLOG_BASE_ID);
agrank_id <= GetAlertLogID("Absolute Generation Rank", ALERTLOG_BASE_ID);
eoc_id <= GetAlertLogID("End Of Collection", ALERTLOG_BASE_ID);
eoc_id <= GetAlertLogID("End of Collection", ALERTLOG_BASE_ID);
valid_id <= GetAlertLogID("Valid Data", ALERTLOG_BASE_ID);
data_id <= GetAlertLogID("Data Out", ALERTLOG_BASE_ID);
ret_id <= GetAlertLogID("Return Code", ALERTLOG_BASE_ID);
status_id <= GetAlertLogID("Communication Status", ALERTLOG_BASE_ID);
-- Key Hashes
kh1 := gen_key_hash;
kh2 := gen_key_hash;
kh3 := gen_key_hash;
kh4 := gen_key_hash;
kh5 := gen_key_hash;
Log("Initiating Test", INFO);
@ -277,7 +267,8 @@ begin
wait until rising_edge(clk);
wait until rising_edge(clk);
reset <= '0';
-- MEM: 0, 0, 0, 0
wait_on_idle;
-- MEM: -
-- ISTATE: -
-- WRITER: -
@ -286,120 +277,132 @@ begin
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.src_timestamp := gen_duration(1 sec);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO);
Log("R0: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO);
Log("R0: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- MEM: I1S1, 0, 0, 0
-- MEM: I1S1
-- ISTATE: I1:ALIVE
-- WRITER: W0:I1
Log("Current Time: 1s", INFO);
check_time <= gen_duration(1,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_idle;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.src_timestamp := gen_duration(2 sec);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (IGNORED: Time Based Filter)", INFO);
Log("R0: RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 32, Aligned Payload]", INFO);
Log("R0: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
start_rtps;
wait_on_rtps;
wait_on_idle;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,10);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 1, Aligned Payload] (ACCEPTED)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 1;
rtps.writer_pos := 32;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_rtps;
wait_on_idle;
-- MEM: I1S1, I2S1, 0, 0
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
Log("Current Time: 2s", INFO);
check_time <= gen_duration(2,0);
wait until rising_edge(clk);
wait until rising_edge(clk);
wait_on_sig(rtps_done);
wait_on_idle;
-- MEM: I1S1, I1S2
-- ISTATE: I1:ALIVE
-- WRITER: W0:I1, W33:I1
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.instance := kh2;
cc.payload := gen_payload(kh2,10);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 2, Writer 0, Aligned Payload] (IGNORED: Time Based Filter)", INFO);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 1;
rtps.ret_code := OK;
start_rtps;
wait_on_rtps;
wait_on_idle;
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := FALSE;
cc.kind := ALIVE;
cc.serialized_key := TRUE;
cc.kind := NOT_ALIVE_UNREGISTERED;
cc.instance := kh1;
cc.payload := gen_payload(kh1,10);
cc.payload := gen_payload(kh1,5);
cc.src_timestamp := gen_duration(3 sec);
Log("RTPS Operation ADD_CACHE_CHANGE [KEY_HASH, Instance 1, Writer 0, Aligned Payload] (ACCEPTED)", INFO);
Log("R0: RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 0]", INFO);
Log("R0: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 0;
rtps.ret_code := OK;
s := to_sample(cc,ALIVE_INSTANCE_STATE);
add_sample(s,mem, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- MEM: I1S1, I2S1, I1S2, 0
-- ISTATE: I1:ALIVE, I2:ALIVE
-- WRITER: W0:I1, W1:I2
-- MEM: I1S1, I1S2
-- ISTATE: I1:ALIVE
-- WRITER: W33:I1
-- VAILDATE STATE
Log("DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, ANY_INSTANCE_STATE, ANY_VIEW_STATE]", INFO);
Log("R0: DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, ANY_VIEW_STATE]", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := READ;
dds.max_samples := 4;
dds.sstate := ANY_SAMPLE_STATE;
dds.istate := ANY_INSTANCE_STATE;
dds.istate := NOT_ALIVE_NO_WRITERS_INSTANCE_STATE;
dds.vstate := ANY_VIEW_STATE;
dds.ret_code := RETCODE_NO_DATA;
-- READER 0
ind <= 0;
start_dds;
wait_on_dds;
wait_on_sig(dds_done);
wait_on_idle;
-- MEM: I1S1, I1S2
-- ISTATE: I1:ALIVE
-- WRITER: W33:I1
cc := DEFAULT_CACHE_CHANGE;
cc.serialized_key := TRUE;
cc.kind := NOT_ALIVE_UNREGISTERED;
cc.instance := kh1;
cc.payload := gen_payload(kh1,5);
cc.src_timestamp := gen_duration(3 sec);
Log("R0: RTPS Operation ADD_CACHE_CHANGE [UNREGISTER, Instance 1, Writer 32]", INFO);
Log("R0: ACCEPTED", DEBUG);
rtps := DEFAULT_RTPS_READER_TEST;
rtps.opcode := ADD_CACHE_CHANGE;
rtps.cc := cc;
rtps.writer_pos := 32;
rtps.ret_code := OK;
s := to_sample(cc,NOT_ALIVE_NO_WRITERS_INSTANCE_STATE);
add_sample(s,mem(0), BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS);
-- READER 0
ind <= 0;
start_rtps;
wait_on_sig(rtps_done);
wait_on_idle;
-- MEM: I1S1, I1S2, I1S3-
-- ISTATE: I1:NO_WRITERS
-- WRITER: -
Log("R0: DDS Operation READ [MAX_SAMPLES 4, ANY_SAMPLE_STATE, NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, ANY_VIEW_STATE]", INFO);
dds := DEFAULT_DDS_READER_TEST;
dds.opcode := READ;
dds.max_samples := 4;
dds.sstate := ANY_SAMPLE_STATE;
dds.istate := NOT_ALIVE_NO_WRITERS_INSTANCE_STATE;
dds.vstate := ANY_VIEW_STATE;
dds.ret_code := RETCODE_OK;
-- READER 0
ind <= 0;
start_dds;
wait_on_sig(dds_done);
wait_on_idle;
-- MEM: I1S1, I1S2, I1S3-
-- ISTATE: I1:NO_WRITERS
-- WRITER: -
wait_on_completion;
TranscriptOpen(RESULTS_FILE, APPEND_MODE);
@ -418,13 +421,6 @@ begin
wait for 25 ns;
end process;
alert_prc : process(all)
begin
if rising_edge(clk) then
-- TODO
end if;
end process;
dds_prc : process(all)
variable col : COLLECTION_TYPE := DEFAULT_COLLECTION;
begin
@ -438,16 +434,16 @@ begin
dds_done <= '1';
end if;
when START =>
if (ack_dds = '1') then
if (ack_dds(ind) = '1') then
dds_stage <= DONE;
dds_cnt <= 0;
end if;
when DONE =>
if (done_dds = '1') then
AffirmIfEqual(ret_id, return_code_dds, dds.ret_code);
if (done_dds(ind) = '1') then
AffirmIfEqual(ret_id, return_code_dds(ind), dds.ret_code);
case (dds.ret_code) is
when RETCODE_OK =>
gen_collection(mem, col, dds, INSTANCE_PRESENTATION_QOS, FALSE);
gen_collection(mem(ind), col, dds, TEST_CONFIG(ind).PRESENTATION_QOS, TEST_CONFIG(ind).ORDERED_ACCESS);
dds_stage <= CHECK_SI;
dds_cnt <= 0;
when others =>
@ -455,19 +451,19 @@ begin
end case;
end if;
when CHECK_SI =>
if (si_valid = '1') then
AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate);
AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate);
AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate);
AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts));
AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst));
AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL));
AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(no_w_gen_cnt_id, si_no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(srank_id, si_sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH)));
AffirmIfEqual(grank_id, si_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH)));
AffirmIfEqual(agrank_id, si_absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH)));
if (si_valid_data = '1') then
if (si_valid(ind) = '1') then
AffirmIfEqual(sstate_id, sample_info(ind).sample_state, col.s(dds_cnt).sstate);
AffirmIfEqual(vstate_id, sample_info(ind).view_state, col.s(dds_cnt).vstate);
AffirmIfEqual(istate_id, sample_info(ind).instance_state, col.s(dds_cnt).istate);
AffirmIfEqual(ts_id, to_unsigned(sample_info(ind).source_timestamp), to_unsigned(col.s(dds_cnt).ts));
AffirmIfEqual(inst_id, to_unsigned(sample_info(ind).instance_handle), to_unsigned(col.s(dds_cnt).inst));
AffirmIfEqual(pub_id, to_unsigned(sample_info(ind).publication_handle), to_unsigned(HANDLE_NIL));
AffirmIfEqual(dis_gen_cnt_id, sample_info(ind).disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(no_w_gen_cnt_id, sample_info(ind).no_writers_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).no_w_gen_cnt,WORD_WIDTH)));
AffirmIfEqual(srank_id, sample_info(ind).sample_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).srank,WORD_WIDTH)));
AffirmIfEqual(grank_id, sample_info(ind).generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).grank,WORD_WIDTH)));
AffirmIfEqual(agrank_id, sample_info(ind).absolute_generation_rank, std_logic_vector(to_unsigned(col.s(dds_cnt).agrank,WORD_WIDTH)));
if (sample_info(ind).valid_data = '1') then
AffirmIf(valid_id, col.s(dds_cnt).data /= EMPTY_TEST_PACKET, "Sample with Data not expected");
dds_stage <= CHECK_DATA;
dds_cnt2 <= 0;
@ -481,13 +477,13 @@ begin
end if;
end if;
end if;
AffirmIf(eoc_id, eoc = '0', "EOC pulled high");
AffirmIf(eoc_id, eoc(ind) = '0', "EOC pulled high");
when CHECK_DATA =>
if (valid_out_dds = '1') then
AffirmIfEqual(data_id, data_out_dds, col.s(dds_cnt).data.data(dds_cnt2));
if (valid_out_dds(ind) = '1') then
AffirmIfEqual(data_id, data_out_dds(ind), col.s(dds_cnt).data.data(dds_cnt2));
dds_cnt2 <= dds_cnt2 + 1;
if (dds_cnt2 = col.s(dds_cnt).data.length-1) then
AlertIf(data_id, last_word_out_dds /= '1', "Last Word Signal not pulled High", ERROR);
AlertIf(data_id, last_word_out_dds(ind) /= '1', "Last Word Signal not pulled High", ERROR);
if (dds_cnt = col.len-1) then
-- DONE
dds_stage <= WAIT_EOC;
@ -498,39 +494,39 @@ begin
end if;
end if;
when WAIT_EOC =>
if (eoc = '1') then
if (eoc(ind) = '1') then
dds_stage <= IDLE;
end if;
end case;
end if;
-- DEFAULT
start_dds <= '0';
opcode_dds <= NOP;
instance_state_dds <= ANY_INSTANCE_STATE;
view_state_dds <= ANY_VIEW_STATE;
sample_state_dds <= ANY_SAMPLE_STATE;
instance_handle_dds <= HANDLE_NIL;
max_samples_dds <= (others => '0');
get_data_dds <= '0';
ready_out_dds <= '0';
start_dds <= (others => '0');
opcode_dds <= (others => NOP);
instance_state_dds <= (others => ANY_INSTANCE_STATE);
view_state_dds <= (others => ANY_VIEW_STATE);
sample_state_dds <= (others => ANY_SAMPLE_STATE);
instance_handle_dds <= (others => HANDLE_NIL);
max_samples_dds <= (others => (others => '0'));
get_data_dds <= (others => '0');
ready_out_dds <= (others => '0');
case (dds_stage ) is
when START =>
start_dds <= '1';
opcode_dds <= dds.opcode;
instance_state_dds <= dds.istate;
view_state_dds <= dds.vstate;
sample_state_dds <= dds.sstate;
instance_handle_dds <= dds.inst;
max_samples_dds <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH));
start_dds(ind) <= '1';
opcode_dds(ind) <= dds.opcode;
instance_state_dds(ind) <= dds.istate;
view_state_dds(ind) <= dds.vstate;
sample_state_dds(ind) <= dds.sstate;
instance_handle_dds(ind) <= dds.inst;
max_samples_dds(ind) <= std_logic_vector(to_unsigned(dds.max_samples, WORD_WIDTH));
when CHECK_SI =>
if (si_valid = '1' and si_valid_data = '1') then
get_data_dds <= '1';
if (si_valid(ind) = '1' and sample_info(ind).valid_data = '1') then
get_data_dds(ind) <= '1';
end if;
when CHECK_DATA =>
ready_out_dds <= '1';
ready_out_dds(ind) <= '1';
when others =>
null;
end case;
@ -549,7 +545,7 @@ begin
rtps_done <= '1';
end if;
when START =>
if (ack_rtps = '1') then
if (ack_rtps(ind) = '1') then
case (rtps.opcode) is
when ADD_CACHE_CHANGE =>
gen_add_cache_change_dds(rtps.cc, rtps.lifespan, rtps.writer_pos, stimulus);
@ -559,41 +555,41 @@ begin
end case;
end if;
when PUSH =>
if (ready_in_rtps = '1') then
if (ready_in_rtps(ind) = '1') then
rtps_cnt <= rtps_cnt + 1;
if (rtps_cnt = stimulus.length-1) then
rtps_stage <= DONE;
end if;
end if;
when DONE =>
if (done_rtps = '1') then
AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code));
if (done_rtps(ind) = '1') then
AffirmIfEqual(ret_id, HISTORY_CACHE_RESPONSE_TYPE'pos(ret_rtps(ind)), HISTORY_CACHE_RESPONSE_TYPE'pos(rtps.ret_code));
rtps_stage <= IDLE;
end if;
end case;
end if;
-- DEFAULT
start_rtps <= '0';
opcode_rtps <= NOP;
valid_in_rtps <= '0';
last_word_in_rtps <= '0';
data_in_rtps <= (others => '0');
start_rtps <= (others => '0');
opcode_rtps <= (others => NOP);
valid_in_rtps <= (others => '0');
last_word_in_rtps <= (others => '0');
data_in_rtps <= (others => (others => '0'));
case (rtps_stage) is
when START =>
start_rtps <= '1';
opcode_rtps <= rtps.opcode;
start_rtps(ind) <= '1';
opcode_rtps(ind) <= rtps.opcode;
case (rtps.opcode) is
when REMOVE_WRITER =>
data_in_rtps <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH));
data_in_rtps(ind) <= std_logic_vector(to_unsigned(rtps.writer_pos,WORD_WIDTH));
when others =>
null;
end case;
when PUSH =>
valid_in_rtps <= '1';
data_in_rtps <= stimulus.data(rtps_cnt);
last_word_in_rtps <= stimulus.last(rtps_cnt);
valid_in_rtps(ind) <= '1';
data_in_rtps(ind) <= stimulus.data(rtps_cnt);
last_word_in_rtps(ind) <= stimulus.last(rtps_cnt);
when others =>
null;
end case;

View File

@ -417,22 +417,11 @@ begin
status => status_dw_wi(0 to NUM_WRITERS-1)
);
end generate;
dds_endpoint_gen : for i in 0 to NUM_READERS-1 generate
dds_endpoint_r_if : if (NUM_READERS > 0) generate
dds_reader_inst : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => ENDPOINT_CONFIG(i).TIME_BASED_FILTER_QOS,
DEADLINE_QOS => ENDPOINT_CONFIG(i).DEADLINE_QOS,
MAX_INSTANCES => ENDPOINT_CONFIG(i).MAX_INSTANCES,
MAX_SAMPLES_PER_INSTANCE => ENDPOINT_CONFIG(i).MAX_SAMPLES_PER_INSTANCE,
MAX_SAMPLES => ENDPOINT_CONFIG(i).MAX_SAMPLES,
HISTORY_QOS => ENDPOINT_CONFIG(i).HISTORY_QOS,
RELIABILITY_QOS => ENDPOINT_CONFIG(i).RELIABILITY_QOS,
PRESENTATION_QOS => ENDPOINT_CONFIG(i).PRESENTATION_QOS,
DESTINATION_ORDER_QOS => ENDPOINT_CONFIG(i).DESTINATION_ORDER_QOS,
COHERENT_ACCESS => ENDPOINT_CONFIG(i).COHERENT_ACCESS,
ORDERED_ACCESS => ENDPOINT_CONFIG(i).ORDERED_ACCESS,
WITH_KEY => ENDPOINT_CONFIG(i).WITH_KEY,
PAYLOAD_FRAME_SIZE => ENDPOINT_CONFIG(i).MAX_PAYLOAD_SIZE,
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(ENDPOINT_CONFIG(0 to NUM_READERS-1)),
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
@ -441,37 +430,37 @@ begin
reset => reset,
time => time,
-- FROM RTPS ENDPOINT
start_rtps => start_rr_dr(i),
opcode_rtps => opcode_rr_dr(i),
ack_rtps => ack_dr_rr(i),
done_rtps => done_dr_rr(i),
ret_rtps => ret_dr_rr(i),
valid_in_rtps => valid_rr_dr(i),
ready_in_rtps => ready_dr_rr(i),
data_in_rtps => data_rr_dr(i),
last_word_in_rtps => last_word_rr_dr(i),
start_rtps => start_rr_dr(0 to NUM_READERS-1),
opcode_rtps => opcode_rr_dr(0 to NUM_READERS-1),
ack_rtps => ack_dr_rr(0 to NUM_READERS-1),
done_rtps => done_dr_rr(0 to NUM_READERS-1),
ret_rtps => ret_dr_rr(0 to NUM_READERS-1),
valid_in_rtps => valid_rr_dr(0 to NUM_READERS-1),
ready_in_rtps => ready_dr_rr(0 to NUM_READERS-1),
data_in_rtps => data_rr_dr(0 to NUM_READERS-1),
last_word_in_rtps => last_word_rr_dr(0 to NUM_READERS-1),
-- TO USER ENTITY
start_dds => start_ri_dr(i),
ack_dds => ack_dr_ri(i),
opcode_dds => opcode_ri_dr(i),
instance_state_dds => instance_state_ri_dr(i),
view_state_dds => view_state_ri_dr(i),
sample_state_dds => sample_state_ri_dr(i),
instance_handle_dds => instance_handle_ri_dr(i),
max_samples_dds => max_samples_ri_dr(i),
get_data_dds => get_data_ri_dr(i),
done_dds => done_dr_ri(i),
return_code_dds => return_code_dr_ri(i),
valid_out_dds => valid_dr_ri(i),
ready_out_dds => ready_ri_dr(i),
data_out_dds => data_dr_ri(i),
last_word_out_dds => last_word_dr_ri(i),
sample_info => sample_info_dr_ri(i),
sample_info_valid => sample_info_valid_dr_ri(i),
sample_info_ack => sample_info_ack_ri_dr(i),
eoc => eoc_dr_ri(i),
start_dds => start_ri_dr(0 to NUM_READERS-1),
ack_dds => ack_dr_ri(0 to NUM_READERS-1),
opcode_dds => opcode_ri_dr(0 to NUM_READERS-1),
instance_state_dds => instance_state_ri_dr(0 to NUM_READERS-1),
view_state_dds => view_state_ri_dr(0 to NUM_READERS-1),
sample_state_dds => sample_state_ri_dr(0 to NUM_READERS-1),
instance_handle_dds => instance_handle_ri_dr(0 to NUM_READERS-1),
max_samples_dds => max_samples_ri_dr(0 to NUM_READERS-1),
get_data_dds => get_data_ri_dr(0 to NUM_READERS-1),
done_dds => done_dr_ri(0 to NUM_READERS-1),
return_code_dds => return_code_dr_ri(0 to NUM_READERS-1),
valid_out_dds => valid_dr_ri(0 to NUM_READERS-1),
ready_out_dds => ready_ri_dr(0 to NUM_READERS-1),
data_out_dds => data_dr_ri(0 to NUM_READERS-1),
last_word_out_dds => last_word_dr_ri(0 to NUM_READERS-1),
sample_info => sample_info_dr_ri(0 to NUM_READERS-1),
sample_info_valid => sample_info_valid_dr_ri(0 to NUM_READERS-1),
sample_info_ack => sample_info_ack_ri_dr(0 to NUM_READERS-1),
eoc => eoc_dr_ri(0 to NUM_READERS-1),
-- Communication Status
status => status_dr_ri(i)
status => status_dr_ri(0 to NUM_READERS-1)
);
end generate;

View File

@ -424,22 +424,11 @@ begin
status => status_dw_wi(0 to NUM_WRITERS-1)
);
end generate;
dds_endpoint_gen : for i in 0 to NUM_READERS-1 generate
dds_endpoint_r_if : if (NUM_READERS > 0) generate
dds_reader_inst : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => ENDPOINT_CONFIG(i).TIME_BASED_FILTER_QOS,
DEADLINE_QOS => ENDPOINT_CONFIG(i).DEADLINE_QOS,
MAX_INSTANCES => ENDPOINT_CONFIG(i).MAX_INSTANCES,
MAX_SAMPLES_PER_INSTANCE => ENDPOINT_CONFIG(i).MAX_SAMPLES_PER_INSTANCE,
MAX_SAMPLES => ENDPOINT_CONFIG(i).MAX_SAMPLES,
HISTORY_QOS => ENDPOINT_CONFIG(i).HISTORY_QOS,
RELIABILITY_QOS => ENDPOINT_CONFIG(i).RELIABILITY_QOS,
PRESENTATION_QOS => ENDPOINT_CONFIG(i).PRESENTATION_QOS,
DESTINATION_ORDER_QOS => ENDPOINT_CONFIG(i).DESTINATION_ORDER_QOS,
COHERENT_ACCESS => ENDPOINT_CONFIG(i).COHERENT_ACCESS,
ORDERED_ACCESS => ENDPOINT_CONFIG(i).ORDERED_ACCESS,
WITH_KEY => ENDPOINT_CONFIG(i).WITH_KEY,
PAYLOAD_FRAME_SIZE => ENDPOINT_CONFIG(i).MAX_PAYLOAD_SIZE,
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(ENDPOINT_CONFIG(0 to NUM_READERS-1)),
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
@ -448,37 +437,37 @@ begin
reset => reset,
time => time,
-- FROM RTPS ENDPOINT
start_rtps => start_rr_dr(i),
opcode_rtps => opcode_rr_dr(i),
ack_rtps => ack_dr_rr(i),
done_rtps => done_dr_rr(i),
ret_rtps => ret_dr_rr(i),
valid_in_rtps => valid_rr_dr(i),
ready_in_rtps => ready_dr_rr(i),
data_in_rtps => data_rr_dr(i),
last_word_in_rtps => last_word_rr_dr(i),
start_rtps => start_rr_dr(0 to NUM_READERS-1),
opcode_rtps => opcode_rr_dr(0 to NUM_READERS-1),
ack_rtps => ack_dr_rr(0 to NUM_READERS-1),
done_rtps => done_dr_rr(0 to NUM_READERS-1),
ret_rtps => ret_dr_rr(0 to NUM_READERS-1),
valid_in_rtps => valid_rr_dr(0 to NUM_READERS-1),
ready_in_rtps => ready_dr_rr(0 to NUM_READERS-1),
data_in_rtps => data_rr_dr(0 to NUM_READERS-1),
last_word_in_rtps => last_word_rr_dr(0 to NUM_READERS-1),
-- TO USER ENTITY
start_dds => start_ri_dr(i),
ack_dds => ack_dr_ri(i),
opcode_dds => opcode_ri_dr(i),
instance_state_dds => instance_state_ri_dr(i),
view_state_dds => view_state_ri_dr(i),
sample_state_dds => sample_state_ri_dr(i),
instance_handle_dds => instance_handle_ri_dr(i),
max_samples_dds => max_samples_ri_dr(i),
get_data_dds => get_data_ri_dr(i),
done_dds => done_dr_ri(i),
return_code_dds => return_code_dr_ri(i),
valid_out_dds => valid_dr_ri(i),
ready_out_dds => ready_ri_dr(i),
data_out_dds => data_dr_ri(i),
last_word_out_dds => last_word_dr_ri(i),
sample_info => sample_info_dr_ri(i),
sample_info_valid => sample_info_valid_dr_ri(i),
sample_info_ack => sample_info_ack_ri_dr(i),
eoc => eoc_dr_ri(i),
start_dds => start_ri_dr(0 to NUM_READERS-1),
ack_dds => ack_dr_ri(0 to NUM_READERS-1),
opcode_dds => opcode_ri_dr(0 to NUM_READERS-1),
instance_state_dds => instance_state_ri_dr(0 to NUM_READERS-1),
view_state_dds => view_state_ri_dr(0 to NUM_READERS-1),
sample_state_dds => sample_state_ri_dr(0 to NUM_READERS-1),
instance_handle_dds => instance_handle_ri_dr(0 to NUM_READERS-1),
max_samples_dds => max_samples_ri_dr(0 to NUM_READERS-1),
get_data_dds => get_data_ri_dr(0 to NUM_READERS-1),
done_dds => done_dr_ri(0 to NUM_READERS-1),
return_code_dds => return_code_dr_ri(0 to NUM_READERS-1),
valid_out_dds => valid_dr_ri(0 to NUM_READERS-1),
ready_out_dds => ready_ri_dr(0 to NUM_READERS-1),
data_out_dds => data_dr_ri(0 to NUM_READERS-1),
last_word_out_dds => last_word_dr_ri(0 to NUM_READERS-1),
sample_info => sample_info_dr_ri(0 to NUM_READERS-1),
sample_info_valid => sample_info_valid_dr_ri(0 to NUM_READERS-1),
sample_info_ack => sample_info_ack_ri_dr(0 to NUM_READERS-1),
eoc => eoc_dr_ri(0 to NUM_READERS-1),
-- Communication Status
status => status_dr_ri(i)
status => status_dr_ri(0 to NUM_READERS-1)
);
end generate;

View File

@ -420,22 +420,11 @@ begin
status => status_dw_wi(0 to NUM_WRITERS-1)
);
end generate;
dds_endpoint_gen : for i in 0 to NUM_READERS-1 generate
dds_endpoint_r_if : if (NUM_READERS > 0) generate
dds_reader_inst : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => ENDPOINT_CONFIG(i).TIME_BASED_FILTER_QOS,
DEADLINE_QOS => ENDPOINT_CONFIG(i).DEADLINE_QOS,
MAX_INSTANCES => ENDPOINT_CONFIG(i).MAX_INSTANCES,
MAX_SAMPLES_PER_INSTANCE => ENDPOINT_CONFIG(i).MAX_SAMPLES_PER_INSTANCE,
MAX_SAMPLES => ENDPOINT_CONFIG(i).MAX_SAMPLES,
HISTORY_QOS => ENDPOINT_CONFIG(i).HISTORY_QOS,
RELIABILITY_QOS => ENDPOINT_CONFIG(i).RELIABILITY_QOS,
PRESENTATION_QOS => ENDPOINT_CONFIG(i).PRESENTATION_QOS,
DESTINATION_ORDER_QOS => ENDPOINT_CONFIG(i).DESTINATION_ORDER_QOS,
COHERENT_ACCESS => ENDPOINT_CONFIG(i).COHERENT_ACCESS,
ORDERED_ACCESS => ENDPOINT_CONFIG(i).ORDERED_ACCESS,
WITH_KEY => ENDPOINT_CONFIG(i).WITH_KEY,
PAYLOAD_FRAME_SIZE => ENDPOINT_CONFIG(i).MAX_PAYLOAD_SIZE,
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(ENDPOINT_CONFIG(0 to NUM_READERS-1)),
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
@ -444,37 +433,37 @@ begin
reset => reset,
time => time,
-- FROM RTPS ENDPOINT
start_rtps => start_rr_dr(i),
opcode_rtps => opcode_rr_dr(i),
ack_rtps => ack_dr_rr(i),
done_rtps => done_dr_rr(i),
ret_rtps => ret_dr_rr(i),
valid_in_rtps => valid_rr_dr(i),
ready_in_rtps => ready_dr_rr(i),
data_in_rtps => data_rr_dr(i),
last_word_in_rtps => last_word_rr_dr(i),
start_rtps => start_rr_dr(0 to NUM_READERS-1),
opcode_rtps => opcode_rr_dr(0 to NUM_READERS-1),
ack_rtps => ack_dr_rr(0 to NUM_READERS-1),
done_rtps => done_dr_rr(0 to NUM_READERS-1),
ret_rtps => ret_dr_rr(0 to NUM_READERS-1),
valid_in_rtps => valid_rr_dr(0 to NUM_READERS-1),
ready_in_rtps => ready_dr_rr(0 to NUM_READERS-1),
data_in_rtps => data_rr_dr(0 to NUM_READERS-1),
last_word_in_rtps => last_word_rr_dr(0 to NUM_READERS-1),
-- TO USER ENTITY
start_dds => start_ri_dr(i),
ack_dds => ack_dr_ri(i),
opcode_dds => opcode_ri_dr(i),
instance_state_dds => instance_state_ri_dr(i),
view_state_dds => view_state_ri_dr(i),
sample_state_dds => sample_state_ri_dr(i),
instance_handle_dds => instance_handle_ri_dr(i),
max_samples_dds => max_samples_ri_dr(i),
get_data_dds => get_data_ri_dr(i),
done_dds => done_dr_ri(i),
return_code_dds => return_code_dr_ri(i),
valid_out_dds => valid_dr_ri(i),
ready_out_dds => ready_ri_dr(i),
data_out_dds => data_dr_ri(i),
last_word_out_dds => last_word_dr_ri(i),
sample_info => sample_info_dr_ri(i),
sample_info_valid => sample_info_valid_dr_ri(i),
sample_info_ack => sample_info_ack_ri_dr(i),
eoc => eoc_dr_ri(i),
start_dds => start_ri_dr(0 to NUM_READERS-1),
ack_dds => ack_dr_ri(0 to NUM_READERS-1),
opcode_dds => opcode_ri_dr(0 to NUM_READERS-1),
instance_state_dds => instance_state_ri_dr(0 to NUM_READERS-1),
view_state_dds => view_state_ri_dr(0 to NUM_READERS-1),
sample_state_dds => sample_state_ri_dr(0 to NUM_READERS-1),
instance_handle_dds => instance_handle_ri_dr(0 to NUM_READERS-1),
max_samples_dds => max_samples_ri_dr(0 to NUM_READERS-1),
get_data_dds => get_data_ri_dr(0 to NUM_READERS-1),
done_dds => done_dr_ri(0 to NUM_READERS-1),
return_code_dds => return_code_dr_ri(0 to NUM_READERS-1),
valid_out_dds => valid_dr_ri(0 to NUM_READERS-1),
ready_out_dds => ready_ri_dr(0 to NUM_READERS-1),
data_out_dds => data_dr_ri(0 to NUM_READERS-1),
last_word_out_dds => last_word_dr_ri(0 to NUM_READERS-1),
sample_info => sample_info_dr_ri(0 to NUM_READERS-1),
sample_info_valid => sample_info_valid_dr_ri(0 to NUM_READERS-1),
sample_info_ack => sample_info_ack_ri_dr(0 to NUM_READERS-1),
eoc => eoc_dr_ri(0 to NUM_READERS-1),
-- Communication Status
status => status_dr_ri(i)
status => status_dr_ri(0 to NUM_READERS-1)
);
end generate;

View File

@ -435,22 +435,11 @@ begin
status => status_dw_wi(0 to NUM_WRITERS-1)
);
end generate;
dds_endpoint_gen : for i in 0 to NUM_READERS-1 generate
dds_endpoint_r_if : if (NUM_READERS > 0) generate
dds_reader_inst : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => ENDPOINT_CONFIG(i).TIME_BASED_FILTER_QOS,
DEADLINE_QOS => ENDPOINT_CONFIG(i).DEADLINE_QOS,
MAX_INSTANCES => ENDPOINT_CONFIG(i).MAX_INSTANCES,
MAX_SAMPLES_PER_INSTANCE => ENDPOINT_CONFIG(i).MAX_SAMPLES_PER_INSTANCE,
MAX_SAMPLES => ENDPOINT_CONFIG(i).MAX_SAMPLES,
HISTORY_QOS => ENDPOINT_CONFIG(i).HISTORY_QOS,
RELIABILITY_QOS => ENDPOINT_CONFIG(i).RELIABILITY_QOS,
PRESENTATION_QOS => ENDPOINT_CONFIG(i).PRESENTATION_QOS,
DESTINATION_ORDER_QOS => ENDPOINT_CONFIG(i).DESTINATION_ORDER_QOS,
COHERENT_ACCESS => ENDPOINT_CONFIG(i).COHERENT_ACCESS,
ORDERED_ACCESS => ENDPOINT_CONFIG(i).ORDERED_ACCESS,
WITH_KEY => ENDPOINT_CONFIG(i).WITH_KEY,
PAYLOAD_FRAME_SIZE => ENDPOINT_CONFIG(i).MAX_PAYLOAD_SIZE,
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(ENDPOINT_CONFIG(0 to NUM_READERS-1)),
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
@ -459,37 +448,37 @@ begin
reset => reset,
time => time,
-- FROM RTPS ENDPOINT
start_rtps => start_rr_dr(i),
opcode_rtps => opcode_rr_dr(i),
ack_rtps => ack_dr_rr(i),
done_rtps => done_dr_rr(i),
ret_rtps => ret_dr_rr(i),
valid_in_rtps => valid_rr_dr(i),
ready_in_rtps => ready_dr_rr(i),
data_in_rtps => data_rr_dr(i),
last_word_in_rtps => last_word_rr_dr(i),
start_rtps => start_rr_dr(0 to NUM_READERS-1),
opcode_rtps => opcode_rr_dr(0 to NUM_READERS-1),
ack_rtps => ack_dr_rr(0 to NUM_READERS-1),
done_rtps => done_dr_rr(0 to NUM_READERS-1),
ret_rtps => ret_dr_rr(0 to NUM_READERS-1),
valid_in_rtps => valid_rr_dr(0 to NUM_READERS-1),
ready_in_rtps => ready_dr_rr(0 to NUM_READERS-1),
data_in_rtps => data_rr_dr(0 to NUM_READERS-1),
last_word_in_rtps => last_word_rr_dr(0 to NUM_READERS-1),
-- TO USER ENTITY
start_dds => start_ri_dr(i),
ack_dds => ack_dr_ri(i),
opcode_dds => opcode_ri_dr(i),
instance_state_dds => instance_state_ri_dr(i),
view_state_dds => view_state_ri_dr(i),
sample_state_dds => sample_state_ri_dr(i),
instance_handle_dds => instance_handle_ri_dr(i),
max_samples_dds => max_samples_ri_dr(i),
get_data_dds => get_data_ri_dr(i),
done_dds => done_dr_ri(i),
return_code_dds => return_code_dr_ri(i),
valid_out_dds => valid_dr_ri(i),
ready_out_dds => ready_ri_dr(i),
data_out_dds => data_dr_ri(i),
last_word_out_dds => last_word_dr_ri(i),
sample_info => sample_info_dr_ri(i),
sample_info_valid => sample_info_valid_dr_ri(i),
sample_info_ack => sample_info_ack_ri_dr(i),
eoc => eoc_dr_ri(i),
start_dds => start_ri_dr(0 to NUM_READERS-1),
ack_dds => ack_dr_ri(0 to NUM_READERS-1),
opcode_dds => opcode_ri_dr(0 to NUM_READERS-1),
instance_state_dds => instance_state_ri_dr(0 to NUM_READERS-1),
view_state_dds => view_state_ri_dr(0 to NUM_READERS-1),
sample_state_dds => sample_state_ri_dr(0 to NUM_READERS-1),
instance_handle_dds => instance_handle_ri_dr(0 to NUM_READERS-1),
max_samples_dds => max_samples_ri_dr(0 to NUM_READERS-1),
get_data_dds => get_data_ri_dr(0 to NUM_READERS-1),
done_dds => done_dr_ri(0 to NUM_READERS-1),
return_code_dds => return_code_dr_ri(0 to NUM_READERS-1),
valid_out_dds => valid_dr_ri(0 to NUM_READERS-1),
ready_out_dds => ready_ri_dr(0 to NUM_READERS-1),
data_out_dds => data_dr_ri(0 to NUM_READERS-1),
last_word_out_dds => last_word_dr_ri(0 to NUM_READERS-1),
sample_info => sample_info_dr_ri(0 to NUM_READERS-1),
sample_info_valid => sample_info_valid_dr_ri(0 to NUM_READERS-1),
sample_info_ack => sample_info_ack_ri_dr(0 to NUM_READERS-1),
eoc => eoc_dr_ri(0 to NUM_READERS-1),
-- Communication Status
status => status_dr_ri(i)
status => status_dr_ri(0 to NUM_READERS-1)
);
end generate;

View File

@ -209,24 +209,13 @@ analyze Level_0/L0_dds_writer_test2.vhd
analyze Level_0/L0_dds_writer_test3.vhd
analyze Level_0/L0_dds_writer_test4.vhd
analyze Level_0/L0_dds_writer_test5.vhd
analyze Level_0/L0_dds_reader_test1_arzkriu.vhd
analyze Level_0/L0_dds_reader_test1_lrzkriu.vhd
analyze Level_0/L0_dds_reader_test1_lbzkriu.vhd
analyze Level_0/L0_dds_reader_test1_abzkriu.vhd
analyze Level_0/L0_dds_reader_test1_arznriu.vhd
analyze Level_0/L0_dds_reader_test1_arzksiu.vhd
analyze Level_0/L0_dds_reader_test2_arpkriu.vhd
analyze Level_0/L0_dds_reader_test3_arzkriu.vhd
analyze Level_0/L0_dds_reader_test3_arzkrio.vhd
analyze Level_0/L0_dds_reader_test3_arzkrtu.vhd
analyze Level_0/L0_dds_reader_test3_arzkrto.vhd
analyze Level_0/L0_dds_reader_test3_arznriu.vhd
analyze Level_0/L0_dds_reader_test3_arzksto.vhd
analyze Level_0/L0_dds_reader_test4_arzkriu.vhd
analyze Level_0/L0_dds_reader_test4_arznriu.vhd
analyze Level_0/L0_dds_reader_test5_arzkriu.vhd
analyze Level_0/L0_dds_reader_test6_arzkriu.vhd
analyze Level_0/L0_dds_reader_test7_arzkriu.vhd
analyze Level_0/L0_dds_reader_test1.vhd
analyze Level_0/L0_dds_reader_test2.vhd
analyze Level_0/L0_dds_reader_test3.vhd
analyze Level_0/L0_dds_reader_test4.vhd
analyze Level_0/L0_dds_reader_test5.vhd
analyze Level_0/L0_dds_reader_test6.vhd
analyze Level_0/L0_dds_reader_test7.vhd
analyze Level_1/L1_Type1_interface_test1.vhd
analyze Level_1/L1_Type1_interface_test2.vhd
analyze Level_1/L1_Type1_key_holder_test1.vhd
@ -266,24 +255,13 @@ simulate L0_dds_writer_test2
simulate L0_dds_writer_test3
simulate L0_dds_writer_test4
simulate L0_dds_writer_test5
simulate L0_dds_reader_test1_arzkriu
simulate L0_dds_reader_test1_lrzkriu
simulate L0_dds_reader_test1_lbzkriu
simulate L0_dds_reader_test1_abzkriu
simulate L0_dds_reader_test1_arznriu
simulate L0_dds_reader_test1_arzksiu
simulate L0_dds_reader_test2_arpkriu
simulate L0_dds_reader_test3_arzkriu
simulate L0_dds_reader_test3_arzkrio
simulate L0_dds_reader_test3_arzkrtu
simulate L0_dds_reader_test3_arzkrto
simulate L0_dds_reader_test3_arznriu
simulate L0_dds_reader_test3_arzksto
simulate L0_dds_reader_test4_arzkriu
simulate L0_dds_reader_test4_arznriu
simulate L0_dds_reader_test5_arzkriu
simulate L0_dds_reader_test6_arzkriu
simulate L0_dds_reader_test7_arzkriu
simulate L0_dds_reader_test1
simulate L0_dds_reader_test2
simulate L0_dds_reader_test3
simulate L0_dds_reader_test4
simulate L0_dds_reader_test5
simulate L0_dds_reader_test6
simulate L0_dds_reader_test7
simulate L1_Type1_interface_test1
simulate L1_Type1_interface_test2
simulate L1_Type1_key_holder_test1

File diff suppressed because it is too large Load Diff

View File

@ -410,22 +410,11 @@ begin
status => status_dw_wi(0 to NUM_WRITERS-2)
);
end generate;
dds_endpoint_gen : for i in 0 to NUM_READERS-1 generate
dds_endpoint_r_if : if (NUM_READERS > 0) generate
dds_reader_inst : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => ENDPOINT_CONFIG(i).TIME_BASED_FILTER_QOS,
DEADLINE_QOS => ENDPOINT_CONFIG(i).DEADLINE_QOS,
MAX_INSTANCES => ENDPOINT_CONFIG(i).MAX_INSTANCES,
MAX_SAMPLES_PER_INSTANCE => ENDPOINT_CONFIG(i).MAX_SAMPLES_PER_INSTANCE,
MAX_SAMPLES => ENDPOINT_CONFIG(i).MAX_SAMPLES,
HISTORY_QOS => ENDPOINT_CONFIG(i).HISTORY_QOS,
RELIABILITY_QOS => ENDPOINT_CONFIG(i).RELIABILITY_QOS,
PRESENTATION_QOS => ENDPOINT_CONFIG(i).PRESENTATION_QOS,
DESTINATION_ORDER_QOS => ENDPOINT_CONFIG(i).DESTINATION_ORDER_QOS,
COHERENT_ACCESS => ENDPOINT_CONFIG(i).COHERENT_ACCESS,
ORDERED_ACCESS => ENDPOINT_CONFIG(i).ORDERED_ACCESS,
WITH_KEY => ENDPOINT_CONFIG(i).WITH_KEY,
PAYLOAD_FRAME_SIZE => ENDPOINT_CONFIG(i).MAX_PAYLOAD_SIZE,
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(ENDPOINT_CONFIG(0 to NUM_READERS-1)),
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
@ -434,37 +423,37 @@ begin
reset => reset,
time => time,
-- FROM RTPS ENDPOINT
start_rtps => start_rr_dr(i),
opcode_rtps => opcode_rr_dr(i),
ack_rtps => ack_dr_rr(i),
done_rtps => done_dr_rr(i),
ret_rtps => ret_dr_rr(i),
valid_in_rtps => valid_rr_dr(i),
ready_in_rtps => ready_dr_rr(i),
data_in_rtps => data_rr_dr(i),
last_word_in_rtps => last_word_rr_dr(i),
start_rtps => start_rr_dr(0 to NUM_READERS-1),
opcode_rtps => opcode_rr_dr(0 to NUM_READERS-1),
ack_rtps => ack_dr_rr(0 to NUM_READERS-1),
done_rtps => done_dr_rr(0 to NUM_READERS-1),
ret_rtps => ret_dr_rr(0 to NUM_READERS-1),
valid_in_rtps => valid_rr_dr(0 to NUM_READERS-1),
ready_in_rtps => ready_dr_rr(0 to NUM_READERS-1),
data_in_rtps => data_rr_dr(0 to NUM_READERS-1),
last_word_in_rtps => last_word_rr_dr(0 to NUM_READERS-1),
-- TO USER ENTITY
start_dds => start_ri_dr(i),
ack_dds => ack_dr_ri(i),
opcode_dds => opcode_ri_dr(i),
instance_state_dds => instance_state_ri_dr(i),
view_state_dds => view_state_ri_dr(i),
sample_state_dds => sample_state_ri_dr(i),
instance_handle_dds => instance_handle_ri_dr(i),
max_samples_dds => max_samples_ri_dr(i),
get_data_dds => get_data_ri_dr(i),
done_dds => done_dr_ri(i),
return_code_dds => return_code_dr_ri(i),
valid_out_dds => valid_dr_ri(i),
ready_out_dds => ready_ri_dr(i),
data_out_dds => data_dr_ri(i),
last_word_out_dds => last_word_dr_ri(i),
sample_info => sample_info_dr_ri(i),
sample_info_valid => sample_info_valid_dr_ri(i),
sample_info_ack => sample_info_ack_ri_dr(i),
eoc => eoc_dr_ri(i),
start_dds => start_ri_dr(0 to NUM_READERS-1),
ack_dds => ack_dr_ri(0 to NUM_READERS-1),
opcode_dds => opcode_ri_dr(0 to NUM_READERS-1),
instance_state_dds => instance_state_ri_dr(0 to NUM_READERS-1),
view_state_dds => view_state_ri_dr(0 to NUM_READERS-1),
sample_state_dds => sample_state_ri_dr(0 to NUM_READERS-1),
instance_handle_dds => instance_handle_ri_dr(0 to NUM_READERS-1),
max_samples_dds => max_samples_ri_dr(0 to NUM_READERS-1),
get_data_dds => get_data_ri_dr(0 to NUM_READERS-1),
done_dds => done_dr_ri(0 to NUM_READERS-1),
return_code_dds => return_code_dr_ri(0 to NUM_READERS-1),
valid_out_dds => valid_dr_ri(0 to NUM_READERS-1),
ready_out_dds => ready_ri_dr(0 to NUM_READERS-1),
data_out_dds => data_dr_ri(0 to NUM_READERS-1),
last_word_out_dds => last_word_dr_ri(0 to NUM_READERS-1),
sample_info => sample_info_dr_ri(0 to NUM_READERS-1),
sample_info_valid => sample_info_valid_dr_ri(0 to NUM_READERS-1),
sample_info_ack => sample_info_ack_ri_dr(0 to NUM_READERS-1),
eoc => eoc_dr_ri(0 to NUM_READERS-1),
-- Communication Status
status => status_dr_ri(i)
status => status_dr_ri(0 to NUM_READERS-1)
);
end generate;

View File

@ -418,22 +418,11 @@ begin
status => status_dw_wi(0 to NUM_WRITERS-2)
);
end generate;
dds_endpoint_gen : for i in 0 to NUM_READERS-1 generate
dds_endpoint_r_if : if (NUM_READERS > 0) generate
dds_reader_inst : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => ENDPOINT_CONFIG(i).TIME_BASED_FILTER_QOS,
DEADLINE_QOS => ENDPOINT_CONFIG(i).DEADLINE_QOS,
MAX_INSTANCES => ENDPOINT_CONFIG(i).MAX_INSTANCES,
MAX_SAMPLES_PER_INSTANCE => ENDPOINT_CONFIG(i).MAX_SAMPLES_PER_INSTANCE,
MAX_SAMPLES => ENDPOINT_CONFIG(i).MAX_SAMPLES,
HISTORY_QOS => ENDPOINT_CONFIG(i).HISTORY_QOS,
RELIABILITY_QOS => ENDPOINT_CONFIG(i).RELIABILITY_QOS,
PRESENTATION_QOS => ENDPOINT_CONFIG(i).PRESENTATION_QOS,
DESTINATION_ORDER_QOS => ENDPOINT_CONFIG(i).DESTINATION_ORDER_QOS,
COHERENT_ACCESS => ENDPOINT_CONFIG(i).COHERENT_ACCESS,
ORDERED_ACCESS => ENDPOINT_CONFIG(i).ORDERED_ACCESS,
WITH_KEY => ENDPOINT_CONFIG(i).WITH_KEY,
PAYLOAD_FRAME_SIZE => ENDPOINT_CONFIG(i).MAX_PAYLOAD_SIZE,
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(ENDPOINT_CONFIG(0 to NUM_READERS-1)),
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
@ -442,37 +431,37 @@ begin
reset => reset,
time => time,
-- FROM RTPS ENDPOINT
start_rtps => start_rr_dr(i),
opcode_rtps => opcode_rr_dr(i),
ack_rtps => ack_dr_rr(i),
done_rtps => done_dr_rr(i),
ret_rtps => ret_dr_rr(i),
valid_in_rtps => valid_rr_dr(i),
ready_in_rtps => ready_dr_rr(i),
data_in_rtps => data_rr_dr(i),
last_word_in_rtps => last_word_rr_dr(i),
start_rtps => start_rr_dr(0 to NUM_READERS-1),
opcode_rtps => opcode_rr_dr(0 to NUM_READERS-1),
ack_rtps => ack_dr_rr(0 to NUM_READERS-1),
done_rtps => done_dr_rr(0 to NUM_READERS-1),
ret_rtps => ret_dr_rr(0 to NUM_READERS-1),
valid_in_rtps => valid_rr_dr(0 to NUM_READERS-1),
ready_in_rtps => ready_dr_rr(0 to NUM_READERS-1),
data_in_rtps => data_rr_dr(0 to NUM_READERS-1),
last_word_in_rtps => last_word_rr_dr(0 to NUM_READERS-1),
-- TO USER ENTITY
start_dds => start_ri_dr(i),
ack_dds => ack_dr_ri(i),
opcode_dds => opcode_ri_dr(i),
instance_state_dds => instance_state_ri_dr(i),
view_state_dds => view_state_ri_dr(i),
sample_state_dds => sample_state_ri_dr(i),
instance_handle_dds => instance_handle_ri_dr(i),
max_samples_dds => max_samples_ri_dr(i),
get_data_dds => get_data_ri_dr(i),
done_dds => done_dr_ri(i),
return_code_dds => return_code_dr_ri(i),
valid_out_dds => valid_dr_ri(i),
ready_out_dds => ready_ri_dr(i),
data_out_dds => data_dr_ri(i),
last_word_out_dds => last_word_dr_ri(i),
sample_info => sample_info_dr_ri(i),
sample_info_valid => sample_info_valid_dr_ri(i),
sample_info_ack => sample_info_ack_ri_dr(i),
eoc => eoc_dr_ri(i),
start_dds => start_ri_dr(0 to NUM_READERS-1),
ack_dds => ack_dr_ri(0 to NUM_READERS-1),
opcode_dds => opcode_ri_dr(0 to NUM_READERS-1),
instance_state_dds => instance_state_ri_dr(0 to NUM_READERS-1),
view_state_dds => view_state_ri_dr(0 to NUM_READERS-1),
sample_state_dds => sample_state_ri_dr(0 to NUM_READERS-1),
instance_handle_dds => instance_handle_ri_dr(0 to NUM_READERS-1),
max_samples_dds => max_samples_ri_dr(0 to NUM_READERS-1),
get_data_dds => get_data_ri_dr(0 to NUM_READERS-1),
done_dds => done_dr_ri(0 to NUM_READERS-1),
return_code_dds => return_code_dr_ri(0 to NUM_READERS-1),
valid_out_dds => valid_dr_ri(0 to NUM_READERS-1),
ready_out_dds => ready_ri_dr(0 to NUM_READERS-1),
data_out_dds => data_dr_ri(0 to NUM_READERS-1),
last_word_out_dds => last_word_dr_ri(0 to NUM_READERS-1),
sample_info => sample_info_dr_ri(0 to NUM_READERS-1),
sample_info_valid => sample_info_valid_dr_ri(0 to NUM_READERS-1),
sample_info_ack => sample_info_ack_ri_dr(0 to NUM_READERS-1),
eoc => eoc_dr_ri(0 to NUM_READERS-1),
-- Communication Status
status => status_dr_ri(i)
status => status_dr_ri(0 to NUM_READERS-1)
);
end generate;

View File

@ -421,22 +421,11 @@ begin
status => status_dw_wi(0 to NUM_WRITERS-2)
);
end generate;
dds_endpoint_gen : for i in 0 to NUM_READERS-1 generate
dds_endpoint_r_if : if (NUM_READERS > 0) generate
dds_reader_inst : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => ENDPOINT_CONFIG(i).TIME_BASED_FILTER_QOS,
DEADLINE_QOS => ENDPOINT_CONFIG(i).DEADLINE_QOS,
MAX_INSTANCES => ENDPOINT_CONFIG(i).MAX_INSTANCES,
MAX_SAMPLES_PER_INSTANCE => ENDPOINT_CONFIG(i).MAX_SAMPLES_PER_INSTANCE,
MAX_SAMPLES => ENDPOINT_CONFIG(i).MAX_SAMPLES,
HISTORY_QOS => ENDPOINT_CONFIG(i).HISTORY_QOS,
RELIABILITY_QOS => ENDPOINT_CONFIG(i).RELIABILITY_QOS,
PRESENTATION_QOS => ENDPOINT_CONFIG(i).PRESENTATION_QOS,
DESTINATION_ORDER_QOS => ENDPOINT_CONFIG(i).DESTINATION_ORDER_QOS,
COHERENT_ACCESS => ENDPOINT_CONFIG(i).COHERENT_ACCESS,
ORDERED_ACCESS => ENDPOINT_CONFIG(i).ORDERED_ACCESS,
WITH_KEY => ENDPOINT_CONFIG(i).WITH_KEY,
PAYLOAD_FRAME_SIZE => ENDPOINT_CONFIG(i).MAX_PAYLOAD_SIZE,
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(ENDPOINT_CONFIG(0 to NUM_READERS-1)),
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
@ -445,37 +434,37 @@ begin
reset => reset,
time => time,
-- FROM RTPS ENDPOINT
start_rtps => start_rr_dr(i),
opcode_rtps => opcode_rr_dr(i),
ack_rtps => ack_dr_rr(i),
done_rtps => done_dr_rr(i),
ret_rtps => ret_dr_rr(i),
valid_in_rtps => valid_rr_dr(i),
ready_in_rtps => ready_dr_rr(i),
data_in_rtps => data_rr_dr(i),
last_word_in_rtps => last_word_rr_dr(i),
start_rtps => start_rr_dr(0 to NUM_READERS-1),
opcode_rtps => opcode_rr_dr(0 to NUM_READERS-1),
ack_rtps => ack_dr_rr(0 to NUM_READERS-1),
done_rtps => done_dr_rr(0 to NUM_READERS-1),
ret_rtps => ret_dr_rr(0 to NUM_READERS-1),
valid_in_rtps => valid_rr_dr(0 to NUM_READERS-1),
ready_in_rtps => ready_dr_rr(0 to NUM_READERS-1),
data_in_rtps => data_rr_dr(0 to NUM_READERS-1),
last_word_in_rtps => last_word_rr_dr(0 to NUM_READERS-1),
-- TO USER ENTITY
start_dds => start_ri_dr(i),
ack_dds => ack_dr_ri(i),
opcode_dds => opcode_ri_dr(i),
instance_state_dds => instance_state_ri_dr(i),
view_state_dds => view_state_ri_dr(i),
sample_state_dds => sample_state_ri_dr(i),
instance_handle_dds => instance_handle_ri_dr(i),
max_samples_dds => max_samples_ri_dr(i),
get_data_dds => get_data_ri_dr(i),
done_dds => done_dr_ri(i),
return_code_dds => return_code_dr_ri(i),
valid_out_dds => valid_dr_ri(i),
ready_out_dds => ready_ri_dr(i),
data_out_dds => data_dr_ri(i),
last_word_out_dds => last_word_dr_ri(i),
sample_info => sample_info_dr_ri(i),
sample_info_valid => sample_info_valid_dr_ri(i),
sample_info_ack => sample_info_ack_ri_dr(i),
eoc => eoc_dr_ri(i),
start_dds => start_ri_dr(0 to NUM_READERS-1),
ack_dds => ack_dr_ri(0 to NUM_READERS-1),
opcode_dds => opcode_ri_dr(0 to NUM_READERS-1),
instance_state_dds => instance_state_ri_dr(0 to NUM_READERS-1),
view_state_dds => view_state_ri_dr(0 to NUM_READERS-1),
sample_state_dds => sample_state_ri_dr(0 to NUM_READERS-1),
instance_handle_dds => instance_handle_ri_dr(0 to NUM_READERS-1),
max_samples_dds => max_samples_ri_dr(0 to NUM_READERS-1),
get_data_dds => get_data_ri_dr(0 to NUM_READERS-1),
done_dds => done_dr_ri(0 to NUM_READERS-1),
return_code_dds => return_code_dr_ri(0 to NUM_READERS-1),
valid_out_dds => valid_dr_ri(0 to NUM_READERS-1),
ready_out_dds => ready_ri_dr(0 to NUM_READERS-1),
data_out_dds => data_dr_ri(0 to NUM_READERS-1),
last_word_out_dds => last_word_dr_ri(0 to NUM_READERS-1),
sample_info => sample_info_dr_ri(0 to NUM_READERS-1),
sample_info_valid => sample_info_valid_dr_ri(0 to NUM_READERS-1),
sample_info_ack => sample_info_ack_ri_dr(0 to NUM_READERS-1),
eoc => eoc_dr_ri(0 to NUM_READERS-1),
-- Communication Status
status => status_dr_ri(i)
status => status_dr_ri(0 to NUM_READERS-1)
);
end generate;

View File

@ -451,22 +451,11 @@ begin
status => status_dw_wi(0 to NUM_WRITERS-2)
);
end generate;
dds_endpoint_gen : for i in 0 to NUM_READERS-1 generate
dds_endpoint_r_if : if (NUM_READERS > 0) generate
dds_reader_inst : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => ENDPOINT_CONFIG(i).TIME_BASED_FILTER_QOS,
DEADLINE_QOS => ENDPOINT_CONFIG(i).DEADLINE_QOS,
MAX_INSTANCES => ENDPOINT_CONFIG(i).MAX_INSTANCES,
MAX_SAMPLES_PER_INSTANCE => ENDPOINT_CONFIG(i).MAX_SAMPLES_PER_INSTANCE,
MAX_SAMPLES => ENDPOINT_CONFIG(i).MAX_SAMPLES,
HISTORY_QOS => ENDPOINT_CONFIG(i).HISTORY_QOS,
RELIABILITY_QOS => ENDPOINT_CONFIG(i).RELIABILITY_QOS,
PRESENTATION_QOS => ENDPOINT_CONFIG(i).PRESENTATION_QOS,
DESTINATION_ORDER_QOS => ENDPOINT_CONFIG(i).DESTINATION_ORDER_QOS,
COHERENT_ACCESS => ENDPOINT_CONFIG(i).COHERENT_ACCESS,
ORDERED_ACCESS => ENDPOINT_CONFIG(i).ORDERED_ACCESS,
WITH_KEY => ENDPOINT_CONFIG(i).WITH_KEY,
PAYLOAD_FRAME_SIZE => ENDPOINT_CONFIG(i).MAX_PAYLOAD_SIZE,
NUM_READERS => NUM_READERS,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(ENDPOINT_CONFIG(0 to NUM_READERS-1)),
MAX_REMOTE_ENDPOINTS => MAX_REMOTE_ENDPOINTS
)
port map (
@ -475,37 +464,37 @@ begin
reset => reset,
time => time,
-- FROM RTPS ENDPOINT
start_rtps => start_rr_dr(i),
opcode_rtps => opcode_rr_dr(i),
ack_rtps => ack_dr_rr(i),
done_rtps => done_dr_rr(i),
ret_rtps => ret_dr_rr(i),
valid_in_rtps => valid_rr_dr(i),
ready_in_rtps => ready_dr_rr(i),
data_in_rtps => data_rr_dr(i),
last_word_in_rtps => last_word_rr_dr(i),
start_rtps => start_rr_dr(0 to NUM_READERS-1),
opcode_rtps => opcode_rr_dr(0 to NUM_READERS-1),
ack_rtps => ack_dr_rr(0 to NUM_READERS-1),
done_rtps => done_dr_rr(0 to NUM_READERS-1),
ret_rtps => ret_dr_rr(0 to NUM_READERS-1),
valid_in_rtps => valid_rr_dr(0 to NUM_READERS-1),
ready_in_rtps => ready_dr_rr(0 to NUM_READERS-1),
data_in_rtps => data_rr_dr(0 to NUM_READERS-1),
last_word_in_rtps => last_word_rr_dr(0 to NUM_READERS-1),
-- TO USER ENTITY
start_dds => start_ri_dr(i),
ack_dds => ack_dr_ri(i),
opcode_dds => opcode_ri_dr(i),
instance_state_dds => instance_state_ri_dr(i),
view_state_dds => view_state_ri_dr(i),
sample_state_dds => sample_state_ri_dr(i),
instance_handle_dds => instance_handle_ri_dr(i),
max_samples_dds => max_samples_ri_dr(i),
get_data_dds => get_data_ri_dr(i),
done_dds => done_dr_ri(i),
return_code_dds => return_code_dr_ri(i),
valid_out_dds => valid_dr_ri(i),
ready_out_dds => ready_ri_dr(i),
data_out_dds => data_dr_ri(i),
last_word_out_dds => last_word_dr_ri(i),
sample_info => sample_info_dr_ri(i),
sample_info_valid => sample_info_valid_dr_ri(i),
sample_info_ack => sample_info_ack_ri_dr(i),
eoc => eoc_dr_ri(i),
start_dds => start_ri_dr(0 to NUM_READERS-1),
ack_dds => ack_dr_ri(0 to NUM_READERS-1),
opcode_dds => opcode_ri_dr(0 to NUM_READERS-1),
instance_state_dds => instance_state_ri_dr(0 to NUM_READERS-1),
view_state_dds => view_state_ri_dr(0 to NUM_READERS-1),
sample_state_dds => sample_state_ri_dr(0 to NUM_READERS-1),
instance_handle_dds => instance_handle_ri_dr(0 to NUM_READERS-1),
max_samples_dds => max_samples_ri_dr(0 to NUM_READERS-1),
get_data_dds => get_data_ri_dr(0 to NUM_READERS-1),
done_dds => done_dr_ri(0 to NUM_READERS-1),
return_code_dds => return_code_dr_ri(0 to NUM_READERS-1),
valid_out_dds => valid_dr_ri(0 to NUM_READERS-1),
ready_out_dds => ready_ri_dr(0 to NUM_READERS-1),
data_out_dds => data_dr_ri(0 to NUM_READERS-1),
last_word_out_dds => last_word_dr_ri(0 to NUM_READERS-1),
sample_info => sample_info_dr_ri(0 to NUM_READERS-1),
sample_info_valid => sample_info_valid_dr_ri(0 to NUM_READERS-1),
sample_info_ack => sample_info_ack_ri_dr(0 to NUM_READERS-1),
eoc => eoc_dr_ri(0 to NUM_READERS-1),
-- Communication Status
status => status_dr_ri(i)
status => status_dr_ri(0 to NUM_READERS-1)
);
end generate;

View File

@ -28,6 +28,7 @@ package rtps_package is
constant CDR_LONG_WIDTH : natural := 32;
constant CDR_FLOAT_WIDTH : natural := 32;
constant CDR_ENUMERATION_WIDTH : natural := 32;
type CDR_ENUMERATION_ARRAY_TYPE is array (natural range <>) of std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0);
constant CDR_LONG_LONG_WIDTH : natural := 64;
constant CDR_DOUBLE_WIDTH : natural := 64;
constant CDR_LONG_DOUBLE_WIDTH : natural := 128;
@ -76,8 +77,11 @@ package rtps_package is
constant ABSOLUTE_GENERATION_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant INCONSISTENT_TOPIC_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
type INCONSISTENT_TOPIC_STATUS_COUNT_ARRAY_TYPE is array (natural range <>) of std_logic_vector(INCONSISTENT_TOPIC_STATUS_COUNT_WIDTH-1 downto 0);
constant SAMPLE_LOST_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
type SAMPLE_LOST_STATUS_COUNT_ARRAY_TYPE is array (natural range <>) of std_logic_vector(SAMPLE_LOST_STATUS_COUNT_WIDTH-1 downto 0);
constant SAMPLE_REJECTED_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
type SAMPLE_REJECTED_STATUS_COUNT_ARRAY_TYPE is array (natural range <>) of std_logic_vector(SAMPLE_REJECTED_STATUS_COUNT_WIDTH-1 downto 0);
constant LIVELINESS_LOST_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
type LIVELINESS_LOST_STATUS_COUNT_ARRAY_TYPE is array (natural range <>) of std_logic_vector(LIVELINESS_LOST_STATUS_COUNT_WIDTH-1 downto 0);
constant LIVELINESS_CHANGED_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
@ -86,9 +90,13 @@ package rtps_package is
constant REQUESTED_DEADLINE_MISSED_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
type REQUESTED_DEADLINE_MISSED_STATUS_COUNT_ARRAY_TYPE is array (natural range <>) of std_logic_vector(REQUESTED_DEADLINE_MISSED_STATUS_COUNT_WIDTH-1 downto 0);
constant OFFERED_INCOMPATIBLE_QOS_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
type OFFERED_INCOMPATIBLE_QOS_STATUS_COUNT_ARRAY_TYPE is array (natural range <>) of std_logic_vector(OFFERED_INCOMPATIBLE_QOS_STATUS_COUNT_WIDTH-1 downto 0);
constant REQUESTED_INCOMPATIBLE_QOS_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
type REQUESTED_INCOMPATIBLE_QOS_STATUS_COUNT_ARRAY_TYPE is array (natural range <>) of std_logic_vector(REQUESTED_INCOMPATIBLE_QOS_STATUS_COUNT_WIDTH-1 downto 0);
constant PUBLICATION_MATCHED_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
type PUBLICATION_MATCHED_STATUS_COUNT_ARRAY_TYPE is array (natural range <>) of std_logic_vector(PUBLICATION_MATCHED_STATUS_COUNT_WIDTH-1 downto 0);
constant SUBSCRIPTION_MATCHED_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
type SUBSCRIPTION_MATCHED_STATUS_COUNT_ARRAY_TYPE is array (natural range <>) of std_logic_vector(SUBSCRIPTION_MATCHED_STATUS_COUNT_WIDTH-1 downto 0);
@ -197,7 +205,7 @@ package rtps_package is
constant REJECTED_BY_SAMPLES_LIMIT : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(2,CDR_ENUMERATION_WIDTH));
constant REJECTED_BY_SAMPLES_PER_INSTANCE_LIMIT : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(3,CDR_ENUMERATION_WIDTH));
-- Extension
constant REJECTED_BY_PAYOAD_MEMORY_LIMIT : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(255,CDR_ENUMERATION_WIDTH));
constant REJECTED_BY_PAYLOAD_MEMORY_LIMIT : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(255,CDR_ENUMERATION_WIDTH));
constant REJECTED_BY_PENDING_SAMPLE_GENERATION : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(256,CDR_ENUMERATION_WIDTH));
-- *QOS POLICY ID* (DDS)

View File

@ -39,7 +39,7 @@
set_global_assignment -name FAMILY "Cyclone V"
set_global_assignment -name DEVICE 5CSEBA6U23I7
set_global_assignment -name TOP_LEVEL_ENTITY dds_writer_syn
set_global_assignment -name TOP_LEVEL_ENTITY test_top
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 20.1.0
set_global_assignment -name PROJECT_CREATION_TIME_DATE "13:33:09 NOVEMBER 02, 2020"
set_global_assignment -name LAST_QUARTUS_VERSION "21.1.0 Lite Edition"

View File

@ -18,38 +18,37 @@ entity dds_reader_syn is
reset : in std_logic;
time : in TIME_TYPE;
-- FROM RTPS ENDPOINT
start_rtps : in std_logic;
opcode_rtps : in HISTORY_CACHE_OPCODE_TYPE;
ack_rtps : out std_logic;
done_rtps : out std_logic;
ret_rtps : out HISTORY_CACHE_RESPONSE_TYPE;
data_in_rtps : in std_logic_vector(WORD_WIDTH-1 downto 0);
valid_in_rtps : in std_logic;
ready_in_rtps : out std_logic;
last_word_in_rtps : in std_logic;
start_rtps : in std_logic_vector(0 to 0);
opcode_rtps : in HISTORY_CACHE_OPCODE_ARRAY_TYPE(0 to 0);
ack_rtps : out std_logic_vector(0 to 0);
done_rtps : out std_logic_vector(0 to 0);
ret_rtps : out HISTORY_CACHE_RESPONSE_ARRAY_TYPE(0 to 0);
data_in_rtps : in WORD_ARRAY_TYPE(0 to 0);
valid_in_rtps : in std_logic_vector(0 to 0);
ready_in_rtps : out std_logic_vector(0 to 0);
last_word_in_rtps : in std_logic_vector(0 to 0);
-- TO USER ENTITY
start_dds : in std_logic;
ack_dds : out std_logic;
opcode_dds : in DDS_READER_OPCODE_TYPE;
instance_state_dds : in std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0);
view_state_dds : in std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0);
sample_state_dds : in std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0);
instance_handle_dds : in INSTANCE_HANDLE_TYPE;
max_samples_dds : in std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0);
get_data_dds : in std_logic;
done_dds : out std_logic;
return_code_dds : out std_logic_vector(RETURN_CODE_WIDTH-1 downto 0);
ready_out_dds : in std_logic;
valid_out_dds : out std_logic;
data_out_dds : out std_logic_vector(WORD_WIDTH-1 downto 0);
last_word_out_dds : out std_logic;
-- Sample Info
sample_info : out SAMPLE_INFO_TYPE;
sample_info_valid : out std_logic;
sample_info_ack : in std_logic;
eoc : out std_logic;
start_dds : in std_logic_vector(0 to 0);
ack_dds : out std_logic_vector(0 to 0);
opcode_dds : in DDS_READER_OPCODE_ARRAY_TYPE(0 to 0);
instance_state_dds : in INSTANCE_STATE_ARRAY_TYPE(0 to 0);
view_state_dds : in VIEW_STATE_ARRAY_TYPE(0 to 0);
sample_state_dds : in SAMPLE_STATE_ARRAY_TYPE(0 to 0);
instance_handle_dds : in INSTANCE_HANDLE_ARRAY_TYPE(0 to 0);
max_samples_dds : in MAX_SAMPLES_ARRAY_TYPE(0 to 0);
get_data_dds : in std_logic_vector(0 to 0);
done_dds : out std_logic_vector(0 to 0);
return_code_dds : out RETURN_CODE_ARRAY_TYPE(0 to 0);
valid_out_dds : out std_logic_vector(0 to 0);
ready_out_dds : in std_logic_vector(0 to 0);
data_out_dds : out WORD_ARRAY_TYPE(0 to 0);
last_word_out_dds : out std_logic_vector(0 to 0);
sample_info : out SAMPLE_INFO_ARRAY_TYPE(0 to 0);
sample_info_valid : out std_logic_vector(0 to 0);
sample_info_ack : in std_logic_vector(0 to 0);
eoc : out std_logic_vector(0 to 0);
-- Communication Status
status : out std_logic_vector(STATUS_KIND_WIDTH-1 downto 0)
status : out STATUS_KIND_ARRAY_TYPE(0 to 0)
);
end entity;
@ -59,19 +58,9 @@ begin
if_gen : if (NUM_READERS > 0) generate
syn_inst : entity work.dds_reader(arch)
generic map (
TIME_BASED_FILTER_QOS => ENDPOINT_CONFIG(0).TIME_BASED_FILTER_QOS,
DEADLINE_QOS => ENDPOINT_CONFIG(0).DEADLINE_QOS,
MAX_INSTANCES => ENDPOINT_CONFIG(0).MAX_INSTANCES,
MAX_SAMPLES_PER_INSTANCE => ENDPOINT_CONFIG(0).MAX_SAMPLES_PER_INSTANCE,
MAX_SAMPLES => ENDPOINT_CONFIG(0).MAX_SAMPLES,
HISTORY_QOS => ENDPOINT_CONFIG(0).HISTORY_QOS,
RELIABILITY_QOS => ENDPOINT_CONFIG(0).RELIABILITY_QOS,
PRESENTATION_QOS => ENDPOINT_CONFIG(0).PRESENTATION_QOS,
DESTINATION_ORDER_QOS => ENDPOINT_CONFIG(0).DESTINATION_ORDER_QOS,
COHERENT_ACCESS => ENDPOINT_CONFIG(0).COHERENT_ACCESS,
ORDERED_ACCESS => ENDPOINT_CONFIG(0).ORDERED_ACCESS,
WITH_KEY => ENDPOINT_CONFIG(0).WITH_KEY,
PAYLOAD_FRAME_SIZE => MAX_TYPE1_SIZE
NUM_READERS => 1,
CONFIG_ARRAY => to_QUARTUS_CONFIG_ARRAY_TYPE(ENDPOINT_CONFIG(0 to 0)),
MAX_REMOTE_ENDPOINTS => 50
)
port map (
clk => clk,