在 UVM 中连接监视器和记分牌
Connecting monitor and scoreboard in 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]
谁能帮我解决这个问题?
提前致谢
问题是你的记分板分析导出挂起,但它需要连接到导入端口。如果您熟悉 SystemC,imp 端口没有直接的等效项。导入基本上是 TLM 分析连接的终止点。然后 imp 端口将调用转发到实例化它的组件。
将您的代码更改为 uvm_analysis_imp #(...)
并声明一个 write(input_seq_item ite)
函数供其调用,一切正常。
如果您不想声明 write() 函数,那么使用 FIFO 是最佳选择。
非常easy.Following是你编辑的代码..
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
我想这会解决你的问题..
检查:是否使用构造函数创建分析端口?
//For monitor
function new(..);
..
monitor_ap = new("monitor_ap", this);
endfunction
也尝试使用订阅者 class 默认值 analysis_export!
通常,当您使用导出时,发送给它的 data/transaction 必须传递给导入(它标志着管道的末端)。因此,除非您想将接收到的记分牌数据发送到其他块,否则您可以在代码中使用 uvm_analysis_imp #(...)
。
这样做时,您将记分板作为目标,并将监视器作为发起者,因此必须在记分板中实现写入功能,并在必须对事务进行流水线处理时从监视器调用。
我正在构建 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]
谁能帮我解决这个问题?
提前致谢
问题是你的记分板分析导出挂起,但它需要连接到导入端口。如果您熟悉 SystemC,imp 端口没有直接的等效项。导入基本上是 TLM 分析连接的终止点。然后 imp 端口将调用转发到实例化它的组件。
将您的代码更改为 uvm_analysis_imp #(...)
并声明一个 write(input_seq_item ite)
函数供其调用,一切正常。
如果您不想声明 write() 函数,那么使用 FIFO 是最佳选择。 非常easy.Following是你编辑的代码..
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
我想这会解决你的问题..
检查:是否使用构造函数创建分析端口?
//For monitor
function new(..);
..
monitor_ap = new("monitor_ap", this);
endfunction
也尝试使用订阅者 class 默认值 analysis_export!
通常,当您使用导出时,发送给它的 data/transaction 必须传递给导入(它标志着管道的末端)。因此,除非您想将接收到的记分牌数据发送到其他块,否则您可以在代码中使用 uvm_analysis_imp #(...)
。
这样做时,您将记分板作为目标,并将监视器作为发起者,因此必须在记分板中实现写入功能,并在必须对事务进行流水线处理时从监视器调用。