opt
This commit is contained in:
@@ -4,6 +4,41 @@ import chisel3._
|
|||||||
import chisel3.util._
|
import chisel3.util._
|
||||||
|
|
||||||
|
|
||||||
|
class TxBuffDesc extends Bundle{
|
||||||
|
val len = UInt(16.W) //[31.16]
|
||||||
|
val rd = Bool() //[15]
|
||||||
|
val irq = Bool() //14
|
||||||
|
val wr = Bool() //13
|
||||||
|
val pad = Bool() //12
|
||||||
|
val crc = Bool() //11
|
||||||
|
val reserved1 = UInt(2.W) //10,9
|
||||||
|
val ur = Bool() //8
|
||||||
|
val rtry = UInt(4.W) //7 6 5 4
|
||||||
|
val rl = Bool() //3
|
||||||
|
val lc = Bool() //2
|
||||||
|
val df = Bool() //1
|
||||||
|
val cs = Bool() //0
|
||||||
|
}
|
||||||
|
|
||||||
|
class RxBuffDesc extends Bundle{
|
||||||
|
val len = UInt(16.W) //[31.16]
|
||||||
|
val e = Bool() //15
|
||||||
|
val irq = Bool() //14
|
||||||
|
val wrap = Bool() //13
|
||||||
|
val reserved1 = UInt(4.W) //12 11 10 9
|
||||||
|
val cf = Bool() //8
|
||||||
|
val m = Bool() //7
|
||||||
|
val or = Bool() //6
|
||||||
|
val is = Bool() //5
|
||||||
|
val dn = Bool() //4
|
||||||
|
val tl = Bool() //3
|
||||||
|
val sf = Bool() //2
|
||||||
|
val crc = Bool() //1
|
||||||
|
val lc = Bool() //0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MacTileLinkIO extends Bundle{
|
class MacTileLinkIO extends Bundle{
|
||||||
|
|
||||||
// WISHBONE common
|
// WISHBONE common
|
||||||
@@ -115,9 +150,7 @@ abstract class MacTileLinkBase extends Module{
|
|||||||
val TxStatus = RegInit(0.U(4.W)) //[14:11]
|
val TxStatus = RegInit(0.U(4.W)) //[14:11]
|
||||||
val RxStatus = RegInit(0.U(2.W)) //[14:13]
|
val RxStatus = RegInit(0.U(2.W)) //[14:13]
|
||||||
|
|
||||||
// Synchronizing TxRetry signal (synchronized to WISHBONE clock)
|
// Synchronizing TxRetry TxDone_wb TxAbort signal (synchronized to WISHBONE clock)
|
||||||
// Synchronized TxDone_wb signal (synchronized to WISHBONE clock)
|
|
||||||
// Synchronizing TxAbort signal (synchronized to WISHBONE clock)
|
|
||||||
val TxRetrySync1 = RegNext(io.TxRetry, false.B)
|
val TxRetrySync1 = RegNext(io.TxRetry, false.B)
|
||||||
val TxAbortSync1 = RegNext(io.TxAbort, false.B)
|
val TxAbortSync1 = RegNext(io.TxAbort, false.B)
|
||||||
val TxDoneSync1 = RegNext(io.TxDone, false.B)
|
val TxDoneSync1 = RegNext(io.TxDone, false.B)
|
||||||
@@ -211,6 +244,8 @@ abstract class MacTileLinkBase extends Module{
|
|||||||
val ram_addr = RegInit(0.U(8.W))
|
val ram_addr = RegInit(0.U(8.W))
|
||||||
val ram_di = RegInit(0.U(32.W))
|
val ram_di = RegInit(0.U(32.W))
|
||||||
val ram_do = Wire(UInt(32.W))
|
val ram_do = Wire(UInt(32.W))
|
||||||
|
val txBuffDesc = ram_do.asTypeOf(new TxBuffDesc)
|
||||||
|
val rxBuffDesc = ram_do.asTypeOf(new RxBuffDesc)
|
||||||
|
|
||||||
val StartTxPointerRead = Wire(Bool())
|
val StartTxPointerRead = Wire(Bool())
|
||||||
val TxPointerRead = RegInit(false.B)
|
val TxPointerRead = RegInit(false.B)
|
||||||
@@ -299,7 +334,6 @@ abstract class MacTileLinkBase extends Module{
|
|||||||
val LatchValidBytes_q = RegNext(LatchValidBytes, 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
|
||||||
// Synchronizing TxStartFrm_wb to MTxClk
|
|
||||||
val ReadTxDataFromFifo_tck_txclk = Wire(Bool())
|
val ReadTxDataFromFifo_tck_txclk = Wire(Bool())
|
||||||
val ReadTxDataFromFifo_sync1 = RegNext(ReadTxDataFromFifo_tck_txclk, false.B)
|
val ReadTxDataFromFifo_sync1 = RegNext(ReadTxDataFromFifo_tck_txclk, false.B)
|
||||||
val ReadTxDataFromFifo_sync2 = RegNext(ReadTxDataFromFifo_sync1, false.B)
|
val ReadTxDataFromFifo_sync2 = RegNext(ReadTxDataFromFifo_sync1, false.B)
|
||||||
@@ -462,7 +496,7 @@ abstract class MacTileLinkBase extends Module{
|
|||||||
|
|
||||||
// Latching READY status of the Tx buffer descriptor
|
// Latching READY status of the Tx buffer descriptor
|
||||||
when(TxEn & TxEn_q & TxBDRead){ // TxBDReady is sampled only once at the beginning.
|
when(TxEn & TxEn_q & TxBDRead){ // TxBDReady is sampled only once at the beginning.
|
||||||
TxBDReady := ram_do.extract(15) & (ram_do(31,16) > 4.U)
|
TxBDReady := txBuffDesc.rd & (txBuffDesc.len > 4.U)
|
||||||
} .elsewhen(ResetTxBDReady){ // Only packets larger then 4 bytes are transmitted.
|
} .elsewhen(ResetTxBDReady){ // Only packets larger then 4 bytes are transmitted.
|
||||||
TxBDReady := false.B
|
TxBDReady := false.B
|
||||||
}
|
}
|
||||||
@@ -518,7 +552,7 @@ abstract class MacTileLinkBase extends Module{
|
|||||||
// Data is avaliable one cycle after the access is started (at that time
|
// Data is avaliable one cycle after the access is started (at that time
|
||||||
// signal TxEn is not active)
|
// signal TxEn is not active)
|
||||||
when(TxEn & TxEn_q & TxBDRead){
|
when(TxEn & TxEn_q & TxBDRead){
|
||||||
TxStatus := ram_do(14,11)
|
TxStatus := Cat(txBuffDesc.irq, txBuffDesc.wr, txBuffDesc.pad, txBuffDesc.crc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -526,7 +560,7 @@ abstract class MacTileLinkBase extends Module{
|
|||||||
|
|
||||||
//Latching length from the buffer descriptor;
|
//Latching length from the buffer descriptor;
|
||||||
when(TxEn & TxEn_q & TxBDRead){
|
when(TxEn & TxEn_q & TxBDRead){
|
||||||
TxLength := ram_do(31,16)
|
TxLength := txBuffDesc.len
|
||||||
} .elsewhen(MasterWbTX & io.m_wb_ack_i){
|
} .elsewhen(MasterWbTX & io.m_wb_ack_i){
|
||||||
when(TxLengthLt4){
|
when(TxLengthLt4){
|
||||||
TxLength := 0.U
|
TxLength := 0.U
|
||||||
@@ -544,7 +578,7 @@ abstract class MacTileLinkBase extends Module{
|
|||||||
|
|
||||||
//Latching length from the buffer descriptor;
|
//Latching length from the buffer descriptor;
|
||||||
when(TxEn & TxEn_q & TxBDRead){
|
when(TxEn & TxEn_q & TxBDRead){
|
||||||
LatchedTxLength := ram_do(31,16)
|
LatchedTxLength := txBuffDesc.len
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -990,7 +1024,7 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
|
|||||||
when(RxPointerRead){
|
when(RxPointerRead){
|
||||||
RxBDReady := false.B
|
RxBDReady := false.B
|
||||||
} .elsewhen(RxEn & RxEn_q & RxBDRead){
|
} .elsewhen(RxEn & RxEn_q & RxBDRead){
|
||||||
RxBDReady := ram_do.extract(15)// RxBDReady is sampled only once at the beginning
|
RxBDReady := rxBuffDesc.e// RxBDReady is sampled only once at the beginning
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -998,7 +1032,7 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, ReadTxDataFromMemory_2, WriteRxDat
|
|||||||
// Data is avaliable one cycle after the access is started (at that time
|
// Data is avaliable one cycle after the access is started (at that time
|
||||||
// signal RxEn is not active)
|
// signal RxEn is not active)
|
||||||
when(RxEn & RxEn_q & RxBDRead){
|
when(RxEn & RxEn_q & RxBDRead){
|
||||||
RxStatus := ram_do(14,13)
|
RxStatus := Cat(rxBuffDesc.irq, rxBuffDesc.wrap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user