十二 · 2022年09月09日

复合类型初始化进阶

✎ 编 者 按 

    复合类型的初始化进阶使用方式

》关于复合类型的初始化

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

image.png

☆ END ☆

作者:玉骐
原文链接:Spinal FPGA
微信公众号:
 title=

推荐阅读

更多SpinalHDL技术干货请关注Spinal FPGA欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
1581
内容数
133
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息