Axi4
AXI4是ARM定义的高带宽总线。
Configuration and instantiation
首先,每当您想要创建AXI4总线时,您都需要一个配置对象。该配置对象是一个 Axi4Config 并具有以下参数:
注意:useXXX用于指定总线是否存在XXX信号。
| 参数名称 | 类型 | 默认值 | 
|---|---|---|
| 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 | 
简而言之,AXI4总线在SpinalHDL库中定义方式如下:
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)
  }
}
这是一个简单的使用示例:
val axiConfig = Axi4Config(
  addressWidth = 32,
  dataWidth    = 32,
  idWidth      = 4
)
val axiX = Axi4(axiConfig)
val axiY = Axi4(axiConfig)
when(axiY.aw.valid) {
  // ...
}
变体
Axi4总线还有其他3种变体:
| 类型 | 描述 | 
|---|---|
| Axi4ReadOnly | 只存在AR和R通道 | 
| Axi4WriteOnly | 只存在AW、W和B通道 | 
| Axi4Shared | 此变体是该库的首创。 它使用4个通道,W、B、R,还有一个新通道,称为AWR。 AWR通道可用于传输AR和AW事务。为了分离它们,需要一个  write信号。这种Axi4Shared变体的优点是使用更少的面积,特别是在互连方面。 | 
函数和运算符
| 名称 | 返回类型 | 描述 | 
|---|---|---|
| X >> Y | 将X连接到Y。能够像AXI4规范中指定的那样推断默认值,并以安全的方式调整一些位宽。 | |
| X << Y | 执行>>运算符相反的操作 | |
| X.toWriteOnly | Axi4WriteOnly | 返回由X驱动的Axi4WriteOnly总线 | 
| X.toReadOnly | Axi4ReadOnly | 返回由X驱动的Axi4ReadOnly总线 |