返回介绍

7.3 赋值操作符

发布于 2020-09-09 22:55:46 字数 909 浏览 1166 评论 0 收藏 0

除了简单赋值操作符(=)之外,SystemVerilog包含了C语言赋值操作符以及特殊的位级赋值操作符:+=、 -=、 *=、 /=、 %=、 &=、 |=、 ^=、 <<=、 >>=、 <<<=、 以及 >>>=。除了左侧索引表达式仅仅计算一次之外,赋值操作符在语义上等价于一个阻塞赋值。例如:

a[i] += 2; // 与a[i] = a[i] + 2;相同

在SystemVerilog中,假如一个表达式不包含一个时间控制,那么它可以包含一个阻塞赋值。注意:这样的赋值必须使用圆括号包围起来以便避免一些基本错误,例如将a==b写为a=b,或者将a!=b写为a|=b。

if ((a=b))
    b = (a+=1);
a = (b = (c = 5));

这样的一个赋值表达式的语义与一个计算右侧值,将右侧值强制转换成左侧数据类型,然后更新左侧值并返回这个值的函数相同。返回值的数据类型与左侧数据类型相同。如果左侧是一个串联,那么返回的类型应该是一个无符号integral值,它的位长度等于其操作数位长度之和。

在一个事件表达式、过程连续赋值中的表达式、或者不在一个过程语句内的表达式中包含赋值操作符是非法的。

SystemVerilog包含C语言的递增和递减赋值操作符:++i,--i,i++,以及i--。当它们使用在表达式中的时候,这些操作符不需要使用圆括号包围。这些递增和递减赋值操作符的操作与阻塞赋值一样。

赋值操作相对于表达式中任何其它操作的顺序是未定义的。只要同时写一个变量、在一个integral表达式中读或写一个变量、或者在实现时不能保证计算顺序的关联文中的时候,在实现时就可以发布一个警告。在下面的例子中:

i = 10;
j = i++ + (i=i-1);

根据递增和赋值语句的相对顺序,在执行之后,j的值可能是18、19、或20。

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

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

发布评论

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