Axi4
Introduction
The AXI4 is a high bandwidth bus defined by ARM.
Configuration and instanciation
First each time you want to create a AXI4 bus, you will need a configuration object. This configuration object is an Axi4Config and has following arguments :
Note : useXXX specify if the bus has XXX signal present.
| Parameter name | Type | Default | 
|---|---|---|
| addressWidth | Int | |
| dataWidth | Int | |
| idWidth | Int | |
| userWidth | Int | |
| useId | Boolean | true | 
| useRegion | Boolean | true | 
| useBurst | Boolean | true | 
| useLock | Boolean | true | 
| useCache | Boolean | true | 
| useSize | Boolean | true | 
| useQos | Boolean | true | 
| useLen | Boolean | true | 
| useLast | Boolean | true | 
| useResp | Boolean | true | 
| useProt | Boolean | true | 
| useStrb | Boolean | true | 
| useUser | Boolean | false | 
There is in short how the AXI4 bus is defined in the SpinalHDL library :
case class Axi4(config: Axi4Config) extends Bundle with IMasterSlave{
  val aw = Stream(Axi4Aw(config))
  val w  = Stream(Axi4W(config))
  val b  = Stream(Axi4B(config))
  val ar = Stream(Axi4Ar(config))
  val r  = Stream(Axi4R(config))
  override def asMaster(): Unit = {
    master(ar,aw,w)
    slave(r,b)
  }
}
There is a short example of usage :
val axiConfig = Axi4Config(
  addressWidth = 32,
  dataWidth    = 32,
  idWidth      = 4
)
val axiX = Axi4(axiConfig)
val axiY = Axi4(axiConfig)
when(axiY.aw.valid){
  //...
}
Variations
There is 3 other variation of the Axi4 bus :
| Type | Description | 
|---|---|
| Axi4ReadOnly | Only AR and R channels are present | 
| Axi4WriteOnly | Only AW, W and B channels are present | 
| Axi4Shared | This variation is a library initiative. It use 4 channels, W, B ,R and also a new one which is named AWR. The AWR channel can be used to transmit AR and AW transactions. To dissociate them, a signal  writeis present.The advantage of this Axi4Shared variation is to use less area, especially in the interconnect. | 
Functions and operators
| Name | Return | Description | 
|---|---|---|
| X >> Y | Connect X to Y. Able infer default values as specified in the AXI4 specification, and also to adapt some width in a safe manner. | |
| X << Y | Do the reverse of the >> operator | |
| X.toWriteOnly | Axi4WriteOnly | Return an Axi4WriteOnly bus drive by X | 
| X.toReadOnly | Axi4ReadOnly | Return an Axi4ReadOnly bus drive by X |