78 lines
1.8 KiB
Scala
78 lines
1.8 KiB
Scala
|
|
package BACK
|
||
|
|
|
||
|
|
import chisel3._
|
||
|
|
import chisel3.util._
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
class SimCDR extends Module with RequireAsyncReset{
|
||
|
|
val io = IO(new Bundle{
|
||
|
|
val data = Input( UInt(8.W) )
|
||
|
|
|
||
|
|
val multiCLK = Input(Vec(16, Bool()))
|
||
|
|
|
||
|
|
val flush = Input(Bool())
|
||
|
|
|
||
|
|
val isSuccess = Output(Bool())
|
||
|
|
val isFailed = Output(Bool())
|
||
|
|
})
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
val cdrIn = Module(new MPCDRIn)
|
||
|
|
val cdrOut = Module(new CDROut)
|
||
|
|
val record = Module( new Queue(UInt(8.W), 256) )
|
||
|
|
|
||
|
|
val dataCnt = RegInit(0.U(12.W))
|
||
|
|
val payloadLen = RegInit(("hFFF".U)(12.W))
|
||
|
|
|
||
|
|
|
||
|
|
when( cdrOut.io.axis.fire & dataCnt === 0.U ){
|
||
|
|
payloadLen := Cat( io.data, 0.U(4.W) )
|
||
|
|
} .elsewhen( cdrOut.io.axis.fire & dataCnt === 1.U ){
|
||
|
|
payloadLen := Cat( payloadLen(11,4), io.data(7,4) ) + 4.U + 4.U
|
||
|
|
}
|
||
|
|
|
||
|
|
when( cdrOut.io.axis.fire ){
|
||
|
|
when( dataCnt >= payloadLen - 1.U ){
|
||
|
|
dataCnt := 0.U
|
||
|
|
} .otherwise{
|
||
|
|
dataCnt := dataCnt + 1.U
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
cdrOut.io.flush := io.flush
|
||
|
|
|
||
|
|
cdrIn.clock := io.multiCLK(0).asClock
|
||
|
|
cdrIn.io.flush := io.flush
|
||
|
|
cdrIn.multiCLK := io.multiCLK
|
||
|
|
|
||
|
|
cdrIn.io.serDat := cdrOut.io.serDat
|
||
|
|
|
||
|
|
assert( ~(record.io.enq.valid & ~record.io.enq.ready), "Assert Failed, Warning, fifo overflow!\n" )
|
||
|
|
assert( ~(~record.io.deq.valid & record.io.deq.ready), "Assert Failed, Warning, fifo underflow!\n" )
|
||
|
|
|
||
|
|
val isTxEnd = cdrOut.io.axis.fire & cdrOut.io.axis.bits.tlast
|
||
|
|
|
||
|
|
cdrOut.io.axis.valid := ~io.flush & ShiftRegisters( ~isTxEnd, 16 ).reduce(_&_)
|
||
|
|
cdrOut.io.axis.bits.tdata := io.data
|
||
|
|
cdrOut.io.axis.bits.tuser := false.B
|
||
|
|
cdrOut.io.axis.bits.tlast := dataCnt === (payloadLen - 1.U)
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
record.io.enq.valid := cdrOut.io.axis.fire
|
||
|
|
record.io.enq.bits := io.data
|
||
|
|
|
||
|
|
record.io.deq.ready := cdrIn.io.axis.fire
|
||
|
|
cdrIn.io.axis.ready := true.B
|
||
|
|
|
||
|
|
io.isFailed := cdrIn.io.axis.fire & (record.io.deq.bits =/= cdrIn.io.axis.bits.tdata)
|
||
|
|
io.isSuccess := cdrIn.io.axis.fire & cdrIn.io.axis.bits.tlast
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|