this is the last equal commit

This commit is contained in:
RuigeLee
2023-06-30 16:14:58 +08:00
parent d4ed6f39a0
commit 374c6ecde0

View File

@@ -149,13 +149,12 @@ abstract class MacTileLinkBase extends Module{
val TxStatus = RegInit(0.U(4.W)) //[14:11]
val RxStatus = RegInit(0.U(2.W)) //[14:13]
// Synchronizing TxRetry TxDone_wb TxAbort signal (synchronized to WISHBONE clock)
val TxStartFrm_wb = RegInit(false.B)
// Generating delayed signals
// Synchronizing TxRetry TxDone_wb TxAbort signal (synchronized to WISHBONE clock)
val TxRetry_wb = ShiftRegisters( io.TxRetry, 3, false.B, true.B )
val TxAbort_wb = ShiftRegisters( io.TxAbort, 3, false.B, true.B )
val TxDone_wb = ShiftRegisters( io.TxDone, 3, false.B, true.B )
@@ -200,7 +199,6 @@ abstract class MacTileLinkBase extends Module{
val TxDonePulse = Wire(Bool())
val TxAbortPulse = Wire(Bool())
val StartRxBDRead = Wire(Bool())
@@ -216,7 +214,6 @@ abstract class MacTileLinkBase extends Module{
val WB_ACK_O = Reg(Bool()); io.WB_ACK_O := WB_ACK_O
val RxStatusIn = Wire(UInt(9.W))
// Delayed stage signals
@@ -243,7 +240,6 @@ abstract class MacTileLinkBase extends Module{
val TxEn_needed = RegInit(false.B)
val RxEn_needed = RegInit(false.B)
val StartRxPointerRead = Wire(Bool())
val RxPointerRead = RegInit(false.B)
// RX shift ending signals
@@ -254,11 +250,10 @@ abstract class MacTileLinkBase extends Module{
val StartShiftWillEnd = Wire(Bool())
val StartOccured = RegInit(false.B)
val TxStartFrm_sync2_txclk = Wire(Bool())
val TxStartFrm_syncb1 = RegNext(TxStartFrm_sync2_txclk, false.B)
val TxStartFrm_sync_txclk = Wire(Bool())
val TxStartFrm_syncb1 = RegNext(TxStartFrm_sync_txclk, false.B)
val TxStartFrm_syncb2 = RegNext(TxStartFrm_syncb1, false.B)
val TxFifoClear = Wire(Bool())
@@ -320,39 +315,24 @@ abstract class MacTileLinkBase extends Module{
// Start: Generation of the ReadTxDataFromFifo_tck signal and synchronization to the WB_CLK_I
val ReadTxDataFromFifo_tck_txclk = Wire(Bool())
val ReadTxDataFromFifo_sync1 = RegNext(ReadTxDataFromFifo_tck_txclk, false.B)
val ReadTxDataFromFifo_sync2 = RegNext(ReadTxDataFromFifo_sync1, false.B)
val ReadTxDataFromFifo_sync3 = RegNext(ReadTxDataFromFifo_sync2, false.B)
val ReadTxDataFromFifo_sync = ShiftRegisters( ReadTxDataFromFifo_tck_txclk, 3, false.B, true.B)
val RxAbortLatched_rxclk = Wire(Bool())
val RxAbortSync1 = RegNext( RxAbortLatched_rxclk, false.B )
val RxAbortSync2 = RegNext( RxAbortSync1, false.B )
val RxAbortSync3 = RegNext( RxAbortSync2, false.B )
val RxAbortSync4 = RegNext( RxAbortSync3, false.B )
val RxAbortSync = ShiftRegisters( RxAbortLatched_rxclk, 4, false.B, true.B )
val SetWriteRxDataToFifo = Wire(Bool())
val WriteRxDataToFifo_rxclk = Wire(Bool())
val WriteRxDataToFifoSync1 = RegNext( WriteRxDataToFifo_rxclk, false.B)
val WriteRxDataToFifoSync2 = RegNext( WriteRxDataToFifoSync1, false.B)
val WriteRxDataToFifoSync3 = RegNext( WriteRxDataToFifoSync2, false.B)
val WriteRxDataToFifoSync = ShiftRegisters(WriteRxDataToFifo_rxclk, 3, false.B, true.B)
val WriteRxDataToFifo_wb = Wire(Bool())
val LatchedRxStartFrm_rxclk = Wire(Bool())
val SyncRxStartFrm = RegNext( LatchedRxStartFrm_rxclk, false.B)
val SyncRxStartFrm_q = RegNext( SyncRxStartFrm, false.B)
val SyncRxStartFrm_q2 = RegNext( SyncRxStartFrm_q, false.B)
val SyncRxStartFrm = ShiftRegisters(LatchedRxStartFrm_rxclk, 3, false.B, true.B)
val RxFifoReset = Wire(Bool())
val TxError = Wire(Bool())
val RxError = Wire(Bool())
val RxStatusWriteLatched = RegInit(false.B)
val RxStatusWriteLatched_syncb1 = RegNext(io.RxStatusWriteLatched_sync2, false.B)
val RxStatusWriteLatched_syncb2 = RegNext(RxStatusWriteLatched_syncb1, false.B)
val RxStatusWriteLatched_syncb = ShiftRegister(io.RxStatusWriteLatched_sync2, 2, false.B, true.B)
io.m_wb_bte_o := "b00".U // Linear burst
@@ -841,7 +821,7 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
TxDonePulse := TxDone_wb(1) & ~TxDone_wb(2)
TxAbortPulse := TxAbort_wb(1) & ~TxAbort_wb(2)
val TxError = io.TxUnderRun | io.RetryLimit | io.LateCollLatched | io.CarrierSenseLost
@@ -910,8 +890,8 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
val TxDonePacketBlocked = RegInit(false.B)
when(
TxDone_wb(1) & ~tx_burst_en & MasterWbTX & MasterAccessFinished & ~TxDonePacketBlocked |
TxDone_wb(1) & ~MasterWbTX & ~TxDonePacketBlocked){
TxDone_wb(1) & ~TxDonePacketBlocked & MasterWbTX & ~tx_burst_en & MasterAccessFinished |
TxDone_wb(1) & ~TxDonePacketBlocked & ~MasterWbTX ){
TxDonePacket := true.B
}.otherwise{
TxDonePacket := false.B
@@ -920,8 +900,8 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
when(TxEn & TxEn_q & TxDonePacket_NotCleared){
TxDonePacket_NotCleared := false.B
} .elsewhen(
TxDone_wb(1) & ~tx_burst_en & MasterWbTX & MasterAccessFinished & (~TxDonePacketBlocked) |
TxDone_wb(1) & ~MasterWbTX & (~TxDonePacketBlocked)){
TxDone_wb(1) & ~TxDonePacketBlocked & MasterWbTX & ~tx_burst_en & MasterAccessFinished |
TxDone_wb(1) & ~TxDonePacketBlocked & ~MasterWbTX ){
TxDonePacket_NotCleared := true.B
}
@@ -942,14 +922,9 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
}
ReadTxDataFromFifo_wb := ReadTxDataFromFifo_sync2 & ~ReadTxDataFromFifo_sync3
// End: Generation of the ReadTxDataFromFifo_tck signal and synchronization to the WB_CLK_I
ReadTxDataFromFifo_wb := ReadTxDataFromFifo_sync(1) & ~ReadTxDataFromFifo_sync(2)
StartRxBDRead :=
RxStatusWrite |
RxAbortSync3 & ~RxAbortSync4 |
io.r_RxEn & ~r_RxEn_q
val StartRxBDRead = RxStatusWrite | (RxAbortSync(2) & ~RxAbortSync(3)) | (io.r_RxEn & ~r_RxEn_q)
// Reading the Rx buffer descriptor
when(StartRxBDRead & ~RxReady){
@@ -960,20 +935,17 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
// Reading of the next receive buffer descriptor starts after reception status
// is written to the previous one.
// Reading of the next receive buffer descriptor starts after reception status is written to the previous one.
// Latching READY status of the Rx buffer descriptor
when(RxPointerRead){
RxBDReady := false.B
} .elsewhen(RxEn & RxEn_q & RxBDRead){
RxBDReady := rxBuffDesc.e// RxBDReady is sampled only once at the beginning
RxBDReady := rxBuffDesc.e // RxBDReady is sampled only once at the beginning
}
// Latching Rx buffer descriptor status
// Data is avaliable one cycle after the access is started (at that time
// signal RxEn is not active)
// Latching Rx buffer descriptor status Data is avaliable one cycle after the access is started (at that time signal RxEn is not active)
when(RxEn & RxEn_q & RxBDRead){
RxStatus := Cat(rxBuffDesc.irq, rxBuffDesc.wrap)
}
@@ -981,14 +953,14 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
// RxReady generation
when(ShiftEnded | RxAbortSync2 & ~RxAbortSync3 | ~io.r_RxEn & r_RxEn_q){
when(ShiftEnded | RxAbortSync(1) & ~RxAbortSync(2) | ~io.r_RxEn & r_RxEn_q){
RxReady := false.B
} .elsewhen(RxEn & RxEn_q & RxPointerRead){
RxReady := true.B
}
// Reading Rx BD pointer
StartRxPointerRead := RxBDRead & RxBDReady
val StartRxPointerRead = RxBDRead & RxBDReady
// Reading Tx BD Pointer
when(StartRxPointerRead){
@@ -1038,22 +1010,18 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
val LastByteIn_rxclk = Wire(Bool())
val RxByteCnt_rxclk = Wire(UInt(2.W))
val RxEnableWindow_rxclk = Wire(Bool())
StartShiftWillEnd := LastByteIn_rxclk | io.RxValid & io.RxEndFrm & RxByteCnt_rxclk.andR & RxEnableWindow_rxclk
val StartShiftWillEnd = LastByteIn_rxclk | io.RxValid & io.RxEndFrm & RxByteCnt_rxclk.andR & RxEnableWindow_rxclk
// Indicating start of the reception process
val ShiftWillEnd_rxclk = Wire(Bool())
SetWriteRxDataToFifo :=
val SetWriteRxDataToFifo =
(io.RxValid & RxReady & ~io.RxStartFrm & RxEnableWindow_rxclk & (RxByteCnt_rxclk.andR)) |
(io.RxValid & RxReady & io.RxStartFrm & (RxPointerLSB_rst.andR)) |
(ShiftWillEnd_rxclk & LastByteIn_rxclk & (RxByteCnt_rxclk.andR))
WriteRxDataToFifo_wb := WriteRxDataToFifoSync2 & ~WriteRxDataToFifoSync3
RxFifoReset := SyncRxStartFrm_q & ~SyncRxStartFrm_q2
val WriteRxDataToFifo_wb = WriteRxDataToFifoSync(1) & ~WriteRxDataToFifoSync(2)
val RxFifoReset = SyncRxStartFrm(1) & ~SyncRxStartFrm(2)
val rx_fifo = Module(new MacFifo(dw = 32, dp = 16))
val RxDataLatched2_rxclk = Wire(UInt(32.W))
@@ -1097,8 +1065,7 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
RxStatusIn := Cat(io.ReceivedPauseFrm, io.AddressMiss, RxOverrun, io.InvalidSymbol, io.DribbleNibble, io.ReceivedPacketTooBig, io.ShortFrame, io.LatchedCrcError, io.RxLateCollision)
val RxStatusIn = Cat(io.ReceivedPauseFrm, io.AddressMiss, RxOverrun, io.InvalidSymbol, io.DribbleNibble, io.ReceivedPacketTooBig, io.ShortFrame, io.LatchedCrcError, io.RxLateCollision)
// Rx overrun
@@ -1111,16 +1078,15 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
TxError := io.TxUnderRun | io.RetryLimit | io.LateCollLatched | io.CarrierSenseLost
// ShortFrame (RxStatusInLatched[2]) can not set an error because short frames are aborted when signal r_RecSmall is set to 0 in MODER register.
// AddressMiss is identifying that a frame was received because of the promiscous mode and is not an error
RxError := (RxStatusInLatched_rxclk(6,3).orR) | (RxStatusInLatched_rxclk(1,0).orR)
val RxError = (RxStatusInLatched_rxclk(6,3).orR) | (RxStatusInLatched_rxclk(1,0).orR)
// Latching and synchronizing RxStatusWrite signal. This signal is used for clearing the ReceivedPauseFrm signal
when(RxStatusWriteLatched_syncb2){
when(RxStatusWriteLatched_syncb){
RxStatusWriteLatched := false.B
} .elsewhen(RxStatusWrite){
RxStatusWriteLatched := true.B
@@ -1164,17 +1130,10 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
// Busy Interrupt
val Busy_IRQ_rck_rxclk = Wire(Bool())
val Busy_IRQ_sync1 = RegNext(Busy_IRQ_rck_rxclk)
val Busy_IRQ_sync2 = RegNext(Busy_IRQ_sync1)
val Busy_IRQ_sync3 = RegNext(Busy_IRQ_sync2)
val Busy_IRQ_syncb1 = RegNext(Busy_IRQ_sync2, false.B)
val Busy_IRQ_syncb2 = RegNext(Busy_IRQ_syncb1, false.B)
val Busy_IRQ_sync = ShiftRegisters(Busy_IRQ_rck_rxclk, 3)
io.Busy_IRQ := Busy_IRQ_sync2 & ~Busy_IRQ_sync3
io.Busy_IRQ := Busy_IRQ_sync(1) & ~Busy_IRQ_sync(2)
}
@@ -1208,9 +1167,10 @@ trait MacTileLinkTXClk{ this: MacTileLinkBase =>
val BlockingTxStatusWrite_sync1 = RegNext(BlockingTxStatusWrite, false.B)
val BlockingTxStatusWrite_sync2 = RegNext(BlockingTxStatusWrite_sync1, false.B); BlockingTxStatusWrite_sync2_txclk := BlockingTxStatusWrite_sync2
val BlockingTxStatusWrite_sync3 = RegNext(BlockingTxStatusWrite_sync2, false.B); BlockingTxStatusWrite_sync3_txclk := BlockingTxStatusWrite_sync3
// Synchronizing TxStartFrm_wb to MTxClk
val TxStartFrm_sync1 = RegNext( TxStartFrm_wb, false.B)
val TxStartFrm_sync2 = RegNext( TxStartFrm_sync1, false.B); TxStartFrm_sync2_txclk := TxStartFrm_sync2
val TxStartFrm_sync = ShiftRegister( TxStartFrm_wb, 2, false.B, true.B ); TxStartFrm_sync_txclk := TxStartFrm_sync
val TxStartFrm = RegInit(false.B); io.TxStartFrm := TxStartFrm
val TxEndFrm = RegInit(false.B); io.TxEndFrm := TxEndFrm
val TxData = RegInit(0.U(8.W)); io.TxData := TxData
@@ -1225,9 +1185,7 @@ trait MacTileLinkTXClk{ this: MacTileLinkBase =>
val TxRetry_q = RegNext( io.TxRetry, false.B)
val TxUsedData_q = RegNext( io.TxUsedData, false.B)
val ReadTxDataFromFifo_syncb1 = RegNext( ReadTxDataFromFifo_sync2, false.B)
val ReadTxDataFromFifo_syncb2 = RegNext( ReadTxDataFromFifo_syncb1, false.B)
val ReadTxDataFromFifo_syncb3 = RegNext( ReadTxDataFromFifo_syncb2, false.B)
val ReadTxDataFromFifo_syncb = ShiftRegisters(ReadTxDataFromFifo_sync(1), 3, false.B, true.B)
// Changes for tx occur every second clock. Flop is used for this manner.
when( io.TxDone | io.TxAbort | TxRetry_q){
@@ -1236,9 +1194,9 @@ trait MacTileLinkTXClk{ this: MacTileLinkBase =>
Flop := ~Flop
}
when(TxStartFrm_sync2){
when(TxStartFrm_sync){
TxStartFrm := true.B
} .elsewhen(TxUsedData_q | ~TxStartFrm_sync2 & (io.TxRetry & (~TxRetry_q) | io.TxAbort & (~TxAbort_q))){
} .elsewhen(TxUsedData_q | ~TxStartFrm_sync & (io.TxRetry & (~TxRetry_q) | io.TxAbort & (~TxAbort_q))){
TxStartFrm := false.B
}
@@ -1266,7 +1224,7 @@ trait MacTileLinkTXClk{ this: MacTileLinkBase =>
// Tx data selection (latching)
when( TxStartFrm_sync2 & ~TxStartFrm ){
when( TxStartFrm_sync & ~TxStartFrm ){
TxData := Mux1H(Seq(
( TxPointerLSB === 0.U ) -> TxData_wb(31,24),// Big Endian Byte Ordering
( TxPointerLSB === 1.U ) -> TxData_wb(23,16),// Big Endian Byte Ordering
@@ -1288,7 +1246,7 @@ trait MacTileLinkTXClk{ this: MacTileLinkBase =>
// Latching tx data
when(
TxStartFrm_sync2 & ~TxStartFrm |
TxStartFrm_sync & ~TxStartFrm |
io.TxUsedData & Flop & TxByteCnt === 3.U |
TxStartFrm & io.TxUsedData & Flop & TxByteCnt === 0.U){
TxDataLatched := TxData_wb
@@ -1328,10 +1286,10 @@ trait MacTileLinkTXClk{ this: MacTileLinkBase =>
TxByteCnt := TxByteCnt + 1.U
}
when(TxStartFrm_sync2 & ~TxStartFrm | io.TxUsedData & Flop & TxByteCnt === 3.U &
when(TxStartFrm_sync & ~TxStartFrm | io.TxUsedData & Flop & TxByteCnt === 3.U &
~LastWord | TxStartFrm & io.TxUsedData & Flop & TxByteCnt === 0.U ){
ReadTxDataFromFifo_tck := true.B
} .elsewhen(ReadTxDataFromFifo_syncb2 & ~ReadTxDataFromFifo_syncb3){
} .elsewhen(ReadTxDataFromFifo_syncb(1) & ~ReadTxDataFromFifo_syncb(2)){
ReadTxDataFromFifo_tck := false.B
}
@@ -1385,18 +1343,20 @@ trait MacTileLinkRXClk{ this: MacTileLinkBase =>
val LastByteIn = RegInit(false.B); LastByteIn_rxclk := LastByteIn
val ShiftWillEnd = RegInit(false.B); ShiftWillEnd_rxclk := ShiftWillEnd
val WriteRxDataToFifo = RegInit(false.B); WriteRxDataToFifo_rxclk := WriteRxDataToFifo
val LatchedRxLength = RegInit(0.U(16.W)); LatchedRxLength_rxclk := LatchedRxLength
val RxAbortLatched = RegInit(false.B); RxAbortLatched_rxclk := RxAbortLatched
val RxStatusInLatched = RegInit(0.U(9.W)); RxStatusInLatched_rxclk := RxStatusInLatched
val LatchedRxLength = RegEnable(io.RxLength, 0.U(16.W), io.LoadRxStatus); LatchedRxLength_rxclk := LatchedRxLength
val RxStatusInLatched = RegEnable(RxStatusIn, 0.U(9.W), io.LoadRxStatus); RxStatusInLatched_rxclk := RxStatusInLatched
val ShiftEnded_rck = RegInit(false.B); ShiftEnded_rck_txclk := ShiftEnded_rck
val ShiftEndedSync_c1 = RegNext( ShiftEndedSync2, false.B)
val ShiftEndedSync_c2 = RegNext( ShiftEndedSync_c1, false.B)
val RxAbortSyncb1 = RegNext( RxAbortSync2, false.B)
val RxAbortSyncb2 = RegNext( RxAbortSyncb1, false.B)
val ShiftEndedSync = ShiftRegisters(ShiftEndedSync2, 2, false.B, true.B)
val RxAbortSyncb = ShiftRegister( RxAbortSync(1), 2, false.B, true.B )
val RxEnableWindow = RegInit(false.B); RxEnableWindow_rxclk := RxEnableWindow
val LatchedRxStartFrm = RegInit(false.B); LatchedRxStartFrm_rxclk := LatchedRxStartFrm
val RxStatusWriteLatched_sync1 = RegNext(RxStatusWriteLatched, false.B)
val RxStatusWriteLatched_sync2 = RegNext(RxStatusWriteLatched_sync1, false.B); io.RxStatusWriteLatched_sync2 := RxStatusWriteLatched_sync2
val RxStatusWriteLatched_sync = ShiftRegister(RxStatusWriteLatched, 2, false.B, true.B); io.RxStatusWriteLatched_sync2 := RxStatusWriteLatched_sync
// Indicating that last byte is being reveived
when(ShiftWillEnd & RxByteCnt.andR | io.RxAbort){
@@ -1471,14 +1431,14 @@ trait MacTileLinkRXClk{ this: MacTileLinkBase =>
when(SetWriteRxDataToFifo & ~io.RxAbort){
WriteRxDataToFifo := true.B
} .elsewhen(WriteRxDataToFifoSync2 | io.RxAbort){
} .elsewhen(WriteRxDataToFifoSync(1) | io.RxAbort){
WriteRxDataToFifo := false.B
}
when(io.RxStartFrm & ~SyncRxStartFrm_q){
when(io.RxStartFrm & ~SyncRxStartFrm(1)){
LatchedRxStartFrm := true.B
} .elsewhen(SyncRxStartFrm_q){
} .elsewhen(SyncRxStartFrm(1)){
LatchedRxStartFrm := false.B
}
@@ -1486,7 +1446,7 @@ trait MacTileLinkRXClk{ this: MacTileLinkBase =>
// Generation of the end-of-frame signal
when(~io.RxAbort & SetWriteRxDataToFifo & StartShiftWillEnd){
ShiftEnded_rck := true.B
} .elsewhen(io.RxAbort | ShiftEndedSync_c1 & ShiftEndedSync_c2){
} .elsewhen(io.RxAbort | ShiftEndedSync(0) & ShiftEndedSync(1)){
ShiftEnded_rck := false.B
}
@@ -1498,34 +1458,28 @@ trait MacTileLinkRXClk{ this: MacTileLinkBase =>
}
when(RxAbortSyncb2){
when(RxAbortSyncb){
RxAbortLatched := false.B
} .elsewhen(io.RxAbort){
RxAbortLatched := true.B
}
when(io.LoadRxStatus){
LatchedRxLength := io.RxLength
}
when(io.LoadRxStatus){
RxStatusInLatched := RxStatusIn
}
val Busy_IRQ_rck = RegInit(false.B); Busy_IRQ_rck_rxclk := Busy_IRQ_rck
val Busy_IRQ_syncb = ShiftRegister( Busy_IRQ_sync(1), 2, false.B, true.B )
when(io.RxValid & io.RxStartFrm & ~RxReady){
Busy_IRQ_rck := true.B
} .elsewhen(Busy_IRQ_syncb2){
} .elsewhen(Busy_IRQ_syncb){
Busy_IRQ_rck := false.B
}
when(true.B){
Busy_IRQ_syncb1 := Busy_IRQ_sync2
Busy_IRQ_syncb2 := Busy_IRQ_syncb1
}
}
}