UVM可以标记错误的命令行参数吗?

时间:2013-12-19 18:03:11

标签: command-line-arguments system-verilog uvm

我正在使用UVM命令行参数在UVM层次结构中设置配置属性。

当我传入错误的配置选项时,我希望看到UVM_ERROR或其他失败指示。最简单的方法是什么?

例如,如果我传递了一个错误的选项,如:

+uvm_set_config_int=bad,mode,5

sim完成了,我没有看到日志中有任何关于该选项不好的指示:

# UVM_INFO @ 0: reporter [UVM_CMDLINE_PROC] Applying config setting from the command line: +uvm_set_config_int=bad,mode,5

可以在此处运行完整代码:http://www.edaplayground.com/s/4/673

3 个答案:

答案 0 :(得分:1)

我不确定你的配置选项是什么意思。执行uvm_set_config_int时,前两个参数仅指定实例和字段名称。没有要求这两个实际存在。您基本上只是将此配置选项放在配置数据库中以便稍后访问。

您可能想要的是检查您的代理,以确保它实际上为其“模式”字段传递了值。

class my_agent extends uvm_agent;

  //...  

  function void build_phase(uvm_phase phase);
    if (!uvm_config_db #(int)::get(this, "", "mode", mode))
      `uvm_fatal("CFGERR", "Agent was not passed a config")
  endfunction

endclass

我用你的代码在EDAPlayground上测试了这个,但我不确定它是否已保存。

答案 1 :(得分:0)

UVM可以使用静态uvm_component::print_config_matches位输出有关配置设置的其他信息。

在示例中,在测试平台中设置以下内容:

uvm_component::print_config_matches = 1;

对于“良好”配置设置,您将在输出中看到以下内容:

# UVM_INFO @ 0: reporter [UVM_CMDLINE_PROC] Applying config setting from the command line: +uvm_set_config_int=*,mode,5
# UVM_INFO @ 0: uvm_test_top.my_agent [CFGAPL] applying configuration settings
# UVM_INFO @ 0: uvm_test_top.my_agent [CFGAPL] applying configuration to field mode
# UVM_INFO testbench(40) @ 0: uvm_test_top [my_test] Running test with mode 5

对于“错误”配置设置,您将在输出中看到以下内容:

# UVM_INFO @ 0: reporter [UVM_CMDLINE_PROC] Applying config setting from the command line: +uvm_set_config_int=bad,mode,5
# UVM_INFO @ 0: uvm_test_top.my_agent [CFGAPL] applying configuration settings
# UVM_INFO testbench(40) @ 0: uvm_test_top [my_test] Running test with mode 0

因此,现在您可以解析输出并检查每[CFGAPL] applying configuration to field后是否至少有一个[UVM_CMDLINE_PROC] Applying config settings

修改后的代码示例:http://www.edaplayground.com/s/4/681

答案 2 :(得分:0)

我创建了一个可以标记错误uvm_component选项的+uvm_set_config_。如果传入错误选项,它会抛出UVM_ERROR,例如:

# UVM_ERROR cmd_line_checker.svh(112) @ 0: uvm_test_top.cmd_line_checker [BAD_CONFIG] UVM match for command line config bad,mode not found

可以在此处运行完整示例:http://www.edaplayground.com/s/4/766

代码:

/**
 * This is a utility class to validate command line arguments in the form:
 * +uvm_set_config_int=<inst_name>,<field_name>,<value>
 * +uvm_set_config_string=<inst_name>,<field_name>,<value>
 */
class cmd_line_checker extends uvm_component;

  /**
   * The enable for this checker.
   */
  bit enable = 1'b1;

  `uvm_component_utils_begin(cmd_line_checker)
    `uvm_field_int(enable, UVM_ALL_ON)
  `uvm_component_utils_end

  /**
   * UVM constructor.
   */
  function new(string name, uvm_component parent);
    super.new(name, parent);
  endfunction

  /**
   * UVM connect phase.
   */
  function void connect_phase(uvm_phase phase);
    if (enable) begin
      check_command_line();
    end
  endfunction

  /**
   * Validate all command line arguments in the form:
   * +uvm_set_config_int=<inst_name>,<field_name>,<value>
   * +uvm_set_config_string=<inst_name>,<field_name>,<value>
   */
  function void check_command_line();
    string args[$];
    uvm_root root = uvm_root::get();

    void'(root.clp.get_arg_matches(
      "/^\\+(UVM_SET_CONFIG_INT|uvm_set_config_int)=/",args));
    foreach(args[i]) begin
      check_config(args[i].substr(20, args[i].len()-1));
    end
    void'(root.clp.get_arg_matches(
      "/^\\+(UVM_SET_CONFIG_STRING|uvm_set_config_string)=/",args));
    foreach(args[i]) begin
      check_config(args[i].substr(23, args[i].len()-1));
    end
  endfunction

  /**
   * Check a single command line argument.
   * The instance name and field name should exist.
   * @param cfg the command line argument in the form:
   *     <inst_name>,<field_name>,<value>
   */
  function void check_config(string cfg);
    string split_val[$];
    string inst_name;
    string field_name;
    uvm_root root;
    uvm_component components[$];
    bit match_found;

    uvm_split_string(cfg, ",", split_val);
    inst_name = split_val[0];
    field_name = split_val[1];

    `uvm_info("CHECK_CONFIG",
        $sformatf("checking inst_name:%s, field_name:%s",
          inst_name, field_name), UVM_HIGH);

    // Get every object in uvm hierarchy that matches
    root = uvm_root::get();
    root.find_all(inst_name, components);

    // If object matches inst_name, check whether a match for field_name exists
    foreach (components[i]) begin
      if (match_found) begin
        break;
      end else begin
        uvm_component component = components[i];
        uvm_status_container status = component.__m_uvm_status_container;
        component.__m_uvm_field_automation (null, UVM_CHECK_FIELDS, "");
        if (uvm_has_wildcard(field_name)) begin
          foreach (status.field_array[name]) begin
            if (!(uvm_re_match(uvm_glob_to_re(field_name), name))) begin
              match_found = 1;
              break;
            end
          end
        end else begin
          // No wildcards to match
          match_found = status.field_array[field_name];
        end
        status.field_array.delete();
        if (match_found) begin
          `uvm_info("MATCH_FOUND", $sformatf(
                "UVM match for command line config %s,%s found in %s",
                inst_name, field_name, component.get_full_name()), UVM_HIGH);
          break;
        end
      end
    end

    if (!match_found) begin
      `uvm_error("BAD_CONFIG",
          $sformatf("UVM match for command line config %s,%s not found",
          inst_name, field_name));
    end
  endfunction

endclass

上述cmd_line_checker的SVUnit测试:http://www.edaplayground.com/s/4/768