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

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

3天内不再提示

浅析SystemVerilog中的枚举类型

芯片验证工程师 来源:芯片验证工程师 作者:验证哥布林 2022-10-13 09:44 次阅读

枚举类型定义了一组具有名称的值,在没有指定值时默认是int型数值。

enum {red, green, blue} light1, light2;

在上面的例子中,没有指定任何数据类型,因此使用默认的“int”数据类型。所以枚举类型light1和light2被定义为默认类型int的变量,其中包括三个成员:red, green, blue。由于没有指定各个含义的值,所以

red= 0,green= 1,blue= 2

再举一个例子

enum integer {IDLE, XX='x, S1='b01, S2='b10} state, next;

这里的数据类型是“integer”,这意味着可以将“x”和“z”值分配给枚举成员。

enum {bronze=3, silver, gold} medal;

以bronze = 3作为初始值。因此,silver等于4,gold等于5

enum {a=3, b=7, c} alphabet;

显式de为“a”和“b”赋值,因此,c将取b = 7后的值。所以c等于8,也就是说

enum {a=0, b=7, c, d=8} alphabet;

Synopsys– VCS:
Error-[ENUMDUPL] Duplicate labels in enum
The enum label 'd' has the value 4'd8 which is duplicate of enum label 'c' in the declared enum.

上面这种写法就会导致编译错误,因为c和d的值都等于8。

enum {a, b=7, c} alphabet;

“a”是第一个成员,它没有值。所以,a等于0。因此,

a = 0, b = 7, c = 8
enum bit [3:0] {red=‘h13, green, blue} color;

Synopsys– VCS:
Error-[ENUMRANGE] Enum label outside value range
The enum label 'red' has the value 'h00000013 which is outside the range of
the base type of the declared enum, which is 4 bit unsigned.

上面这个示例也会导致编译错误,因为red=‘h13超出了 bit[3:0]所能够表示的最大值('hF) 。修改成下面的写法就没有问题了。

enum bit [3:0] {red=‘d13, green, blue} color;

此时

red = 13, green = 14, and blue = 15

枚举类型在设计有限状态机时特别有用。例如,
你可以定义一个枚举类型来描述状态机的状态:

enum logic [1:0] { IDLE = 2’b00,
 READ = 2’b01,
 WRITE = 2’b10,
 RMW = 2’b11,
 ILLEGAL = ‘x } current_state,next_state;

因为类型是“logic”,所以可以将未知的('x)值分配给enum成员。这样的'x赋值对于仿真比较非常有用,而对于综合工具而言就进行合适的优化。该枚举可以在状态机编码中使用,如下所示:

always @(posedge clk, negedge reset)
 if (!reset) 
    current_state <= IDLE;
 else 
    current_state = next_state;
 
 always @* begin
 …
 case (current_state)
    IDLE : if (rdy) next_state = READ;
    READ : if (go) next_state = WRITE;
    …
 endcase
end

Enumerated-Type Methods

枚举类型的变量提供了很多内建的方法,方便提取枚举类型成员的值。

46811fa6-4a48-11ed-a3b6-dac502259ad0.png

module enum_methods;
 typedef enum { red, green, blue, yellow } Colors;
 Colors c; 
 initial begin
    $display("Number of members in Colors = %0d",c.num); 
    c = c.frst( );
    $display("First member # = %0d",c); 
    c = c.next(2); 
    $display("c = %0d",c); 
    c = c.last ( );
    $display("Last member # = %0d",c);
    $display( "%s : %0d", c.name, c );
 end
 endmodule

Simulation log:

run -all;
# KERNEL: Number of members in Colors = 4
# KERNEL: First member # = 0
# KERNEL: c = 2
# KERNEL: Last member # = 3
# KERNEL: yellow : 3
# KERNEL: Simulation has fnished. There are no more test vectors to simulate.
exit

在这个例子中,我们定义了一个

typedef enum {red, green, blue, yellow} Colors;

Colors有四个成员,

red= 0,
green= 1,
blue= 2,
yellow= 3

我们首先使用“num()”方法显示枚举中的成员数量。

枚举中有四名成员。所以,显示日志显示

Number of members in Colors = 4.

然后使用方法“frst()”获取第一个成员的值。第一个成员是值为0的“red”,因此打印显示

First member = 0.

然后我们使用“next(2)”,会获取后面第2个值2.

接下来,我们通过last()获得枚举类型最后一个成员的值3

Last member # = 3

下面是另一个简单的例子:

module datatype1;
 enum bit [3:0] {red, green, blue=5} color; 
 int i1;
 initial
begin
    i1 = green; 
    $display ("color.name = %s", color.name);
    $display ("red=%s green=%d blue=%d",color.
name,green,blue); //OK
    $display ("red=%d green=%d blue=%d",red,green,blue); //OK
 end
 endmodule

Simulation log:

i1 = 1
color.name = red
red=red green= 1 blue= 5
red= 0 green= 1 blue= 5

 V C S S i m u l a t i o n R e p o r t

Enumerated Type withRanges

枚举类型的成员可以指定范围

470ad94e-4a48-11ed-a3b6-dac502259ad0.png

module datatype1;
typedef enum { read=10, write[5], intr[6:8] } cycle;
enum { readreg[2] = 1, writereg[2:4] = 10 } reg0;
initial
begin
   $display ("read=%0d
", read);
   $display ("write0=%0d write1=%0d write2=%0d write3=%0d 
write4=%0d
", write0,write1,write2,write3,write4); 
   $display ("intr6=%0d, intr7=%0d intr8=%0d
",intr6, 
intr7, intr8);
   $display ("readreg0=%0d readreg1=%0d
",readreg0, 
readreg1);
   $display ("writereg2=%0d writereg3=%0d writereg4=%0d
n",writereg2, writereg3, writereg4);
end
endmodule
typedef enum { read=10, write[5], intr[6:8] } cycle;

定义一个包含三个成员的枚举类型“cycle”。第一个“read”;然后是一系列5个writes,分别是“write0”、“write1”、“write2”、“write3”、“write4”;然后是三个“intr”的,即“intr6”、“intr7”和“intr8”。

类似的,

enum { readreg[2] = 1, writereg[2:4] = 10 } reg0;

定义一个包含两个成员:

readreg0和readreg1,

writereg2, writereg3和writereg4。

下面是仿真log

read=10
write0=11 write1=12 write2=13 write3=14 write4=15
intr6=16, intr7=17 intr8=18
readreg0=1 readreg1=2
writereg2=10 writereg3=11 writereg4=12
V C S S i m u l a t i o n R e p o r t




审核编辑:刘清

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

    关注

    0

    文章

    79

    浏览量

    9611
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27541

原文标题:SystemVerilog中的枚举类型

文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用枚举类型表示状态机进入死循环

    在定义状态机的状态时,除了可以使用宏(define)或者参数(parameter)声明定义外,还可以使用枚举类型
    的头像 发表于 11-07 17:46 975次阅读
    使用<b class='flag-5'>枚举</b><b class='flag-5'>类型</b>表示状态机进入死循环

    如何在Go给GORM模型添加枚举类型

    GORM是一个流行的Go ORM,它允许我们定义结构体来表示数据库表,并提供一个接口来执行CRUD操作。枚举在编程是一个有用的特性,它允许我们定义一个变量可以取的固定值集。在这篇文章,我们将探索如何向GORM模型添加
    的头像 发表于 11-28 15:36 1363次阅读

    详细讲解c语言enum枚举类型

    详细讲解C语言enum枚举类型在实际应用,有的变量只有几种可能取值。如人的性别只有两种可能取值,星期只有七种可能取值。在 C 语言中对这样取值比较特殊的变量可以定义为枚举
    发表于 12-21 23:22

    深入理解java枚举类型enum用法

    ; StringFRI = Fri; StringSAT = Sat; StringSUN = Sun; } 语法(定义) 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类
    发表于 09-27 11:49 0次下载

    枚举是C语言中的一种基本数据类型

    在C语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。不过在一
    的头像 发表于 09-25 15:45 8658次阅读
    <b class='flag-5'>枚举</b>是C语言中的一种基本数据<b class='flag-5'>类型</b>

    go语言枚举类型怎么用

    、 java 等,都有原生支持。在 go ,大家却找不到 enum 或者其它直接用来声明枚举类型的关键字。从熟悉其它编程语言的开发者转用 go 编程,刚开始会比较难接受这种情况。其实,如果你看到如何在 go 中表示
    的头像 发表于 09-02 09:43 5184次阅读

    数字硬件建模SystemVerilog-枚举数据类型

    上一节介绍了已经被淘汰的$unit声明空间,今天我们来看看一种重要的数据类型-枚举数据类型
    的头像 发表于 07-01 17:44 1752次阅读

    SystemVerilog枚举类型的使用建议

    SystemVerilog枚举类型虽然属于一种“强类型”,但是枚举
    的头像 发表于 09-01 14:20 1717次阅读

    SystemVerilog$cast的应用

    SystemVerilog casting意味着将一种数据类型转换为另一种数据类型。在将一个变量赋值给另一个变量时,SystemVerilog要求这两个变量具有相同的数据
    的头像 发表于 10-17 14:35 2861次阅读

    SystemVerilog的struct

    SystemVerilog“struct”表示相同或不同数据类型的集合。
    的头像 发表于 11-07 10:18 2460次阅读

    SystemVerilog至关重要的的数据类型

    对于刚接触SV的小伙伴来说,SV有几种不怎么能引起关注,但在实际工作又经常会用到的数据类型。它们就是枚举(enumeration)、结构体(structures)和自定义类型(typ
    的头像 发表于 01-21 17:14 816次阅读
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>至关重要的的数据<b class='flag-5'>类型</b>

    SystemVerilog至关重要的结构体和自定义类型

    在上一篇文章《SystemVerilog至关重要的的数据类型,介绍了枚举类型的本质和使用语
    的头像 发表于 01-21 17:18 2219次阅读
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>至关重要的结构体和自定义<b class='flag-5'>类型</b>

    枚举类型的简单扩展学习

    定义枚举类型的值只能是整型常量,正数、负数和零都可以,但不可以是浮点数
    的头像 发表于 05-25 15:45 653次阅读

    Java枚举的特点及用法

    在 Java 枚举出现之前,通常会使用常量类来表示一组固定的常量值,直到Java 1.5之后推出了枚举,那么枚举类型有哪些特点,它比常量类又好在哪里呢。 本文将分析一下
    的头像 发表于 09-30 10:02 1452次阅读

    枚举有多大?c语言枚举end的作用是什么?

    枚举有多大?c语言枚举end的作用是什么? 枚举在C语言中是一种常见的数据类型,用于定义一组相互关联的常量或者变量。它通常用于表示一系列可能的取值,使得程序更加易读和易维护。在C语言中
    的头像 发表于 01-19 14:19 599次阅读