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_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队列中,并返回个数。
更多相关阅读
uvm中直接操作RTL信号
sv的常数数组参数传递
uvm中run_test
原文首发于骏的世界博客
作者:卢骏
更多IC设计相关的文章请关注IC设计极术专栏,每日更新。