【问题标题】:how to suggest name inside bundle in chisel3.2?如何在 chisel3.2 中的 bundle 内建议名称?
【发布时间】:2020-02-06 10:48:46
【问题描述】:

例如,我正在为 IO() 使用建议名称 API

class TestModule extends MultiIOModule{
  val AXI = IO(new AXIWriteIO(32,32,4)).suggestName("axi")
  val S_AXI = IO(Flipped(new AXIWriteIO(32,32,4)))

  AXI.AW.suggestName("aw")
  AXI <> S_AXI
}

它适用于“axi”部分,但不适用于“aw”部分。

SuggestName 在包定义类中也不起作用:

class AXIAddress(val addrWidthBits: Int, val idBits: Int) extends Bundle {
  val id      = UInt(idBits.W).suggestName("ID")
  //...
}

有什么想法吗?

凿子版本是3.2.0

【问题讨论】:

  • 实际上我要做的是删除 Decoupled IO 的 _bits 部分。

标签: chisel


【解决方案1】:

I chisel3 无法在Bundles 中使用suggestName。发出到 FIRRTL 中的名称是凿变量名称。为了正确命名外部端口,同时仍然能够在内部使用嵌套包来表示 AXI 接口,我做了如下操作:

class AXIAddress extends Bundle {
  val addr = UInt(32.W)
  val size = UInt(4.W)
  val len = UInt(2.W)

}

class AXIMasterIF extends Bundle {
  val readAddr =  Decoupled(new AXIAddress)
  val writeAddr = Decoupled(new AXIAddress)
}
object AXIMasterIF {
  def apply(): AXIMasterIF = {
    val axi = Wire(new AXIMasterIF)
    axi
  }
}

class AXIExternalIF extends Bundle {
  val AWADDR = Output(UInt(32.W))
  val AWVALID = Output(Bool())
  val AWREADY = Input(Bool())
  val AWSIZE = Output(UInt(4.W))
  val AWLEN = Output(UInt(2.W))

  val ARADDR = Output(UInt(32.W))
  val ARVALID = Output(Bool())
  val ARREADY = Input(Bool())
  val ARSIZE = Output(UInt(4.W))
  val ARLEN = Output(UInt(2.W))

  def connect(int: AXIMasterIF): Unit = {

    this.AWADDR := int.writeAddr.bits.addr
    this.AWVALID := int.writeAddr.valid
    int.writeAddr.ready := this.AWREADY
    this.AWSIZE  := int.writeAddr.bits.size
    this.AWLEN   := int.writeAddr.bits.len
    this.ARADDR  := int.readAddr.bits.addr
    this.ARVALID := int.readAddr.valid
    int.readAddr.ready := this.ARREADY
    this.ARSIZE  := int.readAddr.bits.size
    this.ARLEN   := int.readAddr.bits.len

  }
}

class TopWrapper extends MultiIOModule {
  // First instantive the "internal", nested, representation of the AXI Slave interface
  val axiInt = AXIMasterIF()

  // Then instantiate the external, correctly named, AXI Slave interace that we can connect in Vivado
  val axiExt = IO(new AXIExternalIF).suggestName("MM_AXI_0")

  // Make connections
  axiExt.connect(axiInt)
}

AXIExternalIF 是向系统其余部分公开的。它必须在您设计的顶层模块中。使用 AXIAddres 的 AXIMasterIF 连接到该接口,并在内部用于将事物连接到 AXI 接口。

如果您想使用它并查看发出的 verilog,您可以在 Scastie 进行操作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2019-04-04
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多