分享

连接脚本环境的桥梁uvm_cmdline_processor

 mzsm 2016-08-24

分类:验证平台设计

 

自封闭系统的困扰

 

当验证平台编译完成后,验证平台以可执行库文件的形式存在。看上去像一根自封闭的小岛。“晴川历历汉阳树,芳草萋萋鹦鹉洲”,虽然看上去很美,但是交通不便。

 

自封闭系统是不方便的。

 

例如,当我们在Debug问题时,发现需要获取某个验证组件的UVM_HIGH等级的打印信息。但系统设置的打印级别verbosityUVM_LOW,即UVM_HIGH的信息不能打印。此时是修改验证平台的打印等级重新编译吗?重新编译就意味着漫长的等待……

 

其实,验证平台在编译完成后,并不是一个自封闭系统,在验证平台和脚本环境中,有一座桥梁,这座桥就是uvm_cmdline_processor

 

uvm_cmdline_processor举例

 

使用方式1,在仿真脚本中添加相关信息。



 

其中,L3-L4都是uvm_cmdline_processor提供的已经架设好的桥梁。

 

使用方式2,在仿真过程中,将参数通过命令行写入。

这种方式,可以交互式的控制仿真过程,一般仅在比较大型的仿真时使用。

 

UVM的两种桥梁

UVM为用户提供了“已经架设好的桥梁”和“需要自己架设的桥梁”。而“需要自己架设的桥梁”给了验证平台更大的灵活性,耐心看到最后的人,不会觉得浪费了时间的。

 

已经架设好的桥梁

 

uvm_cmdline_processor 已经架设好了很多桥,方便大家使用。

 

+UVM_TESTNAME           +UVM_TESTNAME=

这个参数应该是经常使用的,一般是在脚本中添加+UVM_TESTNAME=待执行用例的类名。其实,这个参数可以应用的更灵活:在回归验证时,如果你将所有用例都一起编译形成一个库,那么,这个库只需要编译一次,而后续执行回归用例都不需要编译了,只需要修改+UVM_TESTNAME后的参数即可。经实践检验,这么做可以大大节省回归验证在编译上花费的时间。

 

+UVM_VERBOSITY        +UVM_VERBOSITY=

这个参数大家也经常用,用来修改所有组件的打印级别。例如,在回归验证时,一般打印较少的LOG信息,但是,当回归出现错误时,需要让更多的信息打印出来。例如:

+UVM_VERBOSITY=UVM_HIGH

 

+uvm_set_verbosity       

+uvm_set_verbosity=,,,

+uvm_set_verbosity=,,,time,

 设置某个组件(comp),某类标识(id),某段时间(phasetime,)的打印等级(verbosity)。例如:

+uvm_set_verbosity=uvm_test_top.env0.agent1.*,_ALL_,UVM_FULL,main_phase

+uvm_set_verbosity=uvm_test_top.env0.agent1.*,_ALL_,UVM_FULL,time,800

 

+uvm_set_action

+uvm_set_action=,,severity>,

设置某个组件(comp),某个标识(id),某个严重程度(severity)的某种动作(action)。例如:

+uvm_set_action=uvm_test_top.env0.*,_ALL_,UVM_ERROR,UVM_NO_ACTION

 

可选的action包括:

UVM_NO_ACTION(无动作);

UVM_DISPLAY(标准输出);

UVM_LOGlog文件);

UVM_COUNT(错误计数,判断是否达到max_quit_count);

UVM_EXIT(立即退出仿真);

UVM_CALL_HOOK(调用report的钩子函数);

UVM_STOP(暂停,进入交互模式,类似于仿真过程中的ctrl+c);

UVM_RM_RECORD(让reporter做记录)。

 

+uvm_set_severity

+uvm_set_severity=,,currentseverity>,new severity>

修改某个组件(comp),某个标识(id),某个严重程度(current severity)为新的严重程度(new severity)。例如,如果某个组件的问题已知,但还可以接受,为了节省编译时间,可以让该组件暂时不报ErrorFatal,暂时执行下去。例如:

+uvm_set_severity=uvm_test_top.env0.*,BAD_CRC,UVM_ERROR,UVM_WARNING

 

+UVM_TIMEOUT  +UVM_TIMEOUT=,

UVM全局时间门限,如果超出了门限,就退出。其中,overridable是说用户是否还可以在验证平台中修改UVM_TIMEOUT时间。例如:

+UVM_TIMEOUT=200000,NO

 

+UVM_MAX_QUIT_COUNT +UVM_MAX_QUIT_COUNT=,

UVM最大错误计数门限,如果超出了门限,就退出。其中,overridable是说用户是否还可以在验证平台中修改UVM_MAX_QUIT_COUNT时间。例如:

+UVM_MAX_QUIT_COUNT=5,NO

 

以下是4TRACE开关:

+UVM_PHASE_TRACE

+UVM_OBJECTION_TRACE

+UVM_RESOURCE_DB_TRACE

+UVM_CONFIG_DB_TRACE

 

+uvm_set_inst_override

+uvm_set_type_override

+uvm_set_inst_override=,,

+uvm_set_type_override=,[,]

工厂模式,修改组件类型,可以基于例化(instfull_inst_path)的特定替换,或者基于类型(type)的整体替换。

 

+uvm_set_config_int

+uvm_set_config_string

+uvm_set_config_int=,,

+uvm_set_config_string=,,

修改UVM内部特定组件(comp),特定变量域段(field)为特定值(value)。特定值为数值(int)或字符串(string)。例如:

+uvm_set_config_int=uvm_test_top.soc_env,mode,5

 

+uvm_set_default_sequence

+uvm_set_default_sequence=seqr>,,

该功能需UVM-1.2支持,使用户可以修改特定Sequencerseqr),特定时期(phase),为特定sequence类型(type)。例如:

+uvm_set_default_sequence=path.to.sequencer,main_phase,seq_type



 

需要自己架设的桥梁

 

UVM提供了以下函数接口,可以在验证平台中使用。

functionvoid get_args (output string args[$])

获取所有参数,结果存储在args字符串队列中;

 

function void get_plusargs (output stringargs[$])

获取以“+”开头的参数,如“+incdir”,“+UVM_TESTNAME”,结果存储在args字符串队列中;

 

function void get_ uvmargs (output stringargs[$])

获取所有包含“uvm”,“UVM”的参数,如“-uvm”、“+UVM_TESTNAME”,结果存储在args字符串队列中;

 

function int get_arg_matches (string match,ref string args[$])

获取与字符串match的内容匹配的参数,结果存储在args字符串队列中;

 

functionint get_arg_value (string match, ref string value)

获取与字符串match匹配的参数值,如“+incdir+”后面的信息,仅获取第一个参数;

 

functionint get_arg_values (string match, ref string values[$])

获取与字符串match匹配的参数值,如“+incdir+”后面的信息,获取所有参数值;

 

function string get_tool_name ()

获取工具名称,结果存储在返回值中,如ncsim(64)

 

function string get_tool_version ()

获取工具版本,结果存储在返回值中,如13.20

 

以上高亮的三个参数,是较为推荐和常用的。

 

自己架设桥梁使用实例

 

uvm_cmdline_process单例(Singleton)模式(参见“设计模式”相关资料),提供的函数是staticfunction uvm_cmdline_processor get_inst(),使用时,建议按单例模式使用。

 


 

若脚本如下:



 

则打印信息为i_arg_value= 1234


之前有将-svseed 1234的信息,当做序列号传入验证平台的做法。我不推荐使用该方法。首先,-svseed 1234是两个参数,获取时不太方便(需要先找到-svseed,然后索引加1获取后面的参数)。另一个问题是,-svseed有其设置随机种子的作用,将该信息当做序列号并不合适。推荐的做法是如文中所示,使用“seq_num=”作为参数前缀。而且,这样可以传递多个参数。




 参考资料说明

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多