欢迎大家加入2022届数字IC交流群,QQ群号 1060380138
❝中文版本由
空白的贝塔君
整理发布 链接为https://github.com/recogni/svlib
❞
本文档是对systemverilog使用库svlib
的说明和编程指导。
版本号 | 日期 | 作者 | 说明 |
---|---|---|---|
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 |
本文版权所有©Verilab Inc. 2014-2015。本文作为svlib使用库的附加信息。本文件允许无限复制,但必须包括第一章的全部内容,不得修改。
Verilab公司对该软件包的运行不承担任何责任。如果你想使用它,你将自行承担全部责任。
这份文件是由Jonathan Bromley、Paul Marriott和André Winkelmann在Verilab, Inc (www.verilab.com)准备的。
svlib是一个开放源代码包,所以您可以自由地使用源代码并以任何您想要的方式修改它。为了方便使用,本文档以PDF格式提供,因此并不是严格的开源。原始的可编辑文档可根据要求从作者处获得。
可以通过电子邮件地址svlib@verilab.com联系此软件包和文档的作者。作者很高兴收到意见与建议,并尽可能迅速回复。
本文档介绍了systemverilog的实用程序库svlib。svlib为我们的日常验证工作提供了SystemVerilog所缺乏的功能:字符串处理、操作系统接口和许多其他有用的函数。
svlib代码分为三个不同的部分,都可以src/目录中找到:
svlib_pkg
,使用前需要用编译器编译svlib_pkg.sv
文件dpi/svlib_dpi.c
要使用svlib,必须编译svlib_pkg.sv
和dpi/svlib_dpi.c
。已经在使用DPI的用户可以直接拓展已经有的DPI,或者也可以链接到动态链接库文件。对于新用户或者只是想试试的用户,建议按照仿真器的编译、链接以及运行的流程使用svlib。为了简化流程,请参考文件src
目录下的svlib.f
。
占位符<svlibroot>代表svlib的目录。
下面以三种主流仿真器为例,说明使用方法
qverilog
的一步流程
qverilog +incdir+<svlibRoot>/src –f <svlibRoot>/src/svlib.f <user_options> <user_files>
irun
的一步流程
irun +incdir+<svlibRoot>/src –f <svlibRoot>/src/svlib.f <user_options> <user_files>
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环境都尽可能不影响原环境并且都能正常运行。为了实现这些目标,有必要引入一些对整个库都通用的底层行为。对于用户来说,了解这些行为,避免意外,是很重要的。
svlib
已经封装成了一个叫svlib_pkg的SystemVerilog包。仿真器编译之后,用户应该把这个包导入到自己的代码中,这样svlib
的工具就可以随时使用。pkg的import语句应该在任何需要它的模块或包的域中,就在module或package的开头。不要把import语句放在任何module或package的外侧,会使svlib
导入到$unit
空间,存在潜在风险。
除了包之外,svlib还有一些在使用包特性时有用或必要的宏。为了使这些宏定义社工小,用户应该在代码中添加:
`include "svlib_macros.svh"
代码应该添加在最外层($unit)范围内,在任何模块或包之外。推荐在整个环境的顶层添加这行代码,此外,代码使用了ifdef
语句,避免了二次定义
几乎所有的svlib
功能都是由包中定义的类提供的。用户可以根据需要创建这些类的实例(见下文4.3节)。然而,在某些情况下,简单地调用一个函数,比创建一个对象、配置数据,然后调用它的方法并最终从对象中提取处理过的数据更方便。很多特性这两种形式都有,因此可以选择更方便的一种。有关更多细节,请参阅每个特性的文档。
svlib
对象svlib
的许多部分都使用定义了SystemVerilog类。因此,为了使用svlib特性,用户的代码中必须创建这些类型的新对象。然而,为了稳定性,提高内存管理效率,「用户代码不应该直接调用任何svlib类的new函数」。所有的对象都应该用内建的静态函数create
创建,每个类的create
函数在后续章节都有介绍。
这个问题在参考的会议论文[1]中有更详细的讨论。所有主流的SystemVerilog仿真器现在都提供了对受保护的构造函数的全面支持。因此,所有的svlib类构造函数都声明为protected
的,因此用户代码不可能直接调用它们。
偶尔,svlib
函数可能会导致内部错误。尤其是函数调用C库时,在C库中可能存在内存分配、文件权限甚至文件存在等问题。这样的错误总是被传回到SystemVerilog中进行处理,但是错误处理的具体斜街在某种程度上是由程序员控制的。svlib
的默认行为是抛出断言的错误,但是还有更加细致的控制。详情见第十章。
svlib
的内部隐藏特性svlib
的一些特性被设计为对用户保持隐藏。这样做是为了让包能够保持DPI的C端和SystemVerilog端数据的一致性。但是,SystemVerilog没有提供任何方法在语言中实现强制隐藏。为了帮助用户避免意外地破坏这种封装,svlib
的隐藏部分被放置在一个单独的包svlib_private_base_pkg
中。用户代码不应该直接导入这个包,也不应该尝试使用其中的任何数据、函数、类或DPI导入。
整个svlib中尽可能使用了一致的命名方案,因此更容易记住或猜测给定特性的名称。为了方便使用,命名尽可能短,但有时由于与systemverilog关键字或者其他包,例如UVM,冲突,或者为了在包中保持一些独特的名字,命名会比较长。
几乎所有的svlib
类都是以大写字母开头的短名称,或者都是小写的。例如,表示正则表达式的类是Regex
,也有一些例外,比如,配置特性有几个以cfg前缀命名的类,比如cfgNode
。
svlib
类的方法的名称尽可能短,同时尽量好记。如果一个名字是由多个单词组成的,那么这个名字用驼峰式拼写(没有下划线,除了第一个单词外都大写),比如,cfgNode
类的addNode
函数。
svlib
函数分组大多数比较直观。例如,有几个与操作系统交互有关的pkg级函数。这些函数的名称都以前缀sys
开头,与名称的主要部分用下划线分隔,如sys_dayTime
中所示。