开源svlib工具

打印 上一主题 下一主题

主题 869|帖子 869|积分 2607

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类。
  1. //提供的枚举类型
  2. typedef enum{NONE,LEFT,RIGHT,BOTH} side_enum;
  3. typedef enum{START,END} origin_enum;
  4. //提供的method
  5. static function Str Str::create(string s="");//用于创建一个字符串类
  6. function void set(string s);
  7. function string get();
  8. function Str copy();
  9. function int len();
  10. function void append(string s);//在现有的字符串后面添加新的字符串
  11. function int first(string substr,int ignore=0);//在字符串中搜索子字符串并返回位置,搜索不到,返回-1
  12. function int last(string substr,int ignore=0);
  13. function string sjoin(qs elements);//将一个队列的字符串拼接起来组成一个字符串
  14. function qs split(string splitset="",bit keepsplitters=0);//将一个字符串以分隔符拆分成字符串队列
  15. function string range(int p, int n,origin_enum origin=START);//从字符串中提取子字符串
  16. function void replace(string rs,int p, int n,origin_enum origin=START);//使用新的字符串替换原字符串中的部分内容
  17. function void trim (side_enum side=BOTH);//去除字符串的头尾空白
  18. function void pad(int width,side_enum side=BOTH);//在头尾添加空白以达到指定的宽度
  19. function void strip(string chars ="\t\n\13\14\15\240\177");//用于去除字符串中特殊字符
  20. function void quote();//给字符串加上“”
复制代码
 有时字符串操作很简单,专程为某个操作创建一个Str类反而大材小用,故svlib提供了一些package级别的string functions:
  1. function bit isSpace(byte unsigned ch);
  2. function string str_sjoin(qs elements, string joiner);
  3. function str_trim(string s,Str::side_enum side=Str::BOTH);
  4. function string str_quote(string s);
  5. function string str_range(string s,int p,int n,orign_enum orign=START);
  6. function string str_replace(string s, string rs, int p,int n,Str::origin_enum origin=Str::START);
  7. function string strip(string s, string chars="\t\n\13\14\15\240\177");
  8. function qs str_split(string s, string splitset="",bit keepsplitters=0);
  9. function string str_repeat(string s,int n);
复制代码
正则表达式类

 svlib还支持字符串的正则表达式。表达式布局和egrep类似,提供了一个Regx类。
  1. static function Regx Regx::create(string re="",int opts=0);
  2. function void setRE(string re);
  3. function void setOpts(int opts);
  4. function int test(Str s, int startPos=0);
  5. function int retest(int startPos);
  6. function int getMatchCount();
  7. function string getMatchString(int m=0);
  8. function int getMatchStart(int m=0);
  9. function int getMatchLength(int m=0);
  10. function int subst(string subStr,int startPos=0);
  11. function int substAll(string substStr,int startPos=0);
复制代码
 同Str一样,svlib也在package级提供了几个关于正则表达式的function
  1. function automatic Regex regex_match(string haystack, string needle,int options=0);
  2. function automatic qs regex_split(string source,string pattern, int limit=0);
复制代码
文件路径类

 svlib将文件路径封装成一个类Pathname
  1. //类方法
  2. static function Pathname Pathname::create(string s="");
  3. function void set(string path);
  4. function void append(string tail);
  5. function void appendPN(Pathname tailPN);
  6. function string get();
  7. function string dirname(int backsteps=1);
  8. function extension();
  9. function string tail(int backsteps=1);
  10. function string volume ();
  11. function bit isAbsolute();
  12. function Pathname copy();
复制代码
文件属性

 svlib提供了文件属性的数据布局。
  1. typedef struct packed{
  2. bit r;
  3. bit w;
  4. bit x;
  5. } sys_fileRWX_s;
  6. typedef struct packed {
  7. bit setUID;
  8. bit setGID;
  9. bit sticky;
  10. sys_fileRWX_s owner;
  11. sys_fileRWX_s group;
  12. sys_fileRWX_s others;
  13. } sys_filePermission_s;
  14. typedef enum bit[3:0]{
  15. fTypeFifo =4'h1,
  16. fTypeCharDev=4'h2,
  17. fTypeDir=4'h6,
  18. fTypeFile=4'h8,
  19. fTypeSymLink=4'hA,
  20. fTypeSocket=4'hC
  21. }sys_fileType_enum;//可参考linux文件类型
  22. typedef struct packed{
  23. sys_fileType_enum fType;
  24. sys_filePermissions_s fPermisssions;
  25. } sys_fileMode_s;
  26. typedef struct {
  27. longint mtime;
  28. longint  atime;
  29. longint  ctime;
  30. longint size;
  31. int unsigned uid;
  32. int unsigned gid;
  33. sys_fileMode_s  mode;
  34. } sys_fileStat_s;
