Files
eb001/src/main/scala/Switch/mac/MAC.scala

760 lines
23 KiB
Scala
Raw Normal View History

2023-06-18 08:34:44 +00:00
package MAC
import chisel3._
2023-07-03 23:51:01 +08:00
import chisel3.util._
2023-06-18 08:34:44 +00:00
2023-10-19 15:24:26 +08:00
import Switch._
2023-06-18 08:34:44 +00:00
import freechips.rocketchip.util._
2023-10-19 15:24:26 +08:00
class MII extends Bundle with MDIO{
2023-07-03 23:51:01 +08:00
// Tx
val mtx_clk_pad_i = Input(Bool())
val mtxd_pad_o = Output(UInt(4.W))
val mtxen_pad_o = Output(Bool())
val mtxerr_pad_o = Output(Bool())
// Rx
val mrx_clk_pad_i = Input(Bool())
val mrxd_pad_i = Input(UInt(4.W))
val mrxdv_pad_i = Input(Bool())
val mrxerr_pad_i = Input(Bool())
// Common Tx and Rx
val mcoll_pad_i = Input(Bool())
2023-10-19 15:24:26 +08:00
val mcrs_pad_i = Input(Bool())
}
class MacIO extends Bundle{
val mii = new MII
val cfg = Flipped(new Mac_Config_Bundle)
val rxEnq = new Receive_Enq_Bundle
2023-10-20 14:42:15 +08:00
val txDeq = Flipped(new Transmit_Bundle)
2023-07-03 23:51:01 +08:00
2023-07-11 22:02:41 +08:00
// val int_o = Output(Bool())
2023-09-19 18:03:30 +08:00
val isLoopBack = Output(Bool())
2023-09-25 14:18:27 +08:00
val asyncReset = Input(AsyncReset())
2023-07-03 23:51:01 +08:00
}
2023-10-19 15:24:26 +08:00
class Mac extends Module{
2023-07-03 23:51:01 +08:00
2023-07-11 17:38:18 +08:00
val io = IO(new MacIO)
2023-07-03 23:51:01 +08:00
val r_ClkDiv = Wire(UInt(8.W))
val r_MiiNoPre = Wire(Bool())
val r_CtrlData = Wire(UInt(16.W))
val r_FIAD = Wire(UInt(5.W))
val r_RGAD = Wire(UInt(5.W))
val r_WCtrlData = Wire(Bool())
val r_RStat = Wire(Bool())
val r_ScanStat = Wire(Bool())
val NValid_stat = Wire(Bool())
val Busy_stat = Wire(Bool())
val LinkFail = Wire(Bool())
val Prsd = Wire(UInt(16.W))
val WCtrlDataStart = Wire(Bool())
val RStatStart = Wire(Bool())
val UpdateMIIRX_DATAReg = Wire(Bool())
2023-07-04 10:00:08 +08:00
dontTouch( r_ClkDiv )
dontTouch( r_MiiNoPre )
dontTouch( r_CtrlData )
dontTouch( r_FIAD )
dontTouch( r_RGAD )
dontTouch( r_WCtrlData )
dontTouch( r_RStat )
dontTouch( r_ScanStat )
dontTouch( NValid_stat )
dontTouch( Busy_stat )
dontTouch( LinkFail )
dontTouch( Prsd )
dontTouch( WCtrlDataStart )
dontTouch( RStatStart )
dontTouch( UpdateMIIRX_DATAReg )
2023-07-03 23:51:01 +08:00
val TxStartFrm = Wire(Bool())
2023-07-04 10:00:08 +08:00
val TxEndFrm = Wire(Bool())
2023-07-03 23:51:01 +08:00
val TxUsedData = Wire(Bool())
2023-07-04 10:00:08 +08:00
val TxData = Wire(UInt(8.W))
val TxAbort = Wire(Bool())
val TxDone = Wire(Bool())
val TPauseRq = Wire(Bool())
2023-07-03 23:51:01 +08:00
2023-07-04 10:00:08 +08:00
dontTouch(TxStartFrm)
dontTouch(TxEndFrm )
dontTouch(TxUsedData)
dontTouch(TxData )
dontTouch(TxAbort )
dontTouch(TxDone )
dontTouch(TPauseRq )
2023-07-03 23:51:01 +08:00
2023-07-04 10:00:08 +08:00
val RstTxPauseRq = RegInit(false.B)
2023-07-03 23:51:01 +08:00
// Connecting Miim module
val miim = Module(new MIIM)
miim.io.Divider := r_ClkDiv
miim.io.NoPre := r_MiiNoPre
miim.io.WCtrlData := r_WCtrlData
miim.io.CtrlData := r_CtrlData
miim.io.Fiad := r_FIAD
miim.io.Rgad := r_RGAD
miim.io.RStat := r_RStat
miim.io.ScanStat := r_ScanStat
2023-10-19 15:24:26 +08:00
miim.io.mdi := io.mii.mdi
2023-07-03 23:51:01 +08:00
Busy_stat := miim.io.Busy
LinkFail := miim.io.LinkFail
NValid_stat := miim.io.Nvalid
Prsd := miim.io.Prsd
WCtrlDataStart := miim.io.WCtrlDataStart
RStatStart := miim.io.RStatStart
UpdateMIIRX_DATAReg := miim.io.UpdateMIIRX_DATAReg
2023-10-19 15:24:26 +08:00
io.mii.mdc := miim.io.mdc
io.mii.mdo := miim.io.mdo
io.mii.mdoEn := miim.io.mdoEn
2023-07-03 23:51:01 +08:00
2023-07-04 10:00:08 +08:00
val r_LoopBck = Wire(Bool())
val r_TxEn = Wire(Bool())
2023-07-04 10:00:08 +08:00
val r_RxEn = Wire(Bool())
val MRxDV_Lb = Wire(Bool())
val MRxErr_Lb = Wire(Bool())
val MRxD_Lb = Wire(UInt(4.W))
val Transmitting = Wire(Bool())
val r_DlyCrcEn = Wire(Bool())
val r_MaxFL = Wire(UInt(16.W))
val r_MinFL = Wire(UInt(16.W))
val DribbleNibble = Wire(Bool())
val r_MAC = Wire(UInt(48.W))
val LoadRxStatus = Wire(Bool())
val r_HASH0 = Wire(UInt(32.W))
val r_HASH1 = Wire(UInt(32.W))
val r_TxBDNum = Wire(UInt(8.W))
2023-07-04 10:00:08 +08:00
val r_IPGT = Wire(UInt(7.W))
val r_IPGR1 = Wire(UInt(7.W))
val r_IPGR2 = Wire(UInt(7.W))
val r_CollValid = Wire(UInt(6.W))
val r_TxPauseTV = Wire(UInt(16.W))
val r_TxPauseRq = Wire(Bool())
val r_ExDfrEn = Wire(Bool())
val r_TxFlow = Wire(Bool())
val r_IFG = Wire(Bool())
val TxB_IRQ = Wire(Bool())
val TxE_IRQ = Wire(Bool())
val RxB_IRQ = Wire(Bool())
val RxE_IRQ = Wire(Bool())
val Busy_IRQ = Wire(Bool())
2023-07-04 10:00:08 +08:00
val r_Pad = Wire(Bool())
val r_CrcEn = Wire(Bool())
val r_FullD = Wire(Bool())
val r_NoPre = Wire(Bool())
val r_RxFlow = Wire(Bool())
val TxCtrlEndFrm = Wire(Bool())
val StartTxDone = Wire(Bool())
val SetPauseTimer = Wire(Bool())
val TxUsedDataIn = Wire(Bool())
val TxDoneIn = Wire(Bool())
val TxAbortIn = Wire(Bool())
val PerPacketPad = Wire(Bool())
val PadOut = Wire(Bool())
val PerPacketCrcEn = Wire(Bool())
val CrcEnOut = Wire(Bool())
val TxStartFrmOut = Wire(Bool())
val TxEndFrmOut = Wire(Bool())
val ReceivedPauseFrm = Wire(Bool())
val ControlFrmAddressOK = Wire(Bool())
2023-10-08 15:30:08 +08:00
val RxStatusWriteLatchedSync = Wire(Bool())
2023-07-04 10:00:08 +08:00
val LateCollision = Wire(Bool())
val DeferIndication = Wire(Bool())
val LateCollLatched = Wire(Bool())
val DeferLatched = Wire(Bool())
val RstDeferLatched = Wire(Bool())
val CarrierSenseLost = Wire(Bool())
dontTouch(r_LoopBck )
dontTouch(r_TxEn )
2023-07-04 10:00:08 +08:00
dontTouch(r_RxEn )
dontTouch(MRxDV_Lb )
dontTouch(MRxErr_Lb )
dontTouch(MRxD_Lb )
dontTouch(Transmitting )
dontTouch(r_DlyCrcEn )
dontTouch(r_MaxFL )
dontTouch(r_MinFL )
dontTouch(DribbleNibble )
dontTouch(r_MAC )
dontTouch(LoadRxStatus )
dontTouch(r_HASH0 )
dontTouch(r_HASH1 )
dontTouch(r_TxBDNum )
2023-07-04 10:00:08 +08:00
dontTouch(r_IPGT )
dontTouch(r_IPGR1 )
dontTouch(r_IPGR2 )
dontTouch(r_CollValid )
dontTouch(r_TxPauseTV )
dontTouch(r_TxPauseRq )
dontTouch(r_ExDfrEn )
dontTouch(r_TxFlow )
dontTouch(r_IFG )
dontTouch(TxB_IRQ )
dontTouch(TxE_IRQ )
dontTouch(RxB_IRQ )
dontTouch(RxE_IRQ )
dontTouch(Busy_IRQ )
2023-07-04 10:00:08 +08:00
dontTouch(r_Pad )
dontTouch(r_CrcEn )
dontTouch(r_FullD )
dontTouch(r_NoPre )
dontTouch(r_RxFlow )
dontTouch(TxCtrlEndFrm )
dontTouch(StartTxDone )
dontTouch(SetPauseTimer )
dontTouch(TxUsedDataIn )
dontTouch(TxDoneIn )
dontTouch(TxAbortIn )
dontTouch(PerPacketPad )
dontTouch(PadOut )
dontTouch(PerPacketCrcEn )
dontTouch(CrcEnOut )
dontTouch(TxStartFrmOut )
dontTouch(TxEndFrmOut )
dontTouch(ReceivedPauseFrm )
dontTouch(ControlFrmAddressOK )
2023-10-08 15:30:08 +08:00
dontTouch(RxStatusWriteLatchedSync )
2023-07-04 10:00:08 +08:00
dontTouch(LateCollision )
dontTouch(DeferIndication )
dontTouch(LateCollLatched )
dontTouch(DeferLatched )
dontTouch(RstDeferLatched )
dontTouch(CarrierSenseLost )
2023-07-20 14:58:59 +08:00
// val ethReg = Module(new MacReg(outer.configNode))
2023-10-19 15:24:26 +08:00
io.cfg.WCtrlDataStart := WCtrlDataStart
io.cfg.RStatStart := RStatStart
io.cfg.UpdateMIIRX_DATAReg := UpdateMIIRX_DATAReg
io.cfg.Prsd := Prsd
io.cfg.NValid_stat := NValid_stat
io.cfg.Busy_stat := Busy_stat
io.cfg.LinkFail := LinkFail
io.cfg.TxB_IRQ := TxB_IRQ
io.cfg.TxE_IRQ := TxE_IRQ
io.cfg.RxB_IRQ := RxB_IRQ
io.cfg.RxE_IRQ := RxE_IRQ
io.cfg.Busy_IRQ := Busy_IRQ
io.cfg.RstTxPauseRq := RstTxPauseRq
io.cfg.TxCtrlEndFrm := TxCtrlEndFrm
io.cfg.StartTxDone := StartTxDone
io.cfg.TxClk := io.mii.mtx_clk_pad_i
io.cfg.RxClk := io.mii.mrx_clk_pad_i
io.cfg.SetPauseTimer := SetPauseTimer
r_Pad := io.cfg.r_Pad
r_CrcEn := io.cfg.r_CrcEn
r_DlyCrcEn := io.cfg.r_DlyCrcEn
r_FullD := io.cfg.r_FullD
r_ExDfrEn := io.cfg.r_ExDfrEn
r_LoopBck := io.cfg.r_LoopBck
r_IFG := io.cfg.r_IFG
r_NoPre := io.cfg.r_NoPre
r_TxEn := io.cfg.r_TxEn
r_RxEn := io.cfg.r_RxEn
r_HASH0 := io.cfg.r_HASH0
r_HASH1 := io.cfg.r_HASH1
r_IPGT := io.cfg.r_IPGT
r_IPGR1 := io.cfg.r_IPGR1
r_IPGR2 := io.cfg.r_IPGR2
r_MinFL := io.cfg.r_MinFL
r_MaxFL := io.cfg.r_MaxFL
r_CollValid := io.cfg.r_CollValid
r_TxFlow := io.cfg.r_TxFlow
r_RxFlow := io.cfg.r_RxFlow
r_MiiNoPre := io.cfg.r_MiiNoPre
r_ClkDiv := io.cfg.r_ClkDiv
r_WCtrlData := io.cfg.r_WCtrlData
r_RStat := io.cfg.r_RStat
r_ScanStat := io.cfg.r_ScanStat
r_RGAD := io.cfg.r_RGAD
r_FIAD := io.cfg.r_FIAD
r_CtrlData := io.cfg.r_CtrlData
r_MAC := io.cfg.r_MAC
r_TxBDNum := io.cfg.r_TxBDNum
r_TxPauseTV := io.cfg.r_TxPauseTV
r_TxPauseRq := io.cfg.r_TxPauseRq
2023-07-03 23:51:01 +08:00
2023-07-04 10:00:08 +08:00
val RxData = Wire(UInt(8.W))
val RxValid = Wire(Bool())
val RxStartFrm = Wire(Bool())
val RxEndFrm = Wire(Bool())
val WillTransmit = Wire(Bool())
val ResetCollision = Wire(Bool())
val TxDataOut = Wire(UInt(8.W))
2023-07-03 23:51:01 +08:00
val WillSendControlFrame = Wire(Bool())
2023-07-04 10:00:08 +08:00
val ReceiveEnd = Wire(Bool())
val ReceivedPacketGood = Wire(Bool())
val ReceivedLengthOK = Wire(Bool())
val LatchedCrcError = Wire(Bool())
val RxLateCollision = Wire(Bool())
val StartTxAbort = Wire(Bool())
val MaxCollisionOccured = Wire(Bool())
val RetryLimit = Wire(Bool())
val StatePreamble = Wire(Bool())
val StateData = Wire(UInt(2.W))
dontTouch(RxData )
dontTouch(RxValid )
dontTouch(RxStartFrm )
dontTouch(RxEndFrm )
dontTouch(WillTransmit )
dontTouch(ResetCollision )
dontTouch(TxDataOut )
dontTouch(WillSendControlFrame)
dontTouch(ReceiveEnd )
dontTouch(ReceivedPacketGood )
dontTouch(ReceivedLengthOK )
dontTouch(LatchedCrcError )
dontTouch(RxLateCollision )
dontTouch(StartTxAbort )
dontTouch(MaxCollisionOccured )
dontTouch(RetryLimit )
dontTouch(StatePreamble )
dontTouch(StateData )
2023-07-03 23:51:01 +08:00
// Connecting MACControl
val maccontrol = Module(new MacControl)
2023-10-19 15:24:26 +08:00
maccontrol.io.MTxClk := io.mii.mtx_clk_pad_i
maccontrol.io.MRxClk := io.mii.mrx_clk_pad_i
2023-09-25 14:18:27 +08:00
maccontrol.io.asyncReset := io.asyncReset
2023-07-03 23:51:01 +08:00
maccontrol.io.TPauseRq := TPauseRq
maccontrol.io.TxDataIn := TxData
maccontrol.io.TxStartFrmIn := TxStartFrm
maccontrol.io.TxUsedDataIn := TxUsedDataIn
maccontrol.io.TxEndFrmIn := TxEndFrm
maccontrol.io.TxDoneIn := TxDoneIn
maccontrol.io.TxAbortIn := TxAbortIn
maccontrol.io.PadIn := r_Pad | PerPacketPad
maccontrol.io.CrcEnIn := r_CrcEn | PerPacketCrcEn
maccontrol.io.RxData := RxData
maccontrol.io.RxValid := RxValid
maccontrol.io.RxStartFrm := RxStartFrm
maccontrol.io.RxEndFrm := RxEndFrm
maccontrol.io.ReceiveEnd := ReceiveEnd
maccontrol.io.ReceivedPacketGood := ReceivedPacketGood
maccontrol.io.ReceivedLengthOK := ReceivedLengthOK
maccontrol.io.TxFlow := r_TxFlow
maccontrol.io.RxFlow := r_RxFlow
maccontrol.io.DlyCrcEn := r_DlyCrcEn
maccontrol.io.TxPauseTV := r_TxPauseTV
maccontrol.io.MAC := r_MAC
2023-10-08 15:30:08 +08:00
maccontrol.io.RxStatusWriteLatched_sync2 := RxStatusWriteLatchedSync
2023-07-03 23:51:01 +08:00
TxDataOut := maccontrol.io.TxDataOut
TxStartFrmOut := maccontrol.io.TxStartFrmOut
TxEndFrmOut := maccontrol.io.TxEndFrmOut
TxDone := maccontrol.io.TxDoneOut
TxAbort := maccontrol.io.TxAbortOut
TxUsedData := maccontrol.io.TxUsedDataOut
PadOut := maccontrol.io.PadOut
CrcEnOut := maccontrol.io.CrcEnOut
WillSendControlFrame := maccontrol.io.WillSendControlFrame
TxCtrlEndFrm := maccontrol.io.TxCtrlEndFrm
ReceivedPauseFrm := maccontrol.io.ReceivedPauseFrm
ControlFrmAddressOK := maccontrol.io.ControlFrmAddressOK
SetPauseTimer := maccontrol.io.SetPauseTimer
2023-07-04 10:00:08 +08:00
val TxCarrierSense = Wire(Bool())
val Collision = Wire(Bool())
2023-07-03 23:51:01 +08:00
val CarrierSense_Tx2 = Wire(Bool())
2023-07-04 10:00:08 +08:00
val RxEnSync = Wire(Bool())
2023-07-03 23:51:01 +08:00
2023-07-04 10:00:08 +08:00
dontTouch(TxCarrierSense )
dontTouch(Collision )
dontTouch(CarrierSense_Tx2)
dontTouch(RxEnSync )
2023-07-03 23:51:01 +08:00
2023-09-19 18:03:30 +08:00
io.isLoopBack := r_LoopBck
2023-07-03 23:51:01 +08:00
// Muxed MII receive data valid
2023-10-19 15:24:26 +08:00
MRxDV_Lb := Mux(r_LoopBck, io.mii.mtxen_pad_o, io.mii.mrxdv_pad_i & RxEnSync)
2023-07-03 23:51:01 +08:00
// Muxed MII Receive Error
2023-10-19 15:24:26 +08:00
MRxErr_Lb := Mux(r_LoopBck, io.mii.mtxerr_pad_o, io.mii.mrxerr_pad_i & RxEnSync)
2023-07-03 23:51:01 +08:00
// Muxed MII Receive Data
2023-10-19 15:24:26 +08:00
MRxD_Lb := Mux(r_LoopBck, io.mii.mtxd_pad_o, io.mii.mrxd_pad_i)
2023-07-03 23:51:01 +08:00
2023-10-19 15:24:26 +08:00
val txethmac = withClockAndReset(io.mii.mtx_clk_pad_i.asClock, io.asyncReset)( Module(new MacTx))
2023-09-25 14:18:27 +08:00
2023-07-03 23:51:01 +08:00
txethmac.io.TxStartFrm := TxStartFrmOut
txethmac.io.TxEndFrm := TxEndFrmOut
txethmac.io.TxData := TxDataOut
txethmac.io.CarrierSense := TxCarrierSense
txethmac.io.Collision := Collision
txethmac.io.Pad := PadOut
txethmac.io.CrcEn := CrcEnOut
txethmac.io.FullD := r_FullD
txethmac.io.DlyCrcEn := r_DlyCrcEn
txethmac.io.MinFL := r_MinFL
txethmac.io.MaxFL := r_MaxFL
txethmac.io.IPGT := r_IPGT
txethmac.io.IPGR1 := r_IPGR1
txethmac.io.IPGR2 := r_IPGR2
txethmac.io.CollValid := r_CollValid
txethmac.io.ExDfrEn := r_ExDfrEn
2023-10-19 15:24:26 +08:00
io.mii.mtxd_pad_o := txethmac.io.MTxD
io.mii.mtxen_pad_o := txethmac.io.MTxEn
io.mii.mtxerr_pad_o := txethmac.io.MTxErr
2023-07-03 23:51:01 +08:00
TxDoneIn := txethmac.io.TxDone
TxAbortIn := txethmac.io.TxAbort
TxUsedDataIn := txethmac.io.TxUsedData
WillTransmit := txethmac.io.WillTransmit
ResetCollision := txethmac.io.ResetCollision
StartTxDone := txethmac.io.StartTxDone
StartTxAbort := txethmac.io.StartTxAbort
MaxCollisionOccured := txethmac.io.MaxCollisionOccured
LateCollision := txethmac.io.LateCollision
DeferIndication := txethmac.io.DeferIndication
StatePreamble := txethmac.io.StatePreamble
StateData := txethmac.io.StateData
val RxByteCnt = Wire(UInt(16.W))
val RxByteCntEq0 = Wire(Bool())
val RxByteCntGreat2 = Wire(Bool())
val RxCrcError = Wire(Bool())
val RxStateIdle = Wire(Bool())
val RxStatePreamble = Wire(Bool())
val RxStateSFD = Wire(Bool())
val RxStateData = Wire(UInt(2.W))
val AddressMiss = Wire(Bool())
2023-07-04 10:00:08 +08:00
dontTouch(RxByteCnt )
dontTouch(RxByteCntEq0 )
dontTouch(RxByteCntGreat2 )
dontTouch(RxCrcError )
dontTouch(RxStateIdle )
dontTouch(RxStatePreamble )
dontTouch(RxStateSFD )
dontTouch(RxStateData )
dontTouch(AddressMiss )
2023-10-19 15:24:26 +08:00
val rxethmac = withClockAndReset(io.mii.mrx_clk_pad_i.asClock, io.asyncReset)( Module(new MacRx))
2023-09-25 14:18:27 +08:00
2023-07-03 23:51:01 +08:00
rxethmac.io.MRxDV := MRxDV_Lb
rxethmac.io.MRxD := MRxD_Lb
rxethmac.io.Transmitting := Transmitting
rxethmac.io.DlyCrcEn := r_DlyCrcEn
rxethmac.io.MaxFL := r_MaxFL
rxethmac.io.r_IFG := r_IFG
rxethmac.io.MAC := r_MAC
rxethmac.io.r_HASH0 := r_HASH0
rxethmac.io.r_HASH1 := r_HASH1
rxethmac.io.ControlFrmAddressOK := ControlFrmAddressOK
RxData := rxethmac.io.RxData
RxValid := rxethmac.io.RxValid
RxStartFrm := rxethmac.io.RxStartFrm
RxEndFrm := rxethmac.io.RxEndFrm
RxByteCnt := rxethmac.io.ByteCnt
RxByteCntEq0 := rxethmac.io.ByteCntEq0
RxByteCntGreat2 := rxethmac.io.ByteCntGreat2
RxCrcError := rxethmac.io.CrcError
RxStateIdle := rxethmac.io.StateIdle
RxStatePreamble := rxethmac.io.StatePreamble
RxStateSFD := rxethmac.io.StateSFD
RxStateData := rxethmac.io.StateData
AddressMiss := rxethmac.io.AddressMiss
2023-10-19 15:24:26 +08:00
withClockAndReset( io.mii.mtx_clk_pad_i.asClock, reset.asAsyncReset ) {
2023-07-03 23:51:01 +08:00
// MII Carrier Sense Synchronization
2023-10-19 15:24:26 +08:00
CarrierSense_Tx2 := ShiftRegister(io.mii.mcrs_pad_i, 2, false.B, true.B)
2023-07-03 23:51:01 +08:00
TxCarrierSense := ~r_FullD & CarrierSense_Tx2
2023-10-19 15:24:26 +08:00
val Collision_Tx1 = RegNext(io.mii.mcoll_pad_i, false.B)
2023-07-03 23:51:01 +08:00
val Collision_Tx2 = RegInit(false.B)
when(ResetCollision){
Collision_Tx2 := false.B
} .elsewhen(Collision_Tx1){
Collision_Tx2 := true.B
}
// Synchronized Collision
Collision := ~r_FullD & Collision_Tx2
}
2023-10-19 15:24:26 +08:00
withClockAndReset( io.mii.mrx_clk_pad_i.asClock, reset.asAsyncReset ) {
2023-07-03 23:51:01 +08:00
val WillTransmit_q = ShiftRegister(WillTransmit, 2, false.B, true.B)
Transmitting := ~r_FullD & WillTransmit_q
2023-10-19 15:24:26 +08:00
RxEnSync := RegEnable( ShiftRegister(r_RxEn, 2), false.B, ~io.mii.mrxdv_pad_i)
2023-07-03 23:51:01 +08:00
}
// Synchronizing WillSendControlFrame to WB_CLK;
val WillSendControlFrame_sync = ShiftRegisters(WillSendControlFrame, 3, false.B, true.B)
when(true.B){
RstTxPauseRq := WillSendControlFrame_sync(1) & ~WillSendControlFrame_sync(2)
}
2023-10-19 15:24:26 +08:00
withClockAndReset( io.mii.mtx_clk_pad_i.asClock, reset.asAsyncReset ) {
2023-07-03 23:51:01 +08:00
val TxPauseRq_sync = ShiftRegisters((r_TxPauseRq & r_TxFlow), 3, false.B, true.B )
TPauseRq := RegNext( TxPauseRq_sync(1) & (~TxPauseRq_sync(2)), false.B )
}
2023-06-18 08:34:44 +00:00
val wishbone = Module(new MacTileLink)
2023-07-03 23:51:01 +08:00
wishbone.io.RetryLimit := RetryLimit
wishbone.io.LateCollLatched := LateCollLatched
wishbone.io.DeferLatched := DeferLatched
wishbone.io.CarrierSenseLost := CarrierSenseLost
PerPacketCrcEn := wishbone.io.PerPacketCrcEn
PerPacketPad := wishbone.io.PerPacketPad
wishbone.io.r_TxEn := r_TxEn
wishbone.io.r_RxEn := r_RxEn
TxB_IRQ := false.B
TxE_IRQ := false.B
2023-10-12 15:42:49 +08:00
RxB_IRQ := false.B
RxE_IRQ := false.B
2023-07-03 23:51:01 +08:00
val macstatus = Module(new MacStatus)
2023-09-25 14:18:27 +08:00
macstatus.io.asyncReset := io.asyncReset
2023-10-19 15:24:26 +08:00
macstatus.io.MRxClk := io.mii.mrx_clk_pad_i
2023-07-03 23:51:01 +08:00
macstatus.io.RxCrcError := RxCrcError
macstatus.io.MRxErr := MRxErr_Lb
macstatus.io.MRxDV := MRxDV_Lb
macstatus.io.RxStateSFD := RxStateSFD
macstatus.io.RxStateData := RxStateData
macstatus.io.RxStatePreamble := RxStatePreamble
macstatus.io.RxStateIdle := RxStateIdle
macstatus.io.Transmitting := Transmitting
macstatus.io.RxByteCnt := RxByteCnt
macstatus.io.RxByteCntEq0 := RxByteCntEq0
macstatus.io.RxByteCntGreat2 := RxByteCntGreat2
macstatus.io.MRxD := MRxD_Lb
2023-10-19 15:24:26 +08:00
macstatus.io.Collision := io.mii.mcoll_pad_i
2023-07-03 23:51:01 +08:00
macstatus.io.CollValid := r_CollValid
macstatus.io.r_MinFL := r_MinFL
macstatus.io.r_MaxFL := r_MaxFL
macstatus.io.StartTxDone := StartTxDone
macstatus.io.StartTxAbort := StartTxAbort
2023-10-19 15:24:26 +08:00
macstatus.io.MTxClk := io.mii.mtx_clk_pad_i
2023-07-03 23:51:01 +08:00
macstatus.io.MaxCollisionOccured := MaxCollisionOccured
macstatus.io.LateCollision := LateCollision
macstatus.io.DeferIndication := DeferIndication
macstatus.io.TxStartFrm := TxStartFrmOut
macstatus.io.StatePreamble := StatePreamble
macstatus.io.StateData := StateData
macstatus.io.CarrierSense := CarrierSense_Tx2
macstatus.io.Loopback := r_LoopBck
macstatus.io.r_FullD := r_FullD
macstatus.io.RstDeferLatched := RstDeferLatched
ReceivedLengthOK := macstatus.io.ReceivedLengthOK
ReceiveEnd := macstatus.io.ReceiveEnd
ReceivedPacketGood := macstatus.io.ReceivedPacketGood
LatchedCrcError := macstatus.io.LatchedCrcError
RxLateCollision := macstatus.io.RxLateCollision
DribbleNibble := macstatus.io.DribbleNibble
LoadRxStatus := macstatus.io.LoadRxStatus
RetryLimit := macstatus.io.RetryLimit
LateCollLatched := macstatus.io.LateCollLatched
DeferLatched := macstatus.io.DeferLatched
CarrierSenseLost := macstatus.io.CarrierSenseLost
2023-07-04 17:37:41 +08:00
2023-10-08 11:34:36 +08:00
2023-10-19 15:24:26 +08:00
val macTileLinkTx = withClockAndReset( io.mii.mtx_clk_pad_i.asClock, io.asyncReset ) (Module(new MacTileLinkTx))
2023-10-08 11:34:36 +08:00
2023-10-23 23:36:01 +08:00
2023-10-24 14:00:51 +08:00
val txReq_ToAsync = Wire(new AsyncBundle(new TxFifo_Stream_Bundle))
2023-10-23 23:36:01 +08:00
txReq_ToAsync <> ToAsyncBundle( wishbone.io.txReq )
withClockAndReset(io.mii.mtx_clk_pad_i.asClock, io.asyncReset) {
macTileLinkTx.io.txReq <> FromAsyncBundle( txReq_ToAsync )
}
2023-10-19 15:24:26 +08:00
withClockAndReset( io.mii.mtx_clk_pad_i.asClock, io.asyncReset ){
2023-10-08 15:37:54 +08:00
macTileLinkTx.io.BlockingTxStatusWrite_sync := ShiftRegister( wishbone.io.BlockingTxStatusWrite, 2, false.B, true.B)
2023-10-08 11:34:36 +08:00
}
2023-10-08 15:37:54 +08:00
RstDeferLatched := macTileLinkTx.io.RstDeferLatched
TxStartFrm := macTileLinkTx.io.TxStartFrm
TxEndFrm := macTileLinkTx.io.TxEndFrm
TxData := macTileLinkTx.io.TxData
2023-10-08 11:34:36 +08:00
2023-10-25 14:33:48 +08:00
wishbone.io.TxUsedData := TxUsedData
2023-10-24 15:34:30 +08:00
macTileLinkTx.io.TxUsedData := TxUsedData
2023-10-08 11:34:36 +08:00
2023-10-08 15:37:54 +08:00
macTileLinkTx.io.TxAbort := TxAbort
macTileLinkTx.io.TxDone := TxDone
2023-10-08 11:34:36 +08:00
wishbone.io.TxAbortSync := ShiftRegister( TxAbort, 2, false.B, true.B )
wishbone.io.TxDoneSync := ShiftRegister( TxDone, 2, false.B, true.B )
2023-10-08 15:13:35 +08:00
2023-10-19 15:24:26 +08:00
val macTileLinkRx = withClockAndReset( io.mii.mrx_clk_pad_i.asClock, io.asyncReset ) ( Module(new MacTileLinkRx) )
2023-10-25 14:33:48 +08:00
2023-10-12 15:42:49 +08:00
2023-10-23 22:58:36 +08:00
val req_ToAsync = Wire(new AsyncBundle(new RxFifo_Stream_Bundle))
val resp_ToAsync = Wire(new AsyncBundle(Bool()))
val fateRxRespPort = Wire( Flipped(Decoupled(Bool())) )
fateRxRespPort.ready := true.B
2023-10-23 22:58:36 +08:00
wishbone.io.rxReq <> FromAsyncBundle( req_ToAsync )
resp_ToAsync <> ToAsyncBundle( wishbone.io.rxResp )
2023-10-23 22:58:36 +08:00
withClockAndReset(io.mii.mrx_clk_pad_i.asClock, io.asyncReset) {
req_ToAsync <> ToAsyncBundle( macTileLinkRx.io.rxReq )
fateRxRespPort <> FromAsyncBundle( resp_ToAsync )
}
2023-10-08 15:30:08 +08:00
2023-10-23 22:58:36 +08:00
2023-10-08 15:30:08 +08:00
wishbone.io.LatchedRxLength_rxclk := macTileLinkRx.io.LatchedRxLength
wishbone.io.RxStatusInLatched_rxclk := macTileLinkRx.io.RxStatusInLatched
2023-10-08 15:13:35 +08:00
// Busy Interrupt
2023-10-12 15:42:49 +08:00
val Busy_IRQ_sync = ShiftRegister(macTileLinkRx.io.Busy_IRQ_rck, 2, false.B, true.B)
Busy_IRQ := Busy_IRQ_sync & ~RegNext(Busy_IRQ_sync, false.B)
2023-10-08 15:13:35 +08:00
2023-10-19 15:24:26 +08:00
withClockAndReset( io.mii.mrx_clk_pad_i.asClock, io.asyncReset ) {
2023-10-23 22:58:36 +08:00
RxStatusWriteLatchedSync := fateRxRespPort.fire
2023-10-08 15:37:54 +08:00
macTileLinkRx.io.Busy_IRQ_syncb := ShiftRegister( Busy_IRQ_sync, 2, false.B, true.B )
2023-10-08 15:13:35 +08:00
macTileLinkRx.io.RxReady := ShiftRegister( wishbone.io.RxReady, 2, false.B, true.B )
2023-10-08 15:13:35 +08:00
}
2023-10-08 15:37:54 +08:00
macTileLinkRx.io.RxData := RxData
macTileLinkRx.io.RxValid := RxValid
2023-10-08 15:13:35 +08:00
2023-10-08 15:37:54 +08:00
macTileLinkRx.io.RxStartFrm := RxStartFrm
macTileLinkRx.io.RxEndFrm := RxEndFrm
2023-10-08 15:13:35 +08:00
2023-10-08 15:37:54 +08:00
macTileLinkRx.io.RxLength := RxByteCnt
macTileLinkRx.io.LoadRxStatus := LoadRxStatus
2023-10-25 15:34:43 +08:00
macTileLinkRx.io.RxStatusIn := Cat(ReceivedPauseFrm, AddressMiss, false.B, false.B, DribbleNibble, false.B, false.B, LatchedCrcError, RxLateCollision)
2023-10-08 15:13:35 +08:00
2023-10-19 15:24:26 +08:00
wishbone.io.rxEnq <> io.rxEnq
wishbone.io.txDeq <> io.txDeq
2023-07-03 23:51:01 +08:00
}
2023-07-11 22:02:41 +08:00