返回介绍

第七章 操作符与表达式

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

主题
主题描述
7.1 简介(一般信息)SystemVerilog操作符是Verilog和C语言操作符的组合。在这两种语言中,操作数的类型和尺寸是固定的,因此操作符具有固定的类型和尺寸。SystemVerilog保持了操作符的固定类型和尺寸。这能够产生有效的编码。

Verilog不包含赋值操作符或递增及递减操作符。SystemVerilog包含了C语言的赋值操作符,例如+=,以及C语言的递增和递减操作符(++和--)。

Verilog-2001加入了有符号线网和reg变量,以及有符号文本值。对于有符号整数和无符号整数的结合规则,Verilog和C语言存在差异。SystemVerilog使用Verilog-2001的规则。
7.2 操作符语法
7.3 赋值操作符除了简单赋值操作符(=)之外,SystemVerilog包含了C语言赋值操作符以及特殊的位级赋值操作符:+=、 -=、 *=、 /=、 %=、 &=、 |=、 ^=、 <<=、 >>=、 <<<=、 以及 >>>=。除了左侧索引表达式仅仅计算一次之外,赋值操作符在语义上等价于一个阻塞赋值。例如:
7.4 对logic和bit类型的操作当一个二元操作符包含一个bit类型的操作数和一个logic类型的操作数的时候,结果的数据类型是logic。如果一个操作数的类型是int而另一个操作数的类型是integer的时候,那么结果的数据类型是integer。

对于!=和==操作符,如果任何一个操作数包含X或Z,那么就像Verilog-2001一样,返回一个X。如果结果被转换成bit类型(例如在一个if语句中),那么结果被转换成0。

一元缩减操作符(& ~& | ~| ^ ~^)可以应用于任何整数类型(包括压缩数组)。如果压缩类型是一个四态类型,那么操作符应该返回类型为logic的值;如果压缩类型是一个两态类型,那么返回值的类型是bit。
7.5 通配等式与通配不等式SystemVerilog 3.1引入了如下所述的通配比较操作符。

表 7-1:通配等式与通配不等式操作符

7.6 实操作符shortreal类型的操作数与Verilog real类型的操作数具有相同的操作限制。一元操作符++和--可以应用于类型为real和shortreal的操作数(按1.0递增或递减)。赋值操作符+=、-=、*=、/=也可以具有real和shortreal类型的操作数。

除了三元操作符中?之前的操作数外,如果任一操作数是real类型的,那么结果就是real类型的。另外,除了三元操作符中?之前的操作数外,如果任一操作数是shortreal类型的,那么结果就是shortreal类型的。

实操作数还可以用在下面的表达式中:
7.7 尺寸一个表达式的位宽由操作数和上下文决定,它与Verilog遵从相同的规则。在SystemVerilog中,可以使用强制类型转换来设置中间值的尺寸。

在Verilog中,当一条赋值语句的左侧和右侧具有不同尺寸的时候,工具可以发布一条警告信息。使用SystemVerilog的尺寸强制转换,可以阻止掉这些警告信息。
7.8 符号确定SystemVerilog表达式符号的规则应该与Verilog相同。通过类型转换将shortreal转换成integer应该是有符号的。
7.9 操作符优先级与关联性操作符的优先级与关联性在表7-2中列出。最先列出的操作符具有最高优先级。

表 7-2:操作符优先级与关联性

7.10 内建方法SystemVerilog引入了类和方法调用语法,其中一个任务或函数通过使用圆点符号(.)调用。
7.11 静态前缀对于一个选择片来讲,选择片的“最长静态前缀”被非正式地定义为一个分析工具能够在确立完成后确定其值的最长的那一部分。当描述隐式敏感列表(参见9.2节)以及为逻辑端口的驱动描述错误条件(参见5.6 线网、reg、与logic )的时候,我们使用这个概念。本节余下的部分定义由什么组成了一个选择片的最长静态前缀。

域选择被定义成一个层次化的名字,其中最后一个层次分割符(“.”)的右侧标识了类型为结构体或联合体的变量的一个域。域选择前缀被定义成域选择中最后一个层次分割符左侧的部分。

一个索引选择是一个单纯的索引操作。索引选择前缀或者是一个标识符或者是另外一个索引选择(在多维选择的情况下)。数组选择、位选择、部分选择、以及索引部分选择都是索引选择的例子。

静态前缀的定义是递归的并且具有如下的定义:

  1. 一个标识符是一个静态前缀
  2. 如果一个域选择前缀是一个静态前缀,那么这个域选择是一个静态前缀
  3. 如果一个索引选择前缀是一个静态前缀并且选择表达式是一个常量表达式,那么这个索引选择是一个静态前缀。


最长静态前缀的定义如下:

  1. 如果一个标识符不是一个静态前缀表达式的域选择前缀或索引选择前缀,那么它是一个最长静态前缀
  2. 如果一个域选择不是一个静态前缀表达式的域选择前缀或索引选择前缀,那么它是一个最长静态前缀
  3. 如果一个索引选择不是一个静态前缀表达式的域选择前缀或索引选择前缀,那么它是一个最长静态前缀

例子:

7.12 串联与Verilog一样,花括号({ })被用来表示串联。串联被当作一个压缩的位向量来看待。它可以使用在一条赋值语句或一个表达式的左侧。
7.13 非压缩数组表达式表达式中也可以使用花括号来为非压缩数组赋值。与C语言不同的是,表达式必须在元素与元素之间达到匹配,并且花括号必须匹配数组维数。在数组中对应元素类型的赋值关联文中,每一个表达式的元素都会被计算。这也就意味着,与上面的相似赋值不同,下面的例子不会发布尺寸警告信息:
7.14 结构体表达式结构体表达式(压缩的和非压缩的)可以使用花括号和逗号由成员表达式构建,其中成员表达式以成员声明的顺序排列。复制操作符可以用来设置准确的成员数目。每一个成员表达式应该在对结构体中对应成员类型赋值的关联文中计算。结构体表达式也可以使用成员的名字来构建。
7.15 标签联合体表达式与成员访问
7.16 集合表达式非压缩结构体和数组变量、文本值、以及表达式都可以作为集合表达式使用。一个非压缩数组的多维分片也可以用作集合表达式。

集合表达式可以在通过赋值语句、通过一个端口、或作为任务或函数的自变量进行拷贝。集合表达式也可以使用相等或不等操作符进行比较。为了进行拷贝或比较,集合表达式的类型必须是赋值兼容的。参见5.8.2 赋值兼容 。
7.17 操作符过载有多种算术算法可能非常有用:饱和算法,任意尺寸的浮点数运算,进位保留算法等。使用普通的算术操作符而不是依赖于函数调用有利于代码的可读性。
7.18 流操作符(压缩/非压缩)在3.16节描述了位流强制类型转换,当转换操作可以仅仅使用一个强制类型转换方便地表达,并且位流的特定顺序并不重要的时候,这种方法最为有用。然而,有时位流需要匹配于一个特定的组织形式。流操作符将位流类型(参见3.16节)以用户指定的顺序压缩到一个位序列当中。当流操作符使用在表达式左侧的时候,它执行相反的操作:将位流解压缩成一个或多个变量。如果正在被压缩的数据包含任何四态类型,那么压缩操作的结果是四态类型,否则,结果为两态类型。将四态类型的位流解压缩成两态类型变量是通过一个向两态变量的强制类型转换实现的,反之亦然。

位流串联的语法如下:
7.19 条件操作符
7.20 集合成员资格SystemVerilog支持单一值集合以及集合成员资格操作符。

集合成员资格操作符的语法如下:
链接 主题

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

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

发布评论

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