ToB企服应用市场:ToB评测及商务社交产业平台
标题:
开源svlib工具
[打印本页]
作者:
万有斥力
时间:
2025-1-13 20:25
标题:
开源svlib工具
svlib是一个开源的基于systemverilog语言工具库。主要提供了一些扩展功能。
组成
macro: 使用
`include “svlib_macros.svh”
pkg:
svlib_pkg.sv
将全部组件都打包放到一个package中
调用c 代码:
dpi/svlib_dpi.c
用户可以将该文件编译成一个共享动态链接文件。
用户可以直接将
svlib.f
直接参加编译选项中。vcs编译添加
+incdir+/src -f /src/svlib.f -LDFLAGS -lrt
其中-LDFLAGS用于链接C库。也可以直接使用
+incdir+/src -f /src/vcs.f
功能扩展
字符串类
systemverilog提供string类型的数据布局,并为此布局提供了一些内建方法:
方法解释==
!=
> 、< 、>=、<=(不常用)判定两个字符串是否相称,比较两个字符串{str1,str2,str3}字符串级联{multiplier{str1}}字符串重复str1[index]字符串索引str.len()返回字符串的字符数量str.put(i,char)在字符串i位置插入一个char字符str.get(i)返回字符串i位置的字符str.tolower()返回字符串的小写格式str.compare(s)比较两个字符串str.substr(i,j)返回一个从位置i到位置j的子字符串str.atoi()、str.atohex()、str.atooct()、str.atobin()、str.atoreal()将字符串转化成一个十/十六/八/二进制整数str.itoa(i)、str.hextoa(i)、str.octtoa(i)、str.bintoa(i)、str.realtoa(i)将数据转化成字符串 svlib提供一个
Str
类。
//提供的枚举类型
typedef enum{NONE,LEFT,RIGHT,BOTH} side_enum;
typedef enum{START,END} origin_enum;
//提供的method
static function Str Str::create(string s="");//用于创建一个字符串类
function void set(string s);
function string get();
function Str copy();
function int len();
function void append(string s);//在现有的字符串后面添加新的字符串
function int first(string substr,int ignore=0);//在字符串中搜索子字符串并返回位置,搜索不到,返回-1
function int last(string substr,int ignore=0);
function string sjoin(qs elements);//将一个队列的字符串拼接起来组成一个字符串
function qs split(string splitset="",bit keepsplitters=0);//将一个字符串以分隔符拆分成字符串队列
function string range(int p, int n,origin_enum origin=START);//从字符串中提取子字符串
function void replace(string rs,int p, int n,origin_enum origin=START);//使用新的字符串替换原字符串中的部分内容
function void trim (side_enum side=BOTH);//去除字符串的头尾空白
function void pad(int width,side_enum side=BOTH);//在头尾添加空白以达到指定的宽度
function void strip(string chars ="\t\n\13\14\15\240\177");//用于去除字符串中特殊字符
function void quote();//给字符串加上“”
复制代码
有时字符串操作很简单,专程为某个操作创建一个Str类反而大材小用,故svlib提供了一些package级别的
string functions
:
function bit isSpace(byte unsigned ch);
function string str_sjoin(qs elements, string joiner);
function str_trim(string s,Str::side_enum side=Str::BOTH);
function string str_quote(string s);
function string str_range(string s,int p,int n,orign_enum orign=START);
function string str_replace(string s, string rs, int p,int n,Str::origin_enum origin=Str::START);
function string strip(string s, string chars="\t\n\13\14\15\240\177");
function qs str_split(string s, string splitset="",bit keepsplitters=0);
function string str_repeat(string s,int n);
复制代码
正则表达式类
svlib还支持字符串的正则表达式。表达式布局和egrep类似,提供了一个
Regx
类。
static function Regx Regx::create(string re="",int opts=0);
function void setRE(string re);
function void setOpts(int opts);
function int test(Str s, int startPos=0);
function int retest(int startPos);
function int getMatchCount();
function string getMatchString(int m=0);
function int getMatchStart(int m=0);
function int getMatchLength(int m=0);
function int subst(string subStr,int startPos=0);
function int substAll(string substStr,int startPos=0);
复制代码
同Str一样,svlib也在package级提供了几个关于正则表达式的function
function automatic Regex regex_match(string haystack, string needle,int options=0);
function automatic qs regex_split(string source,string pattern, int limit=0);
复制代码
文件路径类
svlib将文件路径封装成一个类
Pathname
。
//类方法
static function Pathname Pathname::create(string s="");
function void set(string path);
function void append(string tail);
function void appendPN(Pathname tailPN);
function string get();
function string dirname(int backsteps=1);
function extension();
function string tail(int backsteps=1);
function string volume ();
function bit isAbsolute();
function Pathname copy();
复制代码
文件属性
svlib提供了文件属性的数据布局。
typedef struct packed{
bit r;
bit w;
bit x;
} sys_fileRWX_s;
typedef struct packed {
bit setUID;
bit setGID;
bit sticky;
sys_fileRWX_s owner;
sys_fileRWX_s group;
sys_fileRWX_s others;
} sys_filePermission_s;
typedef enum bit[3:0]{
fTypeFifo =4'h1,
fTypeCharDev=4'h2,
fTypeDir=4'h6,
fTypeFile=4'h8,
fTypeSymLink=4'hA,
fTypeSocket=4'hC
}sys_fileType_enum;//可参考linux文件类型
typedef struct packed{
sys_fileType_enum fType;
sys_filePermissions_s fPermisssions;
} sys_fileMode_s;
typedef struct {
longint mtime;
longint atime;
longint ctime;
longint size;
int unsigned uid;
int unsigned gid;
sys_fileMode_s mode;
} sys_fileStat_s;
复制代码
svlib还提供package级的functions:
function automatic longint file_mTime(string path,bit aslink=0);
function automatic longint file_aTime(string path,bit aslink=0);
function automatic longint file_cTime(string path,bit aslink=0);
function automatic longint file_size(string path,bit aslink=0);
function automatic sys_fileMode_s file_mode(string path,bit aslink=0);
function automatic bit file_accessible(string path,sys_fileRWX_s mode=0);
复制代码
查询操作系统
svlib只提供package级的functions:
function automatic longint sys_dayTime();
function automatic string sys_formatTime(input longint epochSeconds, input string format);
function automatic qs sys_fileGlob(string wildPath);
function automatic string sys_getCwd();
function automatic string sys_getEnv(string envVar);
function automatic bit sys_hasEnv(string envVar);
复制代码
文本对象模型
svlib提供几个配置基类。
virtual class svlibCfgBase extends svlibBase;
pure virtual function cfgObjKind_e kind();
virtual function string getName();
virtual function string getLastErrorDetails();
virtual function cfgError_e getLastError();
virtual function string kindStr();
endclass
virtual class cfgScalar extends svlibCfgBase;
pure virtual function string str();
pure virtual function bit scan(string s);
endclass
virtual class cfgNode extends svlibCfgBase;
pure virtual function string sformat(int indent=0);
pure virtual function cfgNode childByName(string path);
function cfgNode lookup(string path);
virtual function void addNode(cfgNode nd);
virtual function cfgNode getParent();
endclass
复制代码
配置文件
svlib支持将
.ini
配置文件转化成一个配置类,也支持将一个配置类输出到一个.init配置文件中。中心的转换通过DOM来实现。
//定义一个配置类
class localcfg extends ...;
int choice;
string label;
`SVLIB_DOM_UTILS_BEGIN(localcfg)
#SVLIB_DOM宏定义了两个方法:function void fromDOM(cfgNodeMap dom);
#function cfgNodeMap toDOM(string name);
`SVLIB_DOM_FIELD_INT(choice)
`SVLIB_DOM_FIELD_STRING(label)
`SVLIB_DOM_UTILS_END
endclass
//初始化
cfgNodeMap cfg_DOM;
cfgFileINI cfg_file = cfgFileINI::create();
cfgError_enum err;
//将配置类内容写入.init文件中
localcfg cfg=new;
cfg.choice=42;
cfg.label="local configure";
cfg_DOM=cfg.toDOM("cfg");//copy user object to DOM representation
err=cfg_file.openW("user_file.ini");//open file for writing
err=cfg_file.serialize(cfg_DOM);//write DOM to file
err=cfg_file.close();
//将.init内容写入配置类中
err = cfg_file.openR("user_file.ini");
err= cfg_file.deserialize(cfg_DOM);//read ini file into DOM
err= cfg_file.close();
cfg.fromDOM(cfg_DOM);//copy DOM into 配置对象
复制代码
总结
整个svlib-userguide看下来,我觉得最有用的应该是正则匹配和配置文件和配置类的转化。但是在现实的项目应用中,这两个功能应用不多。更多可能用到uvm的 正则表达式或者uvm print 配置类。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4