So, I share a part of my test environnement:
TOP
//----------------------------------------------------------------------
// top
//----------------------------------------------------------------------
module top;
import ovm_pkg::*;
import test_pkg::*;
import dut_model_pkg::*;
import dut_phase_mngt_top_struct_wrapper_pkg::*;
`include "dut_phase_mngt_top_struct_wrapper.sv"
`include "clock_reset.sv"
import agent_pkg::*;
import env_pkg::*;
//--------------------------------------------------------------------
// hardware instantiation
//--------------------------------------------------------------------
pin_vif vif;
my_if pif();
clock_reset cr (pif);
dut_phase_mngt_top_struct_wp dut_wp (
.ENPLL_WP(pif.ENPLL),
.RST_N_WP(pif.rst_n),
.clk_high_PLLext_i_WP(pif.clk),
.clk_nom_i_WP(pif.clk_nom_i),
.clk_pll_ext_i_WP(pif.clk_pll_ext_i),
.clk_red_i_WP(pif.clk_red_i),
.config_0_A_WP(pif.config_0_A),
.config_0_B_WP(pif.config_0_B),
.config_0_C_WP(pif.config_0_C),
.config_0_D_WP(pif.config_0_D),
.config_180_A_WP(pif.config_180_A),
.config_180_B_WP(pif.config_180_B),
.config_180_C_WP(pif.config_180_C),
.config_180_D_WP(pif.config_180_D),
.config_pll_WP(pif.config_pll),
.disable_lock_ok_WP(pif.disable_lock_ok),
.max_i_WP(pif.max_i),
.mode_async_WP(pif.mode_async),
.mode_scan_WP(pif.mode_scan),
.nb_step_to_mngt_i_WP(pif.nb_step_to_mngt_i),
.sel_clk_i_WP(pif.sel_clk_i),
.sync_i_WP(pif.sync_i),
.clk_out_o_WP(pif.clk_out_o),
.lock_ok_WP(pif.lock_ok),
.VCCPLL_WP(pif.VCCPLL),
.VSSPLL_WP(pif.VSSPLL));
//--------------------------------------------------------------------
// run the tests
//--------------------------------------------------------------------
//test m_test;
initial begin
vif = new(pif);
set_config_object("*","vif", vif, 0);
//m_test=new("m_test");
run_test("test");
end
endmodule: top
TEST_BASE
`ifndef __TEST_BASE
`define __TEST_BASE
//----------------------------------------------------------------------
// test_base
//----------------------------------------------------------------------
class test_base extends ovm_test;
// internal components
env m_env;
ovm_sequencer #(driv_tran) m_test_sequencer;
//--------------------------------------------------------------------
// new
//--------------------------------------------------------------------
function new(string name,
ovm_component parent);
super.new(name, parent);
endfunction: new
//--------------------------------------------------------------------
// build
//--------------------------------------------------------------------
function void build();
super.build();
ovm_report_info(get_full_name(),"Build",OVM_LOG);
set_report_verbosity_level_hier(OVM_MEDIUM);
set_config_int("*.m_scoreboard","check_response",1);
set_config_string("*.m_agent", "is_active", "OVM_ACTIVE");
m_env = new("m_env", this);
endfunction: build
//--------------------------------------------------------------------
// end_of_elaboration
//--------------------------------------------------------------------
function void end_of_elaboration();
super.end_of_elaboration();
//Find the actual sequencer
ovm_report_info(get_full_name(),"End of elaboration",OVM_LOG);
$cast(m_test_sequencer,ovm_top.find("*.m_sequencer"));
m_test_sequencer.print();
endfunction: end_of_elaboration
endclass: test_base
`endif
TEST
`ifndef __TEST
`define __TEST
//----------------------------------------------------------------------
// test
//----------------------------------------------------------------------
class test extends test_base;
// declaration macros
`ovm_component_utils_begin(test)
`ovm_component_utils_end
//--------------------------------------------------------------------
// new
//--------------------------------------------------------------------
sequence1 seq;
function new(string name, ovm_component parent = null);
super.new(name, parent);
endfunction: new
//--------------------------------------------------------------------
// build
//--------------------------------------------------------------------
function void build();
super.build();
ovm_report_info(get_full_name(),"Build",OVM_LOG);
endfunction: build
function void end_of_elaboration();
print();
endfunction
//--------------------------------------------------------------------
// run
//--------------------------------------------------------------------
task run();
$display("in run test 1");
seq = new();
seq.print();
$display("in run test 2");
//ovm_report_info("test", "Test is working", OVM_LOW);
// seq.start(m_env.m_agent.m_sequencer);
seq.start(m_test_sequencer);
$display("in run test 3");
//ovm_report_info("test", "Test is done", OVM_LOW);
global_stop_request();
//ovm_report_info("test", "... test completed", OVM_LOW);
endtask: run
endclass: test
`endif
SEQUENCE
`ifndef __SEQUENCE1
`define __SEQUENCE1
//----------------------------------------------------------------------
// sequence1
//----------------------------------------------------------------------
class sequence1 extends ovm_sequence #(driv_tran);
// declaration macros
`ovm_object_utils_begin(sequence1)
`ovm_object_utils_end
// variables
//rand int adress;
//rand int data;
//in_tran req;
//out_tran rsp;
//--------------------------------------------------------------------
// new
//--------------------------------------------------------------------
function new(string name = "sequence1");
super.new(name);
endfunction: new
//--------------------------------------------------------------------
// body
//--------------------------------------------------------------------
task body();
driv_tran t;
$display("in run test 21");
for(int unsigned i = 0; i < 10; i++) begin
$display("in run test 22");
wait_for_grant();
t = new();
assert(t.randomize());
send_request(t);
// ovm_report_info(get_type_name(),"Starting sequence1", OVM_LOW);
// for(int unsigned i=0; i<10; i++) begin
// wait_for_grant();
// req=new();
// assert(req.randomize());
// send_request(req);
// `ovm_do(req);
// $display("%0t : sequence1() starting...",$time);
//`ovm_do_with(req,{req.addr < 'h10; req.data == data; })
// `ovm_do_with(req,{req.addr > 'h10; req.data == data; })
//$display("%0t : sequence1() done !",$time);
//assert($cast(req, create_item(in_tran::get_type(), m_sequencer, "req")));
//start_item(req);
//assert(req.randomize());
//ovm_report_info("sequence1",{"Sending transaction ",req.convert2string()}, OVM_MEDIUM);
//finish_item(req);
//get_response(rsp);
end
endtask: body
endclass: sequence1
`endif
ENV
`ifndef __ENV
`define __ENV
//----------------------------------------------------------------------
// env
//----------------------------------------------------------------------
class env extends ovm_env;
// declaration macros
`ovm_component_utils_begin(env)
`ovm_component_utils_end
// internal components
agent m_agent;
analysis_group m_analysis_group;
// dut_model_env m_dut_model_env;
//--------------------------------------------------------------------
// new
//--------------------------------------------------------------------
function new(string name,
ovm_component parent);
super.new(name, parent);
endfunction: new
//--------------------------------------------------------------------
// build
//--------------------------------------------------------------------
function void build();
super.build();
ovm_report_info(get_full_name(),"Build",OVM_LOG);
// m_dut_model_env = dut_model_env::type_id::create("m_dut_model_env", this);
//m_agent = agent::type_id::create("m_agent", this);
m_agent = new("m_agent",this);
//m_analysis_group = analysis_group::type_id::create("m_analysis_group", this);
m_analysis_group = new("m_analysis_group",this);
endfunction: build
//--------------------------------------------------------------------
// connect
//--------------------------------------------------------------------
function void connect();
super.connect();
ovm_report_info(get_full_name(),"Connect",OVM_LOG);
m_agent.driv_ap.connect(m_analysis_group.m_coverage.driv_export);
m_agent.mon_ap.connect(m_analysis_group.mon_export);
// m_agent.driv_ap.connect(m_dut_model_env.dut_export);
// m_dut_model_env.dut_ap.connect(m_analysis_group.dut_export);
endfunction: connect
//--------------------------------------------------------------------
// end_of_elaboration
//--------------------------------------------------------------------
function void end_of_elaboration();
super.end_of_elaboration();
ovm_report_info(get_full_name(),"End of elaboration",OVM_LOG);
endfunction: end_of_elaboration
//--------------------------------------------------------------------
// report
//--------------------------------------------------------------------
virtual function void report();
super.report();
endfunction: report
// task run();
// seq = new();
// seq.start(sqr);
// global_stop_request();
// endtask
endclass: env
`endif
AGENT
`ifndef __MY_AGENT
`define __MY_AGENT
//----------------------------------------------------------------------
// agent
//----------------------------------------------------------------------
class agent extends ovm_agent;
// configuration items
ovm_active_passive_enum is_active = OVM_ACTIVE;
// declaration macros
`ovm_component_utils_begin(agent)
`ovm_field_enum(ovm_active_passive_enum, is_active, OVM_ALL_ON)
`ovm_component_utils_end
// external interfaces
ovm_analysis_port #(mon_tran) mon_ap;
ovm_analysis_port #(driv_tran) driv_ap;
// internal components
sequencer m_sequencer;
monitor m_monitor;
driver m_driver;
//--------------------------------------------------------------------
// new
//--------------------------------------------------------------------
function new(string name,
ovm_component parent);
super.new(name, parent);
endfunction: new
//--------------------------------------------------------------------
// build
//--------------------------------------------------------------------
function void build();
super.build();
ovm_report_info(get_full_name(),"Build",OVM_LOG);
mon_ap = new("mon_ap", this);
driv_ap = new("driv_ap", this);
//m_monitor = monitor::type_id::create("m_monitor", this);
m_monitor = new("m_monitor", this);
//if (is_active == OVM_ACTIVE) begin
//m_driver = driver::type_id::create("m_driver",this);
m_driver = new("m_driver", this);
//m_sequencer = sequencer::type_id::create("m_sequencer", this);
m_sequencer = new("m_sequencer", this);
//end
endfunction: build
//--------------------------------------------------------------------
// connect
//--------------------------------------------------------------------
function void connect();
super.connect();
ovm_report_info(get_full_name(),"Connect",OVM_LOG);
m_monitor.mon_ap.connect(mon_ap);
m_driver.driv_ap.connect(driv_ap);
//dut_ref_export.connect(m_analysis_group.dut_ref_export);
m_driver.rsp_port.connect(m_sequencer.rsp_export); // false
m_sequencer.rsp_export.connect(m_sequencer.sqr_rsp_analysis_fifo.analysis_export);
//if (is_active == OVM_ACTIVE) begin
//m_driver.driv_ap.connect(driv_ap);
//driv_ap.connect(m_driver.driv_ap);
// m_sequencer.seq_item_export.connect(
m_driver.seq_item_port.connect(m_sequencer.seq_item_export);
//end
endfunction: connect
endclass: agent
`endif
SEQUENCER
`ifndef __SEQUENCER
`define __SEQUENCER
//----------------------------------------------------------------------
// sequencer
//----------------------------------------------------------------------
class sequencer extends ovm_sequencer #(driv_tran);
// declaration macros
`ovm_sequencer_utils_begin(sequencer)
`ovm_sequencer_utils_end
// internal components
driv_tran req_txn;
//--------------------------------------------------------------------
// new
//--------------------------------------------------------------------
function new(string name,
ovm_component parent);
super.new(name, parent);
`ovm_update_sequence_lib_and_item(driv_tran)
endfunction: new
function void build();
super.build();
ovm_report_info(get_full_name(),"Build",OVM_LOG);
endfunction: build
endclass: sequencer
`endif
DRIVER
`ifndef __DRIVER
`define __DRIVER
//----------------------------------------------------------------------
// driver
//----------------------------------------------------------------------
class driver extends ovm_driver #(driv_tran);
// declaration macros
`ovm_component_utils_begin(driver)
`ovm_component_utils_end
ovm_seq_item_pull_port #(driv_tran) seq_item_port;
driv_tran t;
// external interfaces
ovm_analysis_port #(driv_tran) driv_ap;
// internal components
in_tran req_txn;
out_tran rsp_txn;
// interface
virtual my_if vif;
// local variables
//int tests = 0;
//--------------------------------------------------------------------
// new
//--------------------------------------------------------------------
function new (string name,
ovm_component parent);
super.new(name,parent);
endfunction: new
//--------------------------------------------------------------------
// build
//--------------------------------------------------------------------
function void build();
// ovm_object tmp;
pin_vif v;
super.build();
seq_item_port = new("seq_item_port", this);
driv_ap = new("driv_ap", this);
ovm_report_info(get_full_name(),"Build",OVM_LOG);
//driv_ap = new("driv_ap",this);
// if(!get_config_object("vif", tmp, 0)) begin
// ovm_report_error("build", "no virtual interface available");
// end
// else begin
// if(!$cast(v, tmp)) begin
// ovm_report_error("build", "virtual interface is incorrect type");
// end
// else begin
// vif = v.m_vif;
// end
// end
endfunction: build
//--------------------------------------------------------------------
// run
//--------------------------------------------------------------------
task run();
$display("in run test 22");
//forever begin
//seq_item_port.get(t);
seq_item_port.get_next_item(t);
$display("in run test 23");
//ovm_report_info("get request", t.do_sprint());
// #1;
//end
endtask: run
//--------------------------------------------------------------------
// reset_dut
//--------------------------------------------------------------------
task reset_dut();
vif.addr <= 8'bx;
vif.data <= 8'bx;
endtask: reset_dut
endclass: driver
`endif
DRIV_TRAN
`ifndef __DRIV_TRAN
`define __DRIV_TRAN
//----------------------------------------------------------------------
// driv_tran
//----------------------------------------------------------------------
class driv_tran extends ovm_sequence_item;
// variables
// --- Example code ---
rand bit [7:0] data;
rand bit [15:0] addr;
// declaration macros
`ovm_object_utils_begin(driv_tran)
//`ovm_field_int(result, OVM_ALL_ON)
`ovm_object_utils_end
//--------------------------------------------------------------------
// new
//--------------------------------------------------------------------
function new (string name = "driv_tran");
super.new(name);
endfunction: new
//--------------------------------------------------------------------
// do_print
//--------------------------------------------------------------------
function string do_sprint(ovm_printer printer=null);
string s;
$sformat(s, "addr = %02x data = %1x", addr, data);
return s;
endfunction
//--------------------------------------------------------------------
// convert2string
//--------------------------------------------------------------------
function string convert2string();
string str;
// $sformat(str, "RESULT: %0d", result);
return str;
endfunction: convert2string
endclass: driv_tran
`endif