OpenCores
URL https://opencores.org/ocsvn/ethmac/ethmac/trunk

Subversion Repositories ethmac

[/] [ethmac/] [trunk/] [bench/] [verilog/] [tb_ethernet.v] - Diff between revs 267 and 274

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 267 Rev 274
Line 40... Line 40...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.25  2002/11/27 16:21:55  mohor
 
// Full duplex control frames tested.
 
//
// Revision 1.24  2002/11/22 17:29:42  mohor
// Revision 1.24  2002/11/22 17:29:42  mohor
// Flow control test almost finished.
// Flow control test almost finished.
//
//
// Revision 1.23  2002/11/22 02:12:16  mohor
// Revision 1.23  2002/11/22 02:12:16  mohor
// test_mac_full_duplex_flow_control tests pretty much finished.
// test_mac_full_duplex_flow_control tests pretty much finished.
Line 414... Line 417...
// Generating wb_clk clock
// Generating wb_clk clock
initial
initial
begin
begin
  wb_clk=0;
  wb_clk=0;
//  forever #2.5 wb_clk = ~wb_clk;  // 2*2.5 ns -> 200.0 MHz    
//  forever #2.5 wb_clk = ~wb_clk;  // 2*2.5 ns -> 200.0 MHz    
  forever #5 wb_clk = ~wb_clk;  // 2*5 ns -> 100.0 MHz    
//  forever #5 wb_clk = ~wb_clk;  // 2*5 ns -> 100.0 MHz    
//  forever #10 wb_clk = ~wb_clk;  // 2*10 ns -> 50.0 MHz    
//  forever #10 wb_clk = ~wb_clk;  // 2*10 ns -> 50.0 MHz    
//  forever #12.5 wb_clk = ~wb_clk;  // 2*12.5 ns -> 40 MHz    
//  forever #12.5 wb_clk = ~wb_clk;  // 2*12.5 ns -> 40 MHz    
//  forever #15 wb_clk = ~wb_clk;  // 2*10 ns -> 33.3 MHz    
  forever #15 wb_clk = ~wb_clk;  // 2*10 ns -> 33.3 MHz    
//  forever #20 wb_clk = ~wb_clk;  // 2*20 ns -> 25 MHz    
//  forever #20 wb_clk = ~wb_clk;  // 2*20 ns -> 25 MHz    
//  forever #25 wb_clk = ~wb_clk;  // 2*25 ns -> 20.0 MHz
//  forever #25 wb_clk = ~wb_clk;  // 2*25 ns -> 20.0 MHz
//  forever #31.25 wb_clk = ~wb_clk;  // 2*31.25 ns -> 16.0 MHz    
//  forever #31.25 wb_clk = ~wb_clk;  // 2*31.25 ns -> 16.0 MHz    
//  forever #50 wb_clk = ~wb_clk;  // 2*50 ns -> 10.0 MHz
//  forever #50 wb_clk = ~wb_clk;  // 2*50 ns -> 10.0 MHz
//  forever #55 wb_clk = ~wb_clk;  // 2*55 ns ->  9.1 MHz    
//  forever #55 wb_clk = ~wb_clk;  // 2*55 ns ->  9.1 MHz    
Line 436... Line 439...
reg   [3:0]  wbm_init_waits; // initial wait cycles between CYC_O and STB_O of WB Master
reg   [3:0]  wbm_init_waits; // initial wait cycles between CYC_O and STB_O of WB Master
reg   [3:0]  wbm_subseq_waits; // subsequent wait cycles between STB_Os of WB Master
reg   [3:0]  wbm_subseq_waits; // subsequent wait cycles between STB_Os of WB Master
reg   [2:0]  wbs_waits; // wait cycles befor WB Slave responds
reg   [2:0]  wbs_waits; // wait cycles befor WB Slave responds
reg   [7:0]  wbs_retries; // if RTY response, then this is the number of retries before ACK
reg   [7:0]  wbs_retries; // if RTY response, then this is the number of retries before ACK
 
 
 
reg          wbm_working; // tasks wbm_write and wbm_read set signal when working and reset it when stop working
 
 
 
 
initial
initial
begin
begin
  wait(StartTB);  // Start of testbench
  wait(StartTB);  // Start of testbench
 
 
  // Initial global values
  // Initial global values
  tests_successfull = 0;
  tests_successfull = 0;
  tests_failed = 0;
  tests_failed = 0;
 
 
 
  wbm_working = 0;
 
 
  wbm_init_waits = 4'h1;
  wbm_init_waits = 4'h1;
  wbm_subseq_waits = 4'h3;
  wbm_subseq_waits = 4'h3;
  wbs_waits = 4'h1;
  wbs_waits = 4'h1;
  wbs_retries = 8'h2;
  wbs_retries = 8'h2;
  wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
  wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
 
  // set DIFFERENT mrx_clk to mtx_clk!
 
//  eth_phy.set_mrx_equal_mtx = 1'b0;
 
 
  //  Call tests
  //  Call tests
  //  ----------
  //  ----------
//    test_access_to_mac_reg(0, 3);           // 0 - 3
//    test_access_to_mac_reg(0, 0);           // 0 - 3
//    test_mii(0, 17);                        // 0 - 17
//    test_mii(0, 17);                        // 0 - 17
  test_note("PHY generates ideal Carrier sense and Collision signals for following tests");
  test_note("PHY generates ideal Carrier sense and Collision signals for following tests");
  eth_phy.carrier_sense_real_delay(0);
  eth_phy.carrier_sense_real_delay(0);
//    test_mac_full_duplex_transmit(8, 9);    // 0 - (21)
//    test_mac_full_duplex_transmit(0, 23);    // 0 - (21)
//    test_mac_full_duplex_receive(8, 9);
    test_mac_full_duplex_transmit(8, 8);    // 0 - (21)
    test_mac_full_duplex_flow_control(0, 2);  // 0 - 2
//    test_mac_full_duplex_receive(0, 13);     // 0 - 13
 
//    test_mac_full_duplex_flow_control(0, 4);  // 0 - 5   What 5 stands for ?
 
                                              // 4 is executed, everything is OK
 
//    test_mac_half_duplex_flow(0, 0);
 
 
  test_note("PHY generates 'real delayed' Carrier sense and Collision signals for following tests");
  test_note("PHY generates 'real delayed' Carrier sense and Collision signals for following tests");
  eth_phy.carrier_sense_real_delay(1);
  eth_phy.carrier_sense_real_delay(1);
 
 
 
 
