Axi4

AXI4是ARM定义的高带宽总线。

配置和实例化

首先,每当您想要创建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总线