⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tb_eth_top.v

📁 接上回。以太网物理层测试代码
💻 V
📖 第 1 页 / 共 4 页
字号:
    WB_ADR_I = Address;    WB_WE_I  = 1'b0;    WB_CYC_I = 1'b1;    WB_STB_I = 1'b1;    WB_SEL_I = 4'hf;    for(ii=0; (ii<20 & ~WB_ACK_O); ii=ii+1)   // Response on the WISHBONE is limited to 20 WB_CLK_I cycles    begin      @ (posedge WB_CLK_I);      Data = WB_DAT_O;    end    if(ii==20)      begin        $display("\nERROR: Task WishboneRead(Address=0x%0h): Too late or no appeariance of the WB_ACK_O signal, (Time=%0t)",           Address, $time);        #50 $stop;      end    @ (posedge WB_CLK_I);      if(~Address[11] & ~Address[10])        $write("\nRead from 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("\nRead from TxBD (Data: 0x%x, TxBD Addr: 0x%0x)", Data, Address);          end        else          $write("\nRead from RxBD (Data: 0x%x, RxBD Addr: 0x%0x)", Data, Address);      else        $write("\nWB read  ?????????    Data: 0x%x      Addr: 0x%0x", Data, Address);    #1;    WB_ADR_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 SendPacket;  input [15:0]  Length;  input         ControlFrame;  reg           Wrap;  reg [31:0]    TempAddr;  reg [31:0]    TempData;    begin    if(TxBDIndex == 3)    // Only 4 buffer descriptors are used      Wrap = 1'b1;    else      Wrap = 1'b0;    TempAddr = {22'h01, (TxBDIndex<<2)};    TempData = {Length[15:0], 1'b1, 1'b0, Wrap, 3'h0, ControlFrame, 1'b0, TxBDIndex[7:0]};  // Ready and Wrap = 1    #1;    if(TxBDIndex == 3)    // Only 4 buffer descriptors are used      TxBDIndex = 0;    else      TxBDIndex = TxBDIndex + 1;    fork      begin        WishboneWrite(TempData, TempAddr); // Writing status to TxBD      end            begin        if(~ControlFrame)        WaitingForTxDMARequest(4'h1, Length); // Delay, DMALength      end    join  endendtasktask ReceivePacket;    // Initializes RxBD and then generates traffic on the MRxD[3:0] signals.  input [15:0] LengthRx;  input        RxControlFrame;  reg        WrapRx;  reg [31:0] TempRxAddr;  reg [31:0] TempRxData;  reg abc;  begin    if(RxBDIndex == 3)    // Only 4 buffer descriptors are used      WrapRx = 1'b1;    else      WrapRx = 1'b0;    TempRxAddr = {22'h01, ((tb_eth_top.ethtop.r_TxBDNum + RxBDIndex)<<2)};    TempRxData = {LengthRx[15:0], 1'b1, 1'b0, WrapRx, 5'h0, RxBDIndex[7:0]};  // Ready and WrapRx = 1 or 0    #1;    if(RxBDIndex == 3)    // Only 4 buffer descriptors are used      RxBDIndex = 0;    else      RxBDIndex = RxBDIndex + 1;    abc=1;    WishboneWrite(TempRxData, TempRxAddr); // Writing status to RxBD    abc=0;    fork      begin        #200;        if(RxControlFrame)          GetControlDataOnMRxD(LengthRx); // LengthRx = PAUSE timer value.        else          GetDataOnMRxD(LengthRx); // LengthRx bytes is comming on MRxD[3:0] signals      end      begin        if(RxControlFrame)          WaitingForRxDMARequest(4'h1, 16'h40); // Delay, DMALength = 64 bytes.        else          WaitingForRxDMARequest(4'h1, LengthRx); // Delay, DMALength      end    join  endendtasktask WaitingForTxDMARequest;  input [3:0] Delay;  input [15:0] DMALength;  integer pp;  reg [7:0]a, b, c, d;  for(pp=0; pp*4<DMALength; pp=pp+1)  begin    a = 4*pp[7:0]+3;    b = 4*pp[7:0]+2;    c = 4*pp[7:0]+1;    d = 4*pp[7:0]  ;    @ (posedge WB_REQ_O[0]);    repeat(Delay) @(posedge WB_CLK_I);        wait (~WishboneBusy);    WishboneBusy = 1;    #1;    WB_DAT_I = {a, b, c, d};    WB_ADR_I = {22'h02, pp[9:0]};    $display("task WaitingForTxDMARequest: pp=%0d, WB_ADR_I=0x%0h, WB_DAT_I=0x%0h", pp, WB_ADR_I, WB_DAT_I);    WB_WE_I  = 1'b1;    WB_CYC_I = 1'b1;    WB_STB_I = 1'b1;    WB_SEL_I = 4'hf;    WB_ACK_I[0] = 1'b1;    @ (posedge WB_CLK_I);    #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;    WB_ACK_I[0] = 1'b0;    #5 WishboneBusy = 0;  endendtasktask WaitingForRxDMARequest;  input [3:0] Delay;  input [15:0] DMALengthRx;  integer rr;  for(rr=0; rr*4<DMALengthRx; rr=rr+1)  begin    @ (posedge WB_REQ_O[1]);    repeat(Delay) @(posedge WB_CLK_I);        wait (~WishboneBusy);    WishboneBusy = 1;    #1;    WB_ADR_I = {22'h02, rr[9:0]};    $display("task WaitingForRxDMARequest: rr=%0d, WB_ADR_I=0x%0h, WB_DAT_O=0x%0h", rr, WB_ADR_I, WB_DAT_O);    WB_WE_I  = 1'b1;    WB_CYC_I = 1'b1;    WB_STB_I = 1'b1;    WB_SEL_I = 4'hf;    WB_ACK_I[1] = 1'b1;    @ (posedge WB_CLK_I);    #1;    WB_ADR_I = 32'hx;    WB_WE_I  = 1'bx;    WB_CYC_I = 1'b0;    WB_STB_I = 1'b0;    WB_SEL_I = 4'hx;    WB_ACK_I[1] = 1'b0;    #5 WishboneBusy = 0;  endendtasktask GetDataOnMRxD;  input [15:0] Len;  integer tt;  begin    @ (posedge MRxClk);    MRxDV=1'b1;        for(tt=0; tt<15; tt=tt+1)    begin      MRxD=4'h5;              // preamble      @ (posedge MRxClk);    end    MRxD=4'hd;                // SFD        for(tt=0; tt<Len; tt=tt+1)    begin      @ (posedge MRxClk);      MRxD=tt[3:0];      @ (posedge MRxClk);      MRxD=tt[7:4];    end    @ (posedge MRxClk);    MRxDV=1'b0;  endendtasktask GetControlDataOnMRxD;  input [15:0] Timer;  reg [127:0] Packet;  reg [127:0] Data;  reg [31:0] Crc;  integer tt;  begin  Packet = 128'h10082C000010_deadbeef0013_8880_0010; // 0180c2000001 + 8808 + 0001  Crc = 32'h6014fe08; // not a correct value      @ (posedge MRxClk);    MRxDV=1'b1;        for(tt=0; tt<15; tt=tt+1)    begin      MRxD=4'h5;              // preamble      @ (posedge MRxClk);    end    MRxD=4'hd;                // SFD        for(tt=0; tt<32; tt=tt+1)    begin      Data = Packet << (tt*4);      @ (posedge MRxClk);      MRxD=Data[127:124];    end        for(tt=0; tt<2; tt=tt+1)    // timer    begin      Data[15:0] = Timer << (tt*8);      @ (posedge MRxClk);      MRxD=Data[11:8];      @ (posedge MRxClk);      MRxD=Data[15:12];    end        for(tt=0; tt<42; tt=tt+1)   // padding    begin      Data[7:0] = 8'h0;      @ (posedge MRxClk);      MRxD=Data[3:0];      @ (posedge MRxClk);      MRxD=Data[3:0];    end        for(tt=0; tt<4; tt=tt+1)    // crc    begin      Data[31:0] = Crc << (tt*8);      @ (posedge MRxClk);      MRxD=Data[27:24];      @ (posedge MRxClk);      MRxD=Data[31:28];    end                @ (posedge MRxClk);    MRxDV=1'b0;  endendtask`else // No EXTERNAL_DMAinitialbegin  wait(StartTB);  // Start of testbench    // Reset eth MAC core  WishboneWrite(32'h00000800, {26'h0, `ETH_MODER_ADR<<2});     // r_Rst = 1  WishboneWrite(32'h00000000, {26'h0, `ETH_MODER_ADR<<2});     // r_Rst = 0  InitializeMemory;// Select which test you want to run:    TestTxAndRx;  //  TestUnicast;  //  TestBroadcast;  //  TestMulticast;end  task TestTxAndRx; integer ii, jj; integer data_in, bd, pointer; begin  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'h0000a06b, {26'h0, `ETH_MODER_ADR<<2});     // RxEn, Txen, CrcEn, Pad en, half duplex,   WishboneWrite(32'h0000a46b, {26'h0, `ETH_MODER_ADR<<2});     // RxEn, Txen, CrcEn, Pad en, full duplex, //  WishboneWrite(32'h0001a06b, {26'h0, `ETH_MODER_ADR<<2});     // r_RecSmall, RxEn, Txen, CrcEn, Pad en, half duplex,                                                                // r_IPG, promisc On, reject broadcast   WishboneWrite(32'h00000004, {26'h0, `ETH_CTRLMODER_ADR<<2}); //r_TxFlow = 1  WishboneWrite(32'h00000002, {26'h0, `ETH_MAC_ADDR1_ADR<<2}); // MAC = 000203040506  WishboneWrite(32'h03040506, {26'h0, `ETH_MAC_ADDR0_ADR<<2});/*// Just few reads  WishboneRead({26'h0, `ETH_MODER_ADR<<2}, data_in);       // Read from ETH_MODER register  WishboneRead({26'h0, `ETH_TX_BD_NUM_ADR<<2}, data_in);       // Read from ETH_TX_BD_NUM_ADR register  WishboneRead({26'h0, `ETH_MAC_ADDR1_ADR<<2}, data_in);       // Read from ETH_MAC_ADDR1_ADR register  WishboneRead({26'h0, `ETH_MAC_ADDR0_ADR<<2}, data_in);       // Read from ETH_MAC_ADDR0_ADR register*/    for(jj=0; jj<8; jj=jj+4)    begin      WishboneWriteData(`TX_BUF_BASE + jj, 32'hffffffff, 4'hf); // Initializing data to ff    end    for(jj=0; jj<8; jj=jj+4)    begin      WishboneWriteData(`RX_BUF_BASE + jj, 32'hffffffff, 4'hf); // Initializing data to ff    end//  SendPacketX(16'h0064, 1'b0, 2'h3);//  SendPacketX(16'h0064, 1'b0, 2'h2);//  SendPacketX(16'h0064, 1'b0, 2'h1);//  SendPacketX(16'h0064, 1'b0, 2'h0);//  SendPacket(16'h0064, 1'b0);//  SendPacket(16'h0011, 1'b0);//  SendPacket(16'h0012, 1'b0);fork  begin    SendPacketX(16'h264, 1'b0, 2'h3);    SendPacketX(16'h64, 1'b0, 2'h3);  end    begin    ReceivePacketX(16'h0030, 1'b0, `UNICAST_XFR, 2'h0);    // Initializes RxBD and then generates traffic on the MRxD[3:0] signals.    ReceivePacketX(16'h0035, 1'b0, `UNICAST_XFR, 2'h0);    // Initializes RxBD and then generates traffic on the MRxD[3:0] signals.    ReceivePacketX(16'h0040, 1'b0, `UNICAST_XFR, 2'h0);    // Initializes RxBD and then generates traffic on the MRxD[3:0] signals.    ReceivePacketX(16'h0035, 1'b0, `UNICAST_XFR, 2'h0);    // Initializes RxBD and then generates traffic on the MRxD[3:0] signals.    ReceivePacketX(16'h0062, 1'b0, `UNICAST_XFR, 2'h0);    // Initializes RxBD and then generates traffic on the MRxD[3:0] signals.  endjoinfork  begin    wait(tb_eth_top.ethtop.wishbone.TxStatusWrite);   // wait until tx status is written  end    begin    wait(tb_eth_top.ethtop.wishbone.RxStatusWrite);   // wait until rx status is written  endjoin/*  SendPacket(16'h0013, 1'b0);  SendPacket(16'h0014, 1'b0);  SendPacket(16'h0030, 1'b0);  SendPacket(16'h0031, 1'b0);  SendPacket(16'h0032, 1'b0);  SendPacket(16'h0033, 1'b0);  SendPacket(16'h0025, 1'b0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -