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

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

3天内不再提示

状态机怎么上来就错了?怎么解决?

冬至子 来源:芯时代青年 作者:尼德兰的喵 2023-12-04 10:43 次阅读

事故现场

先贴一下代码的简版:

localparam S_IDLE    = 4'd0;
localparam S_HEAD    = 4'd1;
localparam S_PAYLOAD = 4'd2;
localparam S_TAIL    = 4'd3;
localparam S_ERROR   = 4'd4;

reg [3:0]status, nx_status;
always @(posedge clk_100m or negedge rst_spt_n)begin
    if(!rst_spt_n) status <= S_IDLE;
    else           status <= nx_status;
end

always @* begin
    case(status)
        S_IDLE: ...
        S_HEAD: ...
        S_PAYLOAD: ...
        S_TAIL: ...
        S_ERROR: ...
        default: nx_status = status;
    endcase
end

状态机本身很简单,default也写了,然后进行仿真时看到了这样的波形:

图片

nx_status仿真初始的值为4'hb,而后导致status的值也为4'hb,始终无法回到IDLE状态,整个电路的功能也无法正常开展。

事故分析

这个问题得以暴露要感谢在验证环境中打开了initreg功能:

CMP_OPTIONS += +vcs+initreg+random
RUN_OPTIONS += +vcs+initreg+$(SEED)

通过这样的配置使得reg型的数值在仿真开始时被赋值为随机数。该bug就是由于nx_status被赋值为状态之外的随机数而发现的。

在代码中,nx_status没有任何位置被进行“复位”,当然了因为nx_status本身不是寄存器也就不存在复位的问题,不过状态机的alway@*中的处理是有问题的,这导致nx_status一旦跑“飞”了,status下一拍会更新为nx_status的值,那么整个状态机将不可恢复。

事故解决

修改状态机的写法为:

always @* begin
    case(status)
        S_IDLE: ...
        S_HEAD: ...
        S_PAYLOAD: ...
        S_TAIL: ...
        S_ERROR: ...
        default: nx_status = S_IDLE;
    endcase
end

或者

always @* begin
    nx_status = S_IDLE;
    case(status)
        S_IDLE: ...
        S_HEAD: ...
        S_PAYLOAD: ...
        S_TAIL: ...
        S_ERROR: ...
        default: nx_status = status;
    endcase
end

重新仿真后波形正确:

图片

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

    关注

    31

    文章

    5308

    浏览量

    119975
  • 仿真器
    +关注

    关注

    14

    文章

    1016

    浏览量

    83621
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27469
收藏 人收藏

    评论

    相关推荐

    Verilog状态机+设计实例

    在verilog中状态机的一种很常用的逻辑结构,学习和理解状态机的运行规律能够帮助我们更好地书写代码,同时作为一种思想方法,在别的代码设计中也会有所帮助。 一、简介 在使用过程中我们常说
    的头像 发表于 02-12 19:07 3813次阅读
    Verilog<b class='flag-5'>状态机</b>+设计实例

    玩转Spring状态机

    说起Spring状态机,大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢?没错,Spring状态机就是状态模式的一种实现,在介绍S
    的头像 发表于 06-25 14:21 879次阅读
    玩转Spring<b class='flag-5'>状态机</b>

    什么是状态机状态机的三种实现方法

    文章目录1、什么是状态机?2、状态机编程的优点(1)提高CPU使用效率(2) 逻辑完备性(3)程序结构清晰3、状态机的三种实现方法switch—case 法表格驱动法函数指针法小节摘要:不知道大家
    发表于 12-22 06:51

    如何写好状态机

    如何写好状态机:状态机是逻辑设计的重要内容,状态机的设计水平直接反应工程师的逻辑功底,所以许多公司的硬件和逻辑工程师面试中,状态机设计几乎是必选题目。本章在引入
    发表于 06-14 19:24 97次下载

    状态机举例

    状态机举例 你可以指定状态寄存器和状态机状态。以下是一个有四种状态的普通状态机。 // Th
    发表于 03-28 15:18 972次阅读

    状态机代码生成工具

    状态机代码生成工具状态机代码生成工具状态机代码生成工具状态机代码生成工具
    发表于 11-19 15:12 9次下载

    状态机原理及用法

    状态机原理及用法状态机原理及用法状态机原理及用法
    发表于 03-15 15:25 0次下载

    简述使用QII状态机向导如何创建一个状态机

    如何使用QII状态机向导创建一个状态机
    的头像 发表于 06-20 00:11 4194次阅读
    简述使用QII<b class='flag-5'>状态机</b>向导如何创建一个<b class='flag-5'>状态机</b>

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

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

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

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

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

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