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;
|