📄 tb_eth_top.v
字号:
end else $write("\n(%0t) Write to RxBD (Data: 0x%x, RxBD Addr: 0x%0x)", $time, Data, Address); else $write("\n(%0t) WB write ?????????????? Data: 0x%x Addr: 0x%0x", $time, Data, Address); end #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; output[31:0] data; begin wait (~WishboneBusy); WishboneBusy = 1; @ (posedge WB_CLK_I); #1; WB_ADR_I = Address; WB_WE_I = 1'b0; WB_CYC_I = 1'b1; WB_STB_I = 1'b1; WB_SEL_I = 4'hf; #3; wait(WB_ACK_O); // waiting for acknowledge response @ (posedge WB_CLK_I); data = WB_DAT_O; if(~Address[11] & ~Address[10])// $write("\n(%0t) Read from register (Data: 0x%x, Reg. Addr: 0x%0x)", $time, WB_DAT_O, Address); $write("\n(%0t) Read from register (Data: 0x%x, Reg. Addr: 0x%0x)", $time, data, Address); else if(~Address[11] & Address[10]) if(Address[9:2] < tb_eth_top.ethtop.r_TxBDNum)// ; //$write("\n(%0t) Read from TxBD (Data: 0x%x, TxBD Addr: 0x%0x)", $time, WB_DAT_O, Address); ; //$write("\n(%0t) Read from TxBD (Data: 0x%x, TxBD Addr: 0x%0x)", $time, data, Address); else// ;//$write("\n(%0t) Read from RxBD (Data: 0x%x, RxBD Addr: 0x%0x)", $time, WB_DAT_O, Address); ;//$write("\n(%0t) Read from RxBD (Data: 0x%x, RxBD Addr: 0x%0x)", $time, data, Address); else// $write("\n(%0t) WB read ????????? Data: 0x%x Addr: 0x%0x", $time, WB_DAT_O, Address); $write("\n(%0t) WB read ????????? Data: 0x%x Addr: 0x%0x", $time, 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 WishboneReadData; input [31:0] Address; output[31:0] data; begin @ (posedge WB_CLK_I); data = {memory3[Address], memory2[Address], memory1[Address], memory0[Address]}; #5; endendtasktask WishboneWriteData; input [31:0] Address; input [31:0] data; input [3:0] Select; begin @ (posedge WB_CLK_I); if(Select[0]) memory0[Address] = data[7:0]; if(Select[1]) memory1[Address] = data[15:8]; if(Select[2]) memory2[Address] = data[23:16]; if(Select[3]) memory3[Address] = data[31:24];// $display("\n(%0t) Write data to memory (Data: 0x%x, Addr: 0x%0x)", $time, data, Address); #5; endendtasktask SendPacket; input [15:0] Length; input ControlFrame; reg Wrap; reg [31:0] TempAddr; reg [31:0] TempData; reg [31:0] kk; begin// if(TxBDIndex == 6) // Only 3 buffer descriptors are used // Wrap = 1'b1;// else Wrap = 1'b0; // At the moment no wrap bit is set // Writing data to buffer for(kk=0; kk<Length; kk=kk+4) begin TempAddr = `TX_BUF_BASE + TxBDIndex * 32'h600 + kk; TempData = {kk[7:0], kk[7:0]+2'h1, kk[7:0]+2'h2, kk[7:0]+2'h3}; WishboneWriteData(TempAddr, TempData, 4'hf); // Writing Data to buffer that is pointed by the BD end // Writing buffer pointer TempAddr = {22'h01, ((TxBDIndex*2'h2 + 1'b1)<<2)}; TempData = `TX_BUF_BASE + TxBDIndex * 32'h600; // 1536 bytes is reserved for one frame WishboneWrite(TempData, TempAddr); // Writing Tx pointer TempAddr = {22'h01, ((TxBDIndex*2'h2)<<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 == 6) // Only 4 buffer descriptors are used// TxBDIndex = 0;// else TxBDIndex = TxBDIndex + 1; WishboneWrite(TempData, TempAddr); // Writing status to TxBD endendtasktask SendPacketX; input [15:0] Length; input ControlFrame; input [1:0] AddrOffset; reg Wrap; reg [31:0] TempAddr; reg [31:0] TempData; reg [31:0] kk; reg [3:0] Select; begin Wrap = 1'b0; case(AddrOffset) 2'h0 : Select = 4'hf; 2'h1 : Select = 4'h7; 2'h2 : Select = 4'h3; 2'h3 : Select = 4'h1; endcase // Writing data to buffer for(kk=0; kk<Length+4; kk=kk+4) // Length+4 is because we might start up to 3 bytes later begin if(kk>0) Select = 4'hf; TempAddr = `TX_BUF_BASE + TxBDIndex * 32'h600 + kk; TempData = {kk[7:0]+3'h1, kk[7:0]+3'h2, kk[7:0]+3'h3, kk[7:0]+3'h4}; WishboneWriteData(TempAddr, TempData, Select); // Writing Data to buffer that is pointed by the BD end // Writing buffer pointer TempAddr = {22'h01, ((TxBDIndex*2'h2 + 1'b1)<<2)}; TempData = `TX_BUF_BASE + TxBDIndex * 32'h600 + AddrOffset; // 1536 bytes is reserved for one frame WishboneWrite(TempData, TempAddr); // Writing Tx pointer TempAddr = {22'h01, ((TxBDIndex*2'h2)<<2)}; TempData = {Length[15:0], 1'b1, 1'b1, Wrap, 3'h0, ControlFrame, 1'b0, TxBDIndex[7:0]}; // Ready, interrupt and Wrap = 1 #1; if(Wrap) TxBDIndex = 0; else TxBDIndex = TxBDIndex + 1; WishboneWrite(TempData, TempAddr); // Writing status to TxBD endendtasktask ReceivePacket; // Initializes RxBD and then generates traffic on the MRxD[3:0] signals. input [15:0] LengthRx; input RxControlFrame; input [31:0] TransferType; //Broadcast,Unicast,Multicast reg WrapRx; reg [31:0] TempRxAddr;// reg [31:0] TempRxData; integer TempRxData; reg abc; begin// if(RxBDIndex == 6) // Only 3 buffer descriptors are used// WrapRx = 1'b1;// else WrapRx = 1'b0; TempRxAddr = {22'h01, ((tb_eth_top.ethtop.r_TxBDNum + RxBDIndex*2'h2 + 1'b1)<<2)}; TempRxData = `RX_BUF_BASE + RxBDIndex * 32'h600; // 1536 bytes is reserved for one frame WishboneWrite(TempRxData, TempRxAddr); // Writing Rx pointer TempRxAddr = {22'h01, ((tb_eth_top.ethtop.r_TxBDNum + RxBDIndex*2'h2)<<2)}; TempRxData = {16'h0, 1'b1, 1'b0, WrapRx, 5'h0, RxBDIndex[7:0]}; // Ready and WrapRx = 1 or 0 #1;// if(RxBDIndex == 6) // Only 4 buffer descriptors are used// RxBDIndex = 0;// else RxBDIndex = RxBDIndex + 1; abc=1; WishboneWrite(TempRxData, TempRxAddr); // Writing status to RxBD abc=0; begin #200; if(RxControlFrame) GetControlDataOnMRxD(LengthRx); // LengthRx = PAUSE timer value. else GetDataOnMRxD(LengthRx, TransferType); // LengthRx bytes is comming on MRxD[3:0] signals end endendtasktask ReceivePacketX; // Initializes RxBD and then generates traffic on the MRxD[3:0] signals. input [15:0] LengthRx; input RxControlFrame; input [31:0] TransferType; //Broadcast,Unicast,Multicast input [1:0] AddrOffset; reg WrapRx; reg [31:0] TempRxAddr; integer TempRxData; reg abc; begin WrapRx = 1'b0; TempRxAddr = {22'h01, ((tb_eth_top.ethtop.r_TxBDNum + RxBDIndex*2'h2 + 1'b1)<<2)}; TempRxData = `RX_BUF_BASE + RxBDIndex * 32'h600 + AddrOffset; // 1536 bytes is reserved for one frame WishboneWrite(TempRxData, TempRxAddr); // Writing Rx pointer TempRxAddr = {22'h01, ((tb_eth_top.ethtop.r_TxBDNum + RxBDIndex*2'h2)<<2)}; TempRxData = {16'h0, 1'b1, 1'b1, WrapRx, 5'h0, RxBDIndex[7:0]}; // Ready, interrupt and WrapRx = 1 or 0 #1; RxBDIndex = RxBDIndex + 1; abc=1; WishboneWrite(TempRxData, TempRxAddr); // Writing status to RxBD abc=0; begin #200; if(RxControlFrame) GetControlDataOnMRxD(LengthRx); // LengthRx = PAUSE timer value. else GetDataOnMRxD(LengthRx, TransferType); // LengthRx bytes is comming on MRxD[3:0] signals end endendtasktask GetDataOnMRxD; input [15:0] Len; input [31:0] TransferType; 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=1; tt<(Len+1); tt=tt+1) begin @ (posedge MRxClk); if(TransferType == `UNICAST_XFR && tt == 1) MRxD= 4'h0; // Unicast transfer else if(TransferType == `BROADCAST_XFR && tt < 7) MRxD = 4'hf; else MRxD=tt[3:0]; // Multicast transfer @ (posedge MRxClk); if(TransferType == `BROADCAST_XFR && tt < 7) MRxD = 4'hf; else 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; endendtasktask InitializeMemory; reg [9:0] mem_addr; begin LogEnable = 1'b0; $display("\n\n(%0t) Initializing Memory...", $time); for(mem_addr=0; mem_addr<=10'h0ff; mem_addr=mem_addr+1'b1) WishboneWrite(32'h0, {22'h01, mem_addr<<2}); // Writing status to RxBD LogEnable = 1'b1; endendtask`endifendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -