Convert dds_reader to Vector Endpoint
This commit is contained in:
parent
bc745fdcd9
commit
d388e29c36
190
sim/L0_dds_reader_test1.do
Normal file
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
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
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
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
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
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
@ -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
|
||||
-------------
|
||||
|
||||
6916
src/Tests/Level_0/L0_dds_reader_test1.vhd
Normal file
6916
src/Tests/Level_0/L0_dds_reader_test1.vhd
Normal file
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
776
src/Tests/Level_0/L0_dds_reader_test2.vhd
Normal file
776
src/Tests/Level_0/L0_dds_reader_test2.vhd
Normal 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;
|
||||
4026
src/Tests/Level_0/L0_dds_reader_test3.vhd
Normal file
4026
src/Tests/Level_0/L0_dds_reader_test3.vhd
Normal file
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
@ -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;
|
||||
957
src/Tests/Level_0/L0_dds_reader_test4.vhd
Normal file
957
src/Tests/Level_0/L0_dds_reader_test4.vhd
Normal 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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
7358
src/dds_reader.vhd
7358
src/dds_reader.vhd
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user