svlib文档翻译(第一至四章)

中文版首发由空白的贝塔君整理发布

第一章 关于本文档

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 BromleyPaul MarriottAndré WinkelmannVerilab, 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.svdpi/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中所示。

posted @ 2021-04-22 19:15  空白MAX  阅读(222)  评论(0编辑  收藏  举报