SV中枚举类型的“不正经”用法,你知道几个?

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

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

【示例】

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

2. 枚举值列表中的标签用于运算
【示例】
【仿真结果】

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

3. 将数值直接赋给枚举变量
【示例】

【仿真结果】

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

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

【示例】


【仿真结果】


示例中,第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当遇到类型不匹配时立刻可以报错提醒。

欢迎交流!!谢谢大家的喜欢!!!

#做项目##深度学习##数字芯片设计##芯片IC验证工程师##你为什么选择硬件行业#
全部评论
感谢大佬分享的这几种枚举
点赞 回复 分享
发布于 2022-10-13 15:58 陕西

相关推荐

12-04 16:18
已编辑
东华理工大学 前端工程师
面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗  他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了  好好准备,等待明天的影石360和周四的腾讯了  加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务