tilelink should not add here

This commit is contained in:
RuigeLee
2023-07-03 16:25:41 +08:00
parent af85113160
commit 38bcf0dcf0

View File

@@ -3,6 +3,9 @@ package MAC
import chisel3._ import chisel3._
import chisel3.util._ import chisel3.util._
import freechips.rocketchip.tilelink._
import freechips.rocketchip.diplomacy._
class TxBuffDesc extends Bundle{ class TxBuffDesc extends Bundle{
val len = UInt(16.W) //[31.16] val len = UInt(16.W) //[31.16]
@@ -41,12 +44,15 @@ class RxBuffDesc extends Bundle{
abstract class MacTileLinkBase(edge: TLEdgeIn) extends Module{
trait MacTileLinkSlaveIO { this: Bundle =>
val slvA = Flipped(Decoupled(new TLBundleA(edge.bundle)))
val slvD = Decoupled(new TLBundleD(edge.bundle))
}
class MacTileLinkIO extends Bundle{ trait MacWishboneSlaveIO{ this: Bundle =>
// WISHBONE common // WISHBONE common
val WB_DAT_I = Input(UInt(32.W)) // WISHBONE data input val WB_DAT_I = Input(UInt(32.W)) // WISHBONE data input
val WB_DAT_O = Output(UInt(32.W)) // WISHBONE data output val WB_DAT_O = Output(UInt(32.W)) // WISHBONE data output
// WISHBONE slave // WISHBONE slave
@@ -59,6 +65,9 @@ class MacTileLinkIO extends Bundle{
val WB_ACK_O = Output(Bool()) // WISHBONE acknowledge output val WB_ACK_O = Output(Bool()) // WISHBONE acknowledge output
val WB_ERR_O = Output(Bool()) // WISHBONE error output val WB_ERR_O = Output(Bool()) // WISHBONE error output
}
class MacTileLinkIO extends Bundle{
// WISHBONE master // WISHBONE master
val m_wb_adr_o = Output(UInt(30.W)) val m_wb_adr_o = Output(UInt(30.W))
@@ -132,11 +141,15 @@ class MacTileLinkIO extends Bundle{
val RxB_IRQ = Output(Bool()) val RxB_IRQ = Output(Bool())
val RxE_IRQ = Output(Bool()) val RxE_IRQ = Output(Bool())
val Busy_IRQ = Output(Bool()) val Busy_IRQ = Output(Bool())
} }
def isTileLink = false.B
val io: MacTileLinkIO = if( !isTileLink ) {IO(new MacTileLinkIO with MacWishboneSlaveIO)} else {IO(new MacTileLinkIO with MacTileLinkSlaveIO)}
abstract class MacTileLinkBase extends Module{
val io: MacTileLinkIO = IO(new MacTileLinkIO)
val BDCs = Wire(UInt(4.W)) val BDCs = Wire(UInt(4.W))
@@ -408,34 +421,34 @@ abstract class MacTileLinkBase extends Module{
WbEn := true.B // RxEn access stage and r_TxEn is disabled WbEn := true.B // RxEn access stage and r_TxEn is disabled
RxEn := false.B RxEn := false.B
TxEn := false.B TxEn := false.B
ram_addr := io.WB_ADR_I(7,0) // [11:2 ] -> [9:2]; ram_addr := (if( !isTileLink ) {io.WB_ADR_I(7,0)} else {io.slvA.bits.address(9:2)}) // [11:2 ] -> [9:2];
ram_di := io.WB_DAT_I; ram_di := (if( !isTileLink ) {io.WB_DAT_I} else { io.slvA.bits.data })
BDWrite := BDCs & Fill(4,io.WB_WE_I) BDWrite := (if( !isTileLink ) {BDCs & Fill(4,io.WB_WE_I)} else {BDCs & Fill(4,(io.slvA.bits.opcode === 0.U) || (io.slvA.bits.opcode === 1.U))} )
BDRead := BDCs.orR & ~io.WB_WE_I BDRead := (if( !isTileLink ) {BDCs.orR & ~io.WB_WE_I} else {BDCs.orR & (io.slvA.bits.opcode === 4.U)})
} .elsewhen( RAMAccessEnable === BitPat("b010?1") ){ } .elsewhen( RAMAccessEnable === BitPat("b010?1") ){
WbEn := false.B WbEn := false.B
RxEn := false.B RxEn := false.B
TxEn := true.B // RxEn access stage and r_TxEn is enabled TxEn := true.B // RxEn access stage and r_TxEn is enabled
ram_addr := Cat(TxBDAddress, TxPointerRead) ram_addr := Cat(TxBDAddress, TxPointerRead)
ram_di := TxBDDataIn; ram_di := TxBDDataIn
} .elsewhen( RAMAccessEnable === BitPat("b001??") ){ } .elsewhen( RAMAccessEnable === BitPat("b001??") ){
WbEn := true.B // TxEn access stage (we always go to wb access stage) WbEn := true.B // TxEn access stage (we always go to wb access stage)
RxEn := false.B RxEn := false.B
TxEn := false.B TxEn := false.B
ram_addr := io.WB_ADR_I(7,0) //[11:2 ] ->[9:2] ram_addr := (if( !isTileLink ) {io.WB_ADR_I(7,0)} else {io.slvA.bits.address(9:2)}) //[11:2 ] ->[9:2]
ram_di := io.WB_DAT_I ram_di := (if( !isTileLink ) {io.WB_DAT_I} else { io.slvA.bits.data })
BDWrite := BDCs & Fill(4,io.WB_WE_I) BDWrite := (if( !isTileLink ) {BDCs & Fill(4,io.WB_WE_I)} else {BDCs & Fill(4,(io.slvA.bits.opcode === 0.U) || (io.slvA.bits.opcode === 1.U))} )
BDRead := BDCs.orR & ~io.WB_WE_I BDRead := (if( !isTileLink ) {BDCs.orR & ~io.WB_WE_I} else {BDCs.orR & (io.slvA.bits.opcode === 4.U)})
} .elsewhen( RAMAccessEnable === BitPat("b10000") ){ } .elsewhen( RAMAccessEnable === BitPat("b10000") ){
WbEn := false.B // WbEn access stage and there is no need for other stages. WbEn needs to be switched off for a bit WbEn := false.B // WbEn access stage and there is no need for other stages. WbEn needs to be switched off for a bit
} .elsewhen( RAMAccessEnable === BitPat("b00000") ){ } .elsewhen( RAMAccessEnable === BitPat("b00000") ){
WbEn := true.B // Idle state. We go to WbEn access stage. WbEn := true.B // Idle state. We go to WbEn access stage.
RxEn := false.B RxEn := false.B
TxEn := false.B TxEn := false.B
ram_addr := io.WB_ADR_I(7,0) // [11:2 ] -> [9:2] ram_addr := (if( !isTileLink ) {io.WB_ADR_I(7,0)} else {io.slvA.bits.address(9:2)}) // [11:2 ] -> [9:2]
ram_di := io.WB_DAT_I ram_di := (if( !isTileLink ) {io.WB_DAT_I} else { io.slvA.bits.data })
BDWrite := BDCs & Fill(4,io.WB_WE_I) BDWrite := (if( !isTileLink ) {BDCs & Fill(4,io.WB_WE_I)} else {BDCs & Fill(4,(io.slvA.bits.opcode === 0.U) || (io.slvA.bits.opcode === 1.U))} )
BDRead := BDCs.orR & ~io.WB_WE_I BDRead := (if( !isTileLink ) {BDCs.orR & ~io.WB_WE_I} else {BDCs.orR & (io.slvA.bits.opcode === 4.U)})
} }
@@ -737,7 +750,7 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
TxFifoClear := (TxAbortPacket | TxRetryPacket) TxFifoClear := (TxAbortPacket | TxRetryPacket)
val tx_fifo = Module( new MacFifo(dw = 32, dp = 16) ) val tx_fifo = Module( new MacFifo(dw = 32, dp = 16) )
tx_fifo.io.data_in := io.m_wb_dat_i tx_fifo.io.data_in := (if( !isTileLink ) {io.WB_DAT_I} else { io.slvA.bits.data })
tx_fifo.io.write := MasterWbTX & io.m_wb_ack_i tx_fifo.io.write := MasterWbTX & io.m_wb_ack_i
tx_fifo.io.read := ReadTxDataFromFifo_wb & ~TxBufferEmpty tx_fifo.io.read := ReadTxDataFromFifo_wb & ~TxBufferEmpty
tx_fifo.io.clear := TxFifoClear tx_fifo.io.clear := TxFifoClear
@@ -1148,20 +1161,37 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
// val WB_ERR_O = Output(Bool()) // WISHBONE error output // Connected to registers
// val WB_SEL_I = Input(UInt(4.W)) // WISHBONE byte select input val CsMiss = Wire(Bool())
// val WB_CYC_I = Input(Bool()) // WISHBONE cycle input
// val WB_STB_I = Input(Bool()) // WISHBONE strobe input
// Connected to registers if( !isTileLink ){
io.RegCs := Fill(4, io.WB_STB_I & io.WB_CYC_I & io.WB_SEL_I.orR & ~io.WB_ADR_I.extract(9) & ~io.WB_ADR_I.extract(8)) & io.WB_SEL_I // 0x0 - 0x3FF io.RegCs := Fill(4, io.WB_STB_I & io.WB_CYC_I & io.WB_SEL_I.orR & ~io.WB_ADR_I.extract(9) & ~io.WB_ADR_I.extract(8)) & io.WB_SEL_I // 0x0 - 0x3FF
BDCs := Fill(4, io.WB_STB_I & io.WB_CYC_I & io.WB_SEL_I.orR & ~io.WB_ADR_I.extract(9) & io.WB_ADR_I.extract(8)) & io.WB_SEL_I // 0x400 - 0x7FF BDCs := Fill(4, io.WB_STB_I & io.WB_CYC_I & io.WB_SEL_I.orR & ~io.WB_ADR_I.extract(9) & io.WB_ADR_I.extract(8)) & io.WB_SEL_I // 0x400 - 0x7FF
val CsMiss = io.WB_STB_I & io.WB_CYC_I & io.WB_SEL_I.orR & io.WB_ADR_I.extract(9) // 0x800 - 0xfFF // When access to the address between 0x800 and 0xfff occurs, acknowledge is set but data is not valid. CsMiss := io.WB_STB_I & io.WB_CYC_I & io.WB_SEL_I.orR & io.WB_ADR_I.extract(9) // 0x800 - 0xfFF // When access to the address between 0x800 and 0xfff occurs, acknowledge is set but data is not valid.
io.WB_ACK_O := RegNext((io.RegCs.orR | BDAck) & ~io.WB_ACK_O, false.B)
io.WB_DAT_O := RegNext(Mux( ((io.RegCs.orR) & ~io.WB_WE_I), io.RegDataOut, BD_WB_DAT_O ), 0.U(32.W)) io.WB_DAT_O := RegNext(Mux( ((io.RegCs.orR) & ~io.WB_WE_I), io.RegDataOut, BD_WB_DAT_O ), 0.U(32.W))
io.WB_ACK_O := RegNext((io.RegCs.orR | BDAck) & ~io.WB_ACK_O, false.B)
} else {
io.RegCs := Fill(4, io.slvA.fire & io.slvA.bits.mask.orR & ~io.slvA.bits.address(11) & ~io.slvA.bits.address(10)) & io.slvA.bits.mask // 0x0 - 0x3FF
BDCs := Fill(4, io.slvA.fire & io.slvA.bits.mask.orR & ~io.slvA.bits.address(11) & io.slvA.bits.address(10)) & io.slvA.bits.mask // 0x400 - 0x7FF
CsMiss := io.slvA.fire & io.slvA.bits.mask.orR & io.slvA.bits.address(11) // 0x800 - 0xfFF // When access to the address between 0x800 and 0xfff occurs, acknowledge is set but data is not valid.
io.WB_DAT_O := RegNext(Mux( ((io.RegCs.orR) & (io.slvA.bits.opcode === 4.U)), io.RegDataOut, BD_WB_DAT_O ), 0.U(32.W))
val slvAInfo = RegEnable( io.slvA.bits, io.slvA.fire )
val slvDValid = RegInit(false.B); io.slvD.valid := slvDValid
when( io.slvD.fire ){
slvDValid := false.B
} .elsewhen(io.RegCs.orR | BDAck){
slvDValid := true.B
}
io.slvD.bits :=
}
io.WB_ERR_O := RegNext(io.WB_STB_I & io.WB_CYC_I & (~(io.WB_SEL_I.orR) | CsMiss) & ~io.WB_ERR_O, false.B) io.WB_ERR_O := RegNext(io.WB_STB_I & io.WB_CYC_I & (~(io.WB_SEL_I.orR) | CsMiss) & ~io.WB_ERR_O, false.B)
} }
@@ -1182,9 +1212,6 @@ val masterStage = Cat(MasterWbTX, MasterWbRX, (ReadTxDataFromMemory & ~BlockRead
trait MacTileLinkTXClk{ this: MacTileLinkBase => trait MacTileLinkTXClk{ this: MacTileLinkBase =>