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 write is present.The advantage of this Axi4Shared variation is to use less area, especialy 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 |