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

    文章

    1345

    浏览量

    110009
  • System
    +关注

    关注

    0

    文章

    165

    浏览量

    36896
  • 枚举
    +关注

    关注

    0

    文章

    16

    浏览量

    4580

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    详细讲解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 8632次阅读
    <b class='flag-5'>枚举</b>是C语言中的一种基本数据<b class='flag-5'>类型</b>

    go语言枚举类型怎么用

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

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

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

    浅析SystemVerilog枚举类型

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

    SystemVerilog$cast的应用

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

    SystemVerilog的struct

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

    SystemVerilog至关重要的的数据类型

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

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

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

    枚举类型的简单扩展学习

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

    Java枚举的特点及用法

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

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

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