2023-10-08 15:37:54 +08:00
|
|
|
package MAC
|
|
|
|
|
|
|
|
|
|
import chisel3._
|
|
|
|
|
import chisel3.util._
|
|
|
|
|
|
|
|
|
|
|
2023-10-23 22:58:36 +08:00
|
|
|
class RxFifo_Stream_Bundle extends Bundle{
|
|
|
|
|
val data = UInt(8.W)
|
|
|
|
|
val isLast = Bool()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2023-10-08 15:37:54 +08:00
|
|
|
|
|
|
|
|
class MacTileLinkRxIO extends Bundle{
|
2023-10-21 21:08:40 +08:00
|
|
|
|
2023-10-23 22:58:36 +08:00
|
|
|
val rxReq = Decoupled(new RxFifo_Stream_Bundle)
|
2023-10-21 21:08:40 +08:00
|
|
|
|
2023-10-08 15:37:54 +08:00
|
|
|
val LatchedRxLength = Output(UInt(16.W))
|
|
|
|
|
val RxStatusInLatched = Output( UInt(9.W) )
|
|
|
|
|
|
|
|
|
|
val RxLength = Input(UInt(16.W))
|
|
|
|
|
val LoadRxStatus = Input(Bool())
|
|
|
|
|
val RxStatusIn = Input(UInt(9.W))
|
2023-10-25 14:33:48 +08:00
|
|
|
|
2023-10-08 15:37:54 +08:00
|
|
|
|
|
|
|
|
val Busy_IRQ_rck = Output(Bool())
|
|
|
|
|
val Busy_IRQ_syncb = Input(Bool())
|
|
|
|
|
|
|
|
|
|
val RxData = Input(UInt(8.W)) // Received data byte (from PHY)
|
|
|
|
|
val RxValid = Input(Bool())
|
|
|
|
|
val RxReady = Input(Bool())
|
|
|
|
|
val RxStartFrm = Input(Bool())
|
|
|
|
|
val RxEndFrm = Input(Bool())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MacTileLinkRx extends Module with RequireAsyncReset{
|
|
|
|
|
val io = IO(new MacTileLinkRxIO)
|
|
|
|
|
|
2023-10-21 21:08:40 +08:00
|
|
|
|
2023-10-08 15:37:54 +08:00
|
|
|
val ShiftWillEnd = RegInit(false.B)
|
|
|
|
|
|
|
|
|
|
val LatchedRxLength = RegEnable(io.RxLength, 0.U(16.W), io.LoadRxStatus); io.LatchedRxLength := LatchedRxLength
|
|
|
|
|
val RxStatusInLatched = RegEnable(io.RxStatusIn, 0.U(9.W), io.LoadRxStatus); io.RxStatusInLatched := RxStatusInLatched
|
|
|
|
|
|
2023-10-23 22:58:36 +08:00
|
|
|
// val ShiftEnded_rck = RegInit(false.B); io.ShiftEnded_rck := ShiftEnded_rck
|
2023-10-08 15:37:54 +08:00
|
|
|
val RxEnableWindow = RegInit(false.B)
|
|
|
|
|
|
|
|
|
|
val Busy_IRQ_rck = RegInit(false.B); io.Busy_IRQ_rck := Busy_IRQ_rck
|
|
|
|
|
|
|
|
|
|
|
2023-10-21 21:08:40 +08:00
|
|
|
// Indicating start of the reception process
|
|
|
|
|
val SetWriteRxDataToFifo =
|
|
|
|
|
io.RxValid & io.RxReady & (io.RxStartFrm | RxEnableWindow )
|
2023-10-08 15:37:54 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
// Generation of the end-of-frame signal
|
|
|
|
|
when(io.RxStartFrm){
|
|
|
|
|
RxEnableWindow := true.B
|
2023-10-25 14:33:48 +08:00
|
|
|
} .elsewhen(io.RxEndFrm ){
|
2023-10-08 15:37:54 +08:00
|
|
|
RxEnableWindow := false.B
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
when(io.RxValid & io.RxStartFrm & ~io.RxReady){
|
|
|
|
|
Busy_IRQ_rck := true.B
|
|
|
|
|
} .elsewhen(io.Busy_IRQ_syncb){
|
|
|
|
|
Busy_IRQ_rck := false.B
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2023-10-23 22:58:36 +08:00
|
|
|
val rxFifo = Module(new Queue(new RxFifo_Stream_Bundle, 4))
|
2023-10-25 14:33:48 +08:00
|
|
|
rxFifo.io.enq.valid := SetWriteRxDataToFifo
|
2023-10-23 22:58:36 +08:00
|
|
|
rxFifo.io.enq.bits.data := io.RxData
|
|
|
|
|
rxFifo.io.enq.bits.isLast := io.RxEndFrm
|
2023-10-21 21:08:40 +08:00
|
|
|
assert( ~(rxFifo.io.enq.valid & ~rxFifo.io.enq.ready) )
|
|
|
|
|
|
2023-10-23 22:58:36 +08:00
|
|
|
io.rxReq <> rxFifo.io.deq
|
2023-10-08 15:37:54 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|