Line 40... |
Line 40... |
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//
|
//
|
// CVS Revision History
|
// CVS Revision History
|
//
|
//
|
// $Log: not supported by cvs2svn $
|
// $Log: not supported by cvs2svn $
|
|
// Revision 1.16 2002/10/09 13:16:51 tadejm
|
|
// Just back-up; not completed testbench and some testcases are not
|
|
// wotking properly yet.
|
|
//
|
// Revision 1.15 2002/09/20 14:29:12 tadej
|
// Revision 1.15 2002/09/20 14:29:12 tadej
|
// Full duplex tests modified and testbench bug repaired.
|
// Full duplex tests modified and testbench bug repaired.
|
//
|
//
|
// Revision 1.14 2002/09/18 17:56:38 tadej
|
// Revision 1.14 2002/09/18 17:56:38 tadej
|
// Some additional reports added
|
// Some additional reports added
|
Line 412... |
Line 416... |
// ----------
|
// ----------
|
// test_access_to_mac_reg(0, 3); // 0 - 3
|
// test_access_to_mac_reg(0, 3); // 0 - 3
|
// test_mii(0, 17); // 0 - 17
|
// test_mii(0, 17); // 0 - 17
|
test_note("PHY generates ideal Carrier sense and Collision signals for following tests");
|
test_note("PHY generates ideal Carrier sense and Collision signals for following tests");
|
eth_phy.carrier_sense_real_delay(0);
|
eth_phy.carrier_sense_real_delay(0);
|
test_mac_full_duplex_transmit(0, 21); // 0 - (21)
|
test_mac_full_duplex_transmit(20, 20); // 0 - (21)
|
test_mac_full_duplex_receive(0, 5);
|
// test_mac_full_duplex_receive(0, 5);
|
// test_mac_full_duplex_flow(0, 0);
|
// test_mac_full_duplex_flow(0, 0);
|
|
|
test_note("PHY generates 'real' Carrier sense and Collision signals for following tests");
|
test_note("PHY generates 'real' Carrier sense and Collision signals for following tests");
|
eth_phy.carrier_sense_real_delay(1);
|
eth_phy.carrier_sense_real_delay(1);
|
|
|
Line 9731... |
Line 9735... |
// 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;
|
|
|
num_of_frames = 0; // (0..3) => start under-run on first word
|
num_of_frames = 40; // (0..3) => start under-run on first word
|
num_of_bd = 0;
|
num_of_bd = 0;
|
i_data = 3; // (3) => one BYTE read in first word - FIRST byte
|
i_data = 3; // (3) => one BYTE read in first word - FIRST byte
|
i_length = (min_tmp + 4);
|
i_length = (min_tmp + 4);
|
while (i_length < (max_tmp - 4))
|
while (i_length < (max_tmp - 4))
|
begin
|
begin
|
Line 9754... |
Line 9758... |
set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
|
set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, (`MEMORY_BASE + i_data[1:0]));
|
set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
|
set_tx_bd(1, 1, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
|
set_tx_bd_wrap(1);
|
set_tx_bd_wrap(1);
|
// 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),
|
// wbs_retries[7:0] (RTYs before ACK if RTY response selected)
|
// wbs_retries[7:0] (RTYs before ACK if RTY response selected)
|
#1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h2, 8'h0);
|
#1 wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
|
set_tx_bd_ready(1, 1);
|
set_tx_bd_ready(1, 1);
|
set_tx_bd_ready(0, 0);
|
set_tx_bd_ready(0, 0);
|
end
|
end
|
// frame under-run checking
|
// frame under-run checking
|
frame_started = 0;
|
frame_started = 0;
|
Line 9770... |
Line 9774... |
// in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
|
// in other words 4 bytes are read, since length is MINFL => num_of_frames[31:2] ACKs
|
repeat ((num_of_frames[31:2] + 1'b1)) @(posedge eth_ma_wb_ack_i);
|
repeat ((num_of_frames[31:2] + 1'b1)) @(posedge eth_ma_wb_ack_i);
|
@(negedge eth_ma_wb_ack_i); // wait for last ACK to finish
|
@(negedge eth_ma_wb_ack_i); // wait for last ACK to finish
|
// 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),
|
// wbs_retries[7:0] (RTYs before ACK if RTY response selected)
|
// wbs_retries[7:0] (RTYs before ACK if RTY response selected)
|
#1 wb_slave.cycle_response(`NO_RESPONSE, 3'h7, 8'hFF);
|
#1 wb_slave.cycle_response(`NO_RESPONSE, 3'h0, 8'hFF);
|
// wait for synchronization and some additional clocks
|
// wait for synchronization and some additional clocks
|
wait_for_frame = 1;
|
wait_for_frame = 1;
|
// wait for frame
|
// wait for frame
|
wait ((wait_for_frame == 0) || (frame_started == 1))
|
wait ((wait_for_frame == 0) || (frame_started == 1))
|
if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
|
if ((wait_for_frame == 0) && (frame_started == 0)) // frame didn't start
|
Line 9787... |
Line 9791... |
wait (frame_ended == 1);
|
wait (frame_ended == 1);
|
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),
|
// wbs_retries[7:0] (RTYs before ACK if RTY response selected)
|
// wbs_retries[7:0] (RTYs before ACK if RTY response selected)
|
wb_slave.cycle_response(`ACK_RESPONSE, 3'h2, 8'h0);
|
wb_slave.cycle_response(`ACK_RESPONSE, 3'h0, 8'h0);
|
end
|
end
|
begin: wait_fr
|
begin: wait_fr
|
wait (wait_for_frame == 1)
|
wait (wait_for_frame == 1)
|
begin
|
begin
|
// wait for synchronization and some additional clocks
|
// wait for synchronization and some additional clocks
|
Line 9804... |
Line 9808... |
end
|
end
|
begin: check_fr
|
begin: check_fr
|
// wait for frame to start
|
// wait for frame to start
|
@(posedge MTxEn);
|
@(posedge MTxEn);
|
frame_started = 1;
|
frame_started = 1;
|
$display(" Under-run (on %0d. byte) frame started", (num_of_frames + 1));
|
`TIME; $display(" Under-run (on %0d. byte) frame started", (num_of_frames + 1));
|
// wait for frame to end due to under-run
|
// wait for frame to end due to under-run
|
@(negedge MTxEn);
|
@(negedge MTxEn);
|
frame_ended = 1;
|
frame_ended = 1;
|
$display(" Under-run frame ended");
|
`TIME; $display(" Under-run frame ended");
|
end
|
end
|
join
|
join
|
// wait for first transmit to end, if under-run didn't happen
|
// wait for first transmit to end, if under-run didn't happen
|
if (frame_ended == 0)
|
if (frame_ended == 0)
|
begin
|
begin
|
Line 9835... |
Line 9839... |
// check length of a first PACKET
|
// check length of a first PACKET
|
tmp_len = eth_phy.tx_len;
|
tmp_len = eth_phy.tx_len;
|
#1;
|
#1;
|
if (tmp_len != (i_length + 4))
|
if (tmp_len != (i_length + 4))
|
begin
|
begin
|
test_fail("Wrong length of second packet out from MAC");
|
`TIME; $display("*E Wrong length of first packet out from MAC");
|
|
test_fail("Wrong length of first packet out from MAC");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// checking first packet
|
// checking first packet
|
check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
|
check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (i_length), tmp);
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
test_fail("Wrong data of second transmitted packet");
|
`TIME; $display("*E Wrong data of first transmitted packet");
|
|
test_fail("Wrong data of first transmitted packet");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check first transmited TX packet CRC
|
// check first transmited TX packet CRC
|
check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
|
check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
test_fail("Wrong CRC of second transmitted packet");
|
`TIME; $display("*E Wrong CRC of first transmitted packet");
|
|
test_fail("Wrong CRC of first transmitted packet");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check WB INT signal
|
// check WB INT signal
|
if (wb_int !== 1'b1)
|
if (wb_int !== 1'b1)
|
begin
|
begin
|
Line 9891... |
Line 9898... |
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
|
end
|
end
|
|
else
|
|
begin
|
|
// CHECK FIRST FRAME
|
|
// check length of a first PACKET
|
|
tmp_len = eth_phy.tx_len_err;
|
|
#1;
|
|
if (tmp_len != (num_of_frames + (4 - i_data)))
|
|
begin
|
|
`TIME; $display("*E Wrong length of first packet out from MAC");
|
|
test_fail("Wrong length of first packet out from MAC");
|
|
fail = fail + 1;
|
|
end
|
|
// checking first packet
|
|
check_tx_packet((`MEMORY_BASE + i_data[1:0]), 0, (num_of_frames), tmp);
|
|
if (tmp > 0)
|
|
begin
|
|
`TIME; $display("*E Wrong data of first transmitted packet");
|
|
test_fail("Wrong data of first transmitted packet");
|
|
fail = fail + 1;
|
|
end
|
|
// 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 TX buffer descriptor of a packet
|
|
check_tx_bd(num_of_bd, data);
|
|
if ( ((data[15:0] !== 16'h7900) && (num_of_bd == 1)) || // under-run, wrap bit
|
|
((data[15:0] !== 16'h5900) && (num_of_bd < 1)) ) // under-run, without wrap bit
|
|
begin
|
|
`TIME; $display("*E TX buffer descriptor status is not correct: %0h", data[15:0]);
|
|
test_fail("TX buffer descriptor status is not correct");
|
|
fail = fail + 1;
|
|
end
|
|
// check interrupts
|
|
wbm_read(`ETH_INT, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
if ((data & `ETH_INT_TXE) !== 2'b10)
|
|
begin
|
|
`TIME; $display("*E Interrupt Transmit Error was not set, interrupt reg: %0h", data);
|
|
test_fail("Interrupt Transmit Buffer was not set");
|
|
fail = fail + 1;
|
|
end
|
|
if ((data & (~`ETH_INT_TXE)) !== 0)
|
|
begin
|
|
`TIME; $display("*E Other interrupts (except Transmit Error) were set, interrupt reg: %0h", data);
|
|
test_fail("Other interrupts (except Transmit Buffer) were set");
|
|
fail = fail + 1;
|
|
end
|
|
// clear interrupts
|
|
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
|
|
end
|
num_of_bd = num_of_bd + 1;
|
num_of_bd = num_of_bd + 1;
|
// destination address on ethernet PHY
|
// destination address on ethernet PHY
|
eth_phy.set_tx_mem_addr(0);
|
eth_phy.set_tx_mem_addr(0);
|
// WAIT FOR FIRST TRANSMIT
|
// WAIT FOR SECOND 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
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
|
Line 9911... |
Line 9977... |
@(posedge wb_clk);
|
@(posedge wb_clk);
|
end
|
end
|
repeat (1) @(posedge wb_clk);
|
repeat (1) @(posedge wb_clk);
|
// CHECK SECOND FRAME
|
// CHECK SECOND FRAME
|
// check length of a second PACKET
|
// check length of a second PACKET
|
|
if (frame_ended == 1'b1)
|
|
begin
|
|
`TIME; $display(" Second frame after under-run ended");
|
|
end
|
tmp_len = eth_phy.tx_len;
|
tmp_len = eth_phy.tx_len;
|
#1;
|
#1;
|
if (tmp_len != (i_length + 4))
|
if (tmp_len != (i_length + 4))
|
begin
|
begin
|
|
`TIME; $display("*E Wrong length of second packet out from MAC");
|
test_fail("Wrong length of second packet out from MAC");
|
test_fail("Wrong length of second packet out from MAC");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// checking second packet
|
// checking second packet
|
check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
|
check_tx_packet(`MEMORY_BASE, 0, (i_length), tmp);
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
|
`TIME; $display("*E Wrong data of second transmitted packet");
|
test_fail("Wrong data of second transmitted packet");
|
test_fail("Wrong data of second transmitted packet");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check second transmited TX packet CRC
|
// check second transmited TX packet CRC
|
check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
|
check_tx_crc(0, (i_length), 1'b0, tmp); // length without CRC
|
if (tmp > 0)
|
if (tmp > 0)
|
begin
|
begin
|
|
`TIME; $display("*E Wrong CRC of second transmitted packet");
|
test_fail("Wrong CRC of second transmitted packet");
|
test_fail("Wrong CRC of second transmitted packet");
|
fail = fail + 1;
|
fail = fail + 1;
|
end
|
end
|
// check WB INT signal
|
// check WB INT signal
|
if (wb_int !== 1'b1)
|
if (wb_int !== 1'b1)
|
Line 9976... |
Line 10049... |
i_data = i_data - 1;
|
i_data = i_data - 1;
|
// the number of frame transmitted
|
// the number of frame transmitted
|
num_of_frames = num_of_frames + 1;
|
num_of_frames = num_of_frames + 1;
|
num_of_bd = 0;
|
num_of_bd = 0;
|
// set length (LOOP variable)
|
// set length (LOOP variable)
|
if (num_of_frames == i_length + 4) // 64 => this vas last Byte (1st .. 64th) when i_length = min_tmp - 4
|
if (num_of_frames == i_length + 4) // 64 => this was last Byte (1st .. 64th) when i_length = min_tmp - 4
|
i_length = (max_tmp - 4);
|
i_length = (max_tmp - 4);
|
@(posedge wb_clk);
|
@(posedge wb_clk);
|
end
|
end
|
// disable TX
|
// disable TX
|
wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
|
wbm_write(`ETH_MODER, `ETH_MODER_FULLD | `ETH_MODER_PAD | `ETH_MODER_CRCEN,
|
Line 10473... |
Line 10546... |
// unmask interrupts
|
// unmask interrupts
|
wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
|
wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
|
`ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
`ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// set all buffer descriptors to TX - must be set before RX enable
|
// set all buffer descriptors to TX - must be set before RX enable
|
wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// enable RX, set full-duplex mode, padding and CRC appending
|
// enable RX, set full-duplex mode, receive small, NO correct IFG
|
wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
|
wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
|
// write to phy's control register for 10Mbps
|
// write to phy's control register for 10Mbps
|
Line 10558... |
Line 10631... |
// unmask interrupts
|
// unmask interrupts
|
wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
|
wbm_write(`ETH_INT_MASK, `ETH_INT_TXB | `ETH_INT_TXE | `ETH_INT_RXB | `ETH_INT_RXE | `ETH_INT_BUSY |
|
`ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
`ETH_INT_TXC | `ETH_INT_RXC, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// set all buffer descriptors to TX - must be set before RX enable
|
// set all buffer descriptors to TX - must be set before RX enable
|
wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
wbm_write(`ETH_TX_BD_NUM, 32'h80, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
// enable RX, set full-duplex mode, padding and CRC appending
|
// enable RX, set full-duplex mode, receive small, NO correct IFG
|
wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
|
wbm_write(`ETH_MODER, `ETH_MODER_RXEN | `ETH_MODER_FULLD | `ETH_MODER_RECSMALL | `ETH_MODER_IFG |
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
`ETH_MODER_PRO | `ETH_MODER_BRO,
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
|
|
|
// write to phy's control register for 100Mbps
|
// write to phy's control register for 100Mbps
|