在 UVM 中连接显示器和记分牌



我正在构建UVM测试平台来验证一个简单的设计。我了解到记分牌通常会在代理之外。我希望我的记分牌在代理内部,因为我在系统中只有一个代理。现在,在我的代理中,我正在尝试连接显示器和记分牌。我想知道是否有办法在不使用 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;
  ...
    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] 

谁能帮我解决这个问题?

提前致谢

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

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

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

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

还可以尝试使用订阅者类默认analysis_export!

如果你不想声明 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

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

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

最新更新