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

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

3天内不再提示

SystemVerilog中枚举类型的使用建议

路科验证 来源:硅芯思见 作者:nanoty 2022-09-01 14:20 次阅读

SystemVerilog中枚举类型虽然属于一种“强类型”,但是枚举类型还是提供了一些“不正经”的用法可以实现一些很常见的功能,本文将示例一些在枚举类型使用过程中的一些“不正经”用法,并给出一些使用建议。

1 同一个作用域内定义多个枚举类型,并且这些枚举类型的枚举值列表中存在相同的标签

【示例】

f4e3f8a2-29af-11ed-ba43-dac502259ad0.png

仿真结果】

f4f59a08-29af-11ed-ba43-dac502259ad0.png

示例中,定义了两个枚举变量fsm_s1和fsm_s2,并且其对应的枚举值列表中都包含了相同的标签“GO”,编译后报错。其实可以想象下,如果在SystemVerilog的同一个作用域中允许这种同名的标签存在,那么在具体对于某一个枚举变量使用标签进行赋值操作时,那么这个标签到底是来自于哪个枚举变量中对应的枚举列表呢?所以,在SystemVerilog中,同一个作用域内定义多个枚举类型时,这些枚举类型的枚举值列表中不能存在同名的标签。

2 枚举值列表中的标签用于运算

【示例】

f50d3fbe-29af-11ed-ba43-dac502259ad0.png

【仿真结果】

f52b7682-29af-11ed-ba43-dac502259ad0.png

示例中,将枚举变量cal_e的枚举值列表中的标签被用于运算操作,并且可以获得对应的计算结果。这是因为枚举值列表中的每个标签都有对应的数值,默认情况下,枚举值列表中第一个标签对应的数值为0,其后标签对应数值按照加1递增。当枚举值列表中的标签用于具体运算表达式时,与这些标签关联的数值会自动“替换”掉表达式中的标签,从而实际完成运算的是标签对应的数值。但是限于枚举值列表可以表示的数据范围有限,建议不要将枚举列表中的标签用于具体运算过程中。

3 将数值直接赋给枚举变量

【示例】

f540960c-29af-11ed-ba43-dac502259ad0.png

【仿真结果】

f5520900-29af-11ed-ba43-dac502259ad0.png

示例中,第6行和第8行分别将数值直接赋予了枚举变量cal,此时编译会提示此处的赋值为illegal,但是SystemVerilog对于这个赋值操作还是会进行的。第10行采用$cast进行动态转换,将数值转换成枚举变量cal,间接实现了对cal的赋值操作,此时因为采用了显式的类型转换,并且转换成功,所以并不会产生任何提示信息。第12行使用了静态转换,将数值转换成枚举变量cal,此时因为采用了显式的类型转换,所以也并不会产生任何提示信息。但是在将具体数值赋值枚举类型变量时,最好采用显式的动态转换或者静态转换。

4 赋给枚举变量的数值位宽与枚举变量位宽不匹配时的结果

【示例】

f5617386-29af-11ed-ba43-dac502259ad0.png

【仿真结果】

f571be8a-29af-11ed-ba43-dac502259ad0.png

示例中,第6行将数值“4”赋给枚举变量cal,该枚举变量可以选择的枚举值列表中的数值只可能为:0,1,2,3,显然数值“4”不在该范围之内,所以通过枚举变量调用name()函数得到的标签为“空”。但是“4”的位宽在该枚举变量所能表示的数值范围之内(不在枚举值列表之内),所以该值会被赋给该枚举变量,其数值可以被显示出来。

第9行将数值“9”赋给枚举变量cal,数值“9”为4位宽,枚举变量cal位宽为3,数值“9”不在该枚举变量所能表示的数值范围之内,所以“9”会被截位后赋给枚举变量,所以此时枚举变量对应的数值为“3’b001”而不是“4’b1001”,而与数值“3’b001”对应的枚举值列表中标签是“ONE”,所以通过枚举变量调用name()函数得到的标签为“ONE”,显示的数值为“1”。为了在仿真过程中避免类似情况出现,在将具体数值赋给枚举变量时,建议采用动态转换$cast,不要寄希望于仿真器能够“揣测明白你的心意悄悄的”静态的完成类型的转换赋值,使用动态转换$cast当遇到类型不匹配时立刻可以报错提醒。

审核编辑:汤梓红

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

    关注

    28

    文章

    1326

    浏览量

    109302
  • System
    +关注

    关注

    0

    文章

    161

    浏览量

    36571
  • 枚举
    +关注

    关注

    0

    文章

    16

    浏览量

    4521

原文标题:SystemVerilog中枚举类型的一些“不正经”用法

文章出处:【微信号:Rocker-IC,微信公众号:路科验证】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言必备知识枚举

    枚举类型是ANSI C新标准所增加的。如果一个变量只有几种可能的值,可以定义为枚举类型。所谓“枚举是指将变量的值一一列举出来,变量的值只限于
    的头像 发表于 11-29 16:07 478次阅读

    labview小白求教枚举类型控件

    学习labview还才3天,看的书是《labview宝典》,现在正好看到78页,关于“获取日期/时间字符串”函数,其中说到日期格式是枚举类型,但是我实际测试,给枚举控件插入了三个项,值分别为0、1
    发表于 12-20 21:01

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

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

    枚举类型最后面增加项报错

    各位大神:我的枚举类型RadioState,在最后面增加一项,之后程序很多用到RadioState的地方报错,这个是什么原因造成的?下图是我没有改之前的枚举
    发表于 05-15 12:02

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

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

    go语言枚举类型怎么用

    go 语言枚举类型是这么用的?在什么场景下会用到枚举?本文对 go 语言枚举做了详细讲解。 枚举,是一种重要的数据
    的头像 发表于 09-02 09:43 4881次阅读

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

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

    浅析SystemVerilog中的枚举类型

    枚举类型定义了一组具有名称的值,在没有指定值时默认是int型数值。
    的头像 发表于 10-13 09:44 993次阅读

    SystemVerilog中$cast的应用

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

    SystemVerilog中的struct

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

    SystemVerilog中至关重要的的数据类型

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

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

    在上一篇文章《SystemVerilog中至关重要的的数据类型》中,介绍了枚举类型的本质和使用语法。本文接着介绍SV中同样不可忽略的结构体(structure)和自定义
    的头像 发表于 01-21 17:18 1426次阅读
    <b class='flag-5'>SystemVerilog</b>中至关重要的结构体和自定义<b class='flag-5'>类型</b>

    枚举类型的简单扩展学习

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

    Java枚举的特点及用法

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

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

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