【问题标题】:setting the Verbosity only for few /sequences/objects/interfaces in uvm?仅为 uvm 中的少数 /sequences/objects/interfaces 设置详细程度?
【发布时间】:2016-07-09 05:58:58
【问题描述】:

如何控制某些组件的详细程度,以便我可以只为少数组件设置详细程度?

比方说,例如在验证特定功能、测试时,涉及到几组组件/序列/对象/接口等。我想将这些的详细程度设置为UVM_HIGH。我不想将全局严重性设置为UVM_HIGH,因为可能会出现许多不相关的调试消息,这可能会增加日志大小。

什么是更清洁的方法?可以使用额外的命令行加参数来触发它。基本上,要求是特定功能验证所涉及的测试/组件/序列/对象/接口应采用全局严重性或特定于功能的严重性,具体取决于哪个更高。

请注意,不能使用uvm_component 的内置报告方法,因为uvm_info 语句可以在uvm_object 扩展类和接口中。

【问题讨论】:

    标签: system-verilog uvm


    【解决方案1】:

    您可以从命令行作为模拟参数控制组件的详细程度。有两种选择:

    • <b>+uvm_set_verbosity=</b>&lt;comp&gt;,&lt;id&gt;,&lt;verbosity&gt;,&lt;phase&gt;
    • <b>+uvm_set_verbosity=</b>&lt;comp&gt;,&lt;id&gt;,&lt;verbosity&gt;,<b>time</b>,&lt;phase&gt; 这个可以让你指定你希望应用的详细程度开始的模拟时间

    comp是组件的路径,支持通配符*。示例:uvm_test_top.env.agnt.*
    id 是消息标识符。您可以通过将 id 设置为 _ALL_
    verbosity 来应用于组件范围内的所有消息,例如UVM_LOWUVM_MEDIUMUVM_HIGHphase 是您希望应用详细程度的阶段。

    更多细节我建议阅读:

    【讨论】:

    • 如果你和我一样,并且你有一个为你运行模拟程序的脚本,命令行上的通配符可能会导致问题。这只需要你用反斜杠转义它\*
    • 感谢 Greg,但这需要跟踪参与功能验证的所有组件,并为每个组件使用 plusarg。我想知道有没有办法用一个 plusarg 来解决这个问题。我不介意在我的 TB 中添加额外的代码行
    • @VineethVS,阅读 4.2。 使用方法调用更改详细程度(来自UVM Message Display Commands Capabilities),了解如何在代码中设置详细程度。我没有将它包含在我的原始答案中,因为如果您编写代码只是为了解决少数情况,它会造成维护混乱。
    【解决方案2】:

    您可以为此使用uvm_report_catcher。它适用于uvm_object 和界面。您还可以使用get_id()get_message() 等 API 来匹配特定的组件/对象,并且只能设置该组件/对象的详细程度。

    here on edaplaygroud上查看我的简单示例

    【讨论】:

      【解决方案3】:

      我尝试了不同的方法,也想出了这个方法。

      不确定它对人们有多大帮助。

      用运行时命令+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 找到一个工作示例

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多