- 第一章 SystemVerilog导论
- 第二章 文本值
- 第三章 数据类型
- 第四章 数组
- 第五章 数据声明
- 第六章 属性
- 第七章 操作符与表达式
- 第八章 过程语句和控制流
- 第九章 进程
- 第十章 任务与函数
- 第十一章 类
- 第十二章 随机约束
- 第十三章 进程间的同步与通信
- 第十四章 调度语义
- 第十五章 时钟控制块
- 第十六章 程序块
- 第十七章 断言
- 第十八章 层次
- 第十九章 接口
- 第二十章 覆盖
- 第二十一章 参数
- 第二十二章 配置库
- 第二十三章 系统任务与系统函数
- 23.1 简介(一般信息)
- 23.2 确立时的typeof函数
- 23.3 typename函数
- 23.4 表达式尺寸系统函数
- 23.5 范围系统函数
- 23.6 Shortreal转换
- 23.7 数组查询系统函数
- 23.8 断言严重性系统任务
- 23.9 断言控制系统任务
- 23.10 断言系统函数
- 23.11 随机数系统函数
- 23.12 程序控制
- 23.13 覆盖系统函数
- 23.14 对Verilog-2001系统任务的增强
- 23.15 $readmemb与$readmemh
- 23.16 $writememb and $writememh
- 23.17 File format considerations for multi-dimensional unpacked arrays
- 23.18 System task arguments for multi-dimensional unpacked arrays
- 第二十四章 VCD数据
- 第二十五章 编译器指令
- 第二十六章 考虑从SystemVerilog中删除的功能
- 第二十七章 直接编程接口(DPI)
- 27.1 概述
- 27.2 Two layers of the DPI
- 27.3 Global name space of imported and exported functions
- 27.4 导入的任务和函数
- 27.5 Calling imported functions
- 27.6 Exported functions
- 27.7 Exported tasks
- 27.8 Disabling DPI tasks and functions
- 第二十八章 SystemVerilog断言API
- 第二十九章 SystemVerilog覆盖API
- 29.1 需求
- 29.2 SystemVerilog real-time coverage access
- 29.3 FSM recognition
- 29.3.1 Specifying the signal that holds the current state
- 29.3.2 Specifying the part-select that holds the current state
- 29.3.3 Specifying the concatenation that holds the current state
- 29.3.4 Specifying the signal that holds the next state
- 29.3.5 Specifying the current and next state signals in the same declaration
- 29.3.6 Specifying the possible states of the FSM
- 29.3.7 Pragmas in one-line comments
- 29.3.8 Example
- 29.4 VPI coverage extensions
- 第三十章 SystemVerilog数据读API
- 30.1 简介(一般信息)
- 30.2 需求
- 30.3 Extensions to VPI enumerations
- 30.4 VPI object type additions
- 30.5 Object model diagrams
- 30.6 Usage extensions to VPI routines
- 30.7 VPI routines added in SystemVerilog
- 30.8 Reading data
- 30.9 Optionally unloading the data
- 30.10 Reading data from multiple databases and/or different read library providers
- 30.11 VPI routines extended in SystemVerilog
- 30.12 VPI routines added in SystemVerilog
- 30.12.1 VPI reader routines
- 第三十一章 SystemVerilog VPI Object Model
- 31.1 简介(一般信息)
- 31.2 Instance
- 31.3 Interface
- 31.4 Program
- 31.5 Module (supersedes IEEE 1364-2001 26.6.1)
- 31.6 Modport
- 31.7 Interface tf decl
- 31.8 Ports (supersedes IEEE 1364-2001 26.6.5)
- 31.9 Ref Obj
- 31.9.1 Examples
- 31.10 Variables (supersedes IEEE 1364-2001 section 26.6.8)
- 31.11 Var Select (supersedes IEEE 1364-2001 26.6.8)
- 31.12 Typespec
- 31.13 Variable Drivers and Loads (supersedes IEEE 1364-2001 26.6.23)
- 31.14 Instance Arrays (supersedes IEEE 1364-2001 26.6.2)
- 31.15 Scope (supersedes IEEE 1364-2001 26.6.3)
- 31.16 IO Declaration (supersedes IEEE 1364-2001 26.6.4)
- 31.17 Clocking Block
- 31.18 Class Object Definition
- 31.19 Constraint, constraint ordering, distribution,
- 31.20 Constraint expression
- 31.21 Class Variables
- 31.22 Structure/Union
- 31.23 Named Events (supersedes IEEE 1364-2001 26.6.11)
- 31.24 Task, Function Declaration (supersedes IEEE 1364-2001 26.6.18)
- 31.25 Alias Statement
- 31.25.1 Examples
- 31.26 Frames (supersedes IEEE 1364-2001 26.6.20)
- 31.27 Threads
- 31.28 tf call (supersedes IEEE 1364-2001 26.6.19)
- 31.29 Module path, path term (supersedes IEEE 1364-2001 26.6.15)
- 31.30 Concurrent assertions
- 31.31 Property Decl
- 31.32 Property Specification
- 31.33 Multiclock Sequence Expression
- 31.34 Sequence Declaration
- 31.35 Sequence Expression
- 31.36 Attribute (supersedes IEEE 1364-2001 26.6.42)
- 31.37 Atomic Statement (supersedes IEEE 1364-2001 26.6.27)
- 31.38 If, if else, return, case, do while (supersedes IEEE 1364-2001 26.6.35, 26.6.36)
- 31.39 waits, disables, expect, foreach (supersedes IEEE 1364 26.6.38)
- 31.40 Simple expressions (supersedes IEEE 1364-2001 26.6.25)
- 31.41 Expressions (supersedes IEEE 1364-2001 26.6.26)
- 31.42 Event control (supersedes IEEE 1364-2001 26.6.30)
- 31.43 Event stmt (supersedes IEEE 1364-2001 26.6.27)
- 31.44 Process (supersedes IEEE 1364-2001 26.6.27)
- 31.45 Assignment (supersedes IEEE 1364-2001 26.6.28)
- 附录A 形式语法
- A.1 源文本
- A.2 声明
- A.3 Primitive instances
- A.4 Module, interface and generated instantiation
- A.5 UDP declaration and instantiation
- A.6 Behavioral statements
- A.6.1 Continuous assignment and net alias statements
- A.6.2 Procedural blocks and assignments
- A.6.3 Parallel and sequential blocks
- A.6.4 Statements
- A.6.5 Timing control statements
- A.6.6 Conditional statements
- A.6.7 Case statements
- A.6.8 Looping statements
- A.6.9 Subroutine call statements
- A.6.10 Assertion statements
- A.6.11 Clocking block
- A.6.12 Randsequence
- A.7 Specify section
- A.8 Expressions
- A.9 General
- A.10 Footnotes (normative)
- 附录B 关键字
- 附录C 标准包
- 附录D 链表
- 附录E DPI C-layer
- E.1 概述
- E.2 Naming conventions
- E.3 Portability
- E.4 Include files
- E.5 Semantic constraints
- E.6 Data types
- E.7 Argument passing modes
- E.8 Context tasks and functions
- E.9 Include files
- E.10 Arrays
- E.11 Open arrays
- E.11.1 Actual ranges
- E.11.2 Array querying functions
- E.11.3 Access functions
- E.11.4 Access to the actual representation
- E.11.5 Access to elements via canonical representation
- E.11.6 Access to scalar elements (bit and logic)
- E.11.7 Access to array elements of other types
- E.11.8 Example 4— two-dimensional open array
- E.11.9 Example 5 — open array
- E.11.10 Example 6 — access to packed arrays
- E.11.11 Example 7 — binary compatible calls of exported functions
- 附录F 包含文件
- 附录G 包含外部语言代码
- 附录H 并发断言的形式语义
- 附录I svvpiuser.h
- 附录J 术语表
- 附录K 参考书目
- 其他
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
第七章 操作符与表达式
主题
链接 主题
主题 | 描述 |
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 )的时候,我们使用这个概念。本节余下的部分定义由什么组成了一个选择片的最长静态前缀。 域选择被定义成一个层次化的名字,其中最后一个层次分割符(“.”)的右侧标识了类型为结构体或联合体的变量的一个域。域选择前缀被定义成域选择中最后一个层次分割符左侧的部分。 一个索引选择是一个单纯的索引操作。索引选择前缀或者是一个标识符或者是另外一个索引选择(在多维选择的情况下)。数组选择、位选择、部分选择、以及索引部分选择都是索引选择的例子。 静态前缀的定义是递归的并且具有如下的定义:
例子: |
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论