》关于复合类型的初始化
关于复合类型的初始化,在之前的文章《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代码如我们所愿:
原作者:玉骐
|