中文版首发由
空白的贝塔君
整理发布
第一章 关于本文档
1.1 概要
本文档是对systemverilog使用库svlib
的说明和编程指导。
1.2 版本信息
版本号 | 日期 | 作者 | 说明 |
---|---|---|---|
0.0 | 2014.02.10 | J Bromley | Initial release for discussion |
0.1 | 2014.02.23 | J Bromley | Working towards a first release |
0.2 | 2014.03.02 | J Bromley | All sections present, ready for initial release. Some explanatory text is still missing. |
0.3 | 2014.06.05 | J Bromley | Fix issues #18, #19 and various other minor errors. Complete most of the text. |
0.4 | 2015.01.04 | J Bromley | Fix issues #20, #21, #22. |
0.5 | 2015.07.14 | J Bromley | Fixes #24, #27, #28, #29, #31 |
1.3 版权信息
本文版权所有©Verilab Inc. 2014-2015
。本文作为svlib
使用库的附加信息。本文件允许无限复制,但必须包括第1节的全部内容,不得修改。
1.3.1 责任限制
Verilab
公司对该软件包的运行不承担任何责任。如果你想使用它,你将自行承担全部责任。
1.3.2 作者
这份文件是由Jonathan Bromley
、Paul Marriott
和André Winkelmann
在Verilab, Inc
(www.verilab.com
)完成的。
1.3.3 开源许可
svlib是一个开放源代码包,所以您可以*地使用源代码并以任何您想要的方式修改它。为了方便使用,本文档以PDF格式提供,因此并不是严格的开源。原始的可编辑文档可根据要求从作者处获得。
1.4 作者联系方式
可以通过电子邮件地址svlib@verilab.com
联系此软件包和文档的作者。作者很高兴收到意见与建议,并尽可能迅速回复。
第二章 简介与概述
本文档介绍了systemverilog的实用程序库svlib。svlib为我们的日常验证工作提供了SystemVerilog所缺乏的功能:字符串处理、操作系统接口和许多其他有用的函数。
- 第三章介绍了如何在仿真器和你的验证环境中使用svlib
- 第四章介绍了了svlib的一些基本原则和规则。
- 第五章介绍了svlib的特性,这些特性补充了SystemVerilog语言中所没有的字符串处理与操作。
- 第六章介绍了正则匹配与替换的特性。
- 第七章给出了Pathname类的详细信息,借助这个类,可以更加简单的进行常见的文件操作,例如确定目录、根据目录生成路径名、查找文件的扩展名等。这些操作只是专用的字符串函数,并不能对文件系统进行任何读写。
- 第八章介绍了用于查询文件系统的svlib工具。通过这些函数可以查询文件的属性,如“这个文件存在吗”,“文件最后修改的日期是什么”,“是否拥有写权限”,“它是一个目录”和许多其他属性。
- 第九章介绍了操作系统查询函数。通过这些函数可以轻松地获取当前时间和日期,以各种人类可读的格式呈现日期,获取操作系统的环境变量,以字符串队列的形式获取目录内容,并读取计时器。
- 第十章讨论如何在svlib中处理错误。默认情况下,错误会报告在模拟器的控制台,但通过svlib可以以各种方式自定义错误处理,甚至可以通过自己的SystemVerilog代码处理错误。
- 第十二章详细介绍了支持以.ini或YAML格式读写配置文件的类和函数,并说明了如何在自定义配置类和svlib的内部文档对象模型(DOM)表示之间传输配置数据。
- 第十三章介绍了一个通过运行仿真来查询仿真环境的功能。
- 第十四章介绍了一些实用的函数,这些函数优化了SystemVerilog枚举类型的使用体验。
- 第十五章介绍了以SystemVerilog宏的形式提供的一些实用特性。
- 最后,第十六章提供了一些示例,展示了svlib工具的实际应用。
第三章 编译并运行svlib
svlib代码分为三个不同的部分,都可以src/目录中找到:
- 宏定义,如果想使用宏相关的功能,请在代码中添加``include "svlib_macros.svh"`
- systemverilog代码,已经打包成一个
svlib_pkg
,使用前需要用编译器编译svlib_pkg.sv
文件 - C代码,通过systemverilog DPI调用,包含了多个库,目前打包成了一个文件
dpi/svlib_dpi.c
要使用svlib,必须编译svlib_pkg.sv
和dpi/svlib_dpi.c
。已经在使用DPI的用户可以直接拓展已经有的DPI,或者也可以链接到动态链接库文件。对于新用户或者只是想试试的用户,建议按照仿真器的编译、链接以及运行的流程使用svlib。为了简化流程,请参考文件src
目录下的svlib.f
。
占位符<svlibroot>代表svlib的目录。
下面以三种主流仿真器为例,说明使用方法
3.1 Mentor Graphics QuestaSim
qverilog
的一步流程
qverilog +incdir+<svlibRoot>/src –f <svlibRoot>/src/svlib.f <user_options> <user_files>
3.2 Cadence Incisive
irun
的一步流程
irun +incdir+<svlibRoot>/src –f <svlibRoot>/src/svlib.f <user_options> <user_files>
3.3 Synopsys VCS
vcs
的一步流程。请注意附加的-LDFLAGS选项,它是链接VCS默认没有链接的C库时所必需的选项。-R选项不是强制性的,它只是使simv
可执行文件在编译和链接完成后自动开始运行。
vcs –sverilog –R +incdir+<svlibRoot>/src –f <svlibRoot>/src/svlib.f \
–LDFLAGS –lrt \
<user_options> <user_files>
如果要简化这个命令,我们准备了了一个vcs.f
文件,它包含所需的-LDFLAGS和-sverilog选项以及svlib的其他内容,然后就可以使用下面的命令运行:
vcs–R +incdir+<svlibRoot>/src –f <svlibRoot>/src/vcs.f <user_options> <user_files>
第四章 一些使用规则与约定
svlib被设计成在任何SystemVerilog环境都尽可能不影响原环境并且都能正常运行。为了实现这些目标,有必要引入一些对整个库都通用的底层行为。对于用户来说,了解这些行为,避免意外,是很重要的。
4.1 库的结构概述
4.1.1 package
svlib
已经封装成了一个叫svlib_pkg的SystemVerilog包。仿真器编译之后,用户应该把这个包导入到自己的代码中,这样svlib
的工具就可以随时使用。pkg的import语句应该在任何需要它的模块或包的域中,就在module或package的开头。不要把import语句放在任何module或package的外侧,会使svlib
导入到$unit
空间,存在潜在风险。
4.1.2 marco
除了包之外,svlib还有一些在使用包特性时有用或必要的宏。为了使这些宏定义社工小,用户应该在代码中添加:
`include "svlib_macros.svh"
代码应该添加在最外层($unit)范围内,在任何模块或包之外。推荐在整个环境的顶层添加这行代码,此外,代码使用了ifdef
语句,避免了二次定义
4.2 类或者包内的函数?
几乎所有的svlib
功能都是由包中定义的类提供的。用户可以根据需要创建这些类的实例(见下文4.3节)。然而,在某些情况下,简单地调用一个函数,比创建一个对象、配置数据,然后调用它的方法并最终从对象中提取处理过的数据更方便。很多特性这两种形式都有,因此可以选择更方便的一种。有关更多细节,请参阅每个特性的文档。
4.3 构造svlib
对象
svlib
的许多部分都使用定义了SystemVerilog类。因此,为了使用svlib特性,用户的代码中必须创建这些类型的新对象。然而,为了稳定性,提高内存管理效率,用户代码不应该直接调用任何svlib类的new函数。所有的对象都应该用内建的静态函数create
创建,每个类的create
函数在后续章节都有介绍。
这个问题在参考的会议论文[1]中有更详细的讨论。所有主流的SystemVerilog仿真器现在都提供了对受保护的构造函数的全面支持。因此,所有的svlib类构造函数都声明为protected
的,因此用户代码不可能直接调用它们。
4.4 错误处理
偶尔,svlib
函数可能会导致内部错误。尤其是函数调用C库时,在C库中可能存在内存分配、文件权限甚至文件存在等问题。这样的错误总是被传回到SystemVerilog中进行处理,但是错误处理的具体斜街在某种程度上是由程序员控制的。svlib
的默认行为是抛出断言的错误,但是还有更加细致的控制。详情见第十章。
4.5 svlib
的内部隐藏特性
svlib
的一些特性被设计为对用户保持隐藏。这样做是为了让包能够保持DPI的C端和SystemVerilog端数据的一致性。但是,SystemVerilog没有提供任何方法在语言中实现强制隐藏。为了帮助用户避免意外地破坏这种封装,svlib
的隐藏部分被放置在一个单独的包svlib_private_base_pkg
中。用户代码不应该直接导入这个包,也不应该尝试使用其中的任何数据、函数、类或DPI导入。
4.6 命名约定
整个svlib中尽可能使用了一致的命名方案,因此更容易记住或猜测给定特性的名称。为了方便使用,命名尽可能短,但有时由于与systemverilog关键字或者其他包,例如UVM,冲突,或者为了在包中保持一些独特的名字,命名会比较长。
4.6.1 类
几乎所有的svlib
类都是以大写字母开头的短名称,或者都是小写的。例如,表示正则表达式的类是Regex
,也有一些例外,比如,配置特性有几个以cfg前缀命名的类,比如cfgNode
。
4.6.2 类的方法
svlib
类的方法的名称尽可能短,同时尽量好记。如果一个名字是由多个单词组成的,那么这个名字用驼峰式拼写(没有下划线,除了第一个单词外都大写),比如,cfgNode
类的addNode
函数。
4.6.3 pkg级函数的前缀
许多svlib
函数可以很自然地分组。例如,有几个与操作系统交互有关的pkg级函数。这些函数的名称都以前缀sys
开头,与名称的主要部分用下划线分隔,如sys_dayTime
中所示。