This commit is contained in:
RuigeLee
2023-06-30 16:00:02 +08:00
parent 546fea5903
commit d4ed6f39a0

View File

@@ -143,7 +143,6 @@ abstract class MacTileLinkBase extends Module{
val TxStatusWrite = Wire(Bool()) val TxStatusWrite = Wire(Bool())
val TxValidBytesLatched = RegInit(0.U(2.W))
val TxLength = RegInit(0.U(16.W)) val TxLength = RegInit(0.U(16.W))
val LatchedTxLength = RegInit(0.U(16.W)) val LatchedTxLength = RegInit(0.U(16.W))
@@ -151,19 +150,16 @@ abstract class MacTileLinkBase extends Module{
val RxStatus = RegInit(0.U(2.W)) //[14:13] val RxStatus = RegInit(0.U(2.W)) //[14:13]
// Synchronizing TxRetry TxDone_wb TxAbort signal (synchronized to WISHBONE clock) // Synchronizing TxRetry TxDone_wb TxAbort signal (synchronized to WISHBONE clock)
val TxRetrySync1 = RegNext(io.TxRetry, false.B)
val TxAbortSync1 = RegNext(io.TxAbort, false.B)
val TxDoneSync1 = RegNext(io.TxDone, false.B)
val TxStartFrm_wb = RegInit(false.B) val TxStartFrm_wb = RegInit(false.B)
val TxRetry_wb = RegNext(TxRetrySync1, false.B)
val TxAbort_wb = RegNext(TxAbortSync1, false.B)
val TxDone_wb = RegNext(TxDoneSync1, false.B)
// Generating delayed signals // Generating delayed signals
val TxDone_wb_q = RegNext(TxDone_wb, false.B)
val TxAbort_wb_q = RegNext(TxAbort_wb, false.B) val TxRetry_wb = ShiftRegisters( io.TxRetry, 3, false.B, true.B )
val TxRetry_wb_q = RegNext(TxRetry_wb, false.B) val TxAbort_wb = ShiftRegisters( io.TxAbort, 3, false.B, true.B )
val TxDone_wb = ShiftRegisters( io.TxDone, 3, false.B, true.B )
val TxRetryPacket = RegInit(false.B) val TxRetryPacket = RegInit(false.B)
val TxRetryPacket_NotCleared = RegInit(false.B) val TxRetryPacket_NotCleared = RegInit(false.B)
val TxDonePacket = RegInit(false.B) val TxDonePacket = RegInit(false.B)
@@ -206,16 +202,12 @@ abstract class MacTileLinkBase extends Module{
val StartRxBDRead = Wire(Bool()) val StartRxBDRead = Wire(Bool())
val TxIRQEn = Wire(Bool())
val WrapTxStatusBit = Wire(Bool())
val RxIRQEn = Wire(Bool())
val WrapRxStatusBit = Wire(Bool())
val TxValidBytes = Wire(UInt(2.W))
val TempTxBDAddress = Wire(UInt(7.W)) //[7:1]
val TempRxBDAddress = Wire(UInt(7.W)) //[7:1]
val RxStatusWrite = Wire(Bool()) val RxStatusWrite = Wire(Bool())
val RxBufferFull = Wire(Bool()) val RxBufferFull = Wire(Bool())
@@ -265,23 +257,22 @@ abstract class MacTileLinkBase extends Module{
val StartShiftWillEnd = Wire(Bool()) val StartShiftWillEnd = Wire(Bool())
val StartOccured = RegInit(false.B) val StartOccured = RegInit(false.B)
val TxStartFrm_syncb1 = RegInit(false.B) val TxStartFrm_sync2_txclk = Wire(Bool())
val TxStartFrm_syncb2 = RegInit(false.B) val TxStartFrm_syncb1 = RegNext(TxStartFrm_sync2_txclk, false.B)
val TxStartFrm_syncb2 = RegNext(TxStartFrm_syncb1, false.B)
val TxFifoClear = Wire(Bool()) val TxFifoClear = Wire(Bool())
val TxBufferAlmostFull = Wire(Bool()) val TxBufferAlmostFull = Wire(Bool())
val TxBufferFull = Wire(Bool()) val TxBufferFull = Wire(Bool())
val TxBufferEmpty = Wire(Bool()) val TxBufferEmpty = Wire(Bool())
val TxBufferAlmostEmpty = Wire(Bool()) val TxBufferAlmostEmpty = Wire(Bool())
val SetReadTxDataFromMemory = Wire(Bool())
val BlockReadTxDataFromMemory = RegInit(false.B) val BlockReadTxDataFromMemory = RegInit(false.B)
val tx_burst_en = RegInit(true.B) val tx_burst_en = RegInit(true.B)
val rx_burst_en = RegInit(false.B) val rx_burst_en = RegInit(false.B)
val tx_burst_cnt = RegInit(0.U(3.W)) val tx_burst_cnt = RegInit(0.U(3.W))
val ReadTxDataFromMemory_2 = Wire(Bool()) // val tx_burst = Wire(Bool())
val tx_burst = Wire(Bool())
val m_wb_cti_o = RegInit(0.U(3.W)); io.m_wb_cti_o := m_wb_cti_o // Cycle Type Identifier val m_wb_cti_o = RegInit(0.U(3.W)); io.m_wb_cti_o := m_wb_cti_o // Cycle Type Identifier
val TxData_wb = Wire(UInt(32.W)) val TxData_wb = Wire(UInt(32.W))
@@ -317,7 +308,6 @@ abstract class MacTileLinkBase extends Module{
val ResetTxBDReady = Wire(Bool())
val cyc_cleared = RegInit(false.B) val cyc_cleared = RegInit(false.B)
@@ -326,8 +316,7 @@ abstract class MacTileLinkBase extends Module{
val RxByteSel = Wire(UInt(4.W)) val RxByteSel = Wire(UInt(4.W))
val MasterAccessFinished = Wire(Bool()) val MasterAccessFinished = Wire(Bool())
val LatchValidBytes = RegInit(false.B)
val LatchValidBytes_q = RegNext(LatchValidBytes, false.B)
// Start: Generation of the ReadTxDataFromFifo_tck signal and synchronization to the WB_CLK_I // Start: Generation of the ReadTxDataFromFifo_tck signal and synchronization to the WB_CLK_I
val ReadTxDataFromFifo_tck_txclk = Wire(Bool()) val ReadTxDataFromFifo_tck_txclk = Wire(Bool())
@@ -485,9 +474,7 @@ abstract class MacTileLinkBase extends Module{
val ResetTxBDReady = TxDonePulse | TxAbortPulse | TxRetryPulse
ResetTxBDReady := TxDonePulse | TxAbortPulse | TxRetryPulse
// Latching READY status of the Tx buffer descriptor // Latching READY status of the Tx buffer descriptor
@@ -521,8 +508,8 @@ abstract class MacTileLinkBase extends Module{
TxStatusWrite := (TxDonePacket_NotCleared | TxAbortPacket_NotCleared) & TxEn & TxEn_q & ~BlockingTxStatusWrite TxStatusWrite := (TxDonePacket_NotCleared | TxAbortPacket_NotCleared) & TxEn & TxEn_q & ~BlockingTxStatusWrite
// Status writing must occur only once. Meanwhile it is blocked. // Status writing must occur only once. Meanwhile it is blocked.
when(~TxDone_wb & ~TxAbort_wb){ when(~TxDone_wb(1) & ~TxAbort_wb(1)){
BlockingTxStatusWrite := false.B BlockingTxStatusWrite := false.B
} .elsewhen(TxStatusWrite){ } .elsewhen(TxStatusWrite){
BlockingTxStatusWrite := true.B BlockingTxStatusWrite := true.B
@@ -544,9 +531,7 @@ abstract class MacTileLinkBase extends Module{
// Latching status from the tx buffer descriptor // 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)
// Data is avaliable one cycle after the access is started (at that time
// signal TxEn is not active)
when(TxEn & TxEn_q & TxBDRead){ when(TxEn & TxEn_q & TxBDRead){
TxStatus := Cat(txBuffDesc.irq, txBuffDesc.wr, txBuffDesc.pad, txBuffDesc.crc) TxStatus := Cat(txBuffDesc.irq, txBuffDesc.wr, txBuffDesc.pad, txBuffDesc.crc)
} }
@@ -604,20 +589,13 @@ abstract class MacTileLinkBase extends Module{
} }
SetReadTxDataFromMemory := TxEn & TxEn_q & TxPointerRead;
when( (TxLength === 0.U) | TxAbortPulse | TxRetryPulse){ when( (TxLength === 0.U) | TxAbortPulse | TxRetryPulse){
ReadTxDataFromMemory := false.B ReadTxDataFromMemory := false.B
} .elsewhen(SetReadTxDataFromMemory){ } .elsewhen(TxEn & TxEn_q & TxPointerRead){
ReadTxDataFromMemory := true.B ReadTxDataFromMemory := true.B
} }
val tx_burst = ReadTxDataFromMemory & ~BlockReadTxDataFromMemory & tx_burst_en
ReadTxDataFromMemory_2 := ReadTxDataFromMemory & ~BlockReadTxDataFromMemory
tx_burst := ReadTxDataFromMemory_2 & tx_burst_en
when((TxBufferAlmostFull | TxLength <= 4.U) & MasterWbTX & (~cyc_cleared) & (~(TxAbortPacket_NotCleared | TxRetryPacket_NotCleared))){ when((TxBufferAlmostFull | TxLength <= 4.U) & MasterWbTX & (~cyc_cleared) & (~(TxAbortPacket_NotCleared | TxRetryPacket_NotCleared))){
BlockReadTxDataFromMemory := true.B BlockReadTxDataFromMemory := true.B
@@ -631,7 +609,7 @@ abstract class MacTileLinkBase extends Module{
// Enabling master wishbone access to the memory for two devices TX and RX. // Enabling master wishbone access to the memory for two devices TX and RX.
val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDataToMemory, MasterAccessFinished, cyc_cleared, tx_burst, rx_burst) val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockReadTxDataFromMemory), WriteRxDataToMemory, MasterAccessFinished, cyc_cleared, tx_burst, rx_burst)
// Switching between two stages depends on enable signals // Switching between two stages depends on enable signals
@@ -781,7 +759,7 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
// Start: Generation of the TxStartFrm_wb which is then synchronized to the MTxClk // Start: Generation of the TxStartFrm_wb which is then synchronized to the MTxClk
when(TxBDReady & ~StartOccured & (TxBufferFull | TxLength === 0.U)){ when(TxBDReady & ~StartOccured & (TxBufferFull | TxLength === 0.U)){
TxStartFrm_wb := true.B TxStartFrm_wb := true.B
} .elsewhen(TxStartFrm_syncb2){ } .elsewhen(TxStartFrm_syncb2){
@@ -789,7 +767,7 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
} }
// StartOccured: TxStartFrm_wb occurs only ones at the beginning. Then it's blocked. // StartOccured: TxStartFrm_wb occurs only ones at the beginning. Then it's blocked.
when(TxStartFrm_wb){ when(TxStartFrm_wb){
StartOccured := true.B StartOccured := true.B
} .elsewhen(ResetTxBDReady){ } .elsewhen(ResetTxBDReady){
@@ -797,14 +775,6 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
} }
val TxStartFrm_sync2_txclk = Wire(Bool())
when(true.B){
TxStartFrm_syncb1 := TxStartFrm_sync2_txclk
TxStartFrm_syncb2 := TxStartFrm_syncb1
}
// TxEndFrm_wb: indicator of the end of frame // TxEndFrm_wb: indicator of the end of frame
when((TxLength === 0.U) & TxBufferAlmostEmpty & io.TxUsedData){ when((TxLength === 0.U) & TxBufferAlmostEmpty & io.TxUsedData){
TxEndFrm_wb := true.B TxEndFrm_wb := true.B
@@ -814,19 +784,15 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
// Marks which bytes are valid within the word. // Marks which bytes are valid within the word.
TxValidBytes := Mux(TxLength < 4.U, TxLength(1,0), 0.U) val TxValidBytes = Mux(TxLength < 4.U, TxLength(1,0), 0.U)
val TxValidBytesLatched = RegInit(0.U(2.W))
// val LatchValidBytes = RegNext((TxLength < 4.U) & TxBDReady, false.B)
// val LatchValidBytes_q = RegNext(LatchValidBytes, false.B)
when( (TxLength < 4.U) & TxBDReady){
LatchValidBytes := true.B
}.otherwise{
LatchValidBytes := false.B
}
val LatchValidBytes = ShiftRegisters((TxLength < 4.U) & TxBDReady, 2, false.B, true.B)
// Latching valid bytes // Latching valid bytes
when(LatchValidBytes & ~LatchValidBytes_q){ when(LatchValidBytes(0) & ~LatchValidBytes(1)){
TxValidBytesLatched := TxValidBytes TxValidBytesLatched := TxValidBytes
} .elsewhen(TxRetryPulse | TxDonePulse | TxAbortPulse){ } .elsewhen(TxRetryPulse | TxDonePulse | TxAbortPulse){
TxValidBytesLatched := 0.U TxValidBytesLatched := 0.U
@@ -834,22 +800,19 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
// dontTouch(TxStatus) // dontTouch(TxStatus)
TxIRQEn := TxStatus.extract(3) //[14:11] val TxIRQEn = TxStatus.extract(3) //[14:11]
WrapTxStatusBit := TxStatus.extract(2) val WrapTxStatusBit = TxStatus.extract(2)
io.PerPacketPad := TxStatus.extract(1) io.PerPacketPad := TxStatus.extract(1)
io.PerPacketCrcEn := TxStatus.extract(0) io.PerPacketCrcEn := TxStatus.extract(0)
RxIRQEn := RxStatus.extract(1) //[14:13] val RxIRQEn = RxStatus.extract(1) //[14:13]
WrapRxStatusBit := RxStatus.extract(0) val WrapRxStatusBit = RxStatus.extract(0)
// Temporary Tx and Rx buffer descriptor address // Temporary Tx and Rx buffer descriptor address//[7:1]
TempTxBDAddress := Fill(7, TxStatusWrite & ~WrapTxStatusBit) & (TxBDAddress + 1.U) // Tx BD increment or wrap (last BD) val TempTxBDAddress = Mux( TxStatusWrite & ~WrapTxStatusBit, (TxBDAddress + 1.U), 0.U ) // Tx BD increment or wrap (last BD)
val TempRxBDAddress = Mux( WrapRxStatusBit, io.r_TxBDNum(6,0), (RxBDAddress + 1.U) ) // Using first Rx BD / Using next Rx BD
TempRxBDAddress :=
( Fill(7, WrapRxStatusBit) & io.r_TxBDNum(6,0) ) | // Using first Rx BD
( Fill(7,~WrapRxStatusBit) & (RxBDAddress + 1.U)) // Using next Rx BD
// (increment address)
// Latching Tx buffer descriptor address // Latching Tx buffer descriptor address
when(io.r_TxEn & (~r_TxEn_q)){ when(io.r_TxEn & (~r_TxEn_q)){
@@ -874,9 +837,9 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
// Signals used for various purposes // Signals used for various purposes
TxRetryPulse := TxRetry_wb & ~TxRetry_wb_q TxRetryPulse := TxRetry_wb(1) & ~TxRetry_wb(2)
TxDonePulse := TxDone_wb & ~TxDone_wb_q TxDonePulse := TxDone_wb(1) & ~TxDone_wb(2)
TxAbortPulse := TxAbort_wb & ~TxAbort_wb_q TxAbortPulse := TxAbort_wb(1) & ~TxAbort_wb(2)
@@ -888,9 +851,9 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
val TxAbortPacketBlocked = RegInit(false.B) val TxAbortPacketBlocked = RegInit(false.B)
when(TxAbort_wb & (~tx_burst_en) & MasterWbTX & MasterAccessFinished & when(
(~TxAbortPacketBlocked) | TxAbort_wb & (~MasterWbTX) & TxAbort_wb(1) & (~TxAbortPacketBlocked) & MasterWbTX & (~tx_burst_en) & MasterAccessFinished |
(~TxAbortPacketBlocked)){ TxAbort_wb(1) & (~TxAbortPacketBlocked) & (~MasterWbTX) ){
TxAbortPacket := true.B TxAbortPacket := true.B
} .otherwise{ } .otherwise{
TxAbortPacket := false.B TxAbortPacket := false.B
@@ -899,13 +862,13 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
when(TxEn & TxEn_q & TxAbortPacket_NotCleared){ when(TxEn & TxEn_q & TxAbortPacket_NotCleared){
TxAbortPacket_NotCleared := false.B TxAbortPacket_NotCleared := false.B
} .elsewhen(TxAbort_wb & (~tx_burst_en) & MasterWbTX & MasterAccessFinished & } .elsewhen(
(~TxAbortPacketBlocked) | TxAbort_wb & (~MasterWbTX) & TxAbort_wb(1) & (~TxAbortPacketBlocked) & MasterWbTX & (~tx_burst_en) & MasterAccessFinished |
(~TxAbortPacketBlocked)){ TxAbort_wb(1) & (~TxAbortPacketBlocked) & (~MasterWbTX) ){
TxAbortPacket_NotCleared := true.B TxAbortPacket_NotCleared := true.B
} }
when(~TxAbort_wb & TxAbort_wb_q){ when(~TxAbort_wb(1) & TxAbort_wb(2)){
TxAbortPacketBlocked := false.B TxAbortPacketBlocked := false.B
} .elsewhen(TxAbortPacket){ } .elsewhen(TxAbortPacket){
TxAbortPacketBlocked := true.B TxAbortPacketBlocked := true.B
@@ -913,14 +876,11 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
val TxRetryPacketBlocked = RegInit(false.B) val TxRetryPacketBlocked = RegInit(false.B)
when( when(
TxRetry_wb & ~tx_burst_en & MasterWbTX & MasterAccessFinished & ~TxRetryPacketBlocked | TxRetry_wb(1) & ~TxRetryPacketBlocked & MasterWbTX & ~tx_burst_en & MasterAccessFinished |
TxRetry_wb & ~MasterWbTX & ~TxRetryPacketBlocked){ TxRetry_wb(1) & ~TxRetryPacketBlocked & ~MasterWbTX ){
TxRetryPacket := true.B TxRetryPacket := true.B
} .otherwise{ } .otherwise{
TxRetryPacket := false.B TxRetryPacket := false.B
@@ -933,13 +893,13 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
when(StartTxBDRead){ when(StartTxBDRead){
TxRetryPacket_NotCleared := false.B TxRetryPacket_NotCleared := false.B
} .elsewhen( } .elsewhen(
TxRetry_wb & ~tx_burst_en & MasterWbTX & MasterAccessFinished & ~TxRetryPacketBlocked | TxRetry_wb(1) & ~TxRetryPacketBlocked & MasterWbTX & ~tx_burst_en & MasterAccessFinished |
TxRetry_wb & ~MasterWbTX & ~TxRetryPacketBlocked){ TxRetry_wb(1) & ~TxRetryPacketBlocked & ~MasterWbTX ){
TxRetryPacket_NotCleared := true.B TxRetryPacket_NotCleared := true.B
} }
when(~TxRetry_wb & TxRetry_wb_q){ when(~TxRetry_wb(1) & TxRetry_wb(2)){
TxRetryPacketBlocked := false.B TxRetryPacketBlocked := false.B
} .elsewhen(TxRetryPacket){ } .elsewhen(TxRetryPacket){
TxRetryPacketBlocked := true.B TxRetryPacketBlocked := true.B
@@ -950,8 +910,8 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
val TxDonePacketBlocked = RegInit(false.B) val TxDonePacketBlocked = RegInit(false.B)
when( when(
TxDone_wb & ~tx_burst_en & MasterWbTX & MasterAccessFinished & ~TxDonePacketBlocked | TxDone_wb(1) & ~tx_burst_en & MasterWbTX & MasterAccessFinished & ~TxDonePacketBlocked |
TxDone_wb & ~MasterWbTX & ~TxDonePacketBlocked){ TxDone_wb(1) & ~MasterWbTX & ~TxDonePacketBlocked){
TxDonePacket := true.B TxDonePacket := true.B
}.otherwise{ }.otherwise{
TxDonePacket := false.B TxDonePacket := false.B
@@ -960,13 +920,13 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
when(TxEn & TxEn_q & TxDonePacket_NotCleared){ when(TxEn & TxEn_q & TxDonePacket_NotCleared){
TxDonePacket_NotCleared := false.B TxDonePacket_NotCleared := false.B
} .elsewhen( } .elsewhen(
TxDone_wb & ~tx_burst_en & MasterWbTX & MasterAccessFinished & (~TxDonePacketBlocked) | TxDone_wb(1) & ~tx_burst_en & MasterWbTX & MasterAccessFinished & (~TxDonePacketBlocked) |
TxDone_wb & ~MasterWbTX & (~TxDonePacketBlocked)){ TxDone_wb(1) & ~MasterWbTX & (~TxDonePacketBlocked)){
TxDonePacket_NotCleared := true.B TxDonePacket_NotCleared := true.B
} }
when(~TxDone_wb & TxDone_wb_q){ when(~TxDone_wb(1) & TxDone_wb(2)){
TxDonePacketBlocked := false.B TxDonePacketBlocked := false.B
} .elsewhen(TxDonePacket){ } .elsewhen(TxDonePacket){
TxDonePacketBlocked := true.B TxDonePacketBlocked := true.B