12

十二 · 2022年09月06日 · 北京市

SpinalEnum四行仿真代码

✎ 编 者 按 

   SpinalEnum其实一直很少直接使用,前段时间做Avalon总线的仿真偶尔用到,初上手仿真还略微耽误了我几分钟,今天就SpinalEnum的仿真简单share下。

》关于SpinalEnum

   SpinalEnum说白了就是一个枚举类型,像SpinalHDL中所提供的fsm lib其状态的表示均采用的SpinalEnum。使用其好处是我们在查看波形时能够所见即所得,看到波形的状态,像下面的样子:

image.png

    而关于SpinalEnum在设计中的使用方式,在SpinalHDL Document中所提及到的已足够设计使用了。之前也曾分享过一篇SpinalEnum中的一些tips:
《Enum几个值得了解的Tips》。今天着重分享下在仿真中如何对SpinalEnum类型进行操作。为简单起见,我们这里的DUT采取如下逻辑:

import spinal.core._

object Num extends SpinalEnum{
val one,two,three,four=newElement()
}
case class EnumDemo() extends Component{
val io=new Bundle{
val dataIn=in(Num)
val dataOut=out(Num)
  }
  noIoPrefix()
  io.dataOut:=io.dataIn
}

》常用的四行仿真代码

   对于仿真而言,无非是数据激励的注入与信号的读取。而针对SpinalEnum,数据的注入与读取可以采用如下方式:

import spinal.core.sim._
object EnumDemoApp extends App{
SimConfig.withFstWave.compile(EnumDemo()).doSim{dut=>
    dut.io.dataIn#=Num.two
    sleep(10)
println(s"io.dataOut Value=${dut.io.dataOut.toEnum}")
println(s"io.dataOut Value=${dut.io.dataOut.toBigInt}")
println(dut.io.dataOut.toEnum==Num.two)
  }
}

   先看仿真结果:

image.png

   这里信号驱动与读取代码一共牵涉到四行。对于SpinalEnum的信号驱动(第4行),我们需用所声明的Num中具体的Element进行赋值。而在读取信号时(第6、7行),则可以采用toEnum/toBigInt两种方式进行。同时对于SpinalEnum信号的判断,则可以直接用Num中的Element进行对比判断(第8行)。

☆ END ☆

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

推荐阅读

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