diff --git a/bench/bench_trashernet_mac.vhd b/bench/bench_trashernet_mac.vhd index 6bd18df..0d7d314 100644 --- a/bench/bench_trashernet_mac.vhd +++ b/bench/bench_trashernet_mac.vhd @@ -34,6 +34,15 @@ architecture bench of bench_trashernet_mac is signal rx_mac_valid : std_logic; signal rx_mac_crc_ok : std_logic; signal rx_mac_crc_error : std_logic; + signal rx_mac_header_rcv : std_logic; + signal tx_mac_destination : mac_addr_t; + signal tx_mac_source : mac_addr_t; + signal tx_mac_ethertype : ethertype_t; + signal tx_mac_data : byte; + signal tx_mac_data_en : std_logic; + signal tx_mac_data_ack : std_logic; + + constant TEST_BENCH_LOOPBACK : boolean := true; begin trashernet_phy_cdc_inst : entity trashernet.trashernet_phy_cdc @@ -51,6 +60,7 @@ begin tx_data => tx_data, tx_data_en => tx_data_en, tx_data_ack => tx_data_ack, + tx_active => tx_active, carrier_detect => carrier_detect, rx_error => rx_error, rx_p => rx_p, @@ -76,8 +86,15 @@ begin rx_mac_ethertype => rx_mac_ethertype, rx_mac_data => rx_mac_data, rx_mac_valid => rx_mac_valid, + rx_mac_header_rcv => rx_mac_header_rcv, rx_mac_crc_ok => rx_mac_crc_ok, - rx_mac_crc_error => rx_mac_crc_error + rx_mac_crc_error => rx_mac_crc_error, + tx_mac_destination => tx_mac_destination, + tx_mac_source => tx_mac_source, + tx_mac_ethertype => tx_mac_ethertype, + tx_mac_data => tx_mac_data, + tx_mac_data_en => tx_mac_data_en, + tx_mac_data_ack => tx_mac_data_ack ); clock_driver : process @@ -98,38 +115,48 @@ begin wait for period / 2; end process phy_clock_driver; - test : process is + rstsim : process is begin - rx_p <= '0'; - rst <= '1'; wait for 20 ns; rst <= '0'; wait for 20 ns; - - send_data(rx_p, byte_vector'( - x"55", x"55", x"55", x"D5", - x"11", x"22", x"33", x"44", x"55", x"66", x"00", x"e0", x"4c", x"36", x"00", x"2f", x"08", x"00", x"45", x"00", x"00", x"54", x"fe", x"22", x"40", x"00", x"40", x"01", x"f5", x"28", x"c0", x"a8", x"63", x"0a", x"c0", x"a8", x"63", x"02", x"08", x"00", x"90", x"e6", x"00", x"06", x"00", x"01", x"da", x"bd", x"2c", x"61", x"00", x"00", x"00", x"00", x"9f", x"20", x"02", x"00", x"00", x"00", x"00", x"00", x"10", x"11", x"12", x"13", x"14", x"15", x"16", x"17", x"18", x"19", x"1a", x"1b", x"1c", x"1d", x"1e", x"1f", x"20", x"21", x"22", x"23", x"24", x"25", x"26", x"27", x"28", x"29", x"2a", x"2b", x"2c", x"2d", x"2e", x"2f", x"30", x"31", x"32", x"33", x"34", x"35", x"36", x"37", - x"e9", x"f2", x"6b", x"30" - )); - - send_data(rx_p, byte_vector'( - x"55", x"55", x"55", x"D5", - x"11", x"22", x"33", x"44", x"55", x"66", x"00", x"e0", x"4c", x"36", x"00", x"2f", x"08", x"00", x"45", x"00", x"00", x"54", x"ca", x"78", x"40", x"00", x"40", x"01", x"28", x"d4", x"c0", x"a8", x"63", x"0a", x"c0", x"a8", x"63", x"01", x"08", x"00", x"93", x"f5", x"00", x"03", x"00", x"01", x"3c", x"bc", x"2c", x"61", x"00", x"00", x"00", x"00", x"38", x"16", x"04", x"00", x"00", x"00", x"00", x"00", x"10", x"11", x"12", x"13", x"14", x"15", x"16", x"17", x"18", x"19", x"1a", x"1b", x"1c", x"1d", x"1e", x"1f", x"20", x"21", x"22", x"23", x"24", x"25", x"26", x"27", x"28", x"29", x"2a", x"2b", x"2c", x"2d", x"2e", x"2f", x"30", x"31", x"32", x"33", x"34", x"35", x"36", x"37", - x"b9", x"7f", x"c7", x"91" - )); - - send_data(rx_p, byte_vector'( - x"55", x"55", x"55", x"D5", - x"12", x"34", x"56", x"78", x"90", x"12", - x"AB", x"CD", x"EF", x"AA", x"BB", x"CC", - x"08", x"00", - x"11", x"22", x"33", x"44", x"55", x"66", - x"CC", x"2C", x"CC", x"2C" - )); - wait; - end process test; + end process rstsim; + + loopbackmode : if TEST_BENCH_LOOPBACK generate + rx_p <= tx_p; + else generate + test : process is + begin + wait until rst = '0'; + wait for 10 ns; + rx_p <= '0'; + + send_data(rx_p, byte_vector'( + x"55", x"55", x"55", x"D5", + x"11", x"22", x"33", x"44", x"55", x"66", x"00", x"e0", x"4c", x"36", x"00", x"2f", x"08", x"00", x"45", x"00", x"00", x"54", x"fe", x"22", x"40", x"00", x"40", x"01", x"f5", x"28", x"c0", x"a8", x"63", x"0a", x"c0", x"a8", x"63", x"02", x"08", x"00", x"90", x"e6", x"00", x"06", x"00", x"01", x"da", x"bd", x"2c", x"61", x"00", x"00", x"00", x"00", x"9f", x"20", x"02", x"00", x"00", x"00", x"00", x"00", x"10", x"11", x"12", x"13", x"14", x"15", x"16", x"17", x"18", x"19", x"1a", x"1b", x"1c", x"1d", x"1e", x"1f", x"20", x"21", x"22", x"23", x"24", x"25", x"26", x"27", x"28", x"29", x"2a", x"2b", x"2c", x"2d", x"2e", x"2f", x"30", x"31", x"32", x"33", x"34", x"35", x"36", x"37", + x"e9", x"f2", x"6b", x"30" + )); + + send_data(rx_p, byte_vector'( + x"55", x"55", x"55", x"D5", + x"11", x"22", x"33", x"44", x"55", x"66", x"00", x"e0", x"4c", x"36", x"00", x"2f", x"08", x"00", x"45", x"00", x"00", x"54", x"ca", x"78", x"40", x"00", x"40", x"01", x"28", x"d4", x"c0", x"a8", x"63", x"0a", x"c0", x"a8", x"63", x"01", x"08", x"00", x"93", x"f5", x"00", x"03", x"00", x"01", x"3c", x"bc", x"2c", x"61", x"00", x"00", x"00", x"00", x"38", x"16", x"04", x"00", x"00", x"00", x"00", x"00", x"10", x"11", x"12", x"13", x"14", x"15", x"16", x"17", x"18", x"19", x"1a", x"1b", x"1c", x"1d", x"1e", x"1f", x"20", x"21", x"22", x"23", x"24", x"25", x"26", x"27", x"28", x"29", x"2a", x"2b", x"2c", x"2d", x"2e", x"2f", x"30", x"31", x"32", x"33", x"34", x"35", x"36", x"37", + x"b9", x"7f", x"c7", x"91" + )); + + send_data(rx_p, byte_vector'( + x"55", x"55", x"55", x"D5", + x"12", x"34", x"56", x"78", x"90", x"12", + x"AB", x"CD", x"EF", x"AA", x"BB", x"CC", + x"08", x"00", + x"11", x"22", x"33", x"44", x"55", x"66", + x"CC", x"2C", x"CC", x"2C" + )); + + wait; + end process test; + end generate loopbackmode; receiver : process is begin @@ -148,4 +175,25 @@ begin end if; end process receiver; + mac_tx : process is + begin + tx_mac_data <= x"11"; + tx_mac_destination <= (x"12", x"23", x"34", x"45", x"56", x"67"); + tx_mac_source <= (x"a2", x"a3", x"a4", x"a5", x"a6", x"a7"); + tx_mac_ethertype <= (x"01", x"00"); + tx_mac_data_en <= '0'; + + wait until rst = '0'; + wait for 100 ns; + + tx_mac_data_en <= '1'; + wait until rising_edge(tx_mac_data_ack); + wait until rising_edge(tx_mac_data_ack); + wait until rising_edge(tx_mac_data_ack); + wait until rising_edge(clk); + tx_mac_data_en <= '0'; + + wait; + end process mac_tx; + end architecture bench;