1
0
rocket-chip/src/main/scala/amba/axi4/Bundles.scala
2017-10-12 00:05:45 -07:00

90 lines
3.2 KiB
Scala

// See LICENSE.SiFive for license details.
package freechips.rocketchip.amba.axi4
import Chisel._
import chisel3.util.Irrevocable
import freechips.rocketchip.util._
abstract class AXI4BundleBase(params: AXI4BundleParameters) extends GenericParameterizedBundle(params)
abstract class AXI4BundleA(params: AXI4BundleParameters) extends AXI4BundleBase(params)
{
val id = UInt(width = params.idBits)
val addr = UInt(width = params.addrBits)
val len = UInt(width = params.lenBits) // number of beats - 1
val size = UInt(width = params.sizeBits) // bytes in beat = 2^size
val burst = UInt(width = params.burstBits)
val lock = UInt(width = params.lockBits)
val cache = UInt(width = params.cacheBits)
val prot = UInt(width = params.protBits)
val qos = UInt(width = params.qosBits) // 0=no QoS, bigger = higher priority
val user = if (params.userBits > 0) Some(UInt(width = params.userBits)) else None
// val region = UInt(width = 4) // optional
// Number of bytes-1 in this operation
def bytes1(x:Int=0) = {
val maxShift = 1 << params.sizeBits
val tail = UInt((BigInt(1) << maxShift) - 1)
(Cat(len, tail) << size) >> maxShift
}
}
// A non-standard bundle that can be both AR and AW
class AXI4BundleARW(params: AXI4BundleParameters) extends AXI4BundleA(params)
{
val wen = Bool()
}
class AXI4BundleAW(params: AXI4BundleParameters) extends AXI4BundleA(params)
class AXI4BundleAR(params: AXI4BundleParameters) extends AXI4BundleA(params)
class AXI4BundleW(params: AXI4BundleParameters) extends AXI4BundleBase(params)
{
// id ... removed in AXI4
val data = UInt(width = params.dataBits)
val strb = UInt(width = params.dataBits/8)
val last = Bool()
}
class AXI4BundleR(params: AXI4BundleParameters) extends AXI4BundleBase(params)
{
val id = UInt(width = params.idBits)
val data = UInt(width = params.dataBits)
val resp = UInt(width = params.respBits)
val user = if (params.userBits > 0) Some(UInt(width = params.userBits)) else None
val last = Bool()
}
class AXI4BundleB(params: AXI4BundleParameters) extends AXI4BundleBase(params)
{
val id = UInt(width = params.idBits)
val resp = UInt(width = params.respBits)
val user = if (params.userBits > 0) Some(UInt(width = params.userBits)) else None
}
class AXI4Bundle(params: AXI4BundleParameters) extends AXI4BundleBase(params)
{
val aw = Irrevocable(new AXI4BundleAW(params))
val w = Irrevocable(new AXI4BundleW (params))
val b = Irrevocable(new AXI4BundleB (params)).flip
val ar = Irrevocable(new AXI4BundleAR(params))
val r = Irrevocable(new AXI4BundleR (params)).flip
}
object AXI4Bundle
{
def apply(params: AXI4BundleParameters) = new AXI4Bundle(params)
}
class AXI4AsyncBundleBase(params: AXI4AsyncBundleParameters) extends GenericParameterizedBundle(params)
class AXI4AsyncBundle(params: AXI4AsyncBundleParameters) extends AXI4AsyncBundleBase(params)
{
val aw = new AsyncBundle(params.depth, new AXI4BundleAW(params.base))
val w = new AsyncBundle(params.depth, new AXI4BundleW (params.base))
val b = new AsyncBundle(params.depth, new AXI4BundleB (params.base)).flip
val ar = new AsyncBundle(params.depth, new AXI4BundleAR(params.base))
val r = new AsyncBundle(params.depth, new AXI4BundleR (params.base)).flip
}