📄 eth_wishbone.v
字号:
RxBDAddress <=#Tp 7'h0; else if(r_RxEn & (~r_RxEn_q)) RxBDAddress <=#Tp r_TxBDNum[6:0]; else if(RxStatusWrite) RxBDAddress <=#Tp TempRxBDAddress;endwire [8:0] TxStatusInLatched = {TxUnderRun, RetryCntLatched[3:0], RetryLimit, LateCollLatched, DeferLatched, CarrierSenseLost};assign RxBDDataIn = {LatchedRxLength, 1'b0, RxStatus, 4'h0, RxStatusInLatched};assign TxBDDataIn = {LatchedTxLength, 1'b0, TxStatus, 2'h0, TxStatusInLatched};// Signals used for various purposesassign TxRetryPulse = TxRetry_wb & ~TxRetry_wb_q;assign TxDonePulse = TxDone_wb & ~TxDone_wb_q;assign TxAbortPulse = TxAbort_wb & ~TxAbort_wb_q;// Generating delayed signalsalways @ (posedge MTxClk or posedge Reset)begin if(Reset) begin TxAbort_q <=#Tp 1'b0; TxRetry_q <=#Tp 1'b0; TxUsedData_q <=#Tp 1'b0; end else begin TxAbort_q <=#Tp TxAbort; TxRetry_q <=#Tp TxRetry; TxUsedData_q <=#Tp TxUsedData; endend// Generating delayed signalsalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) begin TxDone_wb_q <=#Tp 1'b0; TxAbort_wb_q <=#Tp 1'b0; TxRetry_wb_q <=#Tp 1'b0; end else begin TxDone_wb_q <=#Tp TxDone_wb; TxAbort_wb_q <=#Tp TxAbort_wb; TxRetry_wb_q <=#Tp TxRetry_wb; endendreg TxAbortPacketBlocked;always @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxAbortPacket <=#Tp 1'b0; else if(TxAbort_wb & (~tx_burst_en) & MasterWbTX & MasterAccessFinished & (~TxAbortPacketBlocked) | TxAbort_wb & (~MasterWbTX) & (~TxAbortPacketBlocked)) TxAbortPacket <=#Tp 1'b1; else TxAbortPacket <=#Tp 1'b0;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxAbortPacket_NotCleared <=#Tp 1'b0; else if(TxEn & TxEn_q & TxAbortPacket_NotCleared) TxAbortPacket_NotCleared <=#Tp 1'b0; else if(TxAbort_wb & (~tx_burst_en) & MasterWbTX & MasterAccessFinished & (~TxAbortPacketBlocked) | TxAbort_wb & (~MasterWbTX) & (~TxAbortPacketBlocked)) TxAbortPacket_NotCleared <=#Tp 1'b1;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxAbortPacketBlocked <=#Tp 1'b0; else if(!TxAbort_wb & TxAbort_wb_q) TxAbortPacketBlocked <=#Tp 1'b0; else if(TxAbortPacket) TxAbortPacketBlocked <=#Tp 1'b1;endreg TxRetryPacketBlocked;always @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxRetryPacket <=#Tp 1'b0; else if(TxRetry_wb & !tx_burst_en & MasterWbTX & MasterAccessFinished & !TxRetryPacketBlocked | TxRetry_wb & !MasterWbTX & !TxRetryPacketBlocked) TxRetryPacket <=#Tp 1'b1; else TxRetryPacket <=#Tp 1'b0;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxRetryPacket_NotCleared <=#Tp 1'b0; else if(StartTxBDRead) TxRetryPacket_NotCleared <=#Tp 1'b0; else if(TxRetry_wb & !tx_burst_en & MasterWbTX & MasterAccessFinished & !TxRetryPacketBlocked | TxRetry_wb & !MasterWbTX & !TxRetryPacketBlocked) TxRetryPacket_NotCleared <=#Tp 1'b1;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxRetryPacketBlocked <=#Tp 1'b0; else if(!TxRetry_wb & TxRetry_wb_q) TxRetryPacketBlocked <=#Tp 1'b0; else if(TxRetryPacket) TxRetryPacketBlocked <=#Tp 1'b1;endreg TxDonePacketBlocked;always @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxDonePacket <=#Tp 1'b0; else if(TxDone_wb & !tx_burst_en & MasterWbTX & MasterAccessFinished & !TxDonePacketBlocked | TxDone_wb & !MasterWbTX & !TxDonePacketBlocked) TxDonePacket <=#Tp 1'b1; else TxDonePacket <=#Tp 1'b0;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxDonePacket_NotCleared <=#Tp 1'b0; else if(TxEn & TxEn_q & TxDonePacket_NotCleared) TxDonePacket_NotCleared <=#Tp 1'b0; else if(TxDone_wb & !tx_burst_en & MasterWbTX & MasterAccessFinished & (~TxDonePacketBlocked) | TxDone_wb & !MasterWbTX & (~TxDonePacketBlocked)) TxDonePacket_NotCleared <=#Tp 1'b1;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxDonePacketBlocked <=#Tp 1'b0; else if(!TxDone_wb & TxDone_wb_q) TxDonePacketBlocked <=#Tp 1'b0; else if(TxDonePacket) TxDonePacketBlocked <=#Tp 1'b1;end// Indication of the last wordalways @ (posedge MTxClk or posedge Reset)begin if(Reset) LastWord <=#Tp 1'b0; else if((TxEndFrm | TxAbort | TxRetry) & Flop) LastWord <=#Tp 1'b0; else if(TxUsedData & Flop & TxByteCnt == 2'h3) LastWord <=#Tp TxEndFrm_wb;end// Tx end frame generationalways @ (posedge MTxClk or posedge Reset)begin if(Reset) TxEndFrm <=#Tp 1'b0; else if(Flop & TxEndFrm | TxAbort | TxRetry_q) TxEndFrm <=#Tp 1'b0; else if(Flop & LastWord) begin case (TxValidBytesLatched) // synopsys parallel_case 1 : TxEndFrm <=#Tp TxByteCnt == 2'h0; 2 : TxEndFrm <=#Tp TxByteCnt == 2'h1; 3 : TxEndFrm <=#Tp TxByteCnt == 2'h2; 0 : TxEndFrm <=#Tp TxByteCnt == 2'h3; default : TxEndFrm <=#Tp 1'b0; endcase endend// Tx data selection (latching)always @ (posedge MTxClk or posedge Reset)begin if(Reset) TxData <=#Tp 0; else if(TxStartFrm_sync2 & ~TxStartFrm) case(TxPointerLSB) // synopsys parallel_case 2'h0 : TxData <=#Tp TxData_wb[31:24]; // Big Endian Byte Ordering 2'h1 : TxData <=#Tp TxData_wb[23:16]; // Big Endian Byte Ordering 2'h2 : TxData <=#Tp TxData_wb[15:08]; // Big Endian Byte Ordering 2'h3 : TxData <=#Tp TxData_wb[07:00]; // Big Endian Byte Ordering endcase else if(TxStartFrm & TxUsedData & TxPointerLSB==2'h3) TxData <=#Tp TxData_wb[31:24]; // Big Endian Byte Ordering else if(TxUsedData & Flop) begin case(TxByteCnt) // synopsys parallel_case 0 : TxData <=#Tp TxDataLatched[31:24]; // Big Endian Byte Ordering 1 : TxData <=#Tp TxDataLatched[23:16]; 2 : TxData <=#Tp TxDataLatched[15:8]; 3 : TxData <=#Tp TxDataLatched[7:0]; endcase endend// Latching tx dataalways @ (posedge MTxClk or posedge Reset)begin if(Reset) TxDataLatched[31:0] <=#Tp 32'h0; else if(TxStartFrm_sync2 & ~TxStartFrm | TxUsedData & Flop & TxByteCnt == 2'h3 | TxStartFrm & TxUsedData & Flop & TxByteCnt == 2'h0) TxDataLatched[31:0] <=#Tp TxData_wb[31:0];end// Tx under runalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxUnderRun_wb <=#Tp 1'b0; else if(TxAbortPulse) TxUnderRun_wb <=#Tp 1'b0; else if(TxBufferEmpty & ReadTxDataFromFifo_wb) TxUnderRun_wb <=#Tp 1'b1;endreg TxUnderRun_sync1;// Tx under runalways @ (posedge MTxClk or posedge Reset)begin if(Reset) TxUnderRun_sync1 <=#Tp 1'b0; else if(TxUnderRun_wb) TxUnderRun_sync1 <=#Tp 1'b1; else if(BlockingTxStatusWrite_sync2) TxUnderRun_sync1 <=#Tp 1'b0;end// Tx under runalways @ (posedge MTxClk or posedge Reset)begin if(Reset) TxUnderRun <=#Tp 1'b0; else if(BlockingTxStatusWrite_sync2) TxUnderRun <=#Tp 1'b0; else if(TxUnderRun_sync1) TxUnderRun <=#Tp 1'b1;end// Tx Byte counteralways @ (posedge MTxClk or posedge Reset)begin if(Reset) TxByteCnt <=#Tp 2'h0; else if(TxAbort_q | TxRetry_q) TxByteCnt <=#Tp 2'h0; else if(TxStartFrm & ~TxUsedData) case(TxPointerLSB) // synopsys parallel_case 2'h0 : TxByteCnt <=#Tp 2'h1; 2'h1 : TxByteCnt <=#Tp 2'h2; 2'h2 : TxByteCnt <=#Tp 2'h3; 2'h3 : TxByteCnt <=#Tp 2'h0; endcase else if(TxUsedData & Flop) TxByteCnt <=#Tp TxByteCnt + 1'b1;end// Start: Generation of the ReadTxDataFromFifo_tck signal and synchronization to the WB_CLK_Ireg ReadTxDataFromFifo_sync1;reg ReadTxDataFromFifo_sync2;reg ReadTxDataFromFifo_sync3;reg ReadTxDataFromFifo_syncb1;reg ReadTxDataFromFifo_syncb2;reg ReadTxDataFromFifo_syncb3;always @ (posedge MTxClk or posedge Reset)begin if(Reset) ReadTxDataFromFifo_tck <=#Tp 1'b0; else if(TxStartFrm_sync2 & ~TxStartFrm | TxUsedData & Flop & TxByteCnt == 2'h3 & ~LastWord | TxStartFrm & TxUsedData & Flop & TxByteCnt == 2'h0) ReadTxDataFromFifo_tck <=#Tp 1'b1; else if(ReadTxDataFromFifo_syncb2 & ~ReadTxDataFromFifo_syncb3) ReadTxDataFromFifo_tck <=#Tp 1'b0;end// Synchronizing TxStartFrm_wb to MTxClkalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) ReadTxDataFromFifo_sync1 <=#Tp 1'b0; else ReadTxDataFromFifo_sync1 <=#Tp ReadTxDataFromFifo_tck;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) ReadTxDataFromFifo_sync2 <=#Tp 1'b0; else ReadTxDataFromFifo_sync2 <=#Tp ReadTxDataFromFifo_sync1;endalways @ (posedge MTxClk or posedge Reset)begin if(Reset) ReadTxDataFromFifo_syncb1 <=#Tp 1'b0; else ReadTxDataFromFifo_syncb1 <=#Tp ReadTxDataFromFifo_sync2;endalways @ (posedge MTxClk or posedge Reset)begin if(Reset) ReadTxDataFromFifo_syncb2 <=#Tp 1'b0; else ReadTxDataFromFifo_syncb2 <=#Tp ReadTxDataFromFifo_syncb1;endalways @ (posedge MTxClk or posedge Reset)begin if(Reset) ReadTxDataFromFifo_syncb3 <=#Tp 1'b0; else ReadTxDataFromFifo_syncb3 <=#Tp ReadTxDataFromFifo_syncb2;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) ReadTxDataFromFifo_sync3 <=#Tp 1'b0; else ReadTxDataFromFifo_sync3 <=#Tp ReadTxDataFromFifo_sync2;endassign ReadTxDataFromFifo_wb = ReadTxDataFromFifo_sync2 & ~ReadTxDataFromFifo_sync3;// End: Generation of the ReadTxDataFromFifo_tck signal and synchronization to the WB_CLK_I// Synchronizing TxRetry signal (synchronized to WISHBONE clock)always @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxRetrySync1 <=#Tp 1'b0; else TxRetrySync1 <=#Tp TxRetry;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxRetry_wb <=#Tp 1'b0; else TxRetry_wb <=#Tp TxRetrySync1;end// Synchronized TxDone_wb signal (synchronized to WISHBONE clock)always @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxDoneSync1 <=#Tp 1'b0; else TxDoneSync1 <=#Tp TxDone;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxDone_wb <=#Tp 1'b0; else TxDone_wb <=#Tp TxDoneSync1;end// Synchronizing TxAbort signal (synchronized to WISHBONE clock)always @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxAbortSync1 <=#Tp 1'b0; else TxAbortSync1 <=#Tp TxAbort;endalways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) TxAbort_wb <=#Tp 1'b0; else TxAbort_wb <=#Tp TxAbortSync1;endreg RxAbortSync1;reg RxAbortSync2;reg RxAbortSync3;reg RxAbortSync4;reg RxAbortSyncb1;reg RxAbortSyncb2;assign StartRxBDRead = RxStatusWrite | RxAbortSync3 & ~RxAbortSync4 | r_RxEn & ~r_RxEn_q;// Reading the Rx buffer descriptoralways @ (posedge WB_CLK_I or posedge Reset)begin if(Reset) RxBDRead <=#Tp 1'b0; else if(StartRxBDRead & ~RxReady) RxBDRead <=#Tp 1'b1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -