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

Subversion Repositories ethmac

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 314 to Rev 315
    Reverse comparison

Rev 314 → Rev 315

/trunk/bench/verilog/tb_ethernet.v
42,6 → 42,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.30 2003/10/17 07:45:17 markom
// mbist signals updated according to newest convention
//
// Revision 1.29 2003/08/20 12:06:24 mohor
// Artisan RAMs added.
//
180,9 → 183,10
wire [3:0] eth_ma_wb_sel_o;
wire eth_ma_wb_we_o, eth_ma_wb_cyc_o, eth_ma_wb_stb_o, eth_ma_wb_ack_i, eth_ma_wb_err_i;
 
wire [2:0] eth_ma_wb_cti_o;
wire [1:0] eth_ma_wb_bte_o;
 
 
 
// Connecting Ethernet top module
eth_top eth_top
(
199,6 → 203,10
.m_wb_dat_i(eth_ma_wb_dat_i), .m_wb_dat_o(eth_ma_wb_dat_o), .m_wb_cyc_o(eth_ma_wb_cyc_o),
.m_wb_stb_o(eth_ma_wb_stb_o), .m_wb_ack_i(eth_ma_wb_ack_i), .m_wb_err_i(eth_ma_wb_err_i),
 
`ifdef ETH_WISHBONE_B3
.m_wb_cti_o(eth_ma_wb_cti_o), .m_wb_bte_o(eth_ma_wb_bte_o),
`endif
 
//TX
.mtx_clk_pad_i(mtx_clk), .mtxd_pad_o(MTxD), .mtxen_pad_o(MTxEn), .mtxerr_pad_o(MTxErr),
 
291,7 → 299,7
.SEL_I(eth_ma_wb_sel_o),
.STB_I(eth_ma_wb_stb_o),
.WE_I (eth_ma_wb_we_o),
.CAB_I(1'b0) // inactive (1'b0)
.CAB_I(1'b0)
);
 
 
318,8 → 326,17
.STB_O(eth_sl_wb_stb_i),
.WE_O (eth_sl_wb_we_i),
.TAG_I({`WB_TAG_WIDTH{1'b0}}),
.TAG_O(),
`ifdef ETH_WISHBONE_B3
.TAG_O({eth_ma_wb_cti_o, eth_ma_wb_bte_o}),
`else
.TAG_O(5'h0),
`endif
.CAB_O(1'b0),
`ifdef ETH_WISHBONE_B3
.check_CTI (1'b1),
`else
.check_CTI (1'b0),
`endif
.log_file_desc (wb_s_mon_log_file_desc)
);
 
341,8 → 358,9
.STB_O(eth_ma_wb_stb_o),
.WE_O (eth_ma_wb_we_o),
.TAG_I({`WB_TAG_WIDTH{1'b0}}),
.TAG_O(),
.TAG_O(5'h0),
.CAB_O(1'b0),
.check_CTI(1'b0), // NO need
.log_file_desc(wb_m_mon_log_file_desc)
);
 
475,13 → 493,15
 
// Call tests
// ----------
// test_access_to_mac_reg(0, 0); // 0 - 3
// test_mii(0, 17); // 0 - 17
test_access_to_mac_reg(0, 4); // 0 - 4
test_mii(0, 17); // 0 - 17
test_note("PHY generates ideal Carrier sense and Collision signals for following tests");
eth_phy.carrier_sense_real_delay(0);
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, 4); // 0 - 4
// test_mac_full_duplex_transmit(0, 21); // 0 - (21)
 
 
// test_mac_full_duplex_receive(2, 2); // 0 - 13
// test_mac_full_duplex_flow_control(0, 4); // 0 - 4
// 4 is executed, everything is OK
// test_mac_half_duplex_flow(0, 0);
 
527,6 → 547,8
integer test_num;
reg [31:0] addr;
reg [31:0] data;
reg [3:0] sel;
reg [3:0] rand_sel;
reg [31:0] data_max;
begin
// ACCESS TO MAC REGISTERS TEST
537,9 → 559,6
 
// reset MAC registers
hard_reset;
// reset MAC and MII LOGIC with soft reset
//reset_mac;
//reset_mii;
 
 
//////////////////////////////////////////////////////////////////////
546,11 → 565,12
//// ////
//// test_access_to_mac_reg: ////
//// ////
//// 0: Walking 1 with single cycles across MAC regs. ////
//// 1: Walking 1 with single cycles across MAC buffer descript. ////
//// 2: Test max reg. values and reg. values after writing ////
//// 0: Byte selects on 3 32-bit RW registers. ////
//// 1: Walking 1 with single cycles across MAC regs. ////
//// 2: Walking 1 with single cycles across MAC buffer descript. ////
//// 3: Test max reg. values and reg. values after writing ////
//// inverse reset values and hard reset of the MAC ////
//// 3: Test buffer desc. RAM preserving values after hard reset ////
//// 4: Test buffer desc. RAM preserving values after hard reset ////
//// of the MAC and resetting the logic ////
//// ////
//////////////////////////////////////////////////////////////////////
559,206 → 579,313
 
////////////////////////////////////////////////////////////////////
//// ////
//// Walking 1 with single cycles across MAC regs. ////
//// Byte selects on 4 32-bit RW registers. ////
//// ////
////////////////////////////////////////////////////////////////////
if (test_num == 0) // Walking 1 with single cycles across MAC regs.
begin
// TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
test_name = "TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
`TIME; $display(" TEST 0: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC 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 )";
`TIME; $display(" TEST 0: BYTE SELECTS ON 3 32-BIT READ-WRITE REGISTERS ( VARIOUS BUS DELAYS )");
data = 0;
for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
rand_sel = 0;
sel = 0;
for (i = 1; i <= 3; i = i + 1) // num of active byte selects at each register
begin
wbm_init_waits = 0;
wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
case (i)
1: i_addr = `ETH_MAC_ADDR0;
2: i_addr = `ETH_HASH_ADDR0;
default: i_addr = `ETH_HASH_ADDR1;
endcase
addr = `ETH_BASE + i_addr;
sel = 4'hF;
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data !== 32'h0)
begin
wbm_init_waits = i;
wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
for (i_addr = 0; i_addr <= 32'h4C; i_addr = i_addr + 4) // register address
fail = fail + 1;
test_fail_num("Register default value is not ZERO", i_addr);
`TIME;
$display("Register default value is not ZERO - addr %h, tmp_data %h", addr, tmp_data);
end
for (i1 = 0; i1 <= 3; i1 = i1 + 1) // position of first active byte select
begin
case ({i, i1})
10: sel = 4'b0001; // data = 32'hFFFF_FF00;
11: sel = 4'b0010; // data = 32'hFFFF_00FF;
12: sel = 4'b0100; // data = 32'hFF00_FFFF;
13: sel = 4'b1000; // data = 32'h00FF_FFFF;
20: sel = 4'b0011; // data = 32'hFFFF_0000;
21: sel = 4'b0110; // data = 32'hFF00_00FF;
22: sel = 4'b1100; // data = 32'h0000_FFFF;
23: sel = 4'b1001; // data = 32'h00FF_FF00;
30: sel = 4'b0111; // data = 32'hFF00_0000;
31: sel = 4'b1110; // data = 32'h0000_00FF;
32: sel = 4'b1101; // data = 32'h0000_FF00;
default: sel = 4'b1011; // data = 32'h00FF_0000;
endcase
// set value to 32'hFFFF_FFFF
data = 32'hFFFF_FFFF;
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
wait (wbm_working == 0);
wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data !== data)
begin
fail = fail + 1;
test_fail_num("Register could not be written to FFFF_FFFF", i_addr);
`TIME;
$display("Register could not be written to FFFF_FFFF - addr %h, tmp_data %h", addr, tmp_data);
end
// write appropriate byte(s) to 0
data = 32'h0;
wbm_write(addr, data, sel, 1, wbm_init_waits, wbm_subseq_waits);
wait (wbm_working == 0);
if (i1[0])
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
else
wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
data = {({8{~sel[3]}}), ({8{~sel[2]}}), ({8{~sel[1]}}), ({8{~sel[0]}})};
if (tmp_data !== data)
begin
fail = fail + 1;
test_fail_num("Wrong data read out form register", i_addr);
`TIME;
$display("Wrong data read out from register - addr %h, data %h, tmp_data %h, sel %b",
addr, data, tmp_data, sel);
end
end
end
if(fail == 0)
test_ok;
else
fail = 0; // Errors were reported previously
end
 
 
////////////////////////////////////////////////////////////////////
//// ////
//// Walking 1 with single cycles across MAC regs. ////
//// ////
////////////////////////////////////////////////////////////////////
if (test_num == 1) // Walking 1 with single cycles across MAC regs.
begin
// 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 )");
data = 0;
rand_sel = 0;
sel = 0;
for (i_addr = 0; i_addr <= {22'h0, `ETH_TX_CTRL_ADR, 2'h0}; i_addr = i_addr + 4) // register address
begin
if (i_addr[6:4] < 5)
wbm_init_waits = i_addr[6:4];
else
wbm_init_waits = 4;
wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
addr = `ETH_BASE + i_addr;
// set ranges of R/W bits
case (addr)
`ETH_MODER:
begin
bit_start_1 = 0;
bit_end_1 = 16;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_INT: // READONLY - tested within INT test
begin
bit_start_1 = 32; // not used
bit_end_1 = 32; // not used
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_INT_MASK:
begin
bit_start_1 = 0;
bit_end_1 = 6;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_IPGT:
begin
bit_start_1 = 0;
bit_end_1 = 6;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_IPGR1:
begin
bit_start_1 = 0;
bit_end_1 = 6;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_IPGR2:
begin
bit_start_1 = 0;
bit_end_1 = 6;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_PACKETLEN:
begin
bit_start_1 = 0;
bit_end_1 = 31;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_COLLCONF:
begin
bit_start_1 = 0;
bit_end_1 = 5;
bit_start_2 = 16;
bit_end_2 = 19;
end
`ETH_TX_BD_NUM:
begin
bit_start_1 = 0;
bit_end_1 = 7;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_CTRLMODER:
begin
bit_start_1 = 0;
bit_end_1 = 2;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MIIMODER:
begin
bit_start_1 = 0;
bit_end_1 = 8;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
begin
bit_start_1 = 32; // not used
bit_end_1 = 32; // not used
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MIIADDRESS:
begin
bit_start_1 = 0;
bit_end_1 = 4;
bit_start_2 = 8;
bit_end_2 = 12;
end
`ETH_MIITX_DATA:
begin
bit_start_1 = 0;
bit_end_1 = 15;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MIIRX_DATA: // READONLY - tested within MIIM test
begin
bit_start_1 = 32; // not used
bit_end_1 = 32; // not used
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MIISTATUS: // READONLY - tested within MIIM test
begin
bit_start_1 = 32; // not used
bit_end_1 = 32; // not used
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MAC_ADDR0:
begin
bit_start_1 = 0;
bit_end_1 = 31;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MAC_ADDR1:
begin
bit_start_1 = 0;
bit_end_1 = 15;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_HASH_ADDR0:
begin
bit_start_1 = 0;
bit_end_1 = 31;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_HASH_ADDR1:
begin
bit_start_1 = 0;
bit_end_1 = 31;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
default: // `ETH_TX_CTRL_ADR:
begin
bit_start_1 = 0;
bit_end_1 = 16;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
endcase
for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
begin
data = 1'b1 << i_data;
if ( (addr == `ETH_MIICOMMAND)/* && (i_data <= 2)*/ ) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
;
else
begin
rand_sel[2:0] = {$random} % 8;
if ((i_data >= 0) && (i_data < 8))
sel = {rand_sel[2:0], 1'b1};
else if ((i_data >= 8) && (i_data < 16))
sel = {rand_sel[2:1], 1'b1, rand_sel[0]};
else if ((i_data >= 16) && (i_data < 24))
sel = {rand_sel[2], 1'b1, rand_sel[1:0]};
else // if ((i_data >= 24) && (i_data < 32))
sel = {1'b1, rand_sel[2:0]};
wbm_write(addr, data, sel, 1, wbm_init_waits, wbm_subseq_waits);
wait (wbm_working == 0);
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
begin
addr = `ETH_BASE + i_addr;
// set ranges of R/W bits
case (addr)
`ETH_MODER:
begin
bit_start_1 = 0;
bit_end_1 = 16;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_INT: // READONLY - tested within INT test
begin
bit_start_1 = 32; // not used
bit_end_1 = 32; // not used
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_INT_MASK:
begin
bit_start_1 = 0;
bit_end_1 = 6;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_IPGT:
begin
bit_start_1 = 0;
bit_end_1 = 6;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_IPGR1:
begin
bit_start_1 = 0;
bit_end_1 = 6;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_IPGR2:
begin
bit_start_1 = 0;
bit_end_1 = 6;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_PACKETLEN:
begin
bit_start_1 = 0;
bit_end_1 = 31;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_COLLCONF:
begin
bit_start_1 = 0;
bit_end_1 = 5;
bit_start_2 = 16;
bit_end_2 = 19;
end
`ETH_TX_BD_NUM:
begin
bit_start_1 = 0;
bit_end_1 = 7;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_CTRLMODER:
begin
bit_start_1 = 0;
bit_end_1 = 2;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MIIMODER:
begin
bit_start_1 = 0;
bit_end_1 = 9;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
begin
bit_start_1 = 32; // not used
bit_end_1 = 32; // not used
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MIIADDRESS:
begin
bit_start_1 = 0;
bit_end_1 = 4;
bit_start_2 = 8;
bit_end_2 = 12;
end
`ETH_MIITX_DATA:
begin
bit_start_1 = 0;
bit_end_1 = 15;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MIIRX_DATA: // READONLY - tested within MIIM test
begin
bit_start_1 = 32; // not used
bit_end_1 = 32; // not used
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MIISTATUS: // READONLY - tested within MIIM test
begin
bit_start_1 = 32; // not used
bit_end_1 = 32; // not used
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MAC_ADDR0:
begin
bit_start_1 = 0;
bit_end_1 = 31;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_MAC_ADDR1:
begin
bit_start_1 = 0;
bit_end_1 = 15;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
`ETH_HASH_ADDR0:
begin
bit_start_1 = 0;
bit_end_1 = 31;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
default: // `ETH_HASH_ADDR1:
begin
bit_start_1 = 0;
bit_end_1 = 31;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
endcase
for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
begin
data = 1'b1 << i_data;
if ( (addr == `ETH_MIICOMMAND) && (i_data <= 2) ) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
;
else
begin
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
wait (wbm_working == 0);
wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
begin
if (tmp_data !== data)
begin
fail = fail + 1;
test_fail("RW bit of the MAC register was not written or not read");
`TIME;
$display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
wbm_init_waits, addr, data, tmp_data);
end
end
else // data should not be equal to tmp_data
begin
if (tmp_data === data)
begin
fail = fail + 1;
test_fail("NON RW bit of the MAC register was written, but it shouldn't be");
`TIME;
$display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
wbm_init_waits, addr, data, tmp_data);
end
end
end
end
if ( ((tmp_data[31:24] !== data[31:24]) && sel[3]) || ((tmp_data[23:16] !== data[23:16]) && sel[2]) ||
((tmp_data[15: 8] !== data[15: 8]) && sel[1]) || ((tmp_data[ 7: 0] !== data[ 7: 0]) && sel[0]) )
begin
fail = fail + 1;
test_fail_num("RW bit of the MAC register was not written or not read", i_addr);
`TIME;
$display("Wrong RW bit - wbm_init_waits %d, addr %h, data %h, tmp_data %h, sel %b",
wbm_init_waits, addr, data, tmp_data, sel);
end
end
else // data should not be equal to tmp_data
begin
if ( ((tmp_data[31:24] === data[31:24]) && sel[3]) && ((tmp_data[23:16] === data[23:16]) && sel[2]) &&
((tmp_data[15: 8] === data[15: 8]) && sel[1]) && ((tmp_data[ 7: 0] === data[ 7: 0]) && sel[0]) )
begin
fail = fail + 1;
test_fail_num("NON RW bit of the MAC register was written, but it shouldn't be", i_addr);
`TIME;
$display("Wrong NON RW bit - wbm_init_waits %d, addr %h, data %h, tmp_data %h, sel %b",
wbm_init_waits, addr, data, tmp_data, sel);
end
end
end
end
end
// INTERMEDIATE DISPLAYS (The only one)
$display(" ->buffer descriptors tested with 0, 1, 2, 3 and 4 bus delay cycles");
$display(" ->registers tested with 0, 1, 2, 3 and 4 bus delay cycles");
if(fail == 0)
test_ok;
else
771,108 → 898,121
//// Walking 1 with single cycles across MAC buffer descript. ////
//// ////
////////////////////////////////////////////////////////////////////
if (test_num == 1) // Start Walking 1 with single cycles across MAC buffer descript.
if (test_num == 2) // Start Walking 1 with single cycles across MAC buffer descript.
begin
// TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )
test_name = "TEST 1: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )";
`TIME; $display(" TEST 1: '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 )";
`TIME; $display(" TEST 2: 'WALKING ONE' WITH SINGLE CYCLES ACROSS MAC BUFFER DESC. ( VARIOUS BUS DELAYS )");
data = 0;
rand_sel = 0;
sel = 0;
// set TX and RX buffer descriptors
tx_bd_num = 32'h40;
wbm_write(`ETH_TX_BD_NUM, tx_bd_num, 4'hF, 1, 0, 0);
for (i = 0; i <= 4; i = i + 1) // for initial wait cycles on WB bus
for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
begin
wbm_init_waits = i;
if (i_addr[11:8] < 8)
wbm_init_waits = i_addr[10:8] - 3'h4;
else
wbm_init_waits = 3;
wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
addr = `ETH_BASE + i_addr;
if (i_addr < (32'h400 + (tx_bd_num << 3))) // TX buffer descriptors
begin
addr = `ETH_BASE + i_addr;
if (i_addr < (32'h400 + (tx_bd_num << 3))) // TX buffer descriptors
// set ranges of R/W bits
case (addr[3])
1'b0: // buffer control bits
begin
bit_start_1 = 0;
bit_end_1 = 31; // 8;
bit_start_2 = 11;
bit_end_2 = 31;
end
default: // 1'b1: // buffer pointer
begin
bit_start_1 = 0;
bit_end_1 = 31;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
endcase
end
else // RX buffer descriptors
begin
// set ranges of R/W bits
case (addr[3])
1'b0: // buffer control bits
begin
bit_start_1 = 0;
bit_end_1 = 31; // 7;
bit_start_2 = 13;
bit_end_2 = 31;
end
default: // 1'b1: // buffer pointer
begin
bit_start_1 = 0;
bit_end_1 = 31;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
endcase
end
for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
begin
data = 1'b1 << i_data;
if ( (addr[3] == 0) && (i_data == 15) ) // DO NOT WRITE to this bit !!!
;
else
begin
// set ranges of R/W bits
case (addr[3])
1'b0: // buffer control bits
rand_sel[2:0] = {$random} % 8;
if ((i_data >= 0) && (i_data < 8))
sel = {rand_sel[2:0], 1'b1};
else if ((i_data >= 8) && (i_data < 16))
sel = {rand_sel[2:1], 1'b1, rand_sel[0]};
else if ((i_data >= 16) && (i_data < 24))
sel = {rand_sel[2], 1'b1, rand_sel[1:0]};
else // if ((i_data >= 24) && (i_data < 32))
sel = {1'b1, rand_sel[2:0]};
wbm_write(addr, data, sel, 1, wbm_init_waits, wbm_subseq_waits);
wbm_read(addr, tmp_data, sel, 1, wbm_init_waits, wbm_subseq_waits);
if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
begin
if ( ((tmp_data[31:24] !== data[31:24]) && sel[3]) || ((tmp_data[23:16] !== data[23:16]) && sel[2]) ||
((tmp_data[15: 8] !== data[15: 8]) && sel[1]) || ((tmp_data[ 7: 0] !== data[ 7: 0]) && sel[0]) )
begin
bit_start_1 = 0;
bit_end_1 = 31; // 8;
bit_start_2 = 11;
bit_end_2 = 31;
fail = fail + 1;
test_fail("RW bit of the MAC buffer descriptors was not written or not read");
`TIME;
$display("Wrong RW bit - wbm_init_waits %d, addr %h, data %h, tmp_data %h, sel %b",
wbm_init_waits, addr, data, tmp_data, sel);
end
default: // 1'b1: // buffer pointer
begin
bit_start_1 = 0;
bit_end_1 = 31;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
endcase
end
else // RX buffer descriptors
begin
// set ranges of R/W bits
case (addr[3])
1'b0: // buffer control bits
begin
bit_start_1 = 0;
bit_end_1 = 31; // 7;
bit_start_2 = 13;
bit_end_2 = 31;
end
default: // 1'b1: // buffer pointer
begin
bit_start_1 = 0;
bit_end_1 = 31;
bit_start_2 = 32; // not used
bit_end_2 = 32; // not used
end
endcase
end
for (i_data = 0; i_data <= 31; i_data = i_data + 1) // the position of walking one
begin
data = 1'b1 << i_data;
if ( (addr[3] == 0) && (i_data == 15) ) // DO NOT WRITE to this bit !!!
;
else
end
else // data should not be equal to tmp_data
begin
wbm_write(addr, data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
wbm_read(addr, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
if ( ((i_data >= bit_start_1) && (i_data <= bit_end_1)) ||
((i_data >= bit_start_2) && (i_data <= bit_end_2)) ) // data should be equal to tmp_data
if ( ((tmp_data[31:24] === data[31:24]) && sel[3]) && ((tmp_data[23:16] === data[23:16]) && sel[2]) &&
((tmp_data[15: 8] === data[15: 8]) && sel[1]) && ((tmp_data[ 7: 0] === data[ 7: 0]) && sel[0]) )
begin
if (tmp_data !== data)
begin
fail = fail + 1;
test_fail("RW bit of the MAC buffer descriptors was not written or not read");
`TIME;
$display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
wbm_init_waits, addr, data, tmp_data);
end
fail = fail + 1;
test_fail("NON RW bit of the MAC buffer descriptors was written, but it shouldn't be");
`TIME;
$display("Wrong NON RW bit - wbm_init_waits %d, addr %h, data %h, tmp_data %h, sel %b",
wbm_init_waits, addr, data, tmp_data, sel);
end
else // data should not be equal to tmp_data
begin
if (tmp_data === data)
begin
fail = fail + 1;
test_fail("NON RW bit of the MAC buffer descriptors was written, but it shouldn't be");
`TIME;
$display("wbm_init_waits %d, addr %h, data %h, tmp_data %h",
wbm_init_waits, addr, data, tmp_data);
end
end
end
end
end
// INTERMEDIATE DISPLAYS
case (i)
0: $display(" ->buffer descriptors tested with 0 bus delay");
1: $display(" ->buffer descriptors tested with 1 bus delay cycle");
2: $display(" ->buffer descriptors tested with 2 bus delay cycles");
3: $display(" ->buffer descriptors tested with 3 bus delay cycles");
default: $display(" ->buffer descriptors tested with 4 bus delay cycles");
endcase
if (i_addr[11:0] == 12'h500)
$display(" ->buffer descriptors tested with 0 bus delay");
else if (i_addr[11:0] == 12'h600)
$display(" ->buffer descriptors tested with 1 bus delay cycle");
else if (i_addr[11:0] == 12'h700)
$display(" ->buffer descriptors tested with 2 bus delay cycles");
end
$display(" ->buffer descriptors tested with 3 bus delay cycles");
if(fail == 0)
test_ok;
else
886,123 → 1026,128
//// inverse reset values and hard reset of the MAC ////
//// ////
////////////////////////////////////////////////////////////////////
if (test_num == 2) // Start this task
if (test_num == 3) // Start this task
begin
// TEST 2: 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 2: 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(
" TEST 2: 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");
// reset MAC registers
hard_reset;
for (i = 0; i <= 4; i = i + 1) // 0, 2 - WRITE; 1, 3, 4 - READ
begin
for (i_addr = 0; i_addr <= 32'h4C; i_addr = i_addr + 4) // register address
for (i_addr = 0; i_addr <= {22'h0, `ETH_TX_CTRL_ADR, 2'h0}; i_addr = i_addr + 4) // register address
begin
addr = `ETH_BASE + i_addr;
// set ranges of R/W bits
case (addr)
`ETH_MODER:
begin
data = 32'h0000_A800;
data_max = 32'h0001_FFFF;
end
`ETH_INT: // READONLY - tested within INT test
begin
data = 32'h0000_0000;
data_max = 32'h0000_0000;
end
`ETH_INT_MASK:
begin
data = 32'h0000_0000;
data_max = 32'h0000_007F;
end
`ETH_IPGT:
begin
data = 32'h0000_0012;
data_max = 32'h0000_007F;
end
`ETH_IPGR1:
begin
data = 32'h0000_000C;
data_max = 32'h0000_007F;
end
`ETH_IPGR2:
begin
data = 32'h0000_0012;
data_max = 32'h0000_007F;
end
`ETH_PACKETLEN:
begin
data = 32'h0040_0600;
data_max = 32'hFFFF_FFFF;
end
`ETH_COLLCONF:
begin
data = 32'h000F_003F;
data_max = 32'h000F_003F;
end
`ETH_TX_BD_NUM:
begin
data = 32'h0000_0040;
data_max = 32'h0000_0080;
end
`ETH_CTRLMODER:
begin
data = 32'h0000_0000;
data_max = 32'h0000_0007;
end
`ETH_MIIMODER:
begin
data = 32'h0000_0064;
data_max = 32'h0000_03FF;
end
`ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
begin
data = 32'h0000_0000;
data_max = 32'h0000_0007;
end
`ETH_MIIADDRESS:
begin
data = 32'h0000_0000;
data_max = 32'h0000_1F1F;
end
`ETH_MIITX_DATA:
begin
data = 32'h0000_0000;
data_max = 32'h0000_FFFF;
end
`ETH_MIIRX_DATA: // READONLY - tested within MIIM test
begin
data = 32'h0000_0000;
data_max = 32'h0000_0000;
end
`ETH_MIISTATUS: // READONLY - tested within MIIM test
begin
data = 32'h0000_0000;
data_max = 32'h0000_0000;
end
`ETH_MAC_ADDR0:
begin
data = 32'h0000_0000;
data_max = 32'hFFFF_FFFF;
end
`ETH_MAC_ADDR1:
begin
data = 32'h0000_0000;
data_max = 32'h0000_FFFF;
end
`ETH_HASH_ADDR0:
begin
data = 32'h0000_0000;
data_max = 32'hFFFF_FFFF;
end
default: // `ETH_HASH_ADDR1:
begin
data = 32'h0000_0000;
data_max = 32'hFFFF_FFFF;
end
`ETH_MODER:
begin
data = 32'h0000_A000; // bit 11 not used any more
data_max = 32'h0001_FFFF;
end
`ETH_INT: // READONLY - tested within INT test
begin
data = 32'h0000_0000;
data_max = 32'h0000_0000;
end
`ETH_INT_MASK:
begin
data = 32'h0000_0000;
data_max = 32'h0000_007F;
end
`ETH_IPGT:
begin
data = 32'h0000_0012;
data_max = 32'h0000_007F;
end
`ETH_IPGR1:
begin
data = 32'h0000_000C;
data_max = 32'h0000_007F;
end
`ETH_IPGR2:
begin
data = 32'h0000_0012;
data_max = 32'h0000_007F;
end
`ETH_PACKETLEN:
begin
data = 32'h0040_0600;
data_max = 32'hFFFF_FFFF;
end
`ETH_COLLCONF:
begin
data = 32'h000F_003F;
data_max = 32'h000F_003F;
end
`ETH_TX_BD_NUM:
begin
data = 32'h0000_0040;
data_max = 32'h0000_0080;
end
`ETH_CTRLMODER:
begin
data = 32'h0000_0000;
data_max = 32'h0000_0007;
end
`ETH_MIIMODER:
begin
data = 32'h0000_0064;
data_max = 32'h0000_01FF;
end
`ETH_MIICOMMAND: // "WRITEONLY" - tested within MIIM test - 3 LSBits are not written here!!!
begin
data = 32'h0000_0000;
data_max = 32'h0000_0000;
end
`ETH_MIIADDRESS:
begin
data = 32'h0000_0000;
data_max = 32'h0000_1F1F;
end
`ETH_MIITX_DATA:
begin
data = 32'h0000_0000;
data_max = 32'h0000_FFFF;
end
`ETH_MIIRX_DATA: // READONLY - tested within MIIM test
begin
data = 32'h0000_0000;
data_max = 32'h0000_0000;
end
`ETH_MIISTATUS: // READONLY - tested within MIIM test
begin
data = 32'h0000_0000;
data_max = 32'h0000_0000;
end
`ETH_MAC_ADDR0:
begin
data = 32'h0000_0000;
data_max = 32'hFFFF_FFFF;
end
`ETH_MAC_ADDR1:
begin
data = 32'h0000_0000;
data_max = 32'h0000_FFFF;
end
`ETH_HASH_ADDR0:
begin
data = 32'h0000_0000;
data_max = 32'hFFFF_FFFF;
end
`ETH_HASH_ADDR1:
begin
data = 32'h0000_0000;
data_max = 32'hFFFF_FFFF;
end
default: // `ETH_TX_CTRL_ADR:
begin
data = 32'h0000_0000;
data_max = 32'h0000_FFFF;
end
endcase
wbm_init_waits = {$random} % 3;
1009,10 → 1154,16
wbm_subseq_waits = {$random} % 5; // it is not important for single accesses
if (i == 0)
begin
if (addr == `ETH_MIICOMMAND) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
;
else
wbm_write(addr, ~data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
end
else if (i == 2)
begin
if (addr == `ETH_MIICOMMAND) // DO NOT WRITE to 3 LSBits of MIICOMMAND !!!
;
else
wbm_write(addr, 32'hFFFFFFFF, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
end
else if ((i == 1) || (i == 4))
1098,18 → 1249,15
//// of the mac and reseting the logic ////
//// ////
////////////////////////////////////////////////////////////////////
if (test_num == 3) // Start this task
if (test_num == 4) // Start this task
begin
// TEST 3: BUFFER DESC. RAM PRESERVING VALUES AFTER HARD RESET OF THE MAC AND RESETING THE LOGIC
test_name = "TEST 3: 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";
`TIME;
$display(" TEST 3: 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");
// reset MAC registers
hard_reset;
// reset LOGIC with soft reset
// reset_mac;
// reset_mii;
for (i = 0; i <= 3; i = i + 1) // 0, 2 - WRITE; 1, 3 - READ
begin
for (i_addr = 32'h400; i_addr <= 32'h7FC; i_addr = i_addr + 4) // buffer descriptor address
1144,9 → 1292,6
begin
// reset MAC registers
hard_reset;
// reset LOGIC with soft reset
// reset_mac;
// reset_mii;
end
end
if(fail == 0)
1156,11 → 1301,11
end
 
 
if (test_num == 4) // Start this task
if (test_num == 5) // Start this task
begin
/* // TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )
test_name = "TEST 4: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )";
`TIME; $display(" TEST 4: '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 )";
`TIME; $display(" TEST 5: 'WALKING ONE' WITH BURST CYCLES ACROSS MAC REGISTERS ( VARIOUS BUS DELAYS )");
data = 0;
burst_data = 0;
1433,9 → 1578,6
 
// reset MAC registers
hard_reset;
// reset MAC and MII LOGIC with soft reset
//reset_mac;
//reset_mii;
 
 
//////////////////////////////////////////////////////////////////////
1928,7 → 2070,7
#Tp mii_read_req(phy_addr, reg_addr);
check_mii_busy; // wait for read to finish
// read data
$display(" => Two errors will be displayed from WB Bus Monitor, because correct HIGH Z data was read");
$display(" => Two error lines will be displayed from WB Bus Monitor, because correct HIGH Z data was read");
wbm_read(`ETH_MIIRX_DATA, tmp_data, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
if (tmp_data !== 16'hzzzz)
begin
3019,12 → 3161,6
// MII mode register
wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i, 8'h0}) | (`ETH_MIIMODER_CLKDIV & clk_div),
4'hF, 1, wbm_init_waits, wbm_subseq_waits);
if (i)
begin
// change saved data when preamble is suppressed
#Tp tmp_data = tmp_data | 16'h0040; // put bit 6 to ONE
end
// scan request
#Tp mii_scan_req(phy_addr, reg_addr);
check_mii_scan_valid; // wait for scan to make first data valid
3264,12 → 3400,6
// MII mode register
#Tp wbm_write(`ETH_MIIMODER, (`ETH_MIIMODER_NOPRE & {23'h0, i2, 8'h0}), 4'hF, 1, wbm_init_waits,
wbm_subseq_waits);
if (i2)
begin
// change saved data when preamble is suppressed
#Tp tmp_data = tmp_data | 16'h0040; // put bit 6 to ONE
end
i = 0;
while (i < 80) // delay for sliding of LinkFail bit
begin
8005,6 → 8135,7
min_tmp = 0;
num_of_frames = 0;
num_of_bd = 0;
tx_bd_num = 0;
// set 13 TX buffer descriptors - must be set before TX enable
wait (wbm_working == 0);
wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8053,22 → 8184,29
set_tx_bd_ready(0, 0);
end
else if (num_of_bd == 1)
begin
set_tx_bd_ready(1, 1);
tx_bd_num = 1;
end
else if (num_of_bd == 2)
begin
set_tx_bd_ready(2, 2);
tx_bd_num = 2;
end
else if (num_of_bd == 3)
begin
set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
set_tx_bd_wrap(2);
set_tx_bd_ready(0, 0);
i_length = 96;
i_length = 100;
tx_bd_num = 0;
end
 
// CHECK END OF TRANSMITION
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
wait (MTxEn === 1'b1); // start transmit
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
if (data[15] !== 1)
begin
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8077,7 → 8215,7
wait (MTxEn === 1'b0); // end transmit
while (data[15] === 1)
begin
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
@(posedge wb_clk);
end
repeat (1) @(posedge wb_clk);
8084,11 → 8222,22
// check length of a PACKET
tmp_len = eth_phy.tx_len;
#1;
if (tmp_len != (i_length + 4))
if ((i_length + 4) <= max_tmp)
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
if (tmp_len != (i_length + 4))
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
end
end
else
begin
if (tmp_len != (i_length + 4 - 1))
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
end
end
 
// check transmitted TX packet data
if ((i_length + 4) == 100)
8123,7 → 8272,7
fail = fail + 1;
end
 
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
((data[15:0] !== 16'h5800) && (num_of_bd < 2)) ) // without wrap bit
begin
8207,6 → 8356,7
min_tmp = 0;
num_of_frames = 0;
num_of_bd = 0;
tx_bd_num = 0;
// set 13 TX buffer descriptors - must be set before TX enable
wait (wbm_working == 0);
wbm_write(`ETH_TX_BD_NUM, 32'hD, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8255,22 → 8405,29
set_tx_bd_ready(0, 0);
end
else if (num_of_bd == 1)
begin
set_tx_bd_ready(1, 1);
tx_bd_num = 1;
end
else if (num_of_bd == 2)
begin
set_tx_bd_ready(2, 2);
tx_bd_num = 2;
end
else if (num_of_bd == 3)
begin
set_tx_bd(0, 0, 100, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
set_tx_bd_wrap(2);
set_tx_bd_ready(0, 0);
i_length = 96;
i_length = 100;
tx_bd_num = 0;
end
 
// CHECK END OF TRANSMITION
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
wait (MTxEn === 1'b1); // start transmit
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
if (data[15] !== 1)
begin
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8279,7 → 8436,7
wait (MTxEn === 1'b0); // end transmit
while (data[15] === 1)
begin
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
@(posedge wb_clk);
end
repeat (1) @(posedge wb_clk);
8287,11 → 8444,22
// check length of a PACKET
tmp_len = eth_phy.tx_len;
#1;
if (tmp_len != (i_length + 4))
if ((i_length + 4) <= max_tmp)
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
if (tmp_len != (i_length + 4))
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
end
end
else
begin
if (tmp_len != (i_length + 4 - 1))
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
end
end
 
// check transmitted TX packet data
if ((i_length + 4) == 100)
8326,7 → 8494,7
fail = fail + 1;
end
 
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
((data[15:0] !== 16'h5800) && (num_of_bd < 2)) ) // without wrap bit
begin
8411,6 → 8579,7
min_tmp = 0;
num_of_frames = 0;
num_of_bd = 0;
tx_bd_num = 0;
// set 47 TX buffer descriptors - must be set before TX enable
wait (wbm_working == 0);
wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8454,20 → 8623,26
// prepare BDs
if (num_of_bd == 0)
begin
set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
set_tx_bd(0, 0, i_length+4, 1'b1, 1'b1, 1'b0, `MEMORY_BASE); // no CRC adding
set_tx_bd(1, 1, i_length+1, 1'b1, 1'b0, 1'b1, `MEMORY_BASE); // no PADDING
set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
set_tx_bd_wrap(2);
set_tx_bd_ready(0, 0);
end
else if (num_of_bd == 1)
begin
set_tx_bd_ready(1, 1);
tx_bd_num = 1;
end
else if (num_of_bd == 2)
begin
set_tx_bd_ready(2, 2);
tx_bd_num = 2;
end
// CHECK END OF TRANSMITION
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
wait (MTxEn === 1'b1); // start transmit
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
if (data[15] !== 1)
begin
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8476,7 → 8651,7
wait (MTxEn === 1'b0); // end transmit
while (data[15] === 1)
begin
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
@(posedge wb_clk);
end
repeat (5) @(posedge mtx_clk);
8483,13 → 8658,28
// check length of a PACKET
tmp_len = eth_phy.tx_len;
#1;
if (tmp_len != (i_length + 4))
if ((i_length + 4) <= max_tmp)
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
if (tmp_len != (i_length + 4))
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
end
end
else
begin
if (tmp_len != (i_length + 4 - 1))
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
end
end
 
// checking packet
check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
if (num_of_bd === 0)
check_tx_packet(`MEMORY_BASE, 0, i_length + 4, tmp); // also data representing CRC
else
check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
if (tmp > 0)
begin
test_fail("Wrong data of the transmitted packet");
8496,7 → 8686,7
fail = fail + 1;
end
// check transmited TX packet CRC
if (num_of_bd !== 2)
if (num_of_bd === 1)
check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
if (tmp > 0)
begin
8511,9 → 8701,10
fail = fail + 1;
end
// check TX buffer descriptor of a packet
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
((data[15:0] !== 16'h5800) && (num_of_bd < 2)) ) // without wrap bit
((data[15:0] !== 16'h4800) && (num_of_bd == 1)) || // without wrap bit and without pad bit
((data[15:0] !== 16'h5000) && (num_of_bd == 0)) ) // without wrap bit and without crc 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");
8589,6 → 8780,7
min_tmp = 0;
num_of_frames = 0;
num_of_bd = 0;
tx_bd_num = 0;
// set 47 TX buffer descriptors - must be set before TX enable
wait (wbm_working == 0);
wbm_write(`ETH_TX_BD_NUM, 32'h2F, 4'hF, 1, wbm_init_waits, wbm_subseq_waits);
8632,20 → 8824,26
// prepare BDs
if (num_of_bd == 0)
begin
set_tx_bd(0, 0, i_length, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
set_tx_bd(1, 1, i_length+1, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
set_tx_bd(0, 0, i_length+4, 1'b1, 1'b1, 1'b0, `MEMORY_BASE); // no CRC adding
set_tx_bd(1, 1, i_length+1, 1'b1, 1'b0, 1'b1, `MEMORY_BASE); // no PADDING
set_tx_bd(2, 2, i_length+2, 1'b1, 1'b1, 1'b1, `MEMORY_BASE);
set_tx_bd_wrap(2);
set_tx_bd_ready(0, 0);
end
else if (num_of_bd == 1)
begin
set_tx_bd_ready(1, 1);
tx_bd_num = 1;
end
else if (num_of_bd == 2)
begin
set_tx_bd_ready(2, 2);
tx_bd_num = 2;
end
// CHECK END OF TRANSMITION
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
wait (MTxEn === 1'b1); // start transmit
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
if (data[15] !== 1)
begin
test_fail("Wrong buffer descriptor's ready bit read out from MAC");
8654,7 → 8852,7
wait (MTxEn === 1'b0); // end transmit
while (data[15] === 1)
begin
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
@(posedge wb_clk);
end
repeat (5) @(posedge mtx_clk);
8661,13 → 8859,28
// check length of a PACKET
tmp_len = eth_phy.tx_len;
#1;
if (tmp_len != (i_length + 4))
if ((i_length + 4) <= max_tmp)
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
if (tmp_len != (i_length + 4))
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
end
end
else
begin
if (tmp_len != (i_length + 4 - 1))
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
end
end
 
// checking packet
check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
if (num_of_bd === 0)
check_tx_packet(`MEMORY_BASE, 0, i_length + 4, tmp); // also data representing CRC
else
check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
if (tmp > 0)
begin
test_fail("Wrong data of the transmitted packet");
8674,7 → 8887,7
fail = fail + 1;
end
// check transmited TX packet CRC
if (num_of_bd !== 2)
if (num_of_bd === 1)
check_tx_crc(0, i_length, 1'b0, tmp); // length without CRC
if (tmp > 0)
begin
8689,9 → 8902,10
fail = fail + 1;
end
// check TX buffer descriptor of a packet
check_tx_bd(num_of_bd, data);
check_tx_bd(tx_bd_num, data);
if ( ((data[15:0] !== 16'h7800) && (num_of_bd == 2)) || // wrap bit
((data[15:0] !== 16'h5800) && (num_of_bd < 2)) ) // without wrap bit
((data[15:0] !== 16'h4800) && (num_of_bd == 1)) || // without wrap bit and without pad bit
((data[15:0] !== 16'h5000) && (num_of_bd == 0)) ) // without wrap bit and without crc 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");
8845,11 → 9059,22
// check length of a PACKET
tmp_len = eth_phy.tx_len;
#1;
if (tmp_len != (i_length + 4))
if ((i_length + 4) >= min_tmp)
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
if (tmp_len != (i_length + 4))
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
end
end
else
begin
if (tmp_len != (i_length + 4 + 1))
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
end
end
// checking packet
check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
if (tmp > 0)
9028,11 → 9253,22
// check length of a PACKET
tmp_len = eth_phy.tx_len;
#1;
if (tmp_len != (i_length + 4))
if ((i_length + 4) >= min_tmp)
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
if (tmp_len != (i_length + 4))
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
end
end
else
begin
if (tmp_len != (i_length + 4 + 1))
begin
test_fail("Wrong length of the packet out from MAC");
fail = fail + 1;
end
end
// checking packet
check_tx_packet(`MEMORY_BASE, 0, i_length, tmp);
if (tmp > 0)
18453,7 → 18689,8
end
else
begin
wb_slave.wr_mem(addr_wb, {crc[7:0], crc[15:8], crc[23:16], crc[31:24]}, 4'hF);
// wb_slave.wr_mem(addr_wb, {crc[7:0], crc[15:8], crc[23:16], crc[31:24]}, 4'hF);
wb_slave.wr_mem(addr_wb, crc[31:0], 4'hF);
end
delta_t = !delta_t;
end
18829,7 → 19066,7
nibble_cnt = ((len + 4) << 1) + 1'b1; // one nibble longer
else
nibble_cnt = ((len + 4) << 1);
load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
load_reg = wb_slave.wb_memory[{12'h0, addr_cnt[21:2]}];
addr_cnt = addr_cnt + 4;
while (nibble_cnt > 0)
begin
18890,7 → 19127,7
if ((word_cnt+3) == 7)//4)
begin
// because of MAGIC NUMBER nibbles are swapped [3:0] -> [0:3]
load_reg = wb_slave.wb_memory[{12'h0, addr_cnt}];
load_reg = wb_slave.wb_memory[{12'h0, addr_cnt[21:2]}];
addr_cnt = addr_cnt + 4;
end
// set new load bit position
19494,6 → 19731,38
endtask // test_fail
 
 
task test_fail_num ;
input [7999:0] failure_reason ;
input [31:0] number ;
// reg [8007:0] display_failure ;
reg [7999:0] display_failure ;
reg [799:0] display_test ;
begin
tests_failed = tests_failed + 1 ;
 
display_failure = failure_reason; // {failure_reason, "!"} ;
while ( display_failure[7999:7992] == 0 )
display_failure = display_failure << 8 ;
 
display_test = test_name ;
while ( display_test[799:792] == 0 )
display_test = display_test << 8 ;
 
$fdisplay( tb_log_file, " *************************************************************************************" ) ;
$fdisplay( tb_log_file, " At time: %t ", $time ) ;
$fdisplay( tb_log_file, " Test: %s", display_test ) ;
$fdisplay( tb_log_file, " *FAILED* because") ;
$fdisplay( tb_log_file, " %s; %d", display_failure, number ) ;
$fdisplay( tb_log_file, " *************************************************************************************" ) ;
$fdisplay( tb_log_file, " " ) ;
 
`ifdef STOP_ON_FAILURE
#20 $stop ;
`endif
end
endtask // test_fail_num
 
 
task test_ok ;
reg [799:0] display_test ;
begin
/trunk/bench/verilog/wb_model_defines.v
42,9 → 42,12
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.2 2002/09/13 12:29:14 mohor
// Headers changed.
//
//
//
//
 
// WISHBONE frequency in GHz
`define WB_FREQ 0.100
70,7 → 73,7
`define WB_ADDR_WIDTH 32
`define WB_DATA_WIDTH 32
`define WB_SEL_WIDTH `WB_DATA_WIDTH/8
`define WB_TAG_WIDTH 1
`define WB_TAG_WIDTH 5
`define WB_ADDR_TYPE [(`WB_ADDR_WIDTH - 1):0]
`define WB_DATA_TYPE [(`WB_DATA_WIDTH - 1):0]
`define WB_SEL_TYPE [(`WB_SEL_WIDTH - 1):0]
/trunk/bench/verilog/wb_bus_mon.v
2,19 → 2,20
//// ////
//// File name "wb_bus_mon.v" ////
//// ////
//// This file is part of the Ethernet IP core project ////
//// http://www.opencores.org/projects/ethmac/ ////
//// This file is part of the "PCI bridge" project ////
//// http://www.opencores.org/cores/pci/ ////
//// ////
//// Author(s): ////
//// - Miha Dolenc (mihad@opencores.org) ////
//// - mihad@opencores.org ////
//// - Miha Dolenc ////
//// ////
//// All additional information is available in the README.pdf ////
//// All additional information is avaliable in the README.pdf ////
//// file. ////
//// ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2002 Authors ////
//// Copyright (C) 2001 Miha Dolenc, mihad@opencores.org ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
42,6 → 43,10
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.3 2002/10/09 13:16:51 tadejm
// Just back-up; not completed testbench and some testcases are not
// wotking properly yet.
//
// Revision 1.2 2002/09/13 12:29:14 mohor
// Headers changed.
//
76,6 → 81,7
TAG_I,
TAG_O,
CAB_O,
check_CTI,
log_file_desc
) ;
 
94,191 → 100,233
input [(`WB_TAG_WIDTH-1):0] TAG_I ;
input [(`WB_TAG_WIDTH-1):0] TAG_O ;
input CAB_O ;
input check_CTI ;
input [31:0] log_file_desc ;
 
always@(posedge CLK_I or posedge RST_I)
always@(posedge CLK_I)
begin
if (RST_I)
if (RST_I !== 1'b0)
begin
// when reset is applied, all control signals must be low
if (CYC_O)
if (CYC_O !== 1'b0)
begin
$display("*E (%0t) CYC_O active under reset", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)CYC_O active under reset", $time) ;
message_out("CYC_O active under reset") ;
end
if (STB_O)
 
if (STB_O !== 1'b0)
begin
$display("*E (%0t) STB_O active under reset", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)STB_O active under reset", $time) ;
message_out("STB_O active under reset") ;
end
/*if (ACK_I)
$display("ACK_I active under reset") ;*/
if (ERR_I)
if (ACK_I !== 1'b0)
message_out("ACK_I active under reset") ;
 
if (ERR_I !== 1'b0)
begin
$display("*E (%0t) ERR_I active under reset", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)ERR_I active under reset", $time) ;
message_out("ERR_I active under reset") ;
end
if (RTY_I)
 
if (RTY_I !== 1'b0)
begin
$display("*E (%0t) RTY_I active under reset", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)RTY_I active under reset", $time) ;
message_out("RTY_I active under reset") ;
end
if (CAB_O)
begin
$display("*E (%0t) CAB_O active under reset", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)CAB_O active under reset", $time) ;
end
 
end // reset
else
if (~CYC_O)
if (CYC_O !== 1'b1)
begin
// when cycle indicator is low, all control signals must be low
if (STB_O)
if (STB_O !== 1'b0)
begin
$display("*E (%0t) STB_O active without CYC_O being active", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)STB_O active without CYC_O being active", $time) ;
message_out("STB_O active without CYC_O being active") ;
end
if (ACK_I)
 
if (ACK_I !== 1'b0)
begin
$display("*E (%0t) ACK_I active without CYC_O being active", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)ACK_I active without CYC_O being active", $time) ;
message_out("ACK_I active without CYC_O being active") ;
end
if (ERR_I)
 
if (ERR_I !== 1'b0)
begin
$display("*E (%0t) ERR_I active without CYC_O being active", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)ERR_I active without CYC_O being active", $time) ;
message_out("ERR_I active without CYC_O being active") ;
end
if (RTY_I)
 
if (RTY_I !== 1'b0)
begin
$display("*E (%0t) RTY_I active without CYC_O being active", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)RTY_I active without CYC_O being active", $time) ;
message_out("RTY_I active without CYC_O being active") ;
end
if (CAB_O)
begin
$display("*E (%0t) CAB_O active without CYC_O being active", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)CAB_O active without CYC_O being active", $time) ;
end
 
end // ~CYC_O
end
 
reg [`WB_DATA_WIDTH-1:0] previous_data ;
reg [`WB_DATA_WIDTH-1:0] previous_data_o ;
reg [`WB_DATA_WIDTH-1:0] previous_data_i ;
reg [`WB_ADDR_WIDTH-1:0] previous_address ;
reg [`WB_SEL_WIDTH-1:0] previous_sel ;
reg [`WB_TAG_WIDTH-1:0] previous_tag ;
reg previous_stb ;
reg previous_ack ;
reg previous_err ;
reg previous_rty ;
reg previous_cyc ;
reg can_change ;
reg previous_we ;
 
always@(posedge CLK_I or posedge RST_I)
begin
if (RST_I)
begin
previous_stb <= 1'b0 ;
previous_ack <= 1'b0 ;
previous_err <= 1'b0 ;
previous_rty <= 1'b0 ;
previous_cyc <= 1'b0 ;
previous_stb <= 1'b0 ;
previous_ack <= 1'b0 ;
previous_err <= 1'b0 ;
previous_rty <= 1'b0 ;
previous_cyc <= 1'b0 ;
previous_tag <= 'd0 ;
previous_we <= 1'b0 ;
previous_data_o <= 0 ;
previous_data_i <= 0 ;
previous_address <= 0 ;
previous_sel <= 0 ;
end
else
begin
previous_stb <= STB_O ;
previous_ack <= ACK_I ;
previous_err <= ERR_I ;
previous_rty <= RTY_I ;
previous_cyc <= CYC_O ;
previous_stb <= STB_O ;
previous_ack <= ACK_I ;
previous_err <= ERR_I ;
previous_rty <= RTY_I ;
previous_cyc <= CYC_O ;
previous_tag <= TAG_O ;
previous_we <= WE_O ;
previous_data_o <= DAT_O ;
previous_data_i <= DAT_I ;
previous_address <= ADDR_O ;
previous_sel <= SEL_O ;
end
end
 
// cycle monitor
always@(posedge CLK_I)
begin
if (CYC_O && ~RST_I) // cycle in progress
begin:cycle_monitor_blk
reg master_can_change ;
reg slave_can_change ;
 
if ((CYC_O !== 1'b0) & (RST_I !== 1'b1)) // cycle in progress
begin
if (STB_O)
// check for two control signals active at same edge
if ( (ACK_I !== 1'b0) & (RTY_I !== 1'b0) )
begin
// check for two control signals active at same edge
if ( ACK_I && RTY_I )
begin
$display("*E (%0t) ACK_I and RTY_I asserted at the same time during cycle", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)ACK_I and RTY_I asserted at the same time during cycle", $time) ;
end
if ( ACK_I && ERR_I )
begin
$display("*E (%0t) ACK_I and ERR_I asserted at the same time during cycle", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)ACK_I and ERR_I asserted at the same time during cycle", $time) ;
end
if ( RTY_I && ERR_I )
begin
$display("*E (%0t) RTY_I and ERR_I asserted at the same time during cycle", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)RTY_I and ERR_I asserted at the same time during cycle", $time) ;
end
message_out("ACK_I and RTY_I asserted at the same time during cycle") ;
end
 
if ( can_change !== 1 )
begin
if ( ADDR_O !== previous_address )
begin
$display("*E (%0t) WB bus monitor detected address change in the middle of the cycle!", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)WB bus monitor detected address change in the middle of the cycle!", $time) ;
end
if ( (ACK_I !== 1'b0) & (ERR_I !== 1'b0) )
begin
message_out("ACK_I and ERR_I asserted at the same time during cycle") ;
end
 
if ( SEL_O !== previous_sel )
begin
$display("*E (%0t) WB bus monitor detected select lines changed in the middle of the cycle!", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)WB bus monitor detected select lines changed in the middle of the cycle!", $time) ;
end
if ( (RTY_I !== 1'b0) & (ERR_I !== 1'b0) )
begin
message_out("RTY_I and ERR_I asserted at the same time during cycle") ;
end
 
if ( (WE_O !== 0) && ( DAT_O !== previous_data ) )
begin
$display("*E (%0t) WB bus monitor detected data lines changed in the middle of the cycle!", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)WB bus monitor detected data lines changed in the middle of the cycle!", $time) ;
end
if (previous_cyc === 1'b1)
begin
if (previous_stb === 1'b1)
begin
if ((previous_ack === 1'b1) | (previous_rty === 1'b1) | (previous_err === 1'b1))
master_can_change = 1'b1 ;
else
master_can_change = 1'b0 ;
end
 
if ( ACK_I || RTY_I || ERR_I )
can_change = 1 ;
else
begin
previous_data = DAT_O ;
previous_address = ADDR_O ;
previous_sel = SEL_O ;
can_change = 0 ;
master_can_change = 1'b1 ;
end
 
end // STB_O
else
begin //~STB_O
// while STB_O is inactive, only ACK_I is allowed to be active
if ( ERR_I )
if ((previous_ack === 1'b1) | (previous_err === 1'b1) | (previous_rty === 1'b1))
begin
$display("*E (%0t) ERR_I asserted during cycle without STB_O", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)ERR_I asserted during cycle without STB_O", $time) ;
if (previous_stb === 1'b1)
slave_can_change = 1'b1 ;
else
slave_can_change = 1'b0 ;
end
if ( RTY_I )
else
begin
$display("*E (%0t) RTY_I asserted during cycle without STB_O", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)RTY_I asserted during cycle without STB_O", $time) ;
slave_can_change = 1'b1 ;
end
end
else
begin
master_can_change = 1'b1 ;
slave_can_change = 1'b1 ;
end
end
else
begin
master_can_change = 1'b1 ;
slave_can_change = 1'b1 ;
end
 
if ((previous_ack !== 1) && (previous_err !== 1) && (previous_rty !== 1) && (previous_stb !== 0))
if (master_can_change !== 1'b1)
begin
if (CYC_O !== previous_cyc)
begin
message_out("Master violated WISHBONE protocol by changing the value of CYC_O signal at inappropriate time!") ;
end
 
if (STB_O !== previous_stb)
begin
message_out("Master violated WISHBONE protocol by changing the value of STB_O signal at inappropriate time!") ;
end
 
if (TAG_O !== previous_tag)
begin
message_out("Master violated WISHBONE protocol by changing the value of TAG_O signals at inappropriate time!") ;
end
 
if (ADDR_O !== previous_address)
begin
message_out("Master violated WISHBONE protocol by changing the value of ADR_O signals at inappropriate time!") ;
end
 
if (SEL_O !== previous_sel)
begin
message_out("Master violated WISHBONE protocol by changing the value of SEL_O signals at inappropriate time!") ;
end
 
if (WE_O !== previous_we)
begin
message_out("Master violated WISHBONE protocol by changing the value of WE_O signal at inappropriate time!") ;
end
 
if (WE_O !== 1'b0)
begin
if (DAT_O !== previous_data_o)
begin
$display("STB_O de-asserted without reception of slave response") ;
$fdisplay(log_file_desc, "STB_O de-asserted without reception of slave response") ;
message_out("Master violated WISHBONE protocol by changing the value of DAT_O signals at inappropriate time!") ;
end
end
end
 
can_change = 1 ;
end // ~STB_O
end // cycle in progress
else if (!RST_I)
if (slave_can_change !== 1'b1)
begin
// cycle not in progress anymore
can_change = 1 ;
if ((previous_ack !== 1) && (previous_err !== 1) && (previous_rty !== 1) && (previous_stb !== 0))
if (previous_ack !== ACK_I)
begin
$display("STB_O de-asserted without reception of slave response") ;
$fdisplay(log_file_desc, "STB_O de-asserted without reception of slave response") ;
message_out("Slave violated WISHBONE protocol by changing the value of ACK_O signal at inappropriate time!") ;
end
 
if (previous_rty !== RTY_I)
begin
message_out("Slave violated WISHBONE protocol by changing the value of RTY_O signal at inappropriate time!") ;
end
 
if (previous_err !== ERR_I)
begin
message_out("Slave violated WISHBONE protocol by changing the value of ERR_O signal at inappropriate time!") ;
end
 
if (previous_data_i !== DAT_I)
begin
message_out("Slave violated WISHBONE protocol by changing the value of DAT_O signals at inappropriate time!") ;
end
end
end // cycle monitor
 
295,12 → 343,55
first_cab_val <= {1'b1, CAB_O} ;
else if ( first_cab_val[0] !== CAB_O )
begin
$display("*E (%0t) CAB_O value changed during cycle", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)CAB_O value changed during cycle", $time) ;
$display("CAB_O value changed during cycle") ;
$fdisplay(log_file_desc, "CAB_O value changed during cycle") ;
end
end
end // CAB_O monitor
 
// CTI_O[2:0] (TAG_O[4:2]) monitor for bursts
reg [2:0] first_cti_val ;
always@(posedge CLK_I or posedge RST_I)
begin
if (RST_I)
first_cti_val <= 3'b000 ;
// logging for burst cycle
else if ( check_CTI && ((CYC_O === 0) && (first_cti_val == 3'b011) && ~(previous_rty || previous_err)))
begin
message_out("Master violated WISHBONE protocol by NOT changing the CTI_O signals to '111' when end of burst!") ;
$display("CTI_O didn't change to '111' when end of burst") ;
$fdisplay(log_file_desc, "CTI_O didn't change to '111' when end of burst") ;
first_cti_val <= 3'b000 ;
end
else if (CYC_O === 0)
first_cti_val <= 3'b000 ;
else
begin
if ((first_cti_val == 3'b000) && (TAG_O[4:2] === 3'b000) && (ACK_I || ERR_I || RTY_I))
first_cti_val <= 3'b001 ;
else if ((first_cti_val == 3'b000) && (TAG_O[4:2] === 3'b111) && (ACK_I || ERR_I || RTY_I))
first_cti_val <= 3'b010 ;
else if ((first_cti_val == 3'b000) && (TAG_O[4:2] === 3'b010) && (ACK_I || ERR_I || RTY_I))
first_cti_val <= 3'b011 ;
else if ((first_cti_val == 3'b011) && (TAG_O[4:2] === 3'b111) && (ACK_I || ERR_I || RTY_I))
first_cti_val <= 3'b010 ;
// logging for clasic cycles
else if (check_CTI && ((first_cti_val == 3'b001) && (TAG_O[4:2] !== 3'b000)))
begin
message_out("Master violated WISHBONE protocol by changing the CTI_O signals during CYC_O when clasic cycle!") ;
$display("CTI_O change during CYC_O when clasic cycle") ;
$fdisplay(log_file_desc, "CTI_O change during CYC_O when clasic cycle") ;
end
// logging for end of burs cycle
else if (check_CTI && (first_cti_val == 3'b010))
begin
message_out("Master violated WISHBONE protocol by changing the CTI_O signals to '111' before end of burst!") ;
$display("CTI_O change to '111' before end of burst") ;
$fdisplay(log_file_desc, "CTI_O change to '111' before end of burst") ;
end
end
end
 
// WE_O monitor for consecutive address bursts
reg [1:0] first_we_val ;
always@(posedge CLK_I or posedge RST_I)
315,8 → 406,8
first_we_val <= {1'b1, WE_O} ;
else if ( first_we_val[0] != WE_O )
begin
$display("*E (%0t) WE_O value changed during CAB cycle", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)WE_O value changed during CAB cycle", $time) ;
$display("WE_O value changed during CAB cycle") ;
$fdisplay(log_file_desc, "WE_O value changed during CAB cycle") ;
end
end
end // CAB_O monitor
332,16 → 423,18
if (STB_O && ACK_I)
begin
if (address[`WB_ADDR_WIDTH] == 1'b0)
address <= {1'b1, (ADDR_O + `WB_SEL_WIDTH)} ;
begin
address <= (ADDR_O + `WB_SEL_WIDTH) | { 1'b1, {`WB_ADDR_WIDTH{1'b0}} } ;
end
else
begin
if ( address[(`WB_ADDR_WIDTH-1):0] != ADDR_O)
begin
$display("*E (%0t) Consecutive address burst address incrementing incorrect", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)Consecutive address burst address incrementing incorrect", $time) ;
$display("Expected ADR_O = 0x%h, Actual = 0x%h", address[(`WB_ADDR_WIDTH-1):0], ADDR_O) ;
message_out("Consecutive address burst address incrementing incorrect") ;
end
else
address <= {1'b1, (ADDR_O + `WB_SEL_WIDTH)} ;
address <= (ADDR_O + `WB_SEL_WIDTH) | { 1'b1, {`WB_ADDR_WIDTH{1'b0}} } ;
end
end
end
349,53 → 442,78
 
// data monitor
always@(posedge CLK_I or posedge RST_I)
begin
if (CYC_O && STB_O && ~RST_I)
begin:data_monitor_blk
reg last_valid_we ;
reg [`WB_SEL_WIDTH - 1:0] last_valid_sel ;
 
if ((CYC_O !== 1'b0) & (RST_I !== 1'b1))
begin
if ( ((^ADDR_O) !== 1'b1) && ((^ADDR_O) !== 1'b0) )
if (STB_O !== 1'b0)
begin
$display("*E (%0t) Master provided invalid address and qualified it with STB_O", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)Master provided invalid address and qualified it with STB_O", $time) ;
end
if ( WE_O )
begin
if (
(SEL_O[0] && (((^DAT_O[7:0]) !== 1'b0) && ((^DAT_O[7:0]) !== 1'b1))) ||
(SEL_O[1] && (((^DAT_O[15:8]) !== 1'b0) && ((^DAT_O[15:8]) !== 1'b1))) ||
(SEL_O[2] && (((^DAT_O[23:16]) !== 1'b0) && ((^DAT_O[23:16]) !== 1'b1))) ||
(SEL_O[3] && (((^DAT_O[31:24]) !== 1'b0) && ((^DAT_O[31:24]) !== 1'b1)))
)
last_valid_we = WE_O ;
last_valid_sel = SEL_O ;
 
if ( (ADDR_O ^ ADDR_O) !== 0 )
begin
$display("*E (%0t) Master provided invalid data during write and qualified it with STB_O", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)Master provided invalid data during write and qualified it with STB_O", $time) ;
$display("*E (%0t) Byte select value: SEL_O = %b, Data bus value: DAT_O = %h ", $time, SEL_O, DAT_O) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)Byte select value: SEL_O = %b, Data bus value: DAT_O = %h ", $time, SEL_O, DAT_O) ;
message_out("Master provided invalid ADR_O and qualified it with STB_O") ;
end
if ( (SEL_O ^ SEL_O) !== 0 )
begin
message_out("Master provided invalid SEL_O and qualified it with STB_O") ;
end
 
if ( WE_O )
begin
if (
( SEL_O[0] & ((DAT_O[ 7:0 ] ^ DAT_O[ 7:0 ]) !== 0) ) |
( SEL_O[1] & ((DAT_O[15:8 ] ^ DAT_O[15:8 ]) !== 0) ) |
( SEL_O[2] & ((DAT_O[23:16] ^ DAT_O[23:16]) !== 0) ) |
( SEL_O[3] & ((DAT_O[31:24] ^ DAT_O[31:24]) !== 0) )
)
begin
message_out("Master provided invalid data during write and qualified it with STB_O") ;
$display("Byte select value: SEL_O = %b, Data bus value: DAT_O = %h ", SEL_O, DAT_O) ;
$fdisplay(log_file_desc, "Byte select value: SEL_O = %b, Data bus value: DAT_O = %h ", SEL_O, DAT_O) ;
end
end
 
if ((TAG_O ^ TAG_O) !== 0)
begin
message_out("Master provided invalid TAG_O and qualified it with STB_O!") ;
end
end
else
if (~WE_O && ACK_I)
 
if ((last_valid_we !== 1'b1) & (ACK_I !== 1'b0))
begin
if (
(SEL_O[0] && (((^DAT_I[7:0]) !== 1'b0) && ((^DAT_I[7:0]) !== 1'b1))) ||
(SEL_O[1] && (((^DAT_I[15:8]) !== 1'b0) && ((^DAT_I[15:8]) !== 1'b1))) ||
(SEL_O[2] && (((^DAT_I[23:16]) !== 1'b0) && ((^DAT_I[23:16]) !== 1'b1))) ||
(SEL_O[3] && (((^DAT_I[31:24]) !== 1'b0) && ((^DAT_I[31:24]) !== 1'b1)))
( SEL_O[0] & ((DAT_I[ 7:0 ] ^ DAT_I[ 7:0 ]) !== 0) ) |
( SEL_O[1] & ((DAT_I[15:8 ] ^ DAT_I[15:8 ]) !== 0) ) |
( SEL_O[2] & ((DAT_I[23:16] ^ DAT_I[23:16]) !== 0) ) |
( SEL_O[3] & ((DAT_I[31:24] ^ DAT_I[31:24]) !== 0) )
)
begin
$display("*E (%0t) Slave provided invalid data during read and qualified it with ACK_I", $time) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)Slave provided invalid data during read and qualified it with ACK_I", $time) ;
$display("*E (%0t) Byte select value: SEL_O = %b, Data bus value: DAT_I = %h ", $time, SEL_O, DAT_I) ;
$fdisplay(log_file_desc, "*E (%0t)(%m)Byte select value: SEL_O = %b, Data bus value: DAT_I = %h ", $time, SEL_O, DAT_I) ;
message_out("Slave provided invalid data during read and qualified it with ACK_I") ;
$display("Byte select value: SEL_O = %b, Data bus value: DAT_I = %h ", last_valid_sel, DAT_I) ;
$fdisplay(log_file_desc, "Byte select value: SEL_O = %b, Data bus value: DAT_I = %h ", last_valid_sel, DAT_I) ;
end
end
end
else
begin
last_valid_sel = {`WB_SEL_WIDTH{1'bx}} ;
last_valid_we = 1'bx ;
end
end
 
initial
task message_out ;
input [7999:0] message_i ;
begin
previous_data = 0 ;
previous_address = 0 ;
can_change = 1 ;
$display("Time: %t", $time) ;
$display("%m, %0s", message_i) ;
$fdisplay(log_file_desc, "Time: %t", $time) ;
$fdisplay(log_file_desc, "%m, %0s", message_i) ;
end
endtask // display message
 
endmodule // BUS_MON

powered by: WebSVN 2.1.0

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