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))
}