I am new to UVM and working on alu test bench.
at every time i simulating it is giving the following error, after execution of Monitor Run Phase, please can any one suggest that where i have done wrong.
Thanks in Advance.
suresh.
I am new to UVM and working on alu test bench.
at every time i simulating it is giving the following error, after execution of Monitor Run Phase, please can any one suggest that where i have done wrong.
Thanks in Advance.
suresh.
In reply to jpms.suresh:
This means 9200s simulation time passed and stop_request() was not called. This is a large number, does your test/sequences need all of that time (and more) to finish?
→ If yes, you can change that default number via set_timeout() method.
→ If no, then perhaps check for objections that were raised, but never dropped.
In reply to ayehia:
Thanks ayehia.
i have checked with raise and drop objections they are ok, but the thing is After Start of Run_Phase of Test it is going up to Monitor Run_Phase and executing it but not at all coming back to Test Run_phase.
In reply to jpms.suresh:
Can you put piece of your code in monitor and testcase
In reply to yaswanth021:
hi this my Monitor Code.
//UVM_MONITOR
class alu_monitor extends uvm_monitor;
virtual intf vntf; //virtual interface
data_packet data_collected; //create sequence item
uvm_analysis_port#(data_packet)mport;
`uvm_component_utils(alu_monitor) //Factory registration
function new(string name, uvm_component parent); //Construct function new
super.new(name,parent);
endfunction
//Build phase
function void build_phase (uvm_phase phase);
super.build_phase(phase);
mport= new ("mport",this);
data_collected= data_packet::type_id::create("data_collected",this);
if(!uvm_config_db#(virtual intf):: get(this,"","vntf",vntf))
`uvm_fatal("MONITOR::NOVIF",{"virtual interface must be set for:",get_name(),".vntf"})
else
`uvm_info(get_name(),"MONITOR::BuildPhase complete", UVM_LOW)
endfunction
//Run phase
virtual task run_phase (uvm_phase phase);
`uvm_info(get_name(),"Monitor Run Phase\n", UVM_MEDIUM)
@( vntf.mon_cb)
// forever
repeat(10) @(vntf.mon_cb)
begin
collect_data();//task to collect data
end
endtask
virtual task collect_data ();
@( vntf.mon_cb)
begin
if(vntf.mon_cb.inp_en==1)
fork
data_collected.inp_en<=vntf.mon_cb.inp_en;
data_collected.a<= vntf.mon_cb.a;
data_collected.b<= vntf.mon_cb.b;
data_collected.opcode<=vntf.mon_cb.opcode;
data_collected.outp<=vntf.mon_cb.outp;
data_collected.valid_out<=vntf.mon_cb.valid_out;
mport.write(data_collected);
join
end
`uvm_info(get_full_name(), "data collected form virtual interface", UVM_NONE)
$display("a=%0d,b=%0d,opcode=%0d,outp=%0d,valid_out=%0d", vntf.mon_cb.a, vntf.mon_cb.b, vntf.mon_cb.opcode, vntf.mon_cb.outp, vntf.mon_cb.valid_out,$time);
endtask : collect_data
endclass : alu_monitor
And this is my Test code.
//ALU_TESTCASE
import uvm_pkg::*;
`include "uvm_macros.svh"
class test1 extends base_test;
alu_environment envn;
//Factory registration
`uvm_component_utils(test1)
alu_sequence seqn;
//Construct function new
function new(string name="test1",uvm_component parent=null);
super.new(name,parent);
endfunction
//Build phase
function void build_phase(uvm_phase phase);
envn=alu_environment::type_id::create("envn",this);
seqn= alu_sequence::type_id::create("seqn");
super.build_phase(phase);
//uvm_config_db#(uvm_object_wrapper):: set(this,"envn.agent.sequencer.run_phase", "default_sequence",alu_sequence::type_id::get());
endfunction
task run_phase(uvm_phase phase);
`uvm_info(get_full_name(), "start of run phase",UVM_NONE)
phase.raise_objection(this);
seqn.start(envn.agent.sequencer);
#500ns;
phase.drop_objection(this);
uvm_report_info(get_full_name(),"end of run phase",UVM_NONE);
uvm_top.stop_request ();
endtask:run_phase
endclass : test1
Hi,
In your test case in build_phase, the call to “super.new” should be after the declaration.
ie.
function void build_phase(uvm_phase phase);
super.build_phase(phase);
envn=alu_environment::type_id::create("envn",this);
seqn= alu_sequence::type_id::create("seqn");
//uvm_config_db#(uvm_object_wrapper):: set(this,"envn.agent.sequencer.run_phase", "default_sequence",alu_sequence::type_id::get());
endfunction
You can use “+UVM_OBJECTION_TRACE” on the command line. This will print message about objection.
Hope this will help.
In reply to upendra123:
Hi Upendra, what difference does this make? Calling super.new after the function build_phase?