女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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
    +關注

    關注

    1643

    文章

    21954

    瀏覽量

    613843
  • 寄存器
    +關注

    關注

    31

    文章

    5421

    瀏覽量

    123247
  • 狀態機
    +關注

    關注

    2

    文章

    493

    瀏覽量

    28060

原文標題:反思一下FSM

文章出處:【微信號:Spinal FPGA,微信公眾號:Spinal FPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Verilog狀態機+設計實例

    在verilog中狀態機的一種很常用的邏輯結構,學習和理解狀態機的運行規律能夠幫助我們更好地書寫代碼,同時作為一種思想方法,在別的代碼設計中也會有所幫助。 一、簡介 在使用過程中我們常說
    的頭像 發表于 02-12 19:07 ?5174次閱讀
    Verilog<b class='flag-5'>狀態機</b>+設計實例

    玩轉Spring狀態機

    說起Spring狀態機,大家很容易聯想到這個狀態機和設計模式中狀態模式的區別是啥呢?沒錯,Spring狀態機就是狀態模式的一種實現,在介紹S
    的頭像 發表于 06-25 14:21 ?1259次閱讀
    玩轉Spring<b class='flag-5'>狀態機</b>

    如何寫好狀態機

    如何寫好狀態機:狀態機是邏輯設計的重要內容,狀態機的設計水平直接反應工程師的邏輯功底,所以許多公司的硬件和邏輯工程師面試中,狀態機設計幾乎是必選題目。本章在引入
    發表于 06-14 19:24 ?97次下載

    狀態機舉例

    狀態機舉例 你可以指定狀態寄存器和狀態機狀態。以下是一個有四種狀態的普通狀態機。 // Th
    發表于 03-28 15:18 ?1069次閱讀

    狀態機代碼生成工具

    狀態機代碼生成工具狀態機代碼生成工具狀態機代碼生成工具狀態機代碼生成工具
    發表于 11-19 15:12 ?9次下載

    狀態機原理及用法

    狀態機原理及用法狀態機原理及用法狀態機原理及用法
    發表于 03-15 15:25 ?0次下載

    簡述使用QII狀態機向導如何創建一個狀態機

    如何使用QII狀態機向導創建一個狀態機
    的頭像 發表于 06-20 00:11 ?4471次閱讀
    簡述使用QII<b class='flag-5'>狀態機</b>向導如何創建一個<b class='flag-5'>狀態機</b>

    狀態機概述 如何理解狀態機

    本篇文章包括狀態機的基本概述以及通過簡單的實例理解狀態機
    的頭像 發表于 01-02 18:03 ?1.1w次閱讀
    <b class='flag-5'>狀態機</b>概述  如何理解<b class='flag-5'>狀態機</b>

    什么是狀態機 狀態機的描述三種方法

    狀態機 1、狀態機是許多數字系統的核心部件,是一類重要的時序邏輯電路。通常包括三個部分:一是下一個狀態的邏輯電路,二是存儲狀態機當前狀態的時
    的頭像 發表于 11-16 17:39 ?2.7w次閱讀

    FPGA:狀態機簡述

    本文目錄 前言 狀態機簡介 狀態機分類 Mealy 型狀態機 Moore 型狀態機 狀態機描述 一段式
    的頭像 發表于 11-05 17:58 ?7896次閱讀
    FPGA:<b class='flag-5'>狀態機</b>簡述

    什么是狀態機狀態機5要素

    玩單片還可以,各個外設也都會驅動,但是如果讓你完整的寫一套代碼時,卻無邏輯與框架可言。這說明編程還處于比較低的水平,你需要學會一種好的編程框架或者一種編程思想!比如模塊化編程、狀態機編程、分層思想
    的頭像 發表于 07-27 11:23 ?2.1w次閱讀
    什么是<b class='flag-5'>狀態機</b>?<b class='flag-5'>狀態機</b>5要素

    狀態模式(狀態機)

    以前寫狀態機,比較常用的方式是用 if-else 或 switch-case,高級的一點是函數指針列表。最近,看了一文章《c語言設計模式–狀態模式(狀態機)》(來源:embed linux
    發表于 12-16 16:53 ?9次下載
    <b class='flag-5'>狀態</b>模式(<b class='flag-5'>狀態機</b>)

    labview狀態機分享

    labview狀態機
    發表于 10-31 15:50 ?18次下載

    有限狀態機分割設計

    有限狀態機分割設計,其實質就是一個狀態機分割成多個狀態機
    的頭像 發表于 10-09 10:47 ?846次閱讀

    什么是狀態機狀態機的種類與實現

    狀態機,又稱有限狀態機(Finite State Machine,FSM)或米利狀態機(Mealy Machine),是一種描述系統狀態變化的模型。在芯片設計中,
    的頭像 發表于 10-19 10:27 ?1.1w次閱讀