Description

The Bundle is a composite type that defines a group of named signals (of any SpinalHDL basic type) under a single name.

The Bundle can be used to model data structures, buses and interfaces.

Declaration

The syntax to declare a bundle is as follows:

case class myBundle extends Bundle {
  val bundleItem0 = AnyType
  val bundleItem1 = AnyType
  val bundleItemN = AnyType
}

For example, an Color Bundle could be :

case class Color(channelWidth: Int) extends Bundle {
  val r,g,b = UInt(channelWidth bits)
}

You can find an APB3 definition example there

Operators

The following operators are available for the Bundle type

Comparison

Operator Description Return type
x === y Equality Bool
x =/= y Inequality Bool
val color1 = Color(8)
color1.r := 0 
color1.g := 0 
color1.b := 0

val color2 = Color(8)
color2.r := 0
color2.g := 0 
color2.b := 0


myBool := color1 === color2

Type cast

Operator Description Return
x.asBits Binary cast in Bits Bits(w(x) bits)
val color1 = Color(8)
val myBits := color1.asBits 

Elements direction

When you define an Bundle inside the IO definition of your component, you need to specify its direction.

in/out

If all elements of your bundle go in the same direction you can use in(MyBundle()) or out(MyBundle()).

For example :

val io = new Bundle{
  val input  = in (Color(8))
  val output = out(Color(8))
}

master/slave

If your interface obey to an master/slave topology, you can use the IMasterSlave trait. Then you have to implement the function def asMaster(): Unit to set the direction of each elements from an master perspective. Then you can use the master(MyBundle()) and slave(MyBundle()) syntax in the IO defintion.

For example :

case class HandShake(payloadWidth: Int) extends Bundle with IMasterSlave {
  val valid   = Bool
  val ready   = Bool
  val payload = Bits(payloadWidth bits)

  //You have to implement this asMaster function.
  //This function should set the direction of each signals from an master point of view
  override def asMaster(): Unit = {
    out(valid,payload)
    in(ready)
  }
}

val io = new Bundle{
  val input  = slave(HandShake(8))
  val output = master(HandShake(8))
}
Tags: