求助:UVM的driver为什么只发一个sequence就直接结束了呀?
时间:10-02
整理:3721RD
点击:
各位:
最近正在折腾UVM,然后反被UVM折腾。这些天几乎天天发帖子求助,唉——。这次的问题是写的driver在发了一个sequence之后就不再从sequencer中取req来发了,不知道会有什么原因导致这样的情况呢?
恩,详细说明一下:我把一整帧的图像(2073600个像素)信息作为一个transaction,由sequencer一次发送,然后在driver中拆开,每个时钟发送一个像素的r/g/b值。之前跑一帧图像都没问题,跑两帧图像的时候,每次都是发送完一帧图像数据后,仿真就停下了。不知道为什么。相关代码如下:
sequence:
task send_two_1080p_bmp_seq::body();
`if(starting_phase != null)
starting_phase.raise_objection(this);
repeat(2) begin
`uvm_do_with(req,{req.r.size()==2073600;
req.g.size()==2073600;
req.b.size()==2073600;})
$display("debug 2");
end
if(starting_phase != null)
starting_phase.drop_objection(this);
endtask : body
driver:
task master_driver::run_phase(uvm_phase phase);
get_and_drive();
endtask : run_phase
task master_driver::get_and_drive();
while(1) begin
reset();
fork
@(negedge vif.rst_n)
`uvm_info("MASTER_DRIVER","get_and_drive: Reset dropped",UVM_MEDIUM)
begin
forever begin
@(posedge vif.clk iff(vif.rst_n))
seq_item_port.get_next_item(req);
drive_transfer(req);
seq_item_port.item_done(req);
$display("debug1");
end
end
join_any
disable fork;
if(req.is_active()) this.end_tr(req);
end
endtask : get_and_drive
task master_driver::drive_transfer(transfer trans);
int pix_cnt=0;
int line_cnt=0;
repeat(cfg.driver_cfg.vs_bak_cnt)
drive_a_null_line();
.........
repeat(1080)
drive_a_valid_line();
.........
endtask : drive_transfer
跑出的结果如下(部分):
..........
send 50 null lines --
send 1080 valid lines
send 108 null lines
debug1
UVM_INFO /tools/cadence/tools/uvm/uvm_lib/uvm_sv/sv/base/uvm_objection.svh(1120) @57163650:reporter [TEST_DONE] 'run' phase is ready to processd to the 'extract' phase
有谁能指点一下迷津呀?
最近正在折腾UVM,然后反被UVM折腾。这些天几乎天天发帖子求助,唉——。这次的问题是写的driver在发了一个sequence之后就不再从sequencer中取req来发了,不知道会有什么原因导致这样的情况呢?
恩,详细说明一下:我把一整帧的图像(2073600个像素)信息作为一个transaction,由sequencer一次发送,然后在driver中拆开,每个时钟发送一个像素的r/g/b值。之前跑一帧图像都没问题,跑两帧图像的时候,每次都是发送完一帧图像数据后,仿真就停下了。不知道为什么。相关代码如下:
sequence:
task send_two_1080p_bmp_seq::body();
`if(starting_phase != null)
starting_phase.raise_objection(this);
repeat(2) begin
`uvm_do_with(req,{req.r.size()==2073600;
req.g.size()==2073600;
req.b.size()==2073600;})
$display("debug 2");
end
if(starting_phase != null)
starting_phase.drop_objection(this);
endtask : body
driver:
task master_driver::run_phase(uvm_phase phase);
get_and_drive();
endtask : run_phase
task master_driver::get_and_drive();
while(1) begin
reset();
fork
@(negedge vif.rst_n)
`uvm_info("MASTER_DRIVER","get_and_drive: Reset dropped",UVM_MEDIUM)
begin
forever begin
@(posedge vif.clk iff(vif.rst_n))
seq_item_port.get_next_item(req);
drive_transfer(req);
seq_item_port.item_done(req);
$display("debug1");
end
end
join_any
disable fork;
if(req.is_active()) this.end_tr(req);
end
endtask : get_and_drive
task master_driver::drive_transfer(transfer trans);
int pix_cnt=0;
int line_cnt=0;
repeat(cfg.driver_cfg.vs_bak_cnt)
drive_a_null_line();
.........
repeat(1080)
drive_a_valid_line();
.........
endtask : drive_transfer
跑出的结果如下(部分):
..........
send 50 null lines --
send 1080 valid lines
send 108 null lines
debug1
UVM_INFO /tools/cadence/tools/uvm/uvm_lib/uvm_sv/sv/base/uvm_objection.svh(1120) @57163650:reporter [TEST_DONE] 'run' phase is ready to processd to the 'extract' phase
有谁能指点一下迷津呀?
确认这个发两帧的sequence是不是通过sequencer发送给driver了?在你的描述里面有看到tc的结构。
谢谢!
是通过sequencer发给driver了。在class rgb_bmp_test中,通过uvm_config_db配置的。如下:
function void rgb_bmp_test::build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_config_db #(uvm_object_wrapper)::set(this,"tb0.vdo.master.sequencer.run_phase","default_phase",send_two_1080p_bmp_seq::type_id::get());
endfunction : build_phase
另外,弱弱的问一下,什么是tc的结构呀?
我晕,找到问题所在了。
写代码的时候用了CTRL+P补全,于是在用`uvm_object_utils()宏注册的时候,里面是send_one_1080p_bmp_seq,所以最后跑的还是一帧图像的。改过来之后就OK了。
谢谢gaurson的指点。
我得去发新问题的求助贴了。