一、svlib
svlib,是一个开源的systemverilog的工具库。
a programmer’s utility library for systemverilog
官方网站
http://www.verilab.com/resources/svlib/
这个开源库中,实现了很多的方法,我们可以调用这些方法,实现很多复杂的功能。
在SV下,做一些事情,是比较困难的,比如说以下操作:
1、 读取环境变量
2、 文件存在与否
3、 获取当前日期与时间
4、 正则表达式匹配
5、 读取或更改配置文件
如果要在sv中实现上述的功能,是比较麻烦与困难的。水平一般的人,比如我,都不一定能够实现出来。
但是这个svlib的开源库,提供了自带的一些方法,来实现了这些复杂的功能,我们只需要调用提供的方法,即可实现。
二、svlib的安装
在官网上,有svlib的源代码压缩包,以及说明文档,直接下载下来即可。
将压缩包解压,得到以下目录结构:
doc:文档目录,目录下有user_guide文档。
README: 使用说明
RELEASE_NOTES: 发布说明
src:svlib开源库的源代码
在src目录下,有众多的.svh和.sv源文件。
还有一个特殊的目录dpi。该目录下只有一个文件,svlib_dpi.c。这是一个c文件,里面实现了很多方法,将来通过sv的dpi方式,供sv调用。
三、svlib集成到tb
下载好svlib之后,下面就要将svlib集成到testbench中。
testbench的代码也很简单,就是调用一个svlib的方法,将返回值打印。这里暂且不管这个方法功能是什么。
注意的第一行,
import svlib_pkg::*;
表示将 svlib_pkg这个包中所有内容都包含进来。
在svlib的src目录下,有svlib_pkg.sv源文件。
定义了一个package svlib_pkg,里面import了另外一个包中的内容和include了一些文件。
这个svlib_pkg.sv文件,将svlib中的所有需要的源文件都包含了进来,因此以后需要用到svlib时,只需要import这个package即可。
编写flist,告诉编译工具,编译哪些文件。
这里只需要将svlib_pkg.sv文件包含到这个文件中,其他sv,svh文件不用写入,因为include会自动加载。
还需要将dpi下的svlib_dpi.c文件包含在这个文件中。
testbench要放在这个文件的最后
编写makefile
对于VCS,要加上 -LDFLAGS -lrt -sverilog选项。这个是svlib中规定的。注意-LDFLAGS 和 -lrt 两个选项要在一起,而且顺序不能变化。
对于irun,只需要 -sv 选项即可。
运行结果:
打印出调用 sys_getEnv 方法的结果,为 /bin/tcsh
在linux下执行 echo $SHELL 命令,打印结果也是 /bin/tcsh
说明 sys_getEnv 方法是获取环境变量的值。
四、svlib获取环境变量
在svlib中,实现了两个方法,来实现对环境变量的操作:
sys_hasEnv(environ_name): 判断 环境变量 是否存在
sys_getEnv(environ_name): 获取 环境变量 的结果
1. sys_hasEnv
来看看 sys_hasEnv是如何实现的:
该函数实现在 svlib_pkg_Sys.svh中。
调用 svlib_dpi_imported_getenv 函数,传入两个参数
envVar:传入的 待查询的环境变量
envStr: 返回的 待查询的环境变量的值
而svlib_dpi_imported_getenv函数,是在svlib_dpi.c中,用c来实现的函数。
通过getenv,获取envVar指定的环境变量的值,保存在envStr中。
判断envStr是否为空:
-
为空,说明环境变量不存在,返回1。传参的p_result设置为NULL。
-
不为空,说明环境变量存在,返回0。并且获取的环境变量的值,保存在传参的p_result中。
这里的第二个传参是 二重指针。对应sv里面的string类型的envStr变量。
*p_result = envStr,其实就是将sv中string类型的envStr地址设置为c中envStr的地址。这样sv中的envStr就获取了环境变量的值。
2. sys_getEnv
同样是调用 svlib_dpi_import_getenv函数,获取环境变量值,保存在envStr中,如果环境变量存在,返回envStr,否则返回空。