From c31479f898079f801e850bb3c2650f2488afd534 Mon Sep 17 00:00:00 2001 From: RuigeLee Date: Wed, 8 Nov 2023 15:41:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E5=90=91=E6=95=B0=E6=8D=AE=E6=B5=81?= =?UTF-8?q?=E5=B7=B2=E6=B8=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/scala/Switch/DMA.scala | 2 +- src/main/scala/Switch/PiPoBuff.scala | 4 +++- src/main/scala/Switch/Robin.scala | 8 +++++--- src/main/scala/Switch/Switch.scala | 4 ++-- src/main/scala/Switch/mac/MacTx.scala | 10 ++++++++-- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/scala/Switch/DMA.scala b/src/main/scala/Switch/DMA.scala index d73e29c..5d80c2c 100644 --- a/src/main/scala/Switch/DMA.scala +++ b/src/main/scala/Switch/DMA.scala @@ -82,7 +82,7 @@ trait DMAMstTileLink{ this: DMAMstBase => val mInfoValid = stateCur === stateTx when( rxBuff.mInfo.source.valid & stateCur === stateIdle & stateNxt === stateRx ){ - assert( rxBuff.mInfo.source.bits(48) === 1.U ) + // assert( rxBuff.mInfo.source.bits(48) === 1.U ) trigRxNum := rxBuff.mInfo.source.bits dmaAddress := io.sel(rxBuff.mInfo.source.bits( log2Ceil(chn)-1, 0 )).r_RxPtr } diff --git a/src/main/scala/Switch/PiPoBuff.scala b/src/main/scala/Switch/PiPoBuff.scala index c99f303..037d61d 100644 --- a/src/main/scala/Switch/PiPoBuff.scala +++ b/src/main/scala/Switch/PiPoBuff.scala @@ -54,8 +54,10 @@ class PiPoBuffBase[T<:Data]( dp: Int, val threshold: Int = 32) extends Module{ when( io.enq.fire ){ - when( io.enq.bits.isStart ){ + when( io.enq.bits.isLast ){ cnt := 0.U + } .elsewhen( io.enq.bits.isStart ){ + cnt := 1.U } .otherwise{ cnt := cnt + 1.U } diff --git a/src/main/scala/Switch/Robin.scala b/src/main/scala/Switch/Robin.scala index 4e73809..4c55595 100644 --- a/src/main/scala/Switch/Robin.scala +++ b/src/main/scala/Switch/Robin.scala @@ -29,14 +29,16 @@ class Robin(implicit p: Parameters) extends SwitchModule{ val isLock = RegInit(false.B) + val lockChn = Reg(UInt((log2Ceil(chn+1)).W)) - val lfsr = LFSR(chn+1, ~isLock) + val lfsr = ~LFSR( log2Ceil(chn+1), ~isLock) for( i <- 0 until chn+1 ) { when( i.U === lfsr ){ when( io.enq(i).mInfo.dest.valid ){ assert( ~isLock ) - isLock := true.B + isLock := true.B + lockChn := lfsr } } } @@ -58,7 +60,7 @@ class Robin(implicit p: Parameters) extends SwitchModule{ io.deq.mInfo.source.valid := false.B io.deq.mInfo.source.bits := 0.U } .otherwise{ - io.deq <> io.enq(lfsr) + io.deq <> io.enq(lockChn) } diff --git a/src/main/scala/Switch/Switch.scala b/src/main/scala/Switch/Switch.scala index 9f8d9c2..9d56cea 100644 --- a/src/main/scala/Switch/Switch.scala +++ b/src/main/scala/Switch/Switch.scala @@ -105,8 +105,8 @@ class SwitchImp(outer: Switch)(implicit p: Parameters) extends LazyModuleImp(out when( robin.io.deq.rx.fire & robin.io.deq.rx.bits.isLast ){ assert( isMuxBusy ) isMuxBusy := false.B - } .elsewhen( robin.io.deq.mInfo.dest.valid ){ - assert( ~isMuxBusy ) + } .elsewhen( robin.io.deq.mInfo.dest.valid & ~isMuxBusy ){ + isMuxBusy := true.B diff --git a/src/main/scala/Switch/mac/MacTx.scala b/src/main/scala/Switch/mac/MacTx.scala index 67fc942..5ded4e8 100644 --- a/src/main/scala/Switch/mac/MacTx.scala +++ b/src/main/scala/Switch/mac/MacTx.scala @@ -130,7 +130,7 @@ trait MacTxFSM { this: MacTxBase => StatePreamble := true.B } - when(StartFCS | StartJam){ + when(StartFCS | StartJam | StartDefer){ StatePAD := false.B }.elsewhen(StartPAD){ StatePAD := true.B @@ -287,7 +287,13 @@ class MacTx extends MacTxBase with MacTxFSM with MacTxCounter with MacTxCRC { io.ResetCollision := ~(StatePreamble | (StateData(0) | StateData(1)) | StatePAD | StateFCS) val ExcessiveDeferOccured = io.TxStartFrm & StateDefer & ExcessiveDefer & ~StopExcessiveDeferOccured - io.StartTxDone := ~io.Collision & (StateFCS & NibCntEq7 | StateData(1) & io.TxEndFrm & NibbleMinFl & ~io.CrcEn) + + io.StartTxDone := + ~io.Collision & + ( (StateFCS & NibCntEq7) | + (StateData(1) & io.TxEndFrm & NibbleMinFl & ~io.CrcEn) | + (StatePAD & NibbleMinFl & ~io.CrcEn) ) + io.LateCollision := StartJam & ~ColWindow io.MaxCollisionOccured := StartJam & ColWindow; StateSFD := StatePreamble & NibCntEq15;