Line 40... |
Line 40... |
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//
|
//
|
// CVS Revision History
|
// CVS Revision History
|
//
|
//
|
// $Log: not supported by cvs2svn $
|
// $Log: not supported by cvs2svn $
|
|
// Revision 1.31 2003/12/05 12:46:26 tadejm
|
|
// Updated testbench. Some more testcases, some repaired.
|
|
//
|
// Revision 1.30 2003/10/17 07:45:17 markom
|
// Revision 1.30 2003/10/17 07:45:17 markom
|
// mbist signals updated according to newest convention
|
// mbist signals updated according to newest convention
|
//
|
//
|
// Revision 1.29 2003/08/20 12:06:24 mohor
|
// Revision 1.29 2003/08/20 12:06:24 mohor
|
// Artisan RAMs added.
|
// Artisan RAMs added.
|
Line 493... |
Line 496... |
|
|
// Call tests
|
// Call tests
|
// ----------
|
// ----------
|
test_access_to_mac_reg(0, 4); // 0 - 4
|
test_access_to_mac_reg(0, 4); // 0 - 4
|
test_mii(0, 17); // 0 - 17
|
test_mii(0, 17); // 0 - 17
|
|
$display("");
|
|
$display("===========================================================================");
|
|
$display("PHY generates ideal Carrier sense and Collision signals for following tests");
|
|
$display("===========================================================================");
|
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(0, 21); // 0 - (21)
|
test_mac_full_duplex_transmit(0, 21); // 0 - 21
|
|
test_mac_full_duplex_receive(0, 13); // 0 - 13
|
|
test_mac_full_duplex_flow_control(0, 5); // 0 - 5
|
// test_mac_full_duplex_receive(2, 2); // 0 - 13
|
test_mac_half_duplex_flow(0, 1);
|
// test_mac_full_duplex_flow_control(0, 4); // 0 - 4
|
|
// 4 is executed, everything is OK
|
|
// test_mac_half_duplex_flow(0, 0);
|
|
|
|
|
$display("");
|
|
$display("===========================================================================");
|
|
$display("PHY generates 'real delayed' Carrier sense and Collision signals for following tests");
|
|
$display("===========================================================================");
|
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);
|
|
test_mac_full_duplex_transmit(0, 21); // 0 - 21
|
|
test_mac_full_duplex_receive(0, 13); // 0 - 13
|
|
test_mac_full_duplex_flow_control(0, 5); // 0 - 5
|
|
test_mac_half_duplex_flow(0, 1);
|
|
|
|
|
// Finish test's logs
|
// Finish test's logs
|
test_summary;
|
test_summary;
|
$display("\n\n END of SIMULATION");
|
$display("\n\n END of SIMULATION");
|
Line 580... |
Line 592... |
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Byte selects on 4 32-bit RW registers. ////
|
//// Byte selects on 4 32-bit RW registers. ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 0) // Walking 1 with single cycles across MAC regs.
|
if (test_num == 0) //
|
begin
|
begin
|
// TEST 0: BYTE SELECTS ON 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )
|
// TEST 0: BYTE SELECTS ON 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )
|
test_name = "TEST 0: BYTE SELECTS ON 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )";
|
test_name = "TEST 0: BYTE SELECTS ON 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )";
|
`TIME; $display(" TEST 0: BYTE SELECTS ON 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )");
|
`TIME; $display(" TEST 0: BYTE SELECTS ON 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )");
|
|
|
Line 667... |
Line 679... |
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Walking 1 with single cycles across MAC regs. ////
|
//// Walking 1 with single cycles across MAC regs. ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 1) // Walking 1 with single cycles across MAC regs.
|
if (test_num == 1) //
|
begin
|
begin
|
// TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
|
// TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
|
test_name = "TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
|
test_name = "TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
|
`TIME; $display(" TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
|
`TIME; $display(" TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
|
|
|
Line 896... |
Line 908... |
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Walking 1 with single cycles across MAC buffer descript. ////
|
//// Walking 1 with single cycles across MAC buffer descript. ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 2) // Start Walking 1 with single cycles across MAC buffer descript.
|
if (test_num == 2) //
|
begin
|
begin
|
// TEST 2: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )
|
// TEST 2: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )
|
test_name = "TEST 2: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )";
|
test_name = "TEST 2: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )";
|
`TIME; $display(" TEST 2: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )");
|
`TIME; $display(" TEST 2: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )");
|
|
|
Line 1024... |
Line 1036... |
//// ////
|
//// ////
|
//// Test max reg. values and reg. values after writing ////
|
//// Test max reg. values and reg. values after writing ////
|
//// inverse reset values and hard reset of the MAC ////
|
//// inverse reset values and hard reset of the MAC ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 3) // Start this task
|
if (test_num == 3) //
|
begin
|
begin
|
// TEST 3: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC
|
// TEST 3: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC
|
test_name =
|
test_name =
|
"TEST 3: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC";
|
"TEST 3: MAX REG. VALUES AND REG. VALUES AFTER WRITING INVERSE RESET VALUES AND HARD RESET OF THE MAC";
|
`TIME; $display(
|
`TIME; $display(
|
Line 1247... |
Line 1259... |
//// ////
|
//// ////
|
//// Test buffer desc. ram preserving values after hard reset ////
|
//// Test buffer desc. ram preserving values after hard reset ////
|
//// of the mac and reseting the logic ////
|
//// of the mac and reseting the logic ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 4) // Start this task
|
if (test_num == 4) //
|
begin
|
begin
|
// TEST 4: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC
|
// TEST 4: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC
|
test_name = "TEST 4: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC";
|
test_name = "TEST 4: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC";
|
`TIME;
|
`TIME;
|
$display(" TEST 4: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC");
|
$display(" TEST 4: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC");
|
Line 1299... |
Line 1311... |
else
|
else
|
fail = 0;
|
fail = 0;
|
end
|
end
|
|
|
|
|
if (test_num == 5) // Start this task
|
if (test_num == 5) //
|
begin
|
begin
|
/* // TEST 5: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
|
/* // TEST 5: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
|
test_name = "TEST 5: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
|
test_name = "TEST 5: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
|
`TIME; $display(" TEST 5: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
|
`TIME; $display(" TEST 5: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
|
|
|
Line 1627... |
Line 1639... |
//// ////
|
//// ////
|
//// Test clock divider of mii management module with all ////
|
//// Test clock divider of mii management module with all ////
|
//// possible frequences. ////
|
//// possible frequences. ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 0) // Test clock divider of mii management module with all possible frequences.
|
if (test_num == 0) //
|
begin
|
begin
|
// TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES
|
// TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES
|
test_name = "TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES";
|
test_name = "TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES";
|
`TIME; $display(" TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES");
|
`TIME; $display(" TEST 0: CLOCK DIVIDER OF MII MANAGEMENT MODULE WITH ALL POSSIBLE FREQUENCES");
|
|
|
Line 1700... |
Line 1712... |
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Test various readings from 'real' phy registers. ////
|
//// Test various readings from 'real' phy registers. ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 1) // Test various readings from 'real' phy registers.
|
if (test_num == 1) //
|
begin
|
begin
|
// TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS
|
// TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS
|
test_name = "TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS";
|
test_name = "TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS";
|
`TIME; $display(" TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS");
|
`TIME; $display(" TEST 1: VARIOUS READINGS FROM 'REAL' PHY REGISTERS");
|
|
|
Line 2491... |
Line 2503... |
begin
|
begin
|
// TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )
|
// TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )
|
test_name = "TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )";
|
test_name = "TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )";
|
`TIME; $display(" TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )");
|
`TIME; $display(" TEST 11: BUSY AND NVALID STATUS DURATIONS DURING WRITE ( WITH AND WITHOUT PREAMBLE )");
|
|
|
reset_mii; // reset MII
|
|
// set link up, if it wasn't due to previous tests, since there weren't PHY registers
|
// set link up, if it wasn't due to previous tests, since there weren't PHY registers
|
#Tp eth_phy.link_up_down(1);
|
#Tp eth_phy.link_up_down(1);
|
// set the MII
|
// set the MII
|
clk_div = 64;
|
clk_div = 64;
|
mii_set_clk_div(clk_div[7:0]);
|
mii_set_clk_div(clk_div[7:0]);
|
Line 2689... |
Line 2700... |
begin
|
begin
|
// TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )
|
// TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )
|
test_name = "TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )";
|
test_name = "TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )";
|
`TIME; $display(" TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )");
|
`TIME; $display(" TEST 12: BUSY AND NVALID STATUS DURATIONS DURING READ ( WITH AND WITHOUT PREAMBLE )");
|
|
|
reset_mii; // reset MII
|
|
// set link up, if it wasn't due to previous tests, since there weren't PHY registers
|
// set link up, if it wasn't due to previous tests, since there weren't PHY registers
|
#Tp eth_phy.link_up_down(1);
|
#Tp eth_phy.link_up_down(1);
|
// set the MII
|
// set the MII
|
clk_div = 64;
|
clk_div = 64;
|
mii_set_clk_div(clk_div[7:0]);
|
mii_set_clk_div(clk_div[7:0]);
|
Line 2889... |
Line 2899... |
begin
|
begin
|
// TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )
|
// TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )
|
test_name = "TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )";
|
test_name = "TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )";
|
`TIME; $display(" TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )");
|
`TIME; $display(" TEST 13: BUSY AND NVALID STATUS DURATIONS DURING SCAN ( WITH AND WITHOUT PREAMBLE )");
|
|
|
reset_mii; // reset MII
|
|
// set link up, if it wasn't due to previous tests, since there weren't PHY registers
|
// set link up, if it wasn't due to previous tests, since there weren't PHY registers
|
#Tp eth_phy.link_up_down(1);
|
#Tp eth_phy.link_up_down(1);
|
// set the MII
|
// set the MII
|
clk_div = 64;
|
clk_div = 64;
|
mii_set_clk_div(clk_div[7:0]);
|
mii_set_clk_div(clk_div[7:0]);
|
Line 3137... |
Line 3146... |
begin
|
begin
|
// TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
|
// TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )
|
test_name = "TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
|
test_name = "TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )";
|
`TIME; $display(" TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
|
`TIME; $display(" TEST 14: SCAN STATUS FROM PHY WITH DETECTING LINK-FAIL BIT ( WITH AND WITHOUT PREAMBLE )");
|
|
|
reset_mii; // reset MII
|
|
// set link up, if it wasn't due to previous tests, since there weren't PHY registers
|
// set link up, if it wasn't due to previous tests, since there weren't PHY registers
|
#Tp eth_phy.link_up_down(1);
|
#Tp eth_phy.link_up_down(1);
|
// set MII speed
|
// set MII speed
|
clk_div = 6;
|
clk_div = 6;
|
mii_set_clk_div(clk_div[7:0]);
|
mii_set_clk_div(clk_div[7:0]);
|
Line 4269... |
Line 4277... |
$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;
|
|
//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 4349... |
Line 4354... |
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Test no transmit when all buffers are RX ( 10Mbps ). ////
|
//// Test no transmit when all buffers are RX ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 0) // Test no transmit when all buffers are RX ( 10Mbps ).
|
if (test_num == 0) //
|
begin
|
begin
|
// TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )
|
// TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )
|
test_name = "TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )";
|
test_name = "TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )";
|
`TIME; $display(" TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )");
|
`TIME; $display(" TEST 0: NO TRANSMIT WHEN ALL BUFFERS ARE RX ( 10Mbps )");
|
|
|
Line 4441... |
Line 4446... |
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Test no transmit when all buffers are RX ( 100Mbps ). ////
|
//// Test no transmit when all buffers are RX ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 1) // Test no transmit when all buffers are RX ( 100Mbps ).
|
if (test_num == 1) //
|
begin
|
begin
|
// 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 )");
|
|
|
Line 4535... |
Line 4540... |
//// ////
|
//// ////
|
//// Test transmit packets form MINFL to MAXFL sizes at ////
|
//// Test transmit packets form MINFL to MAXFL sizes at ////
|
//// one TX buffer decriptor ( 10Mbps ). ////
|
//// one TX buffer decriptor ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 2) // without and with padding
|
if (test_num == 2) //
|
begin
|
begin
|
// TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )
|
// TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )
|
test_name = "TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )";
|
test_name = "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 )");
|
`TIME; $display(" TEST 2: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 10Mbps )");
|
|
|
Line 4849... |
Line 4854... |
//// ////
|
//// ////
|
//// Test transmit packets form MINFL to MAXFL sizes at ////
|
//// Test transmit packets form MINFL to MAXFL sizes at ////
|
//// one TX buffer decriptor ( 100Mbps ). ////
|
//// one TX buffer decriptor ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 3) // with and without padding
|
if (test_num == 3) //
|
begin
|
begin
|
// TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )
|
// TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )
|
test_name = "TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )";
|
test_name = "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 )");
|
`TIME; $display(" TEST 3: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT ONE TX BD ( 100Mbps )");
|
|
|
Line 5153... |
Line 5158... |
//// ////
|
//// ////
|
//// Test transmit packets form MINFL to MAXFL sizes at ////
|
//// Test transmit packets form MINFL to MAXFL sizes at ////
|
//// maximum TX buffer decriptors ( 10Mbps ). ////
|
//// maximum TX buffer decriptors ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 4) // without and with padding
|
if (test_num == 4) //
|
begin
|
begin
|
// TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )
|
// TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )
|
test_name = "TEST 4: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 10Mbps )";
|
test_name = "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 )");
|
`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;
|
|
// 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;
|
Line 5183... |
Line 5185... |
// prepare two packets of MAXFL length
|
// prepare two packets of MAXFL length
|
wait (wbm_working == 0);
|
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'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
|
st_data = 8'h81;
|
st_data = 8'h71;
|
set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
|
set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
|
// check WB INT signal
|
// check WB INT signal
|
if (wb_int !== 1'b0)
|
if (wb_int !== 1'b0)
|
begin
|
begin
|
|
`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
|
|
|
// write to phy's control register for 10Mbps
|
// write to phy's control register for 10Mbps
|
Line 5384... |
Line 5387... |
begin
|
begin
|
wait (MTxEn === 1'b1); // start transmit
|
wait (MTxEn === 1'b1); // start transmit
|
#1 check_tx_bd(num_of_bd, data);
|
#1 check_tx_bd(num_of_bd, data);
|
if (data[15] !== 1)
|
if (data[15] !== 1)
|
begin
|
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");
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
wait (MTxEn === 1'b0); // end transmit
|
wait (MTxEn === 1'b0); // end transmit
|
while (data[15] === 1)
|
while (data[15] === 1)
|
Line 5395... |
Line 5399... |
#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);
|
end
|
end
|
|
repeat(2) @(posedge wb_clk);
|
|
repeat(2) @(posedge mrx_clk);
|
// 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
|
|
`TIME; $display("*E Wrong length of the packet out from MAC: %0d instead of %0d", eth_phy.tx_len, i_length + 4);
|
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
|
|
// checking in the following if statement is performed only for first and last 64 lengths
|
// check transmitted TX packet data
|
// check transmitted TX packet data
|
if (i_length[0] == 0)
|
if (i_length[0] == 0)
|
begin
|
begin
|
check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
|
check_tx_packet((`MEMORY_BASE + i_length[1:0]), 0, i_length, tmp);
|
end
|
end
|
Line 5412... |
Line 5420... |
begin
|
begin
|
check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
|
check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
|
end
|
end
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
|
`TIME; $display("*E 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 (i_length[0] == 0)
|
if (i_length[0] == 0)
|
check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
|
check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
|
else
|
else
|
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
|
|
`TIME; $display("*E 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
|
// check WB INT signal
|
// check WB INT signal
|
if (i_length[1:0] == 2'h0)
|
if (i_length[1:0] == 2'h0)
|
Line 5505... |
Line 5515... |
wait (wbm_working == 0);
|
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
|
|
`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
|
// INTERMEDIATE DISPLAYS
|
// INTERMEDIATE DISPLAYS
|
if ((i_length + 4) == (min_tmp + 7))
|
if ((i_length + 4) == (min_tmp + 7))
|
Line 5613... |
Line 5624... |
//// ////
|
//// ////
|
//// Test transmit packets form MINFL to MAXFL sizes at ////
|
//// Test transmit packets form MINFL to MAXFL sizes at ////
|
//// maximum TX buffer decriptors ( 100Mbps ). ////
|
//// maximum TX buffer decriptors ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 5) // with and without padding
|
if (test_num == 5) //
|
begin
|
begin
|
// TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )
|
// TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )
|
test_name = "TEST 5: TRANSMIT PACKETS FROM MINFL TO MAXFL SIZES AT MAX TX BDs ( 100Mbps )";
|
test_name = "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 )");
|
`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;
|
|
// 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;
|
Line 5650... |
Line 5658... |
st_data = 8'h71;
|
st_data = 8'h71;
|
set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
|
set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp), st_data); // length without CRC
|
// check WB INT signal
|
// check WB INT signal
|
if (wb_int !== 1'b0)
|
if (wb_int !== 1'b0)
|
begin
|
begin
|
|
`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
|
|
|
// write to phy's control register for 100Mbps
|
// write to phy's control register for 100Mbps
|
Line 5844... |
Line 5853... |
begin
|
begin
|
wait (MTxEn === 1'b1); // start transmit
|
wait (MTxEn === 1'b1); // start transmit
|
#1 check_tx_bd(num_of_bd, data);
|
#1 check_tx_bd(num_of_bd, data);
|
if (data[15] !== 1)
|
if (data[15] !== 1)
|
begin
|
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");
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
wait (MTxEn === 1'b0); // end transmit
|
wait (MTxEn === 1'b0); // end transmit
|
while (data[15] === 1)
|
while (data[15] === 1)
|
Line 5855... |
Line 5865... |
#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);
|
end
|
end
|
|
repeat(2) @(posedge wb_clk);
|
|
repeat(2) @(posedge mrx_clk);
|
// 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
|
|
`TIME; $display("*E Wrong length of the packet out from MAC: %0d instead of %0d", eth_phy.tx_len, i_length + 4);
|
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
|
// checking in the following if statement is performed only for first and last 64 lengths
|
// checking in the following if statement is performed only for first and last 64 lengths
|
// check transmitted TX packet data
|
// check transmitted TX packet data
|
Line 5873... |
Line 5886... |
begin
|
begin
|
check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
|
check_tx_packet(((`MEMORY_BASE + i_length[1:0]) + max_tmp), max_tmp, i_length, tmp);
|
end
|
end
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
|
`TIME; $display("*E 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 (i_length[0] == 0)
|
if (i_length[0] == 0)
|
check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
|
check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
|
else
|
else
|
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
|
|
`TIME; $display("*E 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
|
// check WB INT signal
|
// check WB INT signal
|
if (i_length[1:0] == 2'h0)
|
if (i_length[1:0] == 2'h0)
|
Line 5966... |
Line 5981... |
wait (wbm_working == 0);
|
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
|
|
`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
|
// INTERMEDIATE DISPLAYS
|
// INTERMEDIATE DISPLAYS
|
if ((i_length + 4) == (min_tmp + 7))
|
if ((i_length + 4) == (min_tmp + 7))
|
Line 6082... |
Line 6098... |
test_name = "TEST 6: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 10Mbps )";
|
test_name = "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 )");
|
`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;
|
|
// 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;
|
Line 6568... |
Line 6581... |
test_name = "TEST 7: TRANSMIT PACKETS FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
|
test_name = "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 )");
|
`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;
|
|
// 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;
|
Line 7053... |
Line 7063... |
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 )");
|
|
|
// reset MAC registers
|
// reset MAC registers
|
hard_reset;
|
hard_reset;
|
// reset MAC and MII LOGIC with soft reset
|
|
// reset_mac;
|
|
// 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;
|
Line 7334... |
Line 7341... |
disable fr_st2;
|
disable fr_st2;
|
end
|
end
|
end
|
end
|
end
|
end
|
join
|
join
|
|
|
|
|
// check packets larger than 4 bytes
|
// check packets larger than 4 bytes
|
if (num_of_frames >= 5)
|
if (num_of_frames >= 5)
|
begin
|
begin
|
wait (MTxEn === 1'b0); // end transmit
|
wait (MTxEn === 1'b0); // end transmit
|
while (data[15] === 1)
|
while (data[15] === 1)
|
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);
|
|
|
|
|
// check length of a PACKET // Check this if it is OK igor
|
// check length of a PACKET // Check this if it is OK igor
|
if (num_of_frames < 6)
|
if (num_of_frames < 6)
|
begin
|
begin
|
if (eth_phy.tx_len != (i_length + 4))
|
if (eth_phy.tx_len != (i_length + 4))
|
begin
|
begin
|
Line 7400... |
Line 7403... |
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
|
end
|
end
|
end
|
end
|
|
|
// check transmitted TX packet data
|
// check transmitted TX packet data
|
if (i_length[0] == 0)
|
if (i_length[0] == 0)
|
begin
|
begin
|
#1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
|
#1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
|
end
|
end
|
Line 7417... |
Line 7419... |
begin
|
begin
|
#1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
|
#1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
|
end
|
end
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
|
`TIME; $display("*E 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
|
#1;
|
#1;
|
Line 7429... |
Line 7432... |
end
|
end
|
else
|
else
|
check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
|
check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
|
`TIME; $display("*E 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
|
end
|
// check WB INT signal
|
// check WB INT signal
|
Line 7454... |
Line 7458... |
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
end
|
// check TX buffer descriptor of a packet
|
// check TX buffer descriptor of a packet
|
check_tx_bd(num_of_bd, data);
|
check_tx_bd(num_of_bd, data);
|
|
|
if (num_of_frames >= 5)
|
if (num_of_frames >= 5)
|
begin
|
begin
|
if ((i_length[1] == 1'b0) && (i_length[0] == 1'b0)) // interrupt enabled
|
if ((i_length[1] == 1'b0) && (i_length[0] == 1'b0)) // interrupt enabled
|
begin
|
begin
|
if ( (data[15:0] !== 16'h6000) && // wrap bit
|
if ( (data[15:0] !== 16'h6000) && // wrap bit
|
Line 7553... |
Line 7556... |
wait (wbm_working == 0);
|
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
|
|
`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
|
// INTERMEDIATE DISPLAYS
|
// INTERMEDIATE DISPLAYS
|
if (i_length == 3)
|
if (i_length == 3)
|
Line 7639... |
Line 7643... |
test_name = "TEST 9: TRANSMIT PACKETS (NO PADs) FROM 0 TO (MINFL - 1) SIZES AT 8 TX BD ( 100Mbps )";
|
test_name = "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 )");
|
`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;
|
|
// 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);
|
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);
|
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,
|
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);
|
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
|
Line 7727... |
Line 7729... |
// 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
|
endcase
|
endcase
|
|
// // append CRC
|
|
// if ((i_length[0] == 1'b0) && (num_of_frames >= 6))
|
|
// begin
|
|
// append_tx_crc(`MEMORY_BASE, i_length, 1'b0);
|
|
// end
|
#1;
|
#1;
|
// first destination address on ethernet PHY
|
// first destination address on ethernet PHY
|
eth_phy.set_tx_mem_addr(num_of_frames * 16);
|
eth_phy.set_tx_mem_addr(num_of_frames * 16);
|
// SET packets and wrap bit
|
// SET packets and wrap bit
|
// num_of_frames <= 9 => wrap set to TX BD 0
|
// num_of_frames <= 9 => wrap set to TX BD 0
|
if (num_of_frames <= 9)
|
if (num_of_frames <= 5)
|
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
|
if (tmp_len[0] == 0)
|
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
|
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);
|
else
|
else
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 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 wrap bit
|
|
set_tx_bd_wrap(0);
|
|
end
|
|
else if (num_of_frames <= 9)
|
|
begin
|
|
tmp_len = i_length; // length of frame
|
|
tmp_bd_num = 0; // TX BD number
|
|
// 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 (tmp_len[0] == 0) // CRC appended by 'SOFTWARE'
|
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
|
|
else
|
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b1, (`MEMORY_BASE + max_tmp));
|
// set wrap bit
|
// set wrap bit
|
set_tx_bd_wrap(0);
|
set_tx_bd_wrap(0);
|
end
|
end
|
// 10 <= num_of_frames < 18 => wrap set to TX BD 3
|
// 10 <= num_of_frames < 18 => wrap set to TX BD 3
|
else if ((num_of_frames == 10) || (num_of_frames == 14))
|
else if ((num_of_frames == 10) || (num_of_frames == 14))
|
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
|
while (tmp_bd_num < 4) //
|
while (tmp_bd_num < 4)
|
begin
|
begin
|
// 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
|
if (tmp_len[0] == 0)
|
if (tmp_len[0] == 0)
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
|
else
|
else
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 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));
|
tmp_len = tmp_len + 1;
|
tmp_len = tmp_len + 1;
|
// set TX BD number
|
// set TX BD number
|
tmp_bd_num = tmp_bd_num + 1;
|
tmp_bd_num = tmp_bd_num + 1;
|
end
|
end
|
// set wrap bit
|
// set wrap bit
|
Line 7775... |
Line 7796... |
while (tmp_bd_num < 5) //
|
while (tmp_bd_num < 5) //
|
begin
|
begin
|
// 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
|
if (tmp_len[0] == 0)
|
if (tmp_len[0] == 0)
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
|
else
|
else // when (num_of_frames == 23), (i_length == 23) and therefor i_length[0] == 1 !!!
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1],
|
|
((num_of_frames == 23) && (tmp_bd_num == 0)), 1'b1, (`MEMORY_BASE + max_tmp));
|
|
|
tmp_len = tmp_len + 1;
|
tmp_len = tmp_len + 1;
|
// set TX BD number
|
// set TX BD number
|
tmp_bd_num = tmp_bd_num + 1;
|
tmp_bd_num = tmp_bd_num + 1;
|
end
|
end
|
// set wrap bit
|
// set wrap bit
|
Line 7795... |
Line 7818... |
while (tmp_bd_num < 6) //
|
while (tmp_bd_num < 6) //
|
begin
|
begin
|
// 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
|
if (tmp_len[0] == 0)
|
if (tmp_len[0] == 0)
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
|
else
|
else
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 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));
|
tmp_len = tmp_len + 1;
|
tmp_len = tmp_len + 1;
|
// set TX BD number
|
// set TX BD number
|
tmp_bd_num = tmp_bd_num + 1;
|
tmp_bd_num = tmp_bd_num + 1;
|
end
|
end
|
// set wrap bit
|
// set wrap bit
|
Line 7815... |
Line 7838... |
while (tmp_bd_num < 7) //
|
while (tmp_bd_num < 7) //
|
begin
|
begin
|
// 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
|
if (tmp_len[0] == 0)
|
if (tmp_len[0] == 0)
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
|
else
|
else
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 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));
|
tmp_len = tmp_len + 1;
|
tmp_len = tmp_len + 1;
|
// set TX BD number
|
// set TX BD number
|
tmp_bd_num = tmp_bd_num + 1;
|
tmp_bd_num = tmp_bd_num + 1;
|
end
|
end
|
// set wrap bit
|
// set wrap bit
|
Line 7835... |
Line 7858... |
while (tmp_bd_num < 8) //
|
while (tmp_bd_num < 8) //
|
begin
|
begin
|
// 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
|
if (tmp_len[0] == 0)
|
if (tmp_len[0] == 0)
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 1'b1, `MEMORY_BASE);
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b0, 1'b0, `MEMORY_BASE);
|
else
|
else
|
set_tx_bd(tmp_bd_num, tmp_bd_num, tmp_len, !tmp_len[1], 1'b1, 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));
|
tmp_len = tmp_len + 1;
|
tmp_len = tmp_len + 1;
|
// set TX BD number
|
// set TX BD number
|
tmp_bd_num = tmp_bd_num + 1;
|
tmp_bd_num = tmp_bd_num + 1;
|
end
|
end
|
// set wrap bit
|
// set wrap bit
|
Line 7880... |
Line 7903... |
wait (MTxEn === 1'b1); // start transmit
|
wait (MTxEn === 1'b1); // start transmit
|
frame_started = 1;
|
frame_started = 1;
|
end
|
end
|
begin
|
begin
|
repeat (50) @(posedge mtx_clk);
|
repeat (50) @(posedge mtx_clk);
|
$display("(%0t) num_of_frames = 0x%0x", $time, num_of_frames);
|
|
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 7894... |
Line 7916... |
else
|
else
|
begin
|
begin
|
if (frame_started == 0)
|
if (frame_started == 0)
|
begin
|
begin
|
`TIME; $display("*W Frame should start!");
|
`TIME; $display("*W Frame should start!");
|
#500 $stop;
|
|
disable fr_st3;
|
disable fr_st3;
|
end
|
end
|
end
|
end
|
end
|
end
|
join
|
join
|
Line 7910... |
Line 7931... |
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);
|
// check length of a PACKET
|
// check length of a PACKET // Check this if it is OK igor
|
if ((num_of_frames + 4) < 64)
|
if (num_of_frames < 6)
|
|
begin
|
|
if (eth_phy.tx_len != (i_length + 4))
|
|
begin
|
|
`TIME; $display("*E Wrong length of the packet out from MAC");
|
|
test_fail("Wrong length of the packet out from MAC");
|
|
fail = fail + 1;
|
|
end
|
|
end
|
|
else if (num_of_frames != 23) // 6 - 53 except 23
|
|
begin
|
|
if (i_length[0] == 1'b0)
|
|
begin
|
|
if (eth_phy.tx_len != i_length)
|
|
begin
|
|
`TIME; $display("*E Wrong length of the packet out from MAC");
|
|
test_fail("Wrong length of the packet out from MAC");
|
|
fail = fail + 1;
|
|
end
|
|
end
|
|
else
|
|
begin
|
|
if (eth_phy.tx_len != (i_length + 4))
|
|
begin
|
|
`TIME; $display("*E Wrong length of the packet out from MAC");
|
|
test_fail("Wrong length of the packet out from MAC");
|
|
fail = fail + 1;
|
|
end
|
|
end
|
|
end
|
|
else // num_of_frames == 23
|
|
begin
|
|
if (data[12]) // Padding
|
begin
|
begin
|
if (eth_phy.tx_len != 64)
|
if (eth_phy.tx_len != (64))
|
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
|
Line 7929... |
Line 7982... |
`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
|
end
|
end
|
|
end
|
// check transmitted TX packet data
|
// check transmitted TX packet data
|
if (i_length[0] == 0)
|
if (i_length[0] == 0)
|
begin
|
begin
|
#1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
|
#1 check_tx_packet(`MEMORY_BASE, (num_of_frames * 16), i_length, tmp);
|
end
|
end
|
|
else if (num_of_frames == 23) // i_length[0] == 1 here
|
|
begin
|
|
#1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
|
|
#1 check_tx_packet( 0, (num_of_frames * 16 + i_length), (min_tmp - i_length - 4), tmp);
|
|
end
|
else
|
else
|
begin
|
begin
|
#1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
|
#1 check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames * 16), i_length, tmp);
|
end
|
end
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
|
`TIME; $display("*E 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
|
#1 check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
|
#1;
|
|
if ((i_length[0] == 1'b0) && (num_of_frames >= 6))
|
|
begin
|
|
end
|
|
else
|
|
check_tx_crc((num_of_frames * 16), (eth_phy.tx_len - 4), 1'b0, tmp); // length without CRC
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
|
`TIME; $display("*E 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
|
end
|
// check WB INT signal
|
// check WB INT signal
|
Line 7974... |
Line 8040... |
end
|
end
|
// check TX buffer descriptor of a packet
|
// check TX buffer descriptor of a packet
|
check_tx_bd(num_of_bd, data);
|
check_tx_bd(num_of_bd, data);
|
if (num_of_frames >= 5)
|
if (num_of_frames >= 5)
|
begin
|
begin
|
if (i_length[1] == 1'b0) // interrupt enabled
|
if ((i_length[1] == 1'b0) && (i_length[0] == 1'b0)) // interrupt enabled
|
begin
|
begin
|
if ( (data[15:0] !== 16'h7800) && // wrap bit
|
if ( (data[15:0] !== 16'h6000) && // wrap bit
|
(data[15:0] !== 16'h5800) ) // without wrap bit
|
(data[15:0] !== 16'h4000) ) // without wrap bit
|
begin
|
begin
|
`TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
|
`TIME; $display("*E TX buffer descriptor status is not correct 1: %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
|
end
|
end
|
else // interrupt not enabled
|
else if ((i_length[1] == 1'b1) && (i_length[0] == 1'b0)) // interrupt not enabled
|
|
begin
|
|
if ( (data[15:0] !== 16'h2000) && // wrap bit
|
|
(data[15:0] !== 16'h0000) ) // without wrap bit
|
|
begin
|
|
`TIME; $display("*E TX buffer descriptor status is not correct 2: %0h", data[15:0]);
|
|
test_fail("TX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
end
|
|
else if ((i_length[1] == 1'b0) && (i_length[0] == 1'b1)) // interrupt enabled
|
|
begin
|
|
if ( (data[15:0] !== 16'h6800) && // wrap bit
|
|
(data[15:0] !== 16'h4800) ) // without wrap bit
|
|
begin
|
|
`TIME; $display("*E TX buffer descriptor status is not correct 3: %0h", data[15:0]);
|
|
test_fail("TX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
end
|
|
else if (num_of_frames != 23) // ((i_length[1] == 1'b1) && (i_length[0] == 1'b1)) // interrupt not enabled
|
|
begin
|
|
if ( (data[15:0] !== 16'h2800) && // wrap bit
|
|
(data[15:0] !== 16'h0800) ) // without wrap bit
|
|
begin
|
|
`TIME; $display("*E TX buffer descriptor status is not correct 4: %0h", data[15:0]);
|
|
test_fail("TX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
end
|
|
else // ((num_of_frames != 23) && (i_length[1] == 1'b1) && (i_length[0] == 1'b1)) // interrupt not enabled
|
begin
|
begin
|
if ( (data[15:0] !== 16'h3800) && // wrap bit
|
if ( (data[15:0] !== 16'h3800) && // wrap bit
|
(data[15:0] !== 16'h1800) ) // without wrap bit
|
(data[15:0] !== 16'h1800) ) // without wrap bit
|
begin
|
begin
|
`TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
|
`TIME; $display("*E TX buffer descriptor status is not correct 5: %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
|
end
|
end
|
end
|
end
|
Line 8040... |
Line 8136... |
wait (wbm_working == 0);
|
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
|
|
`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
|
// 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 not selected (except for 0x23)");
|
$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 8118... |
Line 8215... |
//// ////
|
//// ////
|
//// Test transmit packets across MAXFL value at ////
|
//// Test transmit packets across MAXFL value at ////
|
//// 13 TX buffer decriptors ( 10Mbps ). ////
|
//// 13 TX buffer decriptors ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 10) // without and with padding
|
if (test_num == 10) //
|
begin
|
begin
|
// TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )
|
// TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )
|
test_name = "TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
|
test_name = "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 )");
|
`TIME; $display(" TEST 10: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
|
|
|
Line 8339... |
Line 8436... |
//// ////
|
//// ////
|
//// Test transmit packets across MAXFL value at ////
|
//// Test transmit packets across MAXFL value at ////
|
//// 13 TX buffer decriptors ( 100Mbps ). ////
|
//// 13 TX buffer decriptors ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 11) // without and with padding
|
if (test_num == 11) //
|
begin
|
begin
|
// TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )
|
// TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )
|
test_name = "TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
|
test_name = "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 )");
|
`TIME; $display(" TEST 11: TRANSMIT PACKETS ACROSS MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
|
|
|
Line 8563... |
Line 8660... |
//// ////
|
//// ////
|
//// Test transmit packets across changed MAXFL value at ////
|
//// Test transmit packets across changed MAXFL value at ////
|
//// 47 TX buffer decriptors ( 10Mbps ). ////
|
//// 47 TX buffer decriptors ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 12) // without and with padding
|
if (test_num == 12) //
|
begin
|
begin
|
// TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )
|
// TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )
|
test_name = "TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )";
|
test_name = "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 )");
|
`TIME; $display(" TEST 12: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 10Mbps )");
|
|
|
Line 8764... |
Line 8861... |
//// ////
|
//// ////
|
//// Test transmit packets across changed MAXFL value at ////
|
//// Test transmit packets across changed MAXFL value at ////
|
//// 47 TX buffer decriptors ( 100Mbps ). ////
|
//// 47 TX buffer decriptors ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 13) // without and with padding
|
if (test_num == 13) //
|
begin
|
begin
|
// TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )
|
// TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )
|
test_name = "TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )";
|
test_name = "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 )");
|
`TIME; $display(" TEST 13: TRANSMIT PACKETS ACROSS CHANGED MAXFL VALUE AT 13 TX BDs ( 100Mbps )");
|
|
|
Line 8965... |
Line 9062... |
//// ////
|
//// ////
|
//// Test transmit packets across changed MINFL value at ////
|
//// Test transmit packets across changed MINFL value at ////
|
//// 7 TX buffer decriptors ( 10Mbps ). ////
|
//// 7 TX buffer decriptors ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 14) // without and with padding
|
if (test_num == 14) //
|
begin
|
begin
|
// TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )
|
// TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )
|
test_name = "TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )";
|
test_name = "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 )");
|
`TIME; $display(" TEST 14: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 10Mbps )");
|
|
|
Line 9162... |
Line 9259... |
//// ////
|
//// ////
|
//// Test transmit packets across changed MINFL value at ////
|
//// Test transmit packets across changed MINFL value at ////
|
//// 7 TX buffer decriptors ( 100Mbps ). ////
|
//// 7 TX buffer decriptors ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 15) // without and with padding
|
if (test_num == 15) //
|
begin
|
begin
|
// TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )
|
// TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )
|
test_name = "TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )";
|
test_name = "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 )");
|
`TIME; $display(" TEST 15: TRANSMIT PACKETS ACROSS CHANGED MINFL VALUE AT 7 TX BDs ( 100Mbps )");
|
|
|
Line 9357... |
Line 9454... |
//// ////
|
//// ////
|
//// Test transmit packets across MAXFL with HUGEN at ////
|
//// Test transmit packets across MAXFL with HUGEN at ////
|
//// 19 TX buffer decriptors ( 10Mbps ). ////
|
//// 19 TX buffer decriptors ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 16) // without and with padding
|
if (test_num == 16) //
|
begin
|
begin
|
// TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )
|
// TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )
|
test_name = "TEST 16: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 10Mbps )";
|
test_name = "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 )");
|
`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;
|
|
// 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;
|
Line 9543... |
Line 9637... |
//// ////
|
//// ////
|
//// Test transmit packets across MAXFL with HUGEN at ////
|
//// Test transmit packets across MAXFL with HUGEN at ////
|
//// 19 TX buffer decriptors ( 100Mbps ). ////
|
//// 19 TX buffer decriptors ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 17) // without and with padding
|
if (test_num == 17) //
|
begin
|
begin
|
// TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )
|
// TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )
|
test_name = "TEST 17: TRANSMIT PACKETS ACROSS MAXFL WITH HUGEN AT 19 TX BDs ( 100Mbps )";
|
test_name = "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 )");
|
`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;
|
|
// 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;
|
Line 9729... |
Line 9820... |
//// ////
|
//// ////
|
//// Test IPG during Back-to-Back transmit at ////
|
//// Test IPG during Back-to-Back transmit at ////
|
//// 88 TX buffer decriptors ( 10Mbps ). ////
|
//// 88 TX buffer decriptors ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 18) // without and with padding
|
if (test_num == 18) //
|
begin
|
begin
|
// TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )
|
// TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )
|
test_name = "TEST 18: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 10Mbps )";
|
test_name = "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 )");
|
`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;
|
|
// 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;
|
Line 9970... |
Line 10058... |
//// ////
|
//// ////
|
//// Test IPG during Back-to-Back transmit at ////
|
//// Test IPG during Back-to-Back transmit at ////
|
//// 88 TX buffer decriptors ( 100Mbps ). ////
|
//// 88 TX buffer decriptors ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 19) // without and with padding
|
if (test_num == 19) //
|
begin
|
begin
|
// TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )
|
// TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )
|
test_name = "TEST 19: IPG DURING BACK-TO-BACK TRANSMIT AT 88 TX BDs ( 100Mbps )";
|
test_name = "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 )");
|
`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;
|
|
// 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;
|
Line 10211... |
Line 10296... |
//// ////
|
//// ////
|
//// Test transmit packets after TX under-run on each packet's ////
|
//// Test transmit packets after TX under-run on each packet's ////
|
//// byte at 2 TX buffer decriptors ( 10Mbps ). ////
|
//// byte at 2 TX buffer decriptors ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 20) // without padding
|
if (test_num == 20) //
|
begin
|
begin
|
// TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )
|
// TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )
|
test_name = "TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )";
|
test_name = "TEST 20: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 10Mbps )";
|
`TIME;
|
`TIME;
|
$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 )");
|
Line 10316... |
Line 10401... |
else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
|
else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
|
begin
|
begin
|
disable wait_fr;
|
disable wait_fr;
|
if (frame_ended == 1)
|
if (frame_ended == 1)
|
begin
|
begin
|
$display("(%0t) no under-run on %0d. byte, since length of frame (without CRC) is only %0d bytes",
|
$display(" ->no under-run on %0d. byte, since length of frame (without CRC) is only %0d bytes",
|
$time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])), i_length);
|
({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])), i_length);
|
no_underrun = 1;
|
no_underrun = 1;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
wait (frame_ended == 1);
|
wait (frame_ended == 1);
|
$display("(%0t) under-run on %0d. byte",
|
$display(" ->under-run on %0d. byte",
|
$time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])));
|
({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])));
|
no_underrun = 0;
|
no_underrun = 0;
|
end
|
end
|
end
|
end
|
repeat (2) @(posedge wb_clk);
|
repeat (2) @(posedge wb_clk);
|
// set wb slave response: ACK (response), wbs_waits[2:0] (waits before response),
|
// set wb slave response: ACK (response), wbs_waits[2:0] (waits before response),
|
Line 10364... |
Line 10449... |
// WAIT FOR FIRST TRANSMIT
|
// WAIT FOR FIRST TRANSMIT
|
check_tx_bd(num_of_bd, data);
|
check_tx_bd(num_of_bd, data);
|
wait (MTxEn === 1'b1); // start first transmit
|
wait (MTxEn === 1'b1); // start first transmit
|
if (data[15] !== 1)
|
if (data[15] !== 1)
|
begin
|
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");
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
wait (MTxEn === 1'b0); // end first transmit
|
wait (MTxEn === 1'b0); // end first transmit
|
while (data[15] === 1)
|
while (data[15] === 1)
|
Line 10670... |
Line 10756... |
//// ////
|
//// ////
|
//// Test transmit packets after TX under-run on each packet's ////
|
//// Test transmit packets after TX under-run on each packet's ////
|
//// byte at 2 TX buffer decriptors ( 100Mbps ). ////
|
//// byte at 2 TX buffer decriptors ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 21) // without padding
|
if (test_num == 21) //
|
begin
|
begin
|
// TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )
|
// TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )
|
test_name = "TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )";
|
test_name = "TEST 21: TRANSMIT PACKETS AFTER TX UNDER-RUN ON EACH PACKET's BYTE AT 2 TX BDs ( 100Mbps )";
|
`TIME;
|
`TIME;
|
$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 )");
|
Line 10775... |
Line 10861... |
else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
|
else if ((wait_for_frame == 1) && (frame_started == 1)) // frame started
|
begin
|
begin
|
disable wait_fr1;
|
disable wait_fr1;
|
if (frame_ended == 1)
|
if (frame_ended == 1)
|
begin
|
begin
|
$display("(%0t) no under-run on %0d. byte, since length of frame (without CRC) is only %0d bytes",
|
$display(" ->no under-run on %0d. byte, since length of frame (without CRC) is only %0d bytes",
|
$time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])), i_length);
|
({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])), i_length);
|
no_underrun = 1;
|
no_underrun = 1;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
wait (frame_ended == 1);
|
wait (frame_ended == 1);
|
$display("(%0t) under-run on %0d. byte",
|
$display(" ->under-run on %0d. byte",
|
$time, ({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])));
|
({num_of_frames[31:2], 2'h0} + (4 - i_data[1:0])));
|
no_underrun = 0;
|
no_underrun = 0;
|
end
|
end
|
end
|
end
|
repeat (2) @(posedge wb_clk);
|
repeat (2) @(posedge wb_clk);
|
// set wb slave response: ACK (response), wbs_waits[2:0] (waits before response),
|
// set wb slave response: ACK (response), wbs_waits[2:0] (waits before response),
|
Line 10823... |
Line 10909... |
// WAIT FOR FIRST TRANSMIT
|
// WAIT FOR FIRST TRANSMIT
|
check_tx_bd(num_of_bd, data);
|
check_tx_bd(num_of_bd, data);
|
wait (MTxEn === 1'b1); // start first transmit
|
wait (MTxEn === 1'b1); // start first transmit
|
if (data[15] !== 1)
|
if (data[15] !== 1)
|
begin
|
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");
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
wait (MTxEn === 1'b0); // end first transmit
|
wait (MTxEn === 1'b0); // end first transmit
|
while (data[15] === 1)
|
while (data[15] === 1)
|
Line 11177... |
Line 11264... |
$display("MAC FULL DUPLEX RECEIVE TEST");
|
$display("MAC FULL DUPLEX RECEIVE 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;
|
|
//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 11261... |
Line 11345... |
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Test no receive when all buffers are TX ( 10Mbps ). ////
|
//// Test no receive when all buffers are TX ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 0) // Test no receive when all buffers are TX ( 10Mbps ).
|
if (test_num == 0) //
|
begin
|
begin
|
// 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 )");
|
|
|
Line 11351... |
Line 11435... |
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Test no receive when all buffers are TX ( 100Mbps ). ////
|
//// Test no receive when all buffers are TX ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 1) // Test no receive when all buffers are TX ( 100Mbps ).
|
if (test_num == 1) //
|
begin
|
begin
|
// 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 )");
|
|
|
Line 11442... |
Line 11526... |
//// ////
|
//// ////
|
//// Test receive packet synchronization with receive ////
|
//// Test receive packet synchronization with receive ////
|
//// disable/enable ( 10Mbps ). ////
|
//// disable/enable ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 2) // Test no receive when all buffers are TX ( 10Mbps ).
|
if (test_num == 2) //
|
begin
|
begin
|
// 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 )");
|
|
|
Line 11629... |
Line 11713... |
if (tmp_data[31])
|
if (tmp_data[31])
|
$display(" ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
|
$display(" ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
|
else
|
else
|
$display(" ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
|
$display(" ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
|
end
|
end
|
|
// check FB, etc.
|
|
if (tmp_bd[31:0] !== 32'h0000_E000)
|
|
begin
|
|
`TIME; $display("*E RX buffer descriptor status of NOT received packet is not correct: %0h", tmp_bd[31:0]);
|
|
test_fail("RX buffer descriptor status of NOT received packet is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
end
|
|
// else // (tmp_bd[15] === 0) - check FB, packet, etc.
|
|
end
|
|
else // (num_of_frames[0] == 1'b1)
|
|
begin
|
|
if (tmp_bd[15] === 1) // ERROR, because second packet of each two frames should be received
|
|
begin // check NOTHING
|
|
`TIME; $display("*E RX packet should be accepted, buffer descriptor is not correct: %0h", tmp_bd[31:0]);
|
|
test_fail("RX packet should be accepted, buffer descriptor is not correct");
|
|
fail = fail + 1;
|
end
|
end
|
|
// else // (tmp_bd[15] === 0) - check FB, packet, etc.
|
end
|
end
|
if (stop_checking_frame == 0)
|
if (stop_checking_frame == 0)
|
disable send_packet0;
|
disable send_packet1;
|
end
|
end
|
join
|
join
|
// ONLY IF packet was received!
|
// ONLY IF packet was received!
|
if (tmp_bd[15] === 0)
|
if (tmp_bd[15] === 0)
|
begin
|
begin
|
Line 11792... |
Line 11894... |
//// ////
|
//// ////
|
//// Test receive packet synchronization with receive ////
|
//// Test receive packet synchronization with receive ////
|
//// disable/enable ( 100Mbps ). ////
|
//// disable/enable ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 3) // Test no receive when all buffers are TX ( 100Mbps ).
|
if (test_num == 3) //
|
begin
|
begin
|
// 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 )");
|
|
|
Line 11880... |
Line 11982... |
// 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
|
endcase
|
endcase
|
//if (first_fr_received == 0)
|
|
//begin
|
|
// 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);
|
|
// $display("RX BD set : %h, %h", data, tmp);
|
|
//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;
|
Line 11914... |
Line 12009... |
wbm_subseq_waits = 4'h0;
|
wbm_subseq_waits = 4'h0;
|
#1 wait (wbm_working == 0);
|
#1 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); // write ASAP
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits); // write ASAP
|
$display("mama 2, num_of_frames=%0h", num_of_frames);
|
|
end
|
end
|
end
|
end
|
begin // send a packet from PHY RX
|
begin // send a packet from PHY RX
|
repeat(1) @(posedge wb_clk); // wait for WB write when it is without delays
|
repeat(1) @(posedge wb_clk); // wait for WB write when it is without delays
|
if (num_of_frames[1] == 1'b0)
|
if (num_of_frames[1] == 1'b0)
|
Line 11934... |
Line 12028... |
end
|
end
|
begin: send_packet1
|
begin: send_packet1
|
wait (MRxDV === 1'b1); // start transmit
|
wait (MRxDV === 1'b1); // start transmit
|
wait (MRxDV === 1'b0); // end transmit
|
wait (MRxDV === 1'b0); // end transmit
|
check_frame = 1;
|
check_frame = 1;
|
$display("mama 3");
|
|
repeat(10) @(posedge mrx_clk);
|
repeat(10) @(posedge mrx_clk);
|
repeat(15) @(posedge wb_clk);
|
repeat(15) @(posedge wb_clk);
|
stop_checking_frame = 1;
|
stop_checking_frame = 1;
|
end
|
end
|
begin // count WB clocks between ACK (negedge) and RX_DV (posedge) or vice-versa
|
begin // count WB clocks between ACK (negedge) and RX_DV (posedge) or vice-versa
|
@(posedge eth_sl_wb_ack_o or posedge MRxDV);
|
@(posedge eth_sl_wb_ack_o or posedge MRxDV);
|
$display("mama 4");
|
|
if ((eth_sl_wb_ack_o === 1'b1) && (MRxDV === 1'b1))
|
if ((eth_sl_wb_ack_o === 1'b1) && (MRxDV === 1'b1))
|
begin
|
begin
|
tmp_data = 32'h8000_0001; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
|
tmp_data = 32'h8000_0001; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
|
$display("mama 4_1");
|
|
end
|
end
|
else if (MRxDV === 1'b1)
|
else if (MRxDV === 1'b1)
|
begin
|
begin
|
while (eth_sl_wb_ack_o === 1'b0)
|
while (eth_sl_wb_ack_o === 1'b0)
|
begin
|
begin
|
@(posedge wb_clk);
|
@(posedge wb_clk);
|
tmp_data = tmp_data + 1;
|
tmp_data = tmp_data + 1;
|
end
|
end
|
tmp_data = tmp_data | 32'h8000_0000; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
|
tmp_data = tmp_data | 32'h8000_0000; // bit[31]==1 => 'posedge MRxDV' was before 'negedge eth_sl_wb_ack_o'
|
$display("mama 4_2");
|
|
end
|
end
|
else if (eth_sl_wb_ack_o === 1'b1)
|
else if (eth_sl_wb_ack_o === 1'b1)
|
begin
|
begin
|
@(posedge wb_clk); // wait for one clock => tmp_data 'becomes' 0
|
@(posedge wb_clk); // wait for one clock => tmp_data 'becomes' 0
|
while (MRxDV === 1'b0)
|
while (MRxDV === 1'b0)
|
begin
|
begin
|
@(posedge wb_clk);
|
@(posedge wb_clk);
|
tmp_data = tmp_data + 1; // bit[31]==0 => 'negedge eth_sl_wb_ack_o' was equal or before 'posedge MRxDV'
|
tmp_data = tmp_data + 1; // bit[31]==0 => 'negedge eth_sl_wb_ack_o' was equal or before 'posedge MRxDV'
|
end
|
end
|
$display("mama 4_3");
|
|
end
|
end
|
end
|
end
|
begin // check packet
|
begin // check packet
|
wait (check_frame == 1);
|
wait (check_frame == 1);
|
check_rx_bd(118, tmp_bd);
|
check_rx_bd(118, tmp_bd);
|
while ((tmp_bd[15] === 1) && (stop_checking_frame == 0))
|
while ((tmp_bd[15] === 1) && (stop_checking_frame == 0))
|
begin
|
begin
|
#1 check_rx_bd(118, tmp_bd);
|
#1 check_rx_bd(118, tmp_bd);
|
@(posedge wb_clk);
|
@(posedge wb_clk);
|
end
|
end
|
$display("mama 5, tmp_bd=%0h", tmp_bd);
|
|
if (num_of_frames[0] == 1'b0)
|
if (num_of_frames[0] == 1'b0)
|
begin
|
begin
|
if (tmp_bd[15] === 1)
|
if (tmp_bd[15] === 1)
|
begin
|
begin
|
if (first_fr_received == 1)
|
if (first_fr_received == 1)
|
Line 11994... |
Line 12082... |
$display(" ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
|
$display(" ->RX enable set %0d WB clks after RX_DV", tmp_data[30:0]);
|
else
|
else
|
$display(" ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
|
$display(" ->RX enable set %0d WB clks before RX_DV", tmp_data[30:0]);
|
end
|
end
|
// check FB, etc.
|
// check FB, etc.
|
|
if (tmp_bd[31:0] !== 32'h0000_E000)
|
|
begin
|
|
`TIME; $display("*E RX buffer descriptor status of NOT received packet is not correct: %0h", tmp_bd[31:0]);
|
|
test_fail("RX buffer descriptor status of NOT received packet is not correct");
|
|
fail = fail + 1;
|
end
|
end
|
else // (tmp_bd[15] === 0)
|
|
begin // check FB, packet, etc.
|
|
|
|
end
|
end
|
$display("mama 5_1");
|
// else // (tmp_bd[15] === 0) - check FB, packet, etc.
|
end
|
end
|
else // (num_of_frames[0] == 1'b1)
|
else // (num_of_frames[0] == 1'b1)
|
begin
|
begin
|
if (tmp_bd[15] === 1) // ERROR, because second packet of each two frames should be received
|
if (tmp_bd[15] === 1) // ERROR, because second packet of each two frames should be received
|
begin // check NOTHING
|
begin // check NOTHING
|
|
`TIME; $display("*E RX packet should be accepted, buffer descriptor is not correct: %0h", tmp_bd[31:0]);
|
end
|
test_fail("RX packet should be accepted, buffer descriptor is not correct");
|
else // (tmp_bd[15] === 0)
|
fail = fail + 1;
|
begin // check FB, packet, etc.
|
|
|
|
end
|
end
|
$display("mama 5_2");
|
// else // (tmp_bd[15] === 0) - check FB, packet, etc.
|
end
|
end
|
if (stop_checking_frame == 0)
|
if (stop_checking_frame == 0)
|
disable send_packet1;
|
disable send_packet1;
|
end
|
end
|
join
|
join
|
// ONLY IF packet was received!
|
// ONLY IF packet was received!
|
$display("mama 6");
|
|
if (tmp_bd[15] === 0)
|
if (tmp_bd[15] === 0)
|
begin
|
begin
|
// check length of a PACKET
|
// check length of a PACKET
|
if (tmp_bd[31:16] != (i_length + 4))
|
if (tmp_bd[31:16] != (i_length + 4))
|
begin
|
begin
|
Line 12192... |
Line 12278... |
wait (wbm_working == 0);
|
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);
|
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);
|
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'hAA02_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
st_data = 8'h1A;
|
st_data = 8'h1A;
|
set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
|
set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
|
// check WB INT signal
|
// check WB INT signal
|
if (wb_int !== 1'b0)
|
if (wb_int !== 1'b0)
|
begin
|
begin
|
Line 12483... |
Line 12569... |
//// ////
|
//// ////
|
//// Test receive packets form MINFL to MAXFL sizes at ////
|
//// Test receive packets form MINFL to MAXFL sizes at ////
|
//// one RX buffer decriptor ( 100Mbps ). ////
|
//// one RX buffer decriptor ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 5) // Test no receive when all buffers are TX ( 100Mbps ).
|
if (test_num == 5) //
|
begin
|
begin
|
// 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 )");
|
|
|
Line 12795... |
Line 12881... |
if (test_num == 6) //
|
if (test_num == 6) //
|
begin
|
begin
|
// TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )
|
// TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )
|
test_name = "TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )";
|
test_name = "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 )");
|
`TIME; $display(" TEST 6: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 10Mbps )");
|
|
|
// 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);
|
|
|
|
max_tmp = 0;
|
|
min_tmp = 0;
|
|
num_of_frames = 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);
|
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);
|
wait (wbm_working == 0);
|
Line 12825... |
Line 12898... |
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
|
st_data = 8'h35;
|
st_data = 8'h35;
|
set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
|
set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
|
|
num_of_frames = 0;
|
|
num_of_bd = 0;
|
// 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;
|
Line 12954... |
Line 13029... |
end
|
end
|
// set wrap bit
|
// set wrap bit
|
set_rx_bd_wrap(127);
|
set_rx_bd_wrap(127);
|
end
|
end
|
// after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
|
// after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
|
else if ((num_of_frames - 8) == 20) // 128
|
else if ((num_of_frames - 8) == 128)
|
begin
|
begin
|
tmp_len = tmp_len; // length of frame remaines from previous settings
|
tmp_len = tmp_len; // length of frame remaines from previous settings
|
tmp_bd_num = 0; // TX BD number
|
tmp_bd_num = 0; // TX BD number
|
while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
|
while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
|
begin
|
begin
|
Line 13248... |
Line 13323... |
if (test_num == 7) //
|
if (test_num == 7) //
|
begin
|
begin
|
// TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )
|
// TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )
|
test_name = "TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )";
|
test_name = "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 )");
|
`TIME; $display(" TEST 7: RECEIVE PACKETS FROM MINFL TO MAXFL SIZES AT MAX RX BDs ( 100Mbps )");
|
|
|
// 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);
|
|
|
|
max_tmp = 0;
|
|
min_tmp = 0;
|
|
num_of_frames = 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);
|
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);
|
wait (wbm_working == 0);
|
Line 13278... |
Line 13340... |
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
|
st_data = 8'h35;
|
st_data = 8'h35;
|
set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
|
set_rx_packet((max_tmp), (max_tmp - 4), 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
|
|
num_of_frames = 0;
|
|
num_of_bd = 0;
|
// 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;
|
Line 13407... |
Line 13471... |
end
|
end
|
// set wrap bit
|
// set wrap bit
|
set_rx_bd_wrap(127);
|
set_rx_bd_wrap(127);
|
end
|
end
|
// after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
|
// after 128 + first 8 number of frames, 19 frames form RX BD 0 to 18 will be received
|
else if ((num_of_frames - 8) == 20) // 128
|
else if ((num_of_frames - 8) == 128)
|
begin
|
begin
|
tmp_len = tmp_len; // length of frame remaines from previous settings
|
tmp_len = tmp_len; // length of frame remaines from previous settings
|
tmp_bd_num = 0; // TX BD number
|
tmp_bd_num = 0; // TX BD number
|
while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
|
while (tmp_bd_num < 19) // (tmp_len <= (max_tmp - 4)) - this is the last frame
|
begin
|
begin
|
Line 13697... |
Line 13761... |
//// 8 RX buffer decriptors ( 10Mbps ). ////
|
//// 8 RX buffer decriptors ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 8) //
|
if (test_num == 8) //
|
begin
|
begin
|
// TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )
|
// TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 RX BD ( 10Mbps )
|
test_name = "TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 10Mbps )";
|
test_name = "TEST 8: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 RX BD ( 10Mbps )";
|
`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 RX BD ( 10Mbps )");
|
|
|
// 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);
|
|
|
|
max_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);
|
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);
|
wait (wbm_working == 0);
|
Line 14074... |
Line 14127... |
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
end
|
else if (num_of_frames > 4) // MAC does not recognize Dest. ADDR. for lengths 5, 6 => no MISS
|
else if (num_of_frames > 4) // MAC does not recognize Dest. ADDR. for lengths 5, 6 => no MISS
|
begin
|
begin
|
if ( (data[15:0] !== 16'h6004) && // wrap bit
|
if ( (data[15:0] !== 16'h6084) && // wrap bit
|
(data[15:0] !== 16'h4004) ) // without wrap bit
|
(data[15:0] !== 16'h4084) ) // without wrap bit
|
begin
|
begin
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
|
`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");
|
test_fail("RX buffer descriptor status is not correct");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
end
|
else if (num_of_frames > 2) // MAC does not recognize Dest. ADDR. for length 3, 4 => no MISS, CRC ERROR
|
else if (num_of_frames > 2) // MAC does not recognize Dest. ADDR. for length 3, 4 => no MISS, CRC ERROR
|
begin
|
begin
|
if ( (data[15:0] !== 16'h6006) && // wrap bit
|
if ( (data[15:0] !== 16'h6086) && // wrap bit
|
(data[15:0] !== 16'h4006) ) // without wrap bit
|
(data[15:0] !== 16'h4086) ) // without wrap bit
|
begin
|
begin
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
|
`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");
|
test_fail("RX buffer descriptor status is not correct");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
Line 14240... |
Line 14293... |
//// 8 RX buffer decriptors ( 100Mbps ). ////
|
//// 8 RX buffer decriptors ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 9) //
|
if (test_num == 9) //
|
begin
|
begin
|
// TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )
|
// TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 RX BD ( 100Mbps )
|
test_name = "TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 TX BD ( 100Mbps )";
|
test_name = "TEST 9: RECEIVE PACKETS FROM 0 TO (MINFL + 12) SIZES AT 8 RX BD ( 100Mbps )";
|
`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 RX BD ( 100Mbps )");
|
|
|
// 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);
|
|
|
|
max_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);
|
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);
|
wait (wbm_working == 0);
|
Line 14616... |
Line 14658... |
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
end
|
else if (num_of_frames > 4) // MAC does not recognize Dest. ADDR. for lengths 5, 6 => no MISS
|
else if (num_of_frames > 4) // MAC does not recognize Dest. ADDR. for lengths 5, 6 => no MISS
|
begin
|
begin
|
if ( (data[15:0] !== 16'h6004) && // wrap bit
|
if ( (data[15:0] !== 16'h6084) && // wrap bit
|
(data[15:0] !== 16'h4004) ) // without wrap bit
|
(data[15:0] !== 16'h4084) ) // without wrap bit
|
begin
|
begin
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
|
`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");
|
test_fail("RX buffer descriptor status is not correct");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
end
|
else if (num_of_frames > 2) // MAC does not recognize Dest. ADDR. for length 3, 4 => no MISS, CRC ERROR
|
else if (num_of_frames > 2) // MAC does not recognize Dest. ADDR. for length 3, 4 => no MISS, CRC ERROR
|
begin
|
begin
|
if ( (data[15:0] !== 16'h6006) && // wrap bit
|
if ( (data[15:0] !== 16'h6086) && // wrap bit
|
(data[15:0] !== 16'h4006) ) // without wrap bit
|
(data[15:0] !== 16'h4086) ) // without wrap bit
|
begin
|
begin
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
|
`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");
|
test_fail("RX buffer descriptor status is not correct");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
Line 14776... |
Line 14818... |
end
|
end
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Test receive packet synchronization with receive ////
|
//// Test receive packets at one RX BD and ////
|
//// disable/enable ( 10Mbps ). ////
|
//// check addresses ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 10) // Test no receive when all buffers are TX ( 10Mbps ).
|
if (test_num == 10) //
|
begin
|
begin
|
// TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
|
// TEST 10: RECEIVE PACKETS AT ONE RX BD AND CHECK ADDRESSES ( 10Mbps )
|
test_name = "TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
|
test_name = "TEST 10: RECEIVE PACKETS AT ONE RX BD AND CHECK ADDRESSES ( 10Mbps )";
|
`TIME; $display(" TEST 10: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
|
`TIME; $display(" TEST 10: RECEIVE PACKETS AT ONE RX BD AND CHECK ADDRESSES ( 10Mbps )");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 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);
|
|
// 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);
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b0)
|
|
begin
|
|
test_fail("WB INT signal should not be set");
|
|
fail = fail + 1;
|
end
|
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;
|
|
|
////////////////////////////////////////////////////////////////////
|
num_of_frames = 0;
|
//// ////
|
i_length = 64;
|
//// Test receive packet synchronization with receive ////
|
while (num_of_frames < 8)
|
//// disable/enable ( 10Mbps ). ////
|
|
//// ////
|
|
////////////////////////////////////////////////////////////////////
|
|
if (test_num == 12) // Test no receive when all buffers are TX ( 10Mbps ).
|
|
begin
|
begin
|
// TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
|
// not detect carrier sense in FD and no collision
|
test_name = "TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
|
eth_phy.no_carrier_sense_rx_fd_detect(0);
|
`TIME; $display(" TEST 12: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
|
eth_phy.collision(0);
|
|
case (num_of_frames)
|
|
0: // unicast + PRO
|
|
begin
|
|
// enable interrupt generation
|
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h0F;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" Unicast packet is going to be received with PRO bit (wrap at 1st BD)");
|
end
|
end
|
|
1: // unicast
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//// ////
|
|
//// Test receive packet synchronization with receive ////
|
|
//// disable/enable ( 10Mbps ). ////
|
|
//// ////
|
|
////////////////////////////////////////////////////////////////////
|
|
if (test_num == 14) // Test no receive when all buffers are TX ( 10Mbps ).
|
|
begin
|
begin
|
// TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
|
// enable interrupt generation
|
test_name = "TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
`TIME; $display(" TEST 14: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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_BRO,
|
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h12;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" Unicast packet is going to be received without PRO bit (wrap at 1st BD)");
|
end
|
end
|
|
2: // wrong unicast + PRO
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//// ////
|
|
//// Test receive packet synchronization with receive ////
|
|
//// disable/enable ( 10Mbps ). ////
|
|
//// ////
|
|
////////////////////////////////////////////////////////////////////
|
|
if (test_num == 16) // Test no receive when all buffers are TX ( 10Mbps ).
|
|
begin
|
begin
|
// TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )
|
// enable interrupt generation
|
test_name = "TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )";
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
`TIME; $display(" TEST 16: RECEIVE PACKET SYNCHRONIZATION WITH RECEIVE DISABLE/ENABLE ( 10Mbps )");
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h31;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0507, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" non Unicast packet is going to be received with PRO bit (wrap at 1st BD)");
|
end
|
end
|
|
3: // wrong unicast
|
|
begin
|
|
// enable interrupt generation
|
end // for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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_BRO,
|
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h0F;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0507, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" non Unicast packet is NOT going to be received without PRO bit (wrap at 1st BD)");
|
end
|
end
|
endtask // test_mac_full_duplex_receive
|
4: // broadcast + PRO + ~BRO
|
|
|
|
|
task test_mac_full_duplex_flow_control;
|
|
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_rx_frames;
|
|
integer num_of_bd;
|
|
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;
|
|
integer rx_len;
|
|
integer tx_len;
|
|
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 wait_for_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;
|
|
reg PassAll;
|
|
reg RxFlow;
|
|
reg enable_irq_in_rxbd;
|
|
reg [15:0] pause_value;
|
|
|
|
begin
|
begin
|
// MAC FULL DUPLEX FLOW CONTROL TEST
|
// enable interrupt generation
|
test_heading("MAC FULL DUPLEX FLOW CONTROL TEST");
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
$display(" ");
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
$display("MAC FULL DUPLEX FLOW CONTROL TEST");
|
wait (wbm_working == 0);
|
fail = 0;
|
wbm_write(`ETH_MODER, 32'h0,
|
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// reset MAC registers
|
// enable RX, set full-duplex mode, NO receive small, NO correct IFG
|
hard_reset;
|
wait (wbm_working == 0);
|
// reset MAC and MII LOGIC with soft reset
|
wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
|
//reset_mac;
|
`ETH_MODER_PRO,
|
//reset_mii;
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// set wb slave response
|
// set Destination address - Byte 0 sent first
|
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
/*
|
wait (wbm_working == 0);
|
TASKS for set and control TX buffer descriptors (also send packet - set_tx_bd_ready):
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
-------------------------------------------------------------------------------------
|
// prepare packet
|
set_tx_bd
|
st_data = 8'h84;
|
(tx_bd_num_start[6:0], tx_bd_num_end[6:0], len[15:0], irq, pad, crc, txpnt[31:0]);
|
set_rx_packet(0, i_length, 1'b0, 48'hFFFF_FFFF_FFFF, 48'h0708_090A_0B0C, 16'hA56A, st_data); // length without CRC
|
set_tx_bd_wrap
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
(tx_bd_num_end[6:0]);
|
$display(" Broadcast packet is going to be received with PRO & without Reject_BRO bit (wrap at 1st BD)");
|
set_tx_bd_ready
|
end
|
(tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
|
5: // broadcast + ~BRO
|
check_tx_bd
|
begin
|
(tx_bd_num_start[6:0], tx_bd_status[31:0]);
|
// enable interrupt generation
|
clear_tx_bd
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
(tx_bd_num_start[6:0], tx_bd_num_end[6:0]);
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
TASKS for set and control RX buffer descriptors:
|
wbm_write(`ETH_MODER, 32'h0,
|
------------------------------------------------
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
set_rx_bd
|
// enable RX, set full-duplex mode, NO receive small, NO correct IFG
|
(rx_bd_num_strat[6:0], rx_bd_num_end[6:0], irq, rxpnt[31:0]);
|
wait (wbm_working == 0);
|
set_rx_bd_wrap
|
wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG,
|
(rx_bd_num_end[6:0]);
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
set_rx_bd_empty
|
// set Destination address - Byte 0 sent first
|
(rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
|
wait (wbm_working == 0);
|
check_rx_bd
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
(rx_bd_num_end[6:0], rx_bd_status);
|
wait (wbm_working == 0);
|
clear_rx_bd
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
(rx_bd_num_strat[6:0], rx_bd_num_end[6:0]);
|
// prepare packet
|
|
st_data = 8'h48;
|
TASKS for set and check TX packets:
|
set_rx_packet(0, i_length, 1'b0, 48'hFFFF_FFFF_FFFF, 48'h0708_090A_0B0C, 16'hA56A, st_data); // length without CRC
|
-----------------------------------
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
set_tx_packet
|
$display(" Broadcast packet is going to be received without Reject_BRO bit (wrap at 1st BD)");
|
(txpnt[31:0], len[15:0], eth_start_data[7:0]);
|
end
|
check_tx_packet
|
6: // broadcast + PRO + BRO
|
(txpnt_wb[31:0], txpnt_phy[31:0], len[15:0], failure[31:0]);
|
begin
|
|
// enable interrupt generation
|
TASKS for set and check RX packets:
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
-----------------------------------
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
set_rx_packet
|
wait (wbm_working == 0);
|
(rxpnt[31:0], len[15:0], plus_nibble, d_addr[47:0], s_addr[47:0], type_len[15:0], start_data[7:0]);
|
wbm_write(`ETH_MODER, 32'h0,
|
check_rx_packet
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
(rxpnt_phy[31:0], rxpnt_wb[31:0], len[15:0], plus_nibble, successful_nibble, failure[31:0]);
|
// enable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
TASKS for append and check CRC to/of TX packet:
|
wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
|
-----------------------------------------------
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
append_tx_crc
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
(txpnt_wb[31:0], len[15:0], negated_crc);
|
// set Destination address - Byte 0 sent first
|
check_tx_crc
|
wait (wbm_working == 0);
|
(txpnt_phy[31:0], len[15:0], negated_crc, failure[31:0]);
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h30;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hFFFF_FFFF_FFFF, 48'h0708_090A_0B0C, 16'hA56A, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" Broadcast packet is going to be received with PRO & with Reject_BRO bit (wrap at 1st BD)");
|
|
end
|
|
7: // broadcast + BRO
|
|
begin
|
|
// enable interrupt generation
|
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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_BRO,
|
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h04;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hFFFF_FFFF_FFFF, 48'h0708_090A_0B0C, 16'hA56A, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" Broadcast packet is NOT going to be received with Reject_BRO bit (wrap at 1st BD)");
|
|
end
|
|
default:
|
|
begin
|
|
end
|
|
endcase
|
|
// set wrap bit
|
|
set_rx_bd_wrap(127);
|
|
set_rx_bd_empty(127, 127);
|
|
fork
|
|
begin
|
|
#1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
|
|
repeat(10) @(posedge mrx_clk);
|
|
end
|
|
begin: wait_for_rec0
|
|
wait (MRxDV === 1'b1); // start transmit
|
|
#1 check_rx_bd(127, data);
|
|
if (data[15] !== 1)
|
|
begin
|
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
|
fail = fail + 1;
|
|
end
|
|
wait (MRxDV === 1'b0); // end transmit
|
|
while (data[15] === 1)
|
|
begin
|
|
#1 check_rx_bd(127, data);
|
|
@(posedge wb_clk);
|
|
end
|
|
disable check_wait_for_rec0;
|
|
$display(" ->packet received");
|
|
repeat (1) @(posedge wb_clk);
|
|
end
|
|
begin: check_wait_for_rec0
|
|
wait (MRxDV === 1'b1); // start transmit
|
|
wait (MRxDV === 1'b0); // end transmit
|
|
repeat(10) @(posedge mrx_clk);
|
|
repeat(50) @(posedge wb_clk);
|
|
wait (wbm_working == 0);
|
|
disable wait_for_rec0;
|
|
$display(" ->packet NOT received");
|
|
end
|
|
join
|
|
// PACKET checking
|
|
wait (wbm_working == 0);
|
|
check_rx_bd(127, data);
|
|
case (num_of_frames)
|
|
0, 1, 4, 5:
|
|
begin
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
|
end
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'h6000)
|
|
begin
|
|
`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
|
|
// check length of a PACKET
|
|
if (data[31:16] != (i_length + 4))
|
|
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
|
|
check_rx_packet(0, `MEMORY_BASE, (i_length + 4), 1'b0, 1'b0, tmp);
|
|
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
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
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;
|
|
end
|
|
end
|
|
2, 6:
|
|
begin
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
|
end
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'h6080)
|
|
begin
|
|
`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
|
|
// check length of a PACKET
|
|
if (data[31:16] != (i_length + 4))
|
|
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
|
|
check_rx_packet(0, `MEMORY_BASE, (i_length + 4), 1'b0, 1'b0, tmp);
|
|
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
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
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;
|
|
end
|
|
end
|
|
3, 7:
|
|
begin
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b0)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should not be set");
|
|
test_fail("WB INT signal should not be set");
|
|
fail = fail + 1;
|
|
end
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'hE000)
|
|
begin
|
|
`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
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if (data !== 0)
|
|
begin
|
|
`TIME; $display("*E Any of interrupts 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;
|
|
end
|
|
end
|
|
default:
|
|
begin
|
|
end
|
|
endcase
|
|
// clear RX buffer descriptor
|
|
clear_rx_bd(127, 127);
|
|
// 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
|
|
num_of_frames = num_of_frames + 1;
|
|
end
|
|
// disable RX
|
|
wait (wbm_working == 0);
|
|
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
|
|
|
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_full_duplex_flow_control: ////
|
|
//// ////
|
//// ////
|
//// 0: Test ////
|
//// Test receive packets at one RX BD and ////
|
|
//// check addresses ( 100Mbps ). ////
|
//// ////
|
//// ////
|
//////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
|
if (test_num == 11) //
|
|
begin
|
|
// TEST 11: RECEIVE PACKETS AT ONE RX BD AND CHECK ADDRESSES ( 100Mbps )
|
|
test_name = "TEST 11: RECEIVE PACKETS AT ONE RX BD AND CHECK ADDRESSES ( 100Mbps )";
|
|
`TIME; $display(" TEST 11: RECEIVE PACKETS AT ONE RX BD AND CHECK ADDRESSES ( 100Mbps )");
|
|
|
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
|
// 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);
|
|
// 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);
|
|
// 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;
|
|
|
|
num_of_frames = 0;
|
|
i_length = 64;
|
|
while (num_of_frames < 8)
|
|
begin
|
|
// not detect carrier sense in FD and no collision
|
|
eth_phy.no_carrier_sense_rx_fd_detect(0);
|
|
eth_phy.collision(0);
|
|
case (num_of_frames)
|
|
0: // unicast + PRO
|
|
begin
|
|
// enable interrupt generation
|
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h0F;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" Unicast packet is going to be received with PRO bit (wrap at 1st BD)");
|
|
end
|
|
1: // unicast
|
|
begin
|
|
// enable interrupt generation
|
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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_BRO,
|
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h12;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" Unicast packet is going to be received without PRO bit (wrap at 1st BD)");
|
|
end
|
|
2: // wrong unicast + PRO
|
|
begin
|
|
// enable interrupt generation
|
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h31;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0507, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" non Unicast packet is going to be received with PRO bit (wrap at 1st BD)");
|
|
end
|
|
3: // wrong unicast
|
|
begin
|
|
// enable interrupt generation
|
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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_BRO,
|
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h0F;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0507, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" non Unicast packet is NOT going to be received without PRO bit (wrap at 1st BD)");
|
|
end
|
|
4: // broadcast + PRO + ~BRO
|
|
begin
|
|
// enable interrupt generation
|
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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,
|
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h84;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hFFFF_FFFF_FFFF, 48'h0708_090A_0B0C, 16'hA56A, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" Broadcast packet is going to be received with PRO & without Reject_BRO bit (wrap at 1st BD)");
|
|
end
|
|
5: // broadcast + ~BRO
|
|
begin
|
|
// enable interrupt generation
|
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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,
|
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h48;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hFFFF_FFFF_FFFF, 48'h0708_090A_0B0C, 16'hA56A, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" Broadcast packet is going to be received without Reject_BRO bit (wrap at 1st BD)");
|
|
end
|
|
6: // broadcast + PRO + BRO
|
|
begin
|
|
// enable interrupt generation
|
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h30;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hFFFF_FFFF_FFFF, 48'h0708_090A_0B0C, 16'hA56A, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" Broadcast packet is going to be received with PRO & with Reject_BRO bit (wrap at 1st BD)");
|
|
end
|
|
7: // broadcast + BRO
|
|
begin
|
|
// enable interrupt generation
|
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
|
// disable RX, set full-duplex mode, NO receive small, NO correct IFG
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MODER, 32'h0,
|
|
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_BRO,
|
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
// prepare packet
|
|
st_data = 8'h04;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hFFFF_FFFF_FFFF, 48'h0708_090A_0B0C, 16'hA56A, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
$display(" Broadcast packet is NOT going to be received with Reject_BRO bit (wrap at 1st BD)");
|
|
end
|
|
default:
|
|
begin
|
|
end
|
|
endcase
|
|
// set wrap bit
|
|
set_rx_bd_wrap(127);
|
|
set_rx_bd_empty(127, 127);
|
|
fork
|
|
begin
|
|
#1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
|
|
repeat(10) @(posedge mrx_clk);
|
|
end
|
|
begin: wait_for_rec1
|
|
wait (MRxDV === 1'b1); // start transmit
|
|
#1 check_rx_bd(127, data);
|
|
if (data[15] !== 1)
|
|
begin
|
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
|
fail = fail + 1;
|
|
end
|
|
wait (MRxDV === 1'b0); // end transmit
|
|
while (data[15] === 1)
|
|
begin
|
|
#1 check_rx_bd(127, data);
|
|
@(posedge wb_clk);
|
|
end
|
|
disable check_wait_for_rec1;
|
|
$display(" ->packet received");
|
|
repeat (1) @(posedge wb_clk);
|
|
end
|
|
begin: check_wait_for_rec1
|
|
wait (MRxDV === 1'b1); // start transmit
|
|
wait (MRxDV === 1'b0); // end transmit
|
|
repeat(10) @(posedge mrx_clk);
|
|
repeat(50) @(posedge wb_clk);
|
|
wait (wbm_working == 0);
|
|
disable wait_for_rec1;
|
|
$display(" ->packet NOT received");
|
|
end
|
|
join
|
|
// PACKET checking
|
|
wait (wbm_working == 0);
|
|
check_rx_bd(127, data);
|
|
case (num_of_frames)
|
|
0, 1, 4, 5:
|
|
begin
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
|
end
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'h6000)
|
|
begin
|
|
`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
|
|
// check length of a PACKET
|
|
if (data[31:16] != (i_length + 4))
|
|
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
|
|
check_rx_packet(0, `MEMORY_BASE, (i_length + 4), 1'b0, 1'b0, tmp);
|
|
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
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
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;
|
|
end
|
|
end
|
|
2, 6:
|
|
begin
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
|
end
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'h6080)
|
|
begin
|
|
`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
|
|
// check length of a PACKET
|
|
if (data[31:16] != (i_length + 4))
|
|
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
|
|
check_rx_packet(0, `MEMORY_BASE, (i_length + 4), 1'b0, 1'b0, tmp);
|
|
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
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
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;
|
|
end
|
|
end
|
|
3, 7:
|
|
begin
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b0)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should not be set");
|
|
test_fail("WB INT signal should not be set");
|
|
fail = fail + 1;
|
|
end
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'hE000)
|
|
begin
|
|
`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
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if (data !== 0)
|
|
begin
|
|
`TIME; $display("*E Any of interrupts 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;
|
|
end
|
|
end
|
|
default:
|
|
begin
|
|
end
|
|
endcase
|
|
// clear RX buffer descriptor
|
|
clear_rx_bd(127, 127);
|
|
// 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
|
|
num_of_frames = num_of_frames + 1;
|
|
end
|
|
// disable RX
|
|
wait (wbm_working == 0);
|
|
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
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//// ////
|
|
//// Test receive packets at 8 RX BD with ////
|
|
//// RX FIFO and RX BD overrun ( 10Mbps ). ////
|
|
//// ////
|
|
////////////////////////////////////////////////////////////////////
|
|
if (test_num == 12) //
|
|
begin
|
|
// TEST 12: RECEIVE PACKETS AT 8 RX BD WITH RX FIFO AND RX BD OVERRUN ( 10Mbps )
|
|
test_name = "TEST 12: RECEIVE PACKETS AT 8 RX BD WITH RX FIFO AND RX BD OVERRUN ( 10Mbps )";
|
|
`TIME; $display(" TEST 12: RECEIVE PACKETS AT 8 RX BD WITH RX FIFO AND RX BD OVERRUN ( 10Mbps )");
|
|
// 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);
|
|
// 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 |
|
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
|
|
// 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;
|
|
|
|
// enable interrupt generation
|
|
set_rx_bd(120, 127, 1'b1, `MEMORY_BASE);
|
|
// set wrap bit
|
|
set_rx_bd_wrap(127);
|
|
// SET empty bit
|
|
set_rx_bd_empty(120, 127);
|
|
|
|
//check_rx_bd(120, data);
|
|
//$display("RX BD 120 = %h", data);
|
|
//check_rx_bd(121, data);
|
|
//$display("RX BD 121 = %h", data);
|
|
//check_rx_bd(122, data);
|
|
//$display("RX BD 122 = %h", data);
|
|
//check_rx_bd(123, data);
|
|
//$display("RX BD 123 = %h", data);
|
|
//check_rx_bd(124, data);
|
|
//$display("RX BD 124 = %h", data);
|
|
//check_rx_bd(125, data);
|
|
//$display("RX BD 125 = %h", data);
|
|
//check_rx_bd(126, data);
|
|
//$display("RX BD 126 = %h", data);
|
|
//check_rx_bd(127, data);
|
|
//$display("RX BD 127 = %h", data);
|
|
|
|
num_of_frames = 0;
|
|
while (num_of_frames < 11)
|
|
begin
|
|
// not detect carrier sense in FD and no collision
|
|
eth_phy.no_carrier_sense_rx_fd_detect(0);
|
|
eth_phy.collision(0);
|
|
if (num_of_frames < 2)
|
|
num_of_bd = 120 + num_of_frames;
|
|
else if (num_of_frames < 9)
|
|
num_of_bd = 120 + num_of_frames - 1;
|
|
else
|
|
num_of_bd = 120;
|
|
case (num_of_frames)
|
|
0:
|
|
begin
|
|
// prepare packet
|
|
i_length = 60;
|
|
st_data = 8'h0F;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
end
|
|
3:
|
|
begin
|
|
// prepare packet
|
|
i_length = 68;
|
|
st_data = 8'h01;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
end
|
|
6:
|
|
begin
|
|
// prepare packet
|
|
i_length = 80;
|
|
st_data = 8'hA1;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
end
|
|
10:
|
|
begin
|
|
// SET empty bit
|
|
set_rx_bd_empty(120, 127);
|
|
end
|
|
default:
|
|
begin
|
|
end
|
|
endcase
|
|
// DISPLAYS
|
|
case (num_of_frames)
|
|
0, 3, 5, 7, 8, 10: // correct packet received
|
|
begin
|
|
$display(" packet shoud be successfuly received");
|
|
end
|
|
1: // correct packet stayed in RX FIFO
|
|
begin
|
|
$display(" packet (64Bytes) should be retained in RX FIFO and written to MEM after next RX FIFO overrun");
|
|
end
|
|
2, 4, 6: // RX FIFO overrun
|
|
begin
|
|
$display(" packet should NOT be received - RX FIFO overrun");
|
|
end
|
|
9: // RX BD overrun
|
|
begin
|
|
$display(" packet should NOT be received - RX FIFO overrun due to lack of RX BDs");
|
|
end
|
|
default:
|
|
begin
|
|
end
|
|
endcase
|
|
|
|
fork
|
|
begin
|
|
#1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
|
|
repeat(10) @(posedge mrx_clk);
|
|
end
|
|
begin: set_no_resp2
|
|
if ((num_of_frames == 1) || (num_of_frames == 4)) // RX FIFO overrun!
|
|
#1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
|
|
if (num_of_frames == 6) // RX FIFO overrun!
|
|
begin
|
|
wait (MRxDV === 1'b1); // start transmit
|
|
wait (eth_ma_wb_ack_i === 1'b1) // WB transfer
|
|
wait (eth_ma_wb_ack_i === 1'b0) // WB transfer
|
|
#1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
|
|
end
|
|
end
|
|
begin: wait_for_rec2
|
|
wait (MRxDV === 1'b1); // start transmit
|
|
#1 check_rx_bd(num_of_bd, data);
|
|
//$display("Num of RX BD = %d, RX BD %0d = %h", num_of_bd, num_of_bd, data);
|
|
if (((data[15] !== 1) && (num_of_frames != 9)) || // RX BD must be Empty
|
|
((data[15] !== 0) && (num_of_frames == 9))) // RX BD must NOT be Empty - RX BD overrun!!!
|
|
begin
|
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
|
fail = fail + 1;
|
|
end
|
|
wait (MRxDV === 1'b0); // end transmit
|
|
while (((data[15] === 1) && (num_of_frames != 9)) ||
|
|
((data[15] === 0) && (num_of_frames == 9)))
|
|
begin
|
|
#1 check_rx_bd(num_of_bd, data);
|
|
@(posedge wb_clk);
|
|
end
|
|
disable check_wait_for_rec2;
|
|
disable set_no_resp2;
|
|
$display(" ->packet received");
|
|
repeat (1) @(posedge wb_clk);
|
|
end
|
|
begin: check_wait_for_rec2
|
|
wait (MRxDV === 1'b1); // start transmit
|
|
wait (MRxDV === 1'b0); // end transmit
|
|
repeat(10) @(posedge mrx_clk);
|
|
repeat(50) @(posedge wb_clk);
|
|
wait (wbm_working == 0);
|
|
disable wait_for_rec2;
|
|
disable set_no_resp2;
|
|
$display(" ->packet NOT received");
|
|
end
|
|
join
|
|
// PACKET checking
|
|
case (num_of_frames)
|
|
0, 3, 5, 7, 8, 10: // correct packet received
|
|
begin
|
|
|
|
//check_rx_bd(120, data);
|
|
//$display("RX BD 120 = %h", data);
|
|
//check_rx_bd(121, data);
|
|
//$display("RX BD 121 = %h", data);
|
|
//check_rx_bd(122, data);
|
|
//$display("RX BD 122 = %h", data);
|
|
//check_rx_bd(123, data);
|
|
//$display("RX BD 123 = %h", data);
|
|
//check_rx_bd(124, data);
|
|
//$display("RX BD 124 = %h", data);
|
|
//check_rx_bd(125, data);
|
|
//$display("RX BD 125 = %h", data);
|
|
//check_rx_bd(126, data);
|
|
//$display("RX BD 126 = %h", data);
|
|
//check_rx_bd(127, data);
|
|
//$display("RX BD 127 = %h", data);
|
|
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
if (((data[15:0] !== 16'h4000) && (num_of_bd != 127)) || // without wrap bit
|
|
((data[15:0] !== 16'h6000) && (num_of_bd == 127)))
|
|
begin
|
|
`TIME;
|
|
if (num_of_bd != 127)
|
|
$display("*E RX buffer descriptor status is not correct: %0h instead of 4000", data[15:0]);
|
|
else
|
|
$display("*E RX buffer descriptor status is not correct: %0h instead of 6000", data[15:0]);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check length of a PACKET
|
|
if (data[31:16] != (i_length + 4))
|
|
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
|
|
check_rx_packet(0, `MEMORY_BASE, (i_length + 4), 1'b0, 1'b0, tmp);
|
|
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
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
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;
|
|
end
|
|
end
|
|
1: // correct packet stayed in RX FIFO
|
|
begin
|
|
|
|
//check_rx_bd(120, data);
|
|
//$display("RX BD 120 = %h", data);
|
|
//check_rx_bd(121, data);
|
|
//$display("RX BD 121 = %h", data);
|
|
//check_rx_bd(122, data);
|
|
//$display("RX BD 122 = %h", data);
|
|
//check_rx_bd(123, data);
|
|
//$display("RX BD 123 = %h", data);
|
|
//check_rx_bd(124, data);
|
|
//$display("RX BD 124 = %h", data);
|
|
//check_rx_bd(125, data);
|
|
//$display("RX BD 125 = %h", data);
|
|
//check_rx_bd(126, data);
|
|
//$display("RX BD 126 = %h", data);
|
|
//check_rx_bd(127, data);
|
|
//$display("RX BD 127 = %h", data);
|
|
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b0)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should not be set");
|
|
test_fail("WB INT signal should not be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'hC000)
|
|
begin
|
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h instead of C000", data[15:0]);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if (data !== 0)
|
|
begin
|
|
`TIME; $display("*E Any of interrupts 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;
|
|
end
|
|
end
|
|
2: // RX FIFO overrun & previous packet written
|
|
begin
|
|
|
|
//check_rx_bd(120, data);
|
|
//$display("RX BD 120 = %h", data);
|
|
//check_rx_bd(121, data);
|
|
//$display("RX BD 121 = %h", data);
|
|
//check_rx_bd(122, data);
|
|
//$display("RX BD 122 = %h", data);
|
|
//check_rx_bd(123, data);
|
|
//$display("RX BD 123 = %h", data);
|
|
//check_rx_bd(124, data);
|
|
//$display("RX BD 124 = %h", data);
|
|
//check_rx_bd(125, data);
|
|
//$display("RX BD 125 = %h", data);
|
|
//check_rx_bd(126, data);
|
|
//$display("RX BD 126 = %h", data);
|
|
//check_rx_bd(127, data);
|
|
//$display("RX BD 127 = %h", data);
|
|
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b0)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should not be set");
|
|
test_fail("WB INT signal should not be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'hC000)
|
|
begin
|
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h instead of C000", data[15:0]);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if (data !== 0)
|
|
begin
|
|
`TIME; $display("*E Any of interrupts 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;
|
|
end
|
|
|
|
// Release packet
|
|
#1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
|
|
repeat(128) @(posedge wb_clk);
|
|
$display(" ->previous packet written into MEM");
|
|
|
|
//check_rx_bd(120, data);
|
|
//$display("RX BD 120 = %h", data);
|
|
//check_rx_bd(121, data);
|
|
//$display("RX BD 121 = %h", data);
|
|
//check_rx_bd(122, data);
|
|
//$display("RX BD 122 = %h", data);
|
|
//check_rx_bd(123, data);
|
|
//$display("RX BD 123 = %h", data);
|
|
//check_rx_bd(124, data);
|
|
//$display("RX BD 124 = %h", data);
|
|
//check_rx_bd(125, data);
|
|
//$display("RX BD 125 = %h", data);
|
|
//check_rx_bd(126, data);
|
|
//$display("RX BD 126 = %h", data);
|
|
//check_rx_bd(127, data);
|
|
//$display("RX BD 127 = %h", data);
|
|
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'h4000)
|
|
begin
|
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h instead of 4000", data[15:0]);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
|
|
begin
|
|
`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;
|
|
end
|
|
if ((data & (~`ETH_INT_RXB)) !== 0)
|
|
begin
|
|
`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
|
|
4, 6: // RX FIFO overrun
|
|
begin
|
|
|
|
//check_rx_bd(120, data);
|
|
//$display("RX BD 120 = %h", data);
|
|
//check_rx_bd(121, data);
|
|
//$display("RX BD 121 = %h", data);
|
|
//check_rx_bd(122, data);
|
|
//$display("RX BD 122 = %h", data);
|
|
//check_rx_bd(123, data);
|
|
//$display("RX BD 123 = %h", data);
|
|
//check_rx_bd(124, data);
|
|
//$display("RX BD 124 = %h", data);
|
|
//check_rx_bd(125, data);
|
|
//$display("RX BD 125 = %h", data);
|
|
//check_rx_bd(126, data);
|
|
//$display("RX BD 126 = %h", data);
|
|
//check_rx_bd(127, data);
|
|
//$display("RX BD 127 = %h", data);
|
|
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b0)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should not be set");
|
|
test_fail("WB INT signal should not be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'hC000)
|
|
begin
|
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h instead of C000", data[15:0]);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if (data !== 0)
|
|
begin
|
|
`TIME; $display("*E Any of interrupts 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;
|
|
end
|
|
|
|
// Release packet
|
|
#1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
|
|
repeat(128) @(posedge wb_clk);
|
|
|
|
//check_rx_bd(120, data);
|
|
//$display("RX BD 120 = %h", data);
|
|
//check_rx_bd(121, data);
|
|
//$display("RX BD 121 = %h", data);
|
|
//check_rx_bd(122, data);
|
|
//$display("RX BD 122 = %h", data);
|
|
//check_rx_bd(123, data);
|
|
//$display("RX BD 123 = %h", data);
|
|
//check_rx_bd(124, data);
|
|
//$display("RX BD 124 = %h", data);
|
|
//check_rx_bd(125, data);
|
|
//$display("RX BD 125 = %h", data);
|
|
//check_rx_bd(126, data);
|
|
//$display("RX BD 126 = %h", data);
|
|
//check_rx_bd(127, data);
|
|
//$display("RX BD 127 = %h", data);
|
|
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'h4040)
|
|
begin
|
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h instead of 4040", data[15:0]);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
|
|
begin
|
|
`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;
|
|
end
|
|
if ((data & (~`ETH_INT_RXE)) !== 0)
|
|
begin
|
|
`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
|
|
9: // RX BD overrun
|
|
begin
|
|
|
|
//check_rx_bd(120, data);
|
|
//$display("RX BD 120 = %h", data);
|
|
//check_rx_bd(121, data);
|
|
//$display("RX BD 121 = %h", data);
|
|
//check_rx_bd(122, data);
|
|
//$display("RX BD 122 = %h", data);
|
|
//check_rx_bd(123, data);
|
|
//$display("RX BD 123 = %h", data);
|
|
//check_rx_bd(124, data);
|
|
//$display("RX BD 124 = %h", data);
|
|
//check_rx_bd(125, data);
|
|
//$display("RX BD 125 = %h", data);
|
|
//check_rx_bd(126, data);
|
|
//$display("RX BD 126 = %h", data);
|
|
//check_rx_bd(127, data);
|
|
//$display("RX BD 127 = %h", data);
|
|
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
// NOT checked since BD value is from first packet - RX BD overrun
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if ((data & `ETH_INT_BUSY) !== `ETH_INT_BUSY)
|
|
begin
|
|
`TIME; $display("*E Interrupt BUSY was not set, interrupt reg: %0h", data);
|
|
test_fail("Interrupt BUSY was not set");
|
|
fail = fail + 1;
|
|
end
|
|
if ((data & (~`ETH_INT_BUSY)) !== 0)
|
|
begin
|
|
`TIME; $display("*E Other interrupts (except BUSY) were set, interrupt reg: %0h", data);
|
|
test_fail("Other interrupts (except BUSY) were set");
|
|
fail = fail + 1;
|
|
end
|
|
end
|
|
default:
|
|
begin
|
|
end
|
|
endcase
|
|
// 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
|
|
num_of_frames = num_of_frames + 1;
|
|
end
|
|
// disable RX
|
|
wait (wbm_working == 0);
|
|
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
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//// ////
|
|
//// Test receive packets at 8 RX BD with ////
|
|
//// RX FIFO and RX BD overrun ( 100Mbps ). ////
|
|
//// ////
|
|
////////////////////////////////////////////////////////////////////
|
|
if (test_num == 13) //
|
|
begin
|
|
// TEST 13: RECEIVE PACKETS AT 8 RX BD WITH RX FIFO AND RX BD OVERRUN ( 100Mbps )
|
|
test_name = "TEST 13: RECEIVE PACKETS AT 8 RX BD WITH RX FIFO AND RX BD OVERRUN ( 100Mbps )";
|
|
`TIME; $display(" TEST 13: RECEIVE PACKETS AT 8 RX BD WITH RX FIFO AND RX BD OVERRUN ( 100Mbps )");
|
|
// 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);
|
|
// 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 |
|
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// set Destination address - Byte 0 sent first
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR1, 32'h0000_AA02, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte /, /, 0, 1 of Dest. addr.
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_MAC_ADDR0, 32'h0304_0506, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Byte 2, 3, 4. 5 of Dest. addr.
|
|
|
|
// 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 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;
|
|
|
|
// enable interrupt generation
|
|
set_rx_bd(120, 127, 1'b1, `MEMORY_BASE);
|
|
// set wrap bit
|
|
set_rx_bd_wrap(127);
|
|
// SET empty bit
|
|
set_rx_bd_empty(120, 127);
|
|
|
|
num_of_frames = 0;
|
|
while (num_of_frames < 11)
|
|
begin
|
|
// not detect carrier sense in FD and no collision
|
|
eth_phy.no_carrier_sense_rx_fd_detect(0);
|
|
eth_phy.collision(0);
|
|
if (num_of_frames < 2)
|
|
num_of_bd = 120 + num_of_frames;
|
|
else if (num_of_frames < 9)
|
|
num_of_bd = 120 + num_of_frames - 1;
|
|
else
|
|
num_of_bd = 120;
|
|
case (num_of_frames)
|
|
0:
|
|
begin
|
|
// prepare packet
|
|
i_length = 60;
|
|
st_data = 8'h0F;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
end
|
|
3:
|
|
begin
|
|
// prepare packet
|
|
i_length = 68;
|
|
st_data = 8'h01;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
end
|
|
6:
|
|
begin
|
|
// prepare packet
|
|
i_length = 80;
|
|
st_data = 8'hA1;
|
|
set_rx_packet(0, i_length, 1'b0, 48'hAA02_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
|
append_rx_crc (0, i_length, 1'b0, 1'b0);
|
|
end
|
|
10:
|
|
begin
|
|
// SET empty bit
|
|
set_rx_bd_empty(120, 127);
|
|
end
|
|
default:
|
|
begin
|
|
end
|
|
endcase
|
|
// DISPLAYS
|
|
case (num_of_frames)
|
|
0, 3, 5, 7, 8, 10: // correct packet received
|
|
begin
|
|
$display(" packet shoud be successfuly received");
|
|
end
|
|
1: // correct packet stayed in RX FIFO
|
|
begin
|
|
$display(" packet (64Bytes) should be retained in RX FIFO and written to MEM after next RX FIFO overrun");
|
|
end
|
|
2, 4, 6: // RX FIFO overrun
|
|
begin
|
|
$display(" packet should NOT be received - RX FIFO overrun");
|
|
end
|
|
9: // RX BD overrun
|
|
begin
|
|
$display(" packet should NOT be received - RX FIFO overrun due to lack of RX BDs");
|
|
end
|
|
default:
|
|
begin
|
|
end
|
|
endcase
|
|
|
|
fork
|
|
begin
|
|
#1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, (i_length + 4), 1'b0);
|
|
repeat(10) @(posedge mrx_clk);
|
|
end
|
|
begin: set_no_resp3
|
|
if ((num_of_frames == 1) || (num_of_frames == 4)) // RX FIFO overrun!
|
|
#1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
|
|
if (num_of_frames == 6) // RX FIFO overrun!
|
|
begin
|
|
wait (MRxDV === 1'b1); // start transmit
|
|
wait (eth_ma_wb_ack_i === 1'b1) // WB transfer
|
|
wait (eth_ma_wb_ack_i === 1'b0) // WB transfer
|
|
#1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
|
|
end
|
|
end
|
|
begin: wait_for_rec3
|
|
wait (MRxDV === 1'b1); // start transmit
|
|
#1 check_rx_bd(num_of_bd, data);
|
|
if (((data[15] !== 1) && (num_of_frames != 9)) || // RX BD must be Empty
|
|
((data[15] !== 0) && (num_of_frames == 9))) // RX BD must NOT be Empty - RX BD overrun!!!
|
|
begin
|
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
|
fail = fail + 1;
|
|
end
|
|
wait (MRxDV === 1'b0); // end transmit
|
|
while (((data[15] === 1) && (num_of_frames != 9)) ||
|
|
((data[15] === 0) && (num_of_frames == 9)))
|
|
begin
|
|
#1 check_rx_bd(num_of_bd, data);
|
|
@(posedge wb_clk);
|
|
end
|
|
disable check_wait_for_rec3;
|
|
disable set_no_resp3;
|
|
$display(" ->packet received");
|
|
repeat (1) @(posedge wb_clk);
|
|
end
|
|
begin: check_wait_for_rec3
|
|
wait (MRxDV === 1'b1); // start transmit
|
|
wait (MRxDV === 1'b0); // end transmit
|
|
repeat(10) @(posedge mrx_clk);
|
|
repeat(50) @(posedge wb_clk);
|
|
wait (wbm_working == 0);
|
|
disable wait_for_rec3;
|
|
disable set_no_resp3;
|
|
$display(" ->packet NOT received");
|
|
end
|
|
join
|
|
// PACKET checking
|
|
case (num_of_frames)
|
|
0, 3, 5, 7, 8, 10: // correct packet received
|
|
begin
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
if (((data[15:0] !== 16'h4000) && (num_of_bd != 127)) || // without wrap bit
|
|
((data[15:0] !== 16'h6000) && (num_of_bd == 127)))
|
|
begin
|
|
`TIME;
|
|
if (num_of_bd != 127)
|
|
$display("*E RX buffer descriptor status is not correct: %0h instead of 4000", data[15:0]);
|
|
else
|
|
$display("*E RX buffer descriptor status is not correct: %0h instead of 6000", data[15:0]);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check length of a PACKET
|
|
if (data[31:16] != (i_length + 4))
|
|
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
|
|
check_rx_packet(0, `MEMORY_BASE, (i_length + 4), 1'b0, 1'b0, tmp);
|
|
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
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
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;
|
|
end
|
|
end
|
|
1: // correct packet stayed in RX FIFO
|
|
begin
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b0)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should not be set");
|
|
test_fail("WB INT signal should not be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'hC000)
|
|
begin
|
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h instead of C000", data[15:0]);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if (data !== 0)
|
|
begin
|
|
`TIME; $display("*E Any of interrupts 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;
|
|
end
|
|
end
|
|
2: // RX FIFO overrun & previous packet written
|
|
begin
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b0)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should not be set");
|
|
test_fail("WB INT signal should not be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'hC000)
|
|
begin
|
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h instead of C000", data[15:0]);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if (data !== 0)
|
|
begin
|
|
`TIME; $display("*E Any of interrupts 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;
|
|
end
|
|
|
|
// Release packet
|
|
#1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
|
|
repeat(128) @(posedge wb_clk);
|
|
$display(" ->previous packet written into MEM");
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'h4000)
|
|
begin
|
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h instead of 4000", data[15:0]);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
|
|
begin
|
|
`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;
|
|
end
|
|
if ((data & (~`ETH_INT_RXB)) !== 0)
|
|
begin
|
|
`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
|
|
4, 6: // RX FIFO overrun
|
|
begin
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b0)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should not be set");
|
|
test_fail("WB INT signal should not be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'hC000)
|
|
begin
|
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h instead of C000", data[15:0]);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if (data !== 0)
|
|
begin
|
|
`TIME; $display("*E Any of interrupts 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;
|
|
end
|
|
|
|
// Release packet
|
|
#1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
|
|
repeat(128) @(posedge wb_clk);
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
if (data[15:0] !== 16'h4040)
|
|
begin
|
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h instead of 4040", data[15:0]);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
|
|
begin
|
|
`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;
|
|
end
|
|
if ((data & (~`ETH_INT_RXE)) !== 0)
|
|
begin
|
|
`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
|
|
9: // RX BD overrun
|
|
begin
|
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
|
end
|
|
check_rx_bd(num_of_bd, data);
|
|
// check RX buffer descriptor of a packet
|
|
// NOT checked since BD value is from first packet - RX BD overrun
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if ((data & `ETH_INT_BUSY) !== `ETH_INT_BUSY)
|
|
begin
|
|
`TIME; $display("*E Interrupt BUSY was not set, interrupt reg: %0h", data);
|
|
test_fail("Interrupt BUSY was not set");
|
|
fail = fail + 1;
|
|
end
|
|
if ((data & (~`ETH_INT_BUSY)) !== 0)
|
|
begin
|
|
`TIME; $display("*E Other interrupts (except BUSY) were set, interrupt reg: %0h", data);
|
|
test_fail("Other interrupts (except BUSY) were set");
|
|
fail = fail + 1;
|
|
end
|
|
end
|
|
default:
|
|
begin
|
|
end
|
|
endcase
|
|
// 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
|
|
num_of_frames = num_of_frames + 1;
|
|
end
|
|
// disable RX
|
|
wait (wbm_working == 0);
|
|
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
|
|
|
|
|
|
end // for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
|
|
|
|
end
|
|
endtask // test_mac_full_duplex_receive
|
|
|
|
|
|
task test_mac_full_duplex_flow_control;
|
|
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_rx_frames;
|
|
integer num_of_bd;
|
|
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;
|
|
integer rx_len;
|
|
integer tx_len;
|
|
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 wait_for_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;
|
|
reg PassAll;
|
|
reg RxFlow;
|
|
reg enable_irq_in_rxbd;
|
|
reg [15:0] pause_value;
|
|
|
|
begin
|
|
// MAC FULL DUPLEX FLOW CONTROL TEST
|
|
test_heading("MAC FULL DUPLEX FLOW CONTROL TEST");
|
|
$display(" ");
|
|
$display("MAC FULL DUPLEX FLOW CONTROL TEST");
|
|
fail = 0;
|
|
|
|
// reset MAC registers
|
|
hard_reset;
|
|
// 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_full_duplex_flow_control: ////
|
|
//// ////
|
|
//// 0: Test ////
|
|
//// ////
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
for (test_num = start_task; test_num <= end_task; test_num = test_num + 1)
|
|
begin
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//// ////
|
|
//// Test inserts control frames while transmitting normal ////
|
|
//// frames. Using 4 TX buffer decriptors ( 10Mbps ). ////
|
|
//// ////
|
|
////////////////////////////////////////////////////////////////////
|
|
if (test_num == 0) //
|
|
begin
|
|
// TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )
|
|
test_name = "TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )";
|
|
`TIME; $display(" TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX 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 - must be set before TX enable
|
|
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);
|
|
// enable TX flow control
|
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// Set MAC address
|
|
mac_hi_addr = 32'h00000001;
|
|
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_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// prepare two packets of MAXFL length
|
|
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'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
|
|
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;
|
|
|
|
frame_started = 0;
|
|
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
|
|
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
|
|
// 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
|
|
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 not be set because TXC irq is masked!");
|
|
fail = fail + 1;
|
|
`TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
|
|
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 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
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//// ////
|
|
//// Test inserts control frames while transmitting normal ////
|
|
//// frames. Using 4 TX buffer decriptors ( 100Mbps ). ////
|
|
//// ////
|
|
////////////////////////////////////////////////////////////////////
|
|
if (test_num == 1) //
|
|
begin
|
|
// 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 )");
|
|
|
|
// 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 - must be set before TX enable
|
|
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);
|
|
// enable TX flow control
|
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// Set MAC address
|
|
mac_hi_addr = 32'h00000001;
|
|
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_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// prepare two packets of MAXFL length
|
|
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'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
|
|
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;
|
|
|
|
frame_started = 0;
|
|
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
|
|
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
|
|
// 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
|
|
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 not be set because TXC irq is masked!");
|
|
fail = fail + 1;
|
|
`TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
|
|
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 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
|
|
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
|
|
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
|
|
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
|
|
`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
|
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
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Test inserts control frames while transmitting normal ////
|
//// Random receive and transmit frames at one TX and ////
|
//// frames. Using 4 TX buffer decriptors ( 10Mbps ). ////
|
//// one RX buffer decriptor ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 0) //
|
if (test_num == 4) //
|
begin
|
begin
|
// TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )
|
// TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )
|
test_name = "TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )";
|
test_name = "TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )";
|
`TIME; $display(" TEST 0: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 10Mbps )");
|
`TIME; $display(" TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )");
|
|
|
// reset MAC completely
|
// unmask interrupts
|
hard_reset;
|
wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
|
// set wb slave response
|
`ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
|
// set 1 TX and 1 RX buffer descriptor (8'h01) - must be set before RX enable
|
max_tmp = 0;
|
wbm_write(`ETH_TX_BD_NUM, 32'h01, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
min_tmp = 0;
|
// enable RX, set full-duplex mode, NO receive small, NO correct IFG
|
// set 4 TX buffer descriptors - must be set before TX enable
|
wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
|
wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
// 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 TX flow control
|
// enable flow control
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// Set MAC address
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW | `ETH_CTRLMODER_TXFLOW,
|
mac_hi_addr = 32'h00000001;
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
mac_lo_addr = 32'h02030405;
|
// prepare one RX and one TX packet of 100 bytes long
|
wbm_write(`ETH_MAC_ADDR1, mac_hi_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
rx_len = 100; // length of frame without CRC
|
wbm_write(`ETH_MAC_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
st_data = 8'h1A;
|
// prepare two packets of MAXFL length
|
set_rx_packet(200, rx_len, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
|
wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
append_rx_crc (200, rx_len, 1'b0, 1'b0); // CRC for data packet
|
max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
|
tx_len = 64; // length of frame without CRC
|
min_tmp = tmp[31:16];
|
st_data = 8'h01;
|
st_data = 8'h34;
|
set_tx_packet(`MEMORY_BASE + 64, tx_len, st_data); // length without CRC
|
set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
|
// set TX and RX Buffer Descriptors
|
st_data = 8'h56;
|
tx_bd_num = 0; // tx BDs go from 0 to 0
|
set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
|
rx_bd_num = 1; // rx BDs go from 1 to 1
|
// 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
|
|
|
|
// set EQUAL mrx_clk to mtx_clk!
|
|
// eth_phy.set_mrx_equal_mtx = 1'b1;
|
|
|
// 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
|
#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 = 10;
|
|
|
frame_started = 0;
|
// 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_frames = 0;
|
num_of_bd = 0;
|
num_of_rx_frames = 0;
|
i_length = 0; // 0;
|
// num_of_iter = 0;
|
// Initialize one part of memory with data of control packet
|
// TX frame loop & RX frame loop work independently
|
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);
|
fork
|
wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'hc), 32'h88080001, 4'hF);
|
// TX frame loop
|
wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h11110000, 4'hF);
|
while (num_of_frames < 400)
|
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
|
test_fail("IRQ already pending!");
|
eth_phy.set_tx_mem_addr(64 + num_of_frames);
|
fail = fail + 1;
|
// set tx bd
|
`TIME; $display("*E IRQ already pending!");
|
// wait for WB master if it is working
|
|
@(posedge wb_clk);
|
|
while (wbm_working)
|
|
begin
|
|
@(posedge wb_clk);
|
end
|
end
|
if (wb_int)
|
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
|
begin
|
test_fail("WB INT signal should not be set!");
|
@(posedge mtx_clk);
|
fail = fail + 1;
|
i = i + 1;
|
`TIME; $display("*E WB INT signal should not be set!");
|
|
end
|
end
|
// first destination address on ethernet PHY
|
if (MTxEn != 1'b1)
|
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
|
test_fail("TXC IRQ should be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E TXC IRQ should be set!");
|
#10000 $stop;
|
end
|
end
|
if (wb_int)
|
|
|
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
|
begin
|
test_fail("WB INT signal should not be set because TXC irq is masked!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
|
#10000 $stop;
|
end
|
end
|
// Clear TXC interrupt
|
tmp_len = eth_phy.tx_len;
|
wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// wait for WB master if it is working
|
if (wb_int)
|
@(posedge wb_clk);
|
|
while (wbm_working)
|
begin
|
begin
|
test_fail("WB INT signal should not be set!");
|
@(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;
|
fail = fail + 1;
|
`TIME; $display("*E WB INT signal should not be set!");
|
|
end
|
end
|
// check transmited TX packet
|
// check transmitted TX packet data
|
check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
|
check_tx_packet((`MEMORY_BASE + 64), (64 + num_of_frames), (tx_len), tmp);
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
$display("Wrong data of the transmitted packet");
|
`TIME; $display("*E Tx Frame %0d: Wrong data of the transmitted packet", num_of_frames);
|
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
|
#1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
|
check_tx_crc((64 + num_of_frames), (tx_len), 1'b0, tmp); // length without CRC
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
$display("Wrong CRC of the transmitted packet");
|
`TIME; $display("*E Tx Frame %0d: Wrong CRC of the transmitted packet", num_of_frames);
|
test_fail("Wrong CRC of the transmitted packet");
|
test_fail("Wrong CRC of the transmitted packet");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
// check WB INT signal
|
// In the following section, control frame will be sent while no other transmission is in progress.//
|
if (wb_int !== 1'b0)
|
// 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
|
begin
|
test_fail("IRQ already pending!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E IRQ already pending!");
|
|
end
|
end
|
if (wb_int)
|
// 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
|
begin
|
test_fail("WB INT signal should not be set!");
|
@(posedge wb_clk);
|
fail = fail + 1;
|
|
`TIME; $display("*E WB INT signal should not be set!");
|
|
end
|
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);
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
if(data !== `ETH_INT_TXC)
|
if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
|
begin
|
begin
|
test_fail("TXC IRQ should be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E TXC IRQ should be set!");
|
|
end
|
end
|
if (!wb_int)
|
if ((data & (~(`ETH_INT_TXB | `ETH_INT_RXB))) !== 0) // RXB might occur at the same time - not error
|
begin
|
begin
|
test_fail("WB INT signal should be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E WB INT signal should be set!");
|
|
end
|
end
|
// Clear TXC interrupt
|
// clear interrupts (except RXB)
|
wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// wait for WB master if it is working
|
if (wb_int)
|
@(posedge wb_clk);
|
|
while (wbm_working)
|
begin
|
begin
|
test_fail("WB INT signal should not be set!");
|
@(posedge wb_clk);
|
fail = fail + 1;
|
|
`TIME; $display("*E WB INT signal should not be set!");
|
|
end
|
end
|
// check transmited TX packet
|
wbm_write(`ETH_INT, (data & (~`ETH_INT_RXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
|
// check WB INT signal
|
if (tmp > 0)
|
if (wb_int !== 1'b0)
|
begin
|
begin
|
$display("Wrong data of the transmitted packet");
|
`TIME; $display("*E Tx Frame %0d: WB INT signal should not be set", num_of_frames);
|
test_fail("Wrong data of the transmitted packet");
|
test_fail("WB INT signal should not be set");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check transmited TX packet CRC
|
// Displays
|
#1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
|
if (num_of_frames[2:0] == 3'b111)
|
if (tmp > 0)
|
|
begin
|
begin
|
$display("Wrong CRC of the transmitted packet");
|
$display(" ->8 frames transmitted");
|
test_fail("Wrong CRC of the transmitted packet");
|
|
fail = fail + 1;
|
|
end
|
end
|
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
// set length (loop variable)
|
// In the following section, control frame sending is requested while no other transmission //
|
num_of_frames = num_of_frames + 1;
|
// is in progress. TXC interrupt is unmasked. //
|
end // TX frame loop
|
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
// RX frame loop
|
// unmask all interrupts
|
while (num_of_rx_frames < 400)
|
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
|
begin
|
test_fail("IRQ already pending!");
|
// set rx bd
|
fail = fail + 1;
|
// wait for WB master if it is working
|
`TIME; $display("*E IRQ already pending!");
|
@(posedge wb_clk);
|
|
#1;
|
|
while (wbm_working)
|
|
begin
|
|
@(posedge wb_clk);
|
|
#1;
|
end
|
end
|
if (wb_int)
|
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
|
begin
|
test_fail("WB INT signal should not be set!");
|
#1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 200, (rx_len + 4), 1'b0);
|
fail = fail + 1;
|
repeat(10) @(posedge mrx_clk);
|
`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 //
|
|
// beginning control frame request will be faster than data send request, later the opposite. //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
for (i=0; i<32; i=i+1)
|
|
begin
|
begin
|
// Request sending the control frame with pause value = 0x5678
|
wait (MRxDV === 1'b1); // start receive
|
set_tx_bd(0, 0, 16'h100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE)); // irq, pad, crc
|
// wait for WB master if it is working
|
set_tx_bd_wrap(0);
|
@(posedge wb_clk);
|
// first destination address on ethernet PHY
|
#1;
|
eth_phy.set_tx_mem_addr(0);
|
while (wbm_working)
|
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
|
begin
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
@(posedge wb_clk);
|
if(data !== `ETH_INT_TXC)
|
#1;
|
|
end
|
|
check_rx_bd(1, data);
|
|
if (data[15] !== 1)
|
begin
|
begin
|
test_fail("TXC IRQ should be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E TXC IRQ should be set!");
|
|
`TIME; $display("ETH_INT = 0x%0x", data);
|
|
end
|
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
|
end
|
else
|
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
|
begin
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
@(posedge wb_clk);
|
if(data !== `ETH_INT_TXB)
|
#1;
|
|
end
|
|
check_rx_bd(1, data);
|
|
|
|
if (data[31:16] != (rx_len + 4))
|
begin
|
begin
|
test_fail("TXB IRQ should be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E TXB IRQ should be set!");
|
|
`TIME; $display("ETH_INT = 0x%0x", data);
|
|
end
|
end
|
end
|
// check received RX packet data and CRC
|
// check transmited TX packet
|
check_rx_packet(200, (`MEMORY_BASE + 200 + num_of_rx_frames), (rx_len + 4), 1'b0, 1'b0, tmp);
|
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)
|
if (tmp > 0)
|
begin
|
begin
|
$display("Wrong data of the transmitted packet");
|
`TIME; $display("*E Rx Frame %0d: Wrong data of the received packet", num_of_rx_frames);
|
test_fail("Wrong data of the transmitted packet");
|
test_fail("Wrong data of the received packet");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check transmited TX packet CRC
|
// check WB INT signal
|
if(tmp_len == 64) // Control frame
|
if (wb_int !== 1'b0)
|
#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
|
begin
|
$display("Wrong CRC of the transmitted packet");
|
`TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
|
test_fail("Wrong CRC of the transmitted packet");
|
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;
|
fail = fail + 1;
|
end
|
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
|
// 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);
|
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_RXB) !== `ETH_INT_RXB)
|
begin
|
begin
|
test_fail("TXC and TXB IRQ should be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E TXC and TXB IRQ should be set! (ETH_INT=0x%0x)", data);
|
|
end
|
end
|
if (!wb_int)
|
if ((data & (~(`ETH_INT_RXB | `ETH_INT_TXB))) !== 0) // TXB might occur at the same time - not error
|
begin
|
begin
|
test_fail("WB INT signal should be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E WB INT signal should be set!");
|
|
end
|
end
|
// Clear TXC and TXB interrupt
|
// clear interrupts (except TXB)
|
wbm_write(`ETH_INT, `ETH_INT_TXC | `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
|
// wait for WB master if it is working
|
if (wb_int)
|
@(posedge wb_clk);
|
|
#1;
|
|
while (wbm_working)
|
begin
|
begin
|
test_fail("WB INT signal should not be set!");
|
@(posedge wb_clk);
|
fail = fail + 1;
|
#1;
|
`TIME; $display("*E WB INT signal should not be set!");
|
|
end
|
end
|
if(tmp_len == 64) // Control frame
|
wbm_write(`ETH_INT, (data & (~`ETH_INT_TXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
|
// check WB INT signal
|
else
|
if (wb_int !== 1'b0)
|
check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
|
|
if (tmp > 0)
|
|
begin
|
begin
|
$display("Wrong data of the transmitted packet");
|
`TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
|
test_fail("Wrong data of the transmitted packet");
|
test_fail("WB INT signal should not be set");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check transmited TX packet CRC
|
// Displays
|
if(tmp_len == 64) // Control frame
|
if (num_of_rx_frames[2:0] == 3'b111)
|
#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
|
begin
|
$display("Wrong CRC of the transmitted packet");
|
$display(" ->8 frames received");
|
test_fail("Wrong CRC of the transmitted packet");
|
|
fail = fail + 1;
|
|
end
|
end
|
end // for loop
|
// 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)
|
if(fail == 0)
|
test_ok;
|
test_ok;
|
else
|
else
|
fail = 0;
|
fail = 0;
|
end
|
end
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Test inserts control frames while transmitting normal ////
|
//// Random receive and transmit frames at one TX and ////
|
//// frames. Using 4 TX buffer decriptors ( 100Mbps ). ////
|
//// one RX buffer decriptor ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 1) //
|
if (test_num == 5) //
|
begin
|
begin
|
// TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )
|
// TEST 5: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 100Mbps )
|
test_name = "TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )";
|
test_name = "TEST 5: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 100Mbps )";
|
`TIME; $display(" TEST 1: INSERT CONTROL FRM. WHILE TRANSMITTING NORMAL FRM. AT 4 TX BD ( 100Mbps )");
|
`TIME; $display(" TEST 5: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 100Mbps )");
|
|
|
// reset MAC completely
|
// unmask interrupts
|
hard_reset;
|
wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
|
// set wb slave response
|
`ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
|
// set 1 TX and 1 RX buffer descriptor (8'h01) - must be set before RX enable
|
max_tmp = 0;
|
wbm_write(`ETH_TX_BD_NUM, 32'h01, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
min_tmp = 0;
|
// enable RX, set full-duplex mode, NO receive small, NO correct IFG
|
// set 4 TX buffer descriptors - must be set before TX enable
|
wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
|
wbm_write(`ETH_TX_BD_NUM, 32'h4, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
// 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 TX flow control
|
// enable flow control
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_TXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// Set MAC address
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW | `ETH_CTRLMODER_TXFLOW,
|
mac_hi_addr = 32'h00000001;
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
mac_lo_addr = 32'h02030405;
|
// prepare one RX and one TX packet of 100 bytes long
|
wbm_write(`ETH_MAC_ADDR1, mac_hi_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
rx_len = 100; // length of frame without CRC
|
wbm_write(`ETH_MAC_ADDR0, mac_lo_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
st_data = 8'h1A;
|
// prepare two packets of MAXFL length
|
set_rx_packet(200, rx_len, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
|
wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
append_rx_crc (200, rx_len, 1'b0, 1'b0); // CRC for data packet
|
max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
|
tx_len = 64; // length of frame without CRC
|
min_tmp = tmp[31:16];
|
st_data = 8'h01;
|
st_data = 8'h34;
|
set_tx_packet(`MEMORY_BASE + 64, tx_len, st_data); // length without CRC
|
set_tx_packet(`MEMORY_BASE, (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
|
// set TX and RX Buffer Descriptors
|
st_data = 8'h56;
|
tx_bd_num = 0; // tx BDs go from 0 to 0
|
set_tx_packet((`MEMORY_BASE + max_tmp), (max_tmp - 4), st_data); // length without CRC. Writing data to the memory
|
rx_bd_num = 1; // rx BDs go from 1 to 1
|
// 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
|
|
|
|
// set EQUAL mrx_clk to mtx_clk!
|
|
// eth_phy.set_mrx_equal_mtx = 1'b1;
|
|
|
// 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
|
#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 = 100;
|
speed = 100;
|
|
|
frame_started = 0;
|
// 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_frames = 0;
|
num_of_bd = 0;
|
num_of_rx_frames = 0;
|
i_length = 0; // 0;
|
// num_of_iter = 0;
|
// Initialize one part of memory with data of control packet
|
// TX frame loop & RX frame loop work independently
|
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);
|
fork
|
wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'hc), 32'h88080001, 4'hF);
|
// TX frame loop
|
wb_slave.wr_mem((`MEMORY_BASE + 2 * max_tmp + 8'h10), 32'h11110000, 4'hF);
|
while (num_of_frames < 400)
|
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
|
test_fail("IRQ already pending!");
|
eth_phy.set_tx_mem_addr(64 + num_of_frames);
|
fail = fail + 1;
|
// set tx bd
|
`TIME; $display("*E IRQ already pending!");
|
// wait for WB master if it is working
|
|
@(posedge wb_clk);
|
|
while (wbm_working)
|
|
begin
|
|
@(posedge wb_clk);
|
end
|
end
|
if (wb_int)
|
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
|
begin
|
test_fail("WB INT signal should not be set!");
|
@(posedge mtx_clk);
|
fail = fail + 1;
|
i = i + 1;
|
`TIME; $display("*E WB INT signal should not be set!");
|
|
end
|
end
|
// first destination address on ethernet PHY
|
if (MTxEn != 1'b1)
|
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
|
test_fail("TXC IRQ should be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E TXC IRQ should be set!");
|
#10000 $stop;
|
end
|
end
|
if (wb_int)
|
|
|
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
|
begin
|
test_fail("WB INT signal should not be set because TXC irq is masked!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E WB INT signal should not be set because TXC irq is masked!");
|
#10000 $stop;
|
end
|
end
|
// Clear TXC interrupt
|
tmp_len = eth_phy.tx_len;
|
wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// wait for WB master if it is working
|
if (wb_int)
|
@(posedge wb_clk);
|
|
while (wbm_working)
|
begin
|
begin
|
test_fail("WB INT signal should not be set!");
|
@(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;
|
fail = fail + 1;
|
`TIME; $display("*E WB INT signal should not be set!");
|
|
end
|
end
|
// check transmited TX packet
|
// check transmitted TX packet data
|
check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
|
check_tx_packet((`MEMORY_BASE + 64), (64 + num_of_frames), (tx_len), tmp);
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
$display("Wrong data of the transmitted packet");
|
`TIME; $display("*E Tx Frame %0d: Wrong data of the transmitted packet", num_of_frames);
|
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
|
#1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
|
check_tx_crc((64 + num_of_frames), (tx_len), 1'b0, tmp); // length without CRC
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
$display("Wrong CRC of the transmitted packet");
|
`TIME; $display("*E Tx Frame %0d: Wrong CRC of the transmitted packet", num_of_frames);
|
test_fail("Wrong CRC of the transmitted packet");
|
test_fail("Wrong CRC of the transmitted packet");
|
fail = fail + 1;
|
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
|
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);
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
if(data)
|
if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
|
begin
|
begin
|
test_fail("IRQ already pending!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E IRQ already pending!");
|
|
end
|
end
|
if (wb_int)
|
if ((data & (~(`ETH_INT_TXB | `ETH_INT_RXB))) !== 0) // RXB might occur at the same time - not error
|
begin
|
begin
|
test_fail("WB INT signal should not be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E WB INT signal should not be set!");
|
|
end
|
end
|
// unmask only TXC interrupts
|
// clear interrupts (except RXB)
|
wbm_write(`ETH_INT_MASK, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// wait for WB master if it is working
|
// first destination address on ethernet PHY
|
@(posedge wb_clk);
|
eth_phy.set_tx_mem_addr(0);
|
while (wbm_working)
|
// 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
|
begin
|
test_fail("TXC IRQ should be set!");
|
@(posedge wb_clk);
|
fail = fail + 1;
|
|
`TIME; $display("*E TXC IRQ should be set!");
|
|
end
|
end
|
if (!wb_int)
|
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
|
begin
|
test_fail("WB INT signal should be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E WB INT signal should be set!");
|
|
end
|
end
|
// Clear TXC interrupt
|
// Displays
|
wbm_write(`ETH_INT, `ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
if (num_of_frames[2:0] == 3'b111)
|
if (wb_int)
|
|
begin
|
begin
|
test_fail("WB INT signal should not be set!");
|
$display(" ->8 frames transmitted");
|
fail = fail + 1;
|
|
`TIME; $display("*E WB INT signal should not be set!");
|
|
end
|
end
|
// check transmited TX packet
|
// set length (loop variable)
|
check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
|
num_of_frames = num_of_frames + 1;
|
if (tmp > 0)
|
end // TX frame loop
|
|
// RX frame loop
|
|
while (num_of_rx_frames < 400)
|
begin
|
begin
|
$display("Wrong data of the transmitted packet");
|
// set rx bd
|
test_fail("Wrong data of the transmitted packet");
|
// wait for WB master if it is working
|
fail = fail + 1;
|
@(posedge wb_clk);
|
|
#1;
|
|
while (wbm_working)
|
|
begin
|
|
@(posedge wb_clk);
|
|
#1;
|
end
|
end
|
// check transmited TX packet CRC
|
set_rx_bd(1, 1, 1'b1, (`MEMORY_BASE + 200 + num_of_rx_frames));
|
#1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
|
set_rx_bd_wrap(1);
|
if (tmp > 0)
|
set_rx_bd_empty(1, 1);
|
|
// check frame
|
|
fork
|
begin
|
begin
|
$display("Wrong CRC of the transmitted packet");
|
#1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 200, (rx_len + 4), 1'b0);
|
test_fail("Wrong CRC of the transmitted packet");
|
repeat(10) @(posedge mrx_clk);
|
fail = fail + 1;
|
|
end
|
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
|
begin
|
test_fail("IRQ already pending!");
|
wait (MRxDV === 1'b1); // start receive
|
fail = fail + 1;
|
// wait for WB master if it is working
|
`TIME; $display("*E IRQ already pending!");
|
@(posedge wb_clk);
|
|
#1;
|
|
while (wbm_working)
|
|
begin
|
|
@(posedge wb_clk);
|
|
#1;
|
end
|
end
|
if (wb_int)
|
check_rx_bd(1, data);
|
|
if (data[15] !== 1)
|
begin
|
begin
|
test_fail("WB INT signal should not be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E WB INT signal should not be set!");
|
|
end
|
end
|
|
wait (MRxDV === 1'b0); // end receive
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
while (data[15] === 1)
|
// 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
|
begin
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// wait for WB master if it is working
|
if(data !== `ETH_INT_TXC)
|
@(posedge wb_clk);
|
|
#1;
|
|
while (wbm_working)
|
begin
|
begin
|
test_fail("TXC IRQ should be set!");
|
@(posedge wb_clk);
|
fail = fail + 1;
|
#1;
|
`TIME; $display("*E TXC IRQ should be set!");
|
|
`TIME; $display("ETH_INT = 0x%0x", data);
|
|
end
|
end
|
|
check_rx_bd(1, data);
|
end
|
end
|
else
|
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
|
begin
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
@(posedge wb_clk);
|
if(data !== `ETH_INT_TXB)
|
#1;
|
|
end
|
|
check_rx_bd(1, data);
|
|
|
|
if (data[31:16] != (rx_len + 4))
|
begin
|
begin
|
test_fail("TXB IRQ should be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E TXB IRQ should be set!");
|
|
`TIME; $display("ETH_INT = 0x%0x", data);
|
|
end
|
|
end
|
end
|
// check transmited TX packet
|
// check received RX packet data and CRC
|
if(tmp_len == 64) // Control frame
|
check_rx_packet(200, (`MEMORY_BASE + 200 + num_of_rx_frames), (rx_len + 4), 1'b0, 1'b0, tmp);
|
check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
|
|
else
|
|
check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
|
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
$display("Wrong data of the transmitted packet");
|
`TIME; $display("*E Rx Frame %0d: Wrong data of the received packet", num_of_rx_frames);
|
test_fail("Wrong data of the transmitted packet");
|
test_fail("Wrong data of the received packet");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check transmited TX packet CRC
|
// check WB INT signal
|
if(tmp_len == 64) // Control frame
|
if (wb_int !== 1'b0)
|
#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
|
begin
|
$display("Wrong CRC of the transmitted packet");
|
`TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
|
test_fail("Wrong CRC of the transmitted packet");
|
test_fail("WB INT signal should not be set");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// wait for control frame to transmit
|
// check RX buffer descriptor of a packet
|
wait (MTxEn === 1'b1); // start transmit of the control frame
|
// wait for WB master if it is working
|
wait (MTxEn === 1'b0); // end transmit of the control frame
|
@(posedge wb_clk);
|
repeat(10) @ (posedge wb_clk); // wait some time
|
#1;
|
repeat(10) @ (posedge mtx_clk); // wait some time so status is written
|
while (wbm_working)
|
// 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
|
begin
|
test_fail("TXC and TXB IRQ should be set!");
|
@(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;
|
fail = fail + 1;
|
`TIME; $display("*E TXC and TXB IRQ should be set! (ETH_INT=0x%0x)", data);
|
|
end
|
end
|
if (!wb_int)
|
// check interrupts
|
|
// wait for WB master if it is working
|
|
@(posedge wb_clk);
|
|
#1;
|
|
while (wbm_working)
|
begin
|
begin
|
test_fail("WB INT signal should be set!");
|
@(posedge wb_clk);
|
|
#1;
|
|
end
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
|
|
if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
|
|
begin
|
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E WB INT signal should be set!");
|
|
end
|
end
|
// Clear TXC and TXB interrupt
|
if ((data & (~(`ETH_INT_RXB | `ETH_INT_TXB))) !== 0) // TXB might occur at the same time - not error
|
wbm_write(`ETH_INT, `ETH_INT_TXC | `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
|
|
if (wb_int)
|
|
begin
|
begin
|
test_fail("WB INT signal should not be set!");
|
`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;
|
fail = fail + 1;
|
`TIME; $display("*E WB INT signal should not be set!");
|
|
end
|
end
|
if(tmp_len == 64) // Control frame
|
// clear interrupts (except TXB)
|
check_tx_packet((`MEMORY_BASE), 0, 32'h100, tmp);
|
// wait for WB master if it is working
|
else
|
@(posedge wb_clk);
|
check_tx_packet((`MEMORY_BASE + 2 * max_tmp), 0, 60, tmp);
|
#1;
|
if (tmp > 0)
|
while (wbm_working)
|
begin
|
begin
|
$display("Wrong data of the transmitted packet");
|
@(posedge wb_clk);
|
test_fail("Wrong data of the transmitted packet");
|
#1;
|
fail = fail + 1;
|
|
end
|
end
|
// check transmited TX packet CRC
|
wbm_write(`ETH_INT, (data & (~`ETH_INT_TXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
if(tmp_len == 64) // Control frame
|
// check WB INT signal
|
#1 check_tx_crc(0, 32'h100, 1'b0, tmp); // length without CRC
|
if (wb_int !== 1'b0)
|
else
|
|
#1 check_tx_crc(0, 60, 1'b0, tmp); // length without CRC
|
|
if (tmp > 0)
|
|
begin
|
begin
|
$display("Wrong CRC of the transmitted packet");
|
`TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
|
test_fail("Wrong CRC of the transmitted packet");
|
test_fail("WB INT signal should not be set");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end // for loop
|
// Displays
|
|
if (num_of_rx_frames[2:0] == 3'b111)
|
|
begin
|
|
$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)
|
if(fail == 0)
|
test_ok;
|
test_ok;
|
else
|
else
|
fail = 0;
|
fail = 0;
|
end
|
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 ipgr1;
|
|
integer ipgr2;
|
|
reg coll;
|
|
integer fail;
|
|
integer speed;
|
|
integer mac_hi_addr;
|
|
integer mac_lo_addr;
|
|
reg frame_started;
|
|
reg frame_ended;
|
|
reg check_rx_frame;
|
|
reg check_tx_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;
|
|
// 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
|
|
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Receive control frames with PASSALL option turned on and ////
|
//// Test defer and collision with IPGR2 while transmitting ////
|
//// off. Using only one RX buffer decriptor ( 10Mbps ). ////
|
//// and receiving normal frames. Using 4 TX and RX buffer ////
|
|
//// decriptors ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 2) //
|
if (test_num == 0) //
|
begin
|
begin
|
// TEST 2: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 10Mbps )
|
// TEST 0: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/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 )");
|
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 )");
|
|
|
// 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);
|
|
// enable RX, set full-duplex mode, NO receive small, NO correct IFG
|
max_tmp = 0;
|
wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
|
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,
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// enable RX_FLOW control
|
// prepare two packets for TX and RX
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wait (wbm_working == 0);
|
// prepare one packet of 100 bytes long
|
wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// st_data = 8'h1A;
|
max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
|
// set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
|
min_tmp = tmp[31:16];
|
// append_rx_crc (64, 100, 1'b0, 1'b0); // CRC for data packet
|
st_data = 8'h17;
|
st_data = 8'h01;
|
set_rx_packet(0, (min_tmp), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
set_tx_packet(`MEMORY_BASE + 64, 100, 8'h01); // length without CRC
|
append_rx_crc (0, (min_tmp), 1'b0, 1'b0);
|
set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
|
st_data = 8'h92;
|
set_tx_bd_wrap(0);
|
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
|
// 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
|
|
// 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
|
// 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
|
#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'h0_00; // bit 6 reset - (10/100), bit 8 set - HD
|
speed = 10;
|
speed = 10;
|
|
|
// RXB and RXC interrupts masked
|
// set TX and RX Buffer Descriptors
|
wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY |
|
tx_bd_num = 0; // tx BDs go from 0 to 3
|
`ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
rx_bd_num = 4; // rx BDs go from 4 to 7
|
// Test irq logic while RXB and RXC interrupts are masked. IRQ in RxBD is cleared
|
ipgr2 = 0;
|
for (i=0; i<3; i=i+1)
|
i_length = min_tmp + 4;
|
begin
|
set_tx_bd(0, 3, i_length[15:0], 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
|
pause_value = i+2;
|
set_tx_bd_wrap(3);
|
set_rx_control_packet(0, pause_value); // CRC already appended
|
set_rx_bd(4, 7, 1'b1, `MEMORY_BASE);
|
// choose generating carrier sense and collision for first and last 64 lengths of frames
|
set_rx_bd_wrap(7);
|
case (i)
|
set_rx_bd_empty(4, 7);
|
0: // PASSALL = 0, RXFLOW = 1, IRQ in RxBD = 1
|
repeat(10) @(posedge mrx_clk);
|
|
repeat(10) @(posedge wb_clk);
|
|
|
|
num_of_frames = 0;// 0; // 10;
|
|
while (num_of_frames <= 35)
|
begin
|
begin
|
PassAll=0; RxFlow=1; enable_irq_in_rxbd=1;
|
st_data = 8'h2 + num_of_frames;
|
// enable interrupt generation
|
set_rx_packet(0, (min_tmp), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
append_rx_crc (0, (min_tmp), 1'b0, 1'b0);
|
// Set PASSALL = 0 and RXFLOW = 0
|
eth_phy.set_tx_mem_addr(num_of_frames);
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// CHECK END OF RECEIVE WHILE TRANSMITTING
|
end
|
if (num_of_frames == 0)
|
1: // PASSALL = 1, RXFLOW = 0, IRQ in RxBD = 1
|
|
begin
|
begin
|
PassAll=1; RxFlow=0; enable_irq_in_rxbd=1;
|
ipgr2 = 7'h0;
|
// enable interrupt generation
|
wait (wbm_working == 0);
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
wbm_write(`ETH_IPGR2, ipgr2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// 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 (num_of_frames == 1)
|
begin
|
begin
|
PassAll=1; RxFlow=0; enable_irq_in_rxbd=0;
|
ipgr2 = 7'h1;
|
// enable interrupt generation
|
wait (wbm_working == 0);
|
set_rx_bd(127, 127, 1'b0, `MEMORY_BASE);
|
wbm_write(`ETH_IPGR2, ipgr2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// 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:
|
if (num_of_frames == 2)
|
begin
|
begin
|
$display("*E We should never get here !!!");
|
ipgr2 = 7'h12;
|
test_fail("We should never get here !!!");
|
wait (wbm_working == 0);
|
fail = fail + 1;
|
wbm_write(`ETH_IPGR2, ipgr2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
end
|
end
|
endcase
|
frame_ended = 0;
|
// not detect carrier sense in FD and no collision
|
check_rx_frame = 0;
|
eth_phy.no_carrier_sense_rx_fd_detect(0);
|
check_tx_frame = 0;
|
eth_phy.collision(0);
|
i = 0;
|
// set wrap bit and empty bit
|
coll = 0;
|
set_rx_bd_wrap(127);
|
|
set_rx_bd_empty(127, 127);
|
|
// transmit
|
|
fork
|
fork
|
begin
|
// send frames
|
#1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
|
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, i_length, 1'b0);
|
repeat(10) @(posedge mrx_clk);
|
repeat(10) @(posedge mrx_clk);
|
end
|
end
|
begin
|
begin // start with TX frame
|
wait (MRxDV === 1'b1); // start transmit
|
repeat(4) @(posedge mrx_clk);
|
#1 check_rx_bd(127, data);
|
repeat(2) @(posedge wb_clk);
|
if (data[15] !== 1)
|
#1 set_tx_bd_ready(tx_bd_num, tx_bd_num);
|
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
|
end
|
join
|
// observe TX Enable, Carrier Sense and Collision - TX frame is not repeated after Late Collision
|
#1 check_rx_bd(127, data);
|
begin: collision0
|
// Checking buffer descriptor
|
wait (MCrs || MTxEn);
|
if(PassAll)
|
if ((MCrs == 1'b1) && (MTxEn == 1'b0)) // defer TX due to Carrier Sense
|
begin
|
|
if(enable_irq_in_rxbd)
|
|
begin
|
begin
|
if(data !== 32'h406100) // Rx BD must not be marked as EMPTY (control frame is received)
|
@(posedge mrx_clk);
|
|
#2;
|
|
if (MTxEn == 1'b0)
|
begin
|
begin
|
$display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
|
wait (MColl);
|
$display("RxBD = 0x%0x", data);
|
`TIME; $display("*E Transmit should NOT start more than 1 CLK after CarrierSense and causing Collision");
|
test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
|
test_fail("Transmit should NOT start more than 1 CLK after CarrierSense and causing Collision");
|
fail = fail + 1;
|
fail = fail + 1;
|
|
coll = 1;
|
|
end
|
end
|
end
|
end
|
end
|
else
|
|
begin
|
begin
|
if(data !== 32'h402100) // Rx BD must not be marked as EMPTY (control frame is received)
|
wait (MCrs || MTxEn);
|
|
#1;
|
|
if ((MCrs == 1'b1) && (MTxEn == 1'b0)) // defer TX due to Carrier Sense
|
begin
|
begin
|
$display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
|
@(posedge mrx_clk);
|
$display("RxBD = 0x%0x", data);
|
#2;
|
test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
|
if (MTxEn == 1'b0)
|
fail = fail + 1;
|
$display(" ->TX Defer occured");
|
end
|
|
end
|
|
end
|
|
else
|
else
|
begin
|
begin
|
if(data !== 32'he000) // Rx BD must be marked as EMPTY (no packet received)
|
$display(" ->Collision occured due to registered inputs");
|
begin
|
coll = 1;
|
$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
|
end
|
end
|
// Checking if interrupt was generated
|
else
|
if (wb_int)
|
|
begin
|
begin
|
`TIME; $display("*E WB INT signal should not be set because both RXB and RXC interrupts are masked");
|
wait (MColl);
|
test_fail("WB INT signal should not be set because both RXB and RXC interrupts are masked");
|
$display(" ->Collision occured - last checking");
|
fail = fail + 1;
|
num_of_frames = 35; // this was last transmission
|
|
coll = 1;
|
|
tmp_len = eth_phy.tx_len; // without preamble and SFD (bytes)
|
end
|
end
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
repeat(10) @(posedge mrx_clk);
|
if(RxFlow)
|
repeat(8) @(posedge wb_clk);
|
begin
|
#1 check_tx_bd(tx_bd_num, data);
|
if(data !== (`ETH_INT_RXC))
|
if (data[15] === 0) // transmit should not be aborted aborted
|
begin
|
begin
|
test_fail("RXC is not set or multiple IRQs active!");
|
`TIME; $display("*E Transmit should not be aborted due to TX Defer or Collision");
|
|
test_fail("Transmit should not be aborted due to TX Defer or Collision");
|
fail = fail + 1;
|
fail = fail + 1;
|
`TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
|
disable retransmit0;
|
end
|
end
|
// Clear RXC interrupt
|
// check if RX frame is accepted
|
wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
|
wait (MRxDV === 1'b0); // end receive
|
end
|
repeat(10) @(posedge mrx_clk);
|
else if(enable_irq_in_rxbd)
|
repeat(8) @(posedge wb_clk);
|
begin
|
disable collision0;
|
if(data !== (`ETH_INT_RXB))
|
#1 check_rx_bd(rx_bd_num, data);
|
|
if (data[15] === 1)
|
begin
|
begin
|
test_fail("RXB is not set or multiple IRQs active!");
|
`TIME; $display("*E Receive packet should be accepted");
|
|
test_fail("Receive packet should be accepted");
|
fail = fail + 1;
|
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
|
end
|
else
|
else
|
begin
|
check_rx_frame = 1'b1; // RX frame accepted and must be checked
|
if(data !== 0)
|
repeat(1) @(posedge wb_clk);
|
begin
|
|
test_fail("Some IRQs is active!");
|
|
fail = fail + 1;
|
|
`TIME; $display("*E Some IRQs is active! (ETH_INT=0x%0x)", data);
|
|
end
|
|
end
|
end
|
if(RxFlow)
|
begin: retransmit0
|
begin
|
// check for retransmission of packet
|
if(MTxEn) // If pause frame was received OK, transmission of the data packet should not start
|
wait (MRxDV === 1'b1); // start receive
|
|
wait (MRxDV === 1'b0); // end receive
|
|
while (MTxEn == 0) // start of retransmission, IPGR2 counting
|
begin
|
begin
|
`TIME; $display("*E Transmission should not be started because pause frame was received.");
|
i = i + 1;
|
test_fail("Transmission should not be started because pause frame was received.");
|
@(posedge mrx_clk);
|
fail = fail + 1;
|
#2;
|
end
|
end
|
while(pause_value)
|
$display(" ->IPGR2 timing checking");
|
|
wait (MTxEn === 1'b0); // end of retransmission
|
|
if (i < (ipgr2 + 6))
|
begin
|
begin
|
pause_value=pause_value-1;
|
`TIME; $display("*E Wrong IPGR2 timing when retransmitting: %0d instead of %0d", i, (ipgr2 + 6));
|
repeat(2*64) @(posedge mtx_clk); // Wait for the time needed for the pause (1 slot).
|
test_fail("Wrong IPGR2 timing when retransmitting");
|
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;
|
fail = fail + 1;
|
end
|
end
|
else if((pause_value) && (MTxEn)) // Transmission should not be enabled now.
|
repeat(10) @(posedge mrx_clk);
|
|
repeat(8) @(posedge wb_clk);
|
|
#1 check_tx_bd(tx_bd_num, data);
|
|
if (data[15] === 1)
|
begin
|
begin
|
`TIME; $display("*E Transmission should still be paused.");
|
`TIME; $display("*E Re-Transmit should be transmitted");
|
test_fail("Transmission should still be paused.");
|
test_fail("Re-Transmit should be transmitted");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
|
end
|
|
else
|
else
|
begin
|
check_tx_frame = 1;
|
if(!MTxEn) // Pause frame was not received because RxFlow is turned off.
|
repeat(1) @(posedge wb_clk);
|
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
|
end
|
wait(wb_int); // Wait antil frame transmission is over and irq generated
|
join
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
repeat(10) @(posedge mrx_clk);
|
if(data !== (`ETH_INT_TXB))
|
repeat(10) @(posedge wb_clk);
|
|
// check RX packet
|
|
check_rx_bd(rx_bd_num, data);
|
|
// check length of a PACKET
|
|
if (data[31:16] != (i_length))
|
begin
|
begin
|
test_fail("TXB is not set or multiple IRQs active!");
|
`TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
|
|
data[31:16], (i_length));
|
|
test_fail("Wrong length of the packet out from PHY");
|
fail = fail + 1;
|
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
|
end
|
1: // PASSALL = 0, RXFLOW = 1
|
// check received RX packet data and CRC
|
|
check_rx_packet(0, (`MEMORY_BASE), (i_length), 1'b0, 1'b0, tmp);
|
|
if (tmp > 0)
|
begin
|
begin
|
PassAll=0; RxFlow=1;
|
`TIME; $display("*E Wrong data of the received packet");
|
// enable interrupt generation
|
test_fail("Wrong data of the received packet");
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
fail = fail + 1;
|
// Set PASSALL = 0 and RXFLOW = 0
|
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
end
|
end
|
2: // PASSALL = 1, RXFLOW = 0
|
// check RX buffer descriptor of a packet
|
|
if (~coll) // if no collision
|
begin
|
begin
|
PassAll=1; RxFlow=0;
|
if ( (data[15:0] !== 16'h6080) && // wrap bit
|
// enable interrupt generation
|
(data[15:0] !== 16'h4080) ) // without wrap bit
|
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
|
begin
|
PassAll=1; RxFlow=1;
|
`TIME;
|
// enable interrupt generation
|
if (num_of_frames[1:0] == 2'h3)
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
$display("*E RX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h6080);
|
// Set PASSALL = 1 and RXFLOW = 1
|
else
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
$display("*E RX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h4080);
|
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
end
|
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
|
end
|
|
else
|
begin
|
begin
|
#1 check_rx_bd(127, data);
|
if ( (data[15:0] !== 16'h6081) && // wrap bit
|
wait (MRxDV === 1'b1); // start transmit
|
(data[15:0] !== 16'h4081) ) // without wrap bit
|
#1 check_rx_bd(127, data);
|
begin
|
if (data[15] !== 1)
|
`TIME;
|
begin
|
if (num_of_frames[1:0] == 2'h3)
|
$display("*E Wrong buffer descriptor's ready bit read out from MAC");
|
$display("*E RX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h6081);
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
else
|
|
$display("*E RX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h4081);
|
|
test_fail("RX buffer descriptor status is not correct");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
wait (MRxDV === 1'b0); // end transmit
|
end
|
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.
|
// check TX packet
|
repeat(64 * 2 * pause_value) @(posedge mrx_clk);
|
check_tx_bd(tx_bd_num, data);
|
|
// check length of a PACKET
|
|
if (eth_phy.tx_len != (i_length + 4))
|
|
begin
|
|
`TIME; $display("*E Wrong length of the packet out from MAC: %0d instead of %0d",
|
|
eth_phy.tx_len, (i_length + 4));
|
|
test_fail("Wrong length of the packet out from MAC");
|
|
fail = fail + 1;
|
end
|
end
|
join
|
// check transmitted TX packet data and CRC
|
#1 check_rx_bd(127, data);
|
check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames), (i_length), tmp);
|
// Checking buffer descriptor
|
if (tmp > 0)
|
if(PassAll)
|
|
begin
|
begin
|
if(data !== 32'h406100) // Rx BD must not be marked as EMPTY (control frame is received)
|
`TIME; $display("*E Wrong data of the transmitted packet");
|
|
test_fail("Wrong data of the transmitted packet");
|
|
fail = fail + 1;
|
|
end
|
|
// check TX buffer descriptor of a packet
|
|
if (~coll) // if no collision
|
begin
|
begin
|
$display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
|
if ( (data[15:0] !== 16'h7802) && // wrap bit
|
$display("RxBD = 0x%0x", data);
|
(data[15:0] !== 16'h5802) ) // without wrap bit
|
test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
|
begin
|
|
`TIME;
|
|
if (num_of_frames[1:0] == 2'h3)
|
|
$display("*E TX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h7802);
|
|
else
|
|
$display("*E TX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h5802);
|
|
test_fail("TX buffer descriptor status is not correct");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
end
|
else
|
else
|
begin
|
begin
|
if(data !== 32'he000) // Rx BD must be marked as EMPTY (no packet received)
|
if ( (data[15:0] !== 16'h7810) && // wrap bit
|
|
(data[15:0] !== 16'h5810) ) // 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("RxBD = 0x%0x", data);
|
if (num_of_frames[1:0] == 2'h3)
|
test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
|
$display("*E TX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h7810);
|
|
else
|
|
$display("*E TX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h5810);
|
|
test_fail("TX buffer descriptor status is not correct");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
end
|
// Checking if interrupt was generated
|
|
if(RxFlow || PassAll)
|
// check RX & TX
|
begin
|
// check WB INT signal
|
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
|
// check interrupts
|
else
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if (~coll)
|
begin
|
begin
|
if (wb_int)
|
if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
|
begin
|
begin
|
`TIME; $display("*E WB INT signal should not be set");
|
`TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
|
test_fail("WB INT signal should not be set");
|
test_fail("Interrupt Receive Buffer was not set");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
end
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
else
|
if(RxFlow)
|
|
begin
|
begin
|
if(data !== (`ETH_INT_RXC))
|
if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
|
begin
|
begin
|
test_fail("RXC is not set or multiple IRQs active!");
|
`TIME; $display("*E Interrupt Receive Error was not set, interrupt reg: %0h", data);
|
|
test_fail("Interrupt Receive Error 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
|
|
wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
|
|
end
|
end
|
else if(PassAll)
|
if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
|
begin
|
begin
|
if(data !== (`ETH_INT_RXB))
|
`TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
|
|
test_fail("Interrupt Transmit Buffer was not set");
|
|
fail = fail + 1;
|
|
end
|
|
if (~coll)
|
begin
|
begin
|
test_fail("RXB is not set or multiple IRQs active!");
|
if ((data & (~(`ETH_INT_RXB | `ETH_INT_TXB))) !== 0)
|
|
begin
|
|
`TIME; $display("*E Other interrupts (except Receive & Transmit Buffer) were set, interrupt reg: %0h", data);
|
|
test_fail("Other interrupts (except Receive & Transmit 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 & (~(`ETH_INT_RXE | `ETH_INT_TXB))) !== 0)
|
begin
|
begin
|
test_fail("No interrupt should be set!");
|
`TIME; $display("*E Other interrupts (except Receive Error & Transmit Buffer) were set, interrupt reg: %0h", data);
|
|
test_fail("Other interrupts (except Receive Error & Transmit Buffer) were 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
|
|
//// corrupt RX data in RX BD memory
|
|
//wait (wbm_working == 0);
|
|
//wbm_write(`MEMORY_BASE, 32'hDEAD_BEEF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
//wbm_write(`MEMORY_BASE + 4, 32'hBEEF_DEAD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// the number of frame transmitted
|
|
if ((num_of_frames == 3) || (num_of_frames == 7) || (num_of_frames == 11) || (num_of_frames == 15) ||
|
|
(num_of_frames == 19) || (num_of_frames == 23) || (num_of_frames == 27) || (num_of_frames == 31))
|
|
begin
|
|
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);
|
|
repeat(10) @(posedge mrx_clk);
|
|
repeat(10) @(posedge wb_clk);
|
|
end
|
|
else
|
|
begin
|
|
tx_bd_num = tx_bd_num + 1; // tx BDs go from 0 to 3
|
|
rx_bd_num = rx_bd_num + 1; // rx BDs go from 4 to 7
|
|
end
|
|
num_of_frames = num_of_frames + 1;
|
|
repeat(50) @(posedge mrx_clk);
|
end
|
end
|
// disable RX
|
// disable RX
|
wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
|
wait (wbm_working == 0);
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
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);
|
if(fail == 0)
|
if(fail == 0)
|
test_ok;
|
test_ok;
|
else
|
else
|
fail = 0;
|
fail = 0;
|
end
|
end
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Receive control frames with PASSALL option turned on and ////
|
//// Test defer and collision with IPGR2 while transmitting ////
|
//// off. Using only one RX buffer decriptor ( 100Mbps ). ////
|
//// and receiving normal frames. Using 4 TX and RX buffer ////
|
|
//// decriptors ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 3) //
|
if (test_num == 1) //
|
begin
|
begin
|
// TEST 3: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED ON AND OFF AT ONE RX BD ( 100Mbps )
|
// TEST 1: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/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 )");
|
test_name = "TEST 1: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 100Mbps )";
|
|
`TIME; $display(" TEST 1: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX 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);
|
|
// enable RX, set full-duplex mode, NO receive small, NO correct IFG
|
max_tmp = 0;
|
wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
|
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,
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// enable RX_FLOW control
|
// prepare two packets for TX and RX
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wait (wbm_working == 0);
|
// prepare one packet of 100 bytes long
|
wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// st_data = 8'h1A;
|
max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
|
// set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
|
min_tmp = tmp[31:16];
|
// append_rx_crc (64, 100, 1'b0, 1'b0); // CRC for data packet
|
st_data = 8'h17;
|
st_data = 8'h01;
|
set_rx_packet(0, (min_tmp), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
set_tx_packet(`MEMORY_BASE + 64, 100, 8'h01); // length without CRC
|
append_rx_crc (0, (min_tmp), 1'b0, 1'b0);
|
set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + 64));
|
st_data = 8'h92;
|
set_tx_bd_wrap(0);
|
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
|
// 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
|
|
// 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 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
|
#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'h0_00; // bit 6 reset - (10/100), bit 8 set - HD
|
speed = 100;
|
speed = 100;
|
|
|
// RXB and RXC interrupts masked
|
// set TX and RX Buffer Descriptors
|
wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY |
|
tx_bd_num = 0; // tx BDs go from 0 to 3
|
`ETH_INT_TXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
rx_bd_num = 4; // rx BDs go from 4 to 7
|
// Test irq logic while RXB and RXC interrupts are masked. IRQ in RxBD is cleared
|
ipgr2 = 0;
|
for (i=0; i<3; i=i+1)
|
i_length = min_tmp + 4;
|
begin
|
set_tx_bd(0, 3, i_length[15:0], 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + max_tmp));
|
pause_value = i+2;
|
set_tx_bd_wrap(3);
|
set_rx_control_packet(0, pause_value); // CRC already appended
|
set_rx_bd(4, 7, 1'b1, `MEMORY_BASE);
|
// choose generating carrier sense and collision for first and last 64 lengths of frames
|
set_rx_bd_wrap(7);
|
case (i)
|
set_rx_bd_empty(4, 7);
|
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);
|
repeat(10) @(posedge mrx_clk);
|
end
|
repeat(10) @(posedge wb_clk);
|
begin
|
|
wait (MRxDV === 1'b1); // start transmit
|
num_of_frames = 0;// 0; // 10;
|
#1 check_rx_bd(127, data);
|
while (num_of_frames <= 83)
|
if (data[15] !== 1)
|
|
begin
|
begin
|
`TIME; $display("*E Wrong buffer descriptor's ready bit read out from MAC");
|
st_data = 8'h2 + num_of_frames;
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
set_rx_packet(0, (min_tmp), 1'b0, 48'h0102_0304_0506, 48'h0708_090A_0B0C, 16'h0D0E, st_data); // length without CRC
|
fail = fail + 1;
|
append_rx_crc (0, (min_tmp), 1'b0, 1'b0);
|
end
|
eth_phy.set_tx_mem_addr(num_of_frames);
|
wait (MRxDV === 1'b0); // received pause frame
|
// CHECK END OF RECEIVE WHILE TRANSMITTING
|
repeat(5) @(posedge mrx_clk); // Wait some time so pause is activated.
|
if (num_of_frames == 0)
|
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
|
begin
|
if(enable_irq_in_rxbd)
|
ipgr2 = 7'h0;
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_IPGR2, ipgr2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
end
|
|
if (num_of_frames == 1)
|
begin
|
begin
|
if(data !== 32'h406100) // Rx BD must not be marked as EMPTY (control frame is received)
|
ipgr2 = 7'h1;
|
|
wait (wbm_working == 0);
|
|
wbm_write(`ETH_IPGR2, ipgr2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
end
|
|
if (num_of_frames == 2)
|
begin
|
begin
|
`TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
|
ipgr2 = 7'h12;
|
$display("RxBD = 0x%0x", data);
|
wait (wbm_working == 0);
|
test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
|
wbm_write(`ETH_IPGR2, ipgr2, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
fail = fail + 1;
|
end
|
|
frame_ended = 0;
|
|
check_rx_frame = 0;
|
|
check_tx_frame = 0;
|
|
i = 0;
|
|
coll = 0;
|
|
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, i_length, 1'b0);
|
|
repeat(10) @(posedge mrx_clk);
|
end
|
end
|
|
begin // start with TX frame
|
|
repeat(4) @(posedge mrx_clk);
|
|
repeat(2) @(posedge wb_clk);
|
|
#1 set_tx_bd_ready(tx_bd_num, tx_bd_num);
|
end
|
end
|
else
|
// observe TX Enable, Carrier Sense and Collision - TX frame is not repeated after Late Collision
|
|
begin: collision1
|
|
wait (MCrs || MTxEn);
|
|
if ((MCrs == 1'b1) && (MTxEn == 1'b0)) // defer TX due to Carrier Sense
|
begin
|
begin
|
if(data !== 32'h402100) // Rx BD must not be marked as EMPTY (control frame is received)
|
@(posedge mrx_clk);
|
|
#2;
|
|
if (MTxEn == 1'b0)
|
begin
|
begin
|
`TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
|
wait (MColl);
|
$display("RxBD = 0x%0x", data);
|
`TIME; $display("*E Transmit should NOT start more than 1 CLK after CarrierSense and causing Collision");
|
test_fail("Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
|
test_fail("Transmit should NOT start more than 1 CLK after CarrierSense and causing Collision");
|
fail = fail + 1;
|
fail = fail + 1;
|
|
coll = 1;
|
end
|
end
|
end
|
end
|
end
|
end
|
else
|
|
begin
|
begin
|
if(data !== 32'he000) // Rx BD must be marked as EMPTY (no packet received)
|
wait (MCrs || MTxEn);
|
|
#1;
|
|
if ((MCrs == 1'b1) && (MTxEn == 1'b0)) // defer TX due to Carrier Sense
|
begin
|
begin
|
`TIME; $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
|
@(posedge mrx_clk);
|
$display("RxBD = 0x%0x", data);
|
#2;
|
test_fail("Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
|
if (MTxEn == 1'b0)
|
fail = fail + 1;
|
$display(" ->TX Defer occured");
|
|
else
|
|
begin
|
|
$display(" ->Collision occured due to registered inputs");
|
|
coll = 1;
|
end
|
end
|
end
|
end
|
// Checking if interrupt was generated
|
else
|
if (wb_int)
|
|
begin
|
begin
|
`TIME; $display("*E WB INT signal should not be set because both RXB and RXC interrupts are masked");
|
wait (MColl);
|
test_fail("WB INT signal should not be set because both RXB and RXC interrupts are masked");
|
$display(" ->Collision occured - last checking");
|
fail = fail + 1;
|
num_of_frames = 83; // this was last transmission
|
|
coll = 1;
|
|
tmp_len = eth_phy.tx_len; // without preamble and SFD (bytes)
|
end
|
end
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
repeat(10) @(posedge mrx_clk);
|
if(RxFlow)
|
repeat(8) @(posedge wb_clk);
|
begin
|
#1 check_tx_bd(tx_bd_num, data);
|
if(data !== (`ETH_INT_RXC))
|
if (data[15] === 0) // transmit should not be aborted aborted
|
begin
|
begin
|
test_fail("RXC is not set or multiple IRQs active!");
|
`TIME; $display("*E Transmit should not be aborted due to TX Defer or Collision");
|
|
test_fail("Transmit should not be aborted due to TX Defer or Collision");
|
fail = fail + 1;
|
fail = fail + 1;
|
`TIME; $display("*E RXC is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
|
disable retransmit1;
|
end
|
end
|
// Clear RXC interrupt
|
// check if RX frame is accepted
|
wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
|
wait (MRxDV === 1'b0); // end receive
|
end
|
repeat(10) @(posedge mrx_clk);
|
else if(enable_irq_in_rxbd)
|
repeat(8) @(posedge wb_clk);
|
begin
|
disable collision1;
|
if(data !== (`ETH_INT_RXB))
|
#1 check_rx_bd(rx_bd_num, data);
|
|
if (data[15] === 1)
|
begin
|
begin
|
test_fail("RXB is not set or multiple IRQs active!");
|
`TIME; $display("*E Receive packet should be accepted");
|
|
test_fail("Receive packet should be accepted");
|
fail = fail + 1;
|
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
|
end
|
else
|
else
|
|
check_rx_frame = 1'b1; // RX frame accepted and must be checked
|
|
repeat(1) @(posedge wb_clk);
|
|
end
|
|
begin: retransmit1
|
|
// check for retransmission of packet
|
|
wait (MRxDV === 1'b1); // start receive
|
|
wait (MRxDV === 1'b0); // end receive
|
|
while (MTxEn == 0) // start of retransmission, IPGR2 counting
|
begin
|
begin
|
if(data !== 0)
|
i = i + 1;
|
|
@(posedge mrx_clk);
|
|
#2;
|
|
end
|
|
$display(" ->IPGR2 timing checking");
|
|
wait (MTxEn === 1'b0); // end of retransmission
|
|
if (i < (ipgr2 + 6))
|
begin
|
begin
|
test_fail("Some IRQs is active!");
|
`TIME; $display("*E Wrong IPGR2 timing when retransmitting: %0d instead of %0d", i, (ipgr2 + 6));
|
|
test_fail("Wrong IPGR2 timing when retransmitting");
|
fail = fail + 1;
|
fail = fail + 1;
|
`TIME; $display("*E Some IRQs is active! (ETH_INT=0x%0x)", data);
|
|
end
|
|
end
|
end
|
if(RxFlow)
|
repeat(10) @(posedge mrx_clk);
|
begin
|
repeat(8) @(posedge wb_clk);
|
if(MTxEn) // If pause frame was received OK, transmission of the data packet should not start
|
#1 check_tx_bd(tx_bd_num, data);
|
|
if (data[15] === 1)
|
begin
|
begin
|
`TIME; $display("*E Transmission should not be started because pause frame was received.");
|
`TIME; $display("*E Re-Transmit should be transmitted");
|
test_fail("Transmission should not be started because pause frame was received.");
|
test_fail("Re-Transmit should be transmitted");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
while(pause_value)
|
else
|
begin
|
check_tx_frame = 1;
|
pause_value=pause_value-1;
|
repeat(1) @(posedge wb_clk);
|
repeat(2*64) @(posedge mtx_clk); // Wait for the time needed for the pause (1 slot).
|
end
|
if((!pause_value) && (!MTxEn)) // Transmission should be enabled now.
|
join
|
|
repeat(10) @(posedge mrx_clk);
|
|
repeat(10) @(posedge wb_clk);
|
|
// check RX packet
|
|
check_rx_bd(rx_bd_num, data);
|
|
// check length of a PACKET
|
|
if (data[31:16] != (i_length))
|
begin
|
begin
|
`TIME; $display("*E Transmission should be started because pause passed.");
|
`TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
|
test_fail("Transmission should be started because pause passed.");
|
data[31:16], (i_length));
|
|
test_fail("Wrong length of the packet out from PHY");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
else if((pause_value) && (MTxEn)) // Transmission should not be enabled now.
|
// check received RX packet data and CRC
|
|
check_rx_packet(0, (`MEMORY_BASE), (i_length), 1'b0, 1'b0, tmp);
|
|
if (tmp > 0)
|
begin
|
begin
|
`TIME; $display("*E Transmission should still be paused.");
|
`TIME; $display("*E Wrong data of the received packet");
|
test_fail("Transmission should still be paused.");
|
test_fail("Wrong data of the received packet");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
// check RX buffer descriptor of a packet
|
end
|
if (~coll) // if no collision
|
else
|
|
begin
|
begin
|
if(!MTxEn) // Pause frame was not received because RxFlow is turned off.
|
if ( (data[15:0] !== 16'h6080) && // wrap bit
|
|
(data[15:0] !== 16'h4080) ) // without wrap bit
|
begin
|
begin
|
`TIME; $display("*E Transmission should be started because pause frame was not received (RxFlow=0).");
|
`TIME;
|
test_fail("Transmission should be started because pause frame was not received (RxFlow=0).");
|
if (num_of_frames[1:0] == 2'h3)
|
|
$display("*E RX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h6080);
|
|
else
|
|
$display("*E RX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h4080);
|
|
test_fail("RX buffer descriptor status is not correct");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
end
|
wait(wb_int); // Wait antil frame transmission is over and irq generated
|
else
|
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!");
|
if ( (data[15:0] !== 16'h6081) && // wrap bit
|
|
(data[15:0] !== 16'h4081) ) // without wrap bit
|
|
begin
|
|
`TIME;
|
|
if (num_of_frames[1:0] == 2'h3)
|
|
$display("*E RX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h6081);
|
|
else
|
|
$display("*E RX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h4081);
|
|
test_fail("RX buffer descriptor status is not correct");
|
fail = fail + 1;
|
fail = fail + 1;
|
`TIME; $display("*E TXB is not set or multiple IRQs active! (ETH_INT=0x%0x)", data);
|
|
end
|
end
|
// Clear TXB interrupt
|
|
wbm_write(`ETH_INT, `ETH_INT_TXB, 4'hF, 1, 4'h0, 4'h0);
|
|
end
|
end
|
// End: Test is irq is set while RXB and RXC interrupts are masked.
|
|
|
|
// Now all interrupts are unmasked. Performing tests again.
|
// check TX packet
|
wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
|
check_tx_bd(tx_bd_num, data);
|
`ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// check length of a PACKET
|
for (i=0; i<4; i=i+1)
|
if (eth_phy.tx_len != (i_length + 4))
|
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
|
begin
|
PassAll=0; RxFlow=0;
|
`TIME; $display("*E Wrong length of the packet out from MAC %0d instead of %0d",
|
// enable interrupt generation
|
eth_phy.tx_len, (i_length + 4));
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
test_fail("Wrong length of the packet out from MAC");
|
// Set PASSALL = 0 and RXFLOW = 0
|
fail = fail + 1;
|
wbm_write(`ETH_CTRLMODER, 0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
end
|
end
|
1: // PASSALL = 0, RXFLOW = 1
|
// check transmitted TX packet data and CRC
|
|
check_tx_packet((`MEMORY_BASE + max_tmp), (num_of_frames), (i_length), tmp);
|
|
if (tmp > 0)
|
begin
|
begin
|
PassAll=0; RxFlow=1;
|
`TIME; $display("*E Wrong data of the transmitted packet");
|
// enable interrupt generation
|
test_fail("Wrong data of the transmitted packet");
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
fail = fail + 1;
|
// Set PASSALL = 0 and RXFLOW = 0
|
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
end
|
end
|
2: // PASSALL = 1, RXFLOW = 0
|
// check TX buffer descriptor of a packet
|
|
if (~coll) // if no collision
|
begin
|
begin
|
PassAll=1; RxFlow=0;
|
if ( (data[15:0] !== 16'h7802) && // wrap bit
|
// enable interrupt generation
|
(data[15:0] !== 16'h5802) ) // without wrap bit
|
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
|
begin
|
PassAll=1; RxFlow=1;
|
`TIME;
|
// enable interrupt generation
|
if (num_of_frames[1:0] == 2'h3)
|
set_rx_bd(127, 127, 1'b1, `MEMORY_BASE);
|
$display("*E TX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h7802);
|
// Set PASSALL = 1 and RXFLOW = 1
|
else
|
wbm_write(`ETH_CTRLMODER, `ETH_CTRLMODER_PASSALL | `ETH_CTRLMODER_RXFLOW, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
$display("*E TX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h5802);
|
|
test_fail("TX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
end
|
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
|
end
|
|
else
|
begin
|
begin
|
#1 check_rx_bd(127, data);
|
if ( (data[15:0] !== 16'h7810) && // wrap bit
|
wait (MRxDV === 1'b1); // start transmit
|
(data[15:0] !== 16'h5810) ) // without wrap bit
|
#1 check_rx_bd(127, data);
|
|
if (data[15] !== 1)
|
|
begin
|
begin
|
$display("*E Wrong buffer descriptor's ready bit read out from MAC");
|
`TIME;
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
if (num_of_frames[1:0] == 2'h3)
|
|
$display("*E TX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h7810);
|
|
else
|
|
$display("*E TX buffer descriptor status is not correct: %0h instead of %0h", data[15:0], 'h5810);
|
|
test_fail("TX buffer descriptor status is not correct");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
wait (MRxDV === 1'b0); // end transmit
|
end
|
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.
|
// check RX & TX
|
repeat(64 * 2 * pause_value) @(posedge mrx_clk);
|
// check WB INT signal
|
|
if (wb_int !== 1'b1)
|
|
begin
|
|
`TIME; $display("*E WB INT signal should be set");
|
|
test_fail("WB INT signal should be set");
|
|
fail = fail + 1;
|
end
|
end
|
join
|
// check interrupts
|
#1 check_rx_bd(127, data);
|
wait (wbm_working == 0);
|
// Checking buffer descriptor
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
if(PassAll)
|
if (~coll)
|
begin
|
begin
|
if(data !== 32'h406100) // Rx BD must not be marked as EMPTY (control frame is received)
|
if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
|
begin
|
begin
|
`TIME; $display("*E Rx BD is not OK. Control frame should be received because PASSALL bit is 1");
|
`TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
|
$display("RxBD = 0x%0x", data);
|
test_fail("Interrupt Receive Buffer was not 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
|
else
|
begin
|
begin
|
if(data !== 32'he000) // Rx BD must be marked as EMPTY (no packet received)
|
if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
|
begin
|
begin
|
`TIME; $display("*E Rx BD should be marked as EMPTY because a control frame was received while PASSALL bit is 0");
|
`TIME; $display("*E Interrupt Receive Error was not set, interrupt reg: %0h", data);
|
$display("RxBD = 0x%0x", data);
|
test_fail("Interrupt Receive Error was not set");
|
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
|
// Checking if interrupt was generated
|
if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
|
|
|
if(RxFlow | PassAll)
|
|
begin
|
|
if (!wb_int)
|
|
begin
|
begin
|
`TIME; $display("*E WB INT signal should be set");
|
`TIME; $display("*E Interrupt Transmit Buffer was not set, interrupt reg: %0h", data);
|
test_fail("WB INT signal should be set");
|
test_fail("Interrupt Transmit Buffer was not set");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
if (~coll)
|
else
|
|
begin
|
begin
|
if (wb_int)
|
if ((data & (~(`ETH_INT_RXB | `ETH_INT_TXB))) !== 0)
|
begin
|
begin
|
`TIME; $display("*E WB INT signal should not be set");
|
`TIME; $display("*E Other interrupts (except Receive & Transmit Buffer) were set, interrupt reg: %0h", data);
|
test_fail("WB INT signal should not be set");
|
test_fail("Other interrupts (except Receive & Transmit Buffer) were set");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
end
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
else
|
if(RxFlow)
|
|
begin
|
begin
|
if(data !== (`ETH_INT_RXC))
|
if ((data & (~(`ETH_INT_RXE | `ETH_INT_TXB))) !== 0)
|
begin
|
begin
|
test_fail("RXC is not set or multiple IRQs active!");
|
`TIME; $display("*E Other interrupts (except Receive Error & Transmit Buffer) were set, interrupt reg: %0h", data);
|
|
test_fail("Other interrupts (except Receive Error & Transmit Buffer) were 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
|
|
wbm_write(`ETH_INT, `ETH_INT_RXC, 4'hF, 1, 4'h0, 4'h0);
|
|
end
|
end
|
else if(PassAll)
|
// clear interrupts
|
begin
|
wait (wbm_working == 0);
|
if(data !== (`ETH_INT_RXB))
|
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
|
test_fail("RXB is not set or multiple IRQs active!");
|
test_fail("WB INT signal should not be 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
|
//// corrupt RX data in RX BD memory
|
wbm_write(`ETH_INT, `ETH_INT_RXB, 4'hF, 1, 4'h0, 4'h0);
|
//wait (wbm_working == 0);
|
|
//wbm_write(`MEMORY_BASE, 32'hDEAD_BEEF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
//wbm_write(`MEMORY_BASE + 4, 32'hBEEF_DEAD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// the number of frame transmitted
|
|
if ((num_of_frames == 3) || (num_of_frames == 7) || (num_of_frames == 11) || (num_of_frames == 15) ||
|
|
(num_of_frames == 19) || (num_of_frames == 23) || (num_of_frames == 27) || (num_of_frames == 31) ||
|
|
(num_of_frames == 35) || (num_of_frames == 39) || (num_of_frames == 43) || (num_of_frames == 47) ||
|
|
(num_of_frames == 51) || (num_of_frames == 55) || (num_of_frames == 59) || (num_of_frames == 63) ||
|
|
(num_of_frames == 67) || (num_of_frames == 71) || (num_of_frames == 75) || (num_of_frames == 79))
|
|
begin
|
|
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);
|
|
repeat(10) @(posedge mrx_clk);
|
|
repeat(10) @(posedge wb_clk);
|
end
|
end
|
else
|
else
|
begin
|
begin
|
if(data !== 0)
|
tx_bd_num = tx_bd_num + 1; // tx BDs go from 0 to 3
|
begin
|
rx_bd_num = rx_bd_num + 1; // rx BDs go from 4 to 7
|
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
|
|
num_of_frames = num_of_frames + 1;
|
|
repeat(50) @(posedge mrx_clk);
|
end
|
end
|
// disable RX
|
// disable RX
|
wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
|
wait (wbm_working == 0);
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
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);
|
if(fail == 0)
|
if(fail == 0)
|
test_ok;
|
test_ok;
|
else
|
else
|
fail = 0;
|
fail = 0;
|
end
|
end
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Receive control frames with PASSALL option turned on and ////
|
//// Test collision and late collision while transmitting and ////
|
//// off. Using only one RX buffer decriptor ( 10Mbps ). ////
|
//// receiving normal frames. Using 4 TX and RX buffer ////
|
|
//// decriptors ( 10Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 4) //
|
if (test_num == 2) //
|
begin
|
begin
|
// TEST 4: RANDOM RECEIVE AND TRANSMIT FRAMES AT ONE TX AND ONE RX BD ( 10Mbps )
|
// TEST 2: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/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 )");
|
test_name = "TEST 2: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )";
|
|
`TIME; $display(" TEST 2: DEFER, COLL. AND LATE COLL. WHILE TRANSMITTING AND RECEIVING FRM. AT 4 TX/RX BD ( 10Mbps )");
|
|
|
// 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 TX and 1 RX buffer descriptor (8'h01) - must be set before RX enable
|
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
|
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
|
max_tmp = 0;
|
wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_TXEN | `ETH_MODER_FULLD | `ETH_MODER_IFG |
|
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,
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// enable flow control
|
// 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);
|
|
|
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
|
// 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
|
|
// unmask interrupts
|
// set EQUAL mrx_clk to mtx_clk!
|
wait (wbm_working == 0);
|
// eth_phy.set_mrx_equal_mtx = 1'b1;
|
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
|
// 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
|
#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 - HD
|
speed = 10;
|
speed = 10;
|
|
|
// TXB and RXB interrupts masked
|
// set TX and RX Buffer Descriptors
|
wbm_write(`ETH_INT_MASK, `ETH_INT_TXE | `ETH_INT_RXE | `ETH_INT_BUSY | `ETH_INT_TXC | `ETH_INT_RXC,
|
tx_bd_num = 0; // tx BDs go from 0 to 3
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
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;
|
tmp_len = 0;
|
num_of_frames = 0;
|
num_of_frames = 0;// 0; // 10;
|
num_of_rx_frames = 0;
|
num_of_iter = 0;
|
// num_of_iter = 0;
|
// num_of_bd = 0;
|
// TX frame loop & RX frame loop work independently
|
// 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
|
// TX frame loop
|
// send frames
|
while (num_of_frames < 400)
|
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
|
begin
|
eth_phy.set_tx_mem_addr(64 + num_of_frames);
|
wait (MCrs || MTxEn);
|
// set tx bd
|
#1;
|
// wait for WB master if it is working
|
if ((MCrs == 1'b1) && (MTxEn == 1'b0)) // defer TX due to Carrier Sense
|
@(posedge wb_clk);
|
wait_for_tx_frame = 1'b1; // wait for retransmission of TX frame
|
while (wbm_working)
|
else
|
begin
|
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;
|
i = 0;
|
while((i < 100) && (MTxEn === 1'b0)) // wait for start of TX frame!
|
while (MColl == 1'b0) // wait for Collision to occure
|
begin
|
begin
|
@(posedge mtx_clk);
|
repeat(2) @(posedge mtx_clk); // counting bytes
|
i = i + 1;
|
#1 i = i + 1'b1;
|
end
|
end
|
if (MTxEn != 1'b1)
|
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
|
begin
|
`TIME; $display("*E Tx Frame %0d: MAC TX didn't start transmitting the packet", num_of_frames);
|
wait_for_tx_frame = 1'b0; // don't wait for retransmission of TX frame
|
test_fail("MAC TX didn't start transmitting the packet");
|
$display(" ->Late Collision occured on %0d. byte after frame and SFD", i);
|
fail = fail + 1;
|
end
|
#10000 $stop;
|
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
|
end
|
|
join
|
|
|
|
|
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
|
// check length of a PACKET
|
if (MTxEn != 1'b0)
|
if ( ((data[31:16] != (i_length + 4)) && (num_of_frames >= 3)) ||
|
|
((data[31:16] != 0) && (num_of_frames < 3)) )
|
begin
|
begin
|
`TIME; $display("*E Tx Frame %0d: MAC TX didn't stop transmitting the packet", num_of_frames);
|
`TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
|
test_fail("MAC TX didn't stop transmitting the packet");
|
data[31:16], (i_length + 4));
|
|
test_fail("Wrong length of the packet out from PHY");
|
fail = fail + 1;
|
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
|
end
|
check_tx_bd(0, data);
|
// check received RX packet data and CRC
|
while (data[15] === 1)
|
//if ((num_of_frames == 5))
|
begin
|
//begin // CRC has 4 bytes for itself
|
// wait for WB master if it is working
|
// if (i_length[0] == 1'b1)
|
@(posedge wb_clk);
|
// begin
|
while (wbm_working)
|
// 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
|
@(posedge wb_clk);
|
check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
|
end
|
|
check_tx_bd(0, data);
|
|
end
|
end
|
repeat (1) @(posedge wb_clk);
|
else
|
// check length of a PACKET
|
|
if (tmp_len != (tx_len + 4))
|
|
begin
|
begin
|
`TIME; $display("*E Tx Frame %0d: Wrong length of the packet out from MAC (%0d instead of %0d)", num_of_frames,
|
check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
|
tmp_len, (tx_len + 4));
|
|
test_fail("Wrong length of the packet out from MAC");
|
|
fail = fail + 1;
|
|
end
|
end
|
// check transmitted TX packet data
|
|
check_tx_packet((`MEMORY_BASE + 64), (64 + num_of_frames), (tx_len), tmp);
|
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
`TIME; $display("*E Tx Frame %0d: Wrong data of the transmitted packet", num_of_frames);
|
`TIME; $display("*E Wrong data of the received packet");
|
test_fail("Wrong data of the transmitted packet");
|
test_fail("Wrong data of the received packet");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check transmited TX packet CRC
|
end
|
check_tx_crc((64 + num_of_frames), (tx_len), 1'b0, tmp); // length without CRC
|
|
if (tmp > 0)
|
// check WB INT signal
|
|
if (num_of_frames >= 3) // Frames smaller than 3 are not received.
|
|
begin // Frames greater then 5 always cause an interrupt (Frame received)
|
|
if (wb_int !== 1'b1) // Frames with length 3 or 4 always cause an interrupt (CRC error)
|
begin
|
begin
|
`TIME; $display("*E Tx Frame %0d: Wrong CRC of the transmitted packet", num_of_frames);
|
`TIME; $display("*E WB INT signal should be set");
|
test_fail("Wrong CRC of the transmitted packet");
|
test_fail("WB INT signal should be set");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check WB INT signal
|
end
|
|
else
|
|
begin
|
if (wb_int !== 1'b0)
|
if (wb_int !== 1'b0)
|
begin
|
begin
|
`TIME; $display("*E Tx Frame %0d: WB INT signal should not be set", num_of_frames);
|
`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
|
// 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
|
end
|
check_tx_bd(0, data);
|
|
if (data[15:0] !== 16'h7800)
|
// check RX buffer descriptor of a packet
|
|
if (num_of_frames >= min_tmp)
|
begin
|
begin
|
`TIME; $display("*E Tx Frame %0d: TX buffer descriptor status is not correct: %0h", num_of_frames, data[15:0]);
|
if ( (data[15:0] !== 16'h6000) && // wrap bit
|
test_fail("TX buffer descriptor status is not correct");
|
(data[15:0] !== 16'h4000) ) // 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;
|
fail = fail + 1;
|
end
|
end
|
// check interrupts
|
|
// wait for WB master if it is working
|
|
@(posedge wb_clk);
|
|
while (wbm_working)
|
|
begin
|
|
@(posedge wb_clk);
|
|
end
|
end
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
else if (num_of_frames > 4)
|
if ((data & `ETH_INT_TXB) !== `ETH_INT_TXB)
|
|
begin
|
begin
|
`TIME; $display("*E Tx Frame %0d: Interrupt Transmit Buffer was not set, interrupt reg: %0h", num_of_frames, data);
|
if ( (data[15:0] !== 16'h6004) && // wrap bit
|
test_fail("Interrupt Transmit Buffer was not set");
|
(data[15:0] !== 16'h4004) ) // without wrap bit
|
fail = fail + 1;
|
|
end
|
|
if ((data & (~(`ETH_INT_TXB | `ETH_INT_RXB))) !== 0) // RXB might occur at the same time - not error
|
|
begin
|
begin
|
`TIME; $display("*E Tx Frame %0d: Other interrupts (except Tx and Rx Buffer) were set, interrupt reg: %0h",
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
|
num_of_frames, data);
|
test_fail("RX buffer descriptor status is not correct");
|
test_fail("Other interrupts (except Transmit Buffer) were set");
|
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// clear interrupts (except RXB)
|
|
// wait for WB master if it is working
|
|
@(posedge wb_clk);
|
|
while (wbm_working)
|
|
begin
|
|
@(posedge wb_clk);
|
|
end
|
end
|
wbm_write(`ETH_INT, (data & (~`ETH_INT_RXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
else if (num_of_frames > 2)
|
// check WB INT signal
|
|
if (wb_int !== 1'b0)
|
|
begin
|
begin
|
`TIME; $display("*E Tx Frame %0d: WB INT signal should not be set", num_of_frames);
|
if ( (data[15:0] !== 16'h6006) && // wrap bit
|
test_fail("WB INT signal should not be set");
|
(data[15:0] !== 16'h4006) ) // 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;
|
fail = fail + 1;
|
end
|
end
|
// Displays
|
|
if (num_of_frames[2:0] == 3'b111)
|
|
begin
|
|
`TIME; $display(" ->8 frames transmitted");
|
|
end
|
end
|
// set length (loop variable)
|
else
|
num_of_frames = num_of_frames + 1;
|
|
end // TX frame loop
|
|
// RX frame loop
|
|
while (num_of_rx_frames < 400)
|
|
begin
|
begin
|
// set rx bd
|
if (data[15] !== 1'b1)
|
// wait for WB master if it is working
|
|
@(posedge wb_clk);
|
|
#1;
|
|
while (wbm_working)
|
|
begin
|
begin
|
@(posedge wb_clk);
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
|
#1;
|
test_fail("RX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
end
|
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
|
end
|
|
// check interrupts
|
|
wait (wbm_working == 0);
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if (num_of_frames >= 5)
|
begin
|
begin
|
wait (MRxDV === 1'b1); // start receive
|
if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
|
// wait for WB master if it is working
|
|
@(posedge wb_clk);
|
|
#1;
|
|
while (wbm_working)
|
|
begin
|
begin
|
@(posedge wb_clk);
|
`TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
|
#1;
|
test_fail("Interrupt Receive Buffer was not set");
|
|
fail = fail + 1;
|
end
|
end
|
check_rx_bd(1, data);
|
if ((data & (~`ETH_INT_RXB)) !== 0)
|
if (data[15] !== 1)
|
|
begin
|
begin
|
`TIME; $display("*E Rx Frame %0d: Wrong buffer descriptor's ready bit read out from MAC", num_of_rx_frames);
|
`TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
test_fail("Other interrupts (except Receive Buffer) were set");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
wait (MRxDV === 1'b0); // end receive
|
end
|
|
else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
|
while (data[15] === 1)
|
|
begin
|
begin
|
// wait for WB master if it is working
|
if (data) // Checking if any interrupt is pending)
|
@(posedge wb_clk);
|
|
#1;
|
|
while (wbm_working)
|
|
begin
|
begin
|
@(posedge wb_clk);
|
`TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
|
#1;
|
test_fail("Interrupts were set");
|
end
|
fail = fail + 1;
|
check_rx_bd(1, data);
|
|
end
|
end
|
repeat (1) @(posedge wb_clk);
|
|
end
|
end
|
join
|
else
|
// 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
|
begin
|
@(posedge wb_clk);
|
if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
|
#1;
|
|
end
|
|
check_rx_bd(1, data);
|
|
|
|
if (data[31:16] != (rx_len + 4))
|
|
begin
|
begin
|
`TIME; $display("*E Rx Frame %0d: Wrong length of the packet written to MAC's register (%0d instead of %0d)",
|
`TIME; $display("*E Interrupt Receive Buffer Error was not set, interrupt reg: %0h", data);
|
num_of_rx_frames, data[31:16], (rx_len + 4));
|
test_fail("Interrupt Receive Buffer Error was not set");
|
test_fail("Wrong length of the packet out from PHY");
|
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check received RX packet data and CRC
|
if ((data & (~`ETH_INT_RXE)) !== 0)
|
check_rx_packet(200, (`MEMORY_BASE + 200 + num_of_rx_frames), (rx_len + 4), 1'b0, 1'b0, tmp);
|
|
if (tmp > 0)
|
|
begin
|
begin
|
`TIME; $display("*E Rx Frame %0d: Wrong data of the received packet", num_of_rx_frames);
|
`TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
|
test_fail("Wrong data of the received packet");
|
test_fail("Other interrupts (except Receive Buffer Error) were set");
|
fail = fail + 1;
|
fail = fail + 1;
|
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
|
// check WB INT signal
|
if (wb_int !== 1'b0)
|
if (wb_int !== 1'b0)
|
begin
|
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");
|
test_fail("WB INT signal should not be set");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check RX buffer descriptor of a packet
|
// INTERMEDIATE DISPLAYS
|
// wait for WB master if it is working
|
if (num_of_frames == 3)
|
@(posedge wb_clk);
|
|
#1;
|
|
while (wbm_working)
|
|
begin
|
begin
|
@(posedge wb_clk);
|
$display(" using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
|
#1;
|
$display(" ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
|
|
0, 3);
|
end
|
end
|
check_rx_bd(1, data);
|
else if (num_of_frames == 9)
|
if (data[15:0] !== 16'h6080)
|
|
begin
|
begin
|
`TIME; $display("*E Rx Frame %0d: RX buffer descriptor status is not correct: %0h", num_of_rx_frames, data[15:0]);
|
$display(" using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
|
test_fail("RX buffer descriptor status is not correct");
|
$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
|
// check interrupts
|
else if (num_of_frames == 17)
|
// wait for WB master if it is working
|
|
@(posedge wb_clk);
|
|
#1;
|
|
while (wbm_working)
|
|
begin
|
begin
|
@(posedge wb_clk);
|
$display(" using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
|
#1;
|
$display(" ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
|
|
10, 17);
|
end
|
end
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
else if (num_of_frames == 27)
|
|
|
if ((data & `ETH_INT_RXB) !== `ETH_INT_RXB)
|
|
begin
|
begin
|
`TIME; $display("*E Rx Frame %0d: Interrupt Receive Buffer was not set, interrupt reg: %0h",
|
$display(" using 5 BDs out of 8 BDs (120..127) assigned to RX (wrap at 5th BD - RX BD 124)");
|
num_of_rx_frames, data);
|
$display(" ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
|
test_fail("Interrupt Receive Buffer was not set");
|
18, 27);
|
fail = fail + 1;
|
|
end
|
end
|
if ((data & (~(`ETH_INT_RXB | `ETH_INT_TXB))) !== 0) // TXB might occur at the same time - not error
|
else if (num_of_frames == 40)
|
begin
|
begin
|
`TIME; $display("*E Rx Frame %0d: Other interrupts (except Rx and Tx Buffer) were set, interrupt reg: %0h",
|
$display(" using 6 BDs out of 8 BDs (120..127) assigned to RX (wrap at 6th BD - RX BD 125)");
|
num_of_rx_frames, data);
|
$display(" ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
|
test_fail("Other interrupts (except Receive Buffer) were set");
|
28, 40);
|
fail = fail + 1;
|
|
end
|
end
|
// clear interrupts (except TXB)
|
else if (num_of_frames == 54)
|
// wait for WB master if it is working
|
|
@(posedge wb_clk);
|
|
#1;
|
|
while (wbm_working)
|
|
begin
|
begin
|
@(posedge wb_clk);
|
$display(" using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
|
#1;
|
$display(" ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
|
|
41, 54);
|
end
|
end
|
wbm_write(`ETH_INT, (data & (~`ETH_INT_TXB)), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
else if (num_of_frames == 69)
|
// check WB INT signal
|
|
if (wb_int !== 1'b0)
|
|
begin
|
begin
|
`TIME; $display("*E Rx Frame %0d: WB INT signal should not be set", num_of_rx_frames);
|
$display(" using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
|
test_fail("WB INT signal should not be set");
|
$display(" ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
|
fail = fail + 1;
|
55, 69);
|
end
|
end
|
// Displays
|
else if (num_of_frames == 69)
|
if (num_of_rx_frames[2:0] == 3'b111)
|
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
|
|
else if (num_of_frames == 77)
|
begin
|
begin
|
`TIME; $display(" ->8 frames received");
|
$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)",
|
|
70, 77);
|
end
|
end
|
// set length (loop variable)
|
// set length (loop variable)
|
num_of_rx_frames = num_of_rx_frames + 1;
|
i_length = i_length + 1;
|
end // RX frame loop
|
// the number of frame transmitted
|
join
|
num_of_frames = num_of_frames + 1;
|
// disable TX & RX
|
if (/*(num_of_frames == 2) || (num_of_frames == 4) || (num_of_frames == 7) ||*/ (num_of_frames <= 10) ||
|
wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_PAD | `ETH_MODER_CRCEN |
|
(num_of_frames == 14) || (num_of_frames == 18) || (num_of_frames == 23) || (num_of_frames == 28) ||
|
`ETH_MODER_IFG | `ETH_MODER_PRO | `ETH_MODER_BRO,
|
(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);
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// set DIFFERENT mrx_clk to mtx_clk!
|
@(posedge wb_clk);
|
// eth_phy.set_mrx_equal_mtx = 1'b0;
|
|
if(fail == 0)
|
if(fail == 0)
|
test_ok;
|
test_ok;
|
else
|
else
|
fail = 0;
|
fail = 0;
|
end
|
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
|
//// Receive control frames with PASSALL option turned off ////
|
wb_slave.cycle_response(`ACK_RESPONSE, wbs_waits, wbs_retries);
|
//// Using only one RX buffer decriptor ( 10Mbps ). ////
|
|
//// ////
|
|
////////////////////////////////////////////////////////////////////
|
|
if (test_num == 4) //
|
|
begin
|
|
// TEST 4: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )
|
|
test_name = "TEST 4: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )";
|
|
`TIME; $display(" TEST 4: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )");
|
|
|
max_tmp = 0;
|
// unmask interrupts
|
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);
|
wait (wbm_working == 0);
|
wbm_write(`ETH_TX_BD_NUM, 32'h4, 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 |
|
// enable TX and RX, set half-duplex mode, receive small, NO correct IFG
|
`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);
|
wait (wbm_working == 0);
|
wbm_write(`ETH_MODER, `ETH_MODER_TXEN | `ETH_MODER_RXEN | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
|
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,
|
`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 for TX and RX
|
// prepare one control (PAUSE)packet
|
wait (wbm_working == 0);
|
st_data = 8'h00;
|
wbm_read(`ETH_PACKETLEN, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
set_rx_packet(0, 60, 1'b0, 48'h0180_c200_0001, 48'h0708_090A_0B0C, 16'h8808, st_data); // length without CRC
|
max_tmp = tmp[15:0]; // 18 bytes consists of 6B dest addr, 6B source addr, 2B type/len, 4B CRC
|
// prepare one packet of 100 bytes long
|
min_tmp = tmp[31:16];
|
st_data = 8'h1A;
|
st_data = 8'h17;
|
set_rx_packet(64, 100, 1'b0, 48'h1234_5678_8765, 48'hA1B2_C3D4_E5F6, 16'hE77E, st_data);
|
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
|
// 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
|
// 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
|
// 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
|
#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 = 10;
|
|
|
// set TX and RX Buffer Descriptors
|
for (i=0; i<4; i=i+1)
|
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
|
begin
|
// change COLLVALID bits in COLLCONF register
|
// choose generating carrier sense and collision for first and last 64 lengths of frames
|
if ((num_of_frames == 0) && (num_of_iter == 0))
|
case (i)
|
|
0: // Interrupt is generated
|
begin
|
begin
|
|
// enable interrupt generation
|
|
set_rx_bd(127, 127, 1'b1, (`MEMORY_BASE + i));
|
|
// unmask interrupts
|
wait (wbm_working == 0);
|
wait (wbm_working == 0);
|
wbm_read(`ETH_COLLCONF, tmp, 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 |
|
tmp[5:0] = 6'h00; // 6'b00_0000 -> 0 + 1 = 1 byte from preamble
|
`ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wait (wbm_working == 0);
|
// not detect carrier sense in FD and no collision
|
wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
eth_phy.no_carrier_sense_rx_fd_detect(0);
|
$display(" Collision window is set to 1 byte after preamble and SFD");
|
eth_phy.collision(0);
|
end
|
end
|
else if ((num_of_frames == 0) && (num_of_iter == 1))
|
1: // Interrupt is not generated
|
begin
|
begin
|
|
// enable interrupt generation
|
|
set_rx_bd(127, 127, 1'b1, ((`MEMORY_BASE + i) + 64));
|
|
// mask interrupts
|
wait (wbm_working == 0);
|
wait (wbm_working == 0);
|
wbm_read(`ETH_COLLCONF, tmp, 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);
|
tmp[5:0] = 6'h15; // 6'b01_0101 -> 21 + 1 = 22 bytes from preamble
|
// detect carrier sense in FD and no collision
|
wait (wbm_working == 0);
|
eth_phy.no_carrier_sense_rx_fd_detect(1);
|
wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
eth_phy.collision(0);
|
$display(" Collision window is set to 22 bytes after preamble and SFD");
|
|
end
|
end
|
else if ((num_of_frames == 0) && (num_of_iter == 2))
|
2: // Interrupt is not generated
|
begin
|
begin
|
|
// disable interrupt generation
|
|
set_rx_bd(127, 127, 1'b0, (`MEMORY_BASE + i));
|
|
// unmask interrupts
|
wait (wbm_working == 0);
|
wait (wbm_working == 0);
|
wbm_read(`ETH_COLLCONF, tmp, 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 |
|
tmp[5:0] = 6'h2A; // 6'b10_1010 -> 42 + 1 = 43 bytes from preamble
|
`ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wait (wbm_working == 0);
|
// not detect carrier sense in FD and set collision
|
wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
eth_phy.no_carrier_sense_rx_fd_detect(0);
|
$display(" Collision window is set to 43 bytes after preamble and SFD");
|
eth_phy.collision(1);
|
end
|
end
|
else if ((num_of_frames == 0) && (num_of_iter == 3))
|
default: // 3: // Interrupt is not generated
|
begin
|
begin
|
|
// disable interrupt generation
|
|
set_rx_bd(127, 127, 1'b0, ((`MEMORY_BASE + i) + 64));
|
|
// mask interrupts
|
wait (wbm_working == 0);
|
wait (wbm_working == 0);
|
wbm_read(`ETH_COLLCONF, tmp, 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);
|
tmp[5:0] = 6'h3F; // 6'b11_1111 -> 63 + 1 = 64 bytes from preamble
|
// detect carrier sense in FD and set collision
|
wait (wbm_working == 0);
|
eth_phy.no_carrier_sense_rx_fd_detect(1);
|
wbm_write(`ETH_COLLCONF, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
eth_phy.collision(1);
|
$display(" Collision window is set to 64 bytes after preamble and SFD");
|
|
end
|
end
|
|
endcase
|
|
|
|
append_rx_crc (64, 100, 1'b0, 1'b0); // To the second (data) packet
|
//wire MRxDV; // This goes to PHY
|
// set wrap bit
|
//wire MRxErr; // This goes to PHY
|
set_rx_bd_wrap(127);
|
//wire MColl; // This goes to PHY
|
set_rx_bd_empty(127, 127);
|
//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
|
begin
|
wait (MCrs || MTxEn);
|
if (i[0] == 1'b0)
|
#1;
|
#1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 0, 64, 1'b0);
|
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
|
else
|
begin
|
#1 eth_phy.send_rx_packet(64'h0055_5555_5555_5555, 4'h7, 8'hD5, 64, 104, 1'b0);
|
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(10) @(posedge mrx_clk);
|
repeat(8) @(posedge wb_clk);
|
$display("1111");
|
#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
|
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
|
begin
|
check_rx_frame = 1'b1; // RX frame accepted and must be checked
|
#1 check_rx_bd(127, data);
|
if ((i + 8) == 0) // add preamble and SFD length (bytes)
|
$display("aaaa");
|
$display(" ->RX frame, which started before or at beginning of TX frame, was accepted");
|
wait (MRxDV === 1'b1); // start transmit
|
else
|
$display("bbbb");
|
$display(" ->RX frame, which started %0d byte(s) after beginning of TX frame, was accepted", (i + 8));
|
#1 check_rx_bd(127, data);
|
end
|
if (data[15] !== 1)
|
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
|
begin
|
`TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
data[31:16], (i_length + 4));
|
|
test_fail("Wrong length of the packet out from PHY");
|
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check received RX packet data and CRC
|
wait (MRxDV === 1'b0); // end transmit
|
//if ((num_of_frames == 5))
|
$display("cccc");
|
//begin // CRC has 4 bytes for itself
|
while (data[15] === 1)
|
// if (i_length[0] == 1'b1)
|
begin
|
// begin
|
#1 check_rx_bd(127, data);
|
// check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
|
@(posedge wb_clk);
|
// end
|
end
|
// else
|
repeat (1) @(posedge wb_clk);
|
// begin
|
$display("2222");
|
// check_rx_packet(max_tmp, ((`MEMORY_BASE + i_length[1:0]) + max_tmp), (i_length + 4), 1'b0, 1'b0, tmp);
|
end
|
// end
|
join
|
// if (tmp > 0)
|
$display("dddd");
|
// begin
|
// check length of a PACKET
|
// `TIME; $display("*E Wrong data of the received packet");
|
if (data[31:16] != (i_length + 4))
|
// test_fail("Wrong data of the received packet");
|
begin
|
// fail = fail + 1;
|
`TIME; $display("*E Wrong length of the packet out from PHY (%0d instead of %0d)",
|
// end
|
data[31:16], (i_length + 4));
|
//end
|
test_fail("Wrong length of the packet out from PHY");
|
//else
|
fail = fail + 1;
|
//if ((num_of_frames == 10))
|
end
|
//begin // CRC has 4 bytes for itself
|
// checking in the following if statement is performed only for first and last 64 lengths
|
// if (i_length[0] == 1'b1)
|
// check received RX packet data and CRC
|
// 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)
|
if (i_length[0] == 1'b0)
|
begin
|
begin
|
check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
|
check_rx_packet(0, (`MEMORY_BASE + i_length[1:0]), (i_length + 4), 1'b0, 1'b0, tmp);
|
end
|
end
|
else
|
else
|
Line 17244... |
Line 20598... |
begin
|
begin
|
`TIME; $display("*E Wrong data of the received packet");
|
`TIME; $display("*E Wrong data of the received packet");
|
test_fail("Wrong data of the received packet");
|
test_fail("Wrong data of the received packet");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
end
|
|
|
|
// check WB INT signal
|
// check WB INT signal
|
if (num_of_frames >= 3) // Frames smaller than 3 are not received.
|
if (i_length[1:0] == 2'h0)
|
begin // Frames greater then 5 always cause an interrupt (Frame received)
|
begin
|
if (wb_int !== 1'b1) // Frames with length 3 or 4 always cause an interrupt (CRC error)
|
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
|
Line 17265... |
Line 20617... |
`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
|
// check RX buffer descriptor of a packet
|
if (num_of_frames >= min_tmp)
|
check_rx_bd(127, data);
|
begin
|
if (i_length[1] == 1'b0) // interrupt enabled no_carrier_sense_rx_fd_detect
|
if ( (data[15:0] !== 16'h6000) && // wrap bit
|
|
(data[15:0] !== 16'h4000) ) // 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
|
|
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
|
|
else if (num_of_frames > 2)
|
|
begin
|
begin
|
if ( (data[15:0] !== 16'h6006) && // wrap bit
|
if ( ((data[15:0] !== 16'h6000) && (i_length[0] == 1'b0)) ||
|
(data[15:0] !== 16'h4006) ) // without wrap bit
|
((data[15:0] !== 16'h6000) && (i_length[0] == 1'b1)) )
|
begin
|
begin
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
|
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
|
else
|
else // interrupt not enabled
|
begin
|
begin
|
if (data[15] !== 1'b1)
|
if ( ((data[15:0] !== 16'h2000) && (i_length[0] == 1'b0)) ||
|
|
((data[15:0] !== 16'h2000) && (i_length[0] == 1'b1)) )
|
begin
|
begin
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h - len: %0d", data[15:0], num_of_frames);
|
`TIME; $display("*E RX buffer descriptor status is not correct: %0h", data[15:0]);
|
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
|
|
// clear RX buffer descriptor for first 4 frames
|
|
if (i_length < min_tmp)
|
|
clear_rx_bd(127, 127);
|
// check interrupts
|
// check interrupts
|
wait (wbm_working == 0);
|
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 ((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
|
`TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
|
`TIME; $display("*E Interrupt Receive Buffer was not set, interrupt reg: %0h", data);
|
test_fail("Interrupt Receive Buffer was not set");
|
test_fail("Interrupt Receive Buffer was not set");
|
Line 17324... |
Line 20660... |
`TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
|
`TIME; $display("*E Other interrupts (except Receive Buffer) were set, interrupt reg: %0h", data);
|
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
|
else if ((num_of_frames < 3)) // Frames smaller than 3 are not received.
|
|
begin
|
|
if (data) // Checking if any interrupt is pending)
|
|
begin
|
|
`TIME; $display("*E Interrupt(s) is(are) pending although frame was ignored, interrupt reg: %0h", data);
|
|
test_fail("Interrupts were set");
|
|
fail = fail + 1;
|
|
end
|
|
end
|
|
else
|
else
|
begin
|
begin
|
if ((data & `ETH_INT_RXE) !== `ETH_INT_RXE)
|
if (data !== 0)
|
begin
|
|
`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;
|
|
end
|
|
if ((data & (~`ETH_INT_RXE)) !== 0)
|
|
begin
|
begin
|
`TIME; $display("*E Other interrupts (except Receive Buffer Error) were set, interrupt reg: %0h", data);
|
`TIME; $display("*E Any of interrupts (except Receive Buffer) was set, interrupt reg: %0h, len: %0h", data, i_length[1:0]);
|
test_fail("Other interrupts (except Receive Buffer Error) were 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);
|
wait (wbm_working == 0);
|
Line 17358... |
Line 20679... |
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 (num_of_frames == 3)
|
if ((i_length + 4) == (min_tmp + 64))
|
begin
|
|
$display(" using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
|
|
$display(" ->packets with lengths from %0d to %0d are not received (length increasing by 1 byte)",
|
|
0, 3);
|
|
end
|
|
else if (num_of_frames == 9)
|
|
begin
|
|
$display(" using 1 BD out of 8 BDs (120..127) assigned to RX (wrap at 1st BD - RX BD 120)");
|
|
$display(" ->packet with length 4 is not received (length increasing by 1 byte)");
|
|
$display(" ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
|
|
5, 9);
|
|
end
|
|
else if (num_of_frames == 17)
|
|
begin
|
|
$display(" using 4 BDs out of 8 BDs (120..127) assigned to RX (wrap at 4th BD - RX BD 123)");
|
|
$display(" ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
|
|
10, 17);
|
|
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
|
|
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
|
|
else if (num_of_frames == 54)
|
|
begin
|
begin
|
$display(" using 7 BDs out of 8 BDs (120..127) assigned to RX (wrap at 7th BD - RX BD 126)");
|
// starting length is min_tmp, ending length is (min_tmp + 64)
|
$display(" ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
|
$display(" receive small packets is NOT selected");
|
41, 54);
|
$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
|
end
|
else if (num_of_frames == 69)
|
else if ((i_length + 4) == (max_tmp - 16))
|
begin
|
begin
|
$display(" using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
|
// starting length is for +128 longer than previous ending length, while ending length is tmp_data
|
$display(" ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
|
$display(" receive small packets is selected");
|
55, 69);
|
$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
|
end
|
else if (num_of_frames == 69)
|
else if ((i_length + 4) == max_tmp)
|
begin
|
begin
|
$display(" using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
|
$display(" receive small packets is NOT selected");
|
$display(" ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
|
$display(" ->packets with lengths from %0d to %0d (MAXFL) are checked (length increasing by 1 byte)",
|
55, 69);
|
(max_tmp - (4 + 16)), max_tmp);
|
end
|
end
|
else if (num_of_frames == 77)
|
// 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
|
begin
|
$display(" using 8 BDs out of 8 BDs (120..127) assigned to RX (wrap at 8th BD - RX BD 127)");
|
i_length = i_length + 128;
|
$display(" ->packets with lengths from %0d to %0d are checked (length increasing by 1 byte)",
|
tmp_data = i_length + 4; // last tmp_data is ending length
|
70, 77);
|
|
end
|
end
|
// set length (loop variable)
|
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;
|
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
|
else
|
num_of_bd = num_of_bd + 1;
|
begin
|
|
$display("*E TESTBENCH ERROR - WRONG PARAMETERS IN TESTBENCH");
|
|
#10 $stop;
|
|
end
|
end
|
end
|
// disable RX
|
// disable RX
|
wait (wbm_working == 0);
|
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_RECSMALL | `ETH_MODER_IFG |
|
|
`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);
|
|
if(fail == 0)
|
if(fail == 0)
|
test_ok;
|
test_ok;
|
else
|
else
|
fail = 0;
|
fail = 0;
|
end
|
end
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
//// ////
|
//// ////
|
//// Receive control frames with PASSALL option turned off ////
|
//// Receive control frames with PASSALL option turned off ////
|
//// Using only one RX buffer decriptor ( 10Mbps ). ////
|
//// Using only one RX buffer decriptor ( 100Mbps ). ////
|
//// ////
|
//// ////
|
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
if (test_num == 1) //
|
if (test_num == 5) //
|
begin
|
begin
|
// TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )
|
// TEST 5: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 100Mbps )
|
test_name = "TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )";
|
test_name = "TEST 5: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 100Mbps )";
|
`TIME; $display(" TEST 1: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 10Mbps )");
|
`TIME; $display(" TEST 5: RECEIVE CONTROL FRAMES WITH PASSALL OPTION TURNED OFF AT ONE RX BD ( 100Mbps )");
|
|
|
// unmask interrupts
|
// unmask interrupts
|
wait (wbm_working == 0);
|
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);
|
Line 17474... |
Line 20776... |
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;
|
|
|
for (i=0; i<4; i=i+1)
|
for (i=0; i<4; i=i+1)
|
begin
|
begin
|
// 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)
|
Line 17732... |
Line 21034... |
else
|
else
|
fail = 0;
|
fail = 0;
|
end
|
end
|
|
|
|
|
end // for (test_num=start_task; test_num <= end_task; test_num=test_num+1)
|
end
|
|
|
|
|
end
|
end
|
endtask // test_mac_half_duplex_flow
|
endtask // test_mac_half_duplex_flow
|
|
|
|
|
Line 17863... |
Line 21164... |
repeat(2) @(posedge wb_clk);
|
repeat(2) @(posedge wb_clk);
|
#2 wb_rst = 1'b0;
|
#2 wb_rst = 1'b0;
|
end
|
end
|
endtask // hard_reset
|
endtask // hard_reset
|
|
|
task reset_mac; // MAC module
|
|
reg [31:0] tmp;
|
|
reg [31:0] tmp_no_rst;
|
|
begin
|
|
// read MODER register first
|
|
wbm_read(`ETH_MODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// set reset bit - write back to MODER register with RESET bit
|
|
wbm_write(`ETH_MODER, (`ETH_MODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// clear reset bit - write back to MODER register without RESET bit
|
|
tmp_no_rst = `ETH_MODER_RST;
|
|
tmp_no_rst = ~tmp_no_rst;
|
|
wbm_write(`ETH_MODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
end
|
|
endtask // reset_mac
|
|
|
|
task set_tx_bd;
|
task set_tx_bd;
|
input [6:0] tx_bd_num_start;
|
input [6:0] tx_bd_num_start;
|
input [6:0] tx_bd_num_end;
|
input [6:0] tx_bd_num_end;
|
input [15:0] len;
|
input [15:0] len;
|
input irq;
|
input irq;
|
Line 17897... |
Line 21183... |
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
|
|
wait (wbm_working == 0);
|
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
|
|
wait (wbm_working == 0);
|
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
|
|
|
task set_tx_bd_wrap;
|
task set_tx_bd_wrap;
|
input [6:0] tx_bd_num_end;
|
input [6:0] tx_bd_num_end;
|
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;
|
|
wait (wbm_working == 0);
|
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);
|
// set wrap bit to this BD - this BD should be last-one
|
// set wrap bit to this BD - this BD should be last-one
|
|
wait (wbm_working == 0);
|
wbm_write(bd_status_addr, (`ETH_TX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wbm_write(bd_status_addr, (`ETH_TX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
end
|
end
|
endtask // set_tx_bd_wrap
|
endtask // set_tx_bd_wrap
|
|
|
task set_tx_bd_ready;
|
task set_tx_bd_ready;
|
Line 17925... |
Line 21215... |
integer bd_status_addr, tmp;
|
integer bd_status_addr, tmp;
|
begin
|
begin
|
for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
|
for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
|
begin
|
begin
|
bd_status_addr = `TX_BD_BASE + i * 8;
|
bd_status_addr = `TX_BD_BASE + i * 8;
|
|
wait (wbm_working == 0);
|
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);
|
// set empty bit to this BD - this BD should be ready
|
// set empty bit to this BD - this BD should be ready
|
|
wait (wbm_working == 0);
|
wbm_write(bd_status_addr, (`ETH_TX_BD_READY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wbm_write(bd_status_addr, (`ETH_TX_BD_READY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
end
|
end
|
end
|
end
|
endtask // set_tx_bd_ready
|
endtask // set_tx_bd_ready
|
|
|
Line 17938... |
Line 21230... |
input [6:0] tx_bd_num_end;
|
input [6:0] tx_bd_num_end;
|
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;
|
|
wait (wbm_working == 0);
|
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);
|
tx_bd_status = tmp;
|
tx_bd_status = tmp;
|
end
|
end
|
endtask // check_tx_bd
|
endtask // check_tx_bd
|
|
|
Line 17954... |
Line 21247... |
for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
|
for(i = tx_nd_num_strat; i <= tx_bd_num_end; i = i + 1)
|
begin
|
begin
|
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;
|
// clear BD - status
|
// clear BD - status
|
|
wait (wbm_working == 0);
|
wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// clear BD - pointer
|
// clear BD - pointer
|
|
wait (wbm_working == 0);
|
wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
end
|
end
|
end
|
end
|
endtask // clear_tx_bd
|
endtask // clear_tx_bd
|
|
|
Line 17980... |
Line 21275... |
// bd_ptr_addr = bd_status_addr + 4;
|
// bd_ptr_addr = bd_status_addr + 4;
|
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
|
|
wait (wbm_working == 0);
|
// wbm_write(bd_status_addr, 32'h0000c000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
|
// wbm_write(bd_status_addr, 32'h0000c000, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // IRQ + PAD + CRC
|
wbm_write(bd_status_addr, {17'h0, irq, 14'h0},
|
wbm_write(bd_status_addr, {17'h0, irq, 14'h0},
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// initialize BD - pointer
|
// initialize BD - pointer
|
|
wait (wbm_working == 0);
|
// wbm_write(bd_ptr_addr, buf_addr, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing 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, rxpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
|
wbm_write(bd_ptr_addr, rxpnt, 4'hF, 1, wbm_init_waits, wbm_subseq_waits); // Initializing BD-pointer
|
end
|
end
|
end
|
end
|
endtask // set_rx_bd
|
endtask // set_rx_bd
|
Line 17996... |
Line 21293... |
input [6:0] rx_bd_num_end;
|
input [6:0] rx_bd_num_end;
|
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;
|
|
wait (wbm_working == 0);
|
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);
|
// set wrap bit to this BD - this BD should be last-one
|
// set wrap bit to this BD - this BD should be last-one
|
|
wait (wbm_working == 0);
|
wbm_write(bd_status_addr, (`ETH_RX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wbm_write(bd_status_addr, (`ETH_RX_BD_WRAP | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
end
|
end
|
endtask // set_rx_bd_wrap
|
endtask // set_rx_bd_wrap
|
|
|
task set_rx_bd_empty;
|
task set_rx_bd_empty;
|
Line 18012... |
Line 21311... |
begin
|
begin
|
for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
|
for(i = rx_bd_num_strat; i <= rx_bd_num_end; i = i + 1)
|
begin
|
begin
|
// bd_status_addr = `RX_BD_BASE + i * 8;
|
// bd_status_addr = `RX_BD_BASE + i * 8;
|
bd_status_addr = `TX_BD_BASE + i * 8;
|
bd_status_addr = `TX_BD_BASE + i * 8;
|
|
wait (wbm_working == 0);
|
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);
|
// set empty bit to this BD - this BD should be ready
|
// set empty bit to this BD - this BD should be ready
|
|
wait (wbm_working == 0);
|
wbm_write(bd_status_addr, (`ETH_RX_BD_EMPTY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wbm_write(bd_status_addr, (`ETH_RX_BD_EMPTY | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
end
|
end
|
end
|
end
|
endtask // set_rx_bd_empty
|
endtask // set_rx_bd_empty
|
|
|
Line 18026... |
Line 21327... |
output [31:0] rx_bd_status;
|
output [31:0] rx_bd_status;
|
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;
|
|
wait (wbm_working == 0);
|
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);
|
rx_bd_status = tmp;
|
rx_bd_status = tmp;
|
end
|
end
|
endtask // check_rx_bd
|
endtask // check_rx_bd
|
|
|
Line 18043... |
Line 21345... |
begin
|
begin
|
// bd_status_addr = `RX_BD_BASE + i * 8;
|
// bd_status_addr = `RX_BD_BASE + i * 8;
|
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;
|
// clear BD - status
|
// clear BD - status
|
|
wait (wbm_working == 0);
|
wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wbm_write(bd_status_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// clear BD - pointer
|
// clear BD - pointer
|
|
wait (wbm_working == 0);
|
wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wbm_write(bd_ptr_addr, 32'h0, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
end
|
end
|
end
|
end
|
endtask // clear_rx_bd
|
endtask // clear_rx_bd
|
|
|
Line 18141... |
Line 21445... |
data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 1];
|
data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + 1];
|
data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 2];
|
data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 2];
|
i = 3;
|
i = 3;
|
if (data_phy[23:0] !== data_wb[23:0])
|
if (data_phy[23:0] !== data_wb[23:0])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong 1. word (3 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[23:0], data_wb[23:0]);
|
//$display("*E Wrong 1. word (3 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[23:0], data_wb[23:0]);
|
$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
//$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
failure = 1;
|
failure = 1;
|
end
|
end
|
end
|
end
|
else if (addr_wb[1:0] == 2)
|
else if (addr_wb[1:0] == 2)
|
begin
|
begin
|
Line 18156... |
Line 21460... |
data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0]];
|
data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0]];
|
data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 1];
|
data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + 1];
|
i = 2;
|
i = 2;
|
if (data_phy[15:0] !== data_wb[15:0])
|
if (data_phy[15:0] !== data_wb[15:0])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong 1. word (2 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[15:0], data_wb[15:0]);
|
//$display("*E Wrong 1. word (2 bytes) of TX packet! phy: %0h, wb: %0h", data_phy[15:0], data_wb[15:0]);
|
$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
//$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
failure = 1;
|
failure = 1;
|
end
|
end
|
end
|
end
|
else if (addr_wb[1:0] == 3)
|
else if (addr_wb[1:0] == 3)
|
begin
|
begin
|
Line 18170... |
Line 21474... |
data_phy[31: 8] = 0;
|
data_phy[31: 8] = 0;
|
data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0]];
|
data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0]];
|
i = 1;
|
i = 1;
|
if (data_phy[7:0] !== data_wb[7:0])
|
if (data_phy[7:0] !== data_wb[7:0])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong 1. word (1 byte) of TX packet! phy: %0h, wb: %0h", data_phy[7:0], data_wb[7:0]);
|
//$display("*E Wrong 1. word (1 byte) of TX packet! phy: %0h, wb: %0h", data_phy[7:0], data_wb[7:0]);
|
$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
//$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
failure = 1;
|
failure = 1;
|
end
|
end
|
end
|
end
|
else
|
else
|
i = 0;
|
i = 0;
|
Line 18190... |
Line 21494... |
data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
|
data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
|
data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
|
data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
|
|
|
if (data_phy[31:0] !== data_wb[31:0])
|
if (data_phy[31:0] !== data_wb[31:0])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong %d. word (4 bytes) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
|
//$display("*E Wrong %d. word (4 bytes) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
|
$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
//$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
delta_t = !delta_t;
|
delta_t = !delta_t;
|
#1;
|
#1;
|
Line 18208... |
Line 21512... |
data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
|
data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
|
data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
|
data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
|
data_phy[ 7: 0] = 0;
|
data_phy[ 7: 0] = 0;
|
if (data_phy[31:8] !== data_wb[31:8])
|
if (data_phy[31:8] !== data_wb[31:8])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong %d. word (3 bytes) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:8], data_wb[31:8]);
|
//$display("*E Wrong %d. word (3 bytes) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:8], data_wb[31:8]);
|
$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
//$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
else if((len - i) == 2)
|
else if((len - i) == 2)
|
begin
|
begin
|
Line 18223... |
Line 21527... |
data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
|
data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
|
data_phy[15: 8] = 0;
|
data_phy[15: 8] = 0;
|
data_phy[ 7: 0] = 0;
|
data_phy[ 7: 0] = 0;
|
if (data_phy[31:16] !== data_wb[31:16])
|
if (data_phy[31:16] !== data_wb[31:16])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong %d. word (2 bytes) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:16], data_wb[31:16]);
|
//$display("*E Wrong %d. word (2 bytes) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:16], data_wb[31:16]);
|
$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
//$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
else if((len - i) == 1)
|
else if((len - i) == 1)
|
begin
|
begin
|
Line 18238... |
Line 21542... |
data_phy[23:16] = 0;
|
data_phy[23:16] = 0;
|
data_phy[15: 8] = 0;
|
data_phy[15: 8] = 0;
|
data_phy[ 7: 0] = 0;
|
data_phy[ 7: 0] = 0;
|
if (data_phy[31:24] !== data_wb[31:24])
|
if (data_phy[31:24] !== data_wb[31:24])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong %d. word (1 byte) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:24], data_wb[31:24]);
|
//$display("*E Wrong %d. word (1 byte) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:24], data_wb[31:24]);
|
$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
//$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
else if((len - i) == 4)
|
else if((len - i) == 4)
|
begin
|
begin
|
Line 18253... |
Line 21557... |
data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
|
data_phy[23:16] = eth_phy.tx_mem[addr_phy[21:0] + i + 1];
|
data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
|
data_phy[15: 8] = eth_phy.tx_mem[addr_phy[21:0] + i + 2];
|
data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
|
data_phy[ 7: 0] = eth_phy.tx_mem[addr_phy[21:0] + i + 3];
|
if (data_phy[31:0] !== data_wb[31:0])
|
if (data_phy[31:0] !== data_wb[31:0])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong %d. word (4 bytes) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
|
//$display("*E Wrong %d. word (4 bytes) of TX packet! phy: %0h, wb: %0h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
|
$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
//$display(" address phy: %0h, address wb: %0h", addr_phy, addr_wb);
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
else
|
else
|
$display("(%0t)(%m) ERROR", $time);
|
$display("(%0t)(%m) ERROR", $time);
|
Line 18435... |
Line 21739... |
failure = 0;
|
failure = 0;
|
|
|
// First write might not be word allign.
|
// First write might not be word allign.
|
if(addr_wb[1:0] == 1)
|
if(addr_wb[1:0] == 1)
|
begin
|
begin
|
wb_slave.rd_mem(addr_wb - 1, data_wb, 4'h7);
|
wb_slave.rd_mem(addr_wb[21:0] - 1, data_wb, 4'h7);
|
data_phy[31:24] = 0;
|
data_phy[31:24] = 0;
|
data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0]];
|
data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0]];
|
data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + 1];
|
data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + 1];
|
data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 2];
|
data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 2];
|
i = 3;
|
i = 3;
|
if (data_phy[23:0] !== data_wb[23:0])
|
if (data_phy[23:0] !== data_wb[23:0])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display(" addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
|
//$display(" addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
|
$display("*E Wrong 1. word (3 bytes) of RX packet! phy = %h, wb = %h", data_phy[23:0], data_wb[23:0]);
|
//$display("*E Wrong 1. word (3 bytes) of RX packet! phy = %h, wb = %h", data_phy[23:0], data_wb[23:0]);
|
failure = 1;
|
failure = 1;
|
end
|
end
|
end
|
end
|
else if (addr_wb[1:0] == 2)
|
else if (addr_wb[1:0] == 2)
|
begin
|
begin
|
wb_slave.rd_mem(addr_wb - 2, data_wb, 4'h3);
|
wb_slave.rd_mem(addr_wb[21:0] - 2, data_wb, 4'h3);
|
data_phy[31:16] = 0;
|
data_phy[31:16] = 0;
|
data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0]];
|
data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0]];
|
data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 1];
|
data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + 1];
|
i = 2;
|
i = 2;
|
if (data_phy[15:0] !== data_wb[15:0])
|
if (data_phy[15:0] !== data_wb[15:0])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display(" addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
|
//$display(" addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
|
$display("*E Wrong 1. word (2 bytes) of RX packet! phy = %h, wb = %h", data_phy[15:0], data_wb[15:0]);
|
//$display("*E Wrong 1. word (2 bytes) of RX packet! phy = %h, wb = %h", data_phy[15:0], data_wb[15:0]);
|
failure = 1;
|
failure = 1;
|
end
|
end
|
end
|
end
|
else if (addr_wb[1:0] == 3)
|
else if (addr_wb[1:0] == 3)
|
begin
|
begin
|
wb_slave.rd_mem(addr_wb - 3, data_wb, 4'h1);
|
wb_slave.rd_mem(addr_wb[21:0] - 3, data_wb, 4'h1);
|
data_phy[31: 8] = 0;
|
data_phy[31: 8] = 0;
|
data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0]];
|
data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0]];
|
i = 1;
|
i = 1;
|
if (data_phy[7:0] !== data_wb[7:0])
|
if (data_phy[7:0] !== data_wb[7:0])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display(" addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
|
//$display(" addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
|
$display("*E Wrong 1. word (1 byte) of RX packet! phy = %h, wb = %h", data_phy[7:0], data_wb[7:0]);
|
//$display("*E Wrong 1. word (1 byte) of RX packet! phy = %h, wb = %h", data_phy[7:0], data_wb[7:0]);
|
failure = 1;
|
failure = 1;
|
end
|
end
|
end
|
end
|
else
|
else
|
i = 0;
|
i = 0;
|
delta_t = !delta_t;
|
delta_t = !delta_t;
|
|
|
for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
|
for(i = i; i < (len - 4); i = i + 4) // Last 0-3 bytes are not checked
|
begin
|
begin
|
wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
|
wb_slave.rd_mem(addr_wb[21:0] + i, data_wb, 4'hF);
|
data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
|
data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
|
data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
|
data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
|
data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
|
data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
|
data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
|
data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
|
if (data_phy[31:0] !== data_wb[31:0])
|
if (data_phy[31:0] !== data_wb[31:0])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
if (i == 0)
|
//if (i == 0)
|
$display(" addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
|
// $display(" addr_phy = %h, addr_wb = %h", rxpnt_phy, rxpnt_wb);
|
$display("*E Wrong %0d. word (4 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
|
//$display("*E Wrong %0d. word (4 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
delta_t = !delta_t;
|
delta_t = !delta_t;
|
|
|
// Last word
|
// Last word
|
if((len - i) == 3)
|
if((len - i) == 3)
|
begin
|
begin
|
wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
|
wb_slave.rd_mem(addr_wb[21:0] + i, data_wb, 4'hF);
|
data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
|
data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
|
data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
|
data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
|
data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
|
data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
|
if (plus_dribble_nibble)
|
if (plus_dribble_nibble)
|
data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
|
data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
|
else
|
else
|
data_phy[ 7: 0] = 0;
|
data_phy[ 7: 0] = 0;
|
if (data_phy[31:8] !== data_wb[31:8])
|
if (data_phy[31:8] !== data_wb[31:8])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong %0d. word (3 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:8], data_wb[31:8]);
|
//$display("*E Wrong %0d. word (3 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:8], data_wb[31:8]);
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
if (plus_dribble_nibble && successful_dribble_nibble)
|
if (plus_dribble_nibble && successful_dribble_nibble)
|
begin
|
begin
|
if (data_phy[3:0] !== data_wb[3:0])
|
if (data_phy[3:0] !== data_wb[3:0])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
|
//$display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
else if (plus_dribble_nibble && !successful_dribble_nibble)
|
else if (plus_dribble_nibble && !successful_dribble_nibble)
|
begin
|
begin
|
if (data_phy[3:0] === data_wb[3:0])
|
if (data_phy[3:0] === data_wb[3:0])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
|
//$display("*E Wrong dribble nibble in %0d. word (3 bytes) of RX packet!", ((i/4)+1));
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
end
|
end
|
else if((len - i) == 2)
|
else if((len - i) == 2)
|
begin
|
begin
|
wb_slave.rd_mem(addr_wb + i, data_wb, 4'hE);
|
wb_slave.rd_mem(addr_wb[21:0] + i, data_wb, 4'hE);
|
data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
|
data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
|
data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
|
data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
|
if (plus_dribble_nibble)
|
if (plus_dribble_nibble)
|
data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
|
data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
|
else
|
else
|
data_phy[15: 8] = 0;
|
data_phy[15: 8] = 0;
|
data_phy[ 7: 0] = 0;
|
data_phy[ 7: 0] = 0;
|
if (data_phy[31:16] !== data_wb[31:16])
|
if (data_phy[31:16] !== data_wb[31:16])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong %0d. word (2 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:16], data_wb[31:16]);
|
//$display("*E Wrong %0d. word (2 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:16], data_wb[31:16]);
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
if (plus_dribble_nibble && successful_dribble_nibble)
|
if (plus_dribble_nibble && successful_dribble_nibble)
|
begin
|
begin
|
if (data_phy[11:8] !== data_wb[11:8])
|
if (data_phy[11:8] !== data_wb[11:8])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
|
//$display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
else if (plus_dribble_nibble && !successful_dribble_nibble)
|
else if (plus_dribble_nibble && !successful_dribble_nibble)
|
begin
|
begin
|
if (data_phy[11:8] === data_wb[11:8])
|
if (data_phy[11:8] === data_wb[11:8])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
|
//$display("*E Wrong dribble nibble in %0d. word (2 bytes) of RX packet!", ((i/4)+1));
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
end
|
end
|
else if((len - i) == 1)
|
else if((len - i) == 1)
|
begin
|
begin
|
wb_slave.rd_mem(addr_wb + i, data_wb, 4'hC);
|
wb_slave.rd_mem(addr_wb[21:0] + i, data_wb, 4'hC);
|
data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
|
data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
|
if (plus_dribble_nibble)
|
if (plus_dribble_nibble)
|
data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
|
data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
|
else
|
else
|
data_phy[23:16] = 0;
|
data_phy[23:16] = 0;
|
data_phy[15: 8] = 0;
|
data_phy[15: 8] = 0;
|
data_phy[ 7: 0] = 0;
|
data_phy[ 7: 0] = 0;
|
if (data_phy[31:24] !== data_wb[31:24])
|
if (data_phy[31:24] !== data_wb[31:24])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong %0d. word (1 byte) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:24], data_wb[31:24]);
|
//$display("*E Wrong %0d. word (1 byte) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:24], data_wb[31:24]);
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
if (plus_dribble_nibble && successful_dribble_nibble)
|
if (plus_dribble_nibble && successful_dribble_nibble)
|
begin
|
begin
|
if (data_phy[19:16] !== data_wb[19:16])
|
if (data_phy[19:16] !== data_wb[19:16])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
|
//$display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
else if (plus_dribble_nibble && !successful_dribble_nibble)
|
else if (plus_dribble_nibble && !successful_dribble_nibble)
|
begin
|
begin
|
if (data_phy[19:16] === data_wb[19:16])
|
if (data_phy[19:16] === data_wb[19:16])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
|
//$display("*E Wrong dribble nibble in %0d. word (1 byte) of RX packet!", ((i/4)+1));
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
end
|
end
|
else if((len - i) == 4)
|
else if((len - i) == 4)
|
begin
|
begin
|
wb_slave.rd_mem(addr_wb + i, data_wb, 4'hF);
|
wb_slave.rd_mem(addr_wb[21:0] + i, data_wb, 4'hF);
|
data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
|
data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i];
|
data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
|
data_phy[23:16] = eth_phy.rx_mem[addr_phy[21:0] + i + 1];
|
data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
|
data_phy[15: 8] = eth_phy.rx_mem[addr_phy[21:0] + i + 2];
|
data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
|
data_phy[ 7: 0] = eth_phy.rx_mem[addr_phy[21:0] + i + 3];
|
if (data_phy[31:0] !== data_wb[31:0])
|
if (data_phy[31:0] !== data_wb[31:0])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong %0d. word (4 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
|
//$display("*E Wrong %0d. word (4 bytes) of RX packet! phy = %h, wb = %h", ((i/4)+1), data_phy[31:0], data_wb[31:0]);
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
if (plus_dribble_nibble)
|
if (plus_dribble_nibble)
|
begin
|
begin
|
wb_slave.rd_mem(addr_wb + i + 4, data_wb, 4'h8);
|
wb_slave.rd_mem(addr_wb[21:0] + i + 4, data_wb, 4'h8);
|
data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i + 4];
|
data_phy[31:24] = eth_phy.rx_mem[addr_phy[21:0] + i + 4];
|
if (successful_dribble_nibble)
|
if (successful_dribble_nibble)
|
begin
|
begin
|
if (data_phy[27:24] !== data_wb[27:24])
|
if (data_phy[27:24] !== data_wb[27:24])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
|
//$display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
else
|
else
|
begin
|
begin
|
if (data_phy[27:24] === data_wb[27:24])
|
if (data_phy[27:24] === data_wb[27:24])
|
begin
|
begin
|
`TIME;
|
//`TIME;
|
$display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
|
//$display("*E Wrong dribble nibble in %0d. word (0 bytes) of RX packet!", ((i/4)+2));
|
failure = failure + 1;
|
failure = failure + 1;
|
end
|
end
|
end
|
end
|
end
|
end
|
end
|
end
|
Line 19531... |
Line 22835... |
|
|
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
// MIIM Basic tasks
|
// MIIM Basic tasks
|
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
|
|
task reset_mii; // MII module
|
|
reg [31:0] tmp;
|
|
reg [31:0] tmp_no_rst;
|
|
begin
|
|
// read MII mode register first
|
|
wbm_read(`ETH_MIIMODER, tmp, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// set reset bit - write back to MII mode register with RESET bit
|
|
wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_RST | tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
// clear reset bit - write back to MII mode register without RESET bit
|
|
tmp_no_rst = `ETH_MIIMODER_RST;
|
|
tmp_no_rst = ~tmp_no_rst;
|
|
wbm_write(`ETH_MIIMODER, (tmp_no_rst & tmp), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
end
|
|
endtask // reset_mii
|
|
|
|
task mii_set_clk_div; // set clock divider for MII clock
|
task mii_set_clk_div; // set clock divider for MII clock
|
input [7:0] clk_div;
|
input [7:0] clk_div;
|
begin
|
begin
|
// MII mode register
|
// MII mode register
|
wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_CLKDIV & clk_div), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_CLKDIV & clk_div), 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|