0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

状态机该怎么监控

Spinal FPGA 来源:Spinal FPGA 2024-01-15 10:03 次阅读

状态机的可监控维度该如何考虑

》状态机该怎么监控

最近遇到一个关于状态机的问题,具体的业务就不讲了。关于FSM怎么写这种初级问题在这里也不讲了。这里我们只关注下在真实的应用场景里,从监控的角度来看,该如何去看待FSM。 FPGA设计里,除了功能实现之外,最重要的一部分就是DFX的设计。毕竟烧录完之后我们也只能通过DFX来去观测内部的状态(说JTAG的请绕过,那顶多是开发阶段)。在考虑资源允许的情况下,我们要做的应当是有充分的DFX能够帮助我们去观测内部的状态。一个工程做下来往往是在补DFX时觉得要添加的太多了,而到真实需要定位问题的时候则又会感叹“当初怎么不多添加些DFX”~ 回到对FSM的处理,一开始想到的可能是:

把FSM的当前状态添加到DFX中。

没毛病,我们能够清楚的观察到当前状态机处于什么状态。但当状态机如果处于卡死不动的状态,那我们所需要的就是导致当前状态卡住的信号的状态:

把FSM各条件跳转的判断信号添加到DFX中。

上面两条也基本是我们之前设计常常会做的内容。然而这里面只是对下面的场景做了监控:

状态机卡住的场景——通过状态跳转条件的DFX信号去判断卡住的原因

对于DFX信号,像我们通过PCIe寄存器链路去读取DFX信号时不可能获取到每拍的结果,因而上面的DFX信号添加方式也就只能针对FSM卡死的情况进行定位判断。然而很不幸,这一次我遇到了一个状态机在跳转,只是没有跳转到一个需要响应某个动作的状态。由于代码从别人那里接手过来的,看代码也能对case场景进行一个判断。但回到监控的角度,只是没有跳转到一个需要响应某个动作的状态这个判断是我针对看到的DFX抓取信号来判断得到的结论,然而我并不能自证(当然可以通过仿真构造类似Case来进行验证,这不提了),毕竟DFX不是每拍的结果都能看得到的,针对线上的问题,所有的判断应当都是有充足的证据的,而不是结合观测加推断。那么针对这种场景,有必要再增加一种监控手段:

记录各状态之间是否有过跳转发生,软件可清零。

通过记录各状态之间是否发生过跳转,那么我们可以结合DFX当前状态来充分说明某个状态没有到达。而记录各状态之间是否有过跳转发生,所消耗的资源也非常少。 》example

来看一个简单的状态机:

import spinal.lib.fsm._

classTopLevelextendsComponent{
val io = newBundle {
val result = out Bool()
}

val fsm = newStateMachine {
val counter = Reg(UInt(8bits)) init(0)
io.result := False

val stateA : State = newState with EntryPoint {
whenIsActive(goto(stateB))
}
val stateB : State = newState {
onEntry(counter := 0)
whenIsActive {
counter := counter + 1
when(counter === 4) {
goto(stateC)
}
}
onExit(io.result := True)
}
val stateC : State = newState {
whenIsActive(goto(stateA))
}
}
}

这里面会存在三个状态StateA、StateB、StateC:

StateA——>StateB

StateB——>StateC

StateC——>StateA

那么我们需要记录的就是:

StateA_to_fsm_stateB_change

StateB_to_fsm_stateC_change

StateC_to_fsm_stateA_change

在SpinalHDL里,这种活儿还是不要手动的好,当然是自动化的处理好。下面给一个Demo,可能有大神有更加优雅的解决方式,欢迎交流。

定义StateExtend:

class StateExtend(implicit stateMachineAccessor: StateMachineAccessor) extends State {
val nextStateBuffer=Set[StateExtend]()
def goto(state:StateExtend)={
nextStateBuffer.add(state)
stateMachineAccessor.goto(state)
}
}

主要是在原有State的基础上重定义了goto函数,记录了每个状态会跳转的下一状态。

然后定义FsmMonitor:

caseclassFsmState(monReg:Bool,curState:State,nextState:State)

caseclassFsmMonitor(implicitstateMachineAccessor: StateMachine) extendsArea{
val stateMonMap=Map[State,ArrayBuffer[FsmState]]()
val state_mon_clear=RegInit(False) simPublic()

defgenerateFsmMonitor()={
val current_state_dly=RegNext(stateMachineAccessor.stateReg)
val next_state_dly=RegNext(stateMachineAccessor.stateNext)
for(state<-stateMachineAccessor.states){
      if(state.isInstanceOf[StateExtend]){
        for (nextState <- state.asInstanceOf[StateExtend].nextStateBuffer){
          val state_change=RegInit(False) setName (s"${state.getName()}_to_${nextState.getName()}_change")
          when(state_mon_clear){
            state_change.clear()
          }elsewhen((current_state_dly===stateMachineAccessor.enumOf(state))){
            when(next_state_dly===stateMachineAccessor.enumOf(nextState)){
              state_change.set()
            }
          }
          stateMonMap.getOrElse(state,ArrayBuffer[FsmState]()).append(FsmState(state_change,state,nextState))
        }
      }
    }
  }
}

在generateFsmMonitor中,会针对每个状态来分别创建跳转相应的跳转监控信号,并记录到stateMonMap中去。state_mon_clear可用于清零状态所有监控信号。通过regif可讲state_mon_clear及stateMonMap中的所有元素添加到寄存器总线中去(也可以直接用regif声明创建寄存器)。

