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

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

3天内不再提示

SystemVerilog中$cast的应用

芯片验证工程师 来源:芯片验证工程师 作者:芯片验证工程师 2022-10-17 14:35 次阅读

SystemVerilog casting意味着将一种数据类型转换为另一种数据类型。在将一个变量赋值给另一个变量时,SystemVerilog要求这两个变量具有相同的数据类型。

SystemVerilog可以使用(')符号进行强制(静态)类型转换。另外,在SystemVerilog中还存在动态cast的概念。

SystemVerilog提供了$cast系统任务/函数,能够在两个不同的数据类型变量之间赋值,因为如果直接赋值的话会报编译错误。

在SystemVerilog中最常用的动态cast应用场景就是类的继承特性中对类句柄的赋值。基类句柄可以用来获取派生类的对象,反之则不行。

在实际仿真执行的过程中,动态cast会执行相应的检查,是否能够真正地进行赋值。

需要特别注意的是,cast既可以作为fucntion调用,也可以作为task调用。区别就是cast作为函数调用时,如果没有成功会返回0,然后可以决定是否采取相应的操作,而$cast作为任务调用失败后,会直接停止仿真。

下面SystemVerilog $cast系统函数/任务的源码声明

function int $cast (target_var, source_exp);

task $cast (target_var, source_exp);

下面的例子展示了SystemVerilog中$cast的应用:

module tb;
 typedef enum { soccer=2, cricket=4, football=10 } sports;
 sports mS;
 int i;
 initial begin
 i = 10;
 
 mS = i; //Synopsys-VCS - WARNING - incompatible types
 //Mentor Questa/Aldec-Riviera - run time ERROR
 $cast(mS, i); //$cast as a task - match types
 $display ("Sports=%s", mS.name( ));
 i = mS; //No Warning or Error
 $display("i=%0d",i);
 i=50;
 //$cast (mS, i); //ERROR - 50 is not a valid value for enum
 if ($cast (mS, i)) //$cast as a function
 $display ("Cast passed");
 else
 $display ("Cast failed");
 end
 endmodule

仿真log:

Sports=football
i=10
Cast failed
 V C S S i m u l a t i o n R e p o r t

在“tb” module中,我们定义了“int i”,并定义了一个enum“sports”并声明了一个sports类型的变量“mS”。

将一个int赋值给enum类型(sports)的变量

mS = i;

由于" i "不是enum类型,存在类型不兼容,所以会得到Synopsys - VCS的warnning(不是ERROR哦):

Warning-[ENUMASSIGN] Illegal assignment to enum variable
testbench.sv, 11
tb, "mS = i;"
Only expressions of the enum type can be assigned to an enum variable.
The type int is incompatible with the enum 'sports'

对于相同的代码,Mentor’s Questa可能会报ERROR:

** Error (suppressible): testbench.sv(9): (vlog-8386) An enum variable 'mS' of type 
'sports' may only be assigned the same enum typed variable or one of its values. 
Variable i requires an explicit cast.

大家可能有点奇怪,这个不兼容类型的赋值到底是warning还是Error,结论就是这个这个enum 值有实际的分配,其实对代码功能没有影响,当作warning也是没有问题的。

为了纠正这种类型不兼容的赋值错误/警告,我们使用$cast将“i”强制转换为enum“mS”:

$cast(mS, i);

在这个上下文下,$cast就是作为task调用的。这种动态cast将使int类型" i "和枚举类型" mS "兼容,仿真会PASS。因为i = 10, mS得到的值是10,也就是enum中的“football”。所以,仿真log显示

“sports = football。”

注意下面的枚举赋值给int类型完全是可以的,反之则不行:

i = mS;

在动态cast中分配不正确的枚举值(50)。

i=50;
$cast(mS, i);

因为50不包含在枚举“sports”的范围内,所以会得到一个ERROR:

Error-[STASKE_DCF] Dynamic cast failed
testbench.sv, 22
Dynamic cast using '$cast' failed. The source expression is not yielding a
valid value for the destination variable.

最后,我们使用$cast作为函数调用,它将返回“0”(因为cast失败),将得到fail打印(“Cast failed”)。

审核编辑:汤梓红。

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

    关注

    28

    文章

    1327

    浏览量

    109312
  • System
    +关注

    关注

    0

    文章

    161

    浏览量

    36575
  • CAST
    +关注

    关注

    0

    文章

    8

    浏览量

    9334
  • 数据类型
    +关注

    关注

    0

    文章

    228

    浏览量

    13499

原文标题:​SystemVerilog中的动态 Cast

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

收藏 人收藏

    评论

    相关推荐

    [启芯公开课] SystemVerilog for Verification

    学快速发展,这些趋势你了解吗?SystemVerilog + VM是目前的主流,在未来也将被大量采用,这些语言和方法学,你熟练掌握了吗?对SoC芯片设计验证感兴趣的朋友,可以关注启芯工作室推出的SoC芯片
    发表于 06-10 09:25

    systemverilog学习教程

    systemverilog的一些基本语法以及和verilog语言之间的区别。
    发表于 04-01 14:24

    如何用questasim进行systemverilog仿真

    刚接触systemverilog,最近在采用questasim10.1版本进行仿真时,发现貌似questasim不支持扩展类的操作?代码如下:`timescale 1ns/1nsmodule
    发表于 04-11 09:44

    做FPGA工程师需要掌握SystemVerilog吗?

    在某大型科技公司的招聘网站上看到招聘逻辑硬件工程师需要掌握SystemVerilog语言,感觉SystemVerilog语言是用于ASIC验证的,那么做FPGA工程师有没有必要掌握SystemVerilog语言呢?
    发表于 08-02 20:30

    使用SystemVerilog来简化FPGA接口的连接方式

    FPGA接口的连接方式。    也许很多FPGA工程师对SystemVerilog并不是很了解,因为以前的FPGA开发工具是不支持SystemVerilog的,导致大家都是用VHDL或者Verilog来
    发表于 01-08 17:23

    SystemVerilog有哪些标准?

    SystemVerilog有哪些标准?
    发表于 06-21 08:09

    CAST工艺自控系统的开发

    介绍了一套自主开发的CAST 工艺自控系统。在4 个月的连续运行中,成功地实现了对一个处理城市污水的CAST 反应器的自动控制。该系统通过计算机中的控制软件实现对CAST 反应器的
    发表于 07-16 09:59 16次下载

    SystemVerilog Assertion Handbo

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    发表于 07-22 14:08 188次下载

    SystemVerilog的断言手册

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    发表于 07-22 14:12 20次下载

    R-cast声发射传感器系统

    R-cast声发射传感器系统 R-CAST声发射传感器系统是富士陶瓷株式会社和东京大学先端科学技术研究所共同研发的针对微小破坏声发射信号的检测装置
    发表于 10-21 14:34 634次阅读

    CAST推出32位RISC处理器BA22

    CAST, Inc与Beyond Semiconductor就CAST在全世界销售Beyond Semiconductor的BA22处理器核达成协议
    发表于 07-27 09:48 1752次阅读

    C++的cast最完整最详细的解释资料说明

    本文档的主要内容详细介绍的是C++的cast最完整最详细的解释资料说明。
    发表于 01-29 15:26 0次下载
    C++的<b class='flag-5'>cast</b>最完整最详细的解释资料说明

    SystemVerilog的正式验证和混合验证

    手册的这一部分探讨了使用SystemVerilog进行验证,然后查看了使用SystemVerilog的优点和缺点。
    发表于 03-29 10:32 23次下载

    KUKA机器人CAST_TO-CAST_FROM简析

    CAST_TO使得使用单个CWRITE语句处理多达4 KB的数据成为可能。CAST_TO将单个变量分组为一个缓冲区。
    发表于 05-09 15:40 496次阅读

    KUKA机器人CAST_TO-CAST_FROM数据传输

    CAST_TO使得使用单个CWRITE语句处理多达4 KB的数据成为可能。CAST_TO将单个变量分组为一个缓冲区。然后,CWRITE将此缓冲区写入通道。
    发表于 05-22 09:23 1214次阅读
    KUKA机器人<b class='flag-5'>CAST_TO-CAST</b>_FROM数据传输