断言不会发生tx Underrun

This commit is contained in:
RuigeLee
2023-10-13 15:21:53 +08:00
parent bb35dffb84
commit ceef60b95c
4 changed files with 53 additions and 78 deletions

View File

@@ -125,7 +125,6 @@ val TxUsedData = Wire(Bool())
val TxData = Wire(UInt(8.W)) val TxData = Wire(UInt(8.W))
val TxRetry = Wire(Bool()) val TxRetry = Wire(Bool())
val TxAbort = Wire(Bool()) val TxAbort = Wire(Bool())
val TxUnderRun = Wire(Bool())
val TxDone = Wire(Bool()) val TxDone = Wire(Bool())
val TPauseRq = Wire(Bool()) val TPauseRq = Wire(Bool())
@@ -135,7 +134,6 @@ dontTouch(TxUsedData)
dontTouch(TxData ) dontTouch(TxData )
dontTouch(TxRetry ) dontTouch(TxRetry )
dontTouch(TxAbort ) dontTouch(TxAbort )
dontTouch(TxUnderRun)
dontTouch(TxDone ) dontTouch(TxDone )
dontTouch(TPauseRq ) dontTouch(TPauseRq )
@@ -512,7 +510,6 @@ val txethmac = withClockAndReset(io.mtx_clk_pad_i.asClock, io.asyncReset)( Modul
txethmac.io.TxStartFrm := TxStartFrmOut txethmac.io.TxStartFrm := TxStartFrmOut
txethmac.io.TxEndFrm := TxEndFrmOut txethmac.io.TxEndFrm := TxEndFrmOut
txethmac.io.TxUnderRun := TxUnderRun
txethmac.io.TxData := TxDataOut txethmac.io.TxData := TxDataOut
txethmac.io.CarrierSense := TxCarrierSense txethmac.io.CarrierSense := TxCarrierSense
txethmac.io.Collision := Collision txethmac.io.Collision := Collision
@@ -817,9 +814,6 @@ val rxethmac = withClockAndReset(io.mrx_clk_pad_i.asClock, io.asyncReset)( Modul
TxEndFrm := macTileLinkTx.io.TxEndFrm TxEndFrm := macTileLinkTx.io.TxEndFrm
TxData := macTileLinkTx.io.TxData TxData := macTileLinkTx.io.TxData
wishbone.io.TxUnderRun := TxUnderRun
TxUnderRun := macTileLinkTx.io.TxUnderRun
macTileLinkTx.io.TxUnderRun_wb := wishbone.io.TxUnderRun_wb
macTileLinkTx.io.TxData_wb := wishbone.io.TxData_wb macTileLinkTx.io.TxData_wb := wishbone.io.TxData_wb
macTileLinkTx.io.TxValidBytesLatched := wishbone.io.TxValidBytesLatched macTileLinkTx.io.TxValidBytesLatched := wishbone.io.TxValidBytesLatched

View File

@@ -12,7 +12,6 @@ class MacTileLinkTxIO extends Bundle{
val TxStartFrm = Output(Bool()) // Transmit packet start frame val TxStartFrm = Output(Bool()) // Transmit packet start frame
val TxEndFrm = Output(Bool()) // Transmit packet end frame val TxEndFrm = Output(Bool()) // Transmit packet end frame
val TxData = Output(UInt(8.W)) // Transmit packet data byte val TxData = Output(UInt(8.W)) // Transmit packet data byte
val TxUnderRun = Output(Bool()) // Transmit packet under-run
val TxUsedData = Input(Bool()) // Transmit packet used data val TxUsedData = Input(Bool()) // Transmit packet used data
val TxRetry = Input(Bool()) // Transmit packet retry val TxRetry = Input(Bool()) // Transmit packet retry
@@ -25,7 +24,6 @@ class MacTileLinkTxIO extends Bundle{
val TxEndFrm_wb = Input(Bool()) val TxEndFrm_wb = Input(Bool())
val TxValidBytesLatched = Input(UInt(2.W)) val TxValidBytesLatched = Input(UInt(2.W))
val TxData_wb = Input(UInt(32.W)) val TxData_wb = Input(UInt(32.W))
val TxUnderRun_wb = Input(Bool())
} }
@@ -40,7 +38,6 @@ class MacTileLinkTx extends Module with RequireAsyncReset{
val TxStartFrm = RegInit(false.B); io.TxStartFrm := TxStartFrm val TxStartFrm = RegInit(false.B); io.TxStartFrm := TxStartFrm
val TxEndFrm = RegInit(false.B); io.TxEndFrm := TxEndFrm val TxEndFrm = RegInit(false.B); io.TxEndFrm := TxEndFrm
val TxData = RegInit(0.U(8.W)); io.TxData := TxData val TxData = RegInit(0.U(8.W)); io.TxData := TxData
val TxUnderRun = RegInit(false.B); io.TxUnderRun := TxUnderRun
val TxDataLatched = RegInit(0.U(32.W)) val TxDataLatched = RegInit(0.U(32.W))
val TxByteCnt = RegInit(0.U(2.W)) val TxByteCnt = RegInit(0.U(2.W))
val LastWord = RegInit(false.B) val LastWord = RegInit(false.B)
@@ -105,21 +102,6 @@ class MacTileLinkTx extends Module with RequireAsyncReset{
TxDataLatched := io.TxData_wb TxDataLatched := io.TxData_wb
} }
val TxUnderRun_sync1 = RegInit(false.B)
// Tx under run
when(io.TxUnderRun_wb){
TxUnderRun_sync1 := true.B
} .elsewhen(io.BlockingTxStatusWrite_sync){
TxUnderRun_sync1 := false.B
}
// Tx under run
when(io.BlockingTxStatusWrite_sync){
TxUnderRun := false.B
} .elsewhen(TxUnderRun_sync1){
TxUnderRun := true.B
}
// Tx Byte counter // Tx Byte counter
when(TxAbort_q | TxRetry_q){ when(TxAbort_q | TxRetry_q){

View File

@@ -39,8 +39,6 @@ abstract class MacTileLinkBase(edgeIn: TLEdgeIn, edgeOut: TLEdgeOut) extends Mod
val CarrierSenseLost = Input(Bool()) // Carrier Sense was lost during the frame transmission val CarrierSenseLost = Input(Bool()) // Carrier Sense was lost during the frame transmission
// Tx // Tx
val TxUsedData = Input(Bool()) // Transmit packet used data
val TxUnderRun = Input(Bool()) // Transmit packet under-run
val PerPacketCrcEn = Output(Bool()) // Per packet crc enable val PerPacketCrcEn = Output(Bool()) // Per packet crc enable
val PerPacketPad = Output(Bool()) // Per packet pading val PerPacketPad = Output(Bool()) // Per packet pading
@@ -53,16 +51,12 @@ abstract class MacTileLinkBase(edgeIn: TLEdgeIn, edgeOut: TLEdgeOut) extends Mod
val BlockingTxStatusWrite = Output(Bool()) val BlockingTxStatusWrite = Output(Bool())
val ReadTxDataFromFifo_sync = Input(Bool()) val TxUsedData = Input(Bool()) // Transmit packet used data
val TxData_wb = Output(UInt(32.W))
val TxValidBytesLatched = Output(UInt(2.W)) val TxValidBytesLatched = Output(UInt(2.W))
val TxStartFrm_wb = Output(Bool())
val TxStartFrm_syncb = Input(Bool())
val TxEndFrm_wb = Output(Bool())
val TxUnderRun_wb = Output(Bool())
val TxRetrySync = Input(Bool()) val TxRetrySync = Input(Bool())
val TxAbortSync = Input(Bool()) // Transmit packet abort val TxAbortSync = Input(Bool()) // Transmit packet abort
@@ -84,6 +78,12 @@ abstract class MacTileLinkBase(edgeIn: TLEdgeIn, edgeOut: TLEdgeOut) extends Mod
val TxStartFrm_wb = Output(Bool())
val TxStartFrm_syncb = Input(Bool())
val TxEndFrm_wb = Output(Bool())
val TxData_wb = Output(UInt(32.W))
val ReadTxDataFromFifo_sync = Input(Bool())
val txEnq = Flipped(new TxBuff_Deq_Bundle) val txEnq = Flipped(new TxBuff_Deq_Bundle)
@@ -160,6 +160,35 @@ abstract class MacTileLinkBase(edgeIn: TLEdgeIn, edgeOut: TLEdgeOut) extends Mod
} }
when((TxLength === 0.U) & io.TxUsedData){
TxEndFrm_wb := true.B
} .elsewhen(TxRetryPulse | TxDonePulse | TxAbortPulse){
TxEndFrm_wb := false.B
}
when( io.txEnq.ctrl.fire ){
TxStatus := Cat(txBuffDesc.irq, txBuffDesc.wr, txBuffDesc.pad, txBuffDesc.crc) // Latching status from the tx buffer descriptor Data is avaliable one cycle after the access is started (at that time signal TxEn is not active)
TxLength := io.txEnq.ctrl.bits.txLength //Latching length from the buffer descriptor;
LatchedTxLength := io.txEnq.ctrl.bits.txLength
} .elsewhen( io.txEnq.data.fire ){
when( TxLength < 4.U ){
TxLength := 0.U
} .otherwise{
TxLength := TxLength - 4.U // Length is subtracted at the data request
}
}
tx_fifo.io.data_in := io.tlMst.D.bits.data
tx_fifo.io.write := io.tlMst.D.fire & io.tlMst.D.bits.opcode === 1.U
io.txEnq.data.ready := ReadTxDataFromFifoSyncPluse & ~tx_fifo.io.empty
assert( ~(io.txEnq.data.ready & ~io.txEnq.data.valid), "Assert Failed, Tx should never under run!" )
io.TxData_wb := io.txEnq.data.bits
tx_fifo.io.clear := TxAbortPacket | TxRetryPacket
@@ -187,7 +216,6 @@ abstract class MacTileLinkBase(edgeIn: TLEdgeIn, edgeOut: TLEdgeOut) extends Mod
val tx_fifo = Module( new MacFifo(dw = 32, dp = 16) ) val tx_fifo = Module( new MacFifo(dw = 32, dp = 16) )
val TxB_IRQ = RegInit(false.B); io.TxB_IRQ := TxB_IRQ val TxB_IRQ = RegInit(false.B); io.TxB_IRQ := TxB_IRQ
val TxE_IRQ = RegInit(false.B); io.TxE_IRQ := TxE_IRQ val TxE_IRQ = RegInit(false.B); io.TxE_IRQ := TxE_IRQ
val TxUnderRun_wb = RegInit(false.B); io.TxUnderRun_wb := TxUnderRun_wb
val TxBDRead = RegInit(true.B) val TxBDRead = RegInit(true.B)
val TxStatusWrite = Wire(Bool()) val TxStatusWrite = Wire(Bool())
val TxLength = RegInit(0.U(16.W)) val TxLength = RegInit(0.U(16.W))
@@ -297,7 +325,7 @@ abstract class MacTileLinkBase(edgeIn: TLEdgeIn, edgeOut: TLEdgeOut) extends Mod
stateNxt := StateTX // wb access stage, r_RxEn is disabled but r_TxEn is enabled stateNxt := StateTX // wb access stage, r_RxEn is disabled but r_TxEn is enabled
ram_addr := Cat(TxBDAddress, TxPointerRead) //[7,1] + [0] ram_addr := Cat(TxBDAddress, TxPointerRead) //[7,1] + [0]
ram_di := Cat(LatchedTxLength, 0.U(1.W), TxStatus, 0.U(2.W), io.TxUnderRun, io.RetryCntLatched, io.RetryLimit, io.LateCollLatched, io.DeferLatched, io.CarrierSenseLost) ram_di := Cat(LatchedTxLength, 0.U(1.W), TxStatus, 0.U(2.W), false.B, io.RetryCntLatched, io.RetryLimit, io.LateCollLatched, io.DeferLatched, io.CarrierSenseLost)
} .otherwise{ } .otherwise{
stateNxt := StateIdle // WbEn access stage and there is no need for other stages. WbEn needs to be switched off for a bit stateNxt := StateIdle // WbEn access stage and there is no need for other stages. WbEn needs to be switched off for a bit
} }
@@ -378,17 +406,7 @@ abstract class MacTileLinkBase(edgeIn: TLEdgeIn, edgeOut: TLEdgeOut) extends Mod
when(stateNxt === StateTX & stateCur === StateTX & TxBDRead){
TxStatus := Cat(txBuffDesc.irq, txBuffDesc.wr, txBuffDesc.pad, txBuffDesc.crc) // Latching status from the tx buffer descriptor Data is avaliable one cycle after the access is started (at that time signal TxEn is not active)
TxLength := txBuffDesc.len //Latching length from the buffer descriptor;
LatchedTxLength := txBuffDesc.len
} .elsewhen( MasterWbTX & io.tlMst.D.fire ){ //tx tileRead
when( TxLength < 4.U ){
TxLength := 0.U
} .otherwise{
TxLength := TxLength - 4.U // Length is subtracted at the data request
}
}
@@ -427,7 +445,7 @@ abstract class MacTileLinkBase(edgeIn: TLEdgeIn, edgeOut: TLEdgeOut) extends Mod
val TxError = io.TxUnderRun | io.RetryLimit | io.LateCollLatched | io.CarrierSenseLost val TxError = io.RetryLimit | io.LateCollLatched | io.CarrierSenseLost
// Tx Done Interrupt // Tx Done Interrupt
when(TxStatusWrite & TxIRQEn){ when(TxStatusWrite & TxIRQEn){
@@ -503,13 +521,6 @@ abstract class MacTileLinkBase(edgeIn: TLEdgeIn, edgeOut: TLEdgeOut) extends Mod
tx_fifo.io.data_in := io.tlMst.D.bits.data
tx_fifo.io.write := io.tlMst.D.fire & io.tlMst.D.bits.opcode === 1.U
tx_fifo.io.read := ReadTxDataFromFifoSyncPluse & ~tx_fifo.io.empty
tx_fifo.io.clear := TxAbortPacket | TxRetryPacket
io.TxData_wb := tx_fifo.io.data_out
@@ -518,12 +529,8 @@ abstract class MacTileLinkBase(edgeIn: TLEdgeIn, edgeOut: TLEdgeOut) extends Mod
// TxEndFrm_wb: indicator of the end of frame
when((TxLength === 0.U) & tx_fifo.io.almost_empty & io.TxUsedData){
TxEndFrm_wb := true.B
} .elsewhen(TxRetryPulse | TxDonePulse | TxAbortPulse){
TxEndFrm_wb := false.B
}
// Marks which bytes are valid within the word. // Marks which bytes are valid within the word.
@@ -653,12 +660,7 @@ abstract class MacTileLinkBase(edgeIn: TLEdgeIn, edgeOut: TLEdgeOut) extends Mod
// Tx under run
when(TxAbortPulse){
TxUnderRun_wb := false.B
} .elsewhen(tx_fifo.io.empty & ReadTxDataFromFifoSyncPluse){
TxUnderRun_wb := true.B
}

View File

@@ -8,7 +8,6 @@ class MacTxIO extends Bundle{
val TxStartFrm = Input(Bool()) // Transmit packet start frame val TxStartFrm = Input(Bool()) // Transmit packet start frame
val TxEndFrm = Input(Bool()) // Transmit packet end frame val TxEndFrm = Input(Bool()) // Transmit packet end frame
val TxUnderRun = Input(Bool()) // Transmit packet under-run
val TxData = Input(UInt(8.W)) // Transmit packet data byte val TxData = Input(UInt(8.W)) // Transmit packet data byte
val CarrierSense = Input(Bool()) // Carrier sense (synchronized) val CarrierSense = Input(Bool()) // Carrier sense (synchronized)
val Collision = Input(Bool()) // Collision (synchronized) val Collision = Input(Bool()) // Collision (synchronized)
@@ -65,7 +64,6 @@ abstract class MacTxBase extends Module with RequireAsyncReset{
val StateSFD = Wire(Bool()) val StateSFD = Wire(Bool())
val UnderRun = Wire(Bool())
val TooBig = Wire(Bool()) val TooBig = Wire(Bool())
val CrcError = Wire(Bool()) val CrcError = Wire(Bool())
@@ -114,7 +112,7 @@ trait MacTxFSM { this: MacTxBase =>
StartPreamble := StateIdle & io.TxStartFrm & ~io.CarrierSense StartPreamble := StateIdle & io.TxStartFrm & ~io.CarrierSense
StartData(0) := ~io.Collision & (StatePreamble & NibCntEq15 | StateData(1) & ~io.TxEndFrm) StartData(0) := ~io.Collision & (StatePreamble & NibCntEq15 | StateData(1) & ~io.TxEndFrm)
StartData(1) := ~io.Collision & StateData(0) & ~io.TxUnderRun & ~MaxFrame StartData(1) := ~io.Collision & StateData(0) & ~MaxFrame
val StartPAD = ~io.Collision & StateData(1) & io.TxEndFrm & io.Pad & ~NibbleMinFl val StartPAD = ~io.Collision & StateData(1) & io.TxEndFrm & io.Pad & ~NibbleMinFl
@@ -122,7 +120,7 @@ trait MacTxFSM { this: MacTxBase =>
(~io.Collision & StateData(1) & io.TxEndFrm & (~io.Pad | io.Pad & NibbleMinFl) & io.CrcEn) | (~io.Collision & StateData(1) & io.TxEndFrm & (~io.Pad | io.Pad & NibbleMinFl) & io.CrcEn) |
(~io.Collision & StatePAD & NibbleMinFl & io.CrcEn) (~io.Collision & StatePAD & NibbleMinFl & io.CrcEn)
StartJam := (io.Collision | UnderRun) & ((StatePreamble & NibCntEq15) | (StateData(1) | StateData(0)) | StatePAD | StateFCS) StartJam := (io.Collision ) & ((StatePreamble & NibCntEq15) | (StateData(1) | StateData(0)) | StatePAD | StateFCS)
StartBackoff := StateJam & ~RandomEq0 & ColWindow & ~RetryMax & NibCntEq7 & ~io.NoBckof StartBackoff := StateJam & ~RandomEq0 & ColWindow & ~RetryMax & NibCntEq7 & ~io.NoBckof
@@ -130,7 +128,7 @@ trait MacTxFSM { this: MacTxBase =>
(StateIPG & ~Rule1 & io.CarrierSense & NibCnt(6,0) <= io.IPGR1 & NibCnt(6,0) =/= io.IPGR2) | (StateIPG & ~Rule1 & io.CarrierSense & NibCnt(6,0) <= io.IPGR1 & NibCnt(6,0) =/= io.IPGR2) |
(StateIdle & io.CarrierSense) | (StateIdle & io.CarrierSense) |
(StateJam & NibCntEq7 & (io.NoBckof | RandomEq0 | ~ColWindow | RetryMax)) | (StateJam & NibCntEq7 & (io.NoBckof | RandomEq0 | ~ColWindow | RetryMax)) |
(StateBackOff & (io.TxUnderRun | RandomEqByteCnt)) | (StateBackOff & (RandomEqByteCnt)) |
io.StartTxDone | io.StartTxDone |
TooBig TooBig
@@ -352,7 +350,7 @@ class MacTx extends MacTxBase with MacTxFSM with MacTxCounter with MacTxCRC with
val TxAbort = RegInit(false.B); io.TxAbort := TxAbort val TxAbort = RegInit(false.B); io.TxAbort := TxAbort
val MTxEn = RegNext(StatePreamble | (StateData(0) | StateData(1)) | StatePAD | StateFCS | StateJam, false.B); io.MTxEn := MTxEn val MTxEn = RegNext(StatePreamble | (StateData(0) | StateData(1)) | StatePAD | StateFCS | StateJam, false.B); io.MTxEn := MTxEn
val MTxErr = RegNext( TooBig | UnderRun, false.B); io.MTxErr := MTxErr// Transmit error val MTxErr = RegNext( TooBig, false.B); io.MTxErr := MTxErr// Transmit error
val WillTransmit = RegNext(StartPreamble | StatePreamble | (StateData(0) | StateData(1)) | StatePAD | StateFCS | StateJam, false.B); io.WillTransmit := WillTransmit// WillTransmit val WillTransmit = RegNext(StartPreamble | StatePreamble | (StateData(0) | StateData(1)) | StatePAD | StateFCS | StateJam, false.B); io.WillTransmit := WillTransmit// WillTransmit
@@ -361,13 +359,12 @@ class MacTx extends MacTxBase with MacTxFSM with MacTxCounter with MacTxCRC with
io.ResetCollision := ~(StatePreamble | (StateData(0) | StateData(1)) | StatePAD | StateFCS) io.ResetCollision := ~(StatePreamble | (StateData(0) | StateData(1)) | StatePAD | StateFCS)
val ExcessiveDeferOccured = io.TxStartFrm & StateDefer & ExcessiveDefer & ~StopExcessiveDeferOccured val ExcessiveDeferOccured = io.TxStartFrm & StateDefer & ExcessiveDefer & ~StopExcessiveDeferOccured
io.StartTxDone := ~io.Collision & (StateFCS & NibCntEq7 | StateData(1) & io.TxEndFrm & (~io.Pad | io.Pad & NibbleMinFl) & ~io.CrcEn) io.StartTxDone := ~io.Collision & (StateFCS & NibCntEq7 | StateData(1) & io.TxEndFrm & (~io.Pad | io.Pad & NibbleMinFl) & ~io.CrcEn)
UnderRun := StateData(0) & io.TxUnderRun & ~io.Collision TooBig := ~io.Collision & MaxFrame & (StateData(0) | StateFCS);
TooBig := ~io.Collision & MaxFrame & (StateData(0) & ~io.TxUnderRun | StateFCS); val StartTxRetry = StartJam & (ColWindow & ~RetryMax)
val StartTxRetry = StartJam & (ColWindow & ~RetryMax) & ~UnderRun; io.LateCollision := StartJam & ~ColWindow
io.LateCollision := StartJam & ~ColWindow & ~UnderRun;
io.MaxCollisionOccured := StartJam & ColWindow & RetryMax; io.MaxCollisionOccured := StartJam & ColWindow & RetryMax;
StateSFD := StatePreamble & NibCntEq15; StateSFD := StatePreamble & NibCntEq15;
io.StartTxAbort := TooBig | UnderRun | ExcessiveDeferOccured | io.LateCollision | io.MaxCollisionOccured io.StartTxAbort := TooBig | ExcessiveDeferOccured | io.LateCollision | io.MaxCollisionOccured
when(~io.TxStartFrm){ when(~io.TxStartFrm){
StopExcessiveDeferOccured := false.B StopExcessiveDeferOccured := false.B
@@ -417,7 +414,7 @@ class MacTx extends MacTxBase with MacTxFSM with MacTxCounter with MacTxCRC with
} }
// Retry counter // Retry counter
when(ExcessiveDeferOccured | UnderRun | TooBig | io.StartTxDone | io.TxUnderRun when(ExcessiveDeferOccured | TooBig | io.StartTxDone
| StateJam & NibCntEq7 & (~ColWindow | RetryMax)){ | StateJam & NibCntEq7 & (~ColWindow | RetryMax)){
RetryCnt := 0.U RetryCnt := 0.U
}.elsewhen(StateJam & NibCntEq7 & ColWindow & (RandomEq0 | io.NoBckof) | StateBackOff & RandomEqByteCnt){ }.elsewhen(StateJam & NibCntEq7 & ColWindow & (RandomEq0 | io.NoBckof) | StateBackOff & RandomEqByteCnt){
@@ -443,7 +440,7 @@ class MacTx extends MacTxBase with MacTxFSM with MacTxCounter with MacTxCRC with
) )
} }
val PacketFinished_d = io.StartTxDone | TooBig | UnderRun | io.LateCollision | io.MaxCollisionOccured | ExcessiveDeferOccured; val PacketFinished_d = io.StartTxDone | TooBig | io.LateCollision | io.MaxCollisionOccured | ExcessiveDeferOccured;
val PacketFinished = RegNext(PacketFinished_d, false.B) val PacketFinished = RegNext(PacketFinished_d, false.B)
when(true.B){ when(true.B){
PacketFinished_q := PacketFinished PacketFinished_q := PacketFinished