转发延迟缩减至126个cycle
This commit is contained in:
@@ -49,6 +49,8 @@ class CDROut extends Module{
|
||||
(stateCurr === STATE_PAYLOAD)
|
||||
)
|
||||
|
||||
assert( ~(~io.axis.valid & io.axis.ready) )
|
||||
|
||||
|
||||
|
||||
when( stateCurr === STATE_IDLE & stateNext === STATE_PREAMBLE){ //PRE
|
||||
|
||||
@@ -115,47 +115,36 @@ abstract class SlaveParserBase extends Module{
|
||||
// val downSinkSel = Reg(Bool())
|
||||
// val upSinkSel = Reg(Bool())
|
||||
|
||||
val downFrameInfo = Reg(new FrameHeader) //下行大包头
|
||||
val upFrameInfo = Reg(new FrameHeader) //上行大包头
|
||||
// val downFrameInfo = Reg(new FrameHeader) //下行大包头
|
||||
// val upFrameInfo = Reg(new FrameHeader) //上行大包头
|
||||
|
||||
// val isDownSendBusy = downSendGen.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 ){
|
||||
isDownSendPend := false.B
|
||||
} .elsewhen( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON ){//下行来了一个普通包
|
||||
isDownSendPend := true.B
|
||||
downFrameInfo := downRecParser.io.frameReq.bits
|
||||
} .elsewhen( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){//下行来了一个嗅探包
|
||||
isDownSendPend := true.B
|
||||
downFrameInfo := downRecParser.io.frameReq.bits
|
||||
}
|
||||
// when( downSendGen.io.frameReq.fire ){
|
||||
|
||||
// } .elsewhen( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON ){//下行来了一个普通包
|
||||
// downFrameInfo := downRecParser.io.frameReq.bits
|
||||
// } .elsewhen( downRecParser.io.frameReq.fire & downRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_PROBE ){//下行来了一个嗅探包
|
||||
// downFrameInfo := downRecParser.io.frameReq.bits
|
||||
// }
|
||||
|
||||
when( upSendGen.io.frameReq.fire ){
|
||||
isUpSendPend := false.B
|
||||
|
||||
} .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 :=
|
||||
isDownSendPend & downFrameInfo.frameStyle === FRAME_STYLE_COMMON & downRecParser.io.subMsgReq.fire | //下行转发
|
||||
isDownSendPend & downFrameInfo.frameStyle === FRAME_STYLE_PROBE //下行探针
|
||||
downSendGen.io.frameReq.valid := downRecParser.io.frameReq.fire
|
||||
assert( ~(downSendGen.io.frameReq.valid & ~downSendGen.io.frameReq.ready) )
|
||||
|
||||
// assert( OneHot(isDownSendPend, isDownSendProbe) )
|
||||
|
||||
downSendGen.io.frameReq.bits := Mux1H(Seq(
|
||||
isDownSendPend -> downFrameInfo, //下行转发
|
||||
//isDownSendProbe -> probeFrame, //下行探针
|
||||
))
|
||||
downSendGen.io.frameReq.bits := downRecParser.io.frameReq.bits
|
||||
|
||||
|
||||
val upFrameProbeInfo: FrameHeader = Wire(new FrameHeader)
|
||||
@@ -164,13 +153,16 @@ abstract class SlaveParserBase extends Module{
|
||||
upFrameProbeInfo.frameInfo := localDevIndex //其它信息,如probe
|
||||
|
||||
upSendGen.io.frameReq.valid :=
|
||||
isUpSendPend & upRecParser.io.subMsgReq.fire | //上行转发
|
||||
isAckProbe // 上行探针
|
||||
(upRecParser.io.frameReq.fire & upRecParser.io.frameReq.bits.frameStyle === FRAME_STYLE_COMMON) |
|
||||
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(
|
||||
isUpSendPend -> upFrameInfo, //上行转发
|
||||
upRecParser.io.frameReq.fire -> upRecParser.io.frameReq.bits, //上行转发
|
||||
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 ){ //下行来了一个嗅探包
|
||||
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 ){ //上行来了一个嗅探包
|
||||
isReadyToProbe_Pending := false.B
|
||||
isReadyToProbe := false.B
|
||||
} .elsewhen( isWatchDogOverflow ){
|
||||
isReadyToProbe_Pending := false.B
|
||||
isReadyToProbe := false.B
|
||||
}
|
||||
|
||||
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 ){ //上行来了一个嗅探包
|
||||
isLastDevice_Pending := false.B
|
||||
isLastDevice := false.B
|
||||
} .elsewhen( isWatchDogOverflow ){
|
||||
isLastDevice_Pending := true.B
|
||||
isLastDevice := true.B
|
||||
}
|
||||
|
||||
|
||||
@@ -749,13 +742,13 @@ trait SlaveParserProbe{ this: SlaveParserBase =>
|
||||
io.isLoop := isLastDevice & ~isReadyToProbe
|
||||
|
||||
|
||||
when( isLastDevice =/= isLastDevice_Pending & ~downSendGen.io.send.valid & ~io.downOut.valid & ~io.upIn.valid ){
|
||||
isLastDevice := isLastDevice_Pending
|
||||
}
|
||||
// when( isLastDevice =/= isLastDevice_Pending & ~downSendGen.io.send.valid & ~io.downOut.valid & ~io.upIn.valid ){
|
||||
// isLastDevice := isLastDevice_Pending
|
||||
// }
|
||||
|
||||
when( isReadyToProbe =/= isReadyToProbe_Pending & ~downSendGen.io.send.valid & ~io.downOut.valid & ~io.upIn.valid ){
|
||||
isReadyToProbe := isReadyToProbe_Pending
|
||||
}
|
||||
// when( isReadyToProbe =/= isReadyToProbe_Pending & ~downSendGen.io.send.valid & ~io.downOut.valid & ~io.upIn.valid ){
|
||||
// isReadyToProbe := isReadyToProbe_Pending
|
||||
// }
|
||||
}
|
||||
|
||||
class SlaveParser extends SlaveParserBase
|
||||
|
||||
@@ -20,6 +20,7 @@ class SlaveSendGenIO extends Bundle{
|
||||
val send = Decoupled(new AXIS_Bundle(8))
|
||||
|
||||
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_CRC = 4.U //CRC校验
|
||||
val STATE_ERROR = 5.U
|
||||
// val STATE_WAIT = 6.U
|
||||
val STATE_WAIT = 6.U
|
||||
|
||||
|
||||
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
|
||||
|
||||
@@ -116,18 +117,19 @@ class SlaveSendGen extends Module{
|
||||
(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(
|
||||
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_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_DATA) -> Mux( io.send.fire,
|
||||
Mux( lengthCnt === subMsgInfoSel.length-1.U, //已经发送完成该子报文
|
||||
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 ),
|
||||
(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_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)
|
||||
|
||||
Reference in New Issue
Block a user