时序优化
This commit is contained in:
@@ -73,6 +73,7 @@ trait ShinSlvPhyDownStreamRecv{ this: ShinSlvPhyBase =>
|
|||||||
|
|
||||||
val downOldHead = Reg( new Header_Info_Bundle )
|
val downOldHead = Reg( new Header_Info_Bundle )
|
||||||
val downNewHead = Reg( new Header_Info_Bundle )
|
val downNewHead = Reg( new Header_Info_Bundle )
|
||||||
|
val downNewHeadShift = Reg( new Header_Info_Bundle )
|
||||||
|
|
||||||
val downPendBuf= Module( new Queue( new AXIS_Bundle(8), 2, pipe = true, flow = false ) with chisel3.util.experimental.InlineInstance)
|
val downPendBuf= Module( new Queue( new AXIS_Bundle(8), 2, pipe = true, flow = false ) with chisel3.util.experimental.InlineInstance)
|
||||||
downStreamCdrIn.io.axis <> downPendBuf.io.enq
|
downStreamCdrIn.io.axis <> downPendBuf.io.enq
|
||||||
@@ -185,6 +186,7 @@ trait ShinSlvPhyDownStreamSend{ this: ShinSlvPhyBase =>
|
|||||||
val isLastDevice: Bool
|
val isLastDevice: Bool
|
||||||
val downForwardDataByte: UInt
|
val downForwardDataByte: UInt
|
||||||
val downNewHead: Header_Info_Bundle
|
val downNewHead: Header_Info_Bundle
|
||||||
|
val downNewHeadShift: Header_Info_Bundle
|
||||||
val isDownStreamError: Bool
|
val isDownStreamError: Bool
|
||||||
|
|
||||||
|
|
||||||
@@ -193,12 +195,12 @@ trait ShinSlvPhyDownStreamSend{ this: ShinSlvPhyBase =>
|
|||||||
|
|
||||||
downSendStateNext := Mux1H(Seq(
|
downSendStateNext := Mux1H(Seq(
|
||||||
( downSendStateCurr === DownSendStateIdle ) -> Mux( isDownNewHeadCreated & ~isLastDevice, DownSendStateNHead, DownSendStateIdle ),
|
( downSendStateCurr === DownSendStateIdle ) -> Mux( isDownNewHeadCreated & ~isLastDevice, DownSendStateNHead, DownSendStateIdle ),
|
||||||
( downSendStateCurr === DownSendStateNHead ) -> Mux( downSendCnt === ((headByte)-1).U & downStreamCdrOut.io.axis.fire, DownSendStateFData, DownSendStateNHead ),
|
( downSendStateCurr === DownSendStateNHead ) -> Mux( downSendCnt === ((headByte)).U & downStreamCdrOut.io.axis.fire, DownSendStateFData, DownSendStateNHead ),
|
||||||
( downSendStateCurr === DownSendStateFData ) -> Mux( downSendCnt === (downForwardDataByte -1.U) & downStreamCdrOut.io.axis.fire, DownSendStateIdle, DownSendStateFData),
|
( downSendStateCurr === DownSendStateFData ) -> Mux( downSendCnt === (downForwardDataByte ) & downStreamCdrOut.io.axis.fire, DownSendStateIdle, DownSendStateFData),
|
||||||
))
|
))
|
||||||
|
|
||||||
when( downSendStateCurr =/= downSendStateNext ){
|
when( downSendStateCurr =/= downSendStateNext ){
|
||||||
downSendCnt := 0.U
|
downSendCnt := 1.U
|
||||||
} .elsewhen( downStreamCdrOut.io.axis.fire ){
|
} .elsewhen( downStreamCdrOut.io.axis.fire ){
|
||||||
downSendCnt := downSendCnt + 1.U
|
downSendCnt := downSendCnt + 1.U
|
||||||
}
|
}
|
||||||
@@ -207,10 +209,20 @@ trait ShinSlvPhyDownStreamSend{ this: ShinSlvPhyBase =>
|
|||||||
downSendStateCurr === DownSendStateNHead | downSendStateCurr === DownSendStateFData
|
downSendStateCurr === DownSendStateNHead | downSendStateCurr === DownSendStateFData
|
||||||
|
|
||||||
downStreamCdrOut.io.axis.bits.tdata := Mux1H(Seq(
|
downStreamCdrOut.io.axis.bits.tdata := Mux1H(Seq(
|
||||||
( downSendStateCurr === DownSendStateNHead ) -> (downNewHead.asUInt << (downSendCnt << 3)).apply(63,56),
|
( downSendStateCurr === DownSendStateNHead ) -> downNewHeadShift.asUInt(63,56),
|
||||||
( downSendStateCurr === DownSendStateFData ) -> downForwardFifo.io.deq.bits.tdata,
|
( downSendStateCurr === DownSendStateFData ) -> downForwardFifo.io.deq.bits.tdata,
|
||||||
))
|
))
|
||||||
|
|
||||||
|
val downOldHead: Header_Info_Bundle
|
||||||
|
val downLocalDataByte: UInt
|
||||||
|
when( isDownNewHeadCreated ){
|
||||||
|
downNewHeadShift.length := Mux( downOldHead.length >= downLocalDataByte, downOldHead.length - downLocalDataByte, 0.U )
|
||||||
|
downNewHeadShift.operator := downOldHead.operator
|
||||||
|
downNewHeadShift.param := downOldHead.param
|
||||||
|
} .elsewhen( downStreamCdrOut.io.axis.fire & downSendStateCurr === DownSendStateNHead ){
|
||||||
|
downNewHeadShift := (downNewHeadShift.asUInt << 8).asTypeOf(new Header_Info_Bundle)
|
||||||
|
}
|
||||||
|
|
||||||
downStreamCdrOut.io.axis.bits.tlast := ( downSendStateCurr === DownSendStateFData ) & downForwardFifo.io.deq.bits.tlast
|
downStreamCdrOut.io.axis.bits.tlast := ( downSendStateCurr === DownSendStateFData ) & downForwardFifo.io.deq.bits.tlast
|
||||||
|
|
||||||
|
|
||||||
@@ -252,13 +264,13 @@ trait ShinSlvPhyUpStreamRecv{ this: ShinSlvPhyDownStream =>
|
|||||||
|
|
||||||
upRecvStateNext := Mux1H(Seq(
|
upRecvStateNext := Mux1H(Seq(
|
||||||
(upRecvStateCurr === UpRecvStateIdle ) -> Mux( upPendBuf.io.deq.valid, UpRecvStateOHead, UpRecvStateIdle ),
|
(upRecvStateCurr === UpRecvStateIdle ) -> Mux( upPendBuf.io.deq.valid, UpRecvStateOHead, UpRecvStateIdle ),
|
||||||
(upRecvStateCurr === UpRecvStateOHead) -> Mux( upPendBuf.io.deq.fire, Mux( ~upPendBuf.io.deq.bits.tlast, Mux( upRecvCnt === ((headByte)-1).U, UpRecvStateFData, UpRecvStateOHead), UpRecvStateIdle), UpRecvStateOHead ),
|
(upRecvStateCurr === UpRecvStateOHead) -> Mux( upPendBuf.io.deq.fire, Mux( ~upPendBuf.io.deq.bits.tlast, Mux( upRecvCnt === ((headByte)).U, UpRecvStateFData, UpRecvStateOHead), UpRecvStateIdle), UpRecvStateOHead ),
|
||||||
(upRecvStateCurr === UpRecvStateFData) -> Mux( upPendBuf.io.deq.fire, Mux( ~upPendBuf.io.deq.bits.tlast, Mux( upRecvCnt === (upOldHead.length - 1.U), UpRecvStateCRC, UpRecvStateFData), UpRecvStateIdle), UpRecvStateFData ),
|
(upRecvStateCurr === UpRecvStateFData) -> Mux( upPendBuf.io.deq.fire, Mux( ~upPendBuf.io.deq.bits.tlast, Mux( upRecvCnt === (upOldHead.length), UpRecvStateCRC, UpRecvStateFData), UpRecvStateIdle), UpRecvStateFData ),
|
||||||
(upRecvStateCurr === UpRecvStateCRC ) -> Mux( upPendBuf.io.deq.fire & upPendBuf.io.deq.bits.tlast, UpRecvStateIdle, UpRecvStateCRC ),
|
(upRecvStateCurr === UpRecvStateCRC ) -> Mux( upPendBuf.io.deq.fire & upPendBuf.io.deq.bits.tlast, UpRecvStateIdle, UpRecvStateCRC ),
|
||||||
))
|
))
|
||||||
|
|
||||||
when( upRecvStateCurr =/= upRecvStateNext){
|
when( upRecvStateCurr =/= upRecvStateNext){
|
||||||
upRecvCnt := 0.U
|
upRecvCnt := 1.U
|
||||||
} .elsewhen( upPendBuf.io.deq.fire ){
|
} .elsewhen( upPendBuf.io.deq.fire ){
|
||||||
upRecvCnt := upRecvCnt + 1.U
|
upRecvCnt := upRecvCnt + 1.U
|
||||||
}
|
}
|
||||||
@@ -313,7 +325,7 @@ trait ShinSlvPhyUpStreamRecv{ this: ShinSlvPhyDownStream =>
|
|||||||
upRecvStateCurr === UpRecvStateFData & upPendBuf.io.deq.fire
|
upRecvStateCurr === UpRecvStateFData & upPendBuf.io.deq.fire
|
||||||
upForwardFifo.io.enq.bits.tdata := upPendBuf.io.deq.bits.tdata
|
upForwardFifo.io.enq.bits.tdata := upPendBuf.io.deq.bits.tdata
|
||||||
upForwardFifo.io.enq.bits.tuser := upPendBuf.io.deq.bits.tuser
|
upForwardFifo.io.enq.bits.tuser := upPendBuf.io.deq.bits.tuser
|
||||||
upForwardFifo.io.enq.bits.tlast := upRecvCnt === (upForwardDataByte -1.U) | upPendBuf.io.deq.bits.tlast
|
upForwardFifo.io.enq.bits.tlast := upRecvCnt === (upForwardDataByte) | upPendBuf.io.deq.bits.tlast
|
||||||
|
|
||||||
|
|
||||||
upPendBuf.io.deq.ready :=
|
upPendBuf.io.deq.ready :=
|
||||||
@@ -339,7 +351,7 @@ trait ShinSlvPhyUpStreamRecv{ this: ShinSlvPhyDownStream =>
|
|||||||
} .elsewhen( upRecvStateCurr === UpRecvStateFData & upRecvStateNext === UpRecvStateIdle ){
|
} .elsewhen( upRecvStateCurr === UpRecvStateFData & upRecvStateNext === UpRecvStateIdle ){
|
||||||
isUpStreamError := true.B
|
isUpStreamError := true.B
|
||||||
printf("Warning, Wrong Package Received in UpStream, That could not happened!\n")
|
printf("Warning, Wrong Package Received in UpStream, That could not happened!\n")
|
||||||
} .elsewhen( upRecvStateCurr === UpRecvStateCRC & upPendBuf.io.deq.fire & upPendBuf.io.deq.bits.tlast & upRecvCnt =/= 3.U ){
|
} .elsewhen( upRecvStateCurr === UpRecvStateCRC & upPendBuf.io.deq.fire & upPendBuf.io.deq.bits.tlast & upRecvCnt =/= 4.U ){
|
||||||
isUpStreamError := true.B
|
isUpStreamError := true.B
|
||||||
printf("Warning, Wrong Package Received in UpStream, That could not happened!\n")
|
printf("Warning, Wrong Package Received in UpStream, That could not happened!\n")
|
||||||
}
|
}
|
||||||
@@ -375,29 +387,40 @@ trait ShinSlvPhyUpStreamSend{ this: ShinSlvPhyDownStream =>
|
|||||||
|
|
||||||
upSendStateNext := Mux1H(Seq(
|
upSendStateNext := Mux1H(Seq(
|
||||||
( upSendStateCurr === UpSendStateIdle ) -> Mux( isUpNewHeadCreated, UpSendStateNHead, UpSendStateIdle ),
|
( upSendStateCurr === UpSendStateIdle ) -> Mux( isUpNewHeadCreated, UpSendStateNHead, UpSendStateIdle ),
|
||||||
( upSendStateCurr === UpSendStateNHead ) -> Mux( upSendCnt === ((headByte)-1).U & upStreamCdrOut.io.axis.fire, UpSendStateLData, UpSendStateNHead),
|
( upSendStateCurr === UpSendStateNHead ) -> Mux( upSendCnt === ((headByte)).U & upStreamCdrOut.io.axis.fire, UpSendStateLData, UpSendStateNHead),
|
||||||
( upSendStateCurr === UpSendStateLData ) -> Mux( upSendCnt === (upLocalDataByte - 1.U) & upStreamCdrOut.io.axis.fire, Mux( isLastDevice, UpSendStateIdle, UpSendStateFData), UpSendStateLData),
|
( upSendStateCurr === UpSendStateLData ) -> Mux( upSendCnt === (upLocalDataByte) & upStreamCdrOut.io.axis.fire, Mux( isLastDevice, UpSendStateIdle, UpSendStateFData), UpSendStateLData),
|
||||||
( upSendStateCurr === UpSendStateFData ) -> Mux( upSendCnt === (upForwardDataByte - 1.U) & upStreamCdrOut.io.axis.fire, UpSendStateIdle, UpSendStateFData),
|
( upSendStateCurr === UpSendStateFData ) -> Mux( upSendCnt === (upForwardDataByte) & upStreamCdrOut.io.axis.fire, UpSendStateIdle, UpSendStateFData),
|
||||||
))
|
))
|
||||||
|
|
||||||
when( upSendStateCurr =/= upSendStateNext ){
|
when( upSendStateCurr =/= upSendStateNext ){
|
||||||
upSendCnt := 0.U
|
upSendCnt := 1.U
|
||||||
} .elsewhen( upStreamCdrOut.io.axis.fire ){
|
} .elsewhen( upStreamCdrOut.io.axis.fire ){
|
||||||
upSendCnt := upSendCnt + 1.U
|
upSendCnt := upSendCnt + 1.U
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val upNewHeadShift = Reg(new Header_Info_Bundle)
|
||||||
|
|
||||||
upStreamCdrOut.io.axis.valid :=
|
upStreamCdrOut.io.axis.valid :=
|
||||||
upSendStateCurr === UpSendStateNHead | upSendStateCurr === UpSendStateLData | upSendStateCurr === UpSendStateFData
|
upSendStateCurr === UpSendStateNHead | upSendStateCurr === UpSendStateLData | upSendStateCurr === UpSendStateFData
|
||||||
|
|
||||||
upStreamCdrOut.io.axis.bits.tdata := Mux1H(Seq(
|
upStreamCdrOut.io.axis.bits.tdata := Mux1H(Seq(
|
||||||
( upSendStateCurr === UpSendStateNHead ) -> (upNewHead.asUInt << (upSendCnt << 3)).apply(63,56),
|
( upSendStateCurr === UpSendStateNHead ) -> upNewHeadShift.asUInt(63,56),
|
||||||
( upSendStateCurr === UpSendStateLData ) -> upReg(upSendCnt),
|
( upSendStateCurr === UpSendStateLData ) -> upReg(upSendCnt-1.U),
|
||||||
( upSendStateCurr === UpSendStateFData ) -> upForwardFifo.io.deq.bits.tdata,
|
( upSendStateCurr === UpSendStateFData ) -> upForwardFifo.io.deq.bits.tdata,
|
||||||
))
|
))
|
||||||
|
|
||||||
|
val upOldHead: Header_Info_Bundle
|
||||||
|
when( isUpNewHeadCreated ){
|
||||||
|
upNewHeadShift.length := upOldHead.length + upLocalDataByte
|
||||||
|
upNewHeadShift.operator := upOldHead.operator
|
||||||
|
upNewHeadShift.param := upOldHead.param
|
||||||
|
} .elsewhen( upStreamCdrOut.io.axis.fire & upSendStateCurr === UpSendStateNHead ){
|
||||||
|
upNewHeadShift := (upNewHeadShift.asUInt << 8).asTypeOf(new Header_Info_Bundle)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
upStreamCdrOut.io.axis.bits.tlast := ( upSendStateCurr === UpSendStateFData ) & upForwardFifo.io.deq.bits.tlast
|
upStreamCdrOut.io.axis.bits.tlast := ( upSendStateCurr === UpSendStateFData ) & upForwardFifo.io.deq.bits.tlast
|
||||||
|
|
||||||
upStreamCdrOut.io.axis.bits.tuser :=
|
upStreamCdrOut.io.axis.bits.tuser :=
|
||||||
@@ -537,7 +560,7 @@ with ShinSlvLinkUCast{
|
|||||||
|
|
||||||
|
|
||||||
val led = IO(UInt(8.W))
|
val led = IO(UInt(8.W))
|
||||||
led := slvID
|
led := RegEnable( 1.U << slvID, 0.U, ~RegNext(isInit) & isInit)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user