✎ 编 者 按
SpinalEnum其实一直很少直接使用,前段时间做Avalon总线的仿真偶尔用到,初上手仿真还略微耽误了我几分钟,今天就SpinalEnum的仿真简单share下。
》关于SpinalEnum
SpinalEnum说白了就是一个枚举类型,像SpinalHDL中所提供的fsm lib其状态的表示均采用的SpinalEnum。使用其好处是我们在查看波形时能够所见即所得,看到波形的状态,像下面的样子:
而关于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)
}
}
先看仿真结果:
这里信号驱动与读取代码一共牵涉到四行。对于SpinalEnum的信号驱动(第4行),我们需用所声明的Num中具体的Element进行赋值。而在读取信号时(第6、7行),则可以采用toEnum/toBigInt两种方式进行。同时对于SpinalEnum信号的判断,则可以直接用Num中的Element进行对比判断(第8行)。
☆ END ☆
作者:玉骐
原文链接:Spinal FPGA
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注Spinal FPGA欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。