📄 tb_eth_top.v
字号:
////////////////////////////////////////////////////////////////////////// //////// tb_eth_top.v //////// //////// This file is part of the Ethernet IP core project //////// http://www.opencores.org/projects/ethmac/ //////// //////// Author(s): //////// - Igor Mohor (igorM@opencores.org) //////// //////// All additional information is avaliable in the Readme.txt //////// file. //////// ////////////////////////////////////////////////////////////////////////////// //////// Copyright (C) 2001 Authors //////// //////// This source file may be used and distributed without //////// restriction provided that this copyright statement is not //////// removed from the file and that any derivative work contains //////// the original copyright notice and the associated disclaimer. //////// //////// This source file is free software; you can redistribute it //////// and/or modify it under the terms of the GNU Lesser General //////// Public License as published by the Free Software Foundation; //////// either version 2.1 of the License, or (at your option) any //////// later version. //////// //////// This source is distributed in the hope that it will be //////// useful, but WITHOUT ANY WARRANTY; without even the implied //////// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //////// PURPOSE. See the GNU Lesser General Public License for more //////// details. //////// //////// You should have received a copy of the GNU Lesser General //////// Public License along with this source; if not, download it //////// from http://www.opencores.org/lgpl.shtml //////// ////////////////////////////////////////////////////////////////////////////// CVS Revision History//// $Log: tb_eth_top.v,v $// Revision 1.13 2002/05/03 10:25:01 mohor// Testbench supports unaligned accesses.//// Revision 1.12 2002/02/26 17:01:09 mohor// Small fixes for external/internal DMA missmatches.//// Revision 1.11 2002/02/16 13:06:59 mohor// EXTERNAL_DMA used instead of WISHBONE_DMA.//// Revision 1.10 2002/02/16 07:22:15 mohor// Testbench fixed, code simplified, unused signals removed.//// Revision 1.9 2002/02/14 20:14:38 billditt// Added separate tests for Multicast, Unicast, Broadcast//// Revision 1.8 2002/02/12 20:24:00 mohor// HASH0 and HASH1 register read/write added.//// Revision 1.7 2002/02/06 14:11:35 mohor// non-DMA host interface added. Select the right configutation in eth_defines.//// Revision 1.6 2001/12/08 12:36:00 mohor// TX_BD_NUM register added instead of the RB_BD_ADDR.//// Revision 1.5 2001/10/19 11:24:04 mohor// Number of addresses (wb_adr_i) minimized.//// Revision 1.4 2001/10/19 08:46:53 mohor// eth_timescale.v changed to timescale.v This is done because of the// simulation of the few cores in a one joined project.//// Revision 1.3 2001/09/24 14:55:49 mohor// Defines changed (All precede with ETH_). Small changes because some// tools generate warnings when two operands are together. Synchronization// between two clocks domains in eth_wishbonedma.v is changed (due to ASIC// demands).//// Revision 1.2 2001/08/15 14:04:30 mohor// Signal names changed on the top level for easier pad insertion (ASIC).//// Revision 1.1 2001/08/06 14:41:09 mohor// A define FPGA added to select between Artisan RAM (for ASIC) and Block Ram (For Virtex).// Include files fixed to contain no path.// File names and module names changed ta have a eth_ prologue in the name.// File eth_timescale.v is used to define timescale// All pin names on the top module are changed to contain _I, _O or _OE at the end.// Bidirectional signal MDIO is changed to three signals (Mdc_O, Mdi_I, Mdo_O// and Mdo_OE. The bidirectional signal must be created on the top level. This// is done due to the ASIC tools.//// Revision 1.1 2001/07/30 21:46:09 mohor// Directory structure changed. Files checked and joind together.//////////`include "tb_eth_defines.v"`include "eth_defines.v"`include "timescale.v"module tb_eth_top();parameter Tp = 1;reg WB_CLK_I;reg WB_RST_I;reg [31:0] WB_DAT_I;reg [31:0] WB_ADR_I;reg [3:0] WB_SEL_I;reg WB_WE_I;reg WB_CYC_I;reg WB_STB_I;wire [31:0] WB_DAT_O;wire WB_ACK_O;wire WB_ERR_O;reg [1:0] WB_ACK_I;`ifdef EXTERNAL_DMAwire [1:0] WB_REQ_O;wire [1:0] WB_ND_O;wire WB_RD_O;`else// WISHBONE masterwire [31:0] m_wb_adr_o;wire [3:0] m_wb_sel_o;wire m_wb_we_o;reg [31:0] m_wb_dat_i;wire [31:0] m_wb_dat_o;wire m_wb_cyc_o;wire m_wb_stb_o;reg m_wb_ack_i;reg m_wb_err_i;`endifreg MTxClk;wire [3:0] MTxD;wire MTxEn;wire MTxErr;reg MRxClk;reg [3:0] MRxD;reg MRxDV;reg MRxErr;reg MColl;reg MCrs;reg Mdi_I;wire Mdo_O;wire Mdo_OE;wire Mdc_O;reg [7:0] memory0 [0:65535];reg [7:0] memory1 [0:65535];reg [7:0] memory2 [0:65535];reg [7:0] memory3 [0:65535];reg WishboneBusy;reg StartTB;reg [9:0] TxBDIndex;reg [9:0] RxBDIndex;reg LogEnable;`ifdef EXTERNAL_DMA`else integer mcd1; integer mcd2;`endif// Connecting Ethernet top moduleeth_top ethtop( // WISHBONE common .wb_clk_i(WB_CLK_I), .wb_rst_i(WB_RST_I), .wb_dat_i(WB_DAT_I), .wb_dat_o(WB_DAT_O), // WISHBONE slave .wb_adr_i(WB_ADR_I[11:2]), .wb_sel_i(WB_SEL_I), .wb_we_i(WB_WE_I), .wb_cyc_i(WB_CYC_I), .wb_stb_i(WB_STB_I), .wb_ack_o(WB_ACK_O), .wb_err_o(WB_ERR_O), `ifdef EXTERNAL_DMA .wb_ack_i(WB_ACK_I), .wb_req_o(WB_REQ_O), .wb_nd_o(WB_ND_O), .wb_rd_o(WB_RD_O), `else// WISHBONE master .m_wb_adr_o(m_wb_adr_o), .m_wb_sel_o(m_wb_sel_o), .m_wb_we_o(m_wb_we_o), .m_wb_dat_i(m_wb_dat_i), .m_wb_dat_o(m_wb_dat_o), .m_wb_cyc_o(m_wb_cyc_o), .m_wb_stb_o(m_wb_stb_o), .m_wb_ack_i(m_wb_ack_i), .m_wb_err_i(m_wb_err_i), `endif //TX .mtx_clk_pad_i(MTxClk), .mtxd_pad_o(MTxD), .mtxen_pad_o(MTxEn), .mtxerr_pad_o(MTxErr), //RX .mrx_clk_pad_i(MRxClk), .mrxd_pad_i(MRxD), .mrxdv_pad_i(MRxDV), .mrxerr_pad_i(MRxErr), .mcoll_pad_i(MColl), .mcrs_pad_i(MCrs), // MIIM .mdc_pad_o(Mdc_O), .md_pad_i(Mdi_I), .md_pad_o(Mdo_O), .md_padoe_o(Mdo_OE), .int_o());initialbegin WB_CLK_I = 1'b0; WB_DAT_I = 32'h0; WB_ADR_I = 32'h0; WB_SEL_I = 4'h0; WB_WE_I = 1'b0; WB_CYC_I = 1'b0; WB_STB_I = 1'b0;`ifdef EXTERNAL_DMA WB_ACK_I = 2'h0;`else m_wb_ack_i = 0; m_wb_err_i = 0;`endif MTxClk = 1'b0; MRxClk = 1'b0; MRxD = 4'h0; MRxDV = 1'b0; MRxErr = 1'b0; MColl = 1'b0; MCrs = 1'b0; Mdi_I = 1'b0; WishboneBusy = 1'b0; TxBDIndex = 10'h0; RxBDIndex = 10'h0; LogEnable = 1'b1;end// Reset pulseinitialbegin`ifdef EXTERNAL_DMA`else mcd1 = $fopen("ethernet_tx.log"); mcd2 = $fopen("ethernet_rx.log");`endif WB_RST_I = 1'b1; #100 WB_RST_I = 1'b0; #100 StartTB = 1'b1;end// Generating WB_CLK_I clockalwaysbegin// forever #2.5 WB_CLK_I = ~WB_CLK_I; // 2*2.5 ns -> 200.0 MHz // forever #5 WB_CLK_I = ~WB_CLK_I; // 2*5 ns -> 100.0 MHz // forever #10 WB_CLK_I = ~WB_CLK_I; // 2*10 ns -> 50.0 MHz // forever #15 WB_CLK_I = ~WB_CLK_I; // 2*10 ns -> 33.3 MHz forever #18 WB_CLK_I = ~WB_CLK_I; // 2*18 ns -> 27.7 MHz // forever #25 WB_CLK_I = ~WB_CLK_I; // 2*25 ns -> 20.0 MHz// forever #31.25 WB_CLK_I = ~WB_CLK_I; // 2*31.25 ns -> 16.0 MHz // forever #50 WB_CLK_I = ~WB_CLK_I; // 2*50 ns -> 10.0 MHz// forever #55 WB_CLK_I = ~WB_CLK_I; // 2*55 ns -> 9.1 MHz end// Generating MTxClk clockalwaysbegin// #3 forever #20 MTxClk = ~MTxClk; // 2*20 ns -> 25 MHz #3 forever #200 MTxClk = ~MTxClk; // 2*200 ns -> 2.5 MHzend// Generating MRxClk clockalwaysbegin// #16 forever #20 MRxClk = ~MRxClk; // 2*20 ns -> 25 MHz// #16 forever #200 MRxClk = ~MRxClk; // 2*200 ns -> 2.5 MHz #16 forever #62.5 MRxClk = ~MRxClk; // 2*62.5 ns -> 8 MHz // just for testing purposesend`ifdef EXTERNAL_DMAinitialbegin wait(StartTB); // Start of testbench WishboneWrite(32'h00000800, {26'h0, `ETH_MODER_ADR<<2}); // r_Rst = 1 WishboneWrite(32'h00000000, {26'h0, `ETH_MODER_ADR<<2}); // r_Rst = 0 WishboneWrite(32'h00000080, {26'h0, `ETH_TX_BD_NUM_ADR<<2}); // r_RxBDAddress = 0x80 WishboneWrite(32'h0002A443, {26'h0, `ETH_MODER_ADR<<2}); // RxEn, Txen, FullD, CrcEn, Pad, DmaEn, r_IFG WishboneWrite(32'h00000004, {26'h0, `ETH_CTRLMODER_ADR<<2}); //r_TxFlow = 1 SendPacket(16'h0015, 1'b0); SendPacket(16'h0043, 1'b1); // Control frame SendPacket(16'h0025, 1'b0); SendPacket(16'h0045, 1'b0); SendPacket(16'h0025, 1'b0); ReceivePacket(16'h0012, 1'b1); // Initializes RxBD and then Sends a control packet on the MRxD[3:0] signals. ReceivePacket(16'h0011, 1'b0); // Initializes RxBD and then generates traffic on the MRxD[3:0] signals. ReceivePacket(16'h0016, 1'b0); // Initializes RxBD and then generates traffic on the MRxD[3:0] signals. ReceivePacket(16'h0017, 1'b0); // Initializes RxBD and then generates traffic on the MRxD[3:0] signals. ReceivePacket(16'h0018, 1'b0); // Initializes RxBD and then generates traffic on the MRxD[3:0] signals. WishboneRead({26'h0, `ETH_MODER_ADR}); // Read from MODER register WishboneRead({24'h04, (8'h0<<2)}); // Read from TxBD register WishboneRead({24'h04, (8'h1<<2)}); // Read from TxBD register WishboneRead({24'h04, (8'h2<<2)}); // Read from TxBD register WishboneRead({24'h04, (8'h3<<2)}); // Read from TxBD register WishboneRead({24'h04, (8'h4<<2)}); // Read from TxBD register WishboneRead({22'h01, (10'h80<<2)}); // Read from RxBD register WishboneRead({22'h01, (10'h81<<2)}); // Read from RxBD register WishboneRead({22'h01, (10'h82<<2)}); // Read from RxBD register WishboneRead({22'h01, (10'h83<<2)}); // Read from RxBD register WishboneRead({22'h01, (10'h84<<2)}); // Read from RxBD register #10000 $stop;endtask WishboneWrite; input [31:0] Data; input [31:0] Address; integer ii; begin wait (~WishboneBusy); WishboneBusy = 1; @ (posedge WB_CLK_I); #1; WB_ADR_I = Address; WB_DAT_I = Data; WB_WE_I = 1'b1; WB_CYC_I = 1'b1; WB_STB_I = 1'b1; WB_SEL_I = 4'hf; wait(WB_ACK_O); // waiting for acknowledge response // Writing information about the access to the screen @ (posedge WB_CLK_I); if(~Address[11] & ~Address[10]) $write("\nWrite to register (Data: 0x%x, Reg. Addr: 0x%0x)", Data, Address); else if(~Address[11] & Address[10]) if(Address[9:2] < tb_eth_top.ethtop.r_TxBDNum) begin $write("\nWrite to TxBD (Data: 0x%x, TxBD Addr: 0x%0x)\n", Data, Address); if(Data[9]) $write("Send Control packet (PAUSE = 0x%0h)\n", Data[31:16]); end else $write("\nWrite to RxBD (Data: 0x%x, RxBD Addr: 0x%0x)", Data, Address); else $write("\nWB write ?????????????? Data: 0x%x Addr: 0x%0x", Data, Address); #1; WB_ADR_I = 32'hx; WB_DAT_I = 32'hx; WB_WE_I = 1'bx; WB_CYC_I = 1'b0; WB_STB_I = 1'b0; WB_SEL_I = 4'hx; #5 WishboneBusy = 0; endendtasktask WishboneRead; input [31:0] Address; reg [31:0] Data; integer ii; begin wait (~WishboneBusy); WishboneBusy = 1; @ (posedge WB_CLK_I); #1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -