uvm_cmdline_processor

1.  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
posted @ 2022-06-19 12:30  mingtian7  阅读(1037)  评论(0)    收藏  举报