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{ class CDR4MultiIn() extends Module{
val io: CDR4MultiInIO = IO(new CDR4MultiInIO()) 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 ){ withClockAndReset( io.clk4.asClock, reset ){
val latAValid = RegInit(false.B) val latValidSetReg = RegInit(false.B); latValidSet := latValidSetReg
val latAInfo = Reg(new CDRData) val latValidResetAsync = ShiftRegister(latValidReset, 2, false.B, true.B)
val shiftDat = RegInit( 0.U( ((1+6+8+32+16)*4+2).W ) )
val latAReady = Wire(Bool()) val shiftDat = RegInit( 0.U( ((1+6+8+32+16)*4+2).W ) )
val transInfo = Wire(new CDRData)
transInfo := transInfo :=
Cat( Cat(
@@ -38,25 +42,31 @@ class CDR4MultiIn() extends Module{
).asTypeOf(new CDRData) ).asTypeOf(new CDRData)
when( latAValid & latAReady ){ when( latValidSetReg & latValidResetAsync ){
shiftDat := 0.U shiftDat := 0.U
latAValid := false.B latValidSetReg := false.B
} .elsewhen( shiftDat.extract(0) =/= 1.U ){ } .elsewhen( shiftDat.extract(0) =/= 1.U ){
shiftDat := Cat(io.dat, shiftDat( ((1+6+8+32+16)*4+2)-1, 1) ) shiftDat := Cat(io.dat, shiftDat( ((1+6+8+32+16)*4+2)-1, 1) )
} .elsewhen( shiftDat.extract(0) === 1.U ){ } .elsewhen( shiftDat.extract(0) === 1.U ){
latAValid := true.B latValidSetReg := true.B
latAInfo := transInfo
} }
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 )
} }

View File

@@ -20,6 +20,10 @@ object testModule extends App {
ChiselGeneratorAnnotation(() => { new BackBoardSlv }) ChiselGeneratorAnnotation(() => { new BackBoardSlv })
)) ))
(new chisel3.stage.ChiselStage).execute( Array("--target-dir", "generated/", "-E", "verilog" ) ++ args, Seq(
ChiselGeneratorAnnotation(() => { new BackPlaneMstTest })
))
// val cfg = new MacCfg // val cfg = new MacCfg
// (new chisel3.stage.ChiselStage).execute( Array("--show-registrations", "--full-stacktrace", "--target-dir", "generated/Main") ++ args, Seq( // (new chisel3.stage.ChiselStage).execute( Array("--show-registrations", "--full-stacktrace", "--target-dir", "generated/Main") ++ args, Seq(