转发延迟缩减至126个cycle

This commit is contained in:
Ruige Lee
2025-05-20 11:35:11 +08:00
parent cb30c29e07
commit 4b2a52fa9b
3 changed files with 45 additions and 48 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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)