QSysify
Introduction
QSysify is a tool which is able to generate a QSys IP (tcl script) from a SpinalHDL component by analysing its IO definition. It currently implement the following interfaces features :
Master/Slave AvalonMM
Master/Slave APB3
Clock domain input
Reset output
Interrupt input
Conduit (Used in last resort)
Example
In the case of a UART controller :
case class AvalonMMUartCtrl(...) extends Component{
val io = new Bundle{
val bus = slave(AvalonMM(AvalonMMUartCtrl.getAvalonMMConfig))
val uart = master(Uart())
}
//...
}
The following main
will generate the Verilog and the QSys TCL script with io.bus as an AvalonMM and io.uart as a conduit :
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)
}
}
Adding new interface support
Basically, the QSysify tool can be setup with a list of interface emitter
(as you can see here)
You can create your own emitter by creating a new class extending QSysifyInterfaceEmiter