2

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

4

3 に答える 3

1

悪い設定オプションで何を意味するのかよくわかりません。uvm_set_config_int を実行すると、最初の 2 つの引数はインスタンスとフィールド名のみを指定します。これら 2 つが実際に存在する必要はありません。基本的には、後でアクセスできるように、この構成オプションを構成 DB に入れるだけです。

おそらく必要なのは、エージェントにチェックを入れて、「モード」フィールドの値が実際に渡されることを確認することです。

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 でこれをテストしましたが、保存されたかどうかはわかりません。

于 2013-12-20T11:13:53.220 に答える
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

上記の SVUnit テストcmd_line_checker: http://www.edaplayground.com/s/4/768

于 2014-01-03T13:15:37.407 に答える