timing close

This commit is contained in:
RuigeLee
2023-08-02 15:17:16 +08:00
parent 5d43600680
commit d09aff40f2
2 changed files with 30 additions and 16 deletions

View File

@@ -22,15 +22,19 @@ class CDR4MultiInIO() extends Bundle{
class CDR4MultiIn() extends Module{
val io: CDR4MultiInIO = IO(new CDR4MultiInIO())
val inBusToAsync = Wire( new AsyncBundle(new CDRData) )
val latValidSet = Wire(Bool())
val latValidSetAsync = ShiftRegister( latValidSet, 2, false.B, true.B )
val latValidReset = RegNext(latValidSetAsync, false.B)
val transInfo = Wire(new CDRData)
withClockAndReset( io.clk4.asClock, reset ){
val latAValid = RegInit(false.B)
val latAInfo = Reg(new CDRData)
val shiftDat = RegInit( 0.U( ((1+6+8+32+16)*4+2).W ) )
val latAReady = Wire(Bool())
val latValidSetReg = RegInit(false.B); latValidSet := latValidSetReg
val latValidResetAsync = ShiftRegister(latValidReset, 2, false.B, true.B)
val shiftDat = RegInit( 0.U( ((1+6+8+32+16)*4+2).W ) )
val transInfo = Wire(new CDRData)
transInfo :=
Cat(
@@ -38,25 +42,31 @@ class CDR4MultiIn() extends Module{
).asTypeOf(new CDRData)
when( latAValid & latAReady ){
when( latValidSetReg & latValidResetAsync ){
shiftDat := 0.U
latAValid := false.B
latValidSetReg := false.B
} .elsewhen( shiftDat.extract(0) =/= 1.U ){
shiftDat := Cat(io.dat, shiftDat( ((1+6+8+32+16)*4+2)-1, 1) )
} .elsewhen( shiftDat.extract(0) === 1.U ){
latAValid := true.B
latAInfo := transInfo
latValidSetReg := true.B
}
val inBusASyncIO = Wire( new DecoupledIO(new CDRData) )
inBusASyncIO.valid := latAValid
inBusASyncIO.bits := latAInfo
latAReady := inBusASyncIO.ready
inBusToAsync <> ToAsyncBundle( inBusASyncIO, AsyncQueueParams(sync=2) )
}
val latDatValid = RegInit(false.B)
val latDatInfo = Reg(new CDRData)
when( io.latDat.fire ){
latDatValid := false.B
} .elsewhen( latValidSetAsync & ~latValidReset){
latDatValid := true.B
latDatInfo := transInfo
}
io.latDat.valid := latDatValid
io.latDat.bits := latDatInfo
io.latDat <> FromAsyncBundle( inBusToAsync, 2 )
}