weiqi7777

uvm中获取cmdlind内容

0
阅读(4099)

UVM中,会从cmdline中,获取内容。比如+UVM_TESTNAME,得到要执行的testcase的名字。

一、uvm_cmdline_processor类

uvm通过uvm_cmdline_processor类,来实现读取cmdline的内容。

在这个类中,定义了3个队列。

  • m_argv: 保存cmdline的传参

  • m_plus_argv: 保存以+开头的cmdline参数

  • m_uvm_argc: 保存以 -uvm,+uvm,-UVM,+UVM开头的cmdline参数

二、参数获取流程

uvm_cmdline_processor类的new函数,通过调用uvm_dpi_get_next_arg函数,获取cmdline的一个参数,如果获取的参数不为空,那么就保存到m_argv队列中。如果参数以+开头,保存到m_plus_argv队列中。如果参数是以-uvm,+uvm,-UVM,+UVM开头的参数,保存到m_uvm_argv队列中。

UVM可以识别的参数:

参数

说明

+UVM_DUMP_CMDLINE_ARGS

将cmdline的参数,都打印出来

+UVM_TESTNAME

指定testcase

+UVM_VERBOSITY

指定打印级别

+uvm_set_verbosity

设置指定组件,id,phase,时间的打印级别

+uvm_set_verbosity=<comp>,<id>,<verbosity>,<phase>

+uvm_set_verbosity=<comp>,<id>,<verbosity>,<phase>,time,<time>

+uvm_set_action

provides the equivalent of various uvm_report_object's set_report_*_action APIs+uvm_set_action=<comp>,<id>,<severity>,<action>

+UVM_TIMEOUT

设置超时时间

+UVM_TIMEOUT=<timeout>,<overridable>

+UVM_MAX_QUIT_COUNT

指定最大退出时间的打印个数+UVM_MAX_QUIT_COUNT=<count>,<overridable>

+UVM_PHASE_TRACE

使能phase执行信息打印

+UVM_OBJECTION_TRACE

使能objection行为信息打印

+UVM_RESOURCE_DB_TRACE

使能resource DB访问信息打印

+UVM_CONFIG_DB_TRACE

使能配置DB信息打印

+uvm_set_inst_override

设置组件的重载+uvm_set_inst_override=<req_type>,<override_type>,<full_inst_path>

+uvm_set_config_int

+uvm_set_config_string

传参

+uvm_set_config_int=<comp>,<field>,<value>

+uvm_set_config_string=<comp>,<field>,<value>

+uvm_set_default_sequence

设置sequence

+uvm_set_default_sequence=<seqr>,<phase>,<type>

关键是uvm_dpi_get_next_arg,这个是在uvm_svcmd_dpi.svh中,定义的一个函数。因为没有定义UVM_CMDLINE_NO_DPI这个宏,所以选择上面部分的代码。

其实是调用c实现的函数,uvm_dpi_get_next_arg_c函数。

而uvm_dpi_get_next_arg这个函数,定义在uvm_svcmd_dpi.c这个文件中,内部调用了vpi_get_vlod_info函数,得到s_vpi_vlog_info类型的info变量。而这个info变量,就保存了cmdline的所有参数。

vpi_user.h文件中,定义了 s_vpi_vlog_info结构体,这个结构体,保存了cmdline的所有参数。

这个uvm_dpi_get_next_arg_c函数,如果参数为1,表示从最开始获取,通过vpi_get_vlog_info函数,获取到cmdline的所有参数,然后通过walk_level函数,获取到总共有多少个有效的cmdline参数(不包含 –f 文件 的参数),保存到argc_total中。接着申请一块空间,使用walk_level函数,将有效的cmdline参数,保存到argc_ptr中。

以下是walk_level函数的具体实现。判断参数是否是-f或者是-F,如果是,跳过这个参数和后面的一个参数,如果不是,保存到argv_ptr中。

而 vpi_get_vlog_info 这个函数,是定义在外部的函数。

这个函数的实现,没有找到,应该是EDA工具内置的。

查cadence的VPI手册,有提到这个函数,返回工具的调用信息。

VPI(verilog procedural interface),以下是VPI的介绍。其实就是c的一个接口,用于和HDL语言进行通信的接口。

三、类中外部调用接口函数

通过以上代码,uvm_cmdline_processor类,就能将cmdline中参数,保存到自己的队列变量中。外部通过下面的三个函数,获取到命令行参数,然后再进行处理。

四、获取指定参数值

在这个类中,还提供获取指定参数值的函数,本质上,是使用正则表达式进行匹配。而正则表达式实现,实现原理还是调用c实现的dpi。

1、get_arg_value

get_arg_value, 获取指定参数的值。比如获取+UVM_TESTNAME=hello中的UVM_TESTNAME参数值,该函数,就可以返回hello。该函数只能获取一个值,如果后面有重复的参数,那么取后面的参数值。

即,获取+UVM_TESTNAME=hello +UVM_TESTNAME=world中的UVM_TESTNAME的参数值,就得到world。

2、get_arg_values

get_arg_values, 获取指定参数的所有值。比如获取+UVM_TESTNAME=hello +UVM_TESTNAME=world中的UVM_TESTNAME的参数值,就得到hello和world。保存在values队列中,并返回个数。