This example shows how to use the <vmm_analysis_adapter> to connect VMM xactors to OVM components with analysis ports and exports.
Two modes of connection are possible.
`define OVM_ON_TOP `include "ovm_macros.svh" `include "ovm_vmm_pkg.sv" `include "ovm_apb_rw.sv" `include "vmm_apb_rw.sv" `include "apb_rw_converters.sv" `include "ovm_producers.sv" `include "ovm_consumers.sv" `include "vmm_consumers.sv" `include "apb_scoreboard.sv" class example extends ovm_component; // OVM source -> VMM sink ovm_publish #(ovm_apb_rw) o_publ; vmm_consumer #(vmm_apb_rw)v_cons; apb_analysis_channel o_to_v; apb_scoreboard comp_o2v; // VMM source -> OVM sink vmm_apb_rw_atomic_gen v_prod; ovm_subscribe #(ovm_apb_rw) o_subs; apb_analysis_channel v_to_o; apb_scoreboard comp_v2o; bit PASS = 0; function new(string name, ovm_component parent=null); super.new(name,parent); endfunction virtual function void build(); o_publ = new("o_prod",this); v_cons = new("v_cons"); o_to_v = new("o_to_v",this, v_cons.in_chan); comp_o2v = new("comp_o2v",this,v_cons.in_chan); v_prod = new("v_prod"); o_subs = new("o_cons",this); v_to_o = new("v_to_o",this, v_prod.out_chan); comp_v2o = new("comp_v2o",this,v_prod.out_chan); v_prod.stop_after_n_insts = 1; endfunction virtual function void connect(); o_publ.out.connect(o_to_v.analysis_export); v_to_o.analysis_port.connect(o_subs.analysis_export); o_publ.out.connect(comp_o2v.ovm_in); v_to_o.analysis_port.connect(comp_v2o.ovm_in); endfunction virtual task run(); ovm_report_info("ovm2vmm","OVM publisher to VMM consumer"); v_cons.start_xactor(); #10; ovm_report_info("vmm2ovm","VMM atomic_gen to OVM subscriber"); v_prod.start_xactor(); endtask virtual function void check(); if(comp_v2o.m_matches == 1 && comp_v2o.m_mismatches == 0 && comp_o2v.m_matches == 1 && comp_o2v.m_mismatches == 0) PASS = 1; endfunction // check virtual function void report(); if(PASS == 1) begin `OVM_REPORT_INFO("PASS","Test PASSED"); end else begin `OVM_REPORT_ERROR("FAIL","Test FAILED"); end endfunction // report endclass module example_10_analysis_channel; example env = new("env"); initial run_test(); initial #200 global_stop_request(); endmodule