返回介绍

3.15 $cast动态强制类型转换

发布于 2020-09-09 22:55:44 字数 1380 浏览 1402 评论 0 收藏 0

在由于不同的数据类型而导致变量不能正常赋值的情况下,SystemVerilog提供了$cast系统任务来进行赋值操作。$cast可以作为任务或函数来调用。

$case的语法如下:

function int $cast(singular dest_var, singular source_exp);

或者

task $cast(singular dest_var, singular source_exp);

dest_var是需要赋值得变量。

sorce_exp是将要赋值到目的变量的表达式。

将$cast作为任务还是函数调用确定了无效赋值是如何处理的。

当作为任务调用时,$cast试图将源表达式赋值给目的变量。如果赋值是无效的,会出现运行时错误并且目的变量保持不变。

当作为函数调用时,$cast试图将源表达式赋值给目的变量,如果赋值成功则返回1。如果赋值失败,$cast不会进行赋值操作而是返回0。当作为函数调用时,不会出现运行时错误,并且目的变量保持不变。

必须注意:$cast执行的是运行时检查。除了检查目的变量和源表达式是否为单一类型外,编译器不会进行类型检查。

例如:

typedef enum {red, green, blue, yellow, white, black} Colors;
Colors col;
$cast(col, 2+3);

这个例子将表达式(5,black)赋值给枚举类型。如果不使用$cast或者下面描述的静态编译时强制类型转换,这种类型的赋值是无效的(参见3.10.3 类型检查 )。

下面的例子显示了如何使用$cast检查一个赋值操作是否成功:

if (!$cast(col, 2+8))  // 10: 无效的强制类型转换
    $display("Error in cast");

作为一种选择,前一个例子还可以使用静态SystemVerilog强制类型转换操作符来进行类型转换,例如:

col = Colors'(2+3);

然而,这是一种编译时的强制类型转换,也就是说,它在运行时总是成功的,并且即使表达式不在枚举值的范围之内,它也不会提供错误检查或警告。

这两种类型的强制类型转换为用户提供了完全的控制能力。如果用户知道将某个表达式赋值给一个枚举变量是安全的,那么可以使用较快的静态编译时强制类型转换。如果用户需要检查表达式是否位于枚举值范围内,那么用户没有必要手工编写一个冗长的开关语句,通过使用$cast函数,编译器自动提供了这种功能。通过这两种类型的强制类型转换,用户能够控制时间和安全性之间的平衡。

注意:$cast类似于C++中的dynamic_cast函数,然而,$cast允许用户检查操作是否成功,而dynamic_cast总是会引起一个C++异常。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文