转发延迟缩减至126个cycle
This commit is contained in:
@@ -49,6 +49,8 @@ class CDROut extends Module{
|
|||||||
(stateCurr === STATE_PAYLOAD)
|
(stateCurr === STATE_PAYLOAD)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
assert( ~(~io.axis.valid & io.axis.ready) )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
when( stateCurr === STATE_IDLE & stateNext === STATE_PREAMBLE){ //PRE
|
when( stateCurr === STATE_IDLE & stateNext === STATE_PREAMBLE){ //PRE
|
||||||
|
|||||||
@@ -115,47 +115,36 @@ abstract class SlaveParserBase extends Module{
|
|||||||
// val downSinkSel = Reg(Bool())
|
// val downSinkSel = Reg(Bool())
|
||||||
// val upSinkSel = Reg(Bool())
|
// val upSinkSel = Reg(Bool())
|
||||||
|
|
||||||
val downFrameInfo = Reg(new FrameHeader) //下行大包头
|
// val downFrameInfo = Reg(new FrameHeader) //下行大包头
|
||||||
val upFrameInfo = Reg(new FrameHeader) //上行大包头
|
// val upFrameInfo = Reg(new FrameHeader) //上行大包头
|
||||||
|
|
||||||
// val isDownSendBusy = downSendGen.io.frameReq.ready
|
// val isDownSendBusy = downSendGen.io.frameReq.ready
|
||||||
// val isUpSendBusy = upSendGen.io.frameReq.ready
|
// val isUpSendBusy = upSendGen.io.frameReq.ready
|
||||||
|
|
||||||
val isDownSendPend = RegInit(false.B)
|
|
||||||
val isUpSendPend = RegInit(false.B)
|
|
||||||
|
|
||||||
// val isUpProbePending
|
|
||||||
|
|
||||||
//处理主报文
|
//处理主报文
|
||||||
|
|
||||||
when( downSendGen.io.frameReq.fire ){
|
// when( downSendGen.io.frameReq.fire ){
|
||||||
isDownSendPend := false.B
|
|
||||||
} .elsewhen( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON ){//下行来了一个普通包
|
// } .elsewhen( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON ){//下行来了一个普通包
|
||||||
isDownSendPend := true.B
|
// downFrameInfo := downRecParser.io.frameReq.bits
|
||||||
downFrameInfo := downRecParser.io.frameReq.bits
|
// } .elsewhen( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){//下行来了一个嗅探包
|
||||||
} .elsewhen( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){//下行来了一个嗅探包
|
// downFrameInfo := downRecParser.io.frameReq.bits
|
||||||
isDownSendPend := true.B
|
// }
|
||||||
downFrameInfo := downRecParser.io.frameReq.bits
|
|
||||||
}
|
|
||||||
|
|
||||||
when( upSendGen.io.frameReq.fire ){
|
when( upSendGen.io.frameReq.fire ){
|
||||||
isUpSendPend := false.B
|
|
||||||
} .elsewhen( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON ){ //上行来了一个普通包
|
} .elsewhen( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON ){ //上行来了一个普通包
|
||||||
isUpSendPend := true.B
|
|
||||||
upFrameInfo := upRecParser.io.frameReq.bits
|
// upFrameInfo := upRecParser.io.frameReq.bits
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
downSendGen.io.frameReq.valid :=
|
downSendGen.io.frameReq.valid := downRecParser.io.frameReq.fire
|
||||||
isDownSendPend & downFrameInfo.frameStyle === FRAME_STYLE_COMMON & downRecParser.io.subMsgReq.fire | //下行转发
|
assert( ~(downSendGen.io.frameReq.valid & ~downSendGen.io.frameReq.ready) )
|
||||||
isDownSendPend & downFrameInfo.frameStyle === FRAME_STYLE_PROBE //下行探针
|
|
||||||
|
|
||||||
// assert( OneHot(isDownSendPend, isDownSendProbe) )
|
downSendGen.io.frameReq.bits := downRecParser.io.frameReq.bits
|
||||||
|
|
||||||
downSendGen.io.frameReq.bits := Mux1H(Seq(
|
|
||||||
isDownSendPend -> downFrameInfo, //下行转发
|
|
||||||
//isDownSendProbe -> probeFrame, //下行探针
|
|
||||||
))
|
|
||||||
|
|
||||||
|
|
||||||
val upFrameProbeInfo: FrameHeader = Wire(new FrameHeader)
|
val upFrameProbeInfo: FrameHeader = Wire(new FrameHeader)
|
||||||
@@ -164,13 +153,16 @@ abstract class SlaveParserBase extends Module{
|
|||||||
upFrameProbeInfo.frameInfo := localDevIndex //其它信息,如probe
|
upFrameProbeInfo.frameInfo := localDevIndex //其它信息,如probe
|
||||||
|
|
||||||
upSendGen.io.frameReq.valid :=
|
upSendGen.io.frameReq.valid :=
|
||||||
isUpSendPend & upRecParser.io.subMsgReq.fire | //上行转发
|
(upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON) |
|
||||||
isAckProbe // 上行探针
|
isAckProbe
|
||||||
|
|
||||||
assert( ~(isUpSendPend & isAckProbe), "Assert Failed, Check Softwave, Probe is Sent while transfering!\n" )
|
assert( ~(upSendGen.io.frameReq.valid & ~upSendGen.io.frameReq.ready) )
|
||||||
|
|
||||||
|
|
||||||
|
assert( ~(upRecParser.io.frameReq.fire & isAckProbe), "Assert Failed, Check Softwave, Probe is Sent while transfering!\n" )
|
||||||
|
|
||||||
upSendGen.io.frameReq.bits := Mux1H(Seq(
|
upSendGen.io.frameReq.bits := Mux1H(Seq(
|
||||||
isUpSendPend -> upFrameInfo, //上行转发
|
upRecParser.io.frameReq.fire -> upRecParser.io.frameReq.bits, //上行转发
|
||||||
isAckProbe -> upFrameProbeInfo, //上行探针
|
isAckProbe -> upFrameProbeInfo, //上行探针
|
||||||
))
|
))
|
||||||
|
|
||||||
@@ -678,14 +670,15 @@ trait SlaveParserProbe{ this: SlaveParserBase =>
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
val isReadyToProbe_Pending = RegInit(false.B)
|
// val isReadyToProbe_Pending = RegInit(false.B)
|
||||||
|
|
||||||
when( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //下行来了一个嗅探包
|
when( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //下行来了一个嗅探包
|
||||||
isReadyToProbe_Pending := true.B
|
isReadyToProbe := true.B
|
||||||
|
assert( downSendGen.io.stateCurr === STATE_IDLE )
|
||||||
} .elsewhen( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行来了一个嗅探包
|
} .elsewhen( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行来了一个嗅探包
|
||||||
isReadyToProbe_Pending := false.B
|
isReadyToProbe := false.B
|
||||||
} .elsewhen( isWatchDogOverflow ){
|
} .elsewhen( isWatchDogOverflow ){
|
||||||
isReadyToProbe_Pending := false.B
|
isReadyToProbe := false.B
|
||||||
}
|
}
|
||||||
|
|
||||||
when( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //下行来了一个嗅探包
|
when( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //下行来了一个嗅探包
|
||||||
@@ -696,12 +689,12 @@ trait SlaveParserProbe{ this: SlaveParserBase =>
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
val isLastDevice_Pending = RegInit(true.B)
|
// val isLastDevice = RegInit(true.B)
|
||||||
|
|
||||||
when( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行来了一个嗅探包
|
when( upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){ //上行来了一个嗅探包
|
||||||
isLastDevice_Pending := false.B
|
isLastDevice := false.B
|
||||||
} .elsewhen( isWatchDogOverflow ){
|
} .elsewhen( isWatchDogOverflow ){
|
||||||
isLastDevice_Pending := true.B
|
isLastDevice := true.B
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -749,13 +742,13 @@ trait SlaveParserProbe{ this: SlaveParserBase =>
|
|||||||
io.isLoop := isLastDevice & ~isReadyToProbe
|
io.isLoop := isLastDevice & ~isReadyToProbe
|
||||||
|
|
||||||
|
|
||||||
when( isLastDevice =/= isLastDevice_Pending & ~downSendGen.io.send.valid & ~io.downOut.valid & ~io.upIn.valid ){
|
// when( isLastDevice =/= isLastDevice_Pending & ~downSendGen.io.send.valid & ~io.downOut.valid & ~io.upIn.valid ){
|
||||||
isLastDevice := isLastDevice_Pending
|
// isLastDevice := isLastDevice_Pending
|
||||||
}
|
// }
|
||||||
|
|
||||||
when( isReadyToProbe =/= isReadyToProbe_Pending & ~downSendGen.io.send.valid & ~io.downOut.valid & ~io.upIn.valid ){
|
// when( isReadyToProbe =/= isReadyToProbe_Pending & ~downSendGen.io.send.valid & ~io.downOut.valid & ~io.upIn.valid ){
|
||||||
isReadyToProbe := isReadyToProbe_Pending
|
// isReadyToProbe := isReadyToProbe_Pending
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
class SlaveParser extends SlaveParserBase
|
class SlaveParser extends SlaveParserBase
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ class SlaveSendGenIO extends Bundle{
|
|||||||
val send = Decoupled(new AXIS_Bundle(8))
|
val send = Decoupled(new AXIS_Bundle(8))
|
||||||
|
|
||||||
val isError = Output(Bool())
|
val isError = Output(Bool())
|
||||||
|
val stateCurr = Output(UInt(3.W))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -40,11 +41,11 @@ class SlaveSendGen extends Module{
|
|||||||
val STATE_SUBMSG_DATA = 3.U
|
val STATE_SUBMSG_DATA = 3.U
|
||||||
val STATE_CRC = 4.U //CRC校验
|
val STATE_CRC = 4.U //CRC校验
|
||||||
val STATE_ERROR = 5.U
|
val STATE_ERROR = 5.U
|
||||||
// val STATE_WAIT = 6.U
|
val STATE_WAIT = 6.U
|
||||||
|
|
||||||
|
|
||||||
val stateNext = Wire(UInt(3.W))
|
val stateNext = Wire(UInt(3.W))
|
||||||
val stateCurr = RegNext(stateNext, STATE_IDLE)
|
val stateCurr = RegNext(stateNext, STATE_IDLE); io.stateCurr := stateCurr
|
||||||
|
|
||||||
io.isError := stateCurr === STATE_ERROR
|
io.isError := stateCurr === STATE_ERROR
|
||||||
|
|
||||||
@@ -116,18 +117,19 @@ class SlaveSendGen extends Module{
|
|||||||
(stateCurr === STATE_IDLE) -> Mux( io.frameReq.fire, STATE_FRAME_HEADER, STATE_IDLE ),
|
(stateCurr === STATE_IDLE) -> Mux( io.frameReq.fire, STATE_FRAME_HEADER, STATE_IDLE ),
|
||||||
(stateCurr === STATE_FRAME_HEADER) -> Mux( io.send.fire, Mux( lengthCnt === (4-1).U, Mux(
|
(stateCurr === STATE_FRAME_HEADER) -> Mux( io.send.fire, Mux( lengthCnt === (4-1).U, Mux(
|
||||||
frameInfo.frameStyle === FRAME_STYLE_COMMON,
|
frameInfo.frameStyle === FRAME_STYLE_COMMON,
|
||||||
Mux(io.subMsgReq.valid, STATE_SUBMSG_HEADER, STATE_ERROR),
|
Mux(io.subMsgReq.valid, STATE_SUBMSG_HEADER, STATE_WAIT),
|
||||||
STATE_CRC ),
|
STATE_CRC ),
|
||||||
STATE_FRAME_HEADER), STATE_FRAME_HEADER ),
|
STATE_FRAME_HEADER), STATE_FRAME_HEADER ),
|
||||||
(stateCurr === STATE_SUBMSG_HEADER) -> Mux( io.send.fire, Mux( lengthCnt === (8-1).U, STATE_SUBMSG_DATA, STATE_SUBMSG_HEADER), STATE_SUBMSG_HEADER),
|
(stateCurr === STATE_SUBMSG_HEADER) -> Mux( io.send.fire, Mux( lengthCnt === (8-1).U, STATE_SUBMSG_DATA, STATE_SUBMSG_HEADER), STATE_SUBMSG_HEADER),
|
||||||
(stateCurr === STATE_SUBMSG_DATA) -> Mux( io.send.fire,
|
(stateCurr === STATE_SUBMSG_DATA) -> Mux( io.send.fire,
|
||||||
Mux( lengthCnt === subMsgInfoSel.length-1.U, //已经发送完成该子报文
|
Mux( lengthCnt === subMsgInfoSel.length-1.U, //已经发送完成该子报文
|
||||||
Mux( frameLenCnt === frameInfo.frameLenAim -1.U, STATE_CRC, //主报文长度达到, 进CRC
|
Mux( frameLenCnt === frameInfo.frameLenAim -1.U, STATE_CRC, //主报文长度达到, 进CRC
|
||||||
Mux( io.subMsgReq.valid, STATE_SUBMSG_HEADER, STATE_ERROR ) ), //主报文长度未到,进下一个子报文
|
Mux( io.subMsgReq.valid, STATE_SUBMSG_HEADER, STATE_WAIT ) ), //主报文长度未到,进下一个子报文
|
||||||
STATE_SUBMSG_DATA
|
STATE_SUBMSG_DATA
|
||||||
), STATE_SUBMSG_DATA ),
|
), STATE_SUBMSG_DATA ),
|
||||||
(stateCurr === STATE_CRC) -> Mux( io.send.fire, Mux( lengthCnt === (4-1).U, STATE_IDLE, STATE_CRC ), STATE_CRC),
|
(stateCurr === STATE_CRC) -> Mux( io.send.fire, Mux( lengthCnt === (4-1).U, STATE_IDLE, STATE_CRC ), STATE_CRC),
|
||||||
(stateCurr === STATE_ERROR) -> Mux( io.send.fire, STATE_IDLE, STATE_ERROR),
|
(stateCurr === STATE_ERROR) -> Mux( io.send.fire, STATE_IDLE, STATE_ERROR),
|
||||||
|
(stateCurr === STATE_WAIT) -> Mux( io.subMsgReq.valid, STATE_SUBMSG_HEADER, STATE_WAIT),
|
||||||
))
|
))
|
||||||
|
|
||||||
io.data(0).ready := io.send.fire & (stateCurr === STATE_SUBMSG_DATA) & (subMsgInfoSel.source === 0.U)
|
io.data(0).ready := io.send.fire & (stateCurr === STATE_SUBMSG_DATA) & (subMsgInfoSel.source === 0.U)
|
||||||
|
|||||||
Reference in New Issue
Block a user