返回介绍

3.14 强制类型转换

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

constant_cast ::=   // 引用自附录A.8.4
    casting_type'(constant_expression)
  | casting_type'constant_concatenation
  | casting_type'constant_multiple_concatentation

cast ::=
    casting_type'(expression)
   | casting_type'concatenation
   | casting_type'multiple_concatentation

casting_type ::= simple_type | size | signing  // 引用自附录A.2.2.1

simple_type ::= integer_type | non_integer_type | ps_type_identifier

语法 3-6 — 强制类型转换(摘录自附录A)

我们可以使用强制类型转换操作符(')来改变一个表达式的数据类型。需要进行强制类型转换的表达式必须包含在圆括号内,或者必须包含在串联或复制花括号内,并且它们必须是自决的。

int'(2.0*3.0)
shortint'{8'hFA,8'hCE}

如果将一个正的十进制数作为数据类型,那么这意味着需要改变数据的位数。

17'(x - 2)

数据的符号也可以改变。

signed'(x)

也可以使用用户定义的数据类型。

mytype'(foo)

如果强制类型转换中的表达式需要改变尺寸或符号,那么这个表达式必须具有integral值。当改变尺寸的时候,符号不会发生变化。当改变符号的时候,尺寸不会发生变化。

当强制转换到一个预定义的数据类型的时候,强制类型转换操作符的前缀必须是预定义的类型关键字。当强制转换到一个用户定义的数据类型的时候,强制类型转换操作符的前缀必须是用户定义类型标识符。

如果一个shortreal类型转换到一个int或32位数据类型,它的值会进行四舍五入,就象Verilog的规定一样。因此,转换会丢失信息。如果将shortreal转换到它的底层位表示而不会丢失信息,那么可以使用23.6节中定义的$shortrealtobits。如果从一个shortreal值的位表示转换回shortreal,可以使用23.6节中定义的$bitstoshortreal。

结构体可以转换成保留位模式的位,这意味着它可以转换回相同的值而不会丢失信息。当非压缩数据转换到它们的压缩表示形式的时候,压缩表示形式中的数据顺序是结构体的第一个域占据最高有效位。这与数据元素(结构体域或数组元素)的串联具有相同的效果。为了将一个非压缩结构体或数组的压缩表示强制转换成任何其它类型(无论是压缩的还是非压缩的),非压缩结构体或数组中的元素类型必须是有效的。

压缩类型间的类型转换并不要求显式转换,因为它们都被当作是integral值,但工具可以使用强制类型转换来执行更强的类型检查。

下面的例子展示了如何使用$bits属性来获得结构体的位尺寸($bits系统函数将在23.4节中讨论),它使结构体转换到一个压缩数组更加方便。

typedef struct {
    bit isfloat;
    union {
        int i;
        shortreal f;
    } n;     // 匿名类型
} tagged_st; // 命名的结构体

typedef bit [$bits(tagged_st)-1 : 0] tagbits; // tagged_st在上面定义

tagged_st a[7:0];           // 非压缩结构体数组

tagbits t = tagbits'(a[3]); // 将结构体转换成位数组

a[4] = tagged_st'(t);       // 将位数组转换回结构体

注意:bit数据类型会丢失X值。为了保留X值,需要使用logic类型。

联合体的位尺寸是其最大成员的尺寸。logic类型的位尺寸是1。

为了保持兼容性,也可以使用Verilog函数:$itor, $rtoi, $bitstoreal, $realtobits, $signed, $unsigned。

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

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

发布评论

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