IEEE Standard for SystemVerilog—Unified Hardware Design, Specification, and Verification Language笔记第1章
概要
标准概述:
标准范围:定义了SystemVerilog语言的语法和语义,支持行为级、寄存器传输级(RTL)和门级硬件描述。
标准目的:满足硬件规格、设计和验证中日益增长的SystemVerilog语言使用需求,修订了IEEE Std 1800-2012中的错误,并提供了增强的特性。
内容总结:
语言结构:包括SystemVerilog的所有构造的正式语法和语义。
系统任务和函数:如文本输出显示命令。
编译器指令:如文本替换宏和仿真时间缩放。
接口:提供了PLI、VPI和DPI机制,以及用于覆盖率访问的API。
语言特性:
硬件描述支持:支持RTL和门级描述,以及测试平台、覆盖率、断言、面向对象和约束随机构造。
面向对象编程:支持类的定义、继承、数据隐藏、封装和多态。
并发断言:提供了并发断言的形式语义。
标准组织与使用:
文档结构:标准被组织成多个条款,每个条款专注于语言的特定区域。
术语和约定:使用“shall”、“should”、“may”和“can”等词汇来指示要求的严格性。
颜色使用:在PDF版本中,使用颜色来增强可读性,但并非必需。
数据对象和类型:
数据类型:包括网络(nets)和变量(variables),以及它们的声明语法和使用规则。
复合数据类型:结构、联合、数组(包括打包和非打包数组、动态数组、关联数组和队列)。
程序控制结构:
过程块:如initial、always、always_comb、always_ff等。
控制语句:决策语句(如if、case)和循环构造(如for、while)。
高级特性:
断言:即时和并发断言,用于验证硬件设计的正确性。
覆盖率分析:支持覆盖率组和覆盖点,用于验证的完整性。
随机数生成:提供约束随机数生成和随机化案例语句执行。
接口和通信:
接口和模端口:用于模块间通信的标准化方式。
事件和进程通信:使用事件类型、事件控制、内置信号量和邮箱类。
编译指令和工具接口:
编译器指令:如文本替换和仿真时间控制。
PLI/VPI/DPI接口:提供与其他编程语言的交互能力。
附录和参考:
附录:包括正式语法、关键字列表、已弃用的构造、常用系统任务和函数、编译器指令等。
参考文档:列出与标准相关的其他文档。
内容:
1. 概述
1.1 范围
本标准提供了IEEE 1800™ SystemVerilog语言的语法和语义的定义,这是一种统一的硬件设计、规范和验证语言。该标准支持行为级、寄存器传输级(RTL)和门级硬件描述;测试平台、覆盖率、断言、面向对象和约束随机构造;并提供与外语言编程接口的应用程序编程接口(APIs)。
1.2 目的
本标准开发了IEEE 1800 SystemVerilog语言,以满足在硬件规格、设计和验证中对该语言日益增长的需求。此修订版纠正了IEEE Std 1800-2012中的错误,并对语言定义的某些方面进行了澄清。此修订版还提供了增强的特性,以简化设计、改进验证并增强跨语言交互。
1.3 内容概要
本标准作为SystemVerilog语言的完整规范,包含以下内容:
- SystemVerilog所有构造的正式语法和语义
- 模拟系统任务和系统函数,如文本输出显示命令
- 编译器指令,如文本替换宏和仿真时间缩放
- 编程语言接口(PLI)机制
- SystemVerilog验证过程接口(VPI)的正式语法和语义
- VPI中未包含的覆盖率访问的应用程序编程接口(API)
- 并发断言的形式语义
- 标准延迟格式(SDF)构造的正式语法和语义
- 信息性使用示例
注意:早期标准IEEE Std 1800-2009代表了两个先前标准的合并:IEEE Std 1364™-2005和IEEE Std 1800-2005。在之前的标准中,Verilog®是基本语言,并定义了一个完全独立的标准。SystemVerilog为Verilog定义了许多重要的扩展,但IEEE Std 1800-2005并不是一个独立的标准;它依赖于IEEE Std 1364-2005。这两个标准被设计为作为一种语言使用。将基本Verilog语言合并到SystemVerilog标准中,使用户能够在一个文档中获取所有关于语法和语义的信息。
1.4 特殊术语
在本标准中,适用以下术语:
- SystemVerilog 3.1a 指的是Accellera SystemVerilog 3.1a语言参考手册[B4],它是IEEE Std 1800-2005的前身。
- Verilog 指的是IEEE Std 1364-2005针对Verilog硬件描述语言(HDL)的标准。
- 语言参考手册(LRM)指的是描述Verilog或SystemVerilog标准的文档。
- 工具指的是读取SystemVerilog源代码的软件实现,如逻辑模拟器。
注意:在IEEE Std 1800-2005中,SystemVerilog仅指对IEEE 1364-2005 Verilog语言的扩展,并不包括Verilog基础语言。
1.5 本标准中使用的约定
本标准被组织成各个条款,每个条款都专注于语言的特定区域。每个条款内部包含子条款,用于讨论单独的构造和概念。讨论从引言和该构造或概念的可选原理开始,随后是语法和语义描述,最后是示例和注释。
贯穿本标准的术语约定如下:
- “shall”一词用于指示必须严格遵守的要求,以符合标准,且不允许有任何偏差(shall等于is required to)。
- “should”一词用于指示在几种可能性中推荐其中一种作为特别适合的选择,而不提及或排除其他选择;或者表示某种行动方式被推荐但不是必需的;或者(在否定形式中)表示某种行动方式被弃用但不禁止(should等于is recommended that)。
- “may”一词用于指示在标准限制内允许的行动方式(may等于is permitted to)。
- “can”一词用于陈述可能性和能力,无论是物质上的、物理上的还是因果上的(can等于is able to)。
注意:文本、表格和图形中的注释仅供信息参考,并不包含实现标准所需的要求。
1.6 语法描述
本标准在主文本中使用以下约定进行语法描述:
- 术语定义:当定义术语时,使用斜体字体。
- 示例、文件名和常量引用:使用等宽字体,特别是对于示例代码、文件名以及对常量(如0、1、x、z值)的引用。
- SystemVerilog关键字:当引用实际的SystemVerilog关键字时,使用粗体等宽字体。
SystemVerilog的正式语法使用巴科斯-诺尔范式(Backus-Naur Form,BNF)进行描述。以下是在语法描述中使用的约定:
-
小写单词:某些包含下划线的小写单词表示语法类别。例如:
list_of_param_assignments
-
粗体红色字符:表示保留的关键字、运算符和标点符号,作为语法的一部分。例如:
+ | - | ! | ~ | & | ...
(这里省略了其他运算符以节省空间)
-
竖线(|):不在粗体红色中的竖线用于分隔替代项。例如:
param_assignment | list_of_param_assignments , param_assignment
-
方括号([]):不在粗体红色中的方括号用于包围可选项。例如:
[optional_item]
-
大括号({}):不在粗体红色中的大括号用于包围重复项,该项可以出现零次或多次,重复从左到右发生,类似于等效的左递归规则。例如:
{item}
等价于item | item item | item item item | ...
请注意,语法中的限定词(如array_identifier
)在某些上下文中具有语义意图,但语法本身并不完全定义这些限定词的语义。例如,虽然通过声明可以创建在语义上可视为array_identifier
的标识符,但这种声明形式在语法中并不显式地使用array_identifier
来描述。
1.7 本标准中颜色的使用
本标准使用极少量的颜色以增强可读性。颜色不是必需的,并且不会影响在纯黑白视图中查看本标准的准确性。颜色使用的地方包括:
- 超链接:以蓝色下划线文本显示与其他标准部分的超链接(当以交互方式(如PDF文件)查看时,超链接功能有效)。
- 语法关键字和标记:在正式语言定义中,以粗体红色文本显示语法关键字和标记。
- 图表:某些图表使用极少量颜色以增强可读性。
1.8 本标准的内容
本标准内容的概要作为快速参考呈现如下。所有条款以及部分附录是本标准的规范性部分。一些附录仅包含信息性内容。
第一部分:设计和验证构造
- 第1章:描述本标准的内容以及本标准中使用的约定。
- 第2章:列出实现本标准所需引用的其他标准。
- 第3章:介绍构成SystemVerilog设计和验证环境的主要构建块:模块、程序、接口、检查器、包和配置。本条还讨论了基本元素、命名空间、
$unit
编译空间以及仿真时间的概念。 - 第4章:描述SystemVerilog仿真调度语义。
- 第5章:描述SystemVerilog源代码中使用的词法标记及其约定。
- 第6章:描述SystemVerilog数据对象和类型,包括网络和变量、它们的声明语法和使用规则,以及网络上值的电荷强度。本条还讨论了字符串和字符串方法、枚举类型、用户定义类型、常量、数据范围和生命周期以及类型兼容性。
- 第7章:描述SystemVerilog复合数据类型:结构体、联合体、数组(包括打包数组和解包数组、动态数组、关联数组和队列)。本条还描述了各种数组方法。
- 第8章:描述SystemVerilog中的面向对象编程能力。主题包括定义类、接口类、动态构造对象、继承和子类、数据隐藏和封装、多态性以及参数化类。
- 第9章:描述SystemVerilog的过程块:
initial
、always
、always_comb
、always_ff
、always_latch
和final
。还描述了顺序和并行语句分组、块名称、语句标签和过程控制。 - 第10章:描述连续赋值、阻塞和非阻塞过程赋值以及过程连续赋值。
- 第11章:描述在表达式中可以使用的运算符和操作数。
- 第12章:描述SystemVerilog过程编程语句,如决策语句和循环结构。
- 第13章:描述任务和函数,这些是从行为模型中多个位置可以调用的子程序。
- 第14章:定义时钟块、输入和输出偏斜、周期延迟以及默认时钟。
- 第15章:描述使用事件类型和事件控制以及内置信号量和邮箱类的进程间通信。
- 第16章:描述即时和并发断言、属性、序列、序列操作、多时钟序列和时钟解析。
- 第17章:描述检查器。检查器允许将断言和建模代码封装成一个单独的验证实体。
- 第18章:描述生成随机数、约束随机数生成、动态更改约束、为随机数生成器(RNG)播种以及随机情况语句执行。
- 第19章:描述覆盖率组、覆盖率点、交叉覆盖率、覆盖率选项和覆盖率方法。
- 第20章:描述大多数内置的系统任务和系统函数。
- 第21章:描述特定于输入/输出(I/O)操作的附加系统任务和系统函数。
- 第22章:描述各种编译器指令,包括控制不同版本Verilog和SystemVerilog标准之间保留关键字兼容性的指令。
第二部分:层次结构构造
- 第23章:描述如何在SystemVerilog中使用模块实例和接口实例创建层次结构,以及端口连接规则。本条还讨论了
$root
顶层实例、嵌套模块、外部模块、标识符搜索规则、如何覆盖参数值以及如何将辅助代码绑定到作用域或实例。 - 第24章:描述测试台程序构造、消除测试台竞态条件以及程序控制任务。
- 第25章:描述接口语法、接口端口、modports、接口子程序、参数化接口、虚拟接口以及访问接口内的对象。
- 第26章:描述用户定义的包和
std
内置包。 - 第27章:描述
generate
构造以及如何使用生成的构造来做条件性或多实例化过程代码或层次结构。 - 第28章:描述门级和开关级原语以及逻辑强度建模。
- 第29章:描述如何定义用户定义的原语(UDP)以及这些原语如何包含在SystemVerilog模型中。
- 第30章:描述如何指定模块输入输出端口之间的时序关系。
- 第31章:描述如何使用
specify
块中的时序检查来确定信号是否遵守时序约束。 - 第32章:描述SDF构造的语法和语义。
- 第33章:描述如何配置设计内容。
- 第34章:描述源代码区域的加密和解密。
第三部分:应用编程接口
- 第35章:描述SystemVerilog的直接编程接口(DPI),这是与外语的直接接口以及从外语导入函数和向外语导出子程序的语法。
- 第36章:提供编程语言接口(PLI和VPI)的概述。
- 第37章:展示VPI数据模型图,记录VPI对象关系和访问方法。
- 第38章:描述VPI例程。
- 第39章:描述SystemVerilog中的断言API。
- 第40章:描述SystemVerilog中的覆盖率API。
第四部分:附录
附录A(规范性):使用巴科斯-诺尔范式(BNF)定义了SystemVerilog的正式语法。
附录B(规范性):列出了SystemVerilog的关键字。
附录C(信息性):列出了已从SystemVerilog中弃用的构造。该附录还讨论了defparam
语句以及过程性的assign/deassign
语句可能弃用的情况。
附录D(信息性):描述了经常使用的系统任务和系统函数,但这些内容并非本标准所必需。
附录E(信息性):描述了经常使用的编译器指令,但这些指令并非本标准所必需。
附录F(规范性):描述了SystemVerilog并发断言的形式语义。
附录G(规范性):描述了SystemVerilog标准包,其中包含用于邮箱、信号量、随机化和进程的类型定义。
附录H(规范性):定义了SystemVerilog DPI的C语言层。
附录I(规范性):定义了用于SystemVerilog DPI应用程序的标准svdpi.h
头文件。
附录J(规范性):描述了将外语代码包含到SystemVerilog应用程序中的通用指南。
附录K(规范性):提供了vpi_user.h
文件内容的列表。
附录L(规范性):提供了vpi_compatibility.h
文件内容的列表,该文件扩展了vpi_user.h
头文件。
附录M(规范性):提供了sv_vpi_user.h
文件内容的列表,该文件也扩展了vpi_user.h
头文件。
附录N(规范性):提供了SystemVerilog随机分布系统函数的C源代码。
附录O(信息性):描述了可用于知识产权(IP)保护的各种场景,并展示了如何使用相关的编译指示(pragmas)来实现模型的安全保护、分发和解密。
附录P(信息性):定义了本标准中使用的术语。
附录Q(信息性):列出了与本标准相关的参考文档。
这些附录为理解和实现SystemVerilog标准提供了重要的补充信息和指导。请注意,规范性附录是标准的一部分,必须遵守;而信息性附录则提供了额外的背景、建议和解释,但并非强制性的要求。
1.9 弃用条款
本标准附录C列出了在IEEE Std 1364或IEEE Std 1800的早期版本中出现,但已被弃用且未出现在本标准中的构造。该附录还列出了出现在本标准中,但正在考虑在未来版本的标准中弃用的构造。弃用的构造可能因技术更新、与其他标准的兼容性、减少冗余或简化语言复杂性等原因而被移除。设计者和验证工程师应关注这些潜在的弃用变化,以确保其设计和验证代码与未来的标准版本兼容。
1.10 示例
本标准中穿插了多个SystemVerilog代码示例。这些示例是信息性的,旨在简单上下文中展示SystemVerilog构造的用法,而非定义完整的语法。它们帮助读者理解和应用标准中描述的各个语言特性,如数据类型、操作符、控制流语句等。这些示例对于初学者来说特别有用,因为它们提供了将抽象概念转化为实际代码的直接方式。
1.11 先决条件
本标准的某些条款预设了读者对C编程语言有基本的工作知识。由于SystemVerilog提供了与C语言的直接编程接口(DPI),能够理解C语言的基本语法和概念对于充分利用SystemVerilog的DPI功能至关重要。此外,对C语言的熟悉还有助于理解SystemVerilog中与内存管理、数据类型和函数调用相关的某些方面。因此,建议读者在使用本标准之前,先具备C编程语言的基础知识。