uvm中获取cmdlind内容
0赞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队列中,并返回个数。