This example demonstrates a VMM-on-top environment, where the vmm_env controls test flow phasing. The VMM use model is fully preserved, including user-controlled step-by-step phasing via direct calls to the vmm_env phase methods.
`define VMM_ON_TOP
`include "ovm_vmm_pkg.sv"
`include "ovm_other.sv"
`include "vmm_other.sv"
class vmm_env_with_ovm extends vmm_env_ext;
function new (string name);
super.new(name);
endfunction
`ovm_build
ovm_comp_ext ovm_child,ovm_child2; // VMM containing OVM
virtual function void build();
`vmm_note(log, $psprintf("subtype build %s begin",log.get_name()));
super.build();
ovm_child = ovm_comp_ext::type_id::create({log.get_name(),".ovm_child"},null);
ovm_child2 = new({log.get_name(),".ovm_child2"});
`vmm_note(log, $psprintf("subtype build %s calling ovm_build()",log.get_name()));
ovm_build();
`vmm_note(log, $psprintf("subtype build %s end",log.get_name()));
endfunction
endclass
program example_03_vmm_on_top;
vmm_env_with_ovm e = new("vmm_top");
vmm_log log = new("example_03_vmm_on_top","program");
initial begin
`vmm_note(log, $psprintf("*** calling env.gen_cfg"));
e.gen_cfg();
#100;
`vmm_note(log, $psprintf("*** calling env.build"));
e.build();
#100;
`vmm_note(log, $psprintf("*** calling env.reset_dut"));
e.reset_dut();
#100;
`vmm_note(log, $psprintf("*** calling env.cfg_dut"));
e.cfg_dut();
#100;
`vmm_note(log, $psprintf("*** calling env.start"));
e.start();
#100;
`vmm_note(log, $psprintf("*** calling env.wait_for_end"));
e.wait_for_end();
#100;
`vmm_note(log, $psprintf("*** calling env.stop"));
e.stop();
#100;
`vmm_note(log, $psprintf("*** calling env.cleanup"));
e.cleanup();
#100;
`vmm_note(log, $psprintf("*** calling env.run"));
e.run();
#100 `vmm_note(log, $psprintf("*** after full run"));
end
endprogram
// (inline source)