timing close
This commit is contained in:
@@ -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 )
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user