✎ 编 者 按
复合类型的初始化进阶使用方式
》关于复合类型的初始化
关于复合类型的初始化,在之前的文章《21世纪,别傻乎乎的再一次次手动赋初值了》中曾提到关于复合类型的初始化问题。在之前提到的文章里,对于日常使用init进行复合类型的初始化已经没有什么问题,而近来小伙伴遇到这么一个场景。考虑下面的复合类型使用场景:
import spinal.core._
import spinal.lib._
case class dataBus() extends Bundle with IMasterSlave{
val data0,data1=UInt(8 bits)
override def asMaster(): Unit = {
out(data0,data1)
}
}
case class bundleTest() extends Component{
val io=new Bundle{
val inPort=slave(dataBus())
val outPort=master(dataBus())
}
io.outPort:=Delay(io.inPort,3)
}
这里我们在dataBus复合类型中定义了data0,data1两个数据元素。在设计里将inPort打三拍输出给了outputPort
》函数中调用复合类型的初始化
像在上面的例子里,我们把整个复合类型作为Delay的参数,这里对于打拍的中间寄存器并没有进行赋初值,Delay的init参数默认为Null。那么如何使用init函数呢?
类似的场景还有很多。其实在文章《Mem初始化太复杂?》中曾提到过在Mem中的初始化场景,其实这里也是通用的,我们可以对dataBus增加一个initFrom函数,如此便可以在函数中初始化复合类型了:
import spinal.core._
import spinal.lib._
case class dataBus() extends Bundle with IMasterSlave{
val data0,data1=UInt(8 bits)
override def asMaster(): Unit = {
out(data0,data1)
}
def initFrom(data0:Int,data1:Int):this.type ={
this.data0:=data0
this.data1:=data1
this
}
}
case class bundleTest() extends Component{
val io=new Bundle{
val inPort=slave(dataBus())
val outPort=master(dataBus())
}
io.outPort:=Delay(
io.inPort,
3,
init = dataBus().initFrom(1,2)
)
}
object bundleTestApp extends App{
SpinalSystemVerilog(bundleTest())
}
生成的Verilog代码如我们所愿:
☆ END ☆
作者:玉骐
原文链接:Spinal FPGA
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注Spinal FPGA欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。