本文用三分钟时间告诉你如何获取StateMachine中的当前状态用作设计中的DFX。
StateMachine中的currentState
关于SpinalHDL中StateMachine的使用,之前已有过介绍:兄弟,要几段?
SpinalHDL中的StateMachine设计思路让我个人觉得耳目一新,写出来的代码如同伪代码般令人读着如同一种享受。然而在有些设计里会有要求是能够通过HPI实时获取状态机当前的状态用于监控,然而如何在SpinalHDL中获取当前的state来做DFX难倒了不少人。
本篇以下面这个简单的example为例:
这里的example很简单,io.result只在stateB状态的最后一个cycle才会为高电平。至于语法,就不过多讲解了,简洁明了~
获取currentState
如果你去看过SpinalHDL中StateMachine,那么你会发现其实现里通过stateReg来标记当前状态,而这里通过addPrePopTask中将其赋值到io.currentState中去。
之所以要将赋值放置在addPrePopTask中而不是直接进行赋值,主要原因在于当我们使用StateMachine时其真正映射成电路是通过下面的代码来实现的:
Component.current.addPrePopTask(() => {
if(parentStateMachine == null)
build()
}
而stateReg的真正映射为Reg是在build函数中实现的,因而对于stateReg中的获取赋值给其他电路对象也就只能在addPrePopTask中去执行,故而我们的赋值也就只能在addPrePopTask中去实现(该任务是写在声明StateMachine之后,故而在PrpPopTask执行阶段会先执行StateMachine的build而后执行我们的赋值操作)。
看下最终的方针波形:
可以看到,这里currentState与stateReg保持一致,也就意味着当前的状态机状态。
☆ END ☆
作者:玉骐
原文链接:https://mp.weixin.qq.com/s/IbsQOwYZnr7tGM2NvjDlWw
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注Spinal FPGA专栏。