【问题标题】:Connecting monitor and scoreboard in UVM在 UVM 中连接显示器和记分牌
【发布时间】:2015-03-10 21:35:13
【问题描述】:

我正在构建 UVM 测试平台来验证一个简单的设计。我了解到记分牌通常在代理之外。我希望我的记分牌位于代理内部,因为系统中只有一个代理。现在,在我的代理中,我正在尝试连接监视器和记分牌。我想知道是否有一种方法可以在不使用 fifo 的情况下进行连接。

这是我的代码 sn-ps

class my_monitor extends uvm_monitor;
  `uvm_component_utils(my_monitor)
  uvm_analysis_port #(input_seq_item) ap_port;
  input_seq_item mon_item;
  ....
endclass

class my_scoreboard extends uvm_scoreboard;
  `uvm_component_utils(my_scoreboard)
  uvm_analysis_export #(input_seq_item) ap_port_sb;
  ...
endclass

class agent extends uvm_agent;
  `uvm_component_utils(agent)
  sequencer sqr;
  my_driver drv;
  my_sequence seq;
  my_monitor mon;
  my_scoreboard sb;
  ...
    function void connect_phase(uvm_phase phase);
    super.connect_phase(phase);
    drv.seq_item_port.connect(sqr.seq_item_export);
    mon.ap_port.connect(sb.ap_port_sb);
  endfunction
  ...
endclass

我收到以下错误

# KERNEL: UVM_INFO @ 0: reporter [RNTST] Running test test...
# KERNEL: UVM_ERROR @ 0: uvm_test_top.env.sb.ap_port_sb [Connection Error] connection count of 0 does not meet required minimum of 1
# KERNEL: UVM_FATAL @ 0: reporter [BUILDERR] stopping due to build errors
# KERNEL: UVM_INFO /home/build/vlib1/vlib/uvm-1.2/src/base/uvm_report_server.svh(855) @ 0: reporter [UVM/REPORT/SERVER] 

谁能帮我解决这个问题?

提前致谢

【问题讨论】:

    标签: system-verilog uvm


    【解决方案1】:

    问题是您的记分牌分析导出挂起,但它需要连接到导入端口。如果您熟悉 SystemC,则 imp 端口没有直接的等价物。导入基本上是 TLM 分析连接的终止点。 imp 端口然后将调用转发到实例化它的组件。

    将您的代码更改为 uvm_analysis_imp #(...) 并声明一个 write(input_seq_item ite) 函数供其调用,一切都应该正常工作。

    【讨论】:

    • 非常感谢。有效。我还有一个疑问。现在我已经在记分牌中实现了写入功能,记分牌无法控制数据何时到达。如何检查结果?我应该检查写入功能本身,以便监视器将数据写入记分板后,我可以检查还是处于运行阶段?如果应该在run_phase,我怎么知道monitor实际上调用了write函数?
    • write(...) 将在监视器调用ap_port.write(some_item) 时被间接调用(通过方法链接)。您应该在记分板的write(...) 函数中实现任何检查/建模逻辑。
    【解决方案2】:

    检查:您是否使用构造函数来创建分析端口?

    //For monitor
    function new(..);
    ..
    monitor_ap = new("monitor_ap", this);
    endfunction
    

    也可以尝试订阅者类默认的 analysis_export!

    【讨论】:

      【解决方案3】:

      如果您不想声明 write() 函数,那么使用 FIFO 是最好的选择。 这很容易。以下是您编辑的代码..

       class my_monitor extends uvm_monitor;
      `uvm_component_utils(my_monitor)
       uvm_analysis_port #(input_seq_item) ap_port;
       input_seq_item mon_item;
       ....
       endclass
      
      class my_scoreboard extends uvm_scoreboard;
       `uvm_component_utils(my_scoreboard)
        uvm_analysis_export #(input_seq_item) ap_port_sb;
        ...
      endclass
      
      class agent extends uvm_agent;
       `uvm_component_utils(agent)
       sequencer sqr;
       my_driver drv;
       my_sequence seq;
       my_monitor mon;
       my_scoreboard sb;
       uvm_tlm_analysis_fifo fifo;
       ...
         function void connect_phase(uvm_phase phase);
           super.connect_phase(phase);
           drv.seq_item_port.connect(fifo.analysis_export);
           mon.ap_port.connect(fifo.analysis_export);
         endfunction
      ...
      endclass
      

      我认为这将解决您的问题..

      【讨论】:

        【解决方案4】:

        通常,当您使用导出时,发送给它的数据/事务必须传递给导入(这标志着管道的结束)。因此,除非您想将接收到的记分板中的数据发送到其他块,否则您可以在代码中使用uvm_analysis_imp #(...)。 这样做时,您将记分板作为目标,并将监视器作为发起者,因此必须在记分板中实现写入函数,并在事务必须流水线时从监视器调用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-08
          • 2015-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-30
          • 2013-12-04
          • 1970-01-01
          相关资源
          最近更新 更多