Line 514... Line 527...
fail = 0;
fail = 0;
 
 
// reset MAC registers
// reset MAC registers
hard_reset;
hard_reset;
// reset MAC and MII LOGIC with soft reset
// reset MAC and MII LOGIC with soft reset
reset_mac;
//reset_mac;
reset_mii;
//reset_mii;
 
 
 
 
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
////                                                              ////
////                                                              ////
////  test_access_to_mac_reg:                                     ////
////  test_access_to_mac_reg:                                     ////
Line 704... Line 717...
                if ( (addr == `ETH_MIICOMMAND) && (i_data <= 2) ) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
                if ( (addr == `ETH_MIICOMMAND) && (i_data <= 2) ) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
                  ;
                  ;
                else
                else
                  begin
                  begin
                    wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                    wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
                    wait (wbm_working == 0);
                    wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                    wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
                    if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
                         ((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
                      begin
                      begin
                        if (tmp_data !== data)
                        if (tmp_data !== data)
Line 983... Line 997...
        endcase
        endcase
 
 
        wbm_init_waits = {$random} % 3;
        wbm_init_waits = {$random} % 3;
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
        wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
        if (i == 0)
        if (i == 0)
 
        begin
          wbm_write(addr, ~data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          wbm_write(addr, ~data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        end
        else if (i == 2)
        else if (i == 2)
 
        begin
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        end
        else if ((i == 1) || (i == 4))
        else if ((i == 1) || (i == 4))
        begin
        begin
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          if (tmp_data !== data)
          if (tmp_data !== data)
          begin
          begin
Line 1079... Line 1097...
    $display("  TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC");
    $display("  TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset LOGIC with soft reset
    // reset LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    for (i = 0; i <= 3; i = i + 1) // 0, 2 - WRITE; 1, 3 - READ
    for (i = 0; i <= 3; i = i + 1) // 0, 2 - WRITE; 1, 3 - READ
    begin
    begin
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
      for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
      begin
      begin
        addr = `ETH_BASE + i_addr;
        addr = `ETH_BASE + i_addr;
Line 1116... Line 1134...
      if ((i == 0) || (i == 2))
      if ((i == 0) || (i == 2))
      begin
      begin
        // reset MAC registers
        // reset MAC registers
        hard_reset;
        hard_reset;
        // reset LOGIC with soft reset
        // reset LOGIC with soft reset
        reset_mac;
//        reset_mac;
        reset_mii;
//        reset_mii;
      end
      end
    end
    end
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
    else
    else
Line 1405... Line 1423...
fail = 0;
fail = 0;
 
 
// reset MAC registers
// reset MAC registers
hard_reset;
hard_reset;
// reset MAC and MII LOGIC with soft reset
// reset MAC and MII LOGIC with soft reset
reset_mac;
//reset_mac;
reset_mii;
//reset_mii;
 
 
 
 
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
////                                                              ////
////                                                              ////
////  test_mii:                                                   ////
////  test_mii:                                                   ////
Line 1549... Line 1567...
    begin
    begin
      // read request
      // read request
      #Tp mii_read_req(phy_addr, reg_addr);
      #Tp mii_read_req(phy_addr, reg_addr);
      check_mii_busy; // wait for read to finish
      check_mii_busy; // wait for read to finish
      // read data
      // read data
      #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if (phy_data !== 16'hDEAD)
      if (phy_data !== 16'hDEAD)
      begin
      begin
        test_fail("Wrong data was read from PHY from 'not used' address space");
        test_fail("Wrong data was read from PHY from 'not used' address space");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
Line 1567... Line 1585...
    reg_addr = 5'h3;
    reg_addr = 5'h3;
    // read request
    // read request
    #Tp mii_read_req(phy_addr, reg_addr);
    #Tp mii_read_req(phy_addr, reg_addr);
    check_mii_busy; // wait for read to finish
    check_mii_busy; // wait for read to finish
    // read data
    // read data
    #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if (phy_data !== {`PHY_ID2, `MAN_MODEL_NUM, `MAN_REVISION_NUM})
    if (phy_data !== {`PHY_ID2, `MAN_MODEL_NUM, `MAN_REVISION_NUM})
    begin
    begin
      test_fail("Wrong data was read from PHY from ID register 2");
      test_fail("Wrong data was read from PHY from ID register 2");
      fail = fail + 1;
      fail = fail + 1;
    end
    end
Line 1601... Line 1619...
    check_mii_busy; // wait for write to finish
    check_mii_busy; // wait for write to finish
    // read request
    // read request
    #Tp mii_read_req(phy_addr, reg_addr);
    #Tp mii_read_req(phy_addr, reg_addr);
    check_mii_busy; // wait for read to finish
    check_mii_busy; // wait for read to finish
    // read data
    // read data
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if (tmp_data !== phy_data)
    if (tmp_data !== phy_data)
    begin
    begin
      test_fail("Data was written into unwritable PHY register - ID register 2");
      test_fail("Data was written into unwritable PHY register - ID register 2");
      fail = fail + 1;
      fail = fail + 1;
    end
    end
Line 1614... Line 1632...
    reg_addr = 5'h0; // control register
    reg_addr = 5'h0; // control register
    // read request
    // read request
    #Tp mii_read_req(phy_addr, reg_addr);
    #Tp mii_read_req(phy_addr, reg_addr);
    check_mii_busy; // wait for read to finish
    check_mii_busy; // wait for read to finish
    // read data
    // read data
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // write request
    // write request
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
    phy_data = 16'h7DFF; // bit 15 (RESET bit) and bit 9 are self clearing bits
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
    #Tp mii_write_req(phy_addr, reg_addr, phy_data);
    check_mii_busy; // wait for write to finish
    check_mii_busy; // wait for write to finish
    // read request
    // read request
    #Tp mii_read_req(phy_addr, reg_addr);
    #Tp mii_read_req(phy_addr, reg_addr);
    check_mii_busy; // wait for read to finish
    check_mii_busy; // wait for read to finish
    // read data
    // read data
    #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if (phy_data !== 16'h7DFF)
    if (phy_data !== 16'h7DFF)
    begin
    begin
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
      fail = fail + 1;
      fail = fail + 1;
    end
    end
Line 1636... Line 1654...
    check_mii_busy; // wait for write to finish
    check_mii_busy; // wait for write to finish
    // read request
    // read request
    #Tp mii_read_req(phy_addr, reg_addr);
    #Tp mii_read_req(phy_addr, reg_addr);
    check_mii_busy; // wait for read to finish
    check_mii_busy; // wait for read to finish
    // read data
    // read data
    #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if (phy_data !== tmp_data)
    if (phy_data !== tmp_data)
    begin
    begin
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
      fail = fail + 1;
      fail = fail + 1;
    end
    end
Line 1670... Line 1688...
    check_mii_busy; // wait for write to finish
    check_mii_busy; // wait for write to finish
    // read request
    // read request
    #Tp mii_read_req(phy_addr, reg_addr);
    #Tp mii_read_req(phy_addr, reg_addr);
    check_mii_busy; // wait for read to finish
    check_mii_busy; // wait for read to finish
    // read data
    // read data
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if (phy_data !== tmp_data)
    if (phy_data !== tmp_data)
    begin
    begin
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
      test_fail("Data was not correctly written into OR read from writable PHY register - control register");
      fail = fail + 1;
      fail = fail + 1;
    end
    end
Line 1685... Line 1703...
    check_mii_busy; // wait for write to finish
    check_mii_busy; // wait for write to finish
    // read request
    // read request
    #Tp mii_read_req(phy_addr, reg_addr);
    #Tp mii_read_req(phy_addr, reg_addr);
    check_mii_busy; // wait for read to finish
    check_mii_busy; // wait for read to finish
    // read data
    // read data
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // check self clearing of reset bit
    // check self clearing of reset bit
    if (tmp_data[15] !== 1'b0)
    if (tmp_data[15] !== 1'b0)
    begin
    begin
      test_fail("Reset bit should be self cleared - control register");
      test_fail("Reset bit should be self cleared - control register");
      fail = fail + 1;
      fail = fail + 1;
Line 1738... Line 1756...
        check_mii_busy; // wait for write to finish
        check_mii_busy; // wait for write to finish
        // read request
        // read request
        #Tp mii_read_req(phy_addr, reg_addr);
        #Tp mii_read_req(phy_addr, reg_addr);
        check_mii_busy; // wait for read to finish
        check_mii_busy; // wait for read to finish
        // read data
        // read data
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        #Tp;
        #Tp;
        if (phy_data !== tmp_data)
        if (phy_data !== tmp_data)
        begin
        begin
          if (i)
          if (i)
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
Line 1797... Line 1815...
        check_mii_busy; // wait for write to finish
        check_mii_busy; // wait for write to finish
        // read request
        // read request
        #Tp mii_read_req(phy_addr, reg_addr);
        #Tp mii_read_req(phy_addr, reg_addr);
        check_mii_busy; // wait for read to finish
        check_mii_busy; // wait for read to finish
        // read data
        // read data
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        #Tp;
        #Tp;
        if (phy_data !== tmp_data)
        if (phy_data !== tmp_data)
        begin
        begin
          if (i)
          if (i)
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
Line 1856... Line 1874...
        check_mii_busy; // wait for write to finish
        check_mii_busy; // wait for write to finish
        // read request
        // read request
        #Tp mii_read_req(phy_addr, reg_addr);
        #Tp mii_read_req(phy_addr, reg_addr);
        check_mii_busy; // wait for read to finish
        check_mii_busy; // wait for read to finish
        // read data
        // read data
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        #Tp;
        #Tp;
        if (phy_data !== tmp_data)
        if (phy_data !== tmp_data)
        begin
        begin
          if (i)
          if (i)
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
            test_fail("Data was not correctly written into OR read from test registers (without preamble)");
Line 1900... Line 1918...
    // read request
    // read request
    #Tp mii_read_req(phy_addr, reg_addr);
    #Tp mii_read_req(phy_addr, reg_addr);
    check_mii_busy; // wait for read to finish
    check_mii_busy; // wait for read to finish
    // read data
    // read data
    $display("  => Two errors will be displayed from WB Bus Monitor, because correct HIGH Z data was read");
    $display("  => Two errors will be displayed from WB Bus Monitor, because correct HIGH Z data was read");
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if (tmp_data !== 16'hzzzz)
    if (tmp_data !== 16'hzzzz)
    begin
    begin
      test_fail("Data was read from PHY register with wrong PHY address - control register");
      test_fail("Data was read from PHY register with wrong PHY address - control register");
      fail = fail + 1;
      fail = fail + 1;
    end
    end
Line 1938... Line 1956...
    phy_addr = 5'h1; // correct PHY address
    phy_addr = 5'h1; // correct PHY address
    // read request
    // read request
    #Tp mii_read_req(phy_addr, reg_addr);
    #Tp mii_read_req(phy_addr, reg_addr);
    check_mii_busy; // wait for read to finish
    check_mii_busy; // wait for read to finish
    // read data
    // read data
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if (phy_data === tmp_data)
    if (phy_data === tmp_data)
    begin
    begin
      test_fail("Data was written into PHY register with wrong PHY address - control register");
      test_fail("Data was written into PHY register with wrong PHY address - control register");
      fail = fail + 1;
      fail = fail + 1;
    end
    end
Line 2043... Line 2061...
            @(posedge Mdc_O);
            @(posedge Mdc_O);
            // read request
            // read request
            #Tp mii_read_req(phy_addr, reg_addr);
            #Tp mii_read_req(phy_addr, reg_addr);
            check_mii_busy; // wait for read to finish
            check_mii_busy; // wait for read to finish
            // read and check data
            // read and check data
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            if (phy_data !== tmp_data)
            if (phy_data !== tmp_data)
            begin
            begin
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              fail = fail + 1;
              fail = fail + 1;
            end
            end
Line 2065... Line 2083...
              #Tp cnt = cnt + 1;
              #Tp cnt = cnt + 1;
            end
            end
            @(posedge Mdc_O);
            @(posedge Mdc_O);
            check_mii_busy; // wait for read to finish
            check_mii_busy; // wait for read to finish
            // read and check data
            // read and check data
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            if (phy_data !== tmp_data)
            if (phy_data !== tmp_data)
            begin
            begin
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              fail = fail + 1;
              fail = fail + 1;
            end
            end
Line 2223... Line 2241...
            @(posedge Mdc_O);
            @(posedge Mdc_O);
            // read request
            // read request
            #Tp mii_read_req(phy_addr, reg_addr);
            #Tp mii_read_req(phy_addr, reg_addr);
            check_mii_busy; // wait for read to finish
            check_mii_busy; // wait for read to finish
            // read and check data
            // read and check data
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            if (phy_data !== tmp_data)
            if (phy_data !== tmp_data)
            begin
            begin
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              fail = fail + 1;
              fail = fail + 1;
            end
            end
Line 2245... Line 2263...
              #Tp cnt = cnt + 1;
              #Tp cnt = cnt + 1;
            end
            end
            @(posedge Mdc_O);
            @(posedge Mdc_O);
            check_mii_busy; // wait for read to finish
            check_mii_busy; // wait for read to finish
            // read and check data
            // read and check data
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            wbm_read(`ETH_MIIRX_DATA, tmp_data , 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            if (phy_data !== tmp_data)
            if (phy_data !== tmp_data)
            begin
            begin
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              fail = fail + 1;
              fail = fail + 1;
            end
            end
Line 2342... Line 2360...
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      @(posedge Mdc_O);
      @(posedge Mdc_O);
      // write request
      // write request
      #Tp mii_write_req(phy_addr, reg_addr, 16'h5A5A);
      #Tp mii_write_req(phy_addr, reg_addr, 16'h5A5A);
      // read data from MII status register - Busy and Nvalid bits
      // read data from MII status register - Busy and Nvalid bits
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
      // check MII IO signal and Busy and Nvalid bits
      // check MII IO signal and Busy and Nvalid bits
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
      begin
      begin
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
Line 2385... Line 2403...
      else
      else
      begin
      begin
        repeat(64) @(posedge Mdc_O);
        repeat(64) @(posedge Mdc_O);
      end
      end
      // read data from MII status register - Busy and Nvalid bits
      // read data from MII status register - Busy and Nvalid bits
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
      // check MII IO signal and Busy and Nvalid bits
      // check MII IO signal and Busy and Nvalid bits
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
      begin
      begin
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
Line 2419... Line 2437...
      end
      end
 
 
      // wait for next negative clock edge
      // wait for next negative clock edge
      @(negedge Mdc_O);
      @(negedge Mdc_O);
      // read data from MII status register - Busy and Nvalid bits
      // read data from MII status register - Busy and Nvalid bits
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
      // check MII IO signal and Busy and Nvalid bits
      // check MII IO signal and Busy and Nvalid bits
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
      begin
      begin
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
Line 2457... Line 2475...
      while (i1 <= 2)
      while (i1 <= 2)
      begin
      begin
        // wait for next positive clock edge
        // wait for next positive clock edge
        @(posedge Mdc_O);
        @(posedge Mdc_O);
        // read data from MII status register - Busy and Nvalid bits
        // read data from MII status register - Busy and Nvalid bits
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
        // check MII IO signal and Busy and Nvalid bits
        // check MII IO signal and Busy and Nvalid bits
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
        begin
        begin
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
Line 2540... Line 2558...
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      @(posedge Mdc_O);
      @(posedge Mdc_O);
      // read request
      // read request
      #Tp mii_read_req(phy_addr, reg_addr);
      #Tp mii_read_req(phy_addr, reg_addr);
      // read data from MII status register - Busy and Nvalid bits
      // read data from MII status register - Busy and Nvalid bits
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
      // check MII IO signal and Busy and Nvalid bits
      // check MII IO signal and Busy and Nvalid bits
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
      begin
      begin
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
Line 2585... Line 2603...
        repeat(63) @(posedge Mdc_O);
        repeat(63) @(posedge Mdc_O);
      end
      end
      // wait for next negative clock edge
      // wait for next negative clock edge
      @(negedge Mdc_O);
      @(negedge Mdc_O);
      // read data from MII status register - Busy and Nvalid bits
      // read data from MII status register - Busy and Nvalid bits
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
      // check MII IO signal and Busy and Nvalid bits
      // check MII IO signal and Busy and Nvalid bits
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
      begin
      begin
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
Line 2619... Line 2637...
      end
      end
 
 
      // wait for next positive clock edge
      // wait for next positive clock edge
      @(posedge Mdc_O);
      @(posedge Mdc_O);
      // read data from MII status register - Busy and Nvalid bits
      // read data from MII status register - Busy and Nvalid bits
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
      // check MII IO signal and Busy and Nvalid bits
      // check MII IO signal and Busy and Nvalid bits
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
      begin
      begin
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
Line 2657... Line 2675...
      while (i1 <= 2)
      while (i1 <= 2)
      begin
      begin
        // wait for next positive clock edge
        // wait for next positive clock edge
        @(posedge Mdc_O);
        @(posedge Mdc_O);
        // read data from MII status register - Busy and Nvalid bits
        // read data from MII status register - Busy and Nvalid bits
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
        // check MII IO signal and Busy and Nvalid bits
        // check MII IO signal and Busy and Nvalid bits
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
        begin
        begin
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
Line 2740... Line 2758...
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      @(posedge Mdc_O);
      @(posedge Mdc_O);
      // scan request
      // scan request
      #Tp mii_scan_req(phy_addr, reg_addr);
      #Tp mii_scan_req(phy_addr, reg_addr);
      // read data from MII status register - Busy and Nvalid bits
      // read data from MII status register - Busy and Nvalid bits
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
      // check MII IO signal and Busy and Nvalid bits
      // check MII IO signal and Busy and Nvalid bits
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
      begin
      begin
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
        test_fail("Testbench error - read was to late, Mdio_IO is not HIGH Z - set higher clock divider");
Line 2788... Line 2806...
      #Tp mii_scan_finish; // finish scan operation
      #Tp mii_scan_finish; // finish scan operation
 
 
      // wait for next positive clock edge
      // wait for next positive clock edge
      repeat(10) @(posedge Mdc_O);
      repeat(10) @(posedge Mdc_O);
      // read data from MII status register - Busy and Nvalid bits
      // read data from MII status register - Busy and Nvalid bits
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
      // check MII IO signal and Busy and Nvalid bits
      // check MII IO signal and Busy and Nvalid bits
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
      begin
      begin
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
Line 2818... Line 2836...
      end
      end
 
 
      // wait for next negative clock edge
      // wait for next negative clock edge
      @(negedge Mdc_O);
      @(negedge Mdc_O);
      // read data from MII status register - Busy and Nvalid bits
      // read data from MII status register - Busy and Nvalid bits
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
      // check MII IO signal and Busy and Nvalid bits
      // check MII IO signal and Busy and Nvalid bits
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
      if (Mdio_IO === 1'bz) // Mdio_IO should not be HIGH Z here - testbench selfcheck
      begin
      begin
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
        test_fail("Testbench error - read was to late, Mdio_IO is HIGH Z - set higher clock divider");
Line 2848... Line 2866...
      end
      end
 
 
      // wait for next negative clock edge
      // wait for next negative clock edge
      @(posedge Mdc_O);
      @(posedge Mdc_O);
      // read data from MII status register - Busy and Nvalid bits
      // read data from MII status register - Busy and Nvalid bits
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
      // check MII IO signal and Busy and Nvalid bits
      // check MII IO signal and Busy and Nvalid bits
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
      if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
      begin
      begin
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
        test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
Line 2889... Line 2907...
      while ((i1 <= 2) || (i2 == 0))
      while ((i1 <= 2) || (i2 == 0))
      begin
      begin
        // wait for next positive clock edge
        // wait for next positive clock edge
        @(posedge Mdc_O);
        @(posedge Mdc_O);
        // read data from MII status register - Busy and Nvalid bits
        // read data from MII status register - Busy and Nvalid bits
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
        // check MII IO signal and Busy and Nvalid bits
        // check MII IO signal and Busy and Nvalid bits
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
        if (Mdio_IO !== 1'bz) // Mdio_IO should be HIGH Z here - testbench selfcheck
        begin
        begin
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
          test_fail("Testbench error - read was to early, Mdio_IO is not HIGH Z - set higher clock divider");
Line 2982... Line 3000...
 
 
    // read request
    // read request
    #Tp mii_read_req(phy_addr, reg_addr);
    #Tp mii_read_req(phy_addr, reg_addr);
    check_mii_busy; // wait for read to finish
    check_mii_busy; // wait for read to finish
    // read data from PHY status register - remember LINK-UP status
    // read data from PHY status register - remember LINK-UP status
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    for (i = 0; i <= 1; i = i + 1)
    for (i = 0; i <= 1; i = i + 1)
    begin
    begin
      #Tp eth_phy.preamble_suppresed(i);
      #Tp eth_phy.preamble_suppresed(i);
      // MII mode register
      // MII mode register
Line 3004... Line 3022...
 
 
      fork
      fork
      begin
      begin
        repeat(2) @(posedge Mdc_O);
        repeat(2) @(posedge Mdc_O);
        // read data from PHY status register
        // read data from PHY status register
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        if (phy_data !== tmp_data)
        if (phy_data !== tmp_data)
        begin
        begin
          test_fail("Data was not correctly scaned from status register");
          test_fail("Data was not correctly scaned from status register");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // read data from MII status register
        // read data from MII status register
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        if (phy_data[0] !== 1'b0)
        if (phy_data[0] !== 1'b0)
        begin
        begin
          test_fail("Link FAIL bit was set in the MII status register");
          test_fail("Link FAIL bit was set in the MII status register");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
Line 3055... Line 3073...
      begin
      begin
        fork
        fork
        begin
        begin
          repeat(2) @(posedge Mdc_O);
          repeat(2) @(posedge Mdc_O);
          // read data from PHY status register
          // read data from PHY status register
          #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          if (phy_data !== tmp_data)
          if (phy_data !== tmp_data)
          begin
          begin
            test_fail("Data was not correctly scaned from status register");
            test_fail("Data was not correctly scaned from status register");
            fail = fail + 1;
            fail = fail + 1;
          end
          end
          // read data from MII status register
          // read data from MII status register
          #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          if (phy_data[0] !== 1'b0)
          if (phy_data[0] !== 1'b0)
          begin
          begin
            test_fail("Link FAIL bit was set in the MII status register");
            test_fail("Link FAIL bit was set in the MII status register");
            fail = fail + 1;
            fail = fail + 1;
          end
          end
Line 3113... Line 3131...
 
 
      fork
      fork
      begin
      begin
        repeat(2) @(posedge Mdc_O);
        repeat(2) @(posedge Mdc_O);
        // read data from PHY status register
        // read data from PHY status register
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        if (phy_data !== tmp_data)
        if (phy_data !== tmp_data)
        begin
        begin
          test_fail("Data was not correctly scaned from status register");
          test_fail("Data was not correctly scaned from status register");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // read data from MII status register
        // read data from MII status register
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        if (phy_data[0] === 1'b0)
        if (phy_data[0] === 1'b0)
        begin
        begin
          test_fail("Link FAIL bit was not set in the MII status register");
          test_fail("Link FAIL bit was not set in the MII status register");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // wait to see if data stayed latched
        // wait to see if data stayed latched
        repeat(4) @(posedge Mdc_O);
        repeat(4) @(posedge Mdc_O);
        // read data from PHY status register
        // read data from PHY status register
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        if (phy_data !== tmp_data)
        if (phy_data !== tmp_data)
        begin
        begin
          test_fail("Data was not latched correctly in status register");
          test_fail("Data was not latched correctly in status register");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // read data from MII status register
        // read data from MII status register
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        if (phy_data[0] === 1'b0)
        if (phy_data[0] === 1'b0)
        begin
        begin
          test_fail("Link FAIL bit was not set in the MII status register");
          test_fail("Link FAIL bit was not set in the MII status register");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
Line 3162... Line 3180...
      end
      end
      join
      join
 
 
      @(posedge Mdc_O);
      @(posedge Mdc_O);
      // read data from PHY status register
      // read data from PHY status register
      #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if (phy_data !== tmp_data)
      if (phy_data !== tmp_data)
      begin
      begin
        test_fail("Data was not correctly scaned from status register");
        test_fail("Data was not correctly scaned from status register");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // read data from MII status register
      // read data from MII status register
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if (phy_data[0] !== 1'b0)
      if (phy_data[0] !== 1'b0)
      begin
      begin
        test_fail("Link FAIL bit was set in the MII status register");
        test_fail("Link FAIL bit was set in the MII status register");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // wait to see if data stayed latched
      // wait to see if data stayed latched
      repeat(4) @(posedge Mdc_O);
      repeat(4) @(posedge Mdc_O);
      // read data from PHY status register
      // read data from PHY status register
      #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if (phy_data !== tmp_data)
      if (phy_data !== tmp_data)
      begin
      begin
        test_fail("Data was not correctly scaned from status register");
        test_fail("Data was not correctly scaned from status register");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // read data from MII status register
      // read data from MII status register
      #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if (phy_data[0] !== 1'b0)
      if (phy_data[0] !== 1'b0)
      begin
      begin
        test_fail("Link FAIL bit was set in the MII status register");
        test_fail("Link FAIL bit was set in the MII status register");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
Line 3227... Line 3245...
 
 
    // read request
    // read request
    #Tp mii_read_req(phy_addr, reg_addr);
    #Tp mii_read_req(phy_addr, reg_addr);
    check_mii_busy; // wait for read to finish
    check_mii_busy; // wait for read to finish
    // read data from PHY status register - remember LINK-UP status
    // read data from PHY status register - remember LINK-UP status
    #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
    for (i2 = 0; i2 <= 1; i2 = i2 + 1) // choose preamble or not
    begin
    begin
      #Tp eth_phy.preamble_suppresed(i2);
      #Tp eth_phy.preamble_suppresed(i2);
      // MII mode register
      // MII mode register
Line 3255... Line 3273...
        // check second scan
        // check second scan
        fork
        fork
        begin
        begin
          repeat(4) @(posedge Mdc_O);
          repeat(4) @(posedge Mdc_O);
          // read data from PHY status register
          // read data from PHY status register
          #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          if (phy_data !== tmp_data)
          if (phy_data !== tmp_data)
          begin
          begin
            test_fail("Second data was not correctly scaned from status register");
            test_fail("Second data was not correctly scaned from status register");
            fail = fail + 1;
            fail = fail + 1;
          end
          end
          // read data from MII status register
          // read data from MII status register
          #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          if (phy_data[0] !== 1'b0)
          if (phy_data[0] !== 1'b0)
          begin
          begin
            test_fail("Link FAIL bit was set in the MII status register");
            test_fail("Link FAIL bit was set in the MII status register");
            fail = fail + 1;
            fail = fail + 1;
          end
          end
Line 3317... Line 3335...
              wait (cnt == 32);
              wait (cnt == 32);
            else // with preamble
            else // with preamble
              wait (cnt == 64);
              wait (cnt == 64);
            repeat(3) @(posedge Mdc_O);
            repeat(3) @(posedge Mdc_O);
            // read data from PHY status register
            // read data from PHY status register
            #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
            begin
            begin
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
              if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
              begin
              begin
                test_fail("Third data was not correctly scaned from status register");
                test_fail("Third data was not correctly scaned from status register");
Line 3335... Line 3353...
                test_fail("Third data was not correctly scaned from status register");
                test_fail("Third data was not correctly scaned from status register");
                fail = fail + 1;
                fail = fail + 1;
              end
              end
            end
            end
            // read data from MII status register
            // read data from MII status register
            #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
            begin
            begin
              if (phy_data[0] === 1'b0)
              if (phy_data[0] === 1'b0)
              begin
              begin
                test_fail("Link FAIL bit was not set in the MII status register");
                test_fail("Link FAIL bit was not set in the MII status register");
Line 3393... Line 3411...
        // check fifth scan and data from fourth scan
        // check fifth scan and data from fourth scan
        fork
        fork
        begin
        begin
          repeat(2) @(posedge Mdc_O);
          repeat(2) @(posedge Mdc_O);
          // read data from PHY status register
          // read data from PHY status register
          #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
          if (phy_data !== (tmp_data & 16'hFFFB)) // bit 3 is ZERO
          begin
          begin
            test_fail("4. data was not correctly scaned from status register");
            test_fail("4. data was not correctly scaned from status register");
            fail = fail + 1;
            fail = fail + 1;
          end
          end
          // read data from MII status register
          // read data from MII status register
          #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
          if (phy_data[0] === 1'b0)
          if (phy_data[0] === 1'b0)
          begin
          begin
            test_fail("Link FAIL bit was not set in the MII status register");
            test_fail("Link FAIL bit was not set in the MII status register");
            fail = fail + 1;
            fail = fail + 1;
          end
          end
Line 3456... Line 3474...
              wait (cnt == 32);
              wait (cnt == 32);
            else // with preamble
            else // with preamble
              wait (cnt == 64);
              wait (cnt == 64);
            repeat(3) @(posedge Mdc_O);
            repeat(3) @(posedge Mdc_O);
            // read data from PHY status register
            // read data from PHY status register
            #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
            begin
            begin
              if (phy_data !== tmp_data)
              if (phy_data !== tmp_data)
              begin
              begin
                test_fail("6. data was not correctly scaned from status register");
                test_fail("6. data was not correctly scaned from status register");
Line 3474... Line 3492...
                test_fail("6. data was not correctly scaned from status register");
                test_fail("6. data was not correctly scaned from status register");
                fail = fail + 1;
                fail = fail + 1;
              end
              end
            end
            end
            // read data from MII status register
            // read data from MII status register
            #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
            if ( ((i < 49) && !i2) || ((i < 17) && i2) )
            begin
            begin
              if (phy_data[0] !== 1'b0)
              if (phy_data[0] !== 1'b0)
              begin
              begin
                test_fail("Link FAIL bit was set in the MII status register");
                test_fail("Link FAIL bit was set in the MII status register");
Line 3528... Line 3546...
          end
          end
        join
        join
        // check last scan 
        // check last scan 
        repeat(4) @(posedge Mdc_O);
        repeat(4) @(posedge Mdc_O);
        // read data from PHY status register
        // read data from PHY status register
        #Tp wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIIRX_DATA, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        if (phy_data !== tmp_data)
        if (phy_data !== tmp_data)
        begin
        begin
          test_fail("7. data was not correctly scaned from status register");
          test_fail("7. data was not correctly scaned from status register");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // read data from MII status register
        // read data from MII status register
        #Tp wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_MIISTATUS, phy_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        if (phy_data[0] !== 1'b0)
        if (phy_data[0] !== 1'b0)
        begin
        begin
          test_fail("Link FAIL bit was set in the MII status register");
          test_fail("Link FAIL bit was set in the MII status register");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
Line 3707... Line 3725...
            @(posedge Mdc_O);
            @(posedge Mdc_O);
            // read request
            // read request
            #Tp mii_read_req(phy_addr, reg_addr);
            #Tp mii_read_req(phy_addr, reg_addr);
            check_mii_busy; // wait for read to finish
            check_mii_busy; // wait for read to finish
            // read and check data
            // read and check data
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            if (phy_data !== tmp_data)
            if (phy_data !== tmp_data)
            begin
            begin
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              fail = fail + 1;
              fail = fail + 1;
            end
            end
Line 3729... Line 3747...
              #Tp cnt = cnt + 1;
              #Tp cnt = cnt + 1;
            end
            end
            @(posedge Mdc_O);
            @(posedge Mdc_O);
            check_mii_busy; // wait for read to finish
            check_mii_busy; // wait for read to finish
            // read and check data
            // read and check data
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            if (phy_data !== tmp_data)
            if (phy_data !== tmp_data)
            begin
            begin
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              fail = fail + 1;
              fail = fail + 1;
            end
            end
Line 3972... Line 3990...
            @(posedge Mdc_O);
            @(posedge Mdc_O);
            // read request
            // read request
            #Tp mii_read_req(phy_addr, reg_addr);
            #Tp mii_read_req(phy_addr, reg_addr);
            check_mii_busy; // wait for read to finish
            check_mii_busy; // wait for read to finish
            // read and check data
            // read and check data
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            if (phy_data !== tmp_data)
            if (phy_data !== tmp_data)
            begin
            begin
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              fail = fail + 1;
              fail = fail + 1;
            end
            end
Line 3994... Line 4012...
              #Tp cnt = cnt + 1;
              #Tp cnt = cnt + 1;
            end
            end
            @(posedge Mdc_O);
            @(posedge Mdc_O);
            check_mii_busy; // wait for read to finish
            check_mii_busy; // wait for read to finish
            // read and check data
            // read and check data
            #Tp wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
            if (phy_data !== tmp_data)
            if (phy_data !== tmp_data)
            begin
            begin
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              test_fail("Data was not correctly written into OR read from PHY register - control register");
              fail = fail + 1;
              fail = fail + 1;
            end
            end
Line 4101... Line 4119...
  reg    [31:0]  data;
  reg    [31:0]  data;
  reg    [31:0]  tmp;
  reg    [31:0]  tmp;
  reg    [ 7:0]  st_data;
  reg    [ 7:0]  st_data;
  reg    [15:0]  max_tmp;
  reg    [15:0]  max_tmp;
  reg    [15:0]  min_tmp;
  reg    [15:0]  min_tmp;
 
  integer        a, b, c;
begin
begin
// MAC FULL DUPLEX TRANSMIT TEST
// MAC FULL DUPLEX TRANSMIT TEST
test_heading("MAC FULL DUPLEX TRANSMIT TEST");
test_heading("MAC FULL DUPLEX TRANSMIT TEST");
$display(" ");
$display(" ");
$display("MAC FULL DUPLEX TRANSMIT TEST");
$display("MAC FULL DUPLEX TRANSMIT TEST");
fail = 0;
fail = 0;
 
 
// reset MAC registers
// reset MAC registers
hard_reset;
hard_reset;
// reset MAC and MII LOGIC with soft reset
// reset MAC and MII LOGIC with soft reset
reset_mac;
//reset_mac;
reset_mii;
//reset_mii;
// set wb slave response
// set wb slave response
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
  /*
  /*
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
Line 4200... Line 4219...
 
 
    // unmask interrupts
    // unmask interrupts
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // set all buffer descriptors to RX - must be set before TX enable
    // set all buffer descriptors to RX - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, padding and CRC appending
    // enable TX, set full-duplex mode, padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    // write to phy's control register for 10Mbps
    // write to phy's control register for 10Mbps
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
Line 4250... Line 4271...
          fail = fail + 1;
          fail = fail + 1;
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
        end
        end
        @(posedge wb_clk);
        @(posedge wb_clk);
      end
      end
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if (tmp[6:0] !== 0)
      if (tmp[6:0] !== 0)
      begin
      begin
        test_fail("Tramsmit should not get INT since it should not start at all");
        test_fail("Tramsmit should not get INT since it should not start at all");
        fail = fail + 1;
        fail = fail + 1;
Line 4264... Line 4286...
        i = i + 1;
        i = i + 1;
      else
      else
        i = i + 120;
        i = i + 120;
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
    else
    else
Line 4285... Line 4308...
    // TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )
    // TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )
    test_name   = "TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )";
    test_name   = "TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )";
    `TIME; $display("  TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )");
    `TIME; $display("  TEST 1: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 100Mbps )");
 
 
    // unmask interrupts
    // unmask interrupts
 
    wait (wbm_working == 0);
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // set all buffer descriptors to RX - must be set before TX enable
    // set all buffer descriptors to RX - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, padding and CRC appending
    // enable TX, set full-duplex mode, padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    // write to phy's control register for 100Mbps
    // write to phy's control register for 100Mbps
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
Line 4338... Line 4364...
          fail = fail + 1;
          fail = fail + 1;
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
          `TIME; $display("*E Transmit of should not be finished since it should not start at all");
        end
        end
        @(posedge wb_clk);
        @(posedge wb_clk);
      end
      end
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if (tmp[6:0] !== 0)
      if (tmp[6:0] !== 0)
      begin
      begin
        test_fail("Tramsmit should not get INT since it should not start at all");
        test_fail("Tramsmit should not get INT since it should not start at all");
        fail = fail + 1;
        fail = fail + 1;
Line 4352... Line 4379...
        i = i + 1;
        i = i + 1;
      else
      else
        i = i + 120;
        i = i + 120;
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
    else
    else
Line 4376... Line 4404...
    `TIME; $display("  TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )");
    `TIME; $display("  TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )");
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    // set one TX buffer descriptor - must be set before TX enable
    // set one TX buffer descriptor - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, NO padding and CRC appending
    // enable TX, set full-duplex mode, NO padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h01;
    st_data = 8'h01;
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
Line 4410... Line 4441...
      2'h0: // Interrupt is generated
      2'h0: // Interrupt is generated
      begin
      begin
        // enable interrupt generation
        // enable interrupt generation
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
Line 4421... Line 4453...
      2'h1: // Interrupt is not generated
      2'h1: // Interrupt is not generated
      begin
      begin
        // enable interrupt generation
        // enable interrupt generation
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h2: // Interrupt is not generated
      2'h2: // Interrupt is not generated
      begin
      begin
        // disable interrupt generation
        // disable interrupt generation
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(1);
        eth_phy.collision(1);
Line 4442... Line 4476...
      default: // 2'h3: // Interrupt is not generated
      default: // 2'h3: // Interrupt is not generated
      begin
      begin
        // disable interrupt generation
        // disable interrupt generation
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
Line 4453... Line 4488...
      eth_phy.set_tx_mem_addr(max_tmp);
      eth_phy.set_tx_mem_addr(max_tmp);
      // set wrap bit
      // set wrap bit
      set_tx_bd_wrap(0);
      set_tx_bd_wrap(0);
      set_tx_bd_ready(0, 0);
      set_tx_bd_ready(0, 0);
      #1 check_tx_bd(0, data);
      #1 check_tx_bd(0, data);
 
 
 
 
      if (i_length < min_tmp) // just first four
      if (i_length < min_tmp) // just first four
      begin
      begin
        while (data[15] === 1)
        while (data[15] === 1)
        begin
        begin
          #1 check_tx_bd(0, data);
          #1 check_tx_bd(0, data);
Line 4496... Line 4533...
          #1 check_tx_bd(0, data);
          #1 check_tx_bd(0, data);
          @(posedge wb_clk);
          @(posedge wb_clk);
        end
        end
        repeat (1) @(posedge wb_clk);
        repeat (1) @(posedge wb_clk);
      end
      end
 
 
 
      repeat(5) @(posedge mtx_clk);  // Wait some time so PHY stores the CRC igor
 
 
      // check length of a PACKET
      // check length of a PACKET
      if (eth_phy.tx_len != (i_length + 4))
      if (eth_phy.tx_len != (i_length + 4))
      begin
      begin
        test_fail("Wrong length of the packet out from MAC");
        test_fail("Wrong length of the packet out from MAC");
        fail = fail + 1;
        fail = fail + 1;
Line 4521... Line 4561...
          test_fail("Wrong data of the transmitted packet");
          test_fail("Wrong data of the transmitted packet");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // check transmited TX packet CRC
        // check transmited TX packet CRC
        check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
        check_tx_crc(max_tmp, i_length, 1'b0, tmp); // length without CRC
 
 
        if (tmp > 0)
        if (tmp > 0)
        begin
        begin
          test_fail("Wrong CRC of the transmitted packet");
          test_fail("Wrong CRC of the transmitted packet");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
Line 4569... Line 4610...
        end
        end
      end
      end
      // clear TX buffer descriptor
      // clear TX buffer descriptor
      clear_tx_bd(0, 0);
      clear_tx_bd(0, 0);
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      begin
      begin
        if ((data & `ETH_INT_TXB) !== 1'b1)
        if ((data & `ETH_INT_TXB) !== 1'b1)
        begin
        begin
Line 4595... Line 4637...
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 4610... Line 4653...
        // starting length is min_tmp, ending length is (min_tmp + 64)
        // starting length is min_tmp, ending length is (min_tmp + 64)
        $display("    pads appending to packets is NOT selected");
        $display("    pads appending to packets is NOT selected");
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
                 min_tmp, (min_tmp + 64));
                 min_tmp, (min_tmp + 64));
        // set padding, remain the rest
        // set padding, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == (max_tmp - 16))
      else if ((i_length + 4) == (max_tmp - 16))
      begin
      begin
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
        $display("    pads appending to packets is selected");
        $display("    pads appending to packets is selected");
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
                 (min_tmp + 64 + 128), tmp_data);
                 (min_tmp + 64 + 128), tmp_data);
        // reset padding, remain the rest
        // reset padding, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == max_tmp)
      else if ((i_length + 4) == max_tmp)
      begin
      begin
Line 4648... Line 4693...
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
        #10 $stop;
        #10 $stop;
      end
      end
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
    else
    else
Line 4672... Line 4718...
    `TIME; $display("  TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )");
    `TIME; $display("  TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )");
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    // set one TX buffer descriptor - must be set before TX enable
    // set one TX buffer descriptor - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h1, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, NO padding and CRC appending
    // enable TX, set full-duplex mode, NO padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h5A;
    st_data = 8'h5A;
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
Line 4706... Line 4755...
      2'h0: // Interrupt is generated
      2'h0: // Interrupt is generated
      begin
      begin
        // enable interrupt generation
        // enable interrupt generation
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
Line 4717... Line 4767...
      2'h1: // Interrupt is not generated
      2'h1: // Interrupt is not generated
      begin
      begin
        // enable interrupt generation
        // enable interrupt generation
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h2: // Interrupt is not generated
      2'h2: // Interrupt is not generated
      begin
      begin
        // disable interrupt generation
        // disable interrupt generation
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, (`MEMORY_BASE + i_length[1:0]));
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(1);
        eth_phy.collision(1);
Line 4738... Line 4790...
      default: // 2'h3: // Interrupt is not generated
      default: // 2'h3: // Interrupt is not generated
      begin
      begin
        // disable interrupt generation
        // disable interrupt generation
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        set_tx_bd(0, 0, i_length, 1'b0, 1'b1, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
Line 4861... Line 4914...
        end
        end
      end
      end
      // clear TX buffer descriptor
      // clear TX buffer descriptor
      clear_tx_bd(0, 0);
      clear_tx_bd(0, 0);
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      begin
      begin
        if ((data & `ETH_INT_TXB) !== 1'b1)
        if ((data & `ETH_INT_TXB) !== 1'b1)
        begin
        begin
Line 4887... Line 4941...
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 4902... Line 4957...
        // starting length is min_tmp, ending length is (min_tmp + 64)
        // starting length is min_tmp, ending length is (min_tmp + 64)
        $display("    pads appending to packets is NOT selected");
        $display("    pads appending to packets is NOT selected");
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
                 min_tmp, (min_tmp + 64));
                 min_tmp, (min_tmp + 64));
        // set padding, remain the rest
        // set padding, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == (max_tmp - 16))
      else if ((i_length + 4) == (max_tmp - 16))
      begin
      begin
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
        $display("    pads appending to packets is selected");
        $display("    pads appending to packets is selected");
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
                 (min_tmp + 64 + 128), tmp_data);
                 (min_tmp + 64 + 128), tmp_data);
        // reset padding, remain the rest
        // reset padding, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == max_tmp)
      else if ((i_length + 4) == max_tmp)
      begin
      begin
Line 4940... Line 4997...
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
        #10 $stop;
        #10 $stop;
      end
      end
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
    else
    else
Line 4964... Line 5022...
    `TIME; $display("  TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )");
    `TIME; $display("  TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    // set maximum TX buffer descriptors (128) - must be set before TX enable
    // set maximum TX buffer descriptors (128) - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, NO padding and CRC appending
    // enable TX, set full-duplex mode, NO padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'hA3;
    st_data = 8'hA3;
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
Line 5007... Line 5068...
      case (i_length[1:0])
      case (i_length[1:0])
      2'h0: // Interrupt is generated
      2'h0: // Interrupt is generated
      begin
      begin
        // Reset_tx_bd nable interrupt generation
        // Reset_tx_bd nable interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h1: // Interrupt is not generated
      2'h1: // Interrupt is not generated
      begin
      begin
        // set_tx_bd enable interrupt generation
        // set_tx_bd enable interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h2: // Interrupt is not generated
      2'h2: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
      default: // 2'h3: // Interrupt is not generated
      default: // 2'h3: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
Line 5268... Line 5333...
        clear_tx_bd(num_of_bd, num_of_bd);
        clear_tx_bd(num_of_bd, num_of_bd);
      // clear BD with wrap bit
      // clear BD with wrap bit
      if (num_of_frames == 140)
      if (num_of_frames == 140)
        clear_tx_bd(127, 127);
        clear_tx_bd(127, 127);
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      begin
      begin
        if ((data & `ETH_INT_TXB) !== 1'b1)
        if ((data & `ETH_INT_TXB) !== 1'b1)
        begin
        begin
Line 5294... Line 5360...
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 5311... Line 5378...
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
                 min_tmp, (min_tmp + 7));
                 min_tmp, (min_tmp + 7));
        $display("    ->all packets were send from TX BD 0");
        $display("    ->all packets were send from TX BD 0");
        // set padding, remain the rest
        // set padding, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == (min_tmp + 128))
      else if ((i_length + 4) == (min_tmp + 128))
      begin
      begin
Line 5325... Line 5393...
                 (min_tmp + 8), (min_tmp + 128));
                 (min_tmp + 8), (min_tmp + 128));
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
                 1'b0, num_of_bd);
                 1'b0, num_of_bd);
        tmp_bd = num_of_bd + 1;
        tmp_bd = num_of_bd + 1;
        // set padding, remain the rest
        // set padding, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == (max_tmp - 16))
      else if ((i_length + 4) == (max_tmp - 16))
      begin
      begin
Line 5343... Line 5412...
        else
        else
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
                   tmp_bd, num_of_bd);
                   tmp_bd, num_of_bd);
        tmp_bd = num_of_bd + 1;
        tmp_bd = num_of_bd + 1;
        // reset padding, remain the rest
        // reset padding, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == max_tmp)
      else if ((i_length + 4) == max_tmp)
      begin
      begin
Line 5386... Line 5456...
        num_of_bd = 0;
        num_of_bd = 0;
      else
      else
        num_of_bd = num_of_bd + 1;
        num_of_bd = num_of_bd + 1;
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 5411... Line 5482...
    `TIME; $display("  TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )");
    `TIME; $display("  TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    // set maximum TX buffer descriptors (128) - must be set before TX enable
    // set maximum TX buffer descriptors (128) - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, NO padding and CRC appending
    // enable TX, set full-duplex mode, NO padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'hA5;
    st_data = 8'hA5;
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp), st_data); // length without CRC
Line 5454... Line 5528...
      case (i_length[1:0])
      case (i_length[1:0])
      2'h0: // Interrupt is generated
      2'h0: // Interrupt is generated
      begin
      begin
        // Reset_tx_bd nable interrupt generation
        // Reset_tx_bd nable interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h1: // Interrupt is not generated
      2'h1: // Interrupt is not generated
      begin
      begin
        // set_tx_bd enable interrupt generation
        // set_tx_bd enable interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h2: // Interrupt is not generated
      2'h2: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
      default: // 2'h3: // Interrupt is not generated
      default: // 2'h3: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
Line 5716... Line 5794...
        clear_tx_bd(num_of_bd, num_of_bd);
        clear_tx_bd(num_of_bd, num_of_bd);
      // clear BD with wrap bit
      // clear BD with wrap bit
      if (num_of_frames == 140)
      if (num_of_frames == 140)
        clear_tx_bd(127, 127);
        clear_tx_bd(127, 127);
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      begin
      begin
        if ((data & `ETH_INT_TXB) !== 1'b1)
        if ((data & `ETH_INT_TXB) !== 1'b1)
        begin
        begin
Line 5742... Line 5821...
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 5759... Line 5839...
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
        $display("    using only TX BD 0 out of 128 BDs assigned to TX (wrap at first BD - TX BD 0)");
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
                 min_tmp, (min_tmp + 7));
                 min_tmp, (min_tmp + 7));
        $display("    ->all packets were send from TX BD 0");
        $display("    ->all packets were send from TX BD 0");
        // set padding, remain the rest
        // set padding, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == (min_tmp + 128))
      else if ((i_length + 4) == (min_tmp + 128))
      begin
      begin
Line 5773... Line 5854...
                 (min_tmp + 8), (min_tmp + 128));
                 (min_tmp + 8), (min_tmp + 128));
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
        $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
                 1'b0, num_of_bd);
                 1'b0, num_of_bd);
        tmp_bd = num_of_bd + 1;
        tmp_bd = num_of_bd + 1;
        // set padding, remain the rest
        // set padding, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == (max_tmp - 16))
      else if ((i_length + 4) == (max_tmp - 16))
      begin
      begin
Line 5791... Line 5873...
        else
        else
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
          $display("    ->packets were send from TX BD %0d to TX BD %0d respectively",
                   tmp_bd, num_of_bd);
                   tmp_bd, num_of_bd);
        tmp_bd = num_of_bd + 1;
        tmp_bd = num_of_bd + 1;
        // reset padding, remain the rest
        // reset padding, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
        wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == max_tmp)
      else if ((i_length + 4) == max_tmp)
      begin
      begin
Line 5834... Line 5917...
        num_of_bd = 0;
        num_of_bd = 0;
      else
      else
        num_of_bd = num_of_bd + 1;
        num_of_bd = num_of_bd + 1;
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 5859... Line 5943...
    `TIME; $display("  TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
    `TIME; $display("  TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    // set 8 TX buffer descriptors - must be set before TX enable
    // set 8 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, padding and CRC appending
    // enable TX, set full-duplex mode, padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h12;
    st_data = 8'h12;
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
Line 5904... Line 5991...
      case (i_length[1:0])
      case (i_length[1:0])
      2'h0: // Interrupt is generated
      2'h0: // Interrupt is generated
      begin
      begin
        // Reset_tx_bd nable interrupt generation
        // Reset_tx_bd nable interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h1: // Interrupt is not generated
      2'h1: // Interrupt is not generated
      begin
      begin
        // set_tx_bd enable interrupt generation
        // set_tx_bd enable interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h2: // Interrupt is not generated
      2'h2: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
      default: // 2'h3: // Interrupt is not generated
      default: // 2'h3: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
Line 6219... Line 6310...
      end
      end
      // clear TX BD with wrap bit
      // clear TX BD with wrap bit
      if (num_of_frames == 63)
      if (num_of_frames == 63)
        clear_tx_bd(16, 16);
        clear_tx_bd(16, 16);
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
      begin
      begin
        if ((data & `ETH_INT_TXB) !== 1'b1)
        if ((data & `ETH_INT_TXB) !== 1'b1)
        begin
        begin
Line 6245... Line 6337...
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 6310... Line 6403...
        num_of_bd = 0;
        num_of_bd = 0;
      else
      else
        num_of_bd = num_of_bd + 1;
        num_of_bd = num_of_bd + 1;
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 6335... Line 6429...
    `TIME; $display("  TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
    `TIME; $display("  TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    // set 8 TX buffer descriptors - must be set before TX enable
    // set 8 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, padding and CRC appending
    // enable TX, set full-duplex mode, padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h12;
    st_data = 8'h12;
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
Line 6380... Line 6477...
      case (i_length[1:0])
      case (i_length[1:0])
      2'h0: // Interrupt is generated
      2'h0: // Interrupt is generated
      begin
      begin
        // Reset_tx_bd nable interrupt generation
        // Reset_tx_bd nable interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h1: // Interrupt is not generated
      2'h1: // Interrupt is not generated
      begin
      begin
        // set_tx_bd enable interrupt generation
        // set_tx_bd enable interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h2: // Interrupt is not generated
      2'h2: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
      default: // 2'h3: // Interrupt is not generated
      default: // 2'h3: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
Line 6567... Line 6668...
      begin: fr_st1
      begin: fr_st1
        wait (MTxEn === 1'b1); // start transmit
        wait (MTxEn === 1'b1); // start transmit
        frame_started = 1;
        frame_started = 1;
      end
      end
      begin
      begin
        repeat (30) @(posedge mtx_clk);
        repeat (50) @(posedge mtx_clk);     // Increased from 30 to 50 igor
        if (num_of_frames < 5)
        if (num_of_frames < 5)
        begin
        begin
          if (frame_started == 1)
          if (frame_started == 1)
          begin
          begin
            `TIME; $display("*E Frame should NOT start!");
            `TIME; $display("*E Frame should NOT start!");
Line 6695... Line 6796...
      end
      end
      // clear TX BD with wrap bit
      // clear TX BD with wrap bit
      if (num_of_frames == 63)
      if (num_of_frames == 63)
        clear_tx_bd(16, 16);
        clear_tx_bd(16, 16);
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
      begin
      begin
        if ((data & `ETH_INT_TXB) !== 1'b1)
        if ((data & `ETH_INT_TXB) !== 1'b1)
        begin
        begin
Line 6721... Line 6823...
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 6807... Line 6910...
  if (test_num == 8) // 
  if (test_num == 8) // 
  begin
  begin
    // TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
    // TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )
    test_name = "TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
    test_name = "TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
    `TIME; $display("  TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
    `TIME; $display("  TEST 8: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )");
 
$display("(%0t) tu smo zdaj", $time);
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    // set 8 TX buffer descriptors - must be set before TX enable
    // set 8 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, padding and CRC appending
    // enable TX, set full-duplex mode, padding and CRC appending
 
    wait (wbm_working == 0);
//    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
//    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h12;
    st_data = 8'h12;
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
Line 6857... Line 6963...
      case (i_length[1:0])
      case (i_length[1:0])
      2'h0: // Interrupt is generated
      2'h0: // Interrupt is generated
      begin
      begin
        // Reset_tx_bd nable interrupt generation
        // Reset_tx_bd nable interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h1: // Interrupt is not generated
      2'h1: // Interrupt is not generated
      begin
      begin
        // set_tx_bd enable interrupt generation
        // set_tx_bd enable interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h2: // Interrupt is not generated
      2'h2: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
      default: // 2'h3: // Interrupt is not generated
      default: // 2'h3: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
Line 6908... Line 7018...
        begin
        begin
          tmp_len = i_length; // length of frame
          tmp_len = i_length; // length of frame
          tmp_bd_num = 0; // TX BD number
          tmp_bd_num = 0; // TX BD number
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
          // if i_length[1] == 0 then enable interrupt generation otherwise disable it
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
          // if i_length[0] == 0 then base address is `MEMORY_BASE otherwise it is `MEMORY_BASE + max_tmp
 
 
 
/*
 
  input  [6:0]  tx_bd_num_start;
 
  input  [6:0]  tx_bd_num_end;
 
  input  [15:0] len;
 
  input         irq;
 
  input         pad;
 
  input         crc;
 
  input  [31:0] txpnt;
 
*/
 
 
 
 
          if (tmp_len[0] == 0) // CRC appended by 'HARDWARE'
          if (tmp_len[0] == 0) // CRC appended by 'HARDWARE'
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, `MEMORY_BASE);
//            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, `MEMORY_BASE);
 
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, 1'b1, 1'b0, !tmp_len[1], `MEMORY_BASE);
          else
          else
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
//            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
 
            set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, 1'b1, 1'b0, !tmp_len[1], (`MEMORY_BASE + max_tmp));
          // set wrap bit
          // set wrap bit
          set_tx_bd_wrap(0);
          set_tx_bd_wrap(0);
        end
        end
        else if (num_of_frames <= 9)
        else if (num_of_frames <= 9)
        begin
        begin
Line 7092... Line 7216...
        begin
        begin
          #1 check_tx_bd(num_of_bd, data);
          #1 check_tx_bd(num_of_bd, data);
          @(posedge wb_clk);
          @(posedge wb_clk);
        end
        end
        repeat (1) @(posedge wb_clk);
        repeat (1) @(posedge wb_clk);
 
 
 
$display("(%0t) 1eth_phy.tx_len = 0x%0x, i_length = 0x%0x", $time, eth_phy.tx_len, i_length);
 
$display("(%0t) 1num_of_frames = 0x%0x", $time, num_of_frames);
 
 
        // check length of a PACKET 
        // check length of a PACKET 
        if ((eth_phy.tx_len != i_length) && (i_length[0] == 1'b0) && (num_of_frames >= 6))
        if ((eth_phy.tx_len != i_length) && (i_length[0] == 1'b0) && (num_of_frames >= 6))    // (num_of_frames >= 6) igor
 
//        if ((a !== b) && (b[0] == 1'b0) && (c >= 6))
        begin
        begin
          `TIME; $display("*E Wrong length of the packet out from MAC");
          `TIME; $display("*E Wrong length of the packet out from MAC");
          test_fail("Wrong length of the packet out from MAC");
          test_fail("Wrong length of the packet out from MAC");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        else if ((eth_phy.tx_len != (i_length + 4)) && (num_of_frames != 23))
        else if ((eth_phy.tx_len != (i_length + 4)) && (num_of_frames != 23))   // i_length + 4 igor
        begin
        begin
          `TIME; $display("*E Wrong length of the packet out from MAC");
          `TIME; $display("*E Wrong length of the packet out from MAC yyy");
          test_fail("Wrong length of the packet out from MAC");
          test_fail("Wrong length of the packet out from MAC");
          fail = fail + 1;
          fail = fail + 1;
 
$display("(%0t) 2eth_phy.tx_len = 0x%0x, i_length = 0x%0x", $time, eth_phy.tx_len, i_length);
 
$display("(%0t) 2num_of_frames = 0x%0x", $time, num_of_frames);
 
//a = eth_phy.tx_len;
 
//b = i_length;
 
//c = num_of_frames;
 
//#1;
 
//$display("(%0t) 2eth_phy.tx_len = 0x%0x, i_length = 0x%0x", $time, eth_phy.tx_len, i_length);
 
//$display("(%0t) 2num_of_frames = 0x%0x", $time, num_of_frames);
 
//$display("(%0t) 3eth_phy.tx_len = 0x%0x, i_length = 0x%0x", $time, eth_phy.tx_len, i_length);
 
//$display("(%0t) 3num_of_frames = 0x%0x", $time, num_of_frames);
        end
        end
        else if ((eth_phy.tx_len != (min_tmp)) && (num_of_frames == 23))
        else if ((eth_phy.tx_len != (min_tmp)) && (num_of_frames == 23))
        begin
        begin
          `TIME; $display("*E Wrong length of the packet out from MAC");
          `TIME; $display("*E Wrong length of the packet out from MAC zzz");
          test_fail("Wrong length of the packet out from MAC");
          test_fail("Wrong length of the packet out from MAC");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // check transmitted TX packet data
        // check transmitted TX packet data
        if (i_length[0] == 0)
        if (i_length[0] == 0)
Line 7229... Line 7368...
      end
      end
      // clear TX BD with wrap bit
      // clear TX BD with wrap bit
      if (num_of_frames == 63)
      if (num_of_frames == 63)
        clear_tx_bd(16, 16);
        clear_tx_bd(16, 16);
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
      begin
      begin
        if ((data & `ETH_INT_TXB) !== 1'b1)
        if ((data & `ETH_INT_TXB) !== 1'b1)
        begin
        begin
Line 7255... Line 7395...
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // INTERMEDIATE DISPLAYS
      // INTERMEDIATE DISPLAYS
      if (i_length == 3)
      if (i_length == 3)
      begin
      begin
        $display("    pads appending to packets is selected");
        $display("    pads appending to packets is selected");  // Is this line OK? Do we have PADS? igor
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
        $display("    using 1 BD out of 8 BDs assigned to TX (wrap at 1st BD - TX BD 0)");
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
        $display("    ->packets with lengths from %0d to %0d are not transmitted (length increasing by 1 byte)",
                 0, 3);
                 0, 3);
      end
      end
      else if (i_length == 9)
      else if (i_length == 9)
Line 7320... Line 7461...
        num_of_bd = 0;
        num_of_bd = 0;
      else
      else
        num_of_bd = num_of_bd + 1;
        num_of_bd = num_of_bd + 1;
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 7345... Line 7487...
    `TIME; $display("  TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
    `TIME; $display("  TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    // set 8 TX buffer descriptors - must be set before TX enable
    // set 8 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h8, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, padding and CRC appending
    // enable TX, set full-duplex mode, padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h12;
    st_data = 8'h12;
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
Line 7390... Line 7535...
      case (i_length[1:0])
      case (i_length[1:0])
      2'h0: // Interrupt is generated
      2'h0: // Interrupt is generated
      begin
      begin
        // Reset_tx_bd nable interrupt generation
        // Reset_tx_bd nable interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h1: // Interrupt is not generated
      2'h1: // Interrupt is not generated
      begin
      begin
        // set_tx_bd enable interrupt generation
        // set_tx_bd enable interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h2: // Interrupt is not generated
      2'h2: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
      default: // 2'h3: // Interrupt is not generated
      default: // 2'h3: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.carrier_sense_tx_fd_detect(1);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
Line 7692... Line 7841...
      end
      end
      // clear TX BD with wrap bit
      // clear TX BD with wrap bit
      if (num_of_frames == 63)
      if (num_of_frames == 63)
        clear_tx_bd(16, 16);
        clear_tx_bd(16, 16);
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
      if ( ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1)) && (num_of_frames >= 5) )
      begin
      begin
        if ((data & `ETH_INT_TXB) !== 1'b1)
        if ((data & `ETH_INT_TXB) !== 1'b1)
        begin
        begin
Line 7718... Line 7868...
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          test_fail("Any of interrupts (except Transmit Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 7783... Line 7934...
        num_of_bd = 0;
        num_of_bd = 0;
      else
      else
        num_of_bd = num_of_bd + 1;
        num_of_bd = num_of_bd + 1;
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 7808... Line 7960...
    `TIME; $display("  TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
    `TIME; $display("  TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    // set 13 TX buffer descriptors - must be set before TX enable
    // set 13 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, NO padding and CRC appending
    // enable TX, set full-duplex mode, NO padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare a packet of MAXFL + 10 length
    // prepare a packet of MAXFL + 10 length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'hA3;
    st_data = 8'hA3;
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
Line 7850... Line 8005...
//      case (i_length[1:0])
//      case (i_length[1:0])
//      2'h0: // Interrupt is generated
//      2'h0: // Interrupt is generated
//      begin
//      begin
        // Reset_tx_bd nable interrupt generation
        // Reset_tx_bd nable interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.carrier_sense_tx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
//      end
//      end
//      2'h1: // Interrupt is not generated
//      2'h1: // Interrupt is not generated
//      begin
//      begin
        // set_tx_bd enable interrupt generation
        // set_tx_bd enable interrupt generation
        // mask interrupts
        // mask interrupts
 
//        wait (wbm_working == 0);
//        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
//        eth_phy.carrier_sense_tx_fd_detect(1);
//        eth_phy.carrier_sense_tx_fd_detect(1);
//        eth_phy.collision(0);
//        eth_phy.collision(0);
//      end
//      end
//      2'h2: // Interrupt is not generated
//      2'h2: // Interrupt is not generated
//      begin
//      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // unmask interrupts
        // unmask interrupts
 
//        wait (wbm_working == 0);
//        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
//        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
//                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
//        eth_phy.carrier_sense_tx_fd_detect(0);
//        eth_phy.carrier_sense_tx_fd_detect(0);
//        eth_phy.collision(1);
//        eth_phy.collision(1);
//      end
//      end
//      default: // 2'h3: // Interrupt is not generated
//      default: // 2'h3: // Interrupt is not generated
//      begin
//      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // mask interrupts
        // mask interrupts
 
//        wait (wbm_working == 0);
//        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
//        eth_phy.carrier_sense_tx_fd_detect(1);
//        eth_phy.carrier_sense_tx_fd_detect(1);
//        eth_phy.collision(1);
//        eth_phy.collision(1);
//      end
//      end
Line 8026... Line 8185...
//      end
//      end
//      // clear first half of 8 frames from TX buffer descriptor 0
//      // clear first half of 8 frames from TX buffer descriptor 0
//      if (num_of_frames < 4)
//      if (num_of_frames < 4)
//        clear_tx_bd((i_length - (max_tmp - 8)), (i_length - (max_tmp - 8)));
//        clear_tx_bd((i_length - (max_tmp - 8)), (i_length - (max_tmp - 8)));
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
//      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
//      begin
//      begin
        if ((data & `ETH_INT_TXB) !== 1'b1)
        if ((data & `ETH_INT_TXB) !== 1'b1)
        begin
        begin
Line 8052... Line 8212...
//          test_fail("Any of interrupts (except Transmit Buffer) was set");
//          test_fail("Any of interrupts (except Transmit Buffer) was set");
//          fail = fail + 1;
//          fail = fail + 1;
//        end
//        end
//      end
//      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 8074... Line 8235...
      num_of_frames = num_of_frames + 1;
      num_of_frames = num_of_frames + 1;
      num_of_bd = num_of_bd + 1;
      num_of_bd = num_of_bd + 1;
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 8099... Line 8261...
    `TIME; $display("  TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
    `TIME; $display("  TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    // set 13 TX buffer descriptors - must be set before TX enable
    // set 13 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, NO padding and CRC appending
    // enable TX, set full-duplex mode, NO padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare a packet of MAXFL + 10 length
    // prepare a packet of MAXFL + 10 length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'hA3;
    st_data = 8'hA3;
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp + 10), st_data); // length without CRC
Line 8137... Line 8302...
    while (i_length <= (max_tmp - 3)) // (max_tmp - 4) is the limit
    while (i_length <= (max_tmp - 3)) // (max_tmp - 4) is the limit
    begin
    begin
      $display("   i_length = %0d", i_length);
      $display("   i_length = %0d", i_length);
      // Reset_tx_bd nable interrupt generation
      // Reset_tx_bd nable interrupt generation
      // unmask interrupts
      // unmask interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // not detect carrier sense in FD and no collision
      // not detect carrier sense in FD and no collision
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.collision(0);
      eth_phy.collision(0);
Line 8213... Line 8379...
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        test_fail("TX buffer descriptor status is not correct");
        test_fail("TX buffer descriptor status is not correct");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((data & `ETH_INT_TXB) !== 1'b1)
      if ((data & `ETH_INT_TXB) !== 1'b1)
      begin
      begin
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        test_fail("Interrupt Transmit Buffer was not set");
        test_fail("Interrupt Transmit Buffer was not set");
Line 8227... Line 8394...
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        test_fail("Other interrupts (except Transmit Buffer) were set");
        test_fail("Other interrupts (except Transmit Buffer) were set");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 8249... Line 8417...
      num_of_frames = num_of_frames + 1;
      num_of_frames = num_of_frames + 1;
      num_of_bd = num_of_bd + 1;
      num_of_bd = num_of_bd + 1;
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 8274... Line 8443...
    `TIME; $display("  TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
    `TIME; $display("  TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    // set 47 TX buffer descriptors - must be set before TX enable
    // set 47 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare a packet of MAXFL + 10 length
    // prepare a packet of MAXFL + 10 length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    // change MAXFL value
    // change MAXFL value
    max_tmp = min_tmp + 53;
    max_tmp = min_tmp + 53;
 
    wait (wbm_working == 0);
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    st_data = 8'h62;
    st_data = 8'h62;
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
    append_tx_crc(`MEMORY_BASE, (max_tmp - 5), 1'b0); // for first packet
    append_tx_crc(`MEMORY_BASE, (max_tmp - 5), 1'b0); // for first packet
    // enable TX, set full-duplex mode, NO padding and NO CRC appending
    // enable TX, set full-duplex mode, NO padding and NO CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // check WB INT signal
    // check WB INT signal
    if (wb_int !== 1'b0)
    if (wb_int !== 1'b0)
    begin
    begin
Line 8319... Line 8492...
      // prepare packet's CRC
      // prepare packet's CRC
      if (num_of_bd == 1)
      if (num_of_bd == 1)
        append_tx_crc(`MEMORY_BASE, (max_tmp - 4), 1'b0); // for second and third packets
        append_tx_crc(`MEMORY_BASE, (max_tmp - 4), 1'b0); // for second and third packets
      // Reset_tx_bd nable interrupt generation
      // Reset_tx_bd nable interrupt generation
      // unmask interrupts
      // unmask interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // not detect carrier sense in FD and no collision
      // not detect carrier sense in FD and no collision
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.collision(0);
      eth_phy.collision(0);
Line 8395... Line 8569...
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        test_fail("TX buffer descriptor status is not correct");
        test_fail("TX buffer descriptor status is not correct");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((data & `ETH_INT_TXB) !== 1'b1)
      if ((data & `ETH_INT_TXB) !== 1'b1)
      begin
      begin
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        test_fail("Interrupt Transmit Buffer was not set");
        test_fail("Interrupt Transmit Buffer was not set");
Line 8409... Line 8584...
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        test_fail("Other interrupts (except Transmit Buffer) were set");
        test_fail("Other interrupts (except Transmit Buffer) were set");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 8431... Line 8607...
      num_of_frames = num_of_frames + 1;
      num_of_frames = num_of_frames + 1;
      num_of_bd = num_of_bd + 1;
      num_of_bd = num_of_bd + 1;
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 8456... Line 8633...
    `TIME; $display("  TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
    `TIME; $display("  TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    // set 47 TX buffer descriptors - must be set before TX enable
    // set 47 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare a packet of MAXFL + 10 length
    // prepare a packet of MAXFL + 10 length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    // change MAXFL value
    // change MAXFL value
    max_tmp = min_tmp + 53;
    max_tmp = min_tmp + 53;
 
    wait (wbm_working == 0);
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    st_data = 8'h62;
    st_data = 8'h62;
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
    set_tx_packet(`MEMORY_BASE, max_tmp, st_data); // length with CRC
    append_tx_crc(`MEMORY_BASE, (max_tmp - 5), 1'b0); // for first packet
    append_tx_crc(`MEMORY_BASE, (max_tmp - 5), 1'b0); // for first packet
    // enable TX, set full-duplex mode, NO padding and NO CRC appending
    // enable TX, set full-duplex mode, NO padding and NO CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // check WB INT signal
    // check WB INT signal
    if (wb_int !== 1'b0)
    if (wb_int !== 1'b0)
    begin
    begin
Line 8501... Line 8682...
      // prepare packet's CRC
      // prepare packet's CRC
      if (num_of_bd == 1)
      if (num_of_bd == 1)
        append_tx_crc(`MEMORY_BASE, (max_tmp - 4), 1'b0); // for second and third packets
        append_tx_crc(`MEMORY_BASE, (max_tmp - 4), 1'b0); // for second and third packets
      // Reset_tx_bd nable interrupt generation
      // Reset_tx_bd nable interrupt generation
      // unmask interrupts
      // unmask interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // not detect carrier sense in FD and no collision
      // not detect carrier sense in FD and no collision
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.collision(0);
      eth_phy.collision(0);
Line 8577... Line 8759...
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        test_fail("TX buffer descriptor status is not correct");
        test_fail("TX buffer descriptor status is not correct");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((data & `ETH_INT_TXB) !== 1'b1)
      if ((data & `ETH_INT_TXB) !== 1'b1)
      begin
      begin
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        test_fail("Interrupt Transmit Buffer was not set");
        test_fail("Interrupt Transmit Buffer was not set");
Line 8591... Line 8774...
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        test_fail("Other interrupts (except Transmit Buffer) were set");
        test_fail("Other interrupts (except Transmit Buffer) were set");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 8613... Line 8797...
      num_of_frames = num_of_frames + 1;
      num_of_frames = num_of_frames + 1;
      num_of_bd = num_of_bd + 1;
      num_of_bd = num_of_bd + 1;
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 8638... Line 8823...
    `TIME; $display("  TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )");
    `TIME; $display("  TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    // set 7 TX buffer descriptors - must be set before TX enable
    // set 7 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare a packet of MAXFL + 10 length
    // prepare a packet of MAXFL + 10 length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    // change MINFL value
    // change MINFL value
    min_tmp = max_tmp - 177;
    min_tmp = max_tmp - 177;
 
    wait (wbm_working == 0);
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    st_data = 8'h62;
    st_data = 8'h62;
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
    // enable TX, set full-duplex mode, padding and CRC appending
    // enable TX, set full-duplex mode, padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // check WB INT signal
    // check WB INT signal
    if (wb_int !== 1'b0)
    if (wb_int !== 1'b0)
    begin
    begin
Line 8679... Line 8868...
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
    begin
    begin
      $display("   i_length = %0d", i_length);
      $display("   i_length = %0d", i_length);
      // Reset_tx_bd nable interrupt generation
      // Reset_tx_bd nable interrupt generation
      // unmask interrupts
      // unmask interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // not detect carrier sense in FD and no collision
      // not detect carrier sense in FD and no collision
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.collision(0);
      eth_phy.collision(0);
Line 8755... Line 8945...
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        test_fail("TX buffer descriptor status is not correct");
        test_fail("TX buffer descriptor status is not correct");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((data & `ETH_INT_TXB) !== 1'b1)
      if ((data & `ETH_INT_TXB) !== 1'b1)
      begin
      begin
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        test_fail("Interrupt Transmit Buffer was not set");
        test_fail("Interrupt Transmit Buffer was not set");
Line 8769... Line 8960...
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        test_fail("Other interrupts (except Transmit Buffer) were set");
        test_fail("Other interrupts (except Transmit Buffer) were set");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 8791... Line 8983...
      num_of_frames = num_of_frames + 1;
      num_of_frames = num_of_frames + 1;
      num_of_bd = num_of_bd + 1;
      num_of_bd = num_of_bd + 1;
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 8816... Line 9009...
    `TIME; $display("  TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )");
    `TIME; $display("  TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    // set 7 TX buffer descriptors - must be set before TX enable
    // set 7 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h7, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare a packet of MAXFL + 10 length
    // prepare a packet of MAXFL + 10 length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    // change MINFL value
    // change MINFL value
    min_tmp = max_tmp - 177;
    min_tmp = max_tmp - 177;
 
    wait (wbm_working == 0);
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_PACKETLEN, {min_tmp, max_tmp}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    st_data = 8'h62;
    st_data = 8'h62;
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, min_tmp, st_data); // length without CRC
    // enable TX, set full-duplex mode, padding and CRC appending
    // enable TX, set full-duplex mode, padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // check WB INT signal
    // check WB INT signal
    if (wb_int !== 1'b0)
    if (wb_int !== 1'b0)
    begin
    begin
Line 8857... Line 9054...
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
    while (i_length <= (min_tmp - 3)) // (min_tmp - 4) is the limit
    begin
    begin
      $display("   i_length = %0d", i_length);
      $display("   i_length = %0d", i_length);
      // Reset_tx_bd nable interrupt generation
      // Reset_tx_bd nable interrupt generation
      // unmask interrupts
      // unmask interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // not detect carrier sense in FD and no collision
      // not detect carrier sense in FD and no collision
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.collision(0);
      eth_phy.collision(0);
Line 8933... Line 9131...
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        test_fail("TX buffer descriptor status is not correct");
        test_fail("TX buffer descriptor status is not correct");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((data & `ETH_INT_TXB) !== 1'b1)
      if ((data & `ETH_INT_TXB) !== 1'b1)
      begin
      begin
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        test_fail("Interrupt Transmit Buffer was not set");
        test_fail("Interrupt Transmit Buffer was not set");
Line 8947... Line 9146...
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        test_fail("Other interrupts (except Transmit Buffer) were set");
        test_fail("Other interrupts (except Transmit Buffer) were set");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 8969... Line 9169...
      num_of_frames = num_of_frames + 1;
      num_of_frames = num_of_frames + 1;
      num_of_bd = num_of_bd + 1;
      num_of_bd = num_of_bd + 1;
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 8994... Line 9195...
    `TIME; $display("  TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )");
    `TIME; $display("  TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    // set 19 TX buffer descriptors - must be set before TX enable
    // set 19 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare a packet of 64k - 1 length (16'hFFFF)
    // prepare a packet of 64k - 1 length (16'hFFFF)
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h8D;
    st_data = 8'h8D;
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // check WB INT signal
    // check WB INT signal
    if (wb_int !== 1'b0)
    if (wb_int !== 1'b0)
    begin
    begin
Line 9032... Line 9236...
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
    begin
    begin
      $display("   i_length = %0d", i_length);
      $display("   i_length = %0d", i_length);
      // Reset_tx_bd nable interrupt generation
      // Reset_tx_bd nable interrupt generation
      // unmask interrupts
      // unmask interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // not detect carrier sense in FD and no collision
      // not detect carrier sense in FD and no collision
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.collision(0);
      eth_phy.collision(0);
Line 9114... Line 9319...
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        test_fail("TX buffer descriptor status is not correct");
        test_fail("TX buffer descriptor status is not correct");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((data & `ETH_INT_TXB) !== 1'b1)
      if ((data & `ETH_INT_TXB) !== 1'b1)
      begin
      begin
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        test_fail("Interrupt Transmit Buffer was not set");
        test_fail("Interrupt Transmit Buffer was not set");
Line 9128... Line 9334...
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        test_fail("Other interrupts (except Transmit Buffer) were set");
        test_fail("Other interrupts (except Transmit Buffer) were set");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 9148... Line 9355...
      num_of_frames = num_of_frames + 1;
      num_of_frames = num_of_frames + 1;
      num_of_bd = num_of_bd + 1;
      num_of_bd = num_of_bd + 1;
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 9173... Line 9381...
    `TIME; $display("  TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )");
    `TIME; $display("  TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    // set 19 TX buffer descriptors - must be set before TX enable
    // set 19 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h13, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare a packet of 64k - 1 length (16'hFFFF)
    // prepare a packet of 64k - 1 length (16'hFFFF)
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h8D;
    st_data = 8'h8D;
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
    set_tx_packet(`MEMORY_BASE, 16'hFFFF, st_data); // length with CRC
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
    // enable TX, set full-duplex mode, NO padding, CRC appending and huge enabled
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN | `ETH_MODER_HUGEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // check WB INT signal
    // check WB INT signal
    if (wb_int !== 1'b0)
    if (wb_int !== 1'b0)
    begin
    begin
Line 9211... Line 9422...
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
    while (i_length <= (16'hFFFF - 4)) // (16'hFFFF - 4) is the limit
    begin
    begin
      $display("   i_length = %0d", i_length);
      $display("   i_length = %0d", i_length);
      // Reset_tx_bd nable interrupt generation
      // Reset_tx_bd nable interrupt generation
      // unmask interrupts
      // unmask interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // not detect carrier sense in FD and no collision
      // not detect carrier sense in FD and no collision
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.collision(0);
      eth_phy.collision(0);
Line 9293... Line 9505...
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        test_fail("TX buffer descriptor status is not correct");
        test_fail("TX buffer descriptor status is not correct");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((data & `ETH_INT_TXB) !== 1'b1)
      if ((data & `ETH_INT_TXB) !== 1'b1)
      begin
      begin
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        test_fail("Interrupt Transmit Buffer was not set");
        test_fail("Interrupt Transmit Buffer was not set");
Line 9307... Line 9520...
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        test_fail("Other interrupts (except Transmit Buffer) were set");
        test_fail("Other interrupts (except Transmit Buffer) were set");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 9327... Line 9541...
      num_of_frames = num_of_frames + 1;
      num_of_frames = num_of_frames + 1;
      num_of_bd = num_of_bd + 1;
      num_of_bd = num_of_bd + 1;
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 9352... Line 9567...
    `TIME; $display("  TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )");
    `TIME; $display("  TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    tmp_ipgt = 0;
    tmp_ipgt = 0;
    // set 88 TX buffer descriptors - must be set before TX enable
    // set 88 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, NO padding and CRC appending
    // enable TX, set full-duplex mode, NO padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h29;
    st_data = 8'h29;
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
Line 9389... Line 9607...
 
 
    i_length = (min_tmp - 4);
    i_length = (min_tmp - 4);
    while (i_length < (max_tmp - 4))
    while (i_length < (max_tmp - 4))
    begin
    begin
      // disable TX, set full-duplex mode, NO padding and CRC appending
      // disable TX, set full-duplex mode, NO padding and CRC appending
 
      wait (wbm_working == 0);
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // set IPGT register
      // set IPGT register
 
      wait (wbm_working == 0);
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // enable TX, set full-duplex mode, NO padding and CRC appending
      // enable TX, set full-duplex mode, NO padding and CRC appending
 
      wait (wbm_working == 0);
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // Reset_tx_bd enable interrupt generation
      // Reset_tx_bd enable interrupt generation
      // unmask interrupts
      // unmask interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // not detect carrier sense in FD and no collision
      // not detect carrier sense in FD and no collision
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.collision(0);
      eth_phy.collision(0);
Line 9515... Line 9737...
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        test_fail("TX buffer descriptor status is not correct");
        test_fail("TX buffer descriptor status is not correct");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((data & `ETH_INT_TXB) !== 1'b1)
      if ((data & `ETH_INT_TXB) !== 1'b1)
      begin
      begin
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        test_fail("Interrupt Transmit Buffer was not set");
        test_fail("Interrupt Transmit Buffer was not set");
Line 9529... Line 9752...
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        test_fail("Other interrupts (except Transmit Buffer) were set");
        test_fail("Other interrupts (except Transmit Buffer) were set");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 9558... Line 9782...
      num_of_frames = num_of_frames + 1;
      num_of_frames = num_of_frames + 1;
      num_of_bd = 0;
      num_of_bd = 0;
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 9583... Line 9808...
    `TIME; $display("  TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )");
    `TIME; $display("  TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    tmp_ipgt = 0;
    tmp_ipgt = 0;
    // set 88 TX buffer descriptors - must be set before TX enable
    // set 88 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h58, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, NO padding and CRC appending
    // enable TX, set full-duplex mode, NO padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h29;
    st_data = 8'h29;
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
Line 9620... Line 9848...
 
 
    i_length = (min_tmp - 4);
    i_length = (min_tmp - 4);
    while (i_length < (max_tmp - 4))
    while (i_length < (max_tmp - 4))
    begin
    begin
      // disable TX, set full-duplex mode, NO padding and CRC appending
      // disable TX, set full-duplex mode, NO padding and CRC appending
 
      wait (wbm_working == 0);
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
      wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // set IPGT register
      // set IPGT register
 
      wait (wbm_working == 0);
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // enable TX, set full-duplex mode, NO padding and CRC appending
      // enable TX, set full-duplex mode, NO padding and CRC appending
 
      wait (wbm_working == 0);
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
      wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // Reset_tx_bd enable interrupt generation
      // Reset_tx_bd enable interrupt generation
      // unmask interrupts
      // unmask interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // not detect carrier sense in FD and no collision
      // not detect carrier sense in FD and no collision
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.collision(0);
      eth_phy.collision(0);
Line 9746... Line 9978...
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        test_fail("TX buffer descriptor status is not correct");
        test_fail("TX buffer descriptor status is not correct");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((data & `ETH_INT_TXB) !== 1'b1)
      if ((data & `ETH_INT_TXB) !== 1'b1)
      begin
      begin
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        test_fail("Interrupt Transmit Buffer was not set");
        test_fail("Interrupt Transmit Buffer was not set");
Line 9760... Line 9993...
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        test_fail("Other interrupts (except Transmit Buffer) were set");
        test_fail("Other interrupts (except Transmit Buffer) were set");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 9789... Line 10023...
      num_of_frames = num_of_frames + 1;
      num_of_frames = num_of_frames + 1;
      num_of_bd = 0;
      num_of_bd = 0;
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 9815... Line 10050...
    $display("  TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )");
    $display("  TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    // set 2 TX buffer descriptors - must be set before TX enable
    // set 2 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, NO padding and CRC appending
    // enable TX, set full-duplex mode, NO padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare a packet of MAXFL length
    // prepare a packet of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h99;
    st_data = 8'h99;
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
    // read IPG value
    // read IPG value
 
    wait (wbm_working == 0);
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // check WB INT signal
    // check WB INT signal
    if (wb_int !== 1'b0)
    if (wb_int !== 1'b0)
    begin
    begin
      test_fail("WB INT signal should not be set");
      test_fail("WB INT signal should not be set");
Line 9855... Line 10094...
    i_length = (min_tmp + 4);
    i_length = (min_tmp + 4);
    while (i_length < (max_tmp - 4))
    while (i_length < (max_tmp - 4))
    begin
    begin
      // Reset_tx_bd enable interrupt generation
      // Reset_tx_bd enable interrupt generation
      // unmask interrupts
      // unmask interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // not detect carrier sense in FD and no collision
      // not detect carrier sense in FD and no collision
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.collision(0);
      eth_phy.collision(0);
Line 9988... Line 10228...
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
          test_fail("TX buffer descriptor status is not correct");
          test_fail("TX buffer descriptor status is not correct");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // check interrupts
        // check interrupts
 
        wait (wbm_working == 0);
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        if ((data & `ETH_INT_TXB) !== 1'b1)
        if ((data & `ETH_INT_TXB) !== 1'b1)
        begin
        begin
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
          test_fail("Interrupt Transmit Buffer was not set");
          test_fail("Interrupt Transmit Buffer was not set");
Line 10002... Line 10243...
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
          test_fail("Other interrupts (except Transmit Buffer) were set");
          test_fail("Other interrupts (except Transmit Buffer) were set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // clear interrupts
        // clear interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // check WB INT signal
        // check WB INT signal
        if (wb_int !== 1'b0)
        if (wb_int !== 1'b0)
        begin
        begin
          test_fail("WB INT signal should not be set");
          test_fail("WB INT signal should not be set");
Line 10047... Line 10289...
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
          test_fail("TX buffer descriptor status is not correct");
          test_fail("TX buffer descriptor status is not correct");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // check interrupts
        // check interrupts
 
        wait (wbm_working == 0);
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        if ((data & `ETH_INT_TXE) !== 2'b10)
        if ((data & `ETH_INT_TXE) !== 2'b10)
        begin
        begin
          `TIME; $display("*E Interrupt Transmit Error was not set, interrupt reg: %0h", data);
          `TIME; $display("*E Interrupt Transmit Error was not set, interrupt reg: %0h", data);
          test_fail("Interrupt Transmit Buffer was not set");
          test_fail("Interrupt Transmit Buffer was not set");
Line 10061... Line 10304...
          `TIME; $display("*E Other interrupts (except Transmit Error) were set, interrupt reg: %0h", data);
          `TIME; $display("*E Other interrupts (except Transmit Error) were set, interrupt reg: %0h", data);
          test_fail("Other interrupts (except Transmit Buffer) were set");
          test_fail("Other interrupts (except Transmit Buffer) were set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // clear interrupts
        // clear interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // check WB INT signal
        // check WB INT signal
        if (wb_int !== 1'b0)
        if (wb_int !== 1'b0)
        begin
        begin
          test_fail("WB INT signal should not be set");
          test_fail("WB INT signal should not be set");
Line 10134... Line 10378...
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        test_fail("TX buffer descriptor status is not correct");
        test_fail("TX buffer descriptor status is not correct");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((data & `ETH_INT_TXB) !== 1'b1)
      if ((data & `ETH_INT_TXB) !== 1'b1)
      begin
      begin
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        test_fail("Interrupt Transmit Buffer was not set");
        test_fail("Interrupt Transmit Buffer was not set");
Line 10148... Line 10393...
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        test_fail("Other interrupts (except Transmit Buffer) were set");
        test_fail("Other interrupts (except Transmit Buffer) were set");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 10166... Line 10412...
      if (num_of_frames == i_length + 4) // 64 => this was last Byte (1st .. 64th) when i_length = min_tmp - 4
      if (num_of_frames == i_length + 4) // 64 => this was last Byte (1st .. 64th) when i_length = min_tmp - 4
        i_length = (max_tmp - 4);
        i_length = (max_tmp - 4);
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 10192... Line 10439...
    $display("  TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )");
    $display("  TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    // set 2 TX buffer descriptors - must be set before TX enable
    // set 2 TX buffer descriptors - must be set before TX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, NO padding and CRC appending
    // enable TX, set full-duplex mode, NO padding and CRC appending
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN |/* `ETH_MODER_PAD |*/ `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare a packet of MAXFL length
    // prepare a packet of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h99;
    st_data = 8'h99;
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC
    // read IPG value
    // read IPG value
 
    wait (wbm_working == 0);
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_IPGT, tmp_ipgt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // check WB INT signal
    // check WB INT signal
    if (wb_int !== 1'b0)
    if (wb_int !== 1'b0)
    begin
    begin
      test_fail("WB INT signal should not be set");
      test_fail("WB INT signal should not be set");
Line 10232... Line 10483...
    i_length = (min_tmp + 4);
    i_length = (min_tmp + 4);
    while (i_length < (max_tmp - 4))
    while (i_length < (max_tmp - 4))
    begin
    begin
      // Reset_tx_bd enable interrupt generation
      // Reset_tx_bd enable interrupt generation
      // unmask interrupts
      // unmask interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
      wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                               `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // not detect carrier sense in FD and no collision
      // not detect carrier sense in FD and no collision
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.carrier_sense_tx_fd_detect(0);
      eth_phy.collision(0);
      eth_phy.collision(0);
Line 10362... Line 10614...
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
          `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
          test_fail("TX buffer descriptor status is not correct");
          test_fail("TX buffer descriptor status is not correct");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // check interrupts
        // check interrupts
 
        wait (wbm_working == 0);
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        if ((data & `ETH_INT_TXB) !== 1'b1)
        if ((data & `ETH_INT_TXB) !== 1'b1)
        begin
        begin
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
          `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
          test_fail("Interrupt Transmit Buffer was not set");
          test_fail("Interrupt Transmit Buffer was not set");
Line 10376... Line 10629...
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
          `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
          test_fail("Other interrupts (except Transmit Buffer) were set");
          test_fail("Other interrupts (except Transmit Buffer) were set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
        // clear interrupts
        // clear interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // check WB INT signal
        // check WB INT signal
        if (wb_int !== 1'b0)
        if (wb_int !== 1'b0)
        begin
        begin
          test_fail("WB INT signal should not be set");
          test_fail("WB INT signal should not be set");
Line 10442... Line 10696...
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        `TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
        test_fail("TX buffer descriptor status is not correct");
        test_fail("TX buffer descriptor status is not correct");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((data & `ETH_INT_TXB) !== 1'b1)
      if ((data & `ETH_INT_TXB) !== 1'b1)
      begin
      begin
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        `TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
        test_fail("Interrupt Transmit Buffer was not set");
        test_fail("Interrupt Transmit Buffer was not set");
Line 10456... Line 10711...
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        `TIME; $display("*E Other interrupts (except Transmit Buffer) were set, interrupt reg: %0h", data);
        test_fail("Other interrupts (except Transmit Buffer) were set");
        test_fail("Other interrupts (except Transmit Buffer) were set");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 10474... Line 10730...
      if (num_of_frames == i_length + 4) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
      if (num_of_frames == i_length + 4) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
        i_length = (max_tmp - 4);
        i_length = (max_tmp - 4);
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable TX
    // disable TX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 10539... Line 10796...
fail = 0;
fail = 0;
 
 
// reset MAC registers
// reset MAC registers
hard_reset;
hard_reset;
// reset MAC and MII LOGIC with soft reset
// reset MAC and MII LOGIC with soft reset
reset_mac;
//reset_mac;
reset_mii;
//reset_mii;
// set wb slave response
// set wb slave response
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
  /*
  /*
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
Line 10629... Line 10886...
    // TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )
    // TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )
    test_name   = "TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )";
    test_name   = "TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )";
    `TIME; $display("  TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )");
    `TIME; $display("  TEST 0: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 10Mbps )");
 
 
    // unmask interrupts
    // unmask interrupts
 
    wait (wbm_working == 0);
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // set all buffer descriptors to TX - must be set before RX enable
    // set all buffer descriptors to TX - must be set before RX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable RX, set full-duplex mode, receive small, NO correct IFG
    // enable RX, set full-duplex mode, receive small, NO correct IFG
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    // write to phy's control register for 10Mbps
    // write to phy's control register for 10Mbps
Line 10678... Line 10938...
          fail = fail + 1;
          fail = fail + 1;
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
        end
        end
        @(posedge wb_clk);
        @(posedge wb_clk);
      end
      end
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if (tmp[6:0] !== 0)
      if (tmp[6:0] !== 0)
      begin
      begin
        test_fail("Receive should not get INT since it should not start at all");
        test_fail("Receive should not get INT since it should not start at all");
        fail = fail + 1;
        fail = fail + 1;
Line 10692... Line 10953...
        i = i + 1;
        i = i + 1;
      else
      else
        i = i + 120;
        i = i + 120;
    end
    end
    // disable RX
    // disable RX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 10714... Line 10976...
    // TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )
    // TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )
    test_name   = "TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )";
    test_name   = "TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )";
    `TIME; $display("  TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )");
    `TIME; $display("  TEST 1: NO RECEIVE WHEN ALL BUFFERS ARE TX ( 100Mbps )");
 
 
    // unmask interrupts
    // unmask interrupts
 
    wait (wbm_working == 0);
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // set all buffer descriptors to TX - must be set before RX enable
    // set all buffer descriptors to TX - must be set before RX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable RX, set full-duplex mode, receive small, NO correct IFG
    // enable RX, set full-duplex mode, receive small, NO correct IFG
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    // write to phy's control register for 100Mbps
    // write to phy's control register for 100Mbps
Line 10763... Line 11028...
          fail = fail + 1;
          fail = fail + 1;
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
          `TIME; $display("*E Receive of should not be finished since it should not start at all");
        end
        end
        @(posedge wb_clk);
        @(posedge wb_clk);
      end
      end
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if (tmp[6:0] !== 0)
      if (tmp[6:0] !== 0)
      begin
      begin
        test_fail("Receive should not get INT since it should not start at all");
        test_fail("Receive should not get INT since it should not start at all");
        fail = fail + 1;
        fail = fail + 1;
Line 10777... Line 11043...
        i = i + 1;
        i = i + 1;
      else
      else
        i = i + 120;
        i = i + 120;
    end
    end
    // disable RX
    // disable RX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 10800... Line 11067...
    // TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
    // TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
    test_name   = "TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
    test_name   = "TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
    `TIME; $display("  TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
    `TIME; $display("  TEST 2: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
 
 
    // unmask interrupts
    // unmask interrupts
 
    wait (wbm_working == 0);
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h0F;
    st_data = 8'h0F;
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
Line 10900... Line 11171...
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
            end
            end
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
            wbm_init_waits = 4'h0;
            wbm_init_waits = 4'h0;
            wbm_subseq_waits = 4'h0;
            wbm_subseq_waits = 4'h0;
            #1 wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
            #1 wait (wbm_working == 0);
 
            wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
          end
          end
        end
        end
        begin // send a packet from PHY RX
        begin // send a packet from PHY RX
Line 11068... Line 11340...
          test_fail("RX buffer descriptor status is not correct");
          test_fail("RX buffer descriptor status is not correct");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
      begin
      begin
        if (data !== 0)
        if (data !== 0)
        begin
        begin
Line 11094... Line 11367...
          test_fail("Other interrupts (except Receive Buffer) were set");
          test_fail("Other interrupts (except Receive Buffer) were set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 11105... Line 11379...
      end
      end
      // disable RX after two packets
      // disable RX after two packets
      if (num_of_frames[0] == 1'b1)
      if (num_of_frames[0] == 1'b1)
      begin
      begin
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
      end
      end
      // the number of frame transmitted
      // the number of frame transmitted
Line 11118... Line 11393...
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
        i_length = (max_tmp - 4);
        i_length = (max_tmp - 4);
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable RX
    // disable RX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 11141... Line 11417...
    // TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )
    // TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )
    test_name   = "TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )";
    test_name   = "TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )";
    `TIME; $display("  TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )");
    `TIME; $display("  TEST 3: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 100Mbps )");
 
 
    // unmask interrupts
    // unmask interrupts
 
    wait (wbm_working == 0);
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
    // set 10 RX buffer descriptor (8'h80 - 8'hA) - must be set before RX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h76, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
    // disable RX, set full-duplex mode, NO receive small, NO correct IFG
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h0F;
    st_data = 8'h0F;
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
    set_rx_packet(0, (min_tmp + 1), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
Line 11221... Line 11501...
      end
      end
      endcase
      endcase
//if (first_fr_received == 0)
//if (first_fr_received == 0)
//begin
//begin
//  check_rx_bd(118, data);
//  check_rx_bd(118, data);
 
//  wait (wbm_working == 0);
//  wbm_read((`TX_BD_BASE + (118 * 8) + 4), tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//  wbm_read((`TX_BD_BASE + (118 * 8) + 4), tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
//  $display("RX BD set : %h, %h", data, tmp);
//  $display("RX BD set : %h, %h", data, tmp);
//end
//end
      // set wrap bit
      // set wrap bit
      set_rx_bd_wrap(118);
      set_rx_bd_wrap(118);
      set_rx_bd_empty(118, 118);
      set_rx_bd_empty(118, 118);
      check_frame = 0;
      check_frame = 0;
      stop_checking_frame = 0;
      stop_checking_frame = 0;
      tmp_data = 0;
      tmp_data = 0;
$display("mama 1");
 
      fork
      fork
        begin // enable RX MAC on first of each two packets - every second should be recived normaly
        begin // enable RX MAC on first of each two packets - every second should be recived normaly
          if (num_of_frames[0] == 1'b0)
          if (num_of_frames[0] == 1'b0)
          begin
          begin
            repeat(1) @(posedge wb_clk);
            repeat(1) @(posedge wb_clk);
Line 11248... Line 11528...
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
              repeat (num_of_frames[31:2]) @(negedge mrx_clk); // for every (second) frame enable receiver one clock later
            end
            end
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
            // enable RX, set full-duplex mode, NO receive small, NO correct IFG
            wbm_init_waits = 4'h0;
            wbm_init_waits = 4'h0;
            wbm_subseq_waits = 4'h0;
            wbm_subseq_waits = 4'h0;
            #1 wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
            #1 wait (wbm_working == 0);
 
            wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
                      `ETH_MODER_PRO | `ETH_MODER_BRO,
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
                      4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
$display("mama 2, num_of_frames=%0h", num_of_frames);
$display("mama 2, num_of_frames=%0h", num_of_frames);
          end
          end
        end
        end
Line 11443... Line 11724...
          test_fail("RX buffer descriptor status is not correct");
          test_fail("RX buffer descriptor status is not correct");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
      if ((num_of_frames[0] == 1'b0) && (first_fr_received == 0)) // interrupt enabled but no receive
      begin
      begin
        if (data !== 0)
        if (data !== 0)
        begin
        begin
Line 11469... Line 11751...
          test_fail("Other interrupts (except Receive Buffer) were set");
          test_fail("Other interrupts (except Receive Buffer) were set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 11480... Line 11763...
      end
      end
      // disable RX after two packets
      // disable RX after two packets
      if (num_of_frames[0] == 1'b1)
      if (num_of_frames[0] == 1'b1)
      begin
      begin
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
        // disable RX, set full-duplex mode, NO receive small, NO correct IFG
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
        wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_IFG |
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
                  4'hF, 1, 4'h0, 4'h0); // write ASAP
      end
      end
      // the number of frame transmitted
      // the number of frame transmitted
Line 11493... Line 11777...
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
      if (num_of_frames[31:2] == (i_length * 2 + 16)) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
        i_length = (max_tmp - 4);
        i_length = (max_tmp - 4);
      @(posedge wb_clk);
      @(posedge wb_clk);
    end
    end
    // disable RX
    // disable RX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 11516... Line 11801...
    // TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )
    // TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )
    test_name   = "TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )";
    test_name   = "TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )";
    `TIME; $display("  TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )");
    `TIME; $display("  TEST 4: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 10Mbps )");
 
 
    // unmask interrupts
    // unmask interrupts
 
    wait (wbm_working == 0);
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h0F;
    st_data = 8'h0F;
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
Line 11554... Line 11843...
      2'h0: // Interrupt is generated
      2'h0: // Interrupt is generated
      begin
      begin
        // enable interrupt generation
        // enable interrupt generation
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
Line 11565... Line 11855...
      2'h1: // Interrupt is not generated
      2'h1: // Interrupt is not generated
      begin
      begin
        // enable interrupt generation
        // enable interrupt generation
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h2: // Interrupt is not generated
      2'h2: // Interrupt is not generated
      begin
      begin
        // disable interrupt generation
        // disable interrupt generation
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.collision(1);
        eth_phy.collision(1);
Line 11586... Line 11878...
      default: // 2'h3: // Interrupt is not generated
      default: // 2'h3: // Interrupt is not generated
      begin
      begin
        // disable interrupt generation
        // disable interrupt generation
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
Line 11706... Line 11999...
      end
      end
      // clear RX buffer descriptor for first 4 frames
      // clear RX buffer descriptor for first 4 frames
      if (i_length < min_tmp)
      if (i_length < min_tmp)
        clear_rx_bd(127, 127);
        clear_rx_bd(127, 127);
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      begin
      begin
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        begin
        begin
Line 11732... Line 12026...
          test_fail("Any of interrupts (except Receive Buffer) was set");
          test_fail("Any of interrupts (except Receive Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 11747... Line 12042...
        // starting length is min_tmp, ending length is (min_tmp + 64)
        // starting length is min_tmp, ending length is (min_tmp + 64)
        $display("    receive small packets is NOT selected");
        $display("    receive small packets is NOT selected");
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
                 min_tmp, (min_tmp + 64));
                 min_tmp, (min_tmp + 64));
        // set receive small, remain the rest
        // set receive small, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == (max_tmp - 16))
      else if ((i_length + 4) == (max_tmp - 16))
Line 11758... Line 12054...
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
        $display("    receive small packets is selected");
        $display("    receive small packets is selected");
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
                 (min_tmp + 64 + 128), tmp_data);
                 (min_tmp + 64 + 128), tmp_data);
        // reset receive small, remain the rest
        // reset receive small, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == max_tmp)
      else if ((i_length + 4) == max_tmp)
Line 11787... Line 12084...
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
        #10 $stop;
        #10 $stop;
      end
      end
    end
    end
    // disable RX
    // disable RX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 11810... Line 12108...
    // TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )
    // TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )
    test_name   = "TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )";
    test_name   = "TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )";
    `TIME; $display("  TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )");
    `TIME; $display("  TEST 5: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT ONE RX BD ( 100Mbps )");
 
 
    // unmask interrupts
    // unmask interrupts
 
    wait (wbm_working == 0);
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h0F;
    st_data = 8'h0F;
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
Line 11848... Line 12150...
      2'h0: // Interrupt is generated
      2'h0: // Interrupt is generated
      begin
      begin
        // enable interrupt generation
        // enable interrupt generation
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i_length[1:0]));
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
Line 11859... Line 12162...
      2'h1: // Interrupt is not generated
      2'h1: // Interrupt is not generated
      begin
      begin
        // enable interrupt generation
        // enable interrupt generation
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h2: // Interrupt is not generated
      2'h2: // Interrupt is not generated
      begin
      begin
        // disable interrupt generation
        // disable interrupt generation
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i_length[1:0]));
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.collision(1);
        eth_phy.collision(1);
Line 11880... Line 12185...
      default: // 2'h3: // Interrupt is not generated
      default: // 2'h3: // Interrupt is not generated
      begin
      begin
        // disable interrupt generation
        // disable interrupt generation
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i_length[1:0]) + max_tmp));
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
Line 12000... Line 12306...
      end
      end
      // clear RX buffer descriptor for first 4 frames
      // clear RX buffer descriptor for first 4 frames
      if (i_length < min_tmp)
      if (i_length < min_tmp)
        clear_rx_bd(127, 127);
        clear_rx_bd(127, 127);
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      begin
      begin
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        begin
        begin
Line 12026... Line 12333...
          test_fail("Any of interrupts (except Receive Buffer) was set");
          test_fail("Any of interrupts (except Receive Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 12041... Line 12349...
        // starting length is min_tmp, ending length is (min_tmp + 64)
        // starting length is min_tmp, ending length is (min_tmp + 64)
        $display("    receive small packets is NOT selected");
        $display("    receive small packets is NOT selected");
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
                 min_tmp, (min_tmp + 64));
                 min_tmp, (min_tmp + 64));
        // set receive small, remain the rest
        // set receive small, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == (max_tmp - 16))
      else if ((i_length + 4) == (max_tmp - 16))
Line 12052... Line 12361...
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
        $display("    receive small packets is selected");
        $display("    receive small packets is selected");
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
                 (min_tmp + 64 + 128), tmp_data);
                 (min_tmp + 64 + 128), tmp_data);
        // reset receive small, remain the rest
        // reset receive small, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == max_tmp)
      else if ((i_length + 4) == max_tmp)
Line 12081... Line 12391...
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
        #10 $stop;
        #10 $stop;
      end
      end
    end
    end
    // disable RX
    // disable RX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 12106... Line 12417...
    `TIME; $display("  TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )");
    `TIME; $display("  TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    // set maximum RX buffer descriptors (128) - must be set before RX enable
    // set maximum RX buffer descriptors (128) - must be set before RX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'hAC;
    st_data = 8'hAC;
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
Line 12155... Line 12469...
      case (i_length[1:0])
      case (i_length[1:0])
      2'h0: // Interrupt is generated
      2'h0: // Interrupt is generated
      begin
      begin
        // Reset_tx_bd nable interrupt generation
        // Reset_tx_bd nable interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h1: // Interrupt is not generated
      2'h1: // Interrupt is not generated
      begin
      begin
        // set_tx_bd enable interrupt generation
        // set_tx_bd enable interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h2: // Interrupt is not generated
      2'h2: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
      default: // 2'h3: // Interrupt is not generated
      default: // 2'h3: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
Line 12399... Line 12717...
        clear_rx_bd(num_of_bd, num_of_bd);
        clear_rx_bd(num_of_bd, num_of_bd);
      // clear BD with wrap bit
      // clear BD with wrap bit
      if (num_of_frames == 140)
      if (num_of_frames == 140)
        clear_rx_bd(127, 127);
        clear_rx_bd(127, 127);
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      begin
      begin
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        begin
        begin
Line 12425... Line 12744...
          test_fail("Any of interrupts (except Receive Buffer) was set");
          test_fail("Any of interrupts (except Receive Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 12442... Line 12762...
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
                 min_tmp, (min_tmp + 7));
                 min_tmp, (min_tmp + 7));
        $display("    ->all packets were received on RX BD 0");
        $display("    ->all packets were received on RX BD 0");
        // reset receive small, remain the rest
        // reset receive small, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == (min_tmp + 128))
      else if ((i_length + 4) == (min_tmp + 128))
Line 12457... Line 12778...
                 (min_tmp + 8), (min_tmp + 128));
                 (min_tmp + 8), (min_tmp + 128));
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
                 1'b0, num_of_bd);
                 1'b0, num_of_bd);
        tmp_bd = num_of_bd + 1;
        tmp_bd = num_of_bd + 1;
        // set receive small, remain the rest
        // set receive small, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == (max_tmp - 16))
      else if ((i_length + 4) == (max_tmp - 16))
Line 12476... Line 12798...
        else
        else
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
                   tmp_bd, num_of_bd);
                   tmp_bd, num_of_bd);
        tmp_bd = num_of_bd + 1;
        tmp_bd = num_of_bd + 1;
        // reset receive small, remain the rest
        // reset receive small, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == max_tmp)
      else if ((i_length + 4) == max_tmp)
Line 12520... Line 12843...
        num_of_bd = 0;
        num_of_bd = 0;
      else
      else
        num_of_bd = num_of_bd + 1;
        num_of_bd = num_of_bd + 1;
    end
    end
    // disable RX
    // disable RX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
Line 12546... Line 12870...
    `TIME; $display("  TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )");
    `TIME; $display("  TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    // set maximum RX buffer descriptors (128) - must be set before RX enable
    // set maximum RX buffer descriptors (128) - must be set before RX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'hAC;
    st_data = 8'hAC;
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
Line 12595... Line 12922...
      case (i_length[1:0])
      case (i_length[1:0])
      2'h0: // Interrupt is generated
      2'h0: // Interrupt is generated
      begin
      begin
        // Reset_tx_bd nable interrupt generation
        // Reset_tx_bd nable interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and no collision
        // not detect carrier sense in FD and no collision
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h1: // Interrupt is not generated
      2'h1: // Interrupt is not generated
      begin
      begin
        // set_tx_bd enable interrupt generation
        // set_tx_bd enable interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and no collision
        // detect carrier sense in FD and no collision
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.collision(0);
        eth_phy.collision(0);
      end
      end
      2'h2: // Interrupt is not generated
      2'h2: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // unmask interrupts
        // unmask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // not detect carrier sense in FD and set collision
        // not detect carrier sense in FD and set collision
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.no_carrier_sense_rx_fd_detect(0);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
      default: // 2'h3: // Interrupt is not generated
      default: // 2'h3: // Interrupt is not generated
      begin
      begin
        // set_tx_bd disable the interrupt generation
        // set_tx_bd disable the interrupt generation
        // mask interrupts
        // mask interrupts
 
        wait (wbm_working == 0);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        // detect carrier sense in FD and set collision
        // detect carrier sense in FD and set collision
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.no_carrier_sense_rx_fd_detect(1);
        eth_phy.collision(1);
        eth_phy.collision(1);
      end
      end
Line 12838... Line 13169...
        clear_rx_bd(num_of_bd, num_of_bd);
        clear_rx_bd(num_of_bd, num_of_bd);
      // clear BD with wrap bit
      // clear BD with wrap bit
      if (num_of_frames == 140)
      if (num_of_frames == 140)
        clear_rx_bd(127, 127);
        clear_rx_bd(127, 127);
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
      begin
      begin
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        begin
        begin
Line 12864... Line 13196...
          test_fail("Any of interrupts (except Receive Buffer) was set");
          test_fail("Any of interrupts (except Receive Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 12881... Line 13214...
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
        $display("    using only RX BD 0 out of 128 BDs assigned to RX (wrap at first BD - RX BD 0)");
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
                 min_tmp, (min_tmp + 7));
                 min_tmp, (min_tmp + 7));
        $display("    ->all packets were received on RX BD 0");
        $display("    ->all packets were received on RX BD 0");
        // reset receive small, remain the rest
        // reset receive small, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == (min_tmp + 128))
      else if ((i_length + 4) == (min_tmp + 128))
Line 12896... Line 13230...
                 (min_tmp + 8), (min_tmp + 128));
                 (min_tmp + 8), (min_tmp + 128));
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
        $display("    ->packets were received on RX BD %0d to RX BD %0d respectively",
                 1'b0, num_of_bd);
                 1'b0, num_of_bd);
        tmp_bd = num_of_bd + 1;
        tmp_bd = num_of_bd + 1;
        // set receive small, remain the rest
        // set receive small, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == (max_tmp - 16))
      else if ((i_length + 4) == (max_tmp - 16))
Line 12915... Line 13250...
        else
        else
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
          $display("    ->packets were received from RX BD %0d to RX BD %0d respectively",
                   tmp_bd, num_of_bd);
                   tmp_bd, num_of_bd);
        tmp_bd = num_of_bd + 1;
        tmp_bd = num_of_bd + 1;
        // reset receive small, remain the rest
        // reset receive small, remain the rest
 
        wait (wbm_working == 0);
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      end
      end
      else if ((i_length + 4) == max_tmp)
      else if ((i_length + 4) == max_tmp)
Line 12959... Line 13295...
        num_of_bd = 0;
        num_of_bd = 0;
      else
      else
        num_of_bd = num_of_bd + 1;
        num_of_bd = num_of_bd + 1;
    end
    end
    // disable RX
    // disable RX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
Line 12985... Line 13322...
    `TIME; $display("  TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )");
    `TIME; $display("  TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable RX, set full-duplex mode, receive small, NO correct IFG
    // enable RX, set full-duplex mode, receive small, NO correct IFG
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'hAC;
    st_data = 8'hAC;
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
Line 13013... Line 13353...
    begin
    begin
      test_fail("WB INT signal should not be set");
      test_fail("WB INT signal should not be set");
      fail = fail + 1;
      fail = fail + 1;
    end
    end
    // unmask interrupts
    // unmask interrupts
 
    wait (wbm_working == 0);
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    // write to phy's control register for 10Mbps
    // write to phy's control register for 10Mbps
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
Line 13379... Line 13720...
          test_fail("RX buffer descriptor status is not correct");
          test_fail("RX buffer descriptor status is not correct");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if (num_of_frames >= 5)
      if (num_of_frames >= 5)
      begin
      begin
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        begin
        begin
Line 13420... Line 13762...
          test_fail("Other interrupts (except Receive Buffer Error) were set");
          test_fail("Other interrupts (except Receive Buffer Error) were set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 13496... Line 13839...
        num_of_bd = 120;
        num_of_bd = 120;
      else
      else
        num_of_bd = num_of_bd + 1;
        num_of_bd = num_of_bd + 1;
    end
    end
    // disable RX
    // disable RX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 13521... Line 13865...
    `TIME; $display("  TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )");
    `TIME; $display("  TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )");
 
 
    // reset MAC registers
    // reset MAC registers
    hard_reset;
    hard_reset;
    // reset MAC and MII LOGIC with soft reset
    // reset MAC and MII LOGIC with soft reset
    reset_mac;
//    reset_mac;
    reset_mii;
//    reset_mii;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
    // set 8 RX buffer descriptors (120 - 127) - must be set before RX enable
 
    wait (wbm_working == 0);
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h78, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable RX, set full-duplex mode, receive small, NO correct IFG
    // enable RX, set full-duplex mode, receive small, NO correct IFG
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
 
    wait (wbm_working == 0);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'hAC;
    st_data = 8'hAC;
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
    set_rx_packet(0, (max_tmp - 4), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
Line 13549... Line 13896...
    begin
    begin
      test_fail("WB INT signal should not be set");
      test_fail("WB INT signal should not be set");
      fail = fail + 1;
      fail = fail + 1;
    end
    end
    // unmask interrupts
    // unmask interrupts
 
    wait (wbm_working == 0);
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    // write to phy's control register for 100Mbps
    // write to phy's control register for 100Mbps
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
Line 13914... Line 14262...
          test_fail("RX buffer descriptor status is not correct");
          test_fail("RX buffer descriptor status is not correct");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // check interrupts
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if (num_of_frames >= 5)
      if (num_of_frames >= 5)
      begin
      begin
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        begin
        begin
Line 13955... Line 14304...
          test_fail("Other interrupts (except Receive Buffer Error) were set");
          test_fail("Other interrupts (except Receive Buffer Error) were set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      // clear interrupts
      // clear interrupts
 
      wait (wbm_working == 0);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      // check WB INT signal
      // check WB INT signal
      if (wb_int !== 1'b0)
      if (wb_int !== 1'b0)
      begin
      begin
        test_fail("WB INT signal should not be set");
        test_fail("WB INT signal should not be set");
Line 14031... Line 14381...
        num_of_bd = 120;
        num_of_bd = 120;
      else
      else
        num_of_bd = num_of_bd + 1;
        num_of_bd = num_of_bd + 1;
    end
    end
    // disable RX
    // disable RX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    @(posedge wb_clk);
    @(posedge wb_clk);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 14137... Line 14488...
  integer        bit_end_1;
  integer        bit_end_1;
  integer        bit_start_2;
  integer        bit_start_2;
  integer        bit_end_2;
  integer        bit_end_2;
  integer        num_of_reg;
  integer        num_of_reg;
  integer        num_of_frames;
  integer        num_of_frames;
 
  integer        num_of_rx_frames;
  integer        num_of_bd;
  integer        num_of_bd;
  integer        i_addr;
  integer        i_addr;
  integer        i_data;
  integer        i_data;
  integer        i_length;
  integer        i_length;
  integer        tmp_len;
  integer        tmp_len;
  integer        tmp_bd;
  integer        tmp_bd;
  integer        tmp_bd_num;
  integer        tmp_bd_num;
  integer        tmp_data;
  integer        tmp_data;
  integer        tmp_ipgt;
  integer        tmp_ipgt;
  integer        test_num;
  integer        test_num;
 
  integer        rx_len;
 
  integer        tx_len;
  reg    [31:0]  tx_bd_num;
  reg    [31:0]  tx_bd_num;
 
  reg    [31:0]  rx_bd_num;
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
  integer        i;
  integer        i;
  integer        i1;
  integer        i1;
  integer        i2;
  integer        i2;
Line 14171... Line 14526...
  reg    [15:0]  min_tmp;
  reg    [15:0]  min_tmp;
  reg            PassAll;
  reg            PassAll;
  reg            RxFlow;
  reg            RxFlow;
  reg            enable_irq_in_rxbd;
  reg            enable_irq_in_rxbd;
  reg    [15:0]  pause_value;
  reg    [15:0]  pause_value;
 
 
begin
begin
// MAC FULL DUPLEX FLOW CONTROL TEST
// MAC FULL DUPLEX FLOW CONTROL TEST
test_heading("MAC FULL DUPLEX FLOW CONTROL TEST");
test_heading("MAC FULL DUPLEX FLOW CONTROL TEST");
$display(" ");
$display(" ");
$display("MAC FULL DUPLEX FLOW CONTROL TEST");
$display("MAC FULL DUPLEX FLOW CONTROL TEST");
fail = 0;
fail = 0;
 
 
// reset MAC registers
// reset MAC registers
hard_reset;
hard_reset;
// reset MAC and MII LOGIC with soft reset
// reset MAC and MII LOGIC with soft reset
reset_mac;
//reset_mac;
reset_mii;
//reset_mii;
// set wb slave response
// set wb slave response
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
  /*
  /*
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
Line 14267... Line 14623...
 
 
    // reset MAC completely
    // reset MAC completely
    hard_reset;
    hard_reset;
    // set wb slave response
    // set wb slave response
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
    max_tmp = 0;
    max_tmp = 0;
    min_tmp = 0;
    min_tmp = 0;
    // set 4 TX buffer descriptors - must be set before TX enable
    // set 4 TX buffer descriptors - must be set before TX enable
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX, set full-duplex mode, padding and CRC appending
    // enable TX, set full-duplex mode, padding and CRC appending
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable TX flow control
    // enable TX flow control
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    // Set MAC address
    // Set MAC address
    mac_hi_addr = 32'h00000001;
    mac_hi_addr = 32'h00000001;
    mac_lo_addr = 32'h02030405;
    mac_lo_addr = 32'h02030405;
    wbm_write(`ETH_MAC_ADDR1, mac_hi_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_MAC_ADDR1, mac_hi_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_MAC_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_MAC_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    // prepare two packets of MAXFL length
    // prepare two packets of MAXFL length
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
    min_tmp = tmp[31:16];
    min_tmp = tmp[31:16];
    st_data = 8'h34;
    st_data = 8'h34;
Line 14308... Line 14661...
 
 
    frame_started = 0;
    frame_started = 0;
    num_of_frames = 0;
    num_of_frames = 0;
    num_of_bd = 0;
    num_of_bd = 0;
    i_length = 0; // 0;
    i_length = 0; // 0;
 
 
 
 
    // Initialize one part of memory with data of control packet
    // Initialize one part of memory with data of control packet
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h0), 32'h0180c200, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h0), 32'h0180c200, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h4), {16'h0001, mac_hi_addr[15:0]}, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h4), {16'h0001, mac_hi_addr[15:0]}, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h8), mac_lo_addr, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h8), mac_lo_addr, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'hc), 32'h88080001, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'hc), 32'h88080001, 4'hF);
Line 14327... Line 14678...
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h2c), 32'h00000000, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h2c), 32'h00000000, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h30), 32'h00000000, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h30), 32'h00000000, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h34), 32'h00000000, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h34), 32'h00000000, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h38), 32'h00000000, 4'hF);
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h38), 32'h00000000, 4'hF);
//    append_tx_crc(`MEMORY_BASE + 2 * max_tmp, 60, 0);       // CRC is appended after the data
//    append_tx_crc(`MEMORY_BASE + 2 * max_tmp, 60, 0);       // CRC is appended after the data
 
 
 
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    // In the following section, control frame will be sent while no other transmission is in progress.//
    // In the following section, control frame will be sent while no other transmission is in progress.//
    // TXC interrupt won't be unmasked.                                                                //
    // TXC interrupt won't be unmasked.                                                                //
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
    // check interrupts
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(data)
    if(data)
      begin
      begin
        test_fail("IRQ already pending!");
        test_fail("IRQ already pending!");
        fail = fail + 1;
        fail = fail + 1;
        `TIME; $display("*E IRQ already pending!");
        `TIME; $display("*E IRQ already pending!");
      end
      end
 
 
    if (wb_int)
    if (wb_int)
    begin
    begin
      test_fail("WB INT signal should not be set!");
      test_fail("WB INT signal should not be set!");
      fail = fail + 1;
      fail = fail + 1;
      `TIME; $display("*E WB INT signal should not be set!");
      `TIME; $display("*E WB INT signal should not be set!");
    end
    end
 
 
    // first destination address on ethernet PHY
    // first destination address on ethernet PHY
    eth_phy.set_tx_mem_addr(0);
    eth_phy.set_tx_mem_addr(0);
    // Request sending the control frame with pause value = 0x1111
    // Request sending the control frame with pause value = 0x1111
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h1111, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h1111, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // wait for transmission to come over
    wait (MTxEn === 1'b1); // start transmit
    wait (MTxEn === 1'b1); // start transmit
    wait (MTxEn === 1'b0); // end transmit
    wait (MTxEn === 1'b0); // end transmit
    repeat(10) @ (posedge wb_clk);  // wait some time
    repeat(10) @ (posedge wb_clk);  // wait some time
    repeat(10) @ (posedge mtx_clk); // wait some time
    repeat(10) @ (posedge mtx_clk); // wait some time
 
    // check interrupt
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(data !== `ETH_INT_TXC)
    if(data !== `ETH_INT_TXC)
      begin
      begin
        test_fail("TXC IRQ should be set!");
        test_fail("TXC IRQ should be set!");
        fail = fail + 1;
        fail = fail + 1;
        `TIME; $display("*E TXC IRQ should be set!");
        `TIME; $display("*E TXC IRQ should be set!");
      end
      end
 
 
    if (wb_int)
    if (wb_int)
    begin
    begin
      test_fail("WB INT signal should not be set because TXC irq is masked!");
      test_fail("WB INT signal should not be set because TXC irq is masked!");
      fail = fail + 1;
      fail = fail + 1;
      `TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
      `TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
    end
    end
 
 
    // Clear TXC interrupt
    // Clear TXC interrupt
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    if (wb_int)
    if (wb_int)
    begin
    begin
      test_fail("WB INT signal should not be set!");
      test_fail("WB INT signal should not be set!");
      fail = fail + 1;
      fail = fail + 1;
      `TIME; $display("*E WB INT signal should not be set!");
      `TIME; $display("*E WB INT signal should not be set!");
    end
    end
 
    // check transmited TX packet
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
    if (tmp > 0)
    if (tmp > 0)
    begin
    begin
      $display("Wrong data of the transmitted packet");
      $display("Wrong data of the transmitted packet");
      test_fail("Wrong data of the transmitted packet");
      test_fail("Wrong data of the transmitted packet");
Line 14398... Line 14743...
    begin
    begin
      $display("Wrong CRC of the transmitted packet");
      $display("Wrong CRC of the transmitted packet");
      test_fail("Wrong CRC of the transmitted packet");
      test_fail("Wrong CRC of the transmitted packet");
      fail = fail + 1;
      fail = fail + 1;
    end
    end
 
 
 
 
 
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    // In the following section, control frame will be sent while no other transmission is in progress.//
    // In the following section, control frame will be sent while no other transmission is in progress.//
    // TXC interrupt is unmasked.                                                                      //
    // TXC interrupt is unmasked.                                                                      //
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
    // unmask all interrupts
    // unmask all interrupts
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // check interrupts
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(data)
    if(data)
      begin
      begin
        test_fail("IRQ already pending!");
        test_fail("IRQ already pending!");
        fail = fail + 1;
        fail = fail + 1;
        `TIME; $display("*E IRQ already pending!");
        `TIME; $display("*E IRQ already pending!");
      end
      end
 
 
    if (wb_int)
    if (wb_int)
    begin
    begin
      test_fail("WB INT signal should not be set!");
      test_fail("WB INT signal should not be set!");
      fail = fail + 1;
      fail = fail + 1;
      `TIME; $display("*E WB INT signal should not be set!");
      `TIME; $display("*E WB INT signal should not be set!");
    end
    end
 
 
    // unmask only TXC interrupts
    // unmask only TXC interrupts
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    // first destination address on ethernet PHY
    // first destination address on ethernet PHY
    eth_phy.set_tx_mem_addr(0);
    eth_phy.set_tx_mem_addr(0);
    // Request sending the control frame with pause value = 0x2222
    // Request sending the control frame with pause value = 0x2222
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h22220000, 4'hF);  // Just for data test
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h22220000, 4'hF);  // Just for data test
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h2222, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h2222, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // wait for transmit to come over
    wait (MTxEn === 1'b1); // start transmit
    wait (MTxEn === 1'b1); // start transmit
    wait (MTxEn === 1'b0); // end transmit
    wait (MTxEn === 1'b0); // end transmit
    repeat(10) @ (posedge wb_clk);  // wait some time
    repeat(10) @ (posedge wb_clk);  // wait some time
    repeat(10) @ (posedge mtx_clk); // wait some time
    repeat(10) @ (posedge mtx_clk); // wait some time
 
    // check INT
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(data !== `ETH_INT_TXC)
    if(data !== `ETH_INT_TXC)
      begin
      begin
        test_fail("TXC IRQ should be set!");
        test_fail("TXC IRQ should be set!");
        fail = fail + 1;
        fail = fail + 1;
        `TIME; $display("*E TXC IRQ should be set!");
        `TIME; $display("*E TXC IRQ should be set!");
      end
      end
 
 
    if (!wb_int)
    if (!wb_int)
    begin
    begin
      test_fail("WB INT signal should be set!");
      test_fail("WB INT signal should be set!");
      fail = fail + 1;
      fail = fail + 1;
      `TIME; $display("*E WB INT signal should be set!");
      `TIME; $display("*E WB INT signal should be set!");
    end
    end
 
 
    // Clear TXC interrupt
    // Clear TXC interrupt
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    if (wb_int)
    if (wb_int)
    begin
    begin
      test_fail("WB INT signal should not be set!");
      test_fail("WB INT signal should not be set!");
      fail = fail + 1;
      fail = fail + 1;
      `TIME; $display("*E WB INT signal should not be set!");
      `TIME; $display("*E WB INT signal should not be set!");
    end
    end
 
    // check transmited TX packet
 
 
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
    if (tmp > 0)
    if (tmp > 0)
    begin
    begin
      $display("Wrong data of the transmitted packet");
      $display("Wrong data of the transmitted packet");
      test_fail("Wrong data of the transmitted packet");
      test_fail("Wrong data of the transmitted packet");
Line 14480... Line 14814...
    begin
    begin
      $display("Wrong CRC of the transmitted packet");
      $display("Wrong CRC of the transmitted packet");
      test_fail("Wrong CRC of the transmitted packet");
      test_fail("Wrong CRC of the transmitted packet");
      fail = fail + 1;
      fail = fail + 1;
    end
    end
 
 
 
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    // In the following section, control frame sending is requested while no other transmission        //
    // In the following section, control frame sending is requested while no other transmission        //
    // is in progress. TXC interrupt is unmasked.                                                      //
    // is in progress. TXC interrupt is unmasked.                                                      //
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
    // unmask all interrupts
    // unmask all interrupts
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(data)
    if(data)
      begin
      begin
        test_fail("IRQ already pending!");
        test_fail("IRQ already pending!");
        fail = fail + 1;
        fail = fail + 1;
        `TIME; $display("*E IRQ already pending!");
        `TIME; $display("*E IRQ already pending!");
      end
      end
 
 
    if (wb_int)
    if (wb_int)
    begin
    begin
      test_fail("WB INT signal should not be set!");
      test_fail("WB INT signal should not be set!");
      fail = fail + 1;
      fail = fail + 1;
      `TIME; $display("*E WB INT signal should not be set!");
      `TIME; $display("*E WB INT signal should not be set!");
    end
    end
 
 
 
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    // In the following section, control frame request and data send request are both set. At the      //
    // In the following section, control frame request and data send request are both set. At the      //
    // beginning control frame request will be faster than data send request, later the opposite.      //
    // beginning control frame request will be faster than data send request, later the opposite.      //
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    for (i=0; i<32; i=i+1)
    for (i=0; i<32; i=i+1)
Line 14519... Line 14846...
      set_tx_bd(0, 0, 16'h100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE)); // irq, pad, crc
      set_tx_bd(0, 0, 16'h100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE)); // irq, pad, crc
      set_tx_bd_wrap(0);
      set_tx_bd_wrap(0);
      // first destination address on ethernet PHY
      // first destination address on ethernet PHY
      eth_phy.set_tx_mem_addr(0);
      eth_phy.set_tx_mem_addr(0);
      set_tx_bd_ready(0, 0);
      set_tx_bd_ready(0, 0);
 
      // wait for transmission to start  
      wait (MTxEn === 1'b1); // start transmit
      wait (MTxEn === 1'b1); // start transmit
 
 
      repeat(i) @ (posedge mtx_clk);  // We need to wait some time until TX module starts using the data (preamble stage is over)
      repeat(i) @ (posedge mtx_clk);  // We need to wait some time until TX module starts using the data (preamble stage is over)
 
 
      // Send control frame request
      // Send control frame request
      wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), {i[3:0], i[3:0], i[3:0], i[3:0], 16'h0}, 4'hF);  // Just for data test
      wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), {i[3:0], i[3:0], i[3:0], i[3:0], 16'h0}, 4'hF);  // Just for data test
      wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | {16'h0, i[3:0], i[3:0], i[3:0], i[3:0]}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | {16'h0, i[3:0], i[3:0], i[3:0], i[3:0]}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      // wait until transmission is over  
      wait (MTxEn === 1'b0); // Wait until data frame transmission is over
      wait (MTxEn === 1'b0); // Wait until data frame transmission is over
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
      tmp_len = eth_phy.tx_len; // the length of a packet which was sent out first!!!
      tmp_len = eth_phy.tx_len; // the length of a packet which was sent out first!!!
      repeat(10) @ (posedge wb_clk);  // wait some time so status is written
      repeat(10) @ (posedge wb_clk);  // wait some time so status is written
 
 
      // first destination address on ethernet PHY
      // first destination address on ethernet PHY
      eth_phy.set_tx_mem_addr(0);
      eth_phy.set_tx_mem_addr(0);
 
      // check interrupt depending on which packet was sent
      if(tmp_len == 64)  // Control frame
      if(tmp_len == 64)  // Control frame
      begin
      begin
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        if(data !== `ETH_INT_TXC)
        if(data !== `ETH_INT_TXC)
        begin
        begin
Line 14558... Line 14882...
          fail = fail + 1;
          fail = fail + 1;
          `TIME; $display("*E TXB IRQ should be set!");
          `TIME; $display("*E TXB IRQ should be set!");
          `TIME; $display("ETH_INT = 0x%0x", data);
          `TIME; $display("ETH_INT = 0x%0x", data);
        end
        end
      end
      end
 
      // check transmited TX packet
      if(tmp_len == 64)  // Control frame
      if(tmp_len == 64)  // Control frame
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
      else
      else
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
 
 
      if (tmp > 0)
      if (tmp > 0)
      begin
      begin
        $display("Wrong data of the transmitted packet");
        $display("Wrong data of the transmitted packet");
        test_fail("Wrong data of the transmitted packet");
        test_fail("Wrong data of the transmitted packet");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
 
 
      // check transmited TX packet CRC
      // check transmited TX packet CRC
      if(tmp_len == 64)  // Control frame
      if(tmp_len == 64)  // Control frame
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
      else
      else
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
Line 14583... Line 14905...
      begin
      begin
        $display("Wrong CRC of the transmitted packet");
        $display("Wrong CRC of the transmitted packet");
        test_fail("Wrong CRC of the transmitted packet");
        test_fail("Wrong CRC of the transmitted packet");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
 
      // wait for control frame to transmit
 
 
      wait (MTxEn === 1'b1); // start transmit of the control frame
      wait (MTxEn === 1'b1); // start transmit of the control frame
      wait (MTxEn === 1'b0); // end transmit of the control frame
      wait (MTxEn === 1'b0); // end transmit of the control frame
      repeat(10) @ (posedge wb_clk);  // wait some time
      repeat(10) @ (posedge wb_clk);  // wait some time
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
 
      // check interrupts  
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if(data !== (`ETH_INT_TXC | `ETH_INT_TXB))
      if(data !== (`ETH_INT_TXC | `ETH_INT_TXB))
      begin
      begin
        test_fail("TXC and TXB IRQ should be set!");
        test_fail("TXC and TXB IRQ should be set!");
        fail = fail + 1;
        fail = fail + 1;
        `TIME; $display("*E TXC and TXB IRQ should be set! (ETH_INT=0x%0x)", data);
        `TIME; $display("*E TXC and TXB IRQ should be set! (ETH_INT=0x%0x)", data);
      end
      end
 
 
      if (!wb_int)
      if (!wb_int)
      begin
      begin
        test_fail("WB INT signal should be set!");
        test_fail("WB INT signal should be set!");
        fail = fail + 1;
        fail = fail + 1;
        `TIME; $display("*E WB INT signal should be set!");
        `TIME; $display("*E WB INT signal should be set!");
      end
      end
 
 
      // Clear TXC and TXB interrupt
      // Clear TXC and TXB interrupt
      wbm_write(`ETH_INT, `ETH_INT_TXC | `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
      wbm_write(`ETH_INT, `ETH_INT_TXC | `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
 
 
      if (wb_int)
      if (wb_int)
      begin
      begin
        test_fail("WB INT signal should not be set!");
        test_fail("WB INT signal should not be set!");
        fail = fail + 1;
        fail = fail + 1;
        `TIME; $display("*E WB INT signal should not be set!");
        `TIME; $display("*E WB INT signal should not be set!");
      end
      end
 
 
      if(tmp_len == 64)  // Control frame
      if(tmp_len == 64)  // Control frame
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
      else
      else
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
 
 
      if (tmp > 0)
      if (tmp > 0)
      begin
      begin
        $display("Wrong data of the transmitted packet");
        $display("Wrong data of the transmitted packet");
        test_fail("Wrong data of the transmitted packet");
        test_fail("Wrong data of the transmitted packet");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
 
 
      // check transmited TX packet CRC
      // check transmited TX packet CRC
      if(tmp_len == 64)  // Control frame
      if(tmp_len == 64)  // Control frame
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
      else
      else
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
 
 
      if (tmp > 0)
      if (tmp > 0)
      begin
      begin
        $display("Wrong CRC of the transmitted packet");
        $display("Wrong CRC of the transmitted packet");
        test_fail("Wrong CRC of the transmitted packet");
        test_fail("Wrong CRC of the transmitted packet");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
    end // for loop
    end // for loop
 
 
    if(fail)
 
    begin
 
      test_name = "TEST 0: FINISHED WITH ERRORS";
 
      `TIME; $display("  TEST 0: FINISHED WITH ERRORS");
 
    end
 
    else
 
    begin
 
      test_name = "TEST 0: SUCCESSFULLY FINISHED";
 
      `TIME; $display("  TEST 0: SUCCESSFULLY FINISHED");
 
    end
 
 
 
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
    else
    else
      fail = 0;
      fail = 0;
 
 
  end
  end
 
 
 
 
  if (test_num == 1) // 
 
  begin
 
    #1;
 
    // TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )
 
    test_name = "TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )";
 
    `TIME; $display("  TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )");
 
  end
 
 
 
  ////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////
  ////                                                            ////
  ////                                                            ////
  ////  Receive control frames with PASSALL option turned on and  ////
  ////  Test inserts control frames while transmitting normal     ////
  ////  off. Using only one RX buffer decriptor ( 10Mbps ).       ////
  ////  frames. Using 4 TX buffer decriptors ( 100Mbps ).         ////
  ////                                                            ////
  ////                                                            ////
  ////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////
  if (test_num == 2) // 
  if (test_num == 1) // 
  begin
  begin
    // TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )
    // TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )
    test_name   = "TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )";
    test_name = "TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )";
    `TIME; $display("  TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )");
    `TIME; $display("  TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )");
 
 
    // unmask interrupts
    // reset MAC completely
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    hard_reset;
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // set wb slave response
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    max_tmp = 0;
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
    min_tmp = 0;
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
    // set 4 TX buffer descriptors - must be set before TX enable
              `ETH_MODER_PRO | `ETH_MODER_BRO,
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // enable TX, set full-duplex mode, padding and CRC appending
 
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_PAD | `ETH_MODER_FULLD | `ETH_MODER_CRCEN,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // enable RX_FLOW control
    // enable TX flow control
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    // prepare one packet of 100 bytes long
    // Set MAC address
//    st_data = 8'h1A;
    mac_hi_addr = 32'h00000001;
//    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data); 
    mac_lo_addr = 32'h02030405;
//    append_rx_crc (64, 100, 1'b0, 1'b0); // CRC for data packet
    wbm_write(`ETH_MAC_ADDR1, mac_hi_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    st_data = 8'h01;
    wbm_write(`ETH_MAC_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    set_tx_packet(`MEMORY_BASE + 64, 100, 8'h01); // length without CRC
    // prepare two packets of MAXFL length
    set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    set_tx_bd_wrap(0);
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
 
    min_tmp = tmp[31:16];
 
    st_data = 8'h34;
 
    set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
 
    st_data = 8'h56;
 
    set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
    // check WB INT signal
    // check WB INT signal
    if (wb_int !== 1'b0)
    if (wb_int !== 1'b0)
    begin
    begin
      test_fail("WB INT signal should not be set");
      test_fail("WB INT signal should not be set");
      fail = fail + 1;
      fail = fail + 1;
    end
    end
 
 
    // write to phy's control register for 10Mbps
    // write to phy's control register for 100Mbps
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
    speed = 10;
    speed = 100;
 
 
    // RXB and RXC interrupts masked
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                             `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
 
    // Test irq logic while RXB and RXC interrupts are masked. IRQ in RxBD is cleared
    frame_started = 0;
    for (i=0; i<3; i=i+1)
    num_of_frames = 0;
 
    num_of_bd = 0;
 
    i_length = 0; // 0;
 
    // Initialize one part of memory with data of control packet
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h0), 32'h0180c200, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h4), {16'h0001, mac_hi_addr[15:0]}, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h8), mac_lo_addr, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'hc), 32'h88080001, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h11110000, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h14), 32'h00000000, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h18), 32'h00000000, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h1c), 32'h00000000, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h20), 32'h00000000, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h24), 32'h00000000, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h28), 32'h00000000, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h2c), 32'h00000000, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h30), 32'h00000000, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h34), 32'h00000000, 4'hF);
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h38), 32'h00000000, 4'hF);
 
//    append_tx_crc(`MEMORY_BASE + 2 * max_tmp, 60, 0);       // CRC is appended after the data
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
    // In the following section, control frame will be sent while no other transmission is in progress.//
 
    // TXC interrupt won't be unmasked.                                                                //
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
    // check interrupts
 
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    if(data)
    begin
    begin
      pause_value = i+1;
        test_fail("IRQ already pending!");
      set_rx_control_packet(0, pause_value);  // CRC already appended
        fail = fail + 1;
      // choose generating carrier sense and collision for first and last 64 lengths of frames
        `TIME; $display("*E IRQ already pending!");
      case (i)
      end
      0: // PASSALL = 0, RXFLOW = 1, IRQ in RxBD = 1
    if (wb_int)
      begin
      begin
        PassAll=0; RxFlow=1; enable_irq_in_rxbd=1;
      test_fail("WB INT signal should not be set!");
        // enable interrupt generation
      fail = fail + 1;
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
      `TIME; $display("*E WB INT signal should not be set!");
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
      end
      1: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 1
    // first destination address on ethernet PHY
 
    eth_phy.set_tx_mem_addr(0);
 
    // Request sending the control frame with pause value = 0x1111
 
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h1111, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // wait for transmission to come over
 
    wait (MTxEn === 1'b1); // start transmit
 
    wait (MTxEn === 1'b0); // end transmit
 
    repeat(10) @ (posedge wb_clk);  // wait some time
 
    repeat(10) @ (posedge mtx_clk); // wait some time
 
    // check interrupt
 
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    if(data !== `ETH_INT_TXC)
      begin
      begin
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=1;
        test_fail("TXC IRQ should be set!");
        // enable interrupt generation
        fail = fail + 1;
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
        `TIME; $display("*E TXC IRQ should be set!");
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
      end
      2: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 0
    if (wb_int)
      begin
      begin
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=0;
      test_fail("WB INT signal should not be set because TXC irq is masked!");
        // enable interrupt generation
      fail = fail + 1;
        set_rx_bd(127, 127, 1'b0, `MEMORY_BASE);
      `TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
      end
      default:
    // Clear TXC interrupt
 
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    if (wb_int)
      begin
      begin
        $display("*E We should never get here !!!");
      test_fail("WB INT signal should not be set!");
        test_fail("We should never get here !!!");
 
        fail = fail + 1;
        fail = fail + 1;
 
      `TIME; $display("*E WB INT signal should not be set!");
      end
      end
      endcase
    // check transmited TX packet
 
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
 
    if (tmp > 0)
 
    begin
 
      $display("Wrong data of the transmitted packet");
 
      test_fail("Wrong data of the transmitted packet");
 
      fail = fail + 1;
 
    end
 
    // check transmited TX packet CRC
 
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
 
    if (tmp > 0)
 
    begin
 
      $display("Wrong CRC of the transmitted packet");
 
      test_fail("Wrong CRC of the transmitted packet");
 
      fail = fail + 1;
 
    end
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
    // In the following section, control frame will be sent while no other transmission is in progress.//
 
    // TXC interrupt is unmasked.                                                                      //
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
    // unmask all interrupts
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // check interrupts
 
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    if(data)
 
      begin
 
        test_fail("IRQ already pending!");
 
        fail = fail + 1;
 
        `TIME; $display("*E IRQ already pending!");
 
      end
 
    if (wb_int)
 
    begin
 
      test_fail("WB INT signal should not be set!");
 
      fail = fail + 1;
 
      `TIME; $display("*E WB INT signal should not be set!");
 
    end
 
    // unmask only TXC interrupts
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // first destination address on ethernet PHY
 
    eth_phy.set_tx_mem_addr(0);
 
    // Request sending the control frame with pause value = 0x2222
 
    wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h22220000, 4'hF);  // Just for data test
 
    wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | 32'h2222, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // wait for transmit to come over
 
    wait (MTxEn === 1'b1); // start transmit
 
    wait (MTxEn === 1'b0); // end transmit
 
    repeat(10) @ (posedge wb_clk);  // wait some time
 
    repeat(10) @ (posedge mtx_clk); // wait some time
 
    // check INT
 
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    if(data !== `ETH_INT_TXC)
 
      begin
 
        test_fail("TXC IRQ should be set!");
 
        fail = fail + 1;
 
        `TIME; $display("*E TXC IRQ should be set!");
 
      end
 
    if (!wb_int)
 
    begin
 
      test_fail("WB INT signal should be set!");
 
      fail = fail + 1;
 
      `TIME; $display("*E WB INT signal should be set!");
 
    end
 
    // Clear TXC interrupt
 
    wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    if (wb_int)
 
    begin
 
      test_fail("WB INT signal should not be set!");
 
      fail = fail + 1;
 
      `TIME; $display("*E WB INT signal should not be set!");
 
    end
 
    // check transmited TX packet
 
    check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
 
    if (tmp > 0)
 
    begin
 
      $display("Wrong data of the transmitted packet");
 
      test_fail("Wrong data of the transmitted packet");
 
      fail = fail + 1;
 
    end
 
    // check transmited TX packet CRC
 
    #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
 
    if (tmp > 0)
 
    begin
 
      $display("Wrong CRC of the transmitted packet");
 
      test_fail("Wrong CRC of the transmitted packet");
 
      fail = fail + 1;
 
    end
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
    // In the following section, control frame sending is requested while no other transmission        //
 
    // is in progress. TXC interrupt is unmasked.                                                      //
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
    // unmask all interrupts
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    if(data)
 
      begin
 
        test_fail("IRQ already pending!");
 
        fail = fail + 1;
 
        `TIME; $display("*E IRQ already pending!");
 
      end
 
    if (wb_int)
 
    begin
 
      test_fail("WB INT signal should not be set!");
 
      fail = fail + 1;
 
      `TIME; $display("*E WB INT signal should not be set!");
 
    end
 
 
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
    // In the following section, control frame request and data send request are both set. At the      //
 
    // beginning control frame request will be faster than data send request, later the opposite.      //
 
    /////////////////////////////////////////////////////////////////////////////////////////////////////
 
    for (i=0; i<32; i=i+1)
 
    begin
 
      // Request sending the control frame with pause value = 0x5678
 
      set_tx_bd(0, 0, 16'h100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE)); // irq, pad, crc
 
      set_tx_bd_wrap(0);
 
      // first destination address on ethernet PHY
 
      eth_phy.set_tx_mem_addr(0);
 
      set_tx_bd_ready(0, 0);
 
      // wait for transmission to start  
 
      wait (MTxEn === 1'b1); // start transmit
 
      repeat(i) @ (posedge mtx_clk);  // We need to wait some time until TX module starts using the data (preamble stage is over)
 
      // Send control frame request
 
      wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), {i[3:0], i[3:0], i[3:0], i[3:0], 16'h0}, 4'hF);  // Just for data test
 
      wbm_write(`ETH_TX_CTRL, `ETH_TX_CTRL_TXPAUSERQ | {16'h0, i[3:0], i[3:0], i[3:0], i[3:0]}, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      // wait until transmission is over  
 
      wait (MTxEn === 1'b0); // Wait until data frame transmission is over
 
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
 
      tmp_len = eth_phy.tx_len; // the length of a packet which was sent out first!!!
 
      repeat(10) @ (posedge wb_clk);  // wait some time so status is written
 
      // first destination address on ethernet PHY
 
      eth_phy.set_tx_mem_addr(0);
 
      // check interrupt depending on which packet was sent
 
 
 
      if(tmp_len == 64)  // Control frame
 
      begin
 
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        if(data !== `ETH_INT_TXC)
 
        begin
 
          test_fail("TXC IRQ should be set!");
 
          fail = fail + 1;
 
          `TIME; $display("*E TXC IRQ should be set!");
 
          `TIME; $display("ETH_INT = 0x%0x", data);
 
        end
 
      end
 
      else
 
      begin
 
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        if(data !== `ETH_INT_TXB)
 
        begin
 
          test_fail("TXB IRQ should be set!");
 
          fail = fail + 1;
 
          `TIME; $display("*E TXB IRQ should be set!");
 
          `TIME; $display("ETH_INT = 0x%0x", data);
 
        end
 
      end
 
      // check transmited TX packet
 
      if(tmp_len == 64)  // Control frame
 
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
 
      else
 
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
 
      if (tmp > 0)
 
      begin
 
        $display("Wrong data of the transmitted packet");
 
        test_fail("Wrong data of the transmitted packet");
 
        fail = fail + 1;
 
      end
 
      // check transmited TX packet CRC
 
      if(tmp_len == 64)  // Control frame
 
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
 
      else
 
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
 
 
 
      if (tmp > 0)
 
      begin
 
        $display("Wrong CRC of the transmitted packet");
 
        test_fail("Wrong CRC of the transmitted packet");
 
        fail = fail + 1;
 
      end
 
      // wait for control frame to transmit
 
      wait (MTxEn === 1'b1); // start transmit of the control frame
 
      wait (MTxEn === 1'b0); // end transmit of the control frame
 
      repeat(10) @ (posedge wb_clk);  // wait some time
 
      repeat(10) @ (posedge mtx_clk); // wait some time so status is written
 
      // check interrupts  
 
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      if(data !== (`ETH_INT_TXC | `ETH_INT_TXB))
 
      begin
 
        test_fail("TXC and TXB IRQ should be set!");
 
        fail = fail + 1;
 
        `TIME; $display("*E TXC and TXB IRQ should be set! (ETH_INT=0x%0x)", data);
 
      end
 
      if (!wb_int)
 
      begin
 
        test_fail("WB INT signal should be set!");
 
        fail = fail + 1;
 
        `TIME; $display("*E WB INT signal should be set!");
 
      end
 
      // Clear TXC and TXB interrupt
 
      wbm_write(`ETH_INT, `ETH_INT_TXC | `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
 
      if (wb_int)
 
      begin
 
        test_fail("WB INT signal should not be set!");
 
        fail = fail + 1;
 
        `TIME; $display("*E WB INT signal should not be set!");
 
      end
 
      if(tmp_len == 64)  // Control frame
 
        check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
 
      else
 
        check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
 
      if (tmp > 0)
 
      begin
 
        $display("Wrong data of the transmitted packet");
 
        test_fail("Wrong data of the transmitted packet");
 
        fail = fail + 1;
 
      end
 
      // check transmited TX packet CRC
 
      if(tmp_len == 64)  // Control frame
 
        #1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
 
      else
 
        #1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
 
      if (tmp > 0)
 
      begin
 
        $display("Wrong CRC of the transmitted packet");
 
        test_fail("Wrong CRC of the transmitted packet");
 
        fail = fail + 1;
 
      end
 
    end // for loop
 
    if(fail == 0)
 
      test_ok;
 
    else
 
      fail = 0;
 
  end
 
 
 
 
 
  ////////////////////////////////////////////////////////////////////
 
  ////                                                            ////
 
  ////  Receive control frames with PASSALL option turned on and  ////
 
  ////  off. Using only one RX buffer decriptor ( 10Mbps ).       ////
 
  ////                                                            ////
 
  ////////////////////////////////////////////////////////////////////
 
  if (test_num == 2) // 
 
  begin
 
    // TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )
 
    test_name   = "TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )";
 
    `TIME; $display("  TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )");
 
 
 
    // unmask interrupts
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
 
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
 
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
 
              `ETH_MODER_PRO | `ETH_MODER_BRO,
 
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // enable RX_FLOW control
 
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // prepare one packet of 100 bytes long
 
//    st_data = 8'h1A;
 
//    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data); 
 
//    append_rx_crc (64, 100, 1'b0, 1'b0); // CRC for data packet
 
    st_data = 8'h01;
 
    set_tx_packet(`MEMORY_BASE + 64, 100, 8'h01); // length without CRC
 
    set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
 
    set_tx_bd_wrap(0);
 
    // check WB INT signal
 
    if (wb_int !== 1'b0)
 
    begin
 
      test_fail("WB INT signal should not be set");
 
      fail = fail + 1;
 
    end
 
 
 
    // write to phy's control register for 10Mbps
 
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
 
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
 
    speed = 10;
 
 
 
    // RXB and RXC interrupts masked
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                             `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // Test irq logic while RXB and RXC interrupts are masked. IRQ in RxBD is cleared
 
    for (i=0; i<3; i=i+1)
 
    begin
 
      pause_value = i+2;
 
      set_rx_control_packet(0, pause_value);  // CRC already appended
 
      // choose generating carrier sense and collision for first and last 64 lengths of frames
 
      case (i)
 
      0: // PASSALL = 0, RXFLOW = 1, IRQ in RxBD = 1
 
      begin
 
        PassAll=0; RxFlow=1; enable_irq_in_rxbd=1;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
 
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      1: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 1
 
      begin
 
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=1;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
 
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      2: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 0
 
      begin
 
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=0;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b0, `MEMORY_BASE);
 
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      default:
 
      begin
 
        $display("*E We should never get here !!!");
 
        test_fail("We should never get here !!!");
 
        fail = fail + 1;
 
      end
 
      endcase
 
      // not detect carrier sense in FD and no collision
 
      eth_phy.no_carrier_sense_rx_fd_detect(0);
 
      eth_phy.collision(0);
 
      // set wrap bit and empty bit
 
      set_rx_bd_wrap(127);
 
      set_rx_bd_empty(127, 127);
 
      // transmit
 
      fork
 
        begin
 
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
 
          repeat(10) @(posedge mrx_clk);
 
        end
 
        begin
 
          wait (MRxDV === 1'b1); // start transmit
 
          #1 check_rx_bd(127, data);
 
          if (data[15] !== 1)
 
          begin
 
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
 
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
 
            fail = fail + 1;
 
          end
 
          wait (MRxDV === 1'b0); // received pause frame
 
          repeat(5) @(posedge mrx_clk);  // Wait some time so pause is activated.
 
          repeat(5) @(posedge mtx_clk);  // Wait some time so pause is activated.
 
          set_tx_bd_ready(0, 0); // Request sending the data. Data should not be sent when pause frame was received
 
                                 // and RxFlow enabled.
 
          // When we exit the while loop, status frame is received
 
          repeat(`ETH_TX_FIFO_DEPTH) @(eth_ma_wb_ack_i);  // Waiting until TX fifo is filled.
 
          repeat(10) @(posedge mtx_clk);  // Wait some time for tx start.
 
        end
 
      join
 
      #1 check_rx_bd(127, data);
 
      // Checking buffer descriptor
 
      if(PassAll)
 
      begin
 
        if(enable_irq_in_rxbd)
 
        begin
 
          if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
 
          begin
 
            $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
            $display("RxBD = 0x%0x", data);
 
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
            fail = fail + 1;
 
          end
 
        end
 
        else
 
        begin
 
          if(data !== 32'h402100)    // Rx BD must not be marked as EMPTY (control frame is received)
 
          begin
 
            $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
            $display("RxBD = 0x%0x", data);
 
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
            fail = fail + 1;
 
          end
 
        end
 
      end
 
      else
 
      begin
 
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
 
        begin
 
          $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
 
          $display("RxBD = 0x%0x", data);
 
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
 
          fail = fail + 1;
 
        end
 
      end
 
      // Checking if interrupt was generated
 
      if (wb_int)
 
      begin
 
        `TIME; $display("*E WB INT signal should not be set because both RXB and RXC interrupts are masked");
 
        test_fail("WB INT signal should not be set because both RXB and RXC interrupts are masked");
 
        fail = fail + 1;
 
      end
 
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      if(RxFlow)
 
      begin
 
        if(data !== (`ETH_INT_RXC))
 
        begin
 
          test_fail("RXC is not set or multiple IRQs active!");
 
          fail = fail + 1;
 
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
 
        // Clear RXC interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
 
      end
 
      else if(enable_irq_in_rxbd)
 
      begin
 
        if(data !== (`ETH_INT_RXB))
 
        begin
 
          test_fail("RXB is not set or multiple IRQs active!");
 
          fail = fail + 1;
 
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
 
        // Clear RXC interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
 
      end
 
      else
 
      begin
 
        if(data !== 0)
 
        begin
 
          test_fail("Some IRQs is active!");
 
          fail = fail + 1;
 
          `TIME; $display("*E Some IRQs is active! (ETH_INT=0x%0x)", data);
 
        end
 
      end
 
      if(RxFlow)
 
        begin
 
          if(MTxEn)   // If pause frame was received OK, transmission of the data packet should not start
 
            begin
 
              `TIME; $display("*E Transmission should not be started because pause frame was received.");
 
              test_fail("Transmission should not be started because pause frame was received.");
 
              fail = fail + 1;
 
            end
 
          while(pause_value)
 
            begin
 
              pause_value=pause_value-1;
 
              repeat(2*64) @(posedge mtx_clk);  // Wait for the time needed for the pause (1 slot).
 
              if((!pause_value) && (!MTxEn))        // Transmission should be enabled now.
 
                begin
 
                  `TIME; $display("*E Transmission should be started because pause passed.");
 
                  test_fail("Transmission should be started because pause passed.");
 
                  fail = fail + 1;
 
                end
 
              else if((pause_value) && (MTxEn))     // Transmission should not be enabled now.
 
                begin
 
                  `TIME; $display("*E Transmission should still be paused.");
 
                  test_fail("Transmission should still be paused.");
 
                  fail = fail + 1;
 
                end
 
            end
 
        end
 
      else
 
        begin
 
          if(!MTxEn)   // Pause frame was not received because RxFlow is turned off.
 
            begin
 
              `TIME; $display("*E Transmission should be started because pause frame was not received (RxFlow=0).");
 
              test_fail("Transmission should be started because pause frame was not received (RxFlow=0).");
 
              fail = fail + 1;
 
            end
 
        end
 
      wait(wb_int);   // Wait antil frame transmission is over and irq generated
 
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      if(data !== (`ETH_INT_TXB))
 
        begin
 
          test_fail("TXB is not set or multiple IRQs active!");
 
          fail = fail + 1;
 
          `TIME; $display("*E TXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
 
        // Clear TXB interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
 
    end
 
    // End: Test is irq is set while RXB and RXC interrupts are masked.
 
 
 
    // Now all interrupts are unmasked. Performing tests again.
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    for (i=0; i<4; i=i+1)
 
    begin
 
      pause_value = i+1;
 
      set_rx_control_packet(0, pause_value);  // CRC already appended
 
      // choose generating carrier sense and collision for first and last 64 lengths of frames
 
      case (i)
 
      0: // PASSALL = 0, RXFLOW = 0
 
      begin
 
        PassAll=0; RxFlow=0;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
 
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, 0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      1: // PASSALL = 0, RXFLOW = 1
 
      begin
 
        PassAll=0; RxFlow=1;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
 
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      2: // PASSALL = 1, RXFLOW = 0
 
      begin
 
        PassAll=1; RxFlow=0;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
 
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      default: // 3: PASSALL = 1, RXFLOW = 1
 
      begin
 
        PassAll=1; RxFlow=1;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
 
        // Set PASSALL = 1 and RXFLOW = 1
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      endcase
 
      // not detect carrier sense in FD and no collision
 
      eth_phy.no_carrier_sense_rx_fd_detect(0);
 
      eth_phy.collision(0);
 
      // set wrap bit and empty bit
 
      set_rx_bd_wrap(127);
 
      set_rx_bd_empty(127, 127);
 
      // transmit
 
      fork
 
        begin
 
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
 
          repeat(10) @(posedge mrx_clk);
 
        end
 
        begin
 
          #1 check_rx_bd(127, data);
 
          wait (MRxDV === 1'b1); // start transmit
 
          #1 check_rx_bd(127, data);
 
          if (data[15] !== 1)
 
          begin
 
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
 
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
 
            fail = fail + 1;
 
          end
 
          wait (MRxDV === 1'b0); // end transmit
 
          repeat(50) @(posedge mrx_clk);  // Wait some time so frame is received and
 
          repeat (100) @(posedge wb_clk); // status/irq is written.
 
 
 
          if(RxFlow)    // Waiting x slot times before continuing so pause is deactivated.
 
            repeat(64 * 2 * pause_value) @(posedge mrx_clk);
 
        end
 
      join
 
      #1 check_rx_bd(127, data);
 
      // Checking buffer descriptor
 
      if(PassAll)
 
      begin
 
        if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
 
        begin
 
          $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
          $display("RxBD = 0x%0x", data);
 
          test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
          fail = fail + 1;
 
        end
 
      end
 
      else
 
      begin
 
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
 
        begin
 
          $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
 
          $display("RxBD = 0x%0x", data);
 
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
 
          fail = fail + 1;
 
        end
 
      end
 
      // Checking if interrupt was generated
 
      if(RxFlow || PassAll)
 
      begin
 
        if (!wb_int)
 
        begin
 
          `TIME; $display("*E WB INT signal should be set");
 
          test_fail("WB INT signal should be set");
 
          fail = fail + 1;
 
        end
 
      end
 
      else
 
      begin
 
        if (wb_int)
 
        begin
 
          `TIME; $display("*E WB INT signal should not be set");
 
          test_fail("WB INT signal should not be set");
 
          fail = fail + 1;
 
        end
 
      end
 
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      if(RxFlow)
 
      begin
 
        if(data !== (`ETH_INT_RXC))
 
        begin
 
          test_fail("RXC is not set or multiple IRQs active!");
 
          fail = fail + 1;
 
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
 
        // Clear RXC interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
 
      end
 
      else if(PassAll)
 
      begin
 
        if(data !== (`ETH_INT_RXB))
 
        begin
 
          test_fail("RXB is not set or multiple IRQs active!");
 
          fail = fail + 1;
 
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
 
        // Clear RXB interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
 
      end
 
      else
 
      begin
 
        if(data !== 0)
 
        begin
 
          test_fail("No interrupt should be set!");
 
          fail = fail + 1;
 
          `TIME; $display("*E No interrupt should be set! (ETH_INT=0x%0x)", data);
 
        end
 
      end
 
    end
 
    // disable RX
 
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
 
              `ETH_MODER_PRO | `ETH_MODER_BRO,
 
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    if(fail == 0)
 
      test_ok;
 
    else
 
      fail = 0;
 
  end
 
 
 
 
 
  ////////////////////////////////////////////////////////////////////
 
  ////                                                            ////
 
  ////  Receive control frames with PASSALL option turned on and  ////
 
  ////  off. Using only one RX buffer decriptor ( 100Mbps ).      ////
 
  ////                                                            ////
 
  ////////////////////////////////////////////////////////////////////
 
  if (test_num == 3) // 
 
  begin
 
    // TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )
 
    test_name   = "TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )";
 
    `TIME; $display("  TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )");
 
 
 
    // unmask interrupts
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
 
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
 
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
 
              `ETH_MODER_PRO | `ETH_MODER_BRO,
 
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // enable RX_FLOW control
 
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // prepare one packet of 100 bytes long
 
//    st_data = 8'h1A;
 
//    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data); 
 
//    append_rx_crc (64, 100, 1'b0, 1'b0); // CRC for data packet
 
    st_data = 8'h01;
 
    set_tx_packet(`MEMORY_BASE + 64, 100, 8'h01); // length without CRC
 
    set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
 
    set_tx_bd_wrap(0);
 
    // check WB INT signal
 
    if (wb_int !== 1'b0)
 
    begin
 
      test_fail("WB INT signal should not be set");
 
      fail = fail + 1;
 
    end
 
 
 
    // write to phy's control register for 100Mbps
 
    #Tp eth_phy.control_bit14_10 = 5'b01000; // bit 13 set - speed 100
 
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset - (10/100), bit 8 set - FD
 
    speed = 100;
 
 
 
    // RXB and RXC interrupts masked
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                             `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // Test irq logic while RXB and RXC interrupts are masked. IRQ in RxBD is cleared
 
    for (i=0; i<3; i=i+1)
 
    begin
 
      pause_value = i+2;
 
      set_rx_control_packet(0, pause_value);  // CRC already appended
 
      // choose generating carrier sense and collision for first and last 64 lengths of frames
 
      case (i)
 
      0: // PASSALL = 0, RXFLOW = 1, IRQ in RxBD = 1
 
      begin
 
        PassAll=0; RxFlow=1; enable_irq_in_rxbd=1;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
 
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      1: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 1
 
      begin
 
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=1;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
 
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      2: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 0
 
      begin
 
        PassAll=1; RxFlow=0; enable_irq_in_rxbd=0;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b0, `MEMORY_BASE);
 
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      default:
 
      begin
 
        `TIME; $display("*E We should never get here !!!");
 
        test_fail("We should never get here !!!");
 
        fail = fail + 1;
 
      end
 
      endcase
 
      // not detect carrier sense in FD and no collision
 
      eth_phy.no_carrier_sense_rx_fd_detect(0);
 
      eth_phy.collision(0);
 
      // set wrap bit and empty bit
 
      set_rx_bd_wrap(127);
 
      set_rx_bd_empty(127, 127);
 
      // transmit
 
      fork
 
        begin
 
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
 
          repeat(10) @(posedge mrx_clk);
 
        end
 
        begin
 
          wait (MRxDV === 1'b1); // start transmit
 
          #1 check_rx_bd(127, data);
 
          if (data[15] !== 1)
 
          begin
 
            `TIME; $display("*E Wrong buffer descriptor's ready bit read out from MAC");
 
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
 
            fail = fail + 1;
 
          end
 
          wait (MRxDV === 1'b0); // received pause frame
 
          repeat(5) @(posedge mrx_clk);  // Wait some time so pause is activated.
 
          repeat(5) @(posedge mtx_clk);  // Wait some time so pause is activated.
 
          set_tx_bd_ready(0, 0); // Request sending the data. Data should not be sent when pause frame was received
 
                                 // and RxFlow enabled.
 
          // When we exit the while loop, status frame is received
 
          repeat(`ETH_TX_FIFO_DEPTH) @(eth_ma_wb_ack_i);  // Waiting until TX fifo is filled.
 
          repeat(10) @(posedge mtx_clk);  // Wait some time for tx start.
 
        end
 
      join
 
      #1 check_rx_bd(127, data);
 
      // Checking buffer descriptor
 
      if(PassAll)
 
      begin
 
        if(enable_irq_in_rxbd)
 
        begin
 
          if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
 
          begin
 
            `TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
            $display("RxBD = 0x%0x", data);
 
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
            fail = fail + 1;
 
          end
 
        end
 
        else
 
        begin
 
          if(data !== 32'h402100)    // Rx BD must not be marked as EMPTY (control frame is received)
 
          begin
 
            `TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
            $display("RxBD = 0x%0x", data);
 
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
            fail = fail + 1;
 
          end
 
        end
 
      end
 
      else
 
      begin
 
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
 
        begin
 
          `TIME; $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
 
          $display("RxBD = 0x%0x", data);
 
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
 
          fail = fail + 1;
 
        end
 
      end
 
      // Checking if interrupt was generated
 
      if (wb_int)
 
      begin
 
        `TIME; $display("*E WB INT signal should not be set because both RXB and RXC interrupts are masked");
 
        test_fail("WB INT signal should not be set because both RXB and RXC interrupts are masked");
 
        fail = fail + 1;
 
      end
 
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      if(RxFlow)
 
      begin
 
        if(data !== (`ETH_INT_RXC))
 
        begin
 
          test_fail("RXC is not set or multiple IRQs active!");
 
          fail = fail + 1;
 
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
 
        // Clear RXC interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
 
      end
 
      else if(enable_irq_in_rxbd)
 
      begin
 
        if(data !== (`ETH_INT_RXB))
 
        begin
 
          test_fail("RXB is not set or multiple IRQs active!");
 
          fail = fail + 1;
 
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
 
        // Clear RXC interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
 
      end
 
      else
 
      begin
 
        if(data !== 0)
 
        begin
 
          test_fail("Some IRQs is active!");
 
          fail = fail + 1;
 
          `TIME; $display("*E Some IRQs is active! (ETH_INT=0x%0x)", data);
 
        end
 
      end
 
      if(RxFlow)
 
        begin
 
          if(MTxEn)   // If pause frame was received OK, transmission of the data packet should not start
 
            begin
 
              `TIME; $display("*E Transmission should not be started because pause frame was received.");
 
              test_fail("Transmission should not be started because pause frame was received.");
 
              fail = fail + 1;
 
            end
 
          while(pause_value)
 
            begin
 
              pause_value=pause_value-1;
 
              repeat(2*64) @(posedge mtx_clk);  // Wait for the time needed for the pause (1 slot).
 
              if((!pause_value) && (!MTxEn))        // Transmission should be enabled now.
 
                begin
 
                  `TIME; $display("*E Transmission should be started because pause passed.");
 
                  test_fail("Transmission should be started because pause passed.");
 
                  fail = fail + 1;
 
                end
 
              else if((pause_value) && (MTxEn))     // Transmission should not be enabled now.
 
                begin
 
                  `TIME; $display("*E Transmission should still be paused.");
 
                  test_fail("Transmission should still be paused.");
 
                  fail = fail + 1;
 
                end
 
            end
 
        end
 
      else
 
        begin
 
          if(!MTxEn)   // Pause frame was not received because RxFlow is turned off.
 
            begin
 
              `TIME; $display("*E Transmission should be started because pause frame was not received (RxFlow=0).");
 
              test_fail("Transmission should be started because pause frame was not received (RxFlow=0).");
 
              fail = fail + 1;
 
            end
 
        end
 
      wait(wb_int);   // Wait antil frame transmission is over and irq generated
 
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      if(data !== (`ETH_INT_TXB))
 
        begin
 
          test_fail("TXB is not set or multiple IRQs active!");
 
          fail = fail + 1;
 
          `TIME; $display("*E TXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
 
        // Clear TXB interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
 
    end
 
    // End: Test is irq is set while RXB and RXC interrupts are masked.
 
 
 
    // Now all interrupts are unmasked. Performing tests again.
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    for (i=0; i<4; i=i+1)
 
    begin
 
      pause_value = i+1;
 
      set_rx_control_packet(0, pause_value);  // CRC already appended
 
      // choose generating carrier sense and collision for first and last 64 lengths of frames
 
      case (i)
 
      0: // PASSALL = 0, RXFLOW = 0
 
      begin
 
        PassAll=0; RxFlow=0;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
 
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, 0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      1: // PASSALL = 0, RXFLOW = 1
 
      begin
 
        PassAll=0; RxFlow=1;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
 
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      2: // PASSALL = 1, RXFLOW = 0
 
      begin
 
        PassAll=1; RxFlow=0;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
 
        // Set PASSALL = 0 and RXFLOW = 0
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      default: // 3: PASSALL = 1, RXFLOW = 1
 
      begin
 
        PassAll=1; RxFlow=1;
 
        // enable interrupt generation
 
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
 
        // Set PASSALL = 1 and RXFLOW = 1
 
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      endcase
      // not detect carrier sense in FD and no collision
      // not detect carrier sense in FD and no collision
      eth_phy.no_carrier_sense_rx_fd_detect(0);
      eth_phy.no_carrier_sense_rx_fd_detect(0);
      eth_phy.collision(0);
      eth_phy.collision(0);
 
      // set wrap bit and empty bit
 
      set_rx_bd_wrap(127);
 
      set_rx_bd_empty(127, 127);
 
      // transmit
 
      fork
 
        begin
 
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
 
          repeat(10) @(posedge mrx_clk);
 
        end
 
        begin
 
          #1 check_rx_bd(127, data);
 
          wait (MRxDV === 1'b1); // start transmit
 
          #1 check_rx_bd(127, data);
 
          if (data[15] !== 1)
 
          begin
 
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
 
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
 
            fail = fail + 1;
 
          end
 
          wait (MRxDV === 1'b0); // end transmit
 
          repeat(50) @(posedge mrx_clk);  // Wait some time so frame is received and
 
          repeat (100) @(posedge wb_clk); // status/irq is written.
 
 
 
          if(RxFlow)    // Waiting x slot times before continuing so pause is deactivated.
 
            repeat(64 * 2 * pause_value) @(posedge mrx_clk);
 
        end
 
      join
 
      #1 check_rx_bd(127, data);
 
      // Checking buffer descriptor
 
      if(PassAll)
 
      begin
 
        if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
 
        begin
 
          `TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
          $display("RxBD = 0x%0x", data);
 
          test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
          fail = fail + 1;
 
        end
 
      end
 
      else
 
      begin
 
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
 
        begin
 
          `TIME; $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
 
          $display("RxBD = 0x%0x", data);
 
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
 
          fail = fail + 1;
 
        end
 
      end
 
      // Checking if interrupt was generated
 
 
 
      if(RxFlow | PassAll)
 
      begin
 
        if (!wb_int)
 
        begin
 
          `TIME; $display("*E WB INT signal should be set");
 
          test_fail("WB INT signal should be set");
 
          fail = fail + 1;
 
        end
 
      end
 
      else
 
      begin
 
        if (wb_int)
 
        begin
 
          `TIME; $display("*E WB INT signal should not be set");
 
          test_fail("WB INT signal should not be set");
 
          fail = fail + 1;
 
        end
 
      end
 
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      if(RxFlow)
 
      begin
 
        if(data !== (`ETH_INT_RXC))
 
        begin
 
          test_fail("RXC is not set or multiple IRQs active!");
 
          fail = fail + 1;
 
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
 
        // Clear RXC interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
 
      end
 
      else if(PassAll)
 
      begin
 
        if(data !== (`ETH_INT_RXB))
 
        begin
 
          test_fail("RXB is not set or multiple IRQs active!");
 
          fail = fail + 1;
 
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
 
        // Clear RXB interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
 
      end
 
      else
 
      begin
 
        if(data !== 0)
 
        begin
 
          test_fail("No interrupt should be set!");
 
          fail = fail + 1;
 
          `TIME; $display("*E No interrupt should be set! (ETH_INT=0x%0x)", data);
 
        end
 
      end
 
    end
 
    // disable RX
 
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
 
              `ETH_MODER_PRO | `ETH_MODER_BRO,
 
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    if(fail == 0)
 
      test_ok;
 
    else
 
      fail = 0;
 
  end
 
 
 
 
 
  ////////////////////////////////////////////////////////////////////
 
  ////                                                            ////
 
  ////  Receive control frames with PASSALL option turned on and  ////
 
  ////  off. Using only one RX buffer decriptor ( 10Mbps ).       ////
 
  ////                                                            ////
 
  ////////////////////////////////////////////////////////////////////
 
  if (test_num == 4) // 
 
  begin
 
    // TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )
 
    test_name   = "TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )";
 
    `TIME; $display("  TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )");
 
 
 
    // unmask interrupts
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // set 1 TX and 1 RX buffer descriptor (8'h01) - must be set before RX enable
 
    wbm_write(`ETH_TX_BD_NUM, 32'h01, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
 
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
 
              `ETH_MODER_PRO | `ETH_MODER_BRO,
 
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // enable flow control
 
 
 
    wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW | `ETH_CTRLMODER_TXFLOW,
 
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // prepare one RX and one TX packet of 100 bytes long
 
    rx_len = 100; // length of frame without CRC
 
    st_data = 8'h1A;
 
    set_rx_packet(200, rx_len, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
 
    append_rx_crc (200, rx_len, 1'b0, 1'b0); // CRC for data packet
 
    tx_len = 64; // length of frame without CRC
 
    st_data = 8'h01;
 
    set_tx_packet(`MEMORY_BASE + 64, tx_len, st_data); // length without CRC
 
    // set TX and RX Buffer Descriptors 
 
    tx_bd_num = 0; // tx BDs go from 0 to 0
 
    rx_bd_num = 1; // rx BDs go from 1 to 1
 
    // check WB INT signal
 
    if (wb_int !== 1'b0)
 
    begin
 
      test_fail("WB INT signal should not be set");
 
      fail = fail + 1;
 
    end
 
 
 
    // set EQUAL mrx_clk to mtx_clk!
 
//    eth_phy.set_mrx_equal_mtx = 1'b1;
 
 
 
    // write to phy's control register for 10Mbps
 
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
 
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
 
    speed = 10;
 
 
 
    // TXB and RXB interrupts masked
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY | `ETH_INT_TXC | `ETH_INT_RXC,
 
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
 
    tmp_len = 0;
 
    num_of_frames = 0;
 
    num_of_rx_frames = 0;
 
//    num_of_iter = 0;
 
    // TX frame loop & RX frame loop work independently
 
 
 
 
 
    fork
 
      // TX frame loop
 
      while (num_of_frames < 400)
 
      begin
 
        eth_phy.set_tx_mem_addr(64 + num_of_frames);
 
        // set tx bd
 
          // wait for WB master if it is working
 
          @(posedge wb_clk);
 
          while (wbm_working)
 
          begin
 
            @(posedge wb_clk);
 
          end
 
        set_tx_bd(0, 0, tx_len, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
 
        set_tx_bd_wrap(0);
 
        set_tx_bd_ready(0, 0);
 
        check_tx_bd(0, data);
 
        // check frame
 
        i = 0;
 
        while((i < 100) && (MTxEn === 1'b0)) // wait for start of TX frame!
 
        begin
 
          @(posedge mtx_clk);
 
          i = i + 1;
 
        end
 
        if (MTxEn != 1'b1)
 
        begin
 
          `TIME; $display("*E Tx Frame %0d: MAC TX didn't start transmitting the packet", num_of_frames);
 
          test_fail("MAC TX didn't start transmitting the packet");
 
          fail = fail + 1;
 
          #10000 $stop;
 
        end
 
 
 
        repeat (30) @(posedge mtx_clk); // waiting some time so PHY clears the tx_len
 
 
 
        wait ((MTxEn === 1'b0) || (eth_phy.tx_len > (tx_len + 4))) // wait for end of TX frame
 
        if (MTxEn != 1'b0)
 
        begin
 
          `TIME; $display("*E Tx Frame %0d: MAC TX didn't stop transmitting the packet", num_of_frames);
 
          test_fail("MAC TX didn't stop transmitting the packet");
 
          fail = fail + 1;
 
          #10000 $stop;
 
        end
 
        tmp_len = eth_phy.tx_len;
 
          // wait for WB master if it is working
 
          @(posedge wb_clk);
 
          while (wbm_working)
 
          begin
 
            @(posedge wb_clk);
 
          end
 
        check_tx_bd(0, data);
 
        while (data[15] === 1)
 
        begin
 
            // wait for WB master if it is working
 
            @(posedge wb_clk);
 
            while (wbm_working)
 
            begin
 
              @(posedge wb_clk);
 
            end
 
          check_tx_bd(0, data);
 
        end
 
        repeat (1) @(posedge wb_clk);
 
        // check length of a PACKET
 
        if (tmp_len != (tx_len + 4))
 
        begin
 
          `TIME; $display("*E Tx Frame %0d: Wrong length of the packet out from MAC (%0d instead of %0d)", num_of_frames,
 
                          tmp_len, (tx_len + 4));
 
          test_fail("Wrong length of the packet out from MAC");
 
          fail = fail + 1;
 
        end
 
        // check transmitted TX packet data
 
        check_tx_packet((`MEMORY_BASE + 64), (64 + num_of_frames), (tx_len), tmp);
 
        if (tmp > 0)
 
        begin
 
          `TIME; $display("*E Tx Frame %0d: Wrong data of the transmitted packet", num_of_frames);
 
          test_fail("Wrong data of the transmitted packet");
 
          fail = fail + 1;
 
        end
 
        // check transmited TX packet CRC
 
        check_tx_crc((64 + num_of_frames), (tx_len), 1'b0, tmp); // length without CRC
 
        if (tmp > 0)
 
        begin
 
          `TIME; $display("*E Tx Frame %0d: Wrong CRC of the transmitted packet", num_of_frames);
 
          test_fail("Wrong CRC of the transmitted packet");
 
          fail = fail + 1;
 
        end
 
        // check WB INT signal
 
        if (wb_int !== 1'b0)
 
        begin
 
          `TIME; $display("*E Tx Frame %0d: WB INT signal should not be set", num_of_frames);
 
          test_fail("WB INT signal should not be set");
 
          fail = fail + 1;
 
        end
 
        // check TX buffer descriptor of a packet
 
          // wait for WB master if it is working
 
          @(posedge wb_clk);
 
          while (wbm_working)
 
          begin
 
            @(posedge wb_clk);
 
          end
 
        check_tx_bd(0, data);
 
        if (data[15:0] !== 16'h7800)
 
        begin
 
          `TIME; $display("*E Tx Frame %0d: TX buffer descriptor status is not correct: %0h", num_of_frames, data[15:0]);
 
          test_fail("TX buffer descriptor status is not correct");
 
          fail = fail + 1;
 
        end
 
        // check interrupts
 
          // wait for WB master if it is working
 
          @(posedge wb_clk);
 
          while (wbm_working)
 
          begin
 
            @(posedge wb_clk);
 
          end
 
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
 
        begin
 
          `TIME; $display("*E Tx Frame %0d: Interrupt Transmit Buffer was not set, interrupt reg: %0h", num_of_frames, data);
 
          test_fail("Interrupt Transmit Buffer was not set");
 
          fail = fail + 1;
 
        end
 
        if ((data & (~(`ETH_INT_TXB | `ETH_INT_RXB))) !== 0) // RXB might occur at the same time - not error
 
        begin
 
          `TIME; $display("*E Tx Frame %0d: Other interrupts (except Tx and Rx Buffer) were set, interrupt reg: %0h",
 
                          num_of_frames, data);
 
          test_fail("Other interrupts (except Transmit Buffer) were set");
 
          fail = fail + 1;
 
        end
 
        // clear interrupts (except RXB)
 
          // wait for WB master if it is working
 
          @(posedge wb_clk);
 
          while (wbm_working)
 
          begin
 
            @(posedge wb_clk);
 
          end
 
        wbm_write(`ETH_INT, (data & (~`ETH_INT_RXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        // check WB INT signal
 
        if (wb_int !== 1'b0)
 
        begin
 
          `TIME; $display("*E Tx Frame %0d: WB INT signal should not be set", num_of_frames);
 
          test_fail("WB INT signal should not be set");
 
          fail = fail + 1;
 
        end
 
        // Displays
 
        if (num_of_frames[2:0] == 3'b111)
 
        begin
 
          `TIME; $display("   ->8 frames transmitted");
 
        end
 
        // set length (loop variable)
 
        num_of_frames = num_of_frames + 1;
 
      end // TX frame loop
 
      // RX frame loop
 
      while (num_of_rx_frames < 400)
 
      begin
 
        // set rx bd
 
          // wait for WB master if it is working
 
          @(posedge wb_clk);
 
          #1;
 
          while (wbm_working)
 
          begin
 
            @(posedge wb_clk);
 
            #1;
 
          end
 
        set_rx_bd(1, 1, 1'b1, (`MEMORY_BASE + 200 + num_of_rx_frames));
 
        set_rx_bd_wrap(1);
 
        set_rx_bd_empty(1, 1);
 
        // check frame
 
        fork
 
          begin
 
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 200, (rx_len + 4), 1'b0);
 
            repeat(10) @(posedge mrx_clk);
 
          end
 
          begin
 
            wait (MRxDV === 1'b1); // start receive
 
              // wait for WB master if it is working
 
              @(posedge wb_clk);
 
              #1;
 
              while (wbm_working)
 
              begin
 
                @(posedge wb_clk);
 
                #1;
 
              end
 
            check_rx_bd(1, data);
 
            if (data[15] !== 1)
 
            begin
 
              `TIME; $display("*E Rx Frame %0d: Wrong buffer descriptor's ready bit read out from MAC", num_of_rx_frames);
 
              test_fail("Wrong buffer descriptor's ready bit read out from MAC");
 
              fail = fail + 1;
 
            end
 
            wait (MRxDV === 1'b0); // end receive
 
 
 
            while (data[15] === 1)
 
            begin
 
                // wait for WB master if it is working
 
                @(posedge wb_clk);
 
                #1;
 
                while (wbm_working)
 
                begin
 
                  @(posedge wb_clk);
 
                  #1;
 
                end
 
              check_rx_bd(1, data);
 
            end
 
            repeat (1) @(posedge wb_clk);
 
          end
 
        join
 
        // check length of a PACKET
 
 
 
        // Additional read because simulator was not working OK.
 
        // wait for WB master if it is working
 
        @(posedge wb_clk);
 
        #1;
 
        while (wbm_working)
 
        begin
 
          @(posedge wb_clk);
 
          #1;
 
        end
 
        check_rx_bd(1, data);
 
 
 
        if (data[31:16] != (rx_len + 4))
 
        begin
 
          `TIME; $display("*E Rx Frame %0d: Wrong length of the packet written to MAC's register (%0d instead of %0d)",
 
                          num_of_rx_frames, data[31:16], (rx_len + 4));
 
          test_fail("Wrong length of the packet out from PHY");
 
          fail = fail + 1;
 
        end
 
        // check received RX packet data and CRC
 
        check_rx_packet(200, (`MEMORY_BASE + 200 + num_of_rx_frames), (rx_len + 4), 1'b0, 1'b0, tmp);
 
        if (tmp > 0)
 
        begin
 
          `TIME; $display("*E Rx Frame %0d: Wrong data of the received packet", num_of_rx_frames);
 
          test_fail("Wrong data of the received packet");
 
          fail = fail + 1;
 
        end
 
        // check WB INT signal
 
        if (wb_int !== 1'b0)
 
        begin
 
          `TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
 
          test_fail("WB INT signal should not be set");
 
          fail = fail + 1;
 
        end
 
        // check RX buffer descriptor of a packet
 
          // wait for WB master if it is working
 
          @(posedge wb_clk);
 
          #1;
 
          while (wbm_working)
 
          begin
 
            @(posedge wb_clk);
 
            #1;
 
          end
 
        check_rx_bd(1, data);
 
        if (data[15:0] !== 16'h6080)
 
        begin
 
          `TIME; $display("*E Rx Frame %0d: RX buffer descriptor status is not correct: %0h", num_of_rx_frames, data[15:0]);
 
          test_fail("RX buffer descriptor status is not correct");
 
          fail = fail + 1;
 
        end
 
        // check interrupts
 
          // wait for WB master if it is working
 
          @(posedge wb_clk);
 
          #1;
 
          while (wbm_working)
 
          begin
 
            @(posedge wb_clk);
 
            #1;
 
          end
 
        wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
      // set wrap bit and empty bit
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
      set_rx_bd_wrap(127);
        begin
      set_rx_bd_empty(127, 127);
          `TIME; $display("*E Rx Frame %0d: Interrupt Receive Buffer was not set, interrupt reg: %0h",
 
                          num_of_rx_frames, data);
 
          test_fail("Interrupt Receive Buffer was not set");
 
          fail = fail + 1;
 
        end
 
        if ((data & (~(`ETH_INT_RXB | `ETH_INT_TXB))) !== 0) // TXB might occur at the same time - not error
 
        begin
 
          `TIME; $display("*E Rx Frame %0d: Other interrupts (except Rx and Tx Buffer) were set, interrupt reg: %0h",
 
                          num_of_rx_frames, data);
 
          test_fail("Other interrupts (except Receive Buffer) were set");
 
          fail = fail + 1;
 
        end
 
        // clear interrupts (except TXB)
 
          // wait for WB master if it is working
 
          @(posedge wb_clk);
 
          #1;
 
          while (wbm_working)
 
          begin
 
            @(posedge wb_clk);
 
            #1;
 
          end
 
        wbm_write(`ETH_INT, (data & (~`ETH_INT_TXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        // check WB INT signal
 
        if (wb_int !== 1'b0)
 
        begin
 
          `TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
 
          test_fail("WB INT signal should not be set");
 
          fail = fail + 1;
 
        end
 
        // Displays
 
        if (num_of_rx_frames[2:0] == 3'b111)
 
        begin
 
          `TIME; $display("   ->8 frames received");
 
        end
 
        // set length (loop variable)
 
        num_of_rx_frames = num_of_rx_frames + 1;
 
      end // RX frame loop
 
    join
 
    // disable TX & RX
 
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_PAD | `ETH_MODER_CRCEN |
 
              `ETH_MODER_IFG | `ETH_MODER_PRO | `ETH_MODER_BRO,
 
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // set DIFFERENT mrx_clk to mtx_clk!
 
//    eth_phy.set_mrx_equal_mtx = 1'b0;
 
    if(fail == 0)
 
      test_ok;
 
    else
 
      fail = 0;
 
  end
 
 
 
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
 
 
 
end
 
endtask // test_mac_full_duplex_flow_control
 
 
 
 
 
task test_mac_half_duplex_flow;
 
  input  [31:0]  start_task;
 
  input  [31:0]  end_task;
 
  integer        bit_start_1;
 
  integer        bit_end_1;
 
  integer        bit_start_2;
 
  integer        bit_end_2;
 
  integer        num_of_reg;
 
  integer        num_of_frames;
 
  integer        num_of_bd;
 
  integer        num_of_iter;
 
  integer        i_addr;
 
  integer        i_data;
 
  integer        i_length;
 
  integer        tmp_len;
 
  integer        tmp_bd;
 
  integer        tmp_bd_num;
 
  integer        tmp_data;
 
  integer        tmp_ipgt;
 
  integer        test_num;
 
  reg    [31:0]  tx_bd_num;
 
  reg    [31:0]  rx_bd_num;
 
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_data;
 
  reg    [((`MAX_BLK_SIZE * 32) - 1):0] burst_tmp_data;
 
  integer        i;
 
  integer        i1;
 
  integer        i2;
 
  integer        i3;
 
  integer        fail;
 
  integer        speed;
 
  integer        mac_hi_addr;
 
  integer        mac_lo_addr;
 
  reg            frame_started;
 
  reg            frame_ended;
 
  reg            check_rx_frame;
 
  reg            wait_for_tx_frame;
 
  reg    [31:0]  addr;
 
  reg    [31:0]  data;
 
  reg    [31:0]  tmp;
 
  reg    [ 7:0]  st_data;
 
  reg    [15:0]  max_tmp;
 
  reg    [15:0]  min_tmp;
 
begin
 
// MAC HALF DUPLEX FLOW TEST
 
test_heading("MAC HALF DUPLEX FLOW TEST");
 
$display(" ");
 
$display("MAC HALF DUPLEX FLOW TEST");
 
fail = 0;
 
 
 
// reset MAC registers
 
hard_reset;
 
// reset MAC and MII LOGIC with soft reset
 
//reset_mac;
 
//reset_mii;
 
// set wb slave response
 
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
 
  /*
 
  TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
 
  -------------------------------------------------------------------------------------
 
  set_tx_bd
 
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
 
  set_tx_bd_wrap
 
    (tx_bd_num_end[6:0]);
 
  set_tx_bd_ready
 
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
 
  check_tx_bd
 
    (tx_bd_num_start[6:0], tx_bd_status[31:0]);
 
  clear_tx_bd
 
    (tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
 
 
 
  TASKS for set and control RX buffer descriptors:
 
  ------------------------------------------------
 
  set_rx_bd
 
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
 
  set_rx_bd_wrap
 
    (rx_bd_num_end[6:0]);
 
  set_rx_bd_empty
 
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
 
  check_rx_bd
 
    (rx_bd_num_end[6:0], rx_bd_status);
 
  clear_rx_bd
 
    (rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
 
 
 
  TASKS for set and check TX packets:
 
  -----------------------------------
 
  set_tx_packet
 
    (txpnt[31:0], len[15:0], eth_start_data[7:0]);
 
  check_tx_packet
 
    (txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
 
 
 
  TASKS for set and check RX packets:
 
  -----------------------------------
 
  set_rx_packet
 
    (rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
 
  check_rx_packet
 
    (rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
 
 
 
  TASKS for append and check CRC to/of TX packet:
 
  -----------------------------------------------
 
  append_tx_crc
 
    (txpnt_wb[31:0], len[15:0], negated_crc);
 
  check_tx_crc
 
    (txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
 
 
 
  TASK for append CRC to RX packet (CRC is checked together with check_rx_packet):
 
  --------------------------------------------------------------------------------
 
  append_rx_crc
 
    (rxpnt_phy[31:0], len[15:0], plus_nibble, negated_crc);
 
  */
 
 
 
//////////////////////////////////////////////////////////////////////
 
////                                                              ////
 
////  test_mac_half_duplex_flow:                                  ////
 
////                                                              ////
 
////  0: Test                                                     ////
 
////                                                              ////
 
//////////////////////////////////////////////////////////////////////
 
 
 
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
 
begin
 
 
 
  ////////////////////////////////////////////////////////////////////
 
  ////                                                            ////
 
  ////  Test collision and late collision while transmitting and  ////
 
  ////  receiving normal frames. Using 4 TX and RX buffer         ////
 
  ////  decriptors ( 10Mbps ).                                    ////
 
  ////                                                            ////
 
  ////////////////////////////////////////////////////////////////////
 
  if (test_num == 0) // 
 
  begin
 
    // TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )
 
    //         
 
    test_name = "TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )";
 
    `TIME; $display("  TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )");
 
 
 
    // reset MAC completely
 
    hard_reset;
 
    // set wb slave response
 
    wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
 
 
 
    max_tmp = 0;
 
    min_tmp = 0;
 
    // set 4 TX buffer descriptors (4 TX and 4 RX BDs will be used) - must be set before TX/RX enable
 
    wait (wbm_working == 0);
 
    wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // enable TX and RX, set half-duplex mode, receive small, NO correct IFG
 
    wait (wbm_working == 0);
 
    wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_RXEN | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
 
              `ETH_MODER_PRO | `ETH_MODER_BRO,
 
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // prepare two packets of MAXFL length for TX and RX
 
    wait (wbm_working == 0);
 
    wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
 
    min_tmp = tmp[31:16];
 
    st_data = 8'h17;
 
    set_rx_packet(0, (min_tmp), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
 
    append_rx_crc (0, (min_tmp), 1'b0, 1'b0);
 
    st_data = 8'h92;
 
    set_tx_packet(`MEMORY_BASE, (min_tmp), st_data); // length without CRC
 
    append_tx_crc (`MEMORY_BASE, (min_tmp), 1'b0);
 
 
 
    // check WB INT signal
 
    if (wb_int !== 1'b0)
 
    begin
 
      test_fail("WB INT signal should not be set");
 
      fail = fail + 1;
 
    end
 
    // unmask interrupts
 
    wait (wbm_working == 0);
 
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
 
 
    // write to phy's control register for 10Mbps
 
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
 
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
 
    speed = 10;
 
 
 
    // set TX and RX Buffer Descriptors 
 
    tx_bd_num = 0; // tx BDs go from 0 to 3
 
    rx_bd_num = 4; // rx BDs go from 4 to 7
 
    set_tx_bd(0, 3, i_length[15:0], 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
 
    set_tx_bd_wrap(3);
 
    set_rx_bd(4, 7, 1'b1, `MEMORY_BASE);
 
    set_rx_bd_wrap(7);
 
    set_rx_bd_empty(4, 7);
 
 
 
//    frame_ended = 0;
 
    tmp_len = 0;
 
    num_of_frames = 0;// 0; // 10;
 
    num_of_iter = 0;
 
//    num_of_bd = 0;
 
//    i_length = 0;// (0 - 4); // 6; // 4 less due to CRC
 
    while (num_of_frames < 80)
 
    begin
 
      // change COLLVALID bits in COLLCONF register
 
      if ((num_of_frames == 0) && (num_of_iter == 0))
 
      begin
 
        wait (wbm_working == 0);
 
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        tmp[5:0] = 6'h00; // 6'b00_0000 ->  0 + 1 =  1 byte from preamble
 
        wait (wbm_working == 0);
 
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        $display("    Collision window is set to 1 byte after preamble and SFD");
 
      end
 
      else if ((num_of_frames == 0) && (num_of_iter == 1))
 
      begin
 
        wait (wbm_working == 0);
 
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        tmp[5:0] = 6'h15; // 6'b01_0101 -> 21 + 1 = 22 bytes from preamble
 
        wait (wbm_working == 0);
 
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        $display("    Collision window is set to 22 bytes after preamble and SFD");
 
      end
 
      else if ((num_of_frames == 0) && (num_of_iter == 2))
 
      begin
 
        wait (wbm_working == 0);
 
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        tmp[5:0] = 6'h2A; // 6'b10_1010 -> 42 + 1 = 43 bytes from preamble
 
        wait (wbm_working == 0);
 
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        $display("    Collision window is set to 43 bytes after preamble and SFD");
 
      end
 
      else if ((num_of_frames == 0) && (num_of_iter == 3))
 
      begin
 
        wait (wbm_working == 0);
 
        wbm_read(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        tmp[5:0] = 6'h3F; // 6'b11_1111 -> 63 + 1 = 64 bytes from preamble
 
        wait (wbm_working == 0);
 
        wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        $display("    Collision window is set to 64 bytes after preamble and SFD");
 
      end
 
 
 
 
 
//wire          MRxDV;    // This goes to PHY
 
//wire          MRxErr;   // This goes to PHY
 
//wire          MColl;    // This goes to PHY
 
//wire          MCrs;     // This goes to PHY
 
//wire          MTxEn;
 
//wire          MTxErr;
 
      // CHECK END OF RECEIVE WHILE TRANSMITTING
 
      frame_ended = 0;
 
      check_rx_frame = 0;
      fork
      fork
 
        // send frames
 
        begin // start with RX frame
 
          repeat(num_of_frames) @(posedge mrx_clk);
 
          #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (min_tmp + 4), 1'b0);
 
          repeat(10) @(posedge mrx_clk);
 
        end
 
        begin // start with TX frame 
 
          repeat(2) @(posedge mrx_clk);
 
          repeat(2) @(posedge wb_clk);
 
          #1 set_tx_bd_ready(tx_bd_num, tx_bd_num);
 
        end
 
        // observe TX Enable, Carrier Sense and Collision - TX frame is not repeated after Late Collision
 
        begin
 
          wait (MCrs || MTxEn);
 
          #1;
 
          if ((MCrs == 1'b1) && (MTxEn == 1'b0)) // defer TX due to Carrier Sense
 
            wait_for_tx_frame = 1'b1; // wait for retransmission of TX frame
 
          else
 
          begin
 
            i = 0;
 
            while (MColl == 1'b0) // wait for Collision to occure
 
            begin
 
              repeat(2) @(posedge mtx_clk); // counting bytes
 
              #1 i = i + 1'b1;
 
            end
 
            i = i - 8; // subtract preamble and SFD (bytes) - Late Collision is measured from SFD!
 
            tmp_len = eth_phy.tx_len; // without preamble and SFD (bytes)
 
            //wait (MTxEn == 1'b0); // wait for TX frame to end
 
            repeat(10) @(posedge mrx_clk);
 
            repeat(8) @(posedge wb_clk);
 
            #1 check_tx_bd(tx_bd_num, data);
 
            if (data[15] === 0) // if transmit is aborted, then it was Late Collision
 
            begin
 
              wait_for_tx_frame = 1'b0; // don't wait for retransmission of TX frame
 
              $display("    ->Late Collision occured on %0d. byte after frame and SFD", i);
 
            end
 
            else
 
              wait_for_tx_frame = 1'b1; // wait for retransmission of TX frame
 
          end
 
        end
 
        // check if RX frame is accepted
 
        begin
 
          wait (MRxDV === 1'b1); // start receive
 
          wait (MRxDV === 1'b0); // end receive
 
          repeat(10) @(posedge mrx_clk);
 
          repeat(8) @(posedge wb_clk);
 
          #1 check_rx_bd(rx_bd_num, data);
 
          if (data[15] === 0)
 
          begin
 
            check_rx_frame = 1'b1; // RX frame accepted and must be checked
 
            if ((i + 8) == 0) // add preamble and SFD length (bytes)
 
              $display("    ->RX frame, which started before or at beginning of TX frame, was accepted");
 
            else
 
              $display("    ->RX frame, which started %0d byte(s) after beginning of TX frame, was accepted", (i + 8));
 
          end
 
          else
 
            check_rx_frame = 1'b0; // RX frame rejected
 
          repeat(1) @(posedge wb_clk);
 
        end
 
      join
 
 
 
 
 
 
 
      // check length of a PACKET
 
      if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
 
           ((data[31:16] != 0) && (num_of_frames < 3)) )
 
      begin
 
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
 
                        data[31:16], (i_length + 4));
 
        test_fail("Wrong length of the packet out from PHY");
 
        fail = fail + 1;
 
      end
 
      // check received RX packet data and CRC
 
//if ((num_of_frames == 5))
 
//begin                                           // CRC has 4 bytes for itself
 
//  if (i_length[0] == 1'b1)
 
//  begin
 
//    check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
 
//  end
 
//  else
 
//  begin
 
//    check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
 
//  end
 
//  if (tmp > 0)
 
//  begin
 
//    `TIME; $display("*E Wrong data of the received packet");
 
//    test_fail("Wrong data of the received packet");
 
//    fail = fail + 1;
 
//  end
 
//end
 
//else
 
//if ((num_of_frames == 10))
 
//begin                                           // CRC has 4 bytes for itself
 
//  if (i_length[0] == 1'b1)
 
//  begin
 
//    check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
 
//  end
 
//  else
 
//  begin
 
//    check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
 
//  end
 
//  if (tmp > 0)
 
//  begin
 
//    `TIME; $display("*E Wrong data of the received packet");
 
//    test_fail("Wrong data of the received packet");
 
//    fail = fail + 1;
 
//  end
 
//end
 
//else
 
      if ((frame_ended == 1) && (num_of_frames >= 5)) // 5 bytes is minimum size without CRC error, since
 
      begin                                           // CRC has 4 bytes for itself
 
        if (i_length[0] == 1'b0)
        begin
        begin
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
          check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
          repeat(10) @(posedge mrx_clk);
 
        end
        end
 
        else
        begin
        begin
          wait (MRxDV === 1'b1); // start transmit
          check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
          #1 check_rx_bd(127, data);
        end
          if (data[15] !== 1)
        if (tmp > 0)
          begin
          begin
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
          `TIME; $display("*E Wrong data of the received packet");
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
          test_fail("Wrong data of the received packet");
            fail = fail + 1;
            fail = fail + 1;
          end
          end
 
 
          wait (MRxDV === 1'b0); // received pause frame
 
          repeat(5) @(posedge mrx_clk);  // Wait some time so pause is activated.
 
          repeat(5) @(posedge mtx_clk);  // Wait some time so pause is activated.
 
 
 
          set_tx_bd_ready(0, 0); // Request sending the data. Data should not be sent when pause frame was received
 
                                 // and RxFlow enabled.
 
 
 
 
 
          // When we exit the while loop, status frame is received
 
          repeat(`ETH_TX_FIFO_DEPTH) @(eth_ma_wb_ack_i);  // Waiting until TX fifo is filled.
 
          repeat(10) @(posedge mtx_clk);  // Wait some time for tx start.
 
        end
        end
 
 
      join
      // check WB INT signal
 
      if (num_of_frames >= 3) // Frames smaller than 3 are not received.
      #1 check_rx_bd(127, data);
      begin                   // Frames greater then 5 always cause an interrupt (Frame received)
      // Checking buffer descriptor
        if (wb_int !== 1'b1)  // Frames with length 3 or 4 always cause an interrupt (CRC error)
      if(PassAll)
 
      begin
      begin
        if(enable_irq_in_rxbd)
          `TIME; $display("*E WB INT signal should be set");
 
          test_fail("WB INT signal should be set");
 
          fail = fail + 1;
 
        end
 
      end
 
      else
        begin
        begin
          if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
        if (wb_int !== 1'b0)
          begin
          begin
            $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
          `TIME; $display("*E WB INT signal should not be set");
            $display("RxBD = 0x%0x", data);
          test_fail("WB INT signal should not be set");
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
            fail = fail + 1;
            fail = fail + 1;
          end
          end
        end
        end
        else
 
 
      // check RX buffer descriptor of a packet
 
      if (num_of_frames >= min_tmp)
        begin
        begin
          if(data !== 32'h402100)    // Rx BD must not be marked as EMPTY (control frame is received)
        if ( (data[15:0] !== 16'h6000) && // wrap bit
 
             (data[15:0] !== 16'h4000) ) // without wrap bit
          begin
          begin
            $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
            $display("RxBD = 0x%0x", data);
          test_fail("RX buffer descriptor status is not correct");
            test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
 
            fail = fail + 1;
            fail = fail + 1;
          end
          end
        end
        end
 
      else if (num_of_frames > 4)
 
      begin
 
        if ( (data[15:0] !== 16'h6004) && // wrap bit
 
             (data[15:0] !== 16'h4004) ) // without wrap bit
 
        begin
 
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
 
          test_fail("RX buffer descriptor status is not correct");
 
          fail = fail + 1;
 
        end
      end
      end
      else
      else if (num_of_frames > 2)
      begin
      begin
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
        if ( (data[15:0] !== 16'h6006) && // wrap bit
 
             (data[15:0] !== 16'h4006) ) // without wrap bit
        begin
        begin
          $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
          $display("RxBD = 0x%0x", data);
          test_fail("RX buffer descriptor status is not correct");
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
 
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
 
      else
      // Checking if interrupt was generated
 
      if (wb_int)
 
      begin
      begin
        `TIME; $display("*E WB INT signal should not be set because both RXB and RXC interrupts are masked");
        if (data[15] !== 1'b1)
        test_fail("WB INT signal should not be set because both RXB and RXC interrupts are masked");
        begin
 
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
 
          test_fail("RX buffer descriptor status is not correct");
        fail = fail + 1;
        fail = fail + 1;
      end
      end
 
      end
 
      // check interrupts
 
      wait (wbm_working == 0);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      if(RxFlow)
      if (num_of_frames >= 5)
      begin
      begin
        if(data !== (`ETH_INT_RXC))
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
        begin
        begin
          test_fail("RXC is not set or multiple IRQs active!");
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
 
          test_fail("Interrupt Receive Buffer was not set");
          fail = fail + 1;
          fail = fail + 1;
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
        end
        // Clear RXC interrupt
        if ((data & (~`ETH_INT_RXB)) !== 0)
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
        begin
 
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
 
          test_fail("Other interrupts (except Receive Buffer) were set");
 
          fail = fail + 1;
      end
      end
      else if(enable_irq_in_rxbd)
      end
 
      else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
      begin
      begin
        if(data !== (`ETH_INT_RXB))
        if (data) // Checking if any interrupt is pending)
        begin
        begin
          test_fail("RXB is not set or multiple IRQs active!");
          `TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
 
          test_fail("Interrupts were set");
          fail = fail + 1;
          fail = fail + 1;
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
        end
        // Clear RXC interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
 
      end
      end
      else
      else
      begin
      begin
        if(data !== 0)
        if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
        begin
        begin
          test_fail("Some IRQs is active!");
          `TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
 
          test_fail("Interrupt Receive Buffer Error was not set");
          fail = fail + 1;
          fail = fail + 1;
          `TIME; $display("*E Some IRQs is active! (ETH_INT=0x%0x)", data);
 
        end
        end
      end
        if ((data & (~`ETH_INT_RXE)) !== 0)
 
 
 
 
      if(RxFlow)
 
        begin
        begin
          if(MTxEn)   // If pause frame was received OK, transmission of the data packet should not start
          `TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
 
          test_fail("Other interrupts (except Receive Buffer Error) were set");
 
          fail = fail + 1;
 
        end
 
      end
 
      // clear interrupts
 
      wait (wbm_working == 0);
 
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      // check WB INT signal
 
      if (wb_int !== 1'b0)
            begin
            begin
              `TIME; $display("*E Transmission should not be started because pause frame was received.");
        test_fail("WB INT signal should not be set");
              test_fail("Transmission should not be started because pause frame was received.");
 
              fail = fail + 1;
              fail = fail + 1;
            end
            end
          while(pause_value)
      // INTERMEDIATE DISPLAYS
 
      if (num_of_frames == 3)
            begin
            begin
              pause_value=pause_value-1;
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
              repeat(2*64) @(posedge mtx_clk);  // Wait for the time needed for the pause (1 slot).
        $display("    ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
              if((!pause_value) && (!MTxEn))        // Transmission should be enabled now.
                 0, 3);
 
      end
 
      else if (num_of_frames == 9)
                begin
                begin
                  `TIME; $display("*E Transmission should be started because pause passed.");
        $display("    using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
                  test_fail("Transmission should be started because pause passed.");
        $display("    ->packet with length 4 is not received (length increasing by 1 byte)");
                  fail = fail + 1;
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
 
                 5, 9);
                end
                end
              else if((pause_value) && (MTxEn))     // Transmission should not be enabled now.
      else if (num_of_frames == 17)
                begin
                begin
                  `TIME; $display("*E Transmission should still be paused.");
        $display("    using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
                  test_fail("Transmission should still be paused.");
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
                  fail = fail + 1;
                 10, 17);
                end
                end
 
      else if (num_of_frames == 27)
 
      begin
 
        $display("    using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
 
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
 
                 18, 27);
            end
            end
 
      else if (num_of_frames == 40)
 
      begin
 
        $display("    using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
 
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
 
                 28, 40);
        end
        end
      else
      else if (num_of_frames == 54)
        begin
        begin
          if(!MTxEn)   // Pause frame was not received because RxFlow is turned off.
        $display("    using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
 
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
 
                 41, 54);
 
      end
 
      else if (num_of_frames == 69)
            begin
            begin
              `TIME; $display("*E Transmission should be started because pause frame was not received (RxFlow=0).");
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
              test_fail("Transmission should be started because pause frame was not received (RxFlow=0).");
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
              fail = fail + 1;
                 55, 69);
            end
            end
 
      else if (num_of_frames == 69)
 
      begin
 
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
 
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
 
                 55, 69);
        end
        end
 
      else if (num_of_frames == 77)
 
 
      wait(wb_int);   // Wait antil frame transmission is over and irq generated
 
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      if(data !== (`ETH_INT_TXB))
 
        begin
        begin
          test_fail("TXB is not set or multiple IRQs active!");
        $display("    using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
          fail = fail + 1;
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
          `TIME; $display("*E TXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
                 70, 77);
        end
        end
        // Clear TXB interrupt
      // set length (loop variable)
        wbm_write(`ETH_INT, `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
      i_length = i_length + 1;
 
      // the number of frame transmitted
 
      num_of_frames = num_of_frames + 1;
 
      if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
 
          (num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
 
          (num_of_frames == 34) || (num_of_frames == 40) || (num_of_frames == 47) ||
 
          (num_of_frames == 54) || (num_of_frames == 62) || (num_of_frames == 70))
 
        num_of_bd = 120;
 
      else
 
        num_of_bd = num_of_bd + 1;
 
    end
 
    // disable RX
 
    wait (wbm_working == 0);
 
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
 
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    @(posedge wb_clk);
 
    if(fail == 0)
 
      test_ok;
 
    else
 
      fail = 0;
    end
    end
    // End: Test is irq is set while RXB and RXC interrupts are masked.
 
 
 
 
 
    // Now all interrupts are unmasked. Performing tests again.
  ////////////////////////////////////////////////////////////////////
 
  ////                                                            ////
 
  ////  Receive control frames with PASSALL option turned off     ////
 
  ////  Using only one RX buffer decriptor ( 10Mbps ).            ////
 
  ////                                                            ////
 
  ////////////////////////////////////////////////////////////////////
 
  if (test_num == 1) // 
 
  begin
 
    // TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )
 
    test_name   = "TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )";
 
    `TIME; $display("  TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )");
 
 
 
    // unmask interrupts
 
    wait (wbm_working == 0);
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
    wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
                             `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // set 1 RX buffer descriptor (8'h80 - 1) - must be set before RX enable
 
    wait (wbm_working == 0);
 
    wbm_write(`ETH_TX_BD_NUM, 32'h7F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // enable RX, set full-duplex mode, NO receive small, NO correct IFG
 
    wait (wbm_working == 0);
 
    wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
 
              `ETH_MODER_PRO | `ETH_MODER_BRO,
 
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
    // prepare one control (PAUSE)packet
 
    st_data = 8'h00;
 
    set_rx_packet(0, 60, 1'b0, 48'h0180_c200_0001, 48'h0708_090A_0B0C, 16'h8808, st_data); // length without CRC
 
    // prepare one packet of 100 bytes long
 
    st_data = 8'h1A;
 
    set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
 
    // check WB INT signal
 
    if (wb_int !== 1'b0)
 
    begin
 
      test_fail("WB INT signal should not be set");
 
      fail = fail + 1;
 
    end
 
 
 
    // write to phy's control register for 10Mbps
 
    #Tp eth_phy.control_bit14_10 = 5'b00000; // bit 13 reset - speed 10
 
    #Tp eth_phy.control_bit8_0   = 9'h1_00;  // bit 6 reset  - (10/100), bit 8 set - FD
 
    speed = 10;
 
 
    for (i=0; i<4; i=i+1)
    for (i=0; i<4; i=i+1)
    begin
    begin
      pause_value = i+1;
 
      set_rx_control_packet(0, pause_value);  // CRC already appended
 
      // choose generating carrier sense and collision for first and last 64 lengths of frames
      // choose generating carrier sense and collision for first and last 64 lengths of frames
      case (i)
      case (i)
      0: // PASSALL = 0, RXFLOW = 0
      0: // Interrupt is generated
      begin
      begin
        PassAll=0; RxFlow=0;
 
        // enable interrupt generation
        // enable interrupt generation
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
        set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i));
        // Set PASSALL = 0 and RXFLOW = 0
        // unmask interrupts
        wbm_write(`ETH_CTRLMODER, 0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wait (wbm_working == 0);
 
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        // not detect carrier sense in FD and no collision
 
        eth_phy.no_carrier_sense_rx_fd_detect(0);
 
        eth_phy.collision(0);
      end
      end
      1: // PASSALL = 0, RXFLOW = 1
      1: // Interrupt is not generated
      begin
      begin
        PassAll=0; RxFlow=1;
 
        // enable interrupt generation
        // enable interrupt generation
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
        set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i) + 64));
        // Set PASSALL = 0 and RXFLOW = 0
        // mask interrupts
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wait (wbm_working == 0);
 
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        // detect carrier sense in FD and no collision
 
        eth_phy.no_carrier_sense_rx_fd_detect(1);
 
        eth_phy.collision(0);
      end
      end
      2: // PASSALL = 1, RXFLOW = 0
      2: // Interrupt is not generated
      begin
      begin
        PassAll=1; RxFlow=0;
        // disable interrupt generation
        // enable interrupt generation
        set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i));
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
        // unmask interrupts
        // Set PASSALL = 0 and RXFLOW = 0
        wait (wbm_working == 0);
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
 
                                 `ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        // not detect carrier sense in FD and set collision
 
        eth_phy.no_carrier_sense_rx_fd_detect(0);
 
        eth_phy.collision(1);
      end
      end
      default: // 3: PASSALL = 1, RXFLOW = 1
      default: // 3: // Interrupt is not generated
      begin
      begin
        PassAll=1; RxFlow=1;
        // disable interrupt generation
        // enable interrupt generation
        set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i) + 64));
        set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
        // mask interrupts
        // Set PASSALL = 1 and RXFLOW = 1
        wait (wbm_working == 0);
        wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
        wbm_write(`ETH_INT_MASK, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
        // detect carrier sense in FD and set collision
 
        eth_phy.no_carrier_sense_rx_fd_detect(1);
 
        eth_phy.collision(1);
      end
      end
      endcase
      endcase
 
 
      // not detect carrier sense in FD and no collision
      append_rx_crc (64, 100, 1'b0, 1'b0); // To the second (data) packet
      eth_phy.no_carrier_sense_rx_fd_detect(0);
      // set wrap bit
      eth_phy.collision(0);
 
 
 
      // set wrap bit and empty bit
 
      set_rx_bd_wrap(127);
      set_rx_bd_wrap(127);
      set_rx_bd_empty(127, 127);
      set_rx_bd_empty(127, 127);
 
 
      fork
      fork
        begin
        begin
 
          if (i[0] == 1'b0)
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
 
          else
 
            #1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 64, 104, 1'b0);
          repeat(10) @(posedge mrx_clk);
          repeat(10) @(posedge mrx_clk);
 
$display("1111");
        end
        end
        begin
        begin
          #1 check_rx_bd(127, data);
          #1 check_rx_bd(127, data);
 
$display("aaaa");
          wait (MRxDV === 1'b1); // start transmit
          wait (MRxDV === 1'b1); // start transmit
 
$display("bbbb");
          #1 check_rx_bd(127, data);
          #1 check_rx_bd(127, data);
          if (data[15] !== 1)
          if (data[15] !== 1)
          begin
          begin
            $display("*E Wrong buffer descriptor's ready bit read out from MAC");
 
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
            test_fail("Wrong buffer descriptor's ready bit read out from MAC");
            fail = fail + 1;
            fail = fail + 1;
          end
          end
 
 
          wait (MRxDV === 1'b0); // end transmit
          wait (MRxDV === 1'b0); // end transmit
          repeat(50) @(posedge mrx_clk);  // Wait some time so frame is received and
$display("cccc");
          repeat (100) @(posedge wb_clk); // status/irq is written.
          while (data[15] === 1)
 
          begin
          if(RxFlow)    // Waiting x slot times before continuing so pause is deactivated.
            #1 check_rx_bd(127, data);
            repeat(64 * 2 * pause_value) @(posedge mrx_clk);
            @(posedge wb_clk);
 
          end
 
          repeat (1) @(posedge wb_clk);
 
$display("2222");
        end
        end
      join
      join
 
$display("dddd");
      #1 check_rx_bd(127, data);
      // check length of a PACKET
 
      if (data[31:16] != (i_length + 4))
      // Checking buffer descriptor
 
      if(PassAll)
 
      begin
 
        if(data !== 32'h406100)    // Rx BD must not be marked as EMPTY (control frame is received)
 
        begin
        begin
          $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
        `TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
          $display("RxBD = 0x%0x", data);
                        data[31:16], (i_length + 4));
          test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
        test_fail("Wrong length of the packet out from PHY");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
 
      // checking in the following if statement is performed only for first and last 64 lengths
 
      // check received RX packet data and CRC
 
      if (i_length[0] == 1'b0)
 
      begin
 
        check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
      end
      end
      else
      else
      begin
      begin
        if(data !== 32'he000)    // Rx BD must be marked as EMPTY (no packet received)
        check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
 
      end
 
      if (tmp > 0)
        begin
        begin
          $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
        `TIME; $display("*E Wrong data of the received packet");
          $display("RxBD = 0x%0x", data);
        test_fail("Wrong data of the received packet");
          test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
 
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      // check WB INT signal
 
      if (i_length[1:0] == 2'h0)
      // Checking if interrupt was generated
 
      if(RxFlow || PassAll)
 
      begin
      begin
        if (!wb_int)
        if (wb_int !== 1'b1)
        begin
        begin
          `TIME; $display("*E WB INT signal should be set");
          `TIME; $display("*E WB INT signal should be set");
          test_fail("WB INT signal should be set");
          test_fail("WB INT signal should be set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
      else
      else
      begin
      begin
        if (wb_int)
        if (wb_int !== 1'b0)
        begin
        begin
          `TIME; $display("*E WB INT signal should not be set");
          `TIME; $display("*E WB INT signal should not be set");
          test_fail("WB INT signal should not be set");
          test_fail("WB INT signal should not be set");
          fail = fail + 1;
          fail = fail + 1;
        end
        end
      end
      end
 
      // check RX buffer descriptor of a packet
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
      check_rx_bd(127, data);
      if(RxFlow)
      if (i_length[1] == 1'b0) // interrupt enabled no_carrier_sense_rx_fd_detect
      begin
      begin
        if(data !== (`ETH_INT_RXC))
        if ( ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b0)) ||
 
             ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b1)) )
        begin
        begin
          test_fail("RXC is not set or multiple IRQs active!");
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
 
          test_fail("RX buffer descriptor status is not correct");
          fail = fail + 1;
          fail = fail + 1;
          `TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
        end
        // Clear RXC interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
 
      end
      end
      else if(PassAll)
      else // interrupt not enabled
      begin
      begin
        if(data !== (`ETH_INT_RXB))
        if ( ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b0)) ||
 
             ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b1)) )
        begin
        begin
          test_fail("RXB is not set or multiple IRQs active!");
          `TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
 
          test_fail("RX buffer descriptor status is not correct");
 
          fail = fail + 1;
 
        end
 
      end
 
      // clear RX buffer descriptor for first 4 frames
 
      if (i_length < min_tmp)
 
        clear_rx_bd(127, 127);
 
      // check interrupts
 
      wait (wbm_working == 0);
 
      wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      if ((i_length[1:0] == 2'h0) || (i_length[1:0] == 2'h1))
 
      begin
 
        if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
 
        begin
 
          `TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
 
          test_fail("Interrupt Receive Buffer was not set");
 
          fail = fail + 1;
 
        end
 
        if ((data & (~`ETH_INT_RXB)) !== 0)
 
        begin
 
          `TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
 
          test_fail("Other interrupts (except Receive Buffer) were set");
          fail = fail + 1;
          fail = fail + 1;
          `TIME; $display("*E RXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
 
        end
        end
        // Clear RXB interrupt
 
        wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
 
      end
      end
      else
      else
      begin
      begin
        if(data !== 0)
        if(data !== 0)
        begin
        begin
          test_fail("No interrupt should be set!");
          `TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
 
          test_fail("Any of interrupts (except Receive Buffer) was set");
          fail = fail + 1;
          fail = fail + 1;
          `TIME; $display("*E No interrupt should be set! (ETH_INT=0x%0x)", data);
 
        end
        end
      end
      end
 
      // clear interrupts
 
      wait (wbm_working == 0);
 
      wbm_write(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      // check WB INT signal
 
      if (wb_int !== 1'b0)
 
      begin
 
        test_fail("WB INT signal should not be set");
 
        fail = fail + 1;
 
      end
 
      // INTERMEDIATE DISPLAYS
 
      if ((i_length + 4) == (min_tmp + 64))
 
      begin
 
        // starting length is min_tmp, ending length is (min_tmp + 64)
 
        $display("    receive small packets is NOT selected");
 
        $display("    ->packets with lengths from %0d (MINFL) to %0d are checked (length increasing by 1 byte)",
 
                 min_tmp, (min_tmp + 64));
 
        // set receive small, remain the rest
 
        wait (wbm_working == 0);
 
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
 
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
 
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      else if ((i_length + 4) == (max_tmp - 16))
 
      begin
 
        // starting length is for +128 longer than previous ending length, while ending length is tmp_data
 
        $display("    receive small packets is selected");
 
        $display("    ->packets with lengths from %0d to %0d are checked (length increasing by 128 bytes)",
 
                 (min_tmp + 64 + 128), tmp_data);
 
        // reset receive small, remain the rest
 
        wait (wbm_working == 0);
 
        wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
 
                  `ETH_MODER_PRO | `ETH_MODER_BRO,
 
                  4'hF, 1, wbm_init_waits, wbm_subseq_waits);
 
      end
 
      else if ((i_length + 4) == max_tmp)
 
      begin
 
        $display("    receive small packets is NOT selected");
 
        $display("    ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
 
                 (max_tmp - (4 + 16)), max_tmp);
 
      end
 
      // set length (loop variable)
 
      if ((i_length + 4) < (min_tmp + 64))
 
        i_length = i_length + 1;
 
      else if ( ((i_length + 4) >= (min_tmp + 64)) && ((i_length + 4) <= (max_tmp - 256)) )
 
      begin
 
        i_length = i_length + 128;
 
        tmp_data = i_length + 4; // last tmp_data is ending length
 
      end
 
      else if ( ((i_length + 4) > (max_tmp - 256)) && ((i_length + 4) < (max_tmp - 16)) )
 
        i_length = max_tmp - (4 + 16);
 
      else if ((i_length + 4) >= (max_tmp - 16))
 
        i_length = i_length + 1;
 
      else
 
      begin
 
        $display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
 
        #10 $stop;
 
      end
    end
    end
 
 
 
 
    // disable RX
    // disable RX
 
    wait (wbm_working == 0);
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
    wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              `ETH_MODER_PRO | `ETH_MODER_BRO,
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
              4'hF, 1, wbm_init_waits, wbm_subseq_waits);
    if(fail == 0)
    if(fail == 0)
      test_ok;
      test_ok;
Line 15093... Line 17354...
 
 
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
end   //  for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
 
 
 
 
end
end
endtask // test_mac_full_duplex_flow_control
endtask // test_mac_half_duplex_flow
 
 
 
 
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
// WB Behavioral Models Basic tasks
// WB Behavioral Models Basic tasks
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
Line 15113... Line 17374...
  reg `WRITE_STIM_TYPE write_data;
  reg `WRITE_STIM_TYPE write_data;
  reg `WB_TRANSFER_FLAGS flags;
  reg `WB_TRANSFER_FLAGS flags;
  reg `WRITE_RETURN_TYPE write_status;
  reg `WRITE_RETURN_TYPE write_status;
  integer i;
  integer i;
begin
begin
 
  wbm_working = 1;
 
 
  write_status = 0;
  write_status = 0;
 
 
  flags                    = 0;
  flags                    = 0;
  flags`WB_TRANSFER_SIZE   = size_i;
  flags`WB_TRANSFER_SIZE   = size_i;
  flags`INIT_WAITS         = init_waits_i;
  flags`INIT_WAITS         = init_waits_i;
Line 15140... Line 17403...
  if (write_status`CYC_ACTUAL_TRANSFER !== size_i)
  if (write_status`CYC_ACTUAL_TRANSFER !== size_i)
  begin
  begin
    `TIME;
    `TIME;
    $display("*E WISHBONE Master was unable to complete the requested write operation to MAC!");
    $display("*E WISHBONE Master was unable to complete the requested write operation to MAC!");
  end
  end
 
 
 
  @(posedge wb_clk);
 
  #3;
 
  wbm_working = 0;
 
  #1;
end
end
endtask // wbm_write
endtask // wbm_write
 
 
task wbm_read;
task wbm_read;
  input  [31:0] address_i;
  input  [31:0] address_i;
Line 15156... Line 17424...
  reg `READ_RETURN_TYPE read_data;
  reg `READ_RETURN_TYPE read_data;
  reg `WB_TRANSFER_FLAGS flags;
  reg `WB_TRANSFER_FLAGS flags;
  reg `READ_RETURN_TYPE read_status;
  reg `READ_RETURN_TYPE read_status;
  integer i;
  integer i;
begin
begin
 
  wbm_working = 1;
 
 
  read_status = 0;
  read_status = 0;
  data_o      = 0;
  data_o      = 0;
 
 
  flags                  = 0;
  flags                  = 0;
  flags`WB_TRANSFER_SIZE = size_i;
  flags`WB_TRANSFER_SIZE = size_i;
Line 15188... Line 17458...
  begin
  begin
    data_o       = data_o << 32;
    data_o       = data_o << 32;
    read_data    = wb_master.blk_read_data_out[(size_i - 1) - i]; // [31 - i];
    read_data    = wb_master.blk_read_data_out[(size_i - 1) - i]; // [31 - i];
    data_o[31:0] = read_data`READ_DATA;
    data_o[31:0] = read_data`READ_DATA;
  end
  end
 
 
 
  @(posedge wb_clk);
 
  #3;
 
  wbm_working = 0;
 
  #1;
end
end
endtask // wbm_read
endtask // wbm_read
 
 
 
 
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
Line 15240... Line 17515...
  begin
  begin
//    buf_addr = `TX_BUF_BASE + i * 32'h600;
//    buf_addr = `TX_BUF_BASE + i * 32'h600;
    bd_status_addr = `TX_BD_BASE + i * 8;
    bd_status_addr = `TX_BD_BASE + i * 8;
    bd_ptr_addr = bd_status_addr + 4;
    bd_ptr_addr = bd_status_addr + 4;
    // initialize BD - status
    // initialize BD - status
//    wbm_write(bd_status_addr, 32'h00005800, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
 
    wbm_write(bd_status_addr, {len, 1'b0, irq, 1'b0, pad, crc, 11'h0},
    wbm_write(bd_status_addr, {len, 1'b0, irq, 1'b0, pad, crc, 11'h0},
              4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
              4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
    // initialize BD - pointer
    // initialize BD - pointer
//    wbm_write(bd_ptr_addr, buf_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
 
    wbm_write(bd_ptr_addr, txpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
    wbm_write(bd_ptr_addr, txpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
  end
  end
end
end
endtask // set_tx_bd
endtask // set_tx_bd
 
 
Line 15284... Line 17557...
  output [31:0] tx_bd_status;
  output [31:0] tx_bd_status;
  integer       bd_status_addr, tmp;
  integer       bd_status_addr, tmp;
begin
begin
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
  bd_status_addr = `TX_BD_BASE + tx_bd_num_end * 8;
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
  #1 tx_bd_status = tmp;
  tx_bd_status = tmp;
  #1;
 
end
end
endtask // check_tx_bd
endtask // check_tx_bd
 
 
task clear_tx_bd;
task clear_tx_bd;
  input  [6:0]  tx_nd_num_strat;
  input  [6:0]  tx_nd_num_strat;
Line 15373... Line 17645...
  integer       bd_status_addr, tmp;
  integer       bd_status_addr, tmp;
begin
begin
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
//  bd_status_addr = `RX_BD_BASE + rx_bd_num_end * 8;
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
  bd_status_addr = `TX_BD_BASE + rx_bd_num_end * 8;
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
  wbm_read(bd_status_addr, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
  #1 rx_bd_status = tmp;
  rx_bd_status = tmp;
  #1;
 
end
end
endtask // check_rx_bd
endtask // check_rx_bd
 
 
task clear_rx_bd;
task clear_rx_bd;
  input  [6:0]  rx_bd_num_strat;
  input  [6:0]  rx_bd_num_strat;
Line 16991... Line 19262...
 
 
task clear_memories;
task clear_memories;
  reg    [22:0]  adr_i;
  reg    [22:0]  adr_i;
  reg            delta_t;
  reg            delta_t;
begin
begin
  delta_t = 0;
 
  for (adr_i = 0; adr_i < 4194304; adr_i = adr_i + 1)
  for (adr_i = 0; adr_i < 4194304; adr_i = adr_i + 1)
  begin
  begin
    eth_phy.rx_mem[adr_i[21:0]] = 0;
    eth_phy.rx_mem[adr_i[21:0]] = 0;
    eth_phy.tx_mem[adr_i[21:0]] = 0;
    eth_phy.tx_mem[adr_i[21:0]] = 0;
    wb_slave.wb_memory[adr_i[21:2]] = 0;
    wb_slave.wb_memory[adr_i[21:2]] = 0;
    delta_t = !delta_t;
 
  end
  end
end
end
endtask // clear_memories
endtask // clear_memories
 
 
task clear_buffer_descriptors;
task clear_buffer_descriptors;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.