RTL基本知识:使用枚举类型表示状态机进入死循环

在定义状态机中的状态时,除了可以使用宏(define)或者参数(parameter)声明定义外,还可以使用枚举类型,但是如果对于枚举类型使用不正确的话,极易出现编译仿真均没有报错,但是仿真时状态机跳转异常的情况.本文将针对这种情况进行示例说明并给出解决方法.

1  数据类型

在Verilog中所有的变量和线网都是4值数据类型,但在SystemVerilog中,对信号类型和数据类型进行了详细的区分,其中信号类型保持与Verilog一样,主要分为变量和线网类型,但是数据类型分为了2值类型(0和1)和4值类型(0,1,x和z),对信号的数据类型进行了扩展,但是保持了线网类型原有的数据类型,在默认状态下,4值数据类型的默认值为x,2值类型的默认值为0.同时SystemVerilog结合C语言的特性,引入了其他一些类型,例如枚举类型等,通过多种类型的引入,极大地丰富了SystemVerilog进行程序设计的灵活性.

2  枚举类型

用户可以通过枚举类型定义特定的常量值的集合.

格式:

使用方式如下:

枚举常量代表该枚举类型的变量的可能取值的列表,编译系统为每个枚举常量指定一个数值,缺省状态下这个数值从0开始,且数据类型为int,即2值型的整型.

3  问题描述

对下述代码进行仿真时,状态跳转执行异常,核心代码如下:

当上述状态机运行时,状态机将一直处于WAIT状态,状态执行异常.

4  问题分析

这里需要注意到,枚举常量列表中的枚举常量在缺省状态下,枚举常量的数值是从0开始递增.且2值数据类型变量的初始值为0.所以在此例中,state_e和nstate_e的初始状态都为0,即WAIT.当复位撤销后,state_e和nstate_e都为WAIT,那么组合逻辑部分[email protected](state_e)的敏感信号列表中的state_e将一直保持在WAIT状态,所以该部分组合逻辑将不会被执行,从而导致nstate_e状态不会被更新,因此,状态既不能推进,将一直保持在初始的WAIT状态.

5  解决方法

出现上述问题主要是因为代码中组合逻辑部分的敏感信号列表中的变量没有发生变化,从而没有出发进程的执行导致的,因此,解决方法主要是实现组合逻辑部分的有效执行,实现nstate_e的变化.

5.1  使用always_comb结构

always_comb在仿真开始的0时刻会自动调用一次,从而可以实现nstate_e状态的更新,将组合结构中的[email protected](state_e)替换为always_comb即可.

5.2  将枚举变量的数据类型指定为4值类型,如下所示:

在仿真开始时,因为枚举类型的数据类型为logic型,所以变量state_e和nstate_e的默认状态都为x态,那么在复位阶段state_e被初始化为WAIT时,组合逻辑部分的[email protected](state_e

中的敏感信号state_e状态从x态变化到了WAIT,即状态发生变化,触发组合逻辑部分进程的执行,nstate_e会被更新为LOAD,从而可以实现状态机的推进.

5.3  指定枚举常量的初始值

枚举列表中的枚举常量列表中的第一个常量,默认初始值为0-,其后常量数值依次递增,但是这个起始值也可以在枚举类型声明定义时指定为其他值,从而可以使2值型枚举变量的初始状态-与枚举变量列表中的常量起始值不一样,在复位阶段state_e被更新为非零值时,更新后的值与类型的默认值0不一样,从而也可以实现组合逻辑部分敏感信号列表中信号的变化,从而使组合逻辑中的nstate_e状态可以被更新,推进状态机的运行,示例如下:

更多资讯,请关注个人公众号:芯光灿烂

原文地址:https://www.cnblogs.com/xgcl-wei/p/9190329.html

时间: 2024-07-30 19:34:37

RTL基本知识:使用枚举类型表示状态机进入死循环的相关文章

C# 基础知识 (五).变量类型和字符串处理

        这篇文章是阅读<C#入门经典(Beginning C#)>书籍里面的内容,作者Karli Watson.主要包括自己缺乏的一些C#基础知识和在线笔记使用,文章主要包括C#简单变量类型和复杂变量类型.命名规则.隐式转换和显示转换.变量字符串处理等内容,都是非常基础的知识,希望对初学者有所帮助. 一. C#简单变量类型和命名规则         简单类型组成应用程序中基本构件的类型,其中主要有以下类型: 整数类型 sbyte(-128~127之间整数) byte(0~255之间整数

浅谈java中的枚举类型(转)

用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switch JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强. enum Signal { GREEN, YELLOW, RED } pu

比你想象中还要强大的枚举类型

开发中枚举类型往往被用在可以一一列举的实例中,比如 enum Color{red,green,blue;}.但是可能你不会注意到它的更强大之处,比如如下问题看看你能作答吗 1.枚举类型可以有构造函数吗? 2.枚举类型可以实现接口.继承类吗? 3.枚举类型可以有static成员变量和方法吗?以及可否有实例变量和方法吗? 4.枚举类型可以被继承吗? ..........等(打开eclipse一试便知的知识) 其实enum类型就是一个特殊的java类,它几乎具有一个java类所具有的大部分功能.它更类

浅谈C#枚举类型

枚举(Enum),一个毫不起眼的小喽啰. CSDN的描述如下: enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型. 通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它. 但是,还可以将枚举嵌套在类或结构中. 默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1. 其实这个已经够详细了.相信枚举大家都不陌生,只是这玩意不常用. 那么枚举有什么用呢?假设,你现在跟你的团队小组(3人)正在开发一个学生成绩管理系统.各

DELPHI设置枚举类型size

delphi枚举类型长度默认为2个字节(单字),而在C中枚举为4个字节(双字),如果需要跨这两个平台编程,传输结构时会由于数据长度不一造成灾难. 经过查找资料,原来delphi可以通过{$Z+} {$Z-} {$Z1} {$Z4} 等宏设置枚举类型的长度,小至1个字节,大至4个字节. 官方说明如下: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/comp

无法将类型“System.Nullable`1”强制转换为类型“System.Object”。LINQ to Entities 仅支持强制转换 EDM 基元或枚举类型。

在一个项目中使用LINQ和EF时出现了题目所示的异常,搜索了很多资料都找不到解决办法,主要是因为EF方面的知识欠缺. 先将情况记录如下,以供以后参考. 查询主要设计两张表,由外键关联: 在进行下面的查询时,出现异常:无法将类型“System.Nullable`1”强制转换为类型“System.Object”.LINQ to Entities 仅支持强制转换 EDM 基元或枚举类型. public ActionResult GetIpSegments() { //List<Ipsegment>

【转】java枚举类型enum的使用

原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum 定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义.既然不明白就抽时间研究下吧. Java 中的枚举

Java枚举类型enum使用详解

java的Enum枚举类型终于在j2se1.5出现了.之前觉得它只不过是鸡肋而已,可有可无.毕竟这么多年来,没有它,大家不都过得很好吗?今日看<Thinking in Java>4th edition,里面有一句话“有时恰恰因为它,你才能够"优雅而干净"地解决问题.优雅与清晰很重要,正式它们区别了成功的解决方案与失败的解决方案.而失败的解决方案就是因为其他人无法理他."使用Enum枚举类型,可以将以前笨拙的代码变得优雅简单?但是,我同时也在思考另外一个问题,使用新

java 枚举类型enum 的使用

java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum 定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义.既然不明白就抽时间研究下吧. Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型.要了解枚举类型,建议大家先