1、关于svlib的用法可以参考:
https://zhuanlan.zhihu.com/p/366129803https://zhuanlan.zhihu.com/p/366129803http://www.lujun.org.cn/?p=941http://www.lujun.org.cn/?p=941https://zhuanlan.zhihu.com/p/366129803https://zhuanlan.zhihu.com/p/366129803
2、资料下载路径
svlib - a programmer's utility library for SystemVerilog
3、使用例子
3.1:解析固定格式的文件到class里面
第一步:在flist里面加载对应的svlib,以及对应的宏
-f ../cbb/svlib/svlib.f
cbb/svlib/src/svlib_macros.svh
第二步:在对应模块里面import svlib_pkb
import svlib_pkg::*;
第三步:准备文件,文件后缀为ini,其中[secA],这个字符串,表示一个数据的section,一种类别,sv数据默认处理的是后面带等号的数据个数。
[secA]
data=1
str=20,30,40
[secA_tmp]
data=3
str=4,0,0
[secC]
str_tmp_0=01010
str_tmp_1=01010
str_tmp_2=01010
str_tmp_3=01010
str_tmp_4=01010
str_tmp_5=01010
str_tmp_6=01010
str_tmp_7=01010
str_tmp_8=01010
str_tmp_9=01010
str_tmp_10=01010
str_tmp_11=01010
str_tmp_12=01010
str_tmp_13=01010
str_tmp_14=01010
str_tmp_15=01010
第四步 :准备ini文件对应的class
下面的循环注册字符串使用的函数SVLIB_DOM_FIELD_STRING_BY_NAME的原代码宏定义来自于:https://download.csdn.net/download/pgl512228/89714380,里面还有其他关于int/object 的数组注册的宏,请下载后自取。
class svlib_secA; string str ; int data ; `SVLIB_DOM_UTILS_BEGIN(svlib_secA) `SVLIB_DOM_FIELD_INT(data) `SVLIB_DOM_FIELD_STRING(str) `SVLIB_DOM_UTILS_END endclass class svlib_secC; string str_tmp[12]=1,1,1; `SVLIB_DOM_UTILS_BEGIN(svlib_secC) foreach(str_tmp[i])begin `SVLIB_DOM_FIELD_STRING_BY_NAME(str_tmp,i,$formatf("str_tmp_%0d",i)) end `SVLIB_DOM_UTILS_END endclass class globle; svlib_secA secA,secA_tmp,secB; svlib_secC secC ; `SVLIB_DOM_UTILS_BEGIN() `SVLIB_DOM_FIELD_OBJECT(secA) `SVLIB_DOM_FIELD_OBJECT(secA_tmp) `SVLIB_DOM_FIELD_OBJECT(secB) `SVLIB_DOM_FIELD_OBJECT(secC) `SVLIB_DOM_UTILS_BEGIN endclass
第五步:读取文件
在需要读取的class里面下如下代码,读取后就可以打印了:
string file_name ; cfgNodeMap cfg_nod; cfgFileINI file = cfgFileINI::create(); cfgError_enum_err; globle glb_cfg = new; file_name = "test.ini"; err = cfg_file.openR(file_name); $cast(cfg_nod,file.deserializse()); err = file.close; $display("secA data is %0d",glb_cfg.data);