diff --git a/libraries/technology/mac_10g/tb_tech_mac_10g_pkg.vhd b/libraries/technology/mac_10g/tb_tech_mac_10g_pkg.vhd index 864f081e5ed0056bd95a2f25d13c98759a609182..bcf7bcb336f04ca6d178e8290dbe30c38ded18d5 100644 --- a/libraries/technology/mac_10g/tb_tech_mac_10g_pkg.vhd +++ b/libraries/technology/mac_10g/tb_tech_mac_10g_pkg.vhd @@ -203,89 +203,86 @@ PACKAGE BODY tb_tech_mac_10g_pkg IS VARIABLE v_hdr_words_arr : t_network_total_header_64b_arr; BEGIN ff_src_out <= c_dp_sosi_rst; - IF ff_src_in.xon='1' THEN -- Generate this packet + -- Wait until XON is active + proc_common_wait_until_high(ff_clk, ff_src_in.xon); + -- Generate this packet - -- Select header - CASE c_data_type IS - WHEN c_tb_tech_mac_10g_data_type_arp => v_hdr_words_arr := c_arp_words_arr; - WHEN c_tb_tech_mac_10g_data_type_ping => v_hdr_words_arr := c_icmp_words_arr; - WHEN OTHERS => v_hdr_words_arr := c_udp_words_arr; -- default via UDP - END CASE; + -- Select header + CASE c_data_type IS + WHEN c_tb_tech_mac_10g_data_type_arp => v_hdr_words_arr := c_arp_words_arr; + WHEN c_tb_tech_mac_10g_data_type_ping => v_hdr_words_arr := c_icmp_words_arr; + WHEN OTHERS => v_hdr_words_arr := c_udp_words_arr; -- default via UDP + END CASE; + + ff_src_out.empty <= TO_DP_EMPTY(0); + IF c_data_type=c_tb_tech_mac_10g_data_type_arp THEN - ff_src_out.empty <= TO_DP_EMPTY(0); - IF c_data_type=c_tb_tech_mac_10g_data_type_arp THEN - - ---------------------------------------------------------------------------- - -- Header only frame - ---------------------------------------------------------------------------- - -- . sop - ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(0)); - proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '1', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); - ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(1)); -- prepare data before loop, so proc_dp_stream_ready_latency can be called at start of the loops - FOR I IN 2 TO c_nof_hdr_beats-2 LOOP - proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); - ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(I)); - END LOOP; + ---------------------------------------------------------------------------- + -- Header only frame + ---------------------------------------------------------------------------- + -- . sop + ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(0)); + proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '1', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); + ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(1)); -- prepare data before loop, so proc_dp_stream_ready_latency can be called at start of the loops + FOR I IN 2 TO c_nof_hdr_beats-2 LOOP proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); - -- . eop - ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(c_nof_hdr_beats-1)); - proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '1', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); - - ELSE - - ---------------------------------------------------------------------------- - -- Header for frame with payload - ---------------------------------------------------------------------------- + ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(I)); + END LOOP; + proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); + -- . eop + ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(c_nof_hdr_beats-1)); + proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '1', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); + + ELSE + + ---------------------------------------------------------------------------- + -- Header for frame with payload + ---------------------------------------------------------------------------- + + -- Header + -- . sop + ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(0)); + proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '1', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); + ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(1)); -- prepare data before loop, so proc_dp_stream_ready_latency can be called at start of the loops + FOR I IN 2 TO c_nof_hdr_beats-1 LOOP + proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); + ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(I)); + END LOOP; + + -- Payload + FOR I IN 0 TO c_nof_data_beats-1 LOOP + proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); + CASE c_data_type IS + WHEN c_tb_tech_mac_10g_data_type_counter => + -- data : X"00000000_00000001", X"00000000_00000002", X"00000000_00000003", etc + v_num := v_num + 1; + ff_src_out.data <= RESIZE_DP_DATA(STD_LOGIC_VECTOR(v_num)); + WHEN OTHERS => + -- data : X"01020304_05060708", X"090A0B0C_0D0E0F10", X"11121314_15161718", etc + FOR J IN c_tech_mac_10g_symbols_per_beat-1 DOWNTO 0 LOOP + v_sym := v_sym + 1; + ff_src_out.data((J+1)*c_tech_mac_10g_symbol_w-1 DOWNTO J*c_tech_mac_10g_symbol_w) <= STD_LOGIC_VECTOR(v_sym); + END LOOP; + END CASE; + -- tb : pull valid low for some time during the middle of the payload + IF c_nof_not_valid > 0 AND I=c_nof_data_beats/2 THEN + ff_src_out.valid <= '0'; + FOR I IN 0 TO c_nof_not_valid LOOP WAIT UNTIL rising_edge(ff_clk); END LOOP; + ff_src_out.valid <= '1'; + END IF; + END LOOP; - -- Header - -- . sop - ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(0)); - proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '1', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); - ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(1)); -- prepare data before loop, so proc_dp_stream_ready_latency can be called at start of the loops - FOR I IN 2 TO c_nof_hdr_beats-1 LOOP - proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); - ff_src_out.data <= RESIZE_DP_DATA(v_hdr_words_arr(I)); - END LOOP; - - -- Payload - FOR I IN 0 TO c_nof_data_beats-1 LOOP - proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '0', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); - CASE c_data_type IS - WHEN c_tb_tech_mac_10g_data_type_counter => - -- data : X"00000000_00000001", X"00000000_00000002", X"00000000_00000003", etc - v_num := v_num + 1; - ff_src_out.data <= RESIZE_DP_DATA(STD_LOGIC_VECTOR(v_num)); - WHEN OTHERS => - -- data : X"01020304_05060708", X"090A0B0C_0D0E0F10", X"11121314_15161718", etc - FOR J IN c_tech_mac_10g_symbols_per_beat-1 DOWNTO 0 LOOP - v_sym := v_sym + 1; - ff_src_out.data((J+1)*c_tech_mac_10g_symbol_w-1 DOWNTO J*c_tech_mac_10g_symbol_w) <= STD_LOGIC_VECTOR(v_sym); - END LOOP; - END CASE; - -- tb : pull valid low for some time during the middle of the payload - IF c_nof_not_valid > 0 AND I=c_nof_data_beats/2 THEN - ff_src_out.valid <= '0'; - FOR I IN 0 TO c_nof_not_valid LOOP WAIT UNTIL rising_edge(ff_clk); END LOOP; - ff_src_out.valid <= '1'; - END IF; + -- Last data + IF c_empty > 0 THEN + -- Overwrite empty data + ff_src_out.empty <= TO_DP_EMPTY(c_empty); + FOR J IN c_empty-1 DOWNTO 0 LOOP + ff_src_out.data((J+1)*c_tech_mac_10g_symbol_w-1 DOWNTO J*c_tech_mac_10g_symbol_w) <= (OTHERS=>'0'); END LOOP; - - -- Last data - IF c_empty > 0 THEN - -- Overwrite empty data - ff_src_out.empty <= TO_DP_EMPTY(c_empty); - FOR J IN c_empty-1 DOWNTO 0 LOOP - ff_src_out.data((J+1)*c_tech_mac_10g_symbol_w-1 DOWNTO J*c_tech_mac_10g_symbol_w) <= (OTHERS=>'0'); - END LOOP; - END IF; - -- . eop - proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '1', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); - END IF; + -- . eop + proc_dp_stream_ready_latency(c_ready_latency, ff_clk, ff_src_in.ready, ff_en, '0', '1', '0', '1', ff_src_out.sync, ff_src_out.valid, ff_src_out.sop, ff_src_out.eop); - ELSE - -- Wait until XON is active - proc_common_wait_until_high(ff_clk, ff_src_in.xon); END IF; END proc_tech_mac_10g_tx_packet;