复制代码
 svlib还提供package级的functions:
  1. function automatic longint file_mTime(string path,bit aslink=0);
  2. function automatic longint file_aTime(string path,bit aslink=0);
  3. function automatic longint file_cTime(string path,bit aslink=0);
  4. function automatic longint file_size(string path,bit aslink=0);
  5. function automatic sys_fileMode_s file_mode(string path,bit aslink=0);
  6. function automatic bit file_accessible(string path,sys_fileRWX_s mode=0);
复制代码
查询操作系统

 svlib只提供package级的functions:
  1. function automatic longint sys_dayTime();
  2. function automatic string sys_formatTime(input longint epochSeconds, input string format);
  3. function automatic qs sys_fileGlob(string wildPath);
  4. function automatic string sys_getCwd();
  5. function automatic string sys_getEnv(string envVar);
  6. function automatic bit sys_hasEnv(string envVar);
复制代码
文本对象模型

 svlib提供几个配置基类。
  1. virtual class svlibCfgBase extends svlibBase;
  2.   pure virtual function cfgObjKind_e kind();
  3.   virtual function string getName();
  4.   virtual function string getLastErrorDetails();
  5.   virtual function cfgError_e getLastError();
  6.   virtual function string kindStr();
  7. endclass
  8. virtual class cfgScalar extends svlibCfgBase;
  9.    pure virtual function string str();
  10.    pure virtual function bit scan(string s);
  11. endclass
  12. virtual class cfgNode extends svlibCfgBase;
  13.   pure virtual function string sformat(int indent=0);
  14.   pure virtual function cfgNode childByName(string path);
  15.   function cfgNode lookup(string path);
  16.   virtual function void addNode(cfgNode nd);
  17.   virtual function cfgNode getParent();
  18. endclass
复制代码
配置文件

 svlib支持将.ini配置文件转化成一个配置类,也支持将一个配置类输出到一个.init配置文件中。中心的转换通过DOM来实现。
  1. //定义一个配置类
  2. class localcfg extends ...;
  3.   int choice;
  4.   string label;
  5.   `SVLIB_DOM_UTILS_BEGIN(localcfg)
  6.   #SVLIB_DOM宏定义了两个方法:function void fromDOM(cfgNodeMap dom);
  7.   #function cfgNodeMap toDOM(string name);
  8.   `SVLIB_DOM_FIELD_INT(choice)
  9.   `SVLIB_DOM_FIELD_STRING(label)
  10.   `SVLIB_DOM_UTILS_END  
  11. endclass
  12. //初始化
  13. cfgNodeMap cfg_DOM;
  14. cfgFileINI  cfg_file = cfgFileINI::create();
  15. cfgError_enum err;
  16. //将配置类内容写入.init文件中
  17. localcfg  cfg=new;
  18. cfg.choice=42;
  19. cfg.label="local configure";
  20. cfg_DOM=cfg.toDOM("cfg");//copy user object to DOM representation
  21. err=cfg_file.openW("user_file.ini");//open file for writing
  22. err=cfg_file.serialize(cfg_DOM);//write DOM to file
  23. err=cfg_file.close();
  24. //将.init内容写入配置类中
  25. err = cfg_file.openR("user_file.ini");
  26. err= cfg_file.deserialize(cfg_DOM);//read ini file into DOM
  27. err= cfg_file.close();
  28. cfg.fromDOM(cfg_DOM);//copy DOM into 配置对象
复制代码
总结

 整个svlib-userguide看下来,我觉得最有用的应该是正则匹配和配置文件和配置类的转化。但是在现实的项目应用中,这两个功能应用不多。更多可能用到uvm的 正则表达式或者uvm print 配置类。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表