第1章 综述
1.1范围
本标准为IEEE 1800™SystemVerilog语言提供了语法和语义的定义,这是一种统一的硬件设计、规范和验证语言。该标准包括对行为级、寄存器传输级(RTL)和门级硬件描述、testbentch、coverage、assertion、面向对象和约束随机结构的支持,并且还为外部编程语言提供应用程序编程接口(api) 的支持。
1.2 目标
本标准开发了IEEE 1800 SystemVerilog语言,以满足该语言在硬件规范、设计和验证中的日益增长的使用。此修订版更正了IEEE Std 1800-2012.1中语言定义的错误并澄清了各个方面。此修订版还提供了增强的功能,以简化设计,改进验证并增强跨语言交互。
1.3 内容概述
该标准作为SystemVerilog语言的完整规范。本标准包含以下内容:
—所有SystemVerilog constructs的形式化语法和语义
—仿真系统任务和系统功能,如文本输出显示命令
—编译器指令,如文本替换宏和仿真时间缩放
—编程语言接口(PLI)机制
—SystemVerilog验证过程接口(VPI)的形式化语法和语义
—用于coverage access的应用程序编程接口(API)不包括在VPI中
—用于与C编程语言互操作的直接编程接口(DPI)
—VPI, API和DPI头文件
—并发断言形式化语义
—标准延迟格式(SDF)构造的形式化语法和语义
—使用示例
1.4 特别术语
在整个标准中,以下术语适用:
—SystemVerilog 3.1a指的是the Accellera SystemVerilog 3.1a Language Reference Manual [B4],是IEEE标准1800-2005.4的先驱
—Verilog指的是IEEE标准1364-2005中的Verilog硬件描述语言(HDL)。
—LRM (Language Reference Manual)是描述Verilog或SystemVerilog标准的文档。—Tool是指读取SystemVerilog源代码的软件实现,如logic simulator。
1.5本标准中的一些约定
该标准以clause的形式呈现,每个clause都侧重于语言的一个特定领域。每个clause中都有subclause来讨论单个结构和概念。一般是先介绍基本概念,然后是语法和语义描述,然后是示例和注释。本标准中使用的术语惯例如下:
—“shall”一词用于表示严格遵守的强制性要求,以符合标准,并且不允许偏离(应等于要求)。
—“should”一词用来表示在几种可能性中推荐一种特别合适,而不提及或排除其他可能性;或者某一行动方案是首选的,但不一定是必需的;或者(在否定形式中)不赞成但不禁止某种行为(should =recommended)。
—“may”一词用于表示在标准范围内允许的行为过程(“may”=“permit”)。
— can这个词用于描述可能性和能力,无论是物质的、物理的还是因果的(can=is able to)。
1.6 语法描述
文中使用以下约定:
—定义术语时使用斜体字体
—示例、文件名和引用常量(特别是0、1、x和z值)时使用恒宽字体
—SystemVerilog关键字时使用恒宽字体,引用实际关键字时使用黑体字体
SystemVerilog的正式语法使用Backus-Naur形式(BNF)进行描述。使用以下约定:
—小写单词(其中一些包含下划线)表示语法类别。例如:
module_declaration
—粗体红色字符表示保留关键字、操作符和标点符号,作为语法的必需部分。例如:
module => ;
—非黑体红色的竖线(|)分隔可选项目。例如:
unary_operator ::=
+ | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~
—非黑体红色的方括号([])将可选项括起来。例如:
function_declaration ::= function [ lifetime ] function_body_declaration
—非黑体红色的大括号({})将重复项括起来。该项目可以出现零次或多次;重复从左到右发生,与等效的左递归规则相同。因此,以下两条规则是等价的:
list_of_param_assignments ::= param_assignment { , param_assignment }
list_of_param_assignments ::=
param_assignment
| list_of_param_assignments , param_assignment
语法中的限定词是像array_identifier这样的术语,其中“array”部分表示某种语义意图,“identifier”术语表示限定词在语法中简化为“identifier”术语。语法并没有完全定义这些限定词的语义;例如,虽然在语义上符合array_identifier的标识符是由声明创建的,但这种声明形式没有在语法中使用array_identifier显式描述。
1.7 标准中颜色的使用
这个标准使用了最少的颜色来增强可读性。当以纯黑色和白色观看时,着色不是必需的,也不会影响本标准的准确性。使用颜色的地方如下:
—与本标准其他部分超链接的交叉引用以蓝色下划线显示(当本标准以PDF文件的形式交互式查看时,超链接有效)。
—形式语言定义中的语法关键字和标记以红色粗体显示。
—一些数字使用少量的颜色,以提高可读性。
1.8 标准的内容
现提供各clause和附件的摘要,供快速参考。所有clause和若干附件是本标准的规范性部分。有些附件仅供参考。
第一部分:设计和验证结构
Clause1描述了本标准的内容和在本标准中使用的约定。
Clause2列出了实施本标准所需的其他标准的参考资料。
Clause3介绍了构成SystemVerilog设计和验证环境的主要构建块:module、program、interface、checker、package和configuration。这个clause还讨论了primitives、name space、$unit编译空间和simulation time的概念。
Clause4描述了SystemVerilog仿真调度语义。
Clause5描述了SystemVerilog源文本中使用的词法标记及其约定。
Clause6描述了SystemVerilog数据对象和类型,包括net和变量,它们的声明语法和使用规则,以及net上值的电荷强度。这个clause还讨论了字符串和字符串方法、枚举类型、用户定义类型、常量、数据作用范围和类型兼容性。
Clause7描述了SystemVerilog复合数据类型:结构、联合、数组(包括packed和unpackes)、动态数组、关联数组和队列。这个clause还描述了各种数组方法。
Clause8描述了SystemVerilog中面向对象的编程能力。主题包括定义类、接口类、动态构造对象、继承和子类、数据隐藏和封装、多态性和参数化类。
Clause9描述了SystemVerilog过程块:initial、always、always_comb、always_ff、always_latch和final。还描述了顺序和并行语句分组、块名称、语句标签和过程控制。
Clause10描述了连续赋值、阻塞和非阻塞赋值以及程序连续赋值。
Clause11描述了表达式中可使用的操作符和操作数。
Clause12描述了SystemVerilog过程编程语句,例如决策语句和循环结构。
Clause13描述了任务和函数,它们是行为模型中可以从多个地方调用的子程序。
Clause14定义了clocking block、input and output skews, cycle delays, and default clocking。
Clause15描述了使用event类型和event控制以及内建semaphore和mailbox类进行进程间通信。
Clause16描述了即时和并发断言、properity、sequence、多锁sequence和clock解析。
Clause17描述了checker。checker允许封装断言和建模代码以创建单个验证实体。
Clause18描述了随机数的生成、约束随机数的生成、动态改变约束、播种随机数生成器(rng)和随机case语句的执行。
Clause19描述了covergroup、coverpoint、交叉覆盖、覆盖选项和覆盖方法。
Clause20描述了大多数内置的系统任务和系统功能。
Clause21描述了特定于输入/输出(I/O)操作的附加系统任务和系统功能。
Clause22描述了各种编译器指令,包括用于控制先前Verilog和SystemVerilog标准版本之间保留关键字兼容性的指令。
第二部分:hoerarchy结构
Clause23描述了如何在SystemVerilog中使用模块实例和接口实例以及端口连接规则创建层次结构。还讨论了$root顶级实例、嵌套模块、extern模块、标识符搜索规则、如何覆盖参数值,以及将辅助代码绑定到范围或实例。
Clause24描述了testbentch程序结构、testbentch竞争条件的消除以及程序控制任务。
Clause25描述了接口语法、接口端口、模块端口、接口子程序、参数化接口、虚拟接口以及接口内的访问对象。
Clause26描述了用户定义包和std内置包。
Clause27描述了生成构造以及如何使用生成的构造对过程代码或层次结构进行条件实例化或多个实例化。
Clause28描述了门级和开关级原语以及逻辑强度建模。
Clause29描述了如何定义用户定义的原语(UDP),以及如何将这些原语包含在SystemVerilog模型中。
Clause30描述如何指定模块的输入和输出端口之间的时序关系。
Clause31描述了如何在指定块中使用时序检查来确定信号是否服从时序约束。
Clause32描述了SDF结构的语法和语义。
Clause33描述了如何配置设计的内容。
Clause34描述了源文本区域的加密和解密
第三部分:程序接口应用
Clause35描述了SystemVerilog的直接编程接口(DPI),这是一个与外部语言连接的接口,以及从外部语言中导入函数和将子程序导出为外部语言的语法。
Clause36提供了编程语言接口(PLI和VPI)的概述。
Clause37给出了VPI数据模型图,它记录了VPI对象关系和访问方法。
Clause38描述了VPI例程。
Clause39描述了SystemVerilog中的断言API。
Clause40描述了SystemVerilog中的覆盖率API。
第四部分:附录
附录A(规范)使用BNF定义了SystemVerilog的形式语法。
附录B(规范)列出了SystemVerilog关键字。
附录C(信息)列出了SystemVerilog已弃用的构造。附录还讨论了可能弃用的defparam语句和过程式赋值/解赋值语句。
附录D(信息)描述了经常使用的系统任务和系统功能,但在本标准中没有要求。
附录E(信息)描述了经常使用的编译器指令,但在本标准中不是必需的。
附录F(规范)描述了SystemVerilog并发断言的形式化语义。
附件G(规范)描述了SystemVerilog标准包,包含mailbox、semaphore、随机化和process的类型定义。
附录H(规范)定义了SystemVerilog DPI的C语言层。
附件I(规范)定义了SystemVerilog DPI应用程序使用的标准svdpi.h包含文件。
附录J(规范性)描述了将外部语言代码包含到SystemVerilog应用程序中的通用指南。
附录K(规范)提供了vpi_user.h文件的内容列表。
附录L(规范)提供了vpi_compatibility.h文件的内容列表,该文件扩展了vpi_user.h include文件。
附录M(规范)提供了sv_vpi_user.h文件的内容清单,它扩展了vpi_user.h文件。
附录N(规范)提供了SystemVerilog随机分布系统函数的C源代码。
附录O(信息)描述了可用于知识产权(IP)保护的各种场景,还展示了如何使用相关的实用程序来实现安全保护、分发和解密模型的预期效果。
附录P(参考)定义了本标准中使用的术语。
附件Q(参考)列出了与本标准相关的参考文件。
1.9 启用的clauses
附录C列出了出现在IEEE Std 1364或IEEE Std 1800以前版本中,但已弃用且不在本标准中出现的结构。本附件还列出了在本标准中出现,但在本标准的未来版本中正在考虑弃用的构造。
1.10例子
小型SystemVerilog代码示例贯穿本标准。这些例子很有用。它们旨在说明SystemVerilog结构在简单上下文中的用法,而不定义完整的语法。
1.11前提条件
本标准的某些条款以具备C编程语言的工作知识为前提。