uvm_cmdline_processor
uvm_cmdline_processor提供了获得仿真时命令行参数测方法,一般情况下,在整个验证环境中只是用该类的一个singleton实例。可以通过调用uvm_cmdline_processor::get_int()函数获得获得该singleton实例句柄,或直接使用指向该singleton实例的全局句柄uvm_cmdline_proc.
在由systemverilog搭建的验证环境中,我们可以使用系统函数$value$plusargs来获取仿真时的仿真参数。而在基于UVM的验证环境中,我们可以使用另一种方式来获取仿真参数:uvm_cmdline_processor。
uvm_cmdline_processor本质上是一个class,它的继承关系如下:

https://blog.csdn.net/kevindas/article/details/123434613
命令行参数介绍:
https://www.cnblogs.com/csjt/p/16256182.html
eg:
`timescale 1ns/1ps `include "uvm_macros.svh" import uvm_pkg::*; program testcase(); string cmdline_argv[$]; string cmdline_plus_argv[$]; string cmdline_uvm_argv[$]; initial begin $display("*************************************************************"); uvm_cmdline_proc.get_args(cmdline_argv); uvm_cmdline_proc.get_plusargs(cmdline_plus_argv); uvm_cmdline_proc.get_uvm_args(cmdline_uvm_argv); foreach(cmdline_argv[i]) $display("cmdline_argv[%0d] =%s", i, cmdline_argv [i]); foreach(cmdline_plus_argv[i]) $display("cmdline_plus_argv[%0d]=%s", i, cmdline_plus_argv[i]); foreach(cmdline_uvm_argv[i]) $display("cmdline_uvm_argv[%0d] =%s", i, cmdline_uvm_argv [i]); $display("*************************************************************"); $finish(); end endprogram
uvm_cmdline_processor提供的主要接口函数介绍:
Ø get_inst():返回指向uvm_cmdline_processor singleton实例的句柄。

uvm_cmdline_processor cmdline_proc_inst; function new(string name, uvm_component); super.new(name, parent); cmdline_proc_inst = uvm_cmdline_processor::get_inst(); endfunction function void report_phase(uvm_phase phase); string testname; string seed_num; string total_name; cmdline_proc_inst.get_arg_value("+testcase=", testname); cmdline_proc_inst.get_arg_value("+ntb_random_seed=", seed_num); total_num = {testname, " ", seed_num}; endfunction
Ø new():从仿真命令行参数参数总获取参数,根据参数类型存储在相应的队列中。
function new(string name = ""); string s; string sub; super.new(name); do begin s = uvm_dpi_get_next_arg(); if(s!="") begin m_argv.push_back(s); if(s[0] == "+") begin m_plus_argv.push_back(s); end if(s.len() >= 4 && (s[0]=="-" || s[0]=="+")) begin sub = s.substr(1,3); sub = sub.toupper(); if(sub == "UVM") m_uvm_argv.push_back(s); end end end while(s!="");
从代码可以看出,所有的命令行参数都存储在m_argv[$]队列中,以”+”号开头的命令行参数都存储在m_plus_argv[$]队列中,以”+UVM” 或”-UVM”开头的命令行参数存储在m_uvm_argv[$]队列中。该构造函数在运行run_test()全局task的时候会调用,完成命令行参数的存储。
Ø get_args():返回包括开始仿真时所有命令行参数的队列
Ø get_plusargs():返回包括开始仿真时所有以”+”开头的命令行参数队列
Ø get_uvm_args():返回包括开始仿真时所有以”+UVM”或”-UVM”开头的命令行参数队列
function void get_args (output string args[$]); function void get_plusargs (output string args[$]); function void get_uvm_args (output string args[$]);
Ø get_arg_matches():load所有和输入表达式匹配的的命令行参数到参数队列中,并返回匹配个数,如果输入表达式用//包围,查找时该输入表达式会被当成正则表达式进行匹配,否则会被当成命令行参数的开头进行匹配。 (可能 是 个//形式的正则表达式,且只支持"+foo",/foo/,/^foo.*\.sv)匹配的选项的个数。每个匹配的选项通过args返回。

举例:
function int get_arg_matches (string match, ref string args[$]); //| void'(uvm_cmdline_proc.get_arg_matches("+foo",myargs)); //matches +foo, +foobar //| //doesn't match +barfoo //| void'(uvm_cmdline_proc.get_arg_matches("/foo/",myargs)); //matches +foo, +foobar, //| //foo.sv, barfoo, etc. //| void'(uvm_cmdline_proc.get_arg_matches("/^foo.*\.sv",myargs)); //matches foo.sv //| //and foo123.sv, //| //not barfoo.sv.
Ø get_arg_value():在m_argv[$]队列中查找第一个和输入参数~match~匹配的命令行参数,并返回该命令行参数的后缀(剔除出输入参数~math~之外的部分)。如果有多个匹配,只取第一个匹配的命令行参数的后缀,函数的放回值为该查找匹配个数。

Ø get_arg_values():和get_arg_value()类似,返回的是包括所有和输入参数~match~匹配的命令行参数队列和匹配个数。

2. uvm_cmdline_processor应用
Ø 全局task run_test()通过uvm_cmdline_processor存储所有命令行参数、并获取需要运行用例名称。
Step1: 获取uvm_root的singleton对象句柄,然后调用uvm_root中的run_test() task

Step2: 调用uvm_root::get()的时候会调用uvm_cmdline_processor的new()函数,完成命令行参数存储

Step3: 调用uvm_root中的run_test()的时候会通过uvm_cmdline_processor获取用例名称

Ø 验证环境中通过uvm_cmdline_processor获取命令行参数
Step1: 环境中获取uvm_cmdline_processor singleton对象句柄、 调用get_arg_value()函数获取匹配的命令行参数后缀、在环境中使用获取的参数。因为获取的参数是字符串类型的,如果传入的参数是数值型的,可以调用字符串的atohex函数进行转化。
class A extends uvm_component; ... int slave_adr_max; ... function new(string name, uvm_component parent); super.new(name, parent); endfunction virtual function void build_phase(uvm_phase phase); uvm_cmdline_processor clp; string arg_values[$]; clp=uvm_cmdline_processor::get_inst(); void'(clp.get_arg_values("+slave_adr_max=", arg_values)); slave_adr_max=arg_values[0].atoi(); `uvm_info("CMDLINE_VALUE",$sformatf("slave_adr_max=%h",slave_adr_max),UVM_LOW) endfunction endclass

浙公网安备 33010602011771号