Skip to content
Snippets Groups Projects
Commit 84a88274 authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Support g_loopback_eth.

parent 3798966c
Branches
No related tags found
1 merge request!288Resolve L2SDP-836
Pipeline #38317 passed
...@@ -40,6 +40,7 @@ USE common_lib.common_network_layers_pkg.ALL; ...@@ -40,6 +40,7 @@ USE common_lib.common_network_layers_pkg.ALL;
USE dp_lib.dp_stream_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL;
USE dp_lib.dp_components_pkg.ALL; USE dp_lib.dp_components_pkg.ALL;
USE diag_lib.diag_pkg.ALL; USE diag_lib.diag_pkg.ALL;
USE work.eth_pkg.ALL;
USE work.eth_tester_pkg.ALL; USE work.eth_tester_pkg.ALL;
USE work.tb_eth_tester_pkg.ALL; USE work.tb_eth_tester_pkg.ALL;
...@@ -47,7 +48,8 @@ ENTITY tb_eth_tester IS ...@@ -47,7 +48,8 @@ ENTITY tb_eth_tester IS
GENERIC ( GENERIC (
g_tb_index : NATURAL := 0; -- use to incremental delay logging from tb instances in tb_tb g_tb_index : NATURAL := 0; -- use to incremental delay logging from tb instances in tb_tb
g_tb_str : STRING := ""; -- use to distinguish logging from tb instances in tb_tb g_tb_str : STRING := ""; -- use to distinguish logging from tb instances in tb_tb
g_nof_streams : NATURAL := 2; g_nof_streams : NATURAL := 2; -- <= c_eth_nof_udp_ports = 4 when g_loopback_tx_rx = 1
g_loopback_eth : BOOLEAN := TRUE; -- FALSE = sosi loopback, TRUE = eth loopback
-- t_diag_block_gen_integer = -- t_diag_block_gen_integer =
-- sl: enable -- sl: enable
...@@ -66,26 +68,40 @@ END tb_eth_tester; ...@@ -66,26 +68,40 @@ END tb_eth_tester;
ARCHITECTURE tb OF tb_eth_tester IS ARCHITECTURE tb OF tb_eth_tester IS
CONSTANT eth_clk_period : TIME := 8 ns; -- 125 MHz
CONSTANT mm_clk_period : TIME := 10 ns; -- 100 MHz CONSTANT mm_clk_period : TIME := 10 ns; -- 100 MHz
CONSTANT st_clk_period : TIME := 5 ns; -- 200 MHz CONSTANT st_clk_period : TIME := 5 ns; -- 200 MHz
CONSTANT c_slot_len_first : NATURAL := g_bg_ctrl_first.samples_per_packet + g_bg_ctrl_first.gapsize; CONSTANT c_bg_slot_len_first : NATURAL := g_bg_ctrl_first.samples_per_packet + g_bg_ctrl_first.gapsize;
CONSTANT c_slot_len_others : NATURAL := g_bg_ctrl_others.samples_per_packet + g_bg_ctrl_others.gapsize; CONSTANT c_bg_slot_len_others : NATURAL := g_bg_ctrl_others.samples_per_packet + g_bg_ctrl_others.gapsize;
CONSTANT c_bg_sync_period_first : NATURAL := c_bg_slot_len_first * g_bg_ctrl_first.blocks_per_sync;
CONSTANT c_bg_sync_period_others : NATURAL := c_bg_slot_len_others * g_bg_ctrl_others.blocks_per_sync;
CONSTANT c_bg_sync_period_max : NATURAL := largest(c_bg_sync_period_first, c_bg_sync_period_others);
CONSTANT c_sync_period_first : NATURAL := c_slot_len_first * g_bg_ctrl_first.blocks_per_sync;
CONSTANT c_sync_period_others : NATURAL := c_slot_len_others * g_bg_ctrl_others.blocks_per_sync;
CONSTANT c_sync_period_max : NATURAL := largest(c_sync_period_first, c_sync_period_others);
CONSTANT c_nof_sync : NATURAL := 3; CONSTANT c_nof_sync : NATURAL := 3;
CONSTANT c_run_time : NATURAL := c_nof_sync * c_sync_period_max; CONSTANT c_run_time : NATURAL := c_nof_sync * c_bg_sync_period_max;
CONSTANT c_nof_sync_first : NATURAL := c_run_time / c_sync_period_first; CONSTANT c_nof_sync_first : NATURAL := c_run_time / c_bg_sync_period_first;
CONSTANT c_nof_sync_others : NATURAL := c_run_time / c_sync_period_others; CONSTANT c_nof_sync_others : NATURAL := c_run_time / c_bg_sync_period_others;
-- Expected Tx --> Rx latency values obtained from a tb run
CONSTANT c_tx_exp_latency : NATURAL := 0;
CONSTANT c_rx_exp_latency : NATURAL := sel_a_b(g_loopback_eth, 450, 27);
-- CRC is added by ETH IP. Therefore Tx packet has no CRC yet and Rx
-- packet length depends on g_loopback_eth = TRUE
CONSTANT c_nof_valid_per_packet_first : NATURAL := g_bg_ctrl_first.samples_per_packet + sel_a_b(g_loopback_eth, 4, 0);
CONSTANT c_nof_valid_per_packet_others : NATURAL := g_bg_ctrl_others.samples_per_packet + sel_a_b(g_loopback_eth, 4, 0);
CONSTANT c_total_count_nof_valid_per_sync_first : NATURAL := g_bg_ctrl_first.blocks_per_sync * c_nof_valid_per_packet_first;
CONSTANT c_total_count_nof_valid_per_sync_others : NATURAL := g_bg_ctrl_others.blocks_per_sync * c_nof_valid_per_packet_others;
CONSTANT c_mon_nof_sop_first : NATURAL := g_bg_ctrl_first.blocks_per_sync; CONSTANT c_mon_nof_sop_first : NATURAL := g_bg_ctrl_first.blocks_per_sync;
CONSTANT c_mon_nof_sop_others : NATURAL := g_bg_ctrl_others.blocks_per_sync; CONSTANT c_mon_nof_sop_others : NATURAL := g_bg_ctrl_others.blocks_per_sync;
CONSTANT c_mon_nof_valid_first_tx : NATURAL := c_mon_nof_sop_first * ceil_div(g_bg_ctrl_first.samples_per_packet * c_octet_w, c_word_w); CONSTANT c_mon_nof_valid_first_tx : NATURAL := c_mon_nof_sop_first * ceil_div(g_bg_ctrl_first.samples_per_packet * c_octet_w, c_word_w);
CONSTANT c_mon_nof_valid_first_rx : NATURAL := c_mon_nof_sop_first * g_bg_ctrl_first.samples_per_packet; CONSTANT c_mon_nof_valid_first_rx : NATURAL := c_mon_nof_sop_first * c_nof_valid_per_packet_first;
CONSTANT c_mon_nof_valid_others_tx : NATURAL := c_mon_nof_sop_others * ceil_div(g_bg_ctrl_others.samples_per_packet* c_octet_w, c_word_w); CONSTANT c_mon_nof_valid_others_tx : NATURAL := c_mon_nof_sop_others * ceil_div(g_bg_ctrl_others.samples_per_packet* c_octet_w, c_word_w);
CONSTANT c_mon_nof_valid_others_rx : NATURAL := c_mon_nof_sop_others * g_bg_ctrl_others.samples_per_packet; CONSTANT c_mon_nof_valid_others_rx : NATURAL := c_mon_nof_sop_others * c_nof_valid_per_packet_others;
-- Use sim default src MAC, IP, UDP port from eth_tester_pkg.vhd and based on c_gn_index -- Use sim default src MAC, IP, UDP port from eth_tester_pkg.vhd and based on c_gn_index
CONSTANT c_gn_index : NATURAL := 17; -- global node index CONSTANT c_gn_index : NATURAL := 17; -- global node index
...@@ -101,6 +117,11 @@ ARCHITECTURE tb OF tb_eth_tester IS ...@@ -101,6 +117,11 @@ ARCHITECTURE tb OF tb_eth_tester IS
SIGNAL st_pps : STD_LOGIC := '0'; SIGNAL st_pps : STD_LOGIC := '0';
SIGNAL stimuli_end : STD_LOGIC := '0'; SIGNAL stimuli_end : STD_LOGIC := '0';
SIGNAL tb_end : STD_LOGIC := '0'; SIGNAL tb_end : STD_LOGIC := '0';
SIGNAL eth_clk : STD_LOGIC := '1';
SIGNAL eth_txp : STD_LOGIC;
SIGNAL eth_rxp : STD_LOGIC;
-- Use same bg_ctrl for all streams, this provides sufficient test coverage -- Use same bg_ctrl for all streams, this provides sufficient test coverage
SIGNAL bg_ctrl_arr : t_diag_block_gen_integer_arr(g_nof_streams-1 DOWNTO 0); SIGNAL bg_ctrl_arr : t_diag_block_gen_integer_arr(g_nof_streams-1 DOWNTO 0);
...@@ -126,12 +147,12 @@ ARCHITECTURE tb OF tb_eth_tester IS ...@@ -126,12 +147,12 @@ ARCHITECTURE tb OF tb_eth_tester IS
SIGNAL reg_strobe_total_count_rx_cipo : t_mem_cipo; SIGNAL reg_strobe_total_count_rx_cipo : t_mem_cipo;
-- . reg_strobe_total_count -- . reg_strobe_total_count
SIGNAL tx_total_count_nof_packets_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0); SIGNAL tx_total_count_nof_packet_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0);
SIGNAL rx_total_count_nof_packets_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0); SIGNAL rx_total_count_nof_packet_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0);
SIGNAL exp_total_count_nof_packets_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0); -- same for both tx and rx SIGNAL exp_total_count_nof_packet_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0); -- same for both tx and rx
SIGNAL rx_total_count_nof_valids_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0); SIGNAL rx_total_count_nof_valid_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0);
SIGNAL rx_exp_total_count_nof_valids_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0); SIGNAL rx_exp_total_count_nof_valid_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0);
SIGNAL rx_total_count_nof_corrupted_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0); SIGNAL rx_total_count_nof_corrupted_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0);
SIGNAL rx_exp_total_count_nof_corrupted_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0); SIGNAL rx_exp_total_count_nof_corrupted_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0);
...@@ -144,6 +165,15 @@ ARCHITECTURE tb OF tb_eth_tester IS ...@@ -144,6 +165,15 @@ ARCHITECTURE tb OF tb_eth_tester IS
SIGNAL rx_mon_nof_valid_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0); SIGNAL rx_mon_nof_valid_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0);
SIGNAL rx_mon_latency_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0); SIGNAL rx_mon_latency_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0);
-- ETH link, used when g_loopback_eth = TRUE
SIGNAL eth_tx_udp_sosi_arr : t_dp_sosi_arr(c_eth_nof_udp_ports-1 DOWNTO 0) := (OTHERS=> c_dp_sosi_rst); -- default rst if not used
SIGNAL eth_tx_udp_siso_arr : t_dp_siso_arr(c_eth_nof_udp_ports-1 DOWNTO 0);
SIGNAL eth_rx_udp_sosi_arr : t_dp_sosi_arr(c_eth_nof_udp_ports-1 DOWNTO 0);
SIGNAL eth_rx_udp_siso_arr : t_dp_siso_arr(c_eth_nof_udp_ports-1 DOWNTO 0) := (OTHERS=> c_dp_siso_rst); -- default rst if not used
SIGNAL reg_eth_copi : t_mem_copi := c_mem_copi_rst;
SIGNAL reg_eth_cipo : t_mem_cipo;
-- View in Wave window -- View in Wave window
SIGNAL dbg_c_mon_nof_sop_first : NATURAL := c_mon_nof_sop_first; SIGNAL dbg_c_mon_nof_sop_first : NATURAL := c_mon_nof_sop_first;
SIGNAL dbg_c_mon_nof_sop_others : NATURAL := c_mon_nof_sop_others; SIGNAL dbg_c_mon_nof_sop_others : NATURAL := c_mon_nof_sop_others;
...@@ -154,13 +184,14 @@ ARCHITECTURE tb OF tb_eth_tester IS ...@@ -154,13 +184,14 @@ ARCHITECTURE tb OF tb_eth_tester IS
BEGIN BEGIN
eth_clk <= (NOT eth_clk) OR tb_end AFTER eth_clk_period/2;
mm_clk <= (NOT mm_clk) OR tb_end AFTER mm_clk_period/2; mm_clk <= (NOT mm_clk) OR tb_end AFTER mm_clk_period/2;
st_clk <= (NOT st_clk) OR tb_end AFTER st_clk_period/2; st_clk <= (NOT st_clk) OR tb_end AFTER st_clk_period/2;
mm_rst <= '1', '0' AFTER mm_clk_period*5; mm_rst <= '1', '0' AFTER mm_clk_period*5;
st_rst <= '1', '0' AFTER st_clk_period*5; st_rst <= '1', '0' AFTER st_clk_period*5;
-- Using -- Using
--SIGNAL exp_total_count_nof_packets_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0); --SIGNAL exp_total_count_nof_packet_arr : t_natural_arr(g_nof_streams-1 DOWNTO 0);
-- (g_nof_streams-1 DOWNTO 1 => c_nof_sync * g_bg_ctrl_others.blocks_per_sync, -- (g_nof_streams-1 DOWNTO 1 => c_nof_sync * g_bg_ctrl_others.blocks_per_sync,
-- 0 => c_nof_sync * g_bg_ctrl_first.blocks_per_sync); -- 0 => c_nof_sync * g_bg_ctrl_first.blocks_per_sync);
-- yields verror 1074, verror 1048, therefor use p_init instead, and -- yields verror 1074, verror 1048, therefor use p_init instead, and
...@@ -170,11 +201,11 @@ BEGIN ...@@ -170,11 +201,11 @@ BEGIN
bg_ctrl_arr <= (OTHERS => g_bg_ctrl_others); bg_ctrl_arr <= (OTHERS => g_bg_ctrl_others);
bg_ctrl_arr(0) <= g_bg_ctrl_first; bg_ctrl_arr(0) <= g_bg_ctrl_first;
exp_total_count_nof_packets_arr <= (OTHERS => c_nof_sync_others * g_bg_ctrl_others.blocks_per_sync); exp_total_count_nof_packet_arr <= (OTHERS => c_nof_sync_others * g_bg_ctrl_others.blocks_per_sync);
exp_total_count_nof_packets_arr(0) <= c_nof_sync_first * g_bg_ctrl_first.blocks_per_sync; exp_total_count_nof_packet_arr(0) <= c_nof_sync_first * g_bg_ctrl_first.blocks_per_sync;
rx_exp_total_count_nof_valids_arr <= (OTHERS => c_nof_sync_others * g_bg_ctrl_others.blocks_per_sync * g_bg_ctrl_others.samples_per_packet); rx_exp_total_count_nof_valid_arr <= (OTHERS => c_nof_sync_others * c_total_count_nof_valid_per_sync_others);
rx_exp_total_count_nof_valids_arr(0) <= c_nof_sync_first * g_bg_ctrl_first.blocks_per_sync * g_bg_ctrl_first.samples_per_packet; rx_exp_total_count_nof_valid_arr(0) <= c_nof_sync_first * c_total_count_nof_valid_per_sync_first;
rx_exp_total_count_nof_corrupted_arr <= (OTHERS => 0); -- default no Rx errors rx_exp_total_count_nof_corrupted_arr <= (OTHERS => 0); -- default no Rx errors
WAIT; WAIT;
...@@ -185,15 +216,40 @@ BEGIN ...@@ -185,15 +216,40 @@ BEGIN
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
p_mm : PROCESS p_mm : PROCESS
VARIABLE v_offset : NATURAL; VARIABLE v_offset : NATURAL;
VARIABLE v_port : NATURAL;
VARIABLE v_value : NATURAL;
BEGIN BEGIN
proc_common_wait_until_low(mm_clk, mm_rst); proc_common_wait_until_low(mm_clk, mm_rst);
proc_common_wait_some_cycles(mm_clk, 10); proc_common_wait_some_cycles(mm_clk, 10);
---------------------------------------------------------------------------
-- Rx UDP offload port
---------------------------------------------------------------------------
v_port := TO_UINT(c_eth_tester_udp_dst_port);
IF g_loopback_eth = TRUE THEN
-- Set up demux in eth Rx based on destination UDP port
v_value := 2**16 + v_port; -- enable bit 16, udp port number [15:0]
FOR I IN g_nof_streams-1 DOWNTO 0 LOOP
proc_mem_mm_bus_wr(0 + I, v_value + I, mm_clk, reg_eth_copi); -- increment udp_dst_port per stream
END LOOP;
END IF;
FOR I IN g_nof_streams-1 DOWNTO 0 LOOP
v_offset := I * c_eth_tester_reg_hdr_dat_addr_span;
-- Set destination MAC/IP/UDP port in tx header, increment udp_dst_port per stream
-- The MM addresses follow from byte address_offset // 4 in eth.peripheral.yaml
proc_mem_mm_bus_wr(v_offset + 16#6#, v_port + I, mm_clk, reg_hdr_dat_cipo, reg_hdr_dat_copi);
proc_mem_mm_bus_wr(v_offset + 16#9#, TO_SINT(c_eth_tester_ip_dst_addr), mm_clk, reg_hdr_dat_cipo, reg_hdr_dat_copi); -- use signed to fit 32 b in INTEGER
proc_mem_mm_bus_wr(v_offset + 16#17#, TO_SINT(c_eth_tester_eth_dst_mac(31 DOWNTO 0)), mm_clk, reg_hdr_dat_cipo, reg_hdr_dat_copi); -- use signed to fit 32 b in INTEGER
proc_mem_mm_bus_wr(v_offset + 16#18#, TO_UINT(c_eth_tester_eth_dst_mac(47 DOWNTO 32)), mm_clk, reg_hdr_dat_cipo, reg_hdr_dat_copi);
END LOOP;
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
-- Stimuli -- Stimuli
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
FOR I IN g_nof_streams-1 DOWNTO 0 LOOP FOR I IN g_nof_streams-1 DOWNTO 0 LOOP
v_offset := I * c_diag_bg_reg_nof_dat; v_offset := I * c_diag_bg_reg_adr_span;
-- Prepare the BG -- Prepare the BG
proc_mem_mm_bus_wr(v_offset + 1, bg_ctrl_arr(I).samples_per_packet, mm_clk, reg_bg_ctrl_copi); proc_mem_mm_bus_wr(v_offset + 1, bg_ctrl_arr(I).samples_per_packet, mm_clk, reg_bg_ctrl_copi);
proc_mem_mm_bus_wr(v_offset + 2, bg_ctrl_arr(I).blocks_per_sync, mm_clk, reg_bg_ctrl_copi); proc_mem_mm_bus_wr(v_offset + 2, bg_ctrl_arr(I).blocks_per_sync, mm_clk, reg_bg_ctrl_copi);
...@@ -214,11 +270,11 @@ BEGIN ...@@ -214,11 +270,11 @@ BEGIN
-- Disable the BG -- Disable the BG
FOR I IN g_nof_streams-1 DOWNTO 0 LOOP FOR I IN g_nof_streams-1 DOWNTO 0 LOOP
v_offset := I * c_diag_bg_reg_nof_dat; v_offset := I * c_diag_bg_reg_adr_span;
-- Disable the other BG -- Disable the other BG
proc_mem_mm_bus_wr(v_offset + 0, 0, mm_clk, reg_bg_ctrl_copi); proc_mem_mm_bus_wr(v_offset + 0, 0, mm_clk, reg_bg_ctrl_copi);
END LOOP; END LOOP;
proc_common_wait_some_cycles(st_clk, c_sync_period_max); proc_common_wait_some_cycles(st_clk, sel_a_b(g_loopback_eth, 20, 1) * c_bg_sync_period_max);
stimuli_end <= '1'; stimuli_end <= '1';
-- Dealy logging between different tb instances -- Dealy logging between different tb instances
...@@ -226,7 +282,7 @@ BEGIN ...@@ -226,7 +282,7 @@ BEGIN
print_str(""); -- log empty line between tb results print_str(""); -- log empty line between tb results
------------------------------------------------------------------------- -------------------------------------------------------------------------
-- Verification: Total nof Tx packets = total nof Rx packets -- Verification: Total counts
------------------------------------------------------------------------- -------------------------------------------------------------------------
FOR I IN g_nof_streams-1 DOWNTO 0 LOOP FOR I IN g_nof_streams-1 DOWNTO 0 LOOP
-- . read low part, ignore high part (= 0) of two word total counts -- . read low part, ignore high part (= 0) of two word total counts
...@@ -234,15 +290,15 @@ BEGIN ...@@ -234,15 +290,15 @@ BEGIN
-- Tx total nof packets -- Tx total nof packets
proc_mem_mm_bus_rd(v_offset + 0, mm_clk, reg_strobe_total_count_tx_cipo, reg_strobe_total_count_tx_copi); proc_mem_mm_bus_rd(v_offset + 0, mm_clk, reg_strobe_total_count_tx_cipo, reg_strobe_total_count_tx_copi);
proc_mem_mm_bus_rd_latency(1, mm_clk); proc_mem_mm_bus_rd_latency(1, mm_clk);
tx_total_count_nof_packets_arr(I) <= TO_UINT(reg_strobe_total_count_tx_cipo.rddata(c_word_w-1 DOWNTO 0)); tx_total_count_nof_packet_arr(I) <= TO_UINT(reg_strobe_total_count_tx_cipo.rddata(c_word_w-1 DOWNTO 0));
-- Rx total nof packets -- Rx total nof packets
proc_mem_mm_bus_rd(v_offset + 0, mm_clk, reg_strobe_total_count_rx_cipo, reg_strobe_total_count_rx_copi); proc_mem_mm_bus_rd(v_offset + 0, mm_clk, reg_strobe_total_count_rx_cipo, reg_strobe_total_count_rx_copi);
proc_mem_mm_bus_rd_latency(1, mm_clk); proc_mem_mm_bus_rd_latency(1, mm_clk);
rx_total_count_nof_packets_arr(I) <= TO_UINT(reg_strobe_total_count_rx_cipo.rddata(c_word_w-1 DOWNTO 0)); rx_total_count_nof_packet_arr(I) <= TO_UINT(reg_strobe_total_count_rx_cipo.rddata(c_word_w-1 DOWNTO 0));
-- Rx total nof valids -- Rx total nof valids
proc_mem_mm_bus_rd(v_offset + 2, mm_clk, reg_strobe_total_count_rx_cipo, reg_strobe_total_count_rx_copi); proc_mem_mm_bus_rd(v_offset + 2, mm_clk, reg_strobe_total_count_rx_cipo, reg_strobe_total_count_rx_copi);
proc_mem_mm_bus_rd_latency(1, mm_clk); proc_mem_mm_bus_rd_latency(1, mm_clk);
rx_total_count_nof_valids_arr(I) <= TO_UINT(reg_strobe_total_count_rx_cipo.rddata(c_word_w-1 DOWNTO 0)); rx_total_count_nof_valid_arr(I) <= TO_UINT(reg_strobe_total_count_rx_cipo.rddata(c_word_w-1 DOWNTO 0));
-- Rx total nof corrupted -- Rx total nof corrupted
proc_mem_mm_bus_rd(v_offset + 4, mm_clk, reg_strobe_total_count_rx_cipo, reg_strobe_total_count_rx_copi); proc_mem_mm_bus_rd(v_offset + 4, mm_clk, reg_strobe_total_count_rx_cipo, reg_strobe_total_count_rx_copi);
proc_mem_mm_bus_rd_latency(1, mm_clk); proc_mem_mm_bus_rd_latency(1, mm_clk);
...@@ -252,31 +308,31 @@ BEGIN ...@@ -252,31 +308,31 @@ BEGIN
-- Print logging -- Print logging
print_str(g_tb_str & print_str(g_tb_str &
"Tx total counts monitor(" & NATURAL'IMAGE(I) & ") :" & "Tx total counts monitor(" & NATURAL'IMAGE(I) & ") :" &
" nof_packets = " & NATURAL'IMAGE(tx_total_count_nof_packets_arr(I))); " nof_packet = " & NATURAL'IMAGE(tx_total_count_nof_packet_arr(I)));
print_str(g_tb_str & print_str(g_tb_str &
"Rx total counts monitor(" & NATURAL'IMAGE(I) & ") :" & "Rx total counts monitor(" & NATURAL'IMAGE(I) & ") :" &
" nof_packets = " & NATURAL'IMAGE(rx_total_count_nof_packets_arr(I)) & " nof_packet = " & NATURAL'IMAGE(rx_total_count_nof_packet_arr(I)) &
", nof_valids = " & NATURAL'IMAGE(rx_total_count_nof_valids_arr(I)) & ", nof_valid = " & NATURAL'IMAGE(rx_total_count_nof_valid_arr(I)) &
", nof_corrupted = " & NATURAL'IMAGE(rx_total_count_nof_corrupted_arr(I))); ", nof_corrupted = " & NATURAL'IMAGE(rx_total_count_nof_corrupted_arr(I)));
-- Verify, only log when wrong -- Verify, only log when wrong
ASSERT tx_total_count_nof_packets_arr(I) = exp_total_count_nof_packets_arr(I) REPORT g_tb_str & ASSERT tx_total_count_nof_packet_arr(I) = exp_total_count_nof_packet_arr(I) REPORT g_tb_str &
"Wrong Tx total nof packets count(" & NATURAL'IMAGE(I) & "Wrong Tx total nof packets count(" & NATURAL'IMAGE(I) &
"), Tx count = " & NATURAL'IMAGE(tx_total_count_nof_packets_arr(I)) & "), Tx count = " & NATURAL'IMAGE(tx_total_count_nof_packet_arr(I)) &
" /= " & NATURAL'IMAGE(exp_total_count_nof_packets_arr(I)) & " /= " & NATURAL'IMAGE(exp_total_count_nof_packet_arr(I)) &
" = Expected count" SEVERITY ERROR; " = Expected count" SEVERITY ERROR;
ASSERT rx_total_count_nof_packets_arr(I) = exp_total_count_nof_packets_arr(I) REPORT g_tb_str & ASSERT rx_total_count_nof_packet_arr(I) = exp_total_count_nof_packet_arr(I) REPORT g_tb_str &
"Wrong Rx total nof packets count(" & NATURAL'IMAGE(I) & "Wrong Rx total nof packets count(" & NATURAL'IMAGE(I) &
"), Rx count = " & NATURAL'IMAGE(rx_total_count_nof_packets_arr(I)) & "), Rx count = " & NATURAL'IMAGE(rx_total_count_nof_packet_arr(I)) &
" /= " & NATURAL'IMAGE(exp_total_count_nof_packets_arr(I)) & " /= " & NATURAL'IMAGE(exp_total_count_nof_packet_arr(I)) &
" = Expected count" SEVERITY ERROR; " = Expected count" SEVERITY ERROR;
ASSERT rx_total_count_nof_valids_arr(I) = rx_exp_total_count_nof_valids_arr(I) REPORT g_tb_str & ASSERT rx_total_count_nof_valid_arr(I) = rx_exp_total_count_nof_valid_arr(I) REPORT g_tb_str &
"Wrong Rx total nof valids count(" & NATURAL'IMAGE(I) & "Wrong Rx total nof valids count(" & NATURAL'IMAGE(I) &
"), Rx count = " & NATURAL'IMAGE(rx_total_count_nof_valids_arr(I)) & "), Rx count = " & NATURAL'IMAGE(rx_total_count_nof_valid_arr(I)) &
" /= " & NATURAL'IMAGE(rx_exp_total_count_nof_valids_arr(I)) & " /= " & NATURAL'IMAGE(rx_exp_total_count_nof_valid_arr(I)) &
" = Expected count" SEVERITY ERROR; " = Expected count" SEVERITY ERROR;
ASSERT rx_total_count_nof_corrupted_arr(I) = rx_exp_total_count_nof_corrupted_arr(I) REPORT g_tb_str & ASSERT rx_total_count_nof_corrupted_arr(I) = rx_exp_total_count_nof_corrupted_arr(I) REPORT g_tb_str &
...@@ -341,8 +397,8 @@ BEGIN ...@@ -341,8 +397,8 @@ BEGIN
ASSERT tx_mon_nof_valid_arr(I) = c_mon_nof_valid_others_tx REPORT g_tb_str & "Wrong tx nof_valid for stream (" & NATURAL'IMAGE(I) & ")" SEVERITY ERROR; ASSERT tx_mon_nof_valid_arr(I) = c_mon_nof_valid_others_tx REPORT g_tb_str & "Wrong tx nof_valid for stream (" & NATURAL'IMAGE(I) & ")" SEVERITY ERROR;
ASSERT rx_mon_nof_valid_arr(I) = c_mon_nof_valid_others_rx REPORT g_tb_str & "Wrong rx nof_valid for stream (" & NATURAL'IMAGE(I) & ")" SEVERITY ERROR; ASSERT rx_mon_nof_valid_arr(I) = c_mon_nof_valid_others_rx REPORT g_tb_str & "Wrong rx nof_valid for stream (" & NATURAL'IMAGE(I) & ")" SEVERITY ERROR;
END IF; END IF;
ASSERT tx_mon_latency_arr(I) = 0 REPORT g_tb_str & "Wrong tx latency for stream (" & NATURAL'IMAGE(I) & ")" SEVERITY ERROR; ASSERT tx_mon_latency_arr(I) = c_tx_exp_latency REPORT g_tb_str & "Wrong tx latency for stream (" & NATURAL'IMAGE(I) & ")" SEVERITY ERROR;
ASSERT rx_mon_latency_arr(I) = 27 REPORT g_tb_str & "Wrong rx latency for stream (" & NATURAL'IMAGE(I) & ")" SEVERITY ERROR; ASSERT rx_mon_latency_arr(I) = c_rx_exp_latency REPORT g_tb_str & "Wrong rx latency for stream (" & NATURAL'IMAGE(I) & ")" SEVERITY ERROR;
END LOOP; END LOOP;
------------------------------------------------------------------------- -------------------------------------------------------------------------
...@@ -353,9 +409,6 @@ BEGIN ...@@ -353,9 +409,6 @@ BEGIN
WAIT; WAIT;
END PROCESS; END PROCESS;
-- Wire Tx to Rx
rx_udp_sosi_arr <= tx_udp_sosi_arr;
dut : ENTITY work.eth_tester dut : ENTITY work.eth_tester
GENERIC MAP ( GENERIC MAP (
g_nof_streams => g_nof_streams g_nof_streams => g_nof_streams
...@@ -396,4 +449,54 @@ BEGIN ...@@ -396,4 +449,54 @@ BEGIN
reg_strobe_total_count_rx_cipo => reg_strobe_total_count_rx_cipo reg_strobe_total_count_rx_cipo => reg_strobe_total_count_rx_cipo
); );
-- Wire Tx to Rx
gen_loopback_sosi : IF g_loopback_eth = FALSE GENERATE
rx_udp_sosi_arr <= tx_udp_sosi_arr;
END GENERATE;
gen_loopback_eth : IF g_loopback_eth = TRUE GENERATE
eth_rxp <= eth_txp;
eth_tx_udp_sosi_arr(g_nof_streams-1 DOWNTO 0) <= tx_udp_sosi_arr;
tx_udp_siso_arr <= eth_tx_udp_siso_arr(g_nof_streams-1 DOWNTO 0);
rx_udp_sosi_arr <= eth_rx_udp_sosi_arr(g_nof_streams-1 DOWNTO 0);
eth_rx_udp_siso_arr(g_nof_streams-1 DOWNTO 0) <= (OTHERS => c_dp_siso_rdy);
u_eth : ENTITY work.eth
GENERIC MAP (
g_init_ip_address => X"0A630000",
g_cross_clock_domain => TRUE,
g_sim => TRUE,
g_sim_level => 1 -- when g_sim = TRUE, then 0 = use IP; 1 = use fast serdes model
)
PORT MAP (
-- Clocks and reset
mm_rst => mm_rst,
mm_clk => mm_clk,
eth_clk => eth_clk, -- ethernet phy reference clock
st_rst => st_rst,
st_clk => st_clk,
-- UDP transmit interface
udp_tx_snk_in_arr => eth_tx_udp_sosi_arr,
udp_tx_snk_out_arr => eth_tx_udp_siso_arr,
-- UDP receive interface
udp_rx_src_in_arr => eth_rx_udp_siso_arr,
udp_rx_src_out_arr => eth_rx_udp_sosi_arr,
-- Memory Mapped Slaves
tse_sla_in => c_mem_copi_rst, -- ETH TSE MAC registers
tse_sla_out => OPEN,
reg_sla_in => reg_eth_copi, -- ETH control and status registers
reg_sla_out => reg_eth_cipo,
reg_sla_interrupt => OPEN, -- Interrupt
ram_sla_in => c_mem_copi_rst, -- ETH rx frame and tx frame memory
ram_sla_out => OPEN,
-- PHY interface
eth_txp => eth_txp,
eth_rxp => eth_rxp
);
END GENERATE;
END tb; END tb;
...@@ -52,6 +52,7 @@ BEGIN ...@@ -52,6 +52,7 @@ BEGIN
-- g_tb_index : NATURAL := 0; -- use to incremental delay logging from tb instances in tb_tb -- g_tb_index : NATURAL := 0; -- use to incremental delay logging from tb instances in tb_tb
-- g_tb_str : STRING := ""; -- use to distinguish logging from tb instances in tb_tb -- g_tb_str : STRING := ""; -- use to distinguish logging from tb instances in tb_tb
-- g_nof_streams : NATURAL := 2; -- g_nof_streams : NATURAL := 2;
-- g_loopback_eth : BOOLEAN := FALSE; -- FALSE = sosi loopback, TRUE = eth loopback
-- --
-- -- t_diag_block_gen_integer = -- -- t_diag_block_gen_integer =
-- -- sl: enable -- -- sl: enable
...@@ -65,13 +66,13 @@ BEGIN ...@@ -65,13 +66,13 @@ BEGIN
-- g_bg_ctrl_first : t_diag_block_gen_integer := ('1', '1', 50, 8, 100, 0, 30, 0); -- for first stream -- g_bg_ctrl_first : t_diag_block_gen_integer := ('1', '1', 50, 8, 100, 0, 30, 0); -- for first stream
-- g_bg_ctrl_others : t_diag_block_gen_integer := ('1', '1', 30, 8, 10, 0, 30, 0) -- for other streams -- g_bg_ctrl_others : t_diag_block_gen_integer := ('1', '1', 30, 8, 10, 0, 30, 0) -- for other streams
u_one_stream : ENTITY work.tb_eth_tester GENERIC MAP (0, "tb_one_stream: ", 1, c_bg_ctrl_first, c_bg_ctrl_rst); u_one_stream : ENTITY work.tb_eth_tester GENERIC MAP (0, "tb_one_stream: ", 1, FALSE, c_bg_ctrl_first, c_bg_ctrl_rst);
u_multiple_streams : ENTITY work.tb_eth_tester GENERIC MAP (1, "tb_multiple_streams: ", 3, c_bg_ctrl_first, c_bg_ctrl_others); u_multiple_streams : ENTITY work.tb_eth_tester GENERIC MAP (1, "tb_multiple_streams: ", 3, FALSE, c_bg_ctrl_first, c_bg_ctrl_others);
-- Try different BG block lengths to verify nof octets in last word -- Try different BG block lengths to verify nof octets in last word
u_bg_len_0 : ENTITY work.tb_eth_tester GENERIC MAP (10, "tb_bg_len_0: ", 1, c_bg_ctrl_len_0, c_bg_ctrl_rst); u_bg_len_0 : ENTITY work.tb_eth_tester GENERIC MAP (10, "tb_bg_len_0: ", 1, FALSE, c_bg_ctrl_len_0, c_bg_ctrl_rst);
u_bg_len_1 : ENTITY work.tb_eth_tester GENERIC MAP (11, "tb_bg_len_1: ", 1, c_bg_ctrl_len_1, c_bg_ctrl_rst); u_bg_len_1 : ENTITY work.tb_eth_tester GENERIC MAP (11, "tb_bg_len_1: ", 1, FALSE, c_bg_ctrl_len_1, c_bg_ctrl_rst);
u_bg_len_2 : ENTITY work.tb_eth_tester GENERIC MAP (12, "tb_bg_len_2: ", 1, c_bg_ctrl_len_2, c_bg_ctrl_rst); u_bg_len_2 : ENTITY work.tb_eth_tester GENERIC MAP (12, "tb_bg_len_2: ", 1, FALSE, c_bg_ctrl_len_2, c_bg_ctrl_rst);
u_bg_len_3 : ENTITY work.tb_eth_tester GENERIC MAP (13, "tb_bg_len_3: ", 1, c_bg_ctrl_len_3, c_bg_ctrl_rst); u_bg_len_3 : ENTITY work.tb_eth_tester GENERIC MAP (13, "tb_bg_len_3: ", 1, FALSE, c_bg_ctrl_len_3, c_bg_ctrl_rst);
END tb; END tb;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment