我正在使用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
答案 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