如何控制某些组件的详细程度,以便我可以只为少数组件设置详细程度?
让我们说,例如在验证特定功能时,测试中涉及很少的组件/序列/对象/接口等。我想将这些的详细程度设置为UVM_HIGH
。我不想将全局严重性设置为UVM_HIGH
,因为可能会出现大量不相关的调试消息,这可能会增加日志大小。
这样做更干净的方法是什么?可以使用额外的命令行 - plusarg来触发它。基本上,要求是特定功能验证所涉及的测试/组件/序列/对象/接口应该采用全局严重性或特定于功能的严重性,具体取决于哪个更高。
请注意,不能使用uvm_component
的内置报表方法,因为uvm_info
语句可以在uvm_object
扩展类和接口内。
答案 0 :(得分:4)
您可以从命令行控制组件的详细程度作为模拟参数。有两种选择:
+uvm_set_verbosity=<comp>,<id>,<verbosity>,<phase>
+uvm_set_verbosity=<comp>,<id>,<verbosity>,time,<phase>
这个允许您指定希望应用详细程度的模拟时间 comp
是组件的路径,支持通配符*
。示例:uvm_test_top.env.agnt.*
id
是消息标识符。您可以通过将ID设置为_ALL_
来应用于组件范围内的所有消息
verbosity
是冗长的,例如UVM_LOW
,UVM_MEDIUM
,UVM_HIGH
等
phase
是您希望应用详细程度的阶段。
有关详细信息,我建议阅读:
答案 1 :(得分:2)
您可以使用uvm_report_catcher
。它适用于uvm_object
和接口。您还可以使用get_id()
,get_message()
等API来匹配特定组件/对象,并且只能设置该组件/对象的详细程度。
答案 2 :(得分:0)
我尝试了不同的方式,也提出了这种方式。
不确定对人们有多大帮助。
使用运行时命令+user_verb=UVM_LOW +UVM_VERBOSITY=UVM_MEDIUM
class user_class extends uvm_object;
string report_id = "user_class";
string user_verb;
typedef uvm_enum_wrapper#(uvm_verbosity) uvm_verbosity_wrapper_e;
uvm_verbosity current_verb;
uvm_verbosity USER_VERBOSITY=UVM_HIGH;
function new (string name="my_class");
super.new(name);
report_id = name;
//void'($value$plusargs("user_verb=%s",user_verb));
//void'(uvm_verbosity_wrapper_e::from_name (user_verb,USER_VERBOSITY));
if ($test$plusargs("user_verb")) begin
current_verb=uvm_top.get_report_verbosity_level(UVM_INFO,"current_verb"); USER_VERBOSITY=uvm_top.get_report_verbosity_level(UVM_INFO,"user_verb");
end
$display("user_verb = %s",user_verb);
$display("current_verb = %s",current_verb);
endfunction : new
task display;
`uvm_info(report_id,"This is my message",USER_VERBOSITY)
endtask
endclass: user_class
module top;
string id;
string report_id = "top";
user_class m_user_class;
initial begin
m_user_class = new("m_user_class");
m_user_class.display;
`uvm_info(report_id,"This is my message",UVM_LOW)
end
endmodule: top
可以在edaplayground here
找到一个工作示例