QSysify

QSysify is a tool which is able to generate a QSys IP (tcl script) from a SpinalHDL component by analyzing its IO definition. It currently implement the following interfaces features :

  • 主/从AvalonMM

  • 主/从APB3

  • 时钟域输入

  • 复位输出

  • 中断输入

  • 导线(作为最后手段使用)

示例

以UART控制器为例:

case class AvalonMMUartCtrl(...) extends Component {
  val io = new Bundle {
    val bus =  slave(AvalonMM(AvalonMMUartCtrl.getAvalonMMConfig))
    val uart = master(Uart())
  }

  // ...
}

下面的 main 将生成Verilog和QSys TCL脚本,其中io.bus将作为AvalonMM总线,io.uart作为导线:

object AvalonMMUartCtrl {
  def main(args: Array[String]) {
    // Generate the Verilog
    val toplevel = SpinalVerilog(AvalonMMUartCtrl(UartCtrlMemoryMappedConfig(...))).toplevel

    // Add some tags to the avalon bus to specify it's clock domain (information used by QSysify)
    toplevel.io.bus addTag(ClockDomainTag(toplevel.clockDomain))

    // Generate the QSys IP (tcl script)
    QSysify(toplevel)
  }
}

标签

由于QSys需要一些SpinalHDL硬件规范中未指定的信息,因此应在接口中添加一些标签:

AvalonMM / APB3

io.bus addTag(ClockDomainTag(busClockDomain))

中断输入

io.interrupt addTag(InterruptReceiverTag(relatedMemoryInterfacei, interruptClockDomain))

复位输出

io.resetOutput addTag(ResetEmitterTag(resetOutputClockDomain))

添加新的接口支持

基本上,QSysify工具可以使用接口 emitter 列表进行设置 (如您在此处看到的) <https://github.com/SpinalHDL/SpinalHDL/blob/764193013f84cfe4f82d7d1f1739c4561ef65860/lib/src/main/scala/spinal/lib/eda/altera/QSys.scala#L12>

您可以通过创建一个扩展 QSysifyInterfaceEmiter 的新类来创建自己的发射器(emitter)