提供一个厂商独立的通用接口命令行参数,支持分类:

  1. 基本参数和值:get_args,get_args_matches
  2. 工具信息:get_tool_name(),get_tool_version()
  3. 支持从命令行设置各种UVM变量如冗长和配置设置积分和字符串类型:  +uvm_set_config_int, +uvm_set_config_string

类:uvm_cmdline_processor:
这个类在模拟过程中提供一个命令参数接口,这个类应该是当成一个单例类使用,但这不是必须的。一个全局变量 uvm_cmdline_proc在初始化的时候创建,用于访问命令行提供的信息。也支持从命令行配置各种各样的UVM变量。

下面简单的分析下这个类的实现机制:首先这个类继承自uvm_report_object,是一个单态类。

  protected string m_argv[$]; 
  protected string m_plus_argv[$];

protected string m_uvm_argv[$];

 
首先是基本的参数操作:
  get_args(output string args[$]) 命令行的所有用于控制仿真状态的参数做成一个队列并返回。
  get_plusargs(output string args[$]) :返回一个队列,包含所有用于启动仿真的附加参数。
  get_uvm_args(output string args[$]) : 使用一个队列返回所有uvm参数。
  get_arg_matches(string match, ref string args[$]) :这个函数加载所有匹配match string的参数到一个队列,并返回匹配的个数。如果表达式包含//扩展正则表达式,下面是一个例子:
 //| string myargs[$]
  //| initial begin
  //|    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.

  function int get_arg_matches (string match, ref string args[$]);
   `ifndef UVM_CMDLINE_NO_DPI
    chandle exp_h = null;
    int len = match.len();   //检查match的长度
    args.delete();
    if((match.len() > 2) && (match[0] == "/") && (match[match.len()-1] == "/")) begin//如果长度大于2 且包含//
       match = match.substr(1,match.len()-2);//提取需要match的表达式
       exp_h = uvm_dpi_regcomp(match);//使用dpi匹配满足表达式,
       if(exp_h == null) begin
         uvm_report_error("UVM_CMDLINE_PROC", {"Unable to compile the regular expression: ", match}, UVM_NONE);
         return 0;
       end
    end
    foreach (m_argv[i]) begin
      if(exp_h != null) begin
        if(!uvm_dpi_regexec(exp_h, m_argv[i]))
           args.push_back(m_argv[i]);
      end
      else if((m_argv[i].len() >= len) && (m_argv[i].substr(0,len - 1) == match))
        args.push_back(m_argv[i]);
    end
    if(exp_h != null)
      uvm_dpi_regfree(exp_h);
    `endif
    return args.size();

endfunction



get_arg_value(string match,ref string value):从args里面找到第一个满足match的参数,并返回对应的值
get_arg_values(string match, ref srring values[$]) : 从args里面找到所有满足match的参数,并返回一个值得队列。返回参数是匹配的个数。
 
   function new(string name = ""); 用于收集命令行传来的参数,并保存到对应的队列里面
    string s;
    string sub;
    int doInit=1;
    super.new(name);
    do begin
      s = uvm_dpi_get_next_arg(doInit);
      doInit=0;
      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!=""); 


命令行调试:
  1. +UVM_DUMP_CMDLINE_ARGS,允许用户dump所有的命令行参数发给report机制,在uvm_root里面实现
    2. +UVM_TESTNAME= 指定需要从工厂里面创建的test,如果指定很多,则使用第一个。在uvm_root实现,通过run_test调用
  3.+UVM_VERBOSITY= 指定message的冗余程度,在uvm_root实现,通过uvm_root:new()调用
    4. +uvm_set_verbosity 允许用户在特定的phase对特定的message的冗余度进行调整
    // ~+uvm_set_verbosity=<comp>,<id>,<verbosity>,<phase>~ and
    // ~+uvm_set_verbosity=<comp>,<id>,<verbosity>,time,<time>~ 

    +uvm_set_verbosity=uvm_test_top.env0.agent1.*,_ALL_,UVM_FULL,time,800

    5. +uvm_set_action:指定对应的message的动作
    +uvm_set_action=uvm_test_top.env0.*,_ALL_,UVM_ERROR,UVM_NO_ACTION
    6. +uvm_set_severity : 指定对应message的严重等级:
    7. +UVM_TIMEOUT= 
    8. +UVM_MAX_QUIT_COUNT 用于指定当出现几个ERROR就退出仿真
    9. +UVM_PHASE_TRACE
   10. +UVM_OBJECTION_TRACE
   11. +UVM_RESOURCE_DB_TRACE
   12. +UVM_CONFIG_DB_TRACE
   13. 工厂替换参数:  
   // Variable: +uvm_set_inst_override 
    // Variable: +uvm_set_type_override   
    // ~+uvm_set_inst_override=<req_type>,<override_type>,<full_inst_path>~ and
    // ~+uvm_set_type_override=<req_type>,<override_type>[,<replace>]~
 //| <sim command> +uvm_set_type_override=eth_packet,short_eth_packet
   14. 设置变量参数:
    // Variable: +uvm_set_config_int 
    // Variable: +uvm_set_config_string
    // ~+uvm_set_config_int=<comp>,<field>,<value>~ and
    // ~+uvm_set_config_string=<comp>,<field>,<value>~


