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
    +关注

    关注

    30

    文章

    1370

    浏览量

    114146
  • System
    +关注

    关注

    0

    文章

    166

    浏览量

    38460
  • CAST
    +关注

    关注

    0

    文章

    8

    浏览量

    9594
  • 数据类型
    +关注

    关注

    0

    文章

    237

    浏览量

    14108

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SystemVerilog的Virtual Methods

    SystemVerilog多态能够工作的前提是父类的方法被声明为virtual的。
    发表于 11-28 11:12 1066次阅读

    SystemVerilog的“const”类属性

    SystemVerilog可以将类属性声明为常量,即“只读”。目的就是希望,别人可以读但是不能修改它的值。
    发表于 11-29 10:25 2483次阅读

    SystemVerilog的联合(union)介绍

    SystemVerilog ,联合只是信号,可通过不同名称和纵横比来加以引用。
    的头像 发表于 10-08 15:45 2350次阅读
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的联合(union)介绍

    CAST工艺自控系统的开发

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

    SystemVerilog的断言手册

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

    SystemVerilog的操作方法

    SystemVerilog提供了几个内置方法来支持数组搜索、排序等功能。
    的头像 发表于 10-31 10:10 4168次阅读

    SystemVerilog可以嵌套的数据结构

    SystemVerilog除了数组、队列和关联数组等数据结构,这些数据结构还可以嵌套。
    的头像 发表于 11-03 09:59 2438次阅读

    SystemVerilog的package

    SystemVerilog packages提供了对于许多不同数据类型的封装,包括变量、task、function、assertion等等,以至于可以在多个module中共享。
    的头像 发表于 11-07 09:44 1767次阅读

    SystemVerilog的struct

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

    SystemVerilog的Shallow Copy

    SystemVerilog的句柄赋值和对象复制的概念是有区别的。
    的头像 发表于 11-21 10:32 1389次阅读

    SystemVerilog的Semaphores

    SystemVerilogSemaphore(旗语)是一个多个进程之间同步的机制之一,这里需要同步的原因是这多个进程共享某些资源。
    的头像 发表于 12-12 09:50 4190次阅读

    KUKA机器人CAST_TO-CAST_FROM简析

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

    KUKA机器人CAST_TO-CAST_FROM数据传输

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

    带你了解SystemVerilog的关联数组

    SystemVerilog,我们知道可以使用动态数组实现数组元素个数的动态分配,即随用随分
    的头像 发表于 06-09 09:46 8965次阅读
    带你了解<b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的关联数组

    Systemverilog的Driving Strength讲解

    systemverilog,net用于对电路连线进行建模,driving strength(驱动强度)可以让net变量值的建模更加精确。
    的头像 发表于 06-14 15:50 2450次阅读
    <b class='flag-5'>Systemverilog</b><b class='flag-5'>中</b>的Driving Strength讲解