最终,在使用时如下即可:

case classfsmTest() extendsComponent{
val counter = out(Reg(UInt(8bits)) init (0))

val fsm = newStateMachine {
val stateA = newStateExtend() with EntryPoint setName("StateA")
val stateB, stateC = newStateExtend()
stateA.whenIsActive {
stateA.goto(stateB)
}
stateB.whenIsActive {
stateB.goto(stateC)
}
stateC.onEntry(counter := 0)
stateC.whenIsActive {
counter := counter + 1
when(counter === 3) {
stateC.goto(stateA)
}
}

val fsm_mon=FsmMonitor()
addPrePopTask(()=>{
fsm_mon.generateFsmMonitor()
})
}
}

差别点在于goto换成对应的StateA.goto等显示调用的形式。通过例化FsmMonitor调用generateFsmMonitor即可注册所有的状态跳转信号:

5341757c-b286-11ee-8b88-92fbcf53809c.jpg

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21323

    浏览量

    593214
  • 寄存器
    +关注

    关注

    30

    文章

    5030

    浏览量

    117734
  • 状态机
    +关注

    关注

    2

    文章

    486

    浏览量

    27182

原文标题:反思一下FSM

文章出处:【微信号:Spinal FPGA,微信公众号:Spinal FPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    状态机编程

    状态机编程基于状态机的按键输入软件接口设计一般的教课书中给出的按键输入软件接口程序通常非常简单,在程序中一旦检测到按键输入口为低电平时(图9-2),便采用(调用)软件延时程序延时10ms。然后再
    发表于 07-10 18:00

    如何写好状态机

    一篇经典文献,详细讲解了一段、两段、三段式状态机的实现,效率、优缺点。看完后相信会对状态机有一个详细的了解。 状态机是逻辑设计的重要内容,状态机的设计水平直接反应工程师的逻辑功底,所以
    发表于 10-24 11:43

    状态机

    控制状态机控制状态机的初始化和状态转换的最佳方法是使用枚丽型输入控件。一般使用自定义类型的枚丽变量。使用子定义类型的枚丽变量可以是控件和实例乊间存在关联,使得添加或删除状态时所有的枚丽
    发表于 02-13 12:39

    LabVIEW状态机应用的问题

    如图中状态机,本人想借鉴程序框图做个采集程序,但是在对第二个图中的队列做引用时不知道怎么建立引用,希望有人能告知,非常感谢!
    发表于 09-28 17:57

    状态机如何暂停

    程序一运行 就开始自动运行程序 状态机各种各种状态开始执行 我这里是布尔变量 每一秒点亮一个布尔按钮。我现在想在界面增加一个暂停按钮 当点暂停时候 此时暂停按钮文字成为继续 如果 状态机执行第二步
    发表于 04-09 09:23

    labVIEW状态机在实战中的应用(基础)

    执行超时里的东西。一旦VI检测到有更新就会触发用户事件。状态机执行用户事件里的东西。(如图3)用户事件里的东西,我们就是把开始这个全局变量的值改变。当开始的值改变后就能进入逻辑判断的VI了,VI在处理
    发表于 12-25 16:53

    具有多个输入的状态机

    你好,我对vhdl中的状态机感到困惑。我有自定义IP,有两个Slave输入和一个主输出。我将1st_input的状态机写入文件,现在想要使用特定文件中的其他输入(包含状态机)。我应该
    发表于 04-01 09:42

    状态机是什么?什么是消息触发类型的状态机

    状态机可归纳为哪几个要素?状态机可分为哪几种?什么是消息触发类型的状态机
    发表于 04-19 06:02

    什么是状态机状态机是如何编程的?

    什么是状态机状态机是如何编程的?
    发表于 10-20 07:43

    什么是状态机

    一. 什么是状态机我们以生活中的小区的停车系统为例:停车杆一般没车的是不动的(初态),有车来的时候需要抬杆(状态1),车通过需要放杆(状态2),如果在放杆的过程中突然有车,又需要抬杆(状态
    发表于 01-06 08:01

    什么是状态机

    目录1 前言2 状态机2.1 什么是状态机2.2 状态机的概念2.3 使用状态机写键盘的思路3 代码实例3.1 使用软件3.2 protues电路图3.2
    发表于 01-24 06:23

    状态机概述 如何理解状态机

    本篇文章包括状态机的基本概述以及通过简单的实例理解状态机
    的头像 发表于 01-02 18:03 1w次阅读
    <b class='flag-5'>状态机</b>概述  如何理解<b class='flag-5'>状态机</b>

    FPGA:状态机简述

    本文目录 前言 状态机简介 状态机分类 Mealy 型状态机 Moore 型状态机 状态机描述 一段式
    的头像 发表于 11-05 17:58 6232次阅读
    FPGA:<b class='flag-5'>状态机</b>简述

    什么是状态机状态机5要素

    玩单片机还可以,各个外设也都会驱动,但是如果让你完整的写一套代码时,却无逻辑与框架可言。这说明编程还处于比较低的水平,你需要学会一种好的编程框架或者一种编程思想!比如模块化编程、状态机编程、分层思想
    的头像 发表于 07-27 11:23 1.9w次阅读
    什么是<b class='flag-5'>状态机</b>?<b class='flag-5'>状态机</b>5要素

    什么是状态机状态机的种类与实现

    状态机,又称有限状态机(Finite State Machine,FSM)或米利状态机(Mealy Machine),是一种描述系统状态变化的模型。在芯片设计中,
    的头像 发表于 10-19 10:27 5021次阅读