UVM基础之---Command-line Processor的更多相关文章

  1. 0821找不到Command Line Utility的解决方案

    在Object-C基础教程中写到,要求选择Xcode中Mac OS X - Command Line Utility - Foundation Tool 但在Xcode4.5中Mac OS X中没有C ...

  2. [笔记]The Linux command line

    Notes on The Linux Command Line (by W. E. Shotts Jr.) edited by Gopher 感觉博客园是不是搞了什么CSS在里头--在博客园显示效果挺 ...

  3. 1.1《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——运行终端

    终端是个允许我们运行命令行的程序,运行命令前,先打开它.在MacOS系统上,可以使用macOS应用 Spotlight来打开终端窗口,Spotlight也有其他两种方式触发,一种是键入⌘␣(comma ...

  4. Getting command line access to PHP and MySQL running MAMP on OSX

    建立自己profile路径应该在/Users/yourname/,最后要运行. ./.profile使文件生效,和windows中给添加环境变量是一个道理,还可以看出linux和UNIX默认运行路径为 ...

  5. 指定文件夹 指定文件后缀名 删除整个文件夹 git 冲突解决 create a new repository on the command line push an existing repository from the command line

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c2 ...

  6. 如何在Windows下开发Python:在cmd下运行Python脚本+如何使用Python Shell(command line模式和GUI模式)+如何使用Python IDE

    http://www.crifan.com/how_to_do_python_development_under_windows_environment/ 本文目的 希望对于,如何在Windows下, ...

  7. UVM基础之---------Reporting Classes

    Reporting 类提供了一组工具用于格式化报告输出 report机制大概包括四个主要的类uvm_report_object,uvm_report_handler, uvm_report_serve ...

  8. ERROR: Unrecognized command line argument: 'use'

    Unrecognized command line argument: 'use' gvm--GoLang语言多版本管理工具 基础环境 centos6.5 报错内容 gvm在命令行以外的任何地方调用 ...

  9. IDEA命令行缩短器助你解决此问题:Command line is too long. Shorten command line...

    生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...

  10. Azure Command Line (一)入门

    一,引言 今天我们讲解一个新的 Azure 的知识,叫 “Azure Command Line”,简称 Azure CLI,具体概念是什么,我这里也不多说了,总结下来,Azure CLI 其实就是 用 ...

随机推荐

  1. 百度编辑器ueditor给上传的图片加入水印

    百度编辑器本身是没有为上传图片加入水印的功能,想要在上传的时候加入图片水印,也非常easy.以 ueditor 1.2.6 为例.打开php文件夹以下的imageUp.php文件,查找"$i ...

  2. (工具类)Linux笔记之终端日志记录工具script

    在学习Linux时,有时候终端的打印消息对于我们很重要,可是终端显示也是有一定的缓冲空间的.当信息打印许多时,前面的信息就会被覆盖掉.所以这里网上搜索了一下这方面的介绍.现总结例如以下: script ...

  3. 工作总结 2018 - 4 - 13 select标签 multiple 属性 同时选择多个选项

    <div class="col-xs-4"> @Html.DropDownList("CustomerType", (MultiSelectList ...

  4. 用JAVA生成老电影海报

    先看图,再讲原理.生成效果对照: 机器全自己主动生成.是不是非常酷炫?:) 数字图像,由无数个像素组成,通常情况下,每一个像素包括有RGB三个值,算法原理事实上非常easy: 一,遍历全部像素,将RG ...

  5. Struts2默认拦截器栈及内建拦截器使用具体解释

    Struts2内建拦截器介绍:   alias (别名拦截器):同意參数在跨越多个请求时使用不同别名,该拦截器可将多个Action採用不同名字链接起来,然后用于处理同一信息.  autowiring  ...

  6. 一张图告诉你是须要 SQL 还是 Hadoop

    译序 非常多朋友问时下如火如荼的 Hadoop 是否适合引进我们自己的项目,什么时候用 SQL.什么时候用 Hadoop,它们之间怎样取舍?Aaron Cordova 用一张图来回答你这个问题,对于不 ...

  7. VELT-0.1.6开发:载入根文件系统

    快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 VELT的全称是Vi ...

  8. 仰视源代码,实现strcmp

    //这是系统库的实现 int strcmp(const char* src, const char* dest) { int rtn = 0; while(!(rtn = *(unsigned cha ...

  9. Codevs 1744 格子染色==BZOJ 1296 粉刷匠

    1744 格子染色  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有 n 条木板需要被粉 ...

  10. commons.fileupload 文件上传

    编辑jsp页面获取文件 <html> <head> <base href="<%=basePath%>"> <title> ...