From 4fc765f9126d070c8ef0d5db4271311501ce815f Mon Sep 17 00:00:00 2001 From: mjoekhan Date: Tue, 21 Jul 2026 16:14:00 +0500 Subject: [PATCH] UVM track: seed uvm/, docs, and hello_uvm example Standalone muhammadjawadkhan/iverilog-uvm project setup. Documents that this fork is experimental and must not PR UVM work to steveicarus/iverilog. Seeds uvm/ from IVL_UVM and adds roadmap/status workflow docs plus a smoke example. --- README.md | 7 + UVM_README.md | 24 + docs/ROADMAP.md | 29 + docs/STATUS.md | 25 + docs/WORKFLOW.md | 34 + examples/hello_uvm/flist.f | 5 + examples/hello_uvm/hello_uvm.sv | 18 + uvm/FORK_NOTE.md | 11 + uvm/README.md | 44 + uvm/depot/add_ifndef.py | 44 + uvm/depot/ivl_mbx_via_q/ivl_mbx_via_q.sv | 47 + uvm/depot/ivl_mbx_via_q/ivl_uvm_i413.sv | 46 + uvm/depot/ivl_mbx_via_q/run_dir/flist.class | 1 + uvm/depot/ivl_plusargs.sv | 33 + uvm/depot/ivl_uvm_test_ex.sv | 47 + uvm/depot/uml_diagram.sv | 107 + uvm/ivl_uvm_intf_gen/README.md | 24 + uvm/ivl_uvm_intf_gen/examples/alu.v | 27 + .../examples/register_slice.v | 26 + .../ivlog_vpi_src/az_ivl_uvm_common.h | 40 + .../ivlog_vpi_src/az_ivl_uvm_intf_gen.c | 295 ++ .../refLogs/ivl_uvm_comp_0.log | 0 .../refLogs/ivl_uvm_comp_1.log | 0 .../refLogs/ivl_uvm_comp_2.log | 2 + .../refLogs/ivl_uvm_comp_3.log | 2 + .../refLogs/ivl_uvm_comp_4.log | 3 + .../refLogs/ivl_uvm_comp_5.log | 0 uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0.log | 21 + .../refLogs/ivl_uvm_run_0_FULL.log | 23 + .../refLogs/ivl_uvm_run_0_HIGH.log | 22 + uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_1.log | 22 + uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_2.log | 22 + uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_3.log | 23 + uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_4.log | 22 + uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_5.log | 39 + uvm/ivl_uvm_regress/run_dir/flist.t0 | 5 + uvm/ivl_uvm_regress/run_dir/flist.t1 | 5 + uvm/ivl_uvm_regress/run_dir/flist.t2 | 5 + uvm/ivl_uvm_regress/run_dir/flist.t3 | 7 + uvm/ivl_uvm_regress/run_dir/flist.t4 | 8 + uvm/ivl_uvm_regress/run_dir/flist.t5 | 8 + uvm/ivl_uvm_regress/run_dir/flist.t6 | 6 + uvm/ivl_uvm_regress/run_dir/flist.t7 | 7 + .../run_dir/ivl_uvm_comp_0.log | 0 uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0.log | 24 + .../run_dir/ivl_uvm_run_0_FULL.log | 31 + .../run_dir/ivl_uvm_run_0_HIGH.log | 30 + .../run_dir/vw_ivl_ivl_uvm.vvp | 3617 ++++++++++++++++ uvm/ivl_uvm_src/README.md | 1 + uvm/ivl_uvm_src/base/uvm_misc.svh | 714 ++++ uvm/ivl_uvm_src/base/uvm_object.svh | 1133 +++++ uvm/ivl_uvm_src/base/uvm_object_globals.svh | 706 ++++ uvm/ivl_uvm_src/ivl_uvm_clp.svh | 534 +++ uvm/ivl_uvm_src/ivl_uvm_comps.svh | 116 + uvm/ivl_uvm_src/ivl_uvm_macros.svh | 70 + uvm/ivl_uvm_src/ivl_uvm_mbx.svh | 62 + uvm/ivl_uvm_src/ivl_uvm_msg.svh | 240 ++ uvm/ivl_uvm_src/ivl_uvm_patches.svh | 155 + uvm/ivl_uvm_src/ivl_uvm_pkg.sv | 63 + uvm/ivl_uvm_src/ivl_uvm_semaphore.sv | 40 + uvm/ivl_uvm_src/ivl_uvm_tlm.svh | 89 + uvm/ivl_uvm_src/ivl_uvm_top.svh | 19 + uvm/ivl_uvm_src/ivl_uvm_types.svh | 46 + .../macros/uvm_callback_defines.svh | 300 ++ .../macros/uvm_deprecated_defines.svh | 249 ++ .../macros/uvm_message_defines.svh | 218 + uvm/ivl_uvm_src/macros/uvm_object_defines.svh | 3668 +++++++++++++++++ uvm/ivl_uvm_src/macros/uvm_phase_defines.svh | 129 + .../macros/uvm_printer_defines.svh | 419 ++ uvm/ivl_uvm_src/macros/uvm_reg_defines.svh | 68 + .../macros/uvm_sequence_defines.svh | 455 ++ uvm/ivl_uvm_src/macros/uvm_tlm_defines.svh | 614 +++ uvm/ivl_uvm_src/macros/uvm_undefineall.svh | 85 + .../macros/uvm_version_defines.svh | 49 + uvm/ivl_uvm_src/module_based_uvm_apb.sv | 193 + uvm/ivl_uvm_src/tlm1/uvm_analysis_port.svh | 155 + uvm/ivl_uvm_src/tlm1/uvm_exports.svh | 259 ++ uvm/ivl_uvm_src/tlm1/uvm_imps.svh | 316 ++ uvm/ivl_uvm_src/tlm1/uvm_ports.svh | 261 ++ uvm/ivl_uvm_src/tlm1/uvm_sqr_connections.svh | 83 + uvm/ivl_uvm_src/tlm1/uvm_sqr_ifs.svh | 214 + uvm/ivl_uvm_src/tlm1/uvm_tlm.svh | 39 + uvm/ivl_uvm_src/tlm1/uvm_tlm_fifo_base.svh | 252 ++ uvm/ivl_uvm_src/tlm1/uvm_tlm_fifos.svh | 238 ++ uvm/ivl_uvm_src/tlm1/uvm_tlm_ifs.svh | 218 + uvm/ivl_uvm_src/tlm1/uvm_tlm_imps.svh | 228 + uvm/ivl_uvm_src/tlm1/uvm_tlm_req_rsp.svh | 348 ++ uvm/ivl_uvm_src/uvm_macros.svh | 74 + uvm/ivl_uvm_std_ovl/docs/assert_quick_ref.pdf | Bin 0 -> 22045 bytes .../docs/assert_timing_diagrams.pdf | Bin 0 -> 667275 bytes uvm/ivl_uvm_std_ovl/docs/ovl_lrm.pdf | Bin 0 -> 1101777 bytes uvm/ivl_uvm_std_ovl/docs/ovl_quick_ref.pdf | Bin 0 -> 65992 bytes .../docs/ovl_timing_diagrams.pdf | Bin 0 -> 454266 bytes uvm/ivl_uvm_std_ovl/docs/readme_vhdl.txt | 215 + uvm/ivl_uvm_std_ovl/docs/release_notes.txt | 770 ++++ uvm/ivl_uvm_std_ovl/ivl_uvm_ovl_inc.v | 60 + uvm/ivl_uvm_std_ovl/ovl_always.v | 44 + uvm/ivl_uvm_std_ovl/ovl_always_on_edge.v | 46 + uvm/ivl_uvm_std_ovl/ovl_arbiter.v | 45 + uvm/ivl_uvm_std_ovl/ovl_bits.v | 49 + uvm/ivl_uvm_std_ovl/ovl_change.v | 62 + uvm/ivl_uvm_std_ovl/ovl_code_distance.v | 40 + uvm/ivl_uvm_std_ovl/ovl_coverage.v | 36 + uvm/ivl_uvm_std_ovl/ovl_crc.v | 54 + uvm/ivl_uvm_std_ovl/ovl_cycle_sequence.v | 56 + uvm/ivl_uvm_std_ovl/ovl_decrement.v | 47 + uvm/ivl_uvm_std_ovl/ovl_delta.v | 48 + uvm/ivl_uvm_std_ovl/ovl_even_parity.v | 46 + uvm/ivl_uvm_std_ovl/ovl_fifo.v | 52 + uvm/ivl_uvm_std_ovl/ovl_fifo_index.v | 60 + uvm/ivl_uvm_std_ovl/ovl_frame.v | 66 + uvm/ivl_uvm_std_ovl/ovl_handshake.v | 51 + uvm/ivl_uvm_std_ovl/ovl_hold_value.v | 41 + uvm/ivl_uvm_std_ovl/ovl_implication.v | 44 + uvm/ivl_uvm_std_ovl/ovl_increment.v | 47 + uvm/ivl_uvm_std_ovl/ovl_memory_async.v | 104 + uvm/ivl_uvm_std_ovl/ovl_memory_sync.v | 103 + uvm/ivl_uvm_std_ovl/ovl_multiport_fifo.v | 55 + uvm/ivl_uvm_std_ovl/ovl_mutex.v | 36 + uvm/ivl_uvm_std_ovl/ovl_never.v | 44 + uvm/ivl_uvm_std_ovl/ovl_never_unknown.v | 46 + uvm/ivl_uvm_std_ovl/ovl_never_unknown_async.v | 45 + uvm/ivl_uvm_std_ovl/ovl_next.v | 60 + uvm/ivl_uvm_std_ovl/ovl_next_state.v | 43 + uvm/ivl_uvm_std_ovl/ovl_no_contention.v | 41 + uvm/ivl_uvm_std_ovl/ovl_no_overflow.v | 48 + uvm/ivl_uvm_std_ovl/ovl_no_transition.v | 46 + uvm/ivl_uvm_std_ovl/ovl_no_underflow.v | 48 + uvm/ivl_uvm_std_ovl/ovl_odd_parity.v | 46 + uvm/ivl_uvm_std_ovl/ovl_one_cold.v | 47 + uvm/ivl_uvm_std_ovl/ovl_one_hot.v | 45 + uvm/ivl_uvm_std_ovl/ovl_proposition.v | 44 + uvm/ivl_uvm_std_ovl/ovl_quiescent_state.v | 47 + uvm/ivl_uvm_std_ovl/ovl_range.v | 47 + uvm/ivl_uvm_std_ovl/ovl_reg_loaded.v | 40 + uvm/ivl_uvm_std_ovl/ovl_req_ack_unique.v | 39 + uvm/ivl_uvm_std_ovl/ovl_req_requires.v | 40 + uvm/ivl_uvm_std_ovl/ovl_stack.v | 41 + uvm/ivl_uvm_std_ovl/ovl_time.v | 61 + uvm/ivl_uvm_std_ovl/ovl_transition.v | 46 + uvm/ivl_uvm_std_ovl/ovl_unchange.v | 66 + uvm/ivl_uvm_std_ovl/ovl_valid_id.v | 47 + uvm/ivl_uvm_std_ovl/ovl_value.v | 40 + uvm/ivl_uvm_std_ovl/ovl_value_coverage.v | 42 + uvm/ivl_uvm_std_ovl/ovl_width.v | 57 + uvm/ivl_uvm_std_ovl/ovl_win_change.v | 48 + uvm/ivl_uvm_std_ovl/ovl_win_unchange.v | 47 + uvm/ivl_uvm_std_ovl/ovl_window.v | 45 + .../ovl_xproduct_bit_coverage.v | 41 + .../ovl_xproduct_value_coverage.v | 52 + uvm/ivl_uvm_std_ovl/ovl_zero_one_hot.v | 45 + uvm/ivl_uvm_std_ovl/std_ovl_clock.h | 26 + uvm/ivl_uvm_std_ovl/std_ovl_count.h | 23 + uvm/ivl_uvm_std_ovl/std_ovl_cover.h | 9 + uvm/ivl_uvm_std_ovl/std_ovl_defines.h | 241 ++ uvm/ivl_uvm_std_ovl/std_ovl_init.h | 12 + uvm/ivl_uvm_std_ovl/std_ovl_reset.h | 20 + uvm/ivl_uvm_std_ovl/std_ovl_task.h | 217 + .../vlog95/assert_always_logic.v | 70 + .../vlog95/assert_always_on_edge_logic.v | 124 + .../vlog95/assert_change_logic.v | 199 + .../vlog95/assert_cycle_sequence_logic.v | 166 + .../vlog95/assert_decrement_logic.v | 101 + .../vlog95/assert_delta_logic.v | 108 + .../vlog95/assert_even_parity_logic.v | 77 + .../vlog95/assert_fifo_index_logic.v | 173 + .../vlog95/assert_frame_logic.v | 332 ++ .../vlog95/assert_handshake_logic.v | 270 ++ .../vlog95/assert_implication_logic.v | 99 + .../vlog95/assert_increment_logic.v | 101 + .../vlog95/assert_never_logic.v | 70 + .../vlog95/assert_never_unknown_async_logic.v | 20 + .../vlog95/assert_never_unknown_logic.v | 87 + .../vlog95/assert_next_logic.v | 127 + .../vlog95/assert_no_overflow_logic.v | 98 + .../vlog95/assert_no_transition_logic.v | 141 + .../vlog95/assert_no_underflow_logic.v | 100 + .../vlog95/assert_odd_parity_logic.v | 78 + .../vlog95/assert_one_cold_logic.v | 107 + .../vlog95/assert_one_hot_logic.v | 110 + .../vlog95/assert_proposition_logic.v | 49 + .../vlog95/assert_quiescent_state_logic.v | 192 + .../vlog95/assert_range_logic.v | 101 + .../vlog95/assert_time_logic.v | 166 + .../vlog95/assert_transition_logic.v | 141 + .../vlog95/assert_unchange_logic.v | 189 + .../vlog95/assert_width_logic.v | 159 + .../vlog95/assert_win_change_logic.v | 145 + .../vlog95/assert_win_unchange_logic.v | 142 + .../vlog95/assert_window_logic.v | 127 + .../vlog95/assert_zero_one_hot_logic.v | 114 + uvm/ivl_uvm_std_ovl/vlog95/ovl_always_logic.v | 88 + .../vlog95/ovl_cycle_sequence_logic.v | 197 + .../vlog95/ovl_implication_logic.v | 126 + uvm/ivl_uvm_std_ovl/vlog95/ovl_never_logic.v | 88 + .../vlog95/ovl_never_unknown_logic.v | 108 + uvm/ivl_uvm_std_ovl/vlog95/ovl_next_logic.v | 158 + .../vlog95/ovl_one_hot_logic.v | 137 + uvm/ivl_uvm_std_ovl/vlog95/ovl_range_logic.v | 128 + .../vlog95/ovl_win_unchange_logic.v | 171 + .../vlog95/ovl_zero_one_hot_logic.v | 141 + uvm/ivl_uvm_tests/fifo_go2uvm/README.txt | 37 + uvm/ivl_uvm_tests/fifo_go2uvm/dut/fifo_rtl.v | 107 + .../fifo_go2uvm/go2uvm/fifo_go2uvm_test.sv | 72 + .../fifo_go2uvm/go2uvm/fifo_go2uvm_top.sv | 63 + .../fifo_go2uvm/go2uvm/fifo_if.sv | 60 + .../fifo_go2uvm/go2uvm/ivl_uvm_fifo_test.sv | 112 + uvm/ivl_uvm_tests/fifo_go2uvm/run_dir/flist | 30 + uvm/ivl_uvm_tests/fsm_ghub/README.md | 58 + uvm/ivl_uvm_tests/fsm_ghub/fsm_ghub.v | 52 + uvm/ivl_uvm_tests/fsm_ghub/fsm_ghub_tb.sv | 56 + uvm/ivl_uvm_tests/fsm_ghub/ivl_uvm_cmds.cfg | 14 + uvm/ivl_uvm_tests/fsm_ghub/orig_tb.v | 48 + .../ivl_uvm_ovl_alw/ivl_uvm_ovl_ex.sv | 52 + .../ivl_uvm_ovl_tests/ivl_uvm_ovl_alw/flist | 2 + .../ivl_uvm_ovl_alw/ivl_uvm_ovl_a_alw_fail.sv | 51 + .../ivl_uvm_ovl_alw/ivl_uvm_ovl_a_alw_pass.sv | 73 + .../ivl_uvm_ovl_tests/ivl_uvm_ovl_clk_gen.sv | 32 + .../ivl_uvm_test_0/ivl_uvm_test_msg.sv | 46 + .../ivl_uvm_test_1/ivl_uvm_test_class.sv | 48 + .../ivl_uvm_test_2/ivl_uvm_run_test.sv | 54 + .../ivl_uvm_test_3/ivl_uvm_test_clp.sv | 51 + .../ivl_uvm_test_4/ivl_uvm_test_bcl.sv | 62 + .../ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv | 84 + .../ivl_uvm_test_6/ivl_uvm_test_mbx_class.sv | 88 + .../ivl_uvm_test_7/dut_src/a.out | 538 +++ .../ivl_uvm_test_7/dut_src/apb_sl_dut.sv | 143 + .../ivl_uvm_test_7/dut_src/cvc_apb_s_if.sv | 33 + .../ivl_uvm_test_7/run_dir/flist.apb | 8 + .../ivl_uvm_test_7/tb_src/apb_if.sv | 16 + .../ivl_uvm_test_7/tb_src/apb_mst_driver.sv | 78 + .../ivl_uvm_test_7/tb_src/apb_mst_inc.svh | 2 + .../ivl_uvm_test_7/tb_src/apb_mst_top.sv | 67 + .../ivl_uvm_test_7/tb_src/apb_mst_xactn.svh | 24 + .../ivl_uvm_test_7/tb_src/apb_pkg.sv | 6 + .../ivl_uvm_test_7/tb_src/apb_types.svh | 2 + .../ivl_uvm_test_7/tb_src/uvm_apb/apb.sv | 45 + .../tb_src/uvm_apb/apb_agent.sv | 66 + .../tb_src/uvm_apb/apb_config.sv | 35 + .../ivl_uvm_test_7/tb_src/uvm_apb/apb_if.sv | 67 + .../tb_src/uvm_apb/apb_master.sv | 135 + .../tb_src/uvm_apb/apb_monitor.sv | 101 + .../ivl_uvm_test_7/tb_src/uvm_apb/apb_rw.sv | 84 + .../tb_src/uvm_apb/apb_sequencer.sv | 38 + uvm/ivl_uvm_vpi/ivl_vlog_lint/README.md | 16 + uvm/ivl_uvm_vpi/ivl_vlog_lint/check_name.c | 249 ++ uvm/ivl_uvm_vpi/ivl_vlog_lint/lint_check.c | 184 + uvm/ivl_uvm_vpi/ivl_vlog_lint/test.v | 20 + uvm/scripts/ivl_uvm_cmds.f | 2 + uvm/setup.csh | 2 + 250 files changed, 31265 insertions(+) create mode 100644 UVM_README.md create mode 100644 docs/ROADMAP.md create mode 100644 docs/STATUS.md create mode 100644 docs/WORKFLOW.md create mode 100644 examples/hello_uvm/flist.f create mode 100644 examples/hello_uvm/hello_uvm.sv create mode 100644 uvm/FORK_NOTE.md create mode 100644 uvm/README.md create mode 100644 uvm/depot/add_ifndef.py create mode 100644 uvm/depot/ivl_mbx_via_q/ivl_mbx_via_q.sv create mode 100644 uvm/depot/ivl_mbx_via_q/ivl_uvm_i413.sv create mode 100644 uvm/depot/ivl_mbx_via_q/run_dir/flist.class create mode 100644 uvm/depot/ivl_plusargs.sv create mode 100644 uvm/depot/ivl_uvm_test_ex.sv create mode 100644 uvm/depot/uml_diagram.sv create mode 100644 uvm/ivl_uvm_intf_gen/README.md create mode 100755 uvm/ivl_uvm_intf_gen/examples/alu.v create mode 100755 uvm/ivl_uvm_intf_gen/examples/register_slice.v create mode 100755 uvm/ivl_uvm_intf_gen/ivlog_vpi_src/az_ivl_uvm_common.h create mode 100755 uvm/ivl_uvm_intf_gen/ivlog_vpi_src/az_ivl_uvm_intf_gen.c create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_0.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_1.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_2.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_3.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_4.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_5.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0_FULL.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0_HIGH.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_1.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_2.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_3.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_4.log create mode 100644 uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_5.log create mode 100644 uvm/ivl_uvm_regress/run_dir/flist.t0 create mode 100644 uvm/ivl_uvm_regress/run_dir/flist.t1 create mode 100644 uvm/ivl_uvm_regress/run_dir/flist.t2 create mode 100644 uvm/ivl_uvm_regress/run_dir/flist.t3 create mode 100644 uvm/ivl_uvm_regress/run_dir/flist.t4 create mode 100644 uvm/ivl_uvm_regress/run_dir/flist.t5 create mode 100644 uvm/ivl_uvm_regress/run_dir/flist.t6 create mode 100644 uvm/ivl_uvm_regress/run_dir/flist.t7 create mode 100644 uvm/ivl_uvm_regress/run_dir/ivl_uvm_comp_0.log create mode 100644 uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0.log create mode 100644 uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0_FULL.log create mode 100644 uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0_HIGH.log create mode 100755 uvm/ivl_uvm_regress/run_dir/vw_ivl_ivl_uvm.vvp create mode 100644 uvm/ivl_uvm_src/README.md create mode 100644 uvm/ivl_uvm_src/base/uvm_misc.svh create mode 100644 uvm/ivl_uvm_src/base/uvm_object.svh create mode 100644 uvm/ivl_uvm_src/base/uvm_object_globals.svh create mode 100644 uvm/ivl_uvm_src/ivl_uvm_clp.svh create mode 100644 uvm/ivl_uvm_src/ivl_uvm_comps.svh create mode 100644 uvm/ivl_uvm_src/ivl_uvm_macros.svh create mode 100644 uvm/ivl_uvm_src/ivl_uvm_mbx.svh create mode 100644 uvm/ivl_uvm_src/ivl_uvm_msg.svh create mode 100644 uvm/ivl_uvm_src/ivl_uvm_patches.svh create mode 100644 uvm/ivl_uvm_src/ivl_uvm_pkg.sv create mode 100644 uvm/ivl_uvm_src/ivl_uvm_semaphore.sv create mode 100644 uvm/ivl_uvm_src/ivl_uvm_tlm.svh create mode 100644 uvm/ivl_uvm_src/ivl_uvm_top.svh create mode 100644 uvm/ivl_uvm_src/ivl_uvm_types.svh create mode 100644 uvm/ivl_uvm_src/macros/uvm_callback_defines.svh create mode 100644 uvm/ivl_uvm_src/macros/uvm_deprecated_defines.svh create mode 100644 uvm/ivl_uvm_src/macros/uvm_message_defines.svh create mode 100644 uvm/ivl_uvm_src/macros/uvm_object_defines.svh create mode 100644 uvm/ivl_uvm_src/macros/uvm_phase_defines.svh create mode 100644 uvm/ivl_uvm_src/macros/uvm_printer_defines.svh create mode 100644 uvm/ivl_uvm_src/macros/uvm_reg_defines.svh create mode 100644 uvm/ivl_uvm_src/macros/uvm_sequence_defines.svh create mode 100644 uvm/ivl_uvm_src/macros/uvm_tlm_defines.svh create mode 100644 uvm/ivl_uvm_src/macros/uvm_undefineall.svh create mode 100644 uvm/ivl_uvm_src/macros/uvm_version_defines.svh create mode 100644 uvm/ivl_uvm_src/module_based_uvm_apb.sv create mode 100644 uvm/ivl_uvm_src/tlm1/uvm_analysis_port.svh create mode 100644 uvm/ivl_uvm_src/tlm1/uvm_exports.svh create mode 100644 uvm/ivl_uvm_src/tlm1/uvm_imps.svh create mode 100644 uvm/ivl_uvm_src/tlm1/uvm_ports.svh create mode 100644 uvm/ivl_uvm_src/tlm1/uvm_sqr_connections.svh create mode 100644 uvm/ivl_uvm_src/tlm1/uvm_sqr_ifs.svh create mode 100644 uvm/ivl_uvm_src/tlm1/uvm_tlm.svh create mode 100644 uvm/ivl_uvm_src/tlm1/uvm_tlm_fifo_base.svh create mode 100644 uvm/ivl_uvm_src/tlm1/uvm_tlm_fifos.svh create mode 100644 uvm/ivl_uvm_src/tlm1/uvm_tlm_ifs.svh create mode 100644 uvm/ivl_uvm_src/tlm1/uvm_tlm_imps.svh create mode 100644 uvm/ivl_uvm_src/tlm1/uvm_tlm_req_rsp.svh create mode 100644 uvm/ivl_uvm_src/uvm_macros.svh create mode 100644 uvm/ivl_uvm_std_ovl/docs/assert_quick_ref.pdf create mode 100644 uvm/ivl_uvm_std_ovl/docs/assert_timing_diagrams.pdf create mode 100644 uvm/ivl_uvm_std_ovl/docs/ovl_lrm.pdf create mode 100644 uvm/ivl_uvm_std_ovl/docs/ovl_quick_ref.pdf create mode 100644 uvm/ivl_uvm_std_ovl/docs/ovl_timing_diagrams.pdf create mode 100644 uvm/ivl_uvm_std_ovl/docs/readme_vhdl.txt create mode 100644 uvm/ivl_uvm_std_ovl/docs/release_notes.txt create mode 100644 uvm/ivl_uvm_std_ovl/ivl_uvm_ovl_inc.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_always.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_always_on_edge.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_arbiter.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_bits.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_change.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_code_distance.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_coverage.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_crc.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_cycle_sequence.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_decrement.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_delta.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_even_parity.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_fifo.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_fifo_index.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_frame.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_handshake.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_hold_value.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_implication.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_increment.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_memory_async.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_memory_sync.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_multiport_fifo.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_mutex.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_never.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_never_unknown.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_never_unknown_async.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_next.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_next_state.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_no_contention.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_no_overflow.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_no_transition.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_no_underflow.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_odd_parity.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_one_cold.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_one_hot.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_proposition.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_quiescent_state.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_range.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_reg_loaded.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_req_ack_unique.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_req_requires.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_stack.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_time.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_transition.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_unchange.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_valid_id.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_value.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_value_coverage.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_width.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_win_change.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_win_unchange.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_window.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_xproduct_bit_coverage.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_xproduct_value_coverage.v create mode 100644 uvm/ivl_uvm_std_ovl/ovl_zero_one_hot.v create mode 100644 uvm/ivl_uvm_std_ovl/std_ovl_clock.h create mode 100644 uvm/ivl_uvm_std_ovl/std_ovl_count.h create mode 100644 uvm/ivl_uvm_std_ovl/std_ovl_cover.h create mode 100644 uvm/ivl_uvm_std_ovl/std_ovl_defines.h create mode 100644 uvm/ivl_uvm_std_ovl/std_ovl_init.h create mode 100644 uvm/ivl_uvm_std_ovl/std_ovl_reset.h create mode 100644 uvm/ivl_uvm_std_ovl/std_ovl_task.h create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_always_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_always_on_edge_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_change_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_cycle_sequence_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_decrement_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_delta_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_even_parity_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_fifo_index_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_frame_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_handshake_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_implication_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_increment_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_never_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_never_unknown_async_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_never_unknown_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_next_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_no_overflow_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_no_transition_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_no_underflow_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_odd_parity_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_one_cold_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_one_hot_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_proposition_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_quiescent_state_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_range_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_time_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_transition_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_unchange_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_width_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_win_change_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_win_unchange_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_window_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/assert_zero_one_hot_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/ovl_always_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/ovl_cycle_sequence_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/ovl_implication_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/ovl_never_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/ovl_never_unknown_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/ovl_next_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/ovl_one_hot_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/ovl_range_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/ovl_win_unchange_logic.v create mode 100644 uvm/ivl_uvm_std_ovl/vlog95/ovl_zero_one_hot_logic.v create mode 100755 uvm/ivl_uvm_tests/fifo_go2uvm/README.txt create mode 100755 uvm/ivl_uvm_tests/fifo_go2uvm/dut/fifo_rtl.v create mode 100755 uvm/ivl_uvm_tests/fifo_go2uvm/go2uvm/fifo_go2uvm_test.sv create mode 100755 uvm/ivl_uvm_tests/fifo_go2uvm/go2uvm/fifo_go2uvm_top.sv create mode 100755 uvm/ivl_uvm_tests/fifo_go2uvm/go2uvm/fifo_if.sv create mode 100644 uvm/ivl_uvm_tests/fifo_go2uvm/go2uvm/ivl_uvm_fifo_test.sv create mode 100755 uvm/ivl_uvm_tests/fifo_go2uvm/run_dir/flist create mode 100644 uvm/ivl_uvm_tests/fsm_ghub/README.md create mode 100644 uvm/ivl_uvm_tests/fsm_ghub/fsm_ghub.v create mode 100644 uvm/ivl_uvm_tests/fsm_ghub/fsm_ghub_tb.sv create mode 100644 uvm/ivl_uvm_tests/fsm_ghub/ivl_uvm_cmds.cfg create mode 100644 uvm/ivl_uvm_tests/fsm_ghub/orig_tb.v create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_ovl_demo/ivl_uvm_ovl_alw/ivl_uvm_ovl_ex.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_ovl_tests/ivl_uvm_ovl_alw/flist create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_ovl_tests/ivl_uvm_ovl_alw/ivl_uvm_ovl_a_alw_fail.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_ovl_tests/ivl_uvm_ovl_alw/ivl_uvm_ovl_a_alw_pass.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_ovl_tests/ivl_uvm_ovl_clk_gen.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_test_1/ivl_uvm_test_class.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_test_2/ivl_uvm_run_test.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_test_3/ivl_uvm_test_clp.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_test_4/ivl_uvm_test_bcl.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_test_6/ivl_uvm_test_mbx_class.sv create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/dut_src/a.out create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/dut_src/apb_sl_dut.sv create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/dut_src/cvc_apb_s_if.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_test_7/run_dir/flist.apb create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/apb_if.sv create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/apb_mst_driver.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/apb_mst_inc.svh create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/apb_mst_top.sv create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/apb_mst_xactn.svh create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/apb_pkg.sv create mode 100644 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/apb_types.svh create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/uvm_apb/apb.sv create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/uvm_apb/apb_agent.sv create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/uvm_apb/apb_config.sv create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/uvm_apb/apb_if.sv create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/uvm_apb/apb_master.sv create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/uvm_apb/apb_monitor.sv create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/uvm_apb/apb_rw.sv create mode 100755 uvm/ivl_uvm_tests/ivl_uvm_test_7/tb_src/uvm_apb/apb_sequencer.sv create mode 100644 uvm/ivl_uvm_vpi/ivl_vlog_lint/README.md create mode 100644 uvm/ivl_uvm_vpi/ivl_vlog_lint/check_name.c create mode 100644 uvm/ivl_uvm_vpi/ivl_vlog_lint/lint_check.c create mode 100644 uvm/ivl_uvm_vpi/ivl_vlog_lint/test.v create mode 100644 uvm/scripts/ivl_uvm_cmds.f create mode 100644 uvm/setup.csh diff --git a/README.md b/README.md index 41152e38a..026dd370c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,12 @@ # The ICARUS Verilog Compilation System +> **This repository is `muhammadjawadkhan/iverilog-uvm` — an experimental +> UVM / SystemVerilog track.** It is **not** for production use and is **not** +> an official Accellera UVM port. **Do not open pull requests to +> [steveicarus/iverilog](https://github.com/steveicarus/iverilog) for UVM work +> on this fork.** See [UVM_README.md](UVM_README.md), [docs/ROADMAP.md](docs/ROADMAP.md), +> and [docs/WORKFLOW.md](docs/WORKFLOW.md). + Copyright 2000-2026 Stephen Williams
diff --git a/UVM_README.md b/UVM_README.md new file mode 100644 index 000000000..4b82d82ef --- /dev/null +++ b/UVM_README.md @@ -0,0 +1,24 @@ +# Icarus Verilog — UVM Experimental Track + +> **Experimental / research project.** Not for production or tapeout. +> This is **not** an official Accellera UVM port. +> **Do not open pull requests to [steveicarus/iverilog](https://github.com/steveicarus/iverilog) for this UVM track.** + +This repository is `muhammadjawadkhan/iverilog-uvm`: a full Icarus Verilog tree plus a UVM-oriented layer under [`uvm/`](uvm/) and a feature roadmap under [`docs/`](docs/). + +| Remote | Role | +|--------|------| +| `origin` | `muhammadjawadkhan/iverilog-uvm` (push here) | +| `upstream` | `steveicarus/iverilog` (**fetch/merge only** — never PR UVM work there) | + +## Quick links + +- [docs/ROADMAP.md](docs/ROADMAP.md) — SV/UVM features to add one by one +- [docs/STATUS.md](docs/STATUS.md) — what works today +- [docs/WORKFLOW.md](docs/WORKFLOW.md) — branch / PR rules for this fork +- [examples/hello_uvm](examples/hello_uvm) — smoke example using `uvm/` +- Upstream Icarus build docs: see [README.md](README.md) + +## Goal + +Grow SystemVerilog compiler support and a UVM-like / Accellera-shaped library **in this fork only**, feature by feature, until larger slices of UVM 1.2 become viable. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md new file mode 100644 index 000000000..9416b3886 --- /dev/null +++ b/docs/ROADMAP.md @@ -0,0 +1,29 @@ +# Feature roadmap (one-by-one) + +Each item should be a dedicated `feat/` branch, with tests/examples and a STATUS.md update. Merge only into this fork’s default branch (`master`). + +## Tier A — Compiler SV foundations (block Accellera UVM) + +1. **Parameterized classes** — `class C #(type T = int);` / `C#(byte)` — needed for `uvm_*#(T)`, `config_db` +2. **Associative arrays** — `int aa[string];` +3. **Virtual interfaces** + eventing on `vif.clk` +4. **Clocking blocks** — enough for `@(vif.cb)` +5. **`mailbox` / `semaphore` builtins** (or solid class equivalents with blocking put/get) +6. **Constraints + `randomize()` / `randomize() with`** — start unconstrained `rand`, then solver +7. **`$cast` / `$typename` hardening** for factory patterns +8. **Covergroups** — functional coverage +9. **DPI-C** — optional but common in real flows + +## Tier B — Library / methodology (on top of Tier A) + +10. Grow [`uvm/`](../uvm/) toward Accellera-shaped APIs: reporting, phases/objections, factory, `config_db`, TLM, sequences +11. Smoke: trimmed “hello UVM”, then larger Accellera UVM 1.2 slices as features land + +## Already usable baseline (do not re-do first) + +Classes, packages, strings, queues/dynamic arrays, locators/reductions/ordering, chained calls — extend only when a UVM example needs a gap. + +## Out of scope + +- Claiming “UVM 1.2 supported” until Accellera’s library compiles and runs +- Opening PRs to `steveicarus/iverilog` for this track (see [WORKFLOW.md](WORKFLOW.md)) diff --git a/docs/STATUS.md b/docs/STATUS.md new file mode 100644 index 000000000..76c81ecb2 --- /dev/null +++ b/docs/STATUS.md @@ -0,0 +1,25 @@ +# Status + +Last updated: 2026-07-21 + +## Accellera UVM 1.2 + +**Not supported.** Official Accellera UVM will not compile on stock Icarus or on this fork yet. + +## This fork + +| Area | Status | +|------|--------| +| Icarus Verilog tree | Fork of `steveicarus/iverilog` (`master` @ merge of SV array ordering work) | +| [`uvm/`](../uvm/) | Seeded from IVL_UVM (VerifWorks) — messaging, CLP, stub phases, poor-man’s mailbox/semaphore; **not** Accellera-compatible | +| [`examples/hello_uvm`](../examples/hello_uvm) | Smoke TB for the seeded library | +| Parameterized classes | **In progress** on `feat/param-classes` | +| Associative arrays | Missing | +| Virtual interfaces | Missing | +| Constraints / randomize | Missing | +| Covergroups / DPI | Missing | + +## Remotes + +- `origin` → https://github.com/muhammadjawadkhan/iverilog-uvm +- `upstream` → https://github.com/steveicarus/iverilog (fetch only for this track) diff --git a/docs/WORKFLOW.md b/docs/WORKFLOW.md new file mode 100644 index 000000000..87e437a19 --- /dev/null +++ b/docs/WORKFLOW.md @@ -0,0 +1,34 @@ +# Workflow (this fork only) + +## Remotes + +```bash +git remote -v +# origin https://github.com/muhammadjawadkhan/iverilog-uvm.git +# upstream https://github.com/steveicarus/iverilog.git +``` + +## Do + +- Push branches to **`origin`** (`muhammadjawadkhan/iverilog-uvm`) +- Open PRs against **this fork’s** `master` (or `development` if created later) +- Use one feature per branch: `feat/param-classes`, `feat/assoc-array`, … +- Optionally `git fetch upstream` and merge upstream bugfixes into this fork +- Update [STATUS.md](STATUS.md) when a feature lands + +## Do not + +- Open PRs to **`steveicarus/iverilog`** for UVM / this track’s compiler work +- Mix UVM commits into unrelated upstream contribution branches on other remotes +- Claim full UVM 1.2 support prematurely + +## Example + +```bash +git checkout master +git pull origin master +git checkout -b feat/param-classes +# ... work ... +git push -u origin feat/param-classes +gh pr create --repo muhammadjawadkhan/iverilog-uvm --base master --head feat/param-classes +``` diff --git a/examples/hello_uvm/flist.f b/examples/hello_uvm/flist.f new file mode 100644 index 000000000..888dd6b27 --- /dev/null +++ b/examples/hello_uvm/flist.f @@ -0,0 +1,5 @@ ++timescale+1ns/10ps ++incdir+${IVL_UVM_HOME}/ivl_uvm_src +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_pkg.sv +hello_uvm.sv +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_top.svh diff --git a/examples/hello_uvm/hello_uvm.sv b/examples/hello_uvm/hello_uvm.sv new file mode 100644 index 000000000..9ee783f07 --- /dev/null +++ b/examples/hello_uvm/hello_uvm.sv @@ -0,0 +1,18 @@ +// Minimal smoke test for the seeded uvm/ (IVL_UVM) library. +// Not Accellera UVM — exercises messaging + run_test only. + +module hello_uvm; + import ivl_uvm_pkg::*; + + initial begin + run_test(); + end + + initial begin + #10; + `uvm_info("HELLO", "hello_uvm smoke: UVM_MEDIUM", UVM_MEDIUM) + `uvm_info("HELLO", "hello_uvm smoke: done", UVM_NONE) + #10; + $finish; + end +endmodule diff --git a/uvm/FORK_NOTE.md b/uvm/FORK_NOTE.md new file mode 100644 index 000000000..0d9d864a3 --- /dev/null +++ b/uvm/FORK_NOTE.md @@ -0,0 +1,11 @@ +# `uvm/` in this fork + +This directory is seeded from the [IVL_UVM](https://github.com/) / VerifWorks-style lightweight UVM layer (see nested `README.md`). + +It is **not** Accellera UVM 1.2. Paths that used `IVL_UVM_HOME` still apply; for this repo set: + +```bash +export IVL_UVM_HOME=/path/to/iverilog-uvm/uvm +``` + +See [../examples/hello_uvm](../examples/hello_uvm) and [../docs/ROADMAP.md](../docs/ROADMAP.md). diff --git a/uvm/README.md b/uvm/README.md new file mode 100644 index 000000000..049305156 --- /dev/null +++ b/uvm/README.md @@ -0,0 +1,44 @@ +# Welcome to *IVL_UVM* project + +It is a humble attempt to implement some of the basic UVM features on open-source Icarus Verilog simulator and eventually port it to Verilator as well. + +Given the light-weight support of SystemVerilog by Icarus as of Dec 2020, IVL_UVM code base is also very rudimentary compared to Accellera UVM implementation. We hope to continue enhancing it as and when the Icarus SV support improves. + +It is very important to note that current support is *very, very limited* and is just a start. We have staretd with: + +* Basic Messaging support +* Command Line Processor features +* UVM Test feature + +Feel free to try it out and send constructive comments via Discussion forum/Issues. Any inappropriate comments shall be deleted without any notice whatsoever. + +As of now, IVL_UVM runs on latest/development build of Icarus (and NOT the stable v11.0 branch). Should you need the v11.0 support, feel free to raise a request, we will see if that is doable. + +## Setup +Please ensure to setup IVL_UVM path via the setup.csh, in CSH/TCSH do: +* source setup.csh + +Many scripts/Makefiles refer to an env-variable that's set via this setup file. + +To run basic tests, do: + +* cd ivl_uvm_regress/run_dir +* make vw0 +* make vw1 +* make vw2 + +Thanks for trying this IVL_UVM code base. + +## ABV support via OVL +Assertion Based Verificaiton (ABV) is a powerful technique used by both RTL designers and Verification engineers. Accellera OVL (Open Verificaiton Library) was developed to provide a set of ready-to-use library elements with assertions for common elements/behaviors. We now comppiled OVL with Icarus and did some small clean-up in this release. Further TODOs are below: + +* Integrate UVM reporting +* Tighter controf of MAX_QUIT_COUNT in more-UVM-like manner (than compile time in old OVL) +* Better debug + +To run simple OVL demo, do: + +* cd ivl_uvm_tests/ivl_uvm_ovl_demo/ivl_uvm_ovl_alw +* make + +Cheers diff --git a/uvm/depot/add_ifndef.py b/uvm/depot/add_ifndef.py new file mode 100644 index 000000000..fd8f79ffc --- /dev/null +++ b/uvm/depot/add_ifndef.py @@ -0,0 +1,44 @@ +import os +import sys +import fileinput +import shutil +import glob +import argparse + +textToclass = "class " +textToendclass = "endclass" +textToVirclass = "virtual class " + +parser = argparse.ArgumentParser() +parser.add_argument('-i', required=True) + +args = parser.parse_args() + +fileToSearch = args.i + +File = open( fileToSearch , 'r+' ) +tempFile = open ('tmp.svh','w+') + +num_c = 0 + +for line in fileinput.input( fileToSearch ): + rec = line.strip() + if rec.startswith(textToclass) : + #print('Match Found') + tempFile.write(line) + tempFile.write("`ifndef IVL_UVM\n") + elif rec.startswith(textToVirclass) : + #print('Match Found') + tempFile.write(line) + tempFile.write("`ifndef IVL_UVM\n") + elif textToendclass in line: + tempFile.write("`endif // IVL_UVM \n") + tempFile.write(line) + num_c += 1 + else : + tempFile.write(line) + +print 'Fixed: ', num_c, ' classes for IVLOG' + +File.close() +tempFile.close() diff --git a/uvm/depot/ivl_mbx_via_q/ivl_mbx_via_q.sv b/uvm/depot/ivl_mbx_via_q/ivl_mbx_via_q.sv new file mode 100644 index 000000000..2efcd7eb7 --- /dev/null +++ b/uvm/depot/ivl_mbx_via_q/ivl_mbx_via_q.sv @@ -0,0 +1,47 @@ +// Mailbox via Q +// + +module ivl_uvm_mbx; // #(parameter type T = int) (); + + + int mbx_via_q [$]; + int q_size; + int my_q[$]; + + initial begin + #1; + // $display ("Type: ", $typename(my_q)); + end + + task put (input int ival); + mbx_via_q.push_back (ival); + q_size = mbx_via_q.size(); + endtask : put + + + task get (output int oval); + // IVL Bug 412 wait (mbx_via_q.size() > 0); + wait (q_size > 0); + $display ("MBX: Size: %0d", mbx_via_q.size()); + oval = mbx_via_q.pop_front (); + q_size = mbx_via_q.size(); + $display ("MBX: Size: %0d", mbx_via_q.size()); + endtask : get + +endmodule : ivl_uvm_mbx + +module m; + + ivl_uvm_mbx mbx_0 (); + // ivl_uvm_mbx #(real) mbx_1 (); + + int pval,gval; + + initial begin + pval = $random(); + mbx_0.put(pval); + mbx_0.get(gval); + $display ("put: 0x%0h get: 0x%0h", pval, gval); + end +endmodule : m + diff --git a/uvm/depot/ivl_mbx_via_q/ivl_uvm_i413.sv b/uvm/depot/ivl_mbx_via_q/ivl_uvm_i413.sv new file mode 100644 index 000000000..2116265d1 --- /dev/null +++ b/uvm/depot/ivl_mbx_via_q/ivl_uvm_i413.sv @@ -0,0 +1,46 @@ +// Mailbox via Q +// + +module ivl_uvm_mbx #(parameter type T = int) (); + + int mbx_via_q [$]; + int q_size; + T my_q[$]; + + initial begin + #1; + $display ("Type: ", $typename(T)); + end + + task put (input int ival); + mbx_via_q.push_back (ival); + q_size = mbx_via_q.size(); + endtask : put + + + task get (output int oval); + // IVL Bug 412 wait (mbx_via_q.size() > 0); + wait (q_size > 0); + $display ("MBX: Size: %0d", mbx_via_q.size()); + oval = mbx_via_q.pop_front (); + q_size = mbx_via_q.size(); + $display ("MBX: Size: %0d", mbx_via_q.size()); + endtask : get + +endmodule : ivl_uvm_mbx + +module m; + + ivl_uvm_mbx mbx_0 (); + ivl_uvm_mbx #(real) mbx_1 (); + + int pval,gval; + + initial begin + pval = $random(); + mbx_0.put(pval); + mbx_0.get(gval); + $display ("put: 0x%0h get: 0x%0h", pval, gval); + end +endmodule : m + diff --git a/uvm/depot/ivl_mbx_via_q/run_dir/flist.class b/uvm/depot/ivl_mbx_via_q/run_dir/flist.class new file mode 100644 index 000000000..d9b55f1cb --- /dev/null +++ b/uvm/depot/ivl_mbx_via_q/run_dir/flist.class @@ -0,0 +1 @@ +../ivl_mbx_via_q.sv diff --git a/uvm/depot/ivl_plusargs.sv b/uvm/depot/ivl_plusargs.sv new file mode 100644 index 000000000..3a5b9e497 --- /dev/null +++ b/uvm/depot/ivl_plusargs.sv @@ -0,0 +1,33 @@ +module ivl_plusargs; + string var1, var2, var3, var4, var5, var6, var7, var8, var9; + // Written by Anirudh. + initial begin + $display ("Initializing....."); + if ($value$plusargs ("UVM_DUMP_CMDLINE_ARGS=%s", var1)) + $display ("STRING with UVM_DUMP_CMDLINE_ARGS has a value %s", var1); + + if ($value$plusargs ("UVM_TESTNAME=%s", var2)) + $display ("STRING with UVM_TESTNAME has a value %s", var2); + + if ($value$plusargs ("UVM_VERBOSITY=%s", var3)) + $display ("STRING with UVM_VERBOSITY has a value %s", var3); + + if ($value$plusargs ("UVM_TIMEOUT=%s", var4)) + $display ("STRING with UVM_TIMEOUT has a value %s", var4); + + if ($value$plusargs ("UVM_MAX_QUIT_COUNT=%s", var5)) + $display ("STRING with UVM_MAX_QUIT_COUNT has a value %s", var5); + + if ($value$plusargs ("UVM_PHASE_TRACE=%s", var6)) + $display ("STRING with UVM_PHASE_TRACE has a value %s", var6); + + if ($value$plusargs ("UVM_OBJECTION_TRACE=%s", var7)) + $display ("STRING with UVM_OBJECTION_TRACE has a value %s", var7); + + if ($value$plusargs ("UVM_RESOURCE_DB_TRACE=%s", var8)) + $display ("STRING with UVM_RESOURCE_DB_TRACE has a value %s", var8); + + if ($value$plusargs ("UVM_CONFIG_DB_TRACE=%s", var9)) + $display ("STRING with UVM_CONFIG_DB_TRACE has a value %s", var9); + end +endmodule : ivl_plusargs diff --git a/uvm/depot/ivl_uvm_test_ex.sv b/uvm/depot/ivl_uvm_test_ex.sv new file mode 100644 index 000000000..035073b02 --- /dev/null +++ b/uvm/depot/ivl_uvm_test_ex.sv @@ -0,0 +1,47 @@ +`ifndef UVM_TESTNAME + `define UVM_TESTNAME ivl_uvm_base_test +`endif // UVM_TESTNAME + +package test_pkg; + class uvm_component; + endclass : uvm_component + + virtual class ivl_uvm_base_test extends uvm_component; + function new (string name="ivl_uvm_base_test", + uvm_component parent = null); + endfunction : new + + virtual task run_phase (); + $display ("%m run_phase"); + endtask : run_phase + endclass : ivl_uvm_base_test + + class my_test extends ivl_uvm_base_test; + function new (string name="my_test", + uvm_component parent = null); + super.new (name, parent); + endfunction : new + + virtual task run_phase (); + $display ("%m run_phase"); + endtask : run_phase + endclass : my_test + + `UVM_TESTNAME uvm_test_top; + + task run_test (); + + uvm_test_top = new(); + uvm_test_top.run_phase (); + endtask : run_test +endpackage : test_pkg + +module m; + import test_pkg::*; + + initial begin + run_test (); + end +endmodule : m + + diff --git a/uvm/depot/uml_diagram.sv b/uvm/depot/uml_diagram.sv new file mode 100644 index 000000000..662974a60 --- /dev/null +++ b/uvm/depot/uml_diagram.sv @@ -0,0 +1,107 @@ +virtual class uvm_void; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_void + +class uvm_object extends uvm_void; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_object + +class uvm_transaction extends uvm_object; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_transaction + +class uvm_sequence_item extends uvm_transaction; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_sequence_item + +class uvm_sequence_base extends uvm_sequence_item; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_sequence_base + +class uvm_report_object extends uvm_object; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_report_object + +class uvm_component extends uvm_report_object; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_component + +class uvm_subscriber extends uvm_component; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_subscriber + +class uvm_env extends uvm_component; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_env + +class uvm_test extends uvm_component; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_test + +class uvm_driver extends uvm_component; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_driver + +class uvm_monitor extends uvm_component; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_monitor + +class uvm_scoreboard extends uvm_component; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_scoreboard + +class uvm_agent extends uvm_component; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_agent + +class uvm_sequencer extends uvm_component; + function new(); + $display("%m"); + endfunction : new +endclass : uvm_sequencer + +module top; + uvm_component comp0; + initial begin : test_uvm + comp0 = new(); + $display ("Booting up IVL_UVM ..."); + end : test_uvm + uvm_sequence_base seq0; + initial begin : seq_uvm + seq0 = new(); + $display ("Booting up Class Hierachy ..."); + end : seq_uvm + uvm_sequencer sequencer0; + initial begin : sequencer_uvm + sequencer0 = new(); + $display ("Booting up uvm_component ..."); + end : sequencer_uvm +endmodule : top diff --git a/uvm/ivl_uvm_intf_gen/README.md b/uvm/ivl_uvm_intf_gen/README.md new file mode 100644 index 000000000..2191cdb26 --- /dev/null +++ b/uvm/ivl_uvm_intf_gen/README.md @@ -0,0 +1,24 @@ +# IVL_UVM Interface Generator + +Welcome to IVL_UVM project - https://github.com/svenka3/ivl_uvm + +## Description +This utility contains free, GNU licensed contribution to generate SystemVerilog interface for a given DUT. + +To run a demo, do: + +1. cd demo_dir +2. make + +Make sure you have the iverilog & vvp in your path before running make above. + +## About this utility: + +Given a Verilog DUT, goal is to generate SystemVerilog (SV) Testbench around it. +First step in creating SV testbench is to code SystemVerilog interface. This +utility automates that interface generation by using VPI routines. Code is inside: + - ivlog_vpi_src + + + + diff --git a/uvm/ivl_uvm_intf_gen/examples/alu.v b/uvm/ivl_uvm_intf_gen/examples/alu.v new file mode 100755 index 000000000..294070cd7 --- /dev/null +++ b/uvm/ivl_uvm_intf_gen/examples/alu.v @@ -0,0 +1,27 @@ +/********************************************************************** + * IVL_UVM example - SystemVerilog Interface generator + * + * + * Verilog DUT to test the $ivl_uvm_intf_gen + * +*********************************************************************/ + +`timescale 1ns / 1ns + + +module alu (clk, a, b, ci, sum, co); + input [7:0] a, b; + input ci, clk; + output [15:0] sum; + output co; + + `ifdef IVL_UVM_INTF_GEN + initial + begin + #1 $ivl_uvm_intf_gen(); + end + `endif // IVL_UVM_INTF_GEN +endmodule // alu + + + diff --git a/uvm/ivl_uvm_intf_gen/examples/register_slice.v b/uvm/ivl_uvm_intf_gen/examples/register_slice.v new file mode 100755 index 000000000..0211862e9 --- /dev/null +++ b/uvm/ivl_uvm_intf_gen/examples/register_slice.v @@ -0,0 +1,26 @@ +/********************************************************************** + * IVL_UVM example - SystemVerilog Interface generator + * + * + * Verilog DUT to test the $ivl_uvm_intf_gen + * +*********************************************************************/ + +`timescale 1ns / 1ns +module register_slice ( s_data_in, s_valid_in, s_ready_out, m_data_out, m_valid_out, m_ready_in); + + parameter WIDTH = 64; + + input [WIDTH-1:0] s_data_in; + input s_valid_in; + output s_ready_out; + output [WIDTH-1:0] m_data_out; + output m_valid_out; + input m_ready_in; + + + `ifdef IVL_UVM_INTF_GEN + initial #1 $ivl_uvm_intf_gen(); + `endif // IVL_UVM_INTF_GEN + +endmodule diff --git a/uvm/ivl_uvm_intf_gen/ivlog_vpi_src/az_ivl_uvm_common.h b/uvm/ivl_uvm_intf_gen/ivlog_vpi_src/az_ivl_uvm_common.h new file mode 100755 index 000000000..71c542f14 --- /dev/null +++ b/uvm/ivl_uvm_intf_gen/ivlog_vpi_src/az_ivl_uvm_common.h @@ -0,0 +1,40 @@ +/********************************************************************** + * IVL_UVM common ulitiy functions + * + * This source code is free software; you can redistribute it + * and/or modify it in source code form under the terms of the GNU + * General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + *********************************************************************/ + +#include /* ANSI C standard input/output library */ +#include "vpi_user.h" /* IEEE 1364 PLI VPI routine library */ + +void ivl_uvm_pr_copyright () { + + char * ivl_uvm_cright_msg; + + ivl_uvm_cright_msg + = "\tWelcome to IVL_UVM (http://https://github.com/svenka3/ivl_uvm)\n\ +\tVersion 2020.01 Copyright 2019-2022 AumzDA LLC\n\ +\t\tAll Rights Reserved. \n"; + + vpi_printf("\t--------------------------------------------------------------------\n"); + vpi_printf ("%s\n", ivl_uvm_cright_msg); + + vpi_printf("\t--------------------------------------------------------------------\n"); + +} + + diff --git a/uvm/ivl_uvm_intf_gen/ivlog_vpi_src/az_ivl_uvm_intf_gen.c b/uvm/ivl_uvm_intf_gen/ivlog_vpi_src/az_ivl_uvm_intf_gen.c new file mode 100755 index 000000000..e94f7f301 --- /dev/null +++ b/uvm/ivl_uvm_intf_gen/ivlog_vpi_src/az_ivl_uvm_intf_gen.c @@ -0,0 +1,295 @@ +#include /* ANSI C standard library */ +#include /* ANSI C standard input/output library */ +#include /* ANSI C standard arguments library */ +#include "vpi_user.h" /* IEEE 1364 PLI VPI routine library */ +#include /* ANSI C string library */ +#include /* ANSI C string library */ + +#include "az_ivl_uvm_common.h" + +/* prototypes of routines in this PLI application */ +PLI_INT32 IVL_UVM_IGEN_compiletf(); +PLI_INT32 IVL_UVM_IGEN_calltf(); + +/********************************************************************** + * VPI Registration Data + *********************************************************************/ +void IVL_UVM_IGEN_register() +{ + s_vpi_systf_data tf_data; + tf_data.type = vpiSysTask; + tf_data.sysfunctype = 0; + tf_data.tfname = "$ivl_uvm_intf_gen"; + tf_data.calltf = IVL_UVM_IGEN_calltf; + tf_data.compiletf = IVL_UVM_IGEN_compiletf; + tf_data.sizetf = NULL; + tf_data.user_data = NULL; + + vpi_register_systf(&tf_data); +} +/*********************************************************************/ + + +/********************************************************************** + * Compiletf application + *********************************************************************/ +PLI_INT32 IVL_UVM_IGEN_compiletf() +{ + vpiHandle systf_h, tfarg_itr; + + systf_h = vpi_handle(vpiSysTfCall, NULL); + if (systf_h == NULL) { + vpi_printf("ERROR: ivl_uvm_intf_gen could not obtain handle to systf call\n"); + vpi_control(vpiFinish, 1); /* abort simulation */ + return(0); + } + tfarg_itr = vpi_iterate(vpiArgument, systf_h); + if (systf_h == NULL) { + vpi_printf("ERROR: ivl_uvm_intf_gen could not obtain iterator to systf args\n"); + vpi_control(vpiFinish, 1); /* abort simulation */ + return(0); + } + return(0); +} + +/********************************************************************** + * calltf routine + *********************************************************************/ +PLI_INT32 IVL_UVM_IGEN_calltf() +{ + vpiHandle systf_h, mod_h, + port_itr, port_h; + + FILE * ivl_uvm_ifp; + FILE * ivl_uvm_tbp; + char * ivl_uvm_mod_name; + char * ivl_uvm_mod_name_saved; + char * ivl_uvm_port_name; + char * ivl_uvm_clk_name; + char ivl_uvm_dut_name [100]; + char ivl_uvm_intf_name [100]; + char ivl_uvm_intf_inst_name [100]; + char ivl_uvm_intf_fname [100]; + char ivl_uvm_tb_name [100]; + char ivl_uvm_tb_fname [100]; + vpiHandle ivl_uvm_top_mod_itr; + PLI_INT32 ivl_uvm_port_size; + PLI_INT32 ivl_uvm_port_count; + PLI_INT32 ivl_uvm_mp_c; + PLI_INT32 ivl_uvm_tb_sig_c; + PLI_INT32 clk_cmp_val; + char * ivl_uvm_mp_delimiter; + + + + ivl_uvm_pr_copyright (); + + + /* get module handle from first system task argument. Assume the */ + /* compiletf routine has already verified correct argument type. */ + systf_h = vpi_handle(vpiSysTfCall, NULL); + if (systf_h == NULL) { + vpi_printf("ERROR: ivl_uvm_intf_gen could not obtain handle to systf call\n"); + return(0); + } + ivl_uvm_top_mod_itr = vpi_iterate(vpiModule, NULL); + if (systf_h == NULL) { + vpi_printf("ERROR: ivl_uvm_intf_gen could not obtain iterator to systf args\n"); + return(0); + } + mod_h = vpi_scan(ivl_uvm_top_mod_itr); + vpi_free_object(ivl_uvm_top_mod_itr); /* free itr since did not scan until nul */ + + ivl_uvm_mod_name = vpi_get_str(vpiDefName, mod_h); + ivl_uvm_mod_name_saved = vpi_get_str(vpiDefName, mod_h); + vpi_printf("\nGenerating SystemVerilog Interface for Module \"%s\" \n", ivl_uvm_mod_name); + strcpy (ivl_uvm_dut_name, ivl_uvm_mod_name); + strcpy (ivl_uvm_intf_name, ivl_uvm_mod_name); + strcpy (ivl_uvm_intf_fname, ivl_uvm_mod_name); + strcpy (ivl_uvm_tb_name, ivl_uvm_mod_name); + strcpy (ivl_uvm_tb_fname, ivl_uvm_mod_name); + strcat (ivl_uvm_intf_name, "_if"); + strcpy (ivl_uvm_intf_inst_name, ivl_uvm_intf_name); + strcat (ivl_uvm_intf_inst_name, "_0"); + strcat (ivl_uvm_intf_fname, "_if.sv"); + strcat (ivl_uvm_tb_name, "_tb"); + strcat (ivl_uvm_tb_fname, "_tb.sv"); + + ivl_uvm_ifp = fopen (ivl_uvm_intf_fname, "w"); + fprintf(ivl_uvm_ifp, "// Automatically generated from IVL_UVM's Interface Generator utility \n"); + + fprintf(ivl_uvm_ifp, "// Using IVL_UVM_CLK as a text macro for clock \n"); + fprintf(ivl_uvm_ifp, "// If your clock is other than \"clk\" change the line below\n"); + fprintf(ivl_uvm_ifp, "`define IVL_UVM_CLK clk \n"); + fprintf(ivl_uvm_ifp, "interface %s (input logic `IVL_UVM_CLK);\n", ivl_uvm_intf_name); + + port_itr = vpi_iterate(vpiPort, mod_h); + if (!port_itr) { + vpi_printf(" No ports found\n"); + return(0); + } + + ivl_uvm_port_count = 0; + + while ((port_h = vpi_scan(port_itr))) { + ivl_uvm_port_count++; + ivl_uvm_port_name = vpi_get_str(vpiName, port_h); + ivl_uvm_clk_name = "clk"; + clk_cmp_val = strncmp (ivl_uvm_port_name , ivl_uvm_clk_name, 3); + if (clk_cmp_val == 0) continue; + + // vpi_printf(" Port name is %s clk_cmp_val: %d \n", ivl_uvm_port_name, clk_cmp_val); + ivl_uvm_port_size = vpi_get(vpiSize, port_h); + // vpi_printf(" Size is %d\n", ivl_uvm_port_size); + + fprintf(ivl_uvm_ifp, " logic [%d : 0] %s;\n", + ivl_uvm_port_size - 1, + ivl_uvm_port_name); + + } + + + // For clocking block + // + fprintf(ivl_uvm_ifp, "\n\n `ifdef IVL_UVM_ALLOW_CB_IN_IF \n"); + fprintf(ivl_uvm_ifp, "\n\n // Clocking block defintion for the TB side \n\n"); + fprintf(ivl_uvm_ifp, " // Assuption made is: there exists a clock named \"clk\"\n"); + fprintf(ivl_uvm_ifp, " clocking cb @(posedge `IVL_UVM_CLK);\n"); + port_itr = vpi_iterate(vpiPort, mod_h); + if (!port_itr) { + vpi_printf(" No ports found\n"); + return(0); + } + while ((port_h = vpi_scan(port_itr))) { + ivl_uvm_port_name = vpi_get_str(vpiName, port_h); + // vpi_printf(" Port name is %s\n", ivl_uvm_port_name); + ivl_uvm_port_size = vpi_get(vpiSize, port_h); + // vpi_printf(" Size is %d\n", ivl_uvm_port_size); + + // Skip clk signal + clk_cmp_val = strncmp (ivl_uvm_port_name , ivl_uvm_clk_name, 3); + if (clk_cmp_val == 0) continue; + + switch (vpi_get(vpiDirection, port_h)) { + case vpiInput: + fprintf(ivl_uvm_ifp, " output %s;\n", + ivl_uvm_port_name); + break; + case vpiOutput: + fprintf(ivl_uvm_ifp, " input %s;\n", + ivl_uvm_port_name); + break; + case vpiInout: + fprintf(ivl_uvm_ifp, " inout %s;\n", + ivl_uvm_port_name); + break; + } + } + fprintf(ivl_uvm_ifp, " endclocking : cb \n"); + fprintf(ivl_uvm_ifp, "\n `endif // IVL_UVM_ALLOW_CB_IN_IF \n"); + + // For modport + // + fprintf(ivl_uvm_ifp, "\n\n // Modport defintion for the DUT \n\n"); + fprintf(ivl_uvm_ifp, " modport dut_mp (\n"); + port_itr = vpi_iterate(vpiPort, mod_h); + if (!port_itr) { + vpi_printf(" No ports found\n"); + return(0); + } + ivl_uvm_mp_c = 0; + + while ((port_h = vpi_scan(port_itr))) { + ivl_uvm_port_name = vpi_get_str(vpiName, port_h); + ivl_uvm_port_size = vpi_get(vpiSize, port_h); + + ivl_uvm_mp_delimiter = ""; + if (ivl_uvm_mp_c < ivl_uvm_port_count - 1) { + ivl_uvm_mp_delimiter = ","; + } + //vpi_printf ("ivl_uvm_mp_c %d ivl_uvm_port_count %d ivl_uvm_mp_del: %s", + // ivl_uvm_mp_c, ivl_uvm_port_count, ivl_uvm_mp_delimiter); + ivl_uvm_mp_c++; + + switch (vpi_get(vpiDirection, port_h)) { + case vpiInput: + fprintf(ivl_uvm_ifp, " input %s%s\n", + ivl_uvm_port_name, ivl_uvm_mp_delimiter); + break; + case vpiOutput: + fprintf(ivl_uvm_ifp, " output %s%s\n", + ivl_uvm_port_name, ivl_uvm_mp_delimiter); + break; + case vpiInout: + fprintf(ivl_uvm_ifp, " inout %s%s\n", + ivl_uvm_port_name, ivl_uvm_mp_delimiter); + break; + } + } + fprintf(ivl_uvm_ifp, " ); // end of modport dut_mp \n"); + + + fprintf(ivl_uvm_ifp, "endinterface : %s \n", ivl_uvm_intf_name); + vpi_printf("See file: \"%s\" for output\n",ivl_uvm_intf_fname); + // For TB generation + ivl_uvm_tbp = fopen (ivl_uvm_tb_fname, "w"); + fprintf(ivl_uvm_tbp, "// Automatically generated from IVL_UVM's Interface Generator utility \n"); + fprintf(ivl_uvm_tbp, "module %s; \n", ivl_uvm_tb_name); + fprintf(ivl_uvm_tbp, " timeunit 1ns; \n"); + fprintf(ivl_uvm_tbp, " timeprecision 1ns; \n"); + fprintf(ivl_uvm_tbp, " parameter IVL_UVM_CLK_PERIOD = 10; \n\n"); + + fprintf(ivl_uvm_tbp, " // Simple clock generator \n"); + fprintf(ivl_uvm_tbp, " bit `IVL_UVM_CLK ;\n"); + fprintf(ivl_uvm_tbp, " always # (IVL_UVM_CLK_PERIOD/2) `IVL_UVM_CLK <= ~`IVL_UVM_CLK;\n"); + + fprintf(ivl_uvm_tbp, "\n // Interface instance \n"); + fprintf(ivl_uvm_tbp, " %s %s (.*); \n", ivl_uvm_intf_name, ivl_uvm_intf_inst_name); + fprintf(ivl_uvm_tbp, "\n // Connect TB clk to Interface instance clk \n"); + + fprintf(ivl_uvm_tbp, "\n // DUT instance \n"); + fprintf(ivl_uvm_tbp, " %s %s_0 ( \n", ivl_uvm_dut_name, ivl_uvm_dut_name); + + port_itr = vpi_iterate(vpiPort, mod_h); + if (!port_itr) { + vpi_printf(" No ports found\n"); + return(0); + } + + ivl_uvm_tb_sig_c = 0; + while ((port_h = vpi_scan(port_itr))) { + ivl_uvm_port_name = vpi_get_str(vpiName, port_h); + ivl_uvm_mp_delimiter = ""; + if (ivl_uvm_tb_sig_c < ivl_uvm_port_count - 1) { + ivl_uvm_mp_delimiter = ","; + } + ivl_uvm_tb_sig_c++; + + fprintf(ivl_uvm_tbp, " .%s(%s.%s)%s \n", ivl_uvm_port_name, ivl_uvm_intf_inst_name, ivl_uvm_port_name, ivl_uvm_mp_delimiter); + } + + fprintf(ivl_uvm_tbp, " ); // %s DUT \n", ivl_uvm_dut_name); + + fprintf(ivl_uvm_tbp, "\n // Simple stimuli block, should use IVL_UVM_Go2UVM ideally \n"); + fprintf(ivl_uvm_tbp, " initial begin : stim \n"); + fprintf(ivl_uvm_tbp, " // Example \n"); + fprintf(ivl_uvm_tbp, " // #10 %s.dut_input_signal <= 1'b1; \n", ivl_uvm_intf_inst_name); + fprintf(ivl_uvm_tbp, " $display (\"Automatically generated Testbench from IVL_UVM's Interface Generator utility \"); \n"); + fprintf(ivl_uvm_tbp, " #100 $finish (2); \n"); + fprintf(ivl_uvm_tbp, " end : stim \n"); + + fprintf(ivl_uvm_tbp, "endmodule : %s \n", ivl_uvm_tb_name); + vpi_printf("See file: \"%s\" for output\n",ivl_uvm_tb_fname); + vpi_printf("Include these 2 files in your next simulation for a quick TB: \"%s\" \"%s\" \n", ivl_uvm_intf_fname, ivl_uvm_tb_fname); + + return(0); +} +#ifndef VCS +/*********************************************************************/ +void (*vlog_startup_routines[])() = +{ + IVL_UVM_IGEN_register, /* */ + 0 /*** final entry must be 0 ***/ + +}; +#endif diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_0.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_0.log new file mode 100644 index 000000000..e69de29bb diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_1.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_1.log new file mode 100644 index 000000000..e69de29bb diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_2.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_2.log new file mode 100644 index 000000000..562d1f586 --- /dev/null +++ b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_2.log @@ -0,0 +1,2 @@ +../../ivl_uvm_tests/ivl_uvm_test_2/ivl_uvm_run_test.sv:42: error: The ivl_uvm_pkg.uvm_component.new constructor call is missing arguments. +1 error(s) during elaboration. diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_3.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_3.log new file mode 100644 index 000000000..e3c06438d --- /dev/null +++ b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_3.log @@ -0,0 +1,2 @@ +../../ivl_uvm_tests/ivl_uvm_test_3/ivl_uvm_test_clp.sv:37: error: The ivl_uvm_pkg.uvm_component.new constructor call is missing arguments. +1 error(s) during elaboration. diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_4.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_4.log new file mode 100644 index 000000000..9a6ac582f --- /dev/null +++ b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_4.log @@ -0,0 +1,3 @@ +../../ivl_uvm_tests/ivl_uvm_test_4/ivl_uvm_test_bcl.sv:49: error: The ivl_uvm_pkg.uvm_component.new constructor call is missing arguments. +../../ivl_uvm_src/ivl_uvm_top.svh:9: error: Parm count mismatch passing 2 arguments to constructor expecting 1 arguments. +2 error(s) during elaboration. diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_5.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_comp_5.log new file mode 100644 index 000000000..e69de29bb diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0.log new file mode 100644 index 000000000..1ed7984ad --- /dev/null +++ b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0.log @@ -0,0 +1,21 @@ +UVM_INFO ../../ivl_uvm_src/ivl_uvm_top.svh(8) @ 0.000 ns [IVL_GO2UVM] Using UVM_TESTNAME: uvm_test +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(95) @ 0.000 ns [IVL_GO2UVM] ivl_uvm_pkg.uvm_object.uvm_report_info +UVM_INFO ../../ivl_uvm_src/ivl_uvm_clp.svh(509) @ 1.000 ns [IVL_GO2UVM] CLP +UVM_INFO @ 1.000 ns [TIMOUTSET] '+UVM_TIMEOUT=1' Global Timeout: 1000000.000 ns +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(30) @ 100.000 ns [IVL_UVM] UVM_MEDIUM: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(33) @ 200.000 ns [IVL_UVM] NONE: Hello World +UVM_WARNING ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(35) @ 300.000 ns [IVL_UVM] Sample Warning! +UVM_ERROR ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(36) @ 400.000 ns [IVL_UVM] Sample Error! +UVM_FATAL ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(37) @ 500.000 ns [IVL_UVM] Sample Fatal! + +--- UVM Report Summary --- + +** Report counts by severity +UVM_INFO : 8 +UVM_WARNING : 1 +UVM_ERROR : 1 +UVM_FATAL : 1 + +Test FAILED with 1 error(s), look for UVM_ERROR in log file + +UVM_INFO ../../ivl_uvm_src/ivl_uvm_msg.svh(74) @ 500.000 ns [IVL_GO2UVM] Thanks for using IVL_UVM Package diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0_FULL.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0_FULL.log new file mode 100644 index 000000000..7e9ce5ea7 --- /dev/null +++ b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0_FULL.log @@ -0,0 +1,23 @@ +UVM_INFO ../../ivl_uvm_src/ivl_uvm_top.svh(8) @ 0.000 ns [IVL_GO2UVM] Using UVM_TESTNAME: uvm_test +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(95) @ 0.000 ns [IVL_GO2UVM] ivl_uvm_pkg.uvm_object.uvm_report_info +UVM_INFO ../../ivl_uvm_src/ivl_uvm_clp.svh(509) @ 1.000 ns [IVL_GO2UVM] CLP +UVM_INFO @ 1.000 ns [TIMOUTSET] '+UVM_TIMEOUT=1' Global Timeout: 1000000.000 ns +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(30) @ 100.000 ns [IVL_UVM] UVM_MEDIUM: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(31) @ 100.000 ns [IVL_UVM] UVM_HIGH: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(32) @ 100.000 ns [IVL_UVM] UVM_FULL: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(33) @ 200.000 ns [IVL_UVM] NONE: Hello World +UVM_WARNING ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(35) @ 300.000 ns [IVL_UVM] Sample Warning! +UVM_ERROR ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(36) @ 400.000 ns [IVL_UVM] Sample Error! +UVM_FATAL ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(37) @ 500.000 ns [IVL_UVM] Sample Fatal! + +--- UVM Report Summary --- + +** Report counts by severity +UVM_INFO : 10 +UVM_WARNING : 1 +UVM_ERROR : 1 +UVM_FATAL : 1 + +Test FAILED with 1 error(s), look for UVM_ERROR in log file + +UVM_INFO ../../ivl_uvm_src/ivl_uvm_msg.svh(74) @ 500.000 ns [IVL_GO2UVM] Thanks for using IVL_UVM Package diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0_HIGH.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0_HIGH.log new file mode 100644 index 000000000..3ab037f3b --- /dev/null +++ b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_0_HIGH.log @@ -0,0 +1,22 @@ +UVM_INFO ../../ivl_uvm_src/ivl_uvm_top.svh(8) @ 0.000 ns [IVL_GO2UVM] Using UVM_TESTNAME: uvm_test +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(95) @ 0.000 ns [IVL_GO2UVM] ivl_uvm_pkg.uvm_object.uvm_report_info +UVM_INFO ../../ivl_uvm_src/ivl_uvm_clp.svh(509) @ 1.000 ns [IVL_GO2UVM] CLP +UVM_INFO @ 1.000 ns [TIMOUTSET] '+UVM_TIMEOUT=1' Global Timeout: 1000000.000 ns +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(30) @ 100.000 ns [IVL_UVM] UVM_MEDIUM: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(31) @ 100.000 ns [IVL_UVM] UVM_HIGH: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(33) @ 200.000 ns [IVL_UVM] NONE: Hello World +UVM_WARNING ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(35) @ 300.000 ns [IVL_UVM] Sample Warning! +UVM_ERROR ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(36) @ 400.000 ns [IVL_UVM] Sample Error! +UVM_FATAL ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(37) @ 500.000 ns [IVL_UVM] Sample Fatal! + +--- UVM Report Summary --- + +** Report counts by severity +UVM_INFO : 9 +UVM_WARNING : 1 +UVM_ERROR : 1 +UVM_FATAL : 1 + +Test FAILED with 1 error(s), look for UVM_ERROR in log file + +UVM_INFO ../../ivl_uvm_src/ivl_uvm_msg.svh(74) @ 500.000 ns [IVL_GO2UVM] Thanks for using IVL_UVM Package diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_1.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_1.log new file mode 100644 index 000000000..65084e56b --- /dev/null +++ b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_1.log @@ -0,0 +1,22 @@ +UVM_INFO ../../ivl_uvm_src/ivl_uvm_top.svh(8) @ 0.000 ns [IVL_GO2UVM] Using UVM_TESTNAME: uvm_test +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(95) @ 0.000 ns [IVL_GO2UVM] ivl_uvm_pkg.uvm_object.uvm_report_info +UVM_INFO ../../ivl_uvm_src/ivl_uvm_clp.svh(509) @ 1.000 ns [IVL_GO2UVM] CLP +UVM_INFO @ 1.000 ns [TIMOUTSET] '+UVM_TIMEOUT=1' Global Timeout: 1000000.000 ns +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_1/ivl_uvm_test_class.sv(33) @ 100.000 ns [IVL_UVM] UVM_MEDIUM: Hello World +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(47) @ 100.000 ns [IVL_GO2UVM] build_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(51) @ 100.000 ns [IVL_GO2UVM] connect_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(55) @ 100.000 ns [IVL_GO2UVM] end_of_elaboration_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(58) @ 100.000 ns [IVL_GO2UVM] start_of_simulation_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(62) @ 100.000 ns [IVL_GO2UVM] run_phase + +--- UVM Report Summary --- + +** Report counts by severity +UVM_INFO : 17 +UVM_WARNING : 0 +UVM_ERROR : 0 +UVM_FATAL : 0 + +*** Congratulations! Test PASSED with NO UVM_ERRORs *** + +UVM_INFO ../../ivl_uvm_src/ivl_uvm_msg.svh(74) @ 100.000 ns [IVL_GO2UVM] Thanks for using IVL_UVM Package diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_2.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_2.log new file mode 100644 index 000000000..65084e56b --- /dev/null +++ b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_2.log @@ -0,0 +1,22 @@ +UVM_INFO ../../ivl_uvm_src/ivl_uvm_top.svh(8) @ 0.000 ns [IVL_GO2UVM] Using UVM_TESTNAME: uvm_test +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(95) @ 0.000 ns [IVL_GO2UVM] ivl_uvm_pkg.uvm_object.uvm_report_info +UVM_INFO ../../ivl_uvm_src/ivl_uvm_clp.svh(509) @ 1.000 ns [IVL_GO2UVM] CLP +UVM_INFO @ 1.000 ns [TIMOUTSET] '+UVM_TIMEOUT=1' Global Timeout: 1000000.000 ns +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_1/ivl_uvm_test_class.sv(33) @ 100.000 ns [IVL_UVM] UVM_MEDIUM: Hello World +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(47) @ 100.000 ns [IVL_GO2UVM] build_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(51) @ 100.000 ns [IVL_GO2UVM] connect_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(55) @ 100.000 ns [IVL_GO2UVM] end_of_elaboration_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(58) @ 100.000 ns [IVL_GO2UVM] start_of_simulation_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(62) @ 100.000 ns [IVL_GO2UVM] run_phase + +--- UVM Report Summary --- + +** Report counts by severity +UVM_INFO : 17 +UVM_WARNING : 0 +UVM_ERROR : 0 +UVM_FATAL : 0 + +*** Congratulations! Test PASSED with NO UVM_ERRORs *** + +UVM_INFO ../../ivl_uvm_src/ivl_uvm_msg.svh(74) @ 100.000 ns [IVL_GO2UVM] Thanks for using IVL_UVM Package diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_3.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_3.log new file mode 100644 index 000000000..25ec5d96d --- /dev/null +++ b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_3.log @@ -0,0 +1,23 @@ +UVM_INFO ../../ivl_uvm_src/ivl_uvm_top.svh(8) @ 0.000 ns [IVL_GO2UVM] Using UVM_TESTNAME: uvm_test +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(95) @ 0.000 ns [IVL_GO2UVM] ivl_uvm_pkg.uvm_object.uvm_report_info +UVM_INFO ../../ivl_uvm_src/ivl_uvm_clp.svh(509) @ 1.000 ns [IVL_GO2UVM] CLP +UVM_INFO @ 1.000 ns [TIMOUTSET] '+UVM_TIMEOUT=1' provided on the command line is being applied. +UVM_INFO @ 1.000 ns [TIMOUTSET] '+UVM_TIMEOUT=1' Global Timeout: 1000000.000 ns +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_1/ivl_uvm_test_class.sv(33) @ 100.000 ns [IVL_UVM] UVM_MEDIUM: Hello World +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(47) @ 100.000 ns [IVL_GO2UVM] build_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(51) @ 100.000 ns [IVL_GO2UVM] connect_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(55) @ 100.000 ns [IVL_GO2UVM] end_of_elaboration_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(58) @ 100.000 ns [IVL_GO2UVM] start_of_simulation_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(62) @ 100.000 ns [IVL_GO2UVM] run_phase + +--- UVM Report Summary --- + +** Report counts by severity +UVM_INFO : 18 +UVM_WARNING : 0 +UVM_ERROR : 0 +UVM_FATAL : 0 + +*** Congratulations! Test PASSED with NO UVM_ERRORs *** + +UVM_INFO ../../ivl_uvm_src/ivl_uvm_msg.svh(74) @ 100.000 ns [IVL_GO2UVM] Thanks for using IVL_UVM Package diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_4.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_4.log new file mode 100644 index 000000000..65084e56b --- /dev/null +++ b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_4.log @@ -0,0 +1,22 @@ +UVM_INFO ../../ivl_uvm_src/ivl_uvm_top.svh(8) @ 0.000 ns [IVL_GO2UVM] Using UVM_TESTNAME: uvm_test +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(95) @ 0.000 ns [IVL_GO2UVM] ivl_uvm_pkg.uvm_object.uvm_report_info +UVM_INFO ../../ivl_uvm_src/ivl_uvm_clp.svh(509) @ 1.000 ns [IVL_GO2UVM] CLP +UVM_INFO @ 1.000 ns [TIMOUTSET] '+UVM_TIMEOUT=1' Global Timeout: 1000000.000 ns +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_1/ivl_uvm_test_class.sv(33) @ 100.000 ns [IVL_UVM] UVM_MEDIUM: Hello World +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(47) @ 100.000 ns [IVL_GO2UVM] build_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(51) @ 100.000 ns [IVL_GO2UVM] connect_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(55) @ 100.000 ns [IVL_GO2UVM] end_of_elaboration_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(58) @ 100.000 ns [IVL_GO2UVM] start_of_simulation_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(62) @ 100.000 ns [IVL_GO2UVM] run_phase + +--- UVM Report Summary --- + +** Report counts by severity +UVM_INFO : 17 +UVM_WARNING : 0 +UVM_ERROR : 0 +UVM_FATAL : 0 + +*** Congratulations! Test PASSED with NO UVM_ERRORs *** + +UVM_INFO ../../ivl_uvm_src/ivl_uvm_msg.svh(74) @ 100.000 ns [IVL_GO2UVM] Thanks for using IVL_UVM Package diff --git a/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_5.log b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_5.log new file mode 100644 index 000000000..c50d0c33b --- /dev/null +++ b/uvm/ivl_uvm_regress/refLogs/ivl_uvm_run_5.log @@ -0,0 +1,39 @@ +UVM_INFO /Users/srini/proj/IVL_UVM/Git_ivl_uvm/ivl_uvm/ivl_uvm_src/ivl_uvm_pkg.sv(48) @ 0.000 ns [IVL_GO2UVM] Using UVM_TESTNAME: sanity_test +UVM_INFO /Users/srini/proj/IVL_UVM/Git_ivl_uvm/ivl_uvm/ivl_uvm_src/ivl_uvm_comps.svh(104) @ 0.000 ns [IVL_GO2UVM] ivl_uvm_pkg.uvm_object.uvm_report_info +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(36) @ 0.000 ns [IVL_GO2UVM] ivl_uvm_pkg.uvm_object.uvm_report_info +UVM_INFO /Users/srini/proj/IVL_UVM/Git_ivl_uvm/ivl_uvm/ivl_uvm_src/ivl_uvm_clp.svh(516) @ 1.000 ns [IVL_GO2UVM] CLP +UVM_INFO @ 1.000 ns [TIMOUTSET] '+UVM_TIMEOUT=1' Global Timeout: 1000000.000 ns +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(72) @ 100.000 ns [IVL_UVM] UVM_MEDIUM: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(55) @ 100.000 ns [IVL_GO2UVM] Test MBX: Put: 0x92153524 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(65) @ 105.000 ns [IVL_GO2UVM] Test MBX: Get: 0x92153524 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(55) @ 110.000 ns [IVL_GO2UVM] Test MBX: Put: 0x40895e81 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(65) @ 110.000 ns [IVL_GO2UVM] Test MBX: Get: 0x40895e81 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(55) @ 120.000 ns [IVL_GO2UVM] Test MBX: Put: 0x484d609 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(65) @ 120.000 ns [IVL_GO2UVM] Test MBX: Get: 0x484d609 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(55) @ 130.000 ns [IVL_GO2UVM] Test MBX: Put: 0x31f05663 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(65) @ 130.000 ns [IVL_GO2UVM] Test MBX: Get: 0x31f05663 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(55) @ 140.000 ns [IVL_GO2UVM] Test MBX: Put: 0x86b97b0d +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(65) @ 140.000 ns [IVL_GO2UVM] Test MBX: Get: 0x86b97b0d +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(55) @ 150.000 ns [IVL_GO2UVM] Test MBX: Put: 0xc6df998d +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(65) @ 150.000 ns [IVL_GO2UVM] Test MBX: Get: 0xc6df998d +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(55) @ 160.000 ns [IVL_GO2UVM] Test MBX: Put: 0x32c28465 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(65) @ 160.000 ns [IVL_GO2UVM] Test MBX: Get: 0x32c28465 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(55) @ 170.000 ns [IVL_GO2UVM] Test MBX: Put: 0x9375212 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(65) @ 170.000 ns [IVL_GO2UVM] Test MBX: Get: 0x9375212 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(55) @ 180.000 ns [IVL_GO2UVM] Test MBX: Put: 0x80f3e301 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(65) @ 180.000 ns [IVL_GO2UVM] Test MBX: Get: 0x80f3e301 +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(55) @ 190.000 ns [IVL_GO2UVM] Test MBX: Put: 0x86d7cd0d +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv(65) @ 190.000 ns [IVL_GO2UVM] Test MBX: Get: 0x86d7cd0d +../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv:80: $finish(2) called at 20000 (10ps) + +--- UVM Report Summary --- + +** Report counts by severity +UVM_INFO : 29 +UVM_WARNING : 0 +UVM_ERROR : 0 +UVM_FATAL : 0 + +*** Congratulations! Test PASSED with NO UVM_ERRORs *** + +UVM_INFO /Users/srini/proj/IVL_UVM/Git_ivl_uvm/ivl_uvm/ivl_uvm_src/ivl_uvm_msg.svh(82) @ 200.000 ns [IVL_GO2UVM] Thanks for using IVL_UVM Package diff --git a/uvm/ivl_uvm_regress/run_dir/flist.t0 b/uvm/ivl_uvm_regress/run_dir/flist.t0 new file mode 100644 index 000000000..e269c4202 --- /dev/null +++ b/uvm/ivl_uvm_regress/run_dir/flist.t0 @@ -0,0 +1,5 @@ +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_pkg.sv +${IVL_UVM_HOME}/ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv + +// This should be the last line in file-list +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_top.svh diff --git a/uvm/ivl_uvm_regress/run_dir/flist.t1 b/uvm/ivl_uvm_regress/run_dir/flist.t1 new file mode 100644 index 000000000..e7a924d22 --- /dev/null +++ b/uvm/ivl_uvm_regress/run_dir/flist.t1 @@ -0,0 +1,5 @@ +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_pkg.sv +${IVL_UVM_HOME}/ivl_uvm_tests/ivl_uvm_test_1/ivl_uvm_test_class.sv + +// Thie should be the last line in file-list +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_top.svh diff --git a/uvm/ivl_uvm_regress/run_dir/flist.t2 b/uvm/ivl_uvm_regress/run_dir/flist.t2 new file mode 100644 index 000000000..7d7b5d53d --- /dev/null +++ b/uvm/ivl_uvm_regress/run_dir/flist.t2 @@ -0,0 +1,5 @@ +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_pkg.sv +${IVL_UVM_HOME}/ivl_uvm_tests/ivl_uvm_test_2/ivl_uvm_run_test.sv + +// Thie should be the last line in file-list +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_top.svh diff --git a/uvm/ivl_uvm_regress/run_dir/flist.t3 b/uvm/ivl_uvm_regress/run_dir/flist.t3 new file mode 100644 index 000000000..dcc16bac0 --- /dev/null +++ b/uvm/ivl_uvm_regress/run_dir/flist.t3 @@ -0,0 +1,7 @@ ++define+UVM_CMDLINE_NO_DPI +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_pkg.sv +${IVL_UVM_HOME}/ivl_uvm_tests/ivl_uvm_test_3/ivl_uvm_test_clp.sv + +// Thie should be the last line in file-list +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_top.svh + diff --git a/uvm/ivl_uvm_regress/run_dir/flist.t4 b/uvm/ivl_uvm_regress/run_dir/flist.t4 new file mode 100644 index 000000000..e28103c54 --- /dev/null +++ b/uvm/ivl_uvm_regress/run_dir/flist.t4 @@ -0,0 +1,8 @@ ++define+UVM_TESTNAME=sanity_test +// +define+UVM_TESTNAME=test_pkg::sanity_test +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_pkg.sv +${IVL_UVM_HOME}/ivl_uvm_tests/ivl_uvm_test_4/ivl_uvm_test_bcl.sv + +// Thie should be the last line in file-list +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_top.svh + diff --git a/uvm/ivl_uvm_regress/run_dir/flist.t5 b/uvm/ivl_uvm_regress/run_dir/flist.t5 new file mode 100644 index 000000000..ab7085607 --- /dev/null +++ b/uvm/ivl_uvm_regress/run_dir/flist.t5 @@ -0,0 +1,8 @@ ++define+UVM_TESTNAME=sanity_test + +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_pkg.sv +../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv + +// Thie should be the last line in file-list +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_top.svh + diff --git a/uvm/ivl_uvm_regress/run_dir/flist.t6 b/uvm/ivl_uvm_regress/run_dir/flist.t6 new file mode 100644 index 000000000..ea31351cd --- /dev/null +++ b/uvm/ivl_uvm_regress/run_dir/flist.t6 @@ -0,0 +1,6 @@ +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_pkg.sv +../../ivl_uvm_tests/ivl_uvm_test_5/ivl_uvm_test_mbx_int.sv + +// Thie should be the last line in file-list +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_top.svh + diff --git a/uvm/ivl_uvm_regress/run_dir/flist.t7 b/uvm/ivl_uvm_regress/run_dir/flist.t7 new file mode 100644 index 000000000..ce8fd04b3 --- /dev/null +++ b/uvm/ivl_uvm_regress/run_dir/flist.t7 @@ -0,0 +1,7 @@ +// +define+UVM_TESTNAME=apb_test ++incdir+../../ivl_uvm_tests/ivl_uvm_test_7/tb_src/ + +${IVL_UVM_HOME}/ivl_uvm_src/ivl_uvm_pkg.sv +../../ivl_uvm_tests/ivl_uvm_test_7/tb_src/apb_pkg.sv + + diff --git a/uvm/ivl_uvm_regress/run_dir/ivl_uvm_comp_0.log b/uvm/ivl_uvm_regress/run_dir/ivl_uvm_comp_0.log new file mode 100644 index 000000000..e69de29bb diff --git a/uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0.log b/uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0.log new file mode 100644 index 000000000..332584db7 --- /dev/null +++ b/uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0.log @@ -0,0 +1,24 @@ +UVM_INFO ../../ivl_uvm_src/ivl_uvm_pkg.sv(48) @ 0.000 ns [IVL_GO2UVM] Using UVM_TESTNAME: ivl_uvm_default_test +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(104) @ 0.000 ns [IVL_GO2UVM] ivl_uvm_pkg.uvm_object.uvm_report_info +UVM_INFO ../../ivl_uvm_src/ivl_uvm_clp.svh(516) @ 1.000 ns [IVL_GO2UVM] CLP +UVM_INFO @ 1.000 ns [TIMOUTSET] '+UVM_TIMEOUT=1' Global Timeout: 1000000.000 ns +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(34) @ 100.000 ns [IVL_UVM] UVM_MEDIUM: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(37) @ 200.000 ns [IVL_UVM] NONE: Hello World +UVM_WARNING ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(39) @ 300.000 ns [IVL_UVM] Sample Warning! +UVM_ERROR ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(40) @ 400.000 ns [IVL_UVM] Sample Error! +UVM_ERROR ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(41) @ 500.000 ns [IVL_UVM] Sample Error! +UVM_ERROR ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(42) @ 600.000 ns [IVL_UVM] Sample Error! +UVM_FATAL ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(43) @ 700.000 ns [IVL_UVM] Sample Fatal! + +--- UVM Report Summary --- + +** Report counts by severity +UVM_INFO : 8 +UVM_WARNING : 1 +UVM_ERROR : 3 +UVM_FATAL : 1 + +Test FAILED with 3 error(s), look for UVM_ERROR in log file + +UVM_INFO ../../ivl_uvm_src/ivl_uvm_msg.svh(82) @ 700.000 ns [IVL_GO2UVM] Thanks for using IVL_UVM Package +../../ivl_uvm_src/ivl_uvm_msg.svh:188: $finish(2) called at 70000 (10ps) diff --git a/uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0_FULL.log b/uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0_FULL.log new file mode 100644 index 000000000..fc03bceb8 --- /dev/null +++ b/uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0_FULL.log @@ -0,0 +1,31 @@ +UVM_INFO ../../ivl_uvm_src/ivl_uvm_pkg.sv(48) @ 0.000 ns [IVL_GO2UVM] Using UVM_TESTNAME: ivl_uvm_default_test +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(104) @ 0.000 ns [IVL_GO2UVM] ivl_uvm_pkg.uvm_object.uvm_report_info +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(56) @ 0.000 ns [IVL_GO2UVM] build_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(60) @ 0.000 ns [IVL_GO2UVM] connect_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(64) @ 0.000 ns [IVL_GO2UVM] end_of_elaboration_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(67) @ 0.000 ns [IVL_GO2UVM] start_of_simulation_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(71) @ 0.000 ns [IVL_GO2UVM] run_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_clp.svh(516) @ 1.000 ns [IVL_GO2UVM] CLP +UVM_INFO @ 1.000 ns [TIMOUTSET] '+UVM_TIMEOUT=1' Global Timeout: 1000000.000 ns +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(34) @ 100.000 ns [IVL_UVM] UVM_MEDIUM: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(35) @ 100.000 ns [IVL_UVM] UVM_HIGH: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(36) @ 100.000 ns [IVL_UVM] UVM_FULL: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(37) @ 200.000 ns [IVL_UVM] NONE: Hello World +UVM_WARNING ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(39) @ 300.000 ns [IVL_UVM] Sample Warning! +UVM_ERROR ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(40) @ 400.000 ns [IVL_UVM] Sample Error! +UVM_ERROR ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(41) @ 500.000 ns [IVL_UVM] Sample Error! +UVM_ERROR ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(42) @ 600.000 ns [IVL_UVM] Sample Error! +UVM_FATAL ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(43) @ 700.000 ns [IVL_UVM] Sample Fatal! + +--- UVM Report Summary --- + +** Report counts by severity +UVM_INFO : 20 +UVM_WARNING : 1 +UVM_ERROR : 3 +UVM_FATAL : 1 + +Test FAILED with 3 error(s), look for UVM_ERROR in log file + +UVM_INFO ../../ivl_uvm_src/ivl_uvm_msg.svh(82) @ 700.000 ns [IVL_GO2UVM] Thanks for using IVL_UVM Package +../../ivl_uvm_src/ivl_uvm_msg.svh:188: $finish(2) called at 70000 (10ps) diff --git a/uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0_HIGH.log b/uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0_HIGH.log new file mode 100644 index 000000000..293201a89 --- /dev/null +++ b/uvm/ivl_uvm_regress/run_dir/ivl_uvm_run_0_HIGH.log @@ -0,0 +1,30 @@ +UVM_INFO ../../ivl_uvm_src/ivl_uvm_pkg.sv(48) @ 0.000 ns [IVL_GO2UVM] Using UVM_TESTNAME: ivl_uvm_default_test +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(104) @ 0.000 ns [IVL_GO2UVM] ivl_uvm_pkg.uvm_object.uvm_report_info +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(56) @ 0.000 ns [IVL_GO2UVM] build_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(60) @ 0.000 ns [IVL_GO2UVM] connect_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(64) @ 0.000 ns [IVL_GO2UVM] end_of_elaboration_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(67) @ 0.000 ns [IVL_GO2UVM] start_of_simulation_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_comps.svh(71) @ 0.000 ns [IVL_GO2UVM] run_phase +UVM_INFO ../../ivl_uvm_src/ivl_uvm_clp.svh(516) @ 1.000 ns [IVL_GO2UVM] CLP +UVM_INFO @ 1.000 ns [TIMOUTSET] '+UVM_TIMEOUT=1' Global Timeout: 1000000.000 ns +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(34) @ 100.000 ns [IVL_UVM] UVM_MEDIUM: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(35) @ 100.000 ns [IVL_UVM] UVM_HIGH: Hello World +UVM_INFO ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(37) @ 200.000 ns [IVL_UVM] NONE: Hello World +UVM_WARNING ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(39) @ 300.000 ns [IVL_UVM] Sample Warning! +UVM_ERROR ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(40) @ 400.000 ns [IVL_UVM] Sample Error! +UVM_ERROR ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(41) @ 500.000 ns [IVL_UVM] Sample Error! +UVM_ERROR ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(42) @ 600.000 ns [IVL_UVM] Sample Error! +UVM_FATAL ../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv(43) @ 700.000 ns [IVL_UVM] Sample Fatal! + +--- UVM Report Summary --- + +** Report counts by severity +UVM_INFO : 19 +UVM_WARNING : 1 +UVM_ERROR : 3 +UVM_FATAL : 1 + +Test FAILED with 3 error(s), look for UVM_ERROR in log file + +UVM_INFO ../../ivl_uvm_src/ivl_uvm_msg.svh(82) @ 700.000 ns [IVL_GO2UVM] Thanks for using IVL_UVM Package +../../ivl_uvm_src/ivl_uvm_msg.svh:188: $finish(2) called at 70000 (10ps) diff --git a/uvm/ivl_uvm_regress/run_dir/vw_ivl_ivl_uvm.vvp b/uvm/ivl_uvm_regress/run_dir/vw_ivl_ivl_uvm.vvp new file mode 100755 index 000000000..ef1513bec --- /dev/null +++ b/uvm/ivl_uvm_regress/run_dir/vw_ivl_ivl_uvm.vvp @@ -0,0 +1,3617 @@ +#! /usr/bin/vvp +:ivl_version "12.0 (stable)"; +:ivl_delay_selection "TYPICAL"; +:vpi_time_precision - 11; +:vpi_module "/usr/lib/x86_64-linux-gnu/ivl/system.vpi"; +:vpi_module "/usr/lib/x86_64-linux-gnu/ivl/vhdl_sys.vpi"; +:vpi_module "/usr/lib/x86_64-linux-gnu/ivl/vhdl_textio.vpi"; +:vpi_module "/usr/lib/x86_64-linux-gnu/ivl/v2005_math.vpi"; +:vpi_module "/usr/lib/x86_64-linux-gnu/ivl/va_math.vpi"; +:vpi_module "/usr/lib/x86_64-linux-gnu/ivl/v2009.vpi"; +S_0x621588dd4eb0 .scope package, "$unit" "$unit" 2 1; + .timescale -9 -11; +C0x621588cc6b40 .class "uvm_cmd_line_verb" [3] + 0: "comp_path", "S" + 1: "exec_time", "sb32" + 2: "id", "S" + ; +S_0x621588e24990 .scope class, "uvm_cmd_line_verb" "uvm_cmd_line_verb" 3 26, 3 26 0, S_0x621588dd4eb0; + .timescale -9 -11; +S_0x621588d73510 .scope package, "ivl_uvm_pkg" "ivl_uvm_pkg" 4 33; + .timescale -9 -9; +P_0x621588e23960 .param/l "UVM_ABSTRACT" 0 5 218, +C4<0000000000000000000000000000000100000000000000>; +P_0x621588e239a0 .param/l "UVM_ALL_ON" 0 5 198, C4<00000000000000000000000101010101>; +P_0x621588e239e0 .param/l "UVM_CHECK_FIELDS" 0 5 226, +C4<00000000000000000000000000000000100000000000000011>; +P_0x621588e23a20 .param/l "UVM_COMPARE" 0 5 206, +C4<0000000000000000000000000000000100>; +P_0x621588e23a60 .param/l "UVM_COPY" 0 5 204, +C4<00000000000000000000000000000001>; +P_0x621588e23aa0 .param/l "UVM_DEFAULT" 0 5 197, C4<00000000000000000000010101010101>; +P_0x621588e23ae0 .param/l "UVM_END_DATA_EXTRA" 0 5 227, +C4<00000000000000000000000000000000100000000000000100>; +P_0x621588e23b20 .param/l "UVM_END_FUNCS" 0 5 237, +C4<0000000000000000000000000000000000100000000000001000>; +P_0x621588e23b60 .param/l "UVM_FLAGS" 0 5 224, +C4<00000000000000000000000000000000100000000000000001>; +P_0x621588e23ba0 .param/l "UVM_FLAGS_OFF" 0 5 200, +C4<00000000000000000000000000000000>; +P_0x621588e23be0 .param/l "UVM_FLAGS_ON" 0 5 199, C4<00000000000000000000000101010101>; +P_0x621588e23c20 .param/l "UVM_MACRO_EXTRAS" 0 5 223, +C4<0000000000000000000000000000000100000000000000000>; +P_0x621588e23c60 .param/l "UVM_MACRO_NUMFLAGS" 0 5 192, +C4<00000000000000000000000000010001>; +P_0x621588e23ca0 .param/l "UVM_NOCOMPARE" 0 5 207, +C4<00000000000000000000000000000001000>; +P_0x621588e23ce0 .param/l "UVM_NOCOPY" 0 5 205, +C4<000000000000000000000000000000010>; +P_0x621588e23d20 .param/l "UVM_NODEFPRINT" 0 5 220, +C4<000000000000000000000000000000010000000000000000>; +P_0x621588e23d60 .param/l "UVM_NOPACK" 0 5 213, +C4<00000000000000000000000000000001000000000>; +P_0x621588e23da0 .param/l "UVM_NOPRINT" 0 5 209, +C4<0000000000000000000000000000000100000>; +P_0x621588e23de0 .param/l "UVM_NORECORD" 0 5 211, +C4<000000000000000000000000000000010000000>; +P_0x621588e23e20 .param/l "UVM_PACK" 0 5 212, +C4<0000000000000000000000000000000100000000>; +P_0x621588e23e60 .param/l "UVM_PHYSICAL" 0 5 217, +C4<000000000000000000000000000000010000000000000>; +P_0x621588e23ea0 .param/l "UVM_PRINT" 0 5 208, +C4<000000000000000000000000000000010000>; +P_0x621588e23ee0 .param/l "UVM_RADIX" 0 5 118, C4<00001111000000000000000000000000>; +P_0x621588e23f20 .param/l "UVM_READONLY" 0 5 219, +C4<00000000000000000000000000000001000000000000000>; +P_0x621588e23f60 .param/l "UVM_RECORD" 0 5 210, +C4<00000000000000000000000000000001000000>; +P_0x621588e23fa0 .param/l "UVM_SET" 0 5 233, +C4<0000000000000000000000000000000000100000000000000110>; +P_0x621588e23fe0 .param/l "UVM_SETINT" 0 5 234, +C4<0000000000000000000000000000000000100000000000000110>; +P_0x621588e24020 .param/l "UVM_SETOBJ" 0 5 235, +C4<0000000000000000000000000000000000100000000000000111>; +P_0x621588e24060 .param/l "UVM_SETSTR" 0 5 236, +C4<0000000000000000000000000000000000100000000000001000>; +P_0x621588e240a0 .param/l "UVM_START_FUNCS" 0 5 232, +C4<000000000000000000000000000000000100000000000000101>; +P_0x621588e240e0 .param/l "UVM_STREAMBITS" 0 5 67, +C4<00000000000000000001000000000000>; +P_0x621588e24120 .param/l "UVM_UNPACK" 0 5 225, +C4<00000000000000000000000000000000100000000000000010>; +C0x621588d93b00 .class "ivl_uvm_default_test" [7] + 0: "__m_uvm_status_container", "o" + 1: "m_inst_count", "sb32" + 2: "m_inst_id", "sb32" + 3: "m_leaf_name", "S" + 4: "use_uvm_seeding", "b1" + 5: "uvm_default_printer", "o" + 6: "uvm_global_copy_map", "o" + ; +C0x621588d94300 .class "ivl_uvm_mbx" [11] + 0: "__m_uvm_status_container", "o" + 1: "m_inst_count", "sb32" + 2: "m_inst_id", "sb32" + 3: "m_leaf_name", "S" + 4: "use_uvm_seeding", "b1" + 5: "uvm_default_printer", "o" + 6: "uvm_global_copy_map", "o" + 7: "is_empty", "b1" + 8: "is_full", "b1" + 9: "m_mbx_val", "sb32" + 10: "m_size", "sb32" + ; +C0x621588d95bd0 .class "ivl_uvm_tlm_base" [7] + 0: "__m_uvm_status_container", "o" + 1: "m_inst_count", "sb32" + 2: "m_inst_id", "sb32" + 3: "m_leaf_name", "S" + 4: "use_uvm_seeding", "b1" + 5: "uvm_default_printer", "o" + 6: "uvm_global_copy_map", "o" + ; +C0x621588d966e0 .class "ivl_uvm_tlm_pull_export" [7] + 0: "__m_uvm_status_container", "o" + 1: "m_inst_count", "sb32" + 2: "m_inst_id", "sb32" + 3: "m_leaf_name", "S" + 4: "use_uvm_seeding", "b1" + 5: "uvm_default_printer", "o" + 6: "uvm_global_copy_map", "o" + ; +C0x621588d96ee0 .class "ivl_uvm_tlm_pull_port" [11] + 0: "__m_uvm_status_container", "o" + 1: "m_inst_count", "sb32" + 2: "m_inst_id", "sb32" + 3: "m_leaf_name", "S" + 4: "use_uvm_seeding", "b1" + 5: "uvm_default_printer", "o" + 6: "uvm_global_copy_map", "o" + 7: "is_empty", "b1" + 8: "is_full", "b1" + 9: "m_mbx_val", "sb32" + 10: "m_size", "sb32" + ; +C0x621588cd9410 .class "uvm_comparer" [0] + ; +C0x621588d904b0 .class "uvm_component" [7] + 0: "__m_uvm_status_container", "o" + 1: "m_inst_count", "sb32" + 2: "m_inst_id", "sb32" + 3: "m_leaf_name", "S" + 4: "use_uvm_seeding", "b1" + 5: "uvm_default_printer", "o" + 6: "uvm_global_copy_map", "o" + ; +C0x621588cd9630 .class "uvm_copy_map" [0] + ; +C0x621588d85070 .class "uvm_object" [7] + 0: "__m_uvm_status_container", "o" + 1: "m_inst_count", "sb32" + 2: "m_inst_id", "sb32" + 3: "m_leaf_name", "S" + 4: "use_uvm_seeding", "b1" + 5: "uvm_default_printer", "o" + 6: "uvm_global_copy_map", "o" + ; +C0x621588cc9530 .class "uvm_object_wrapper" [0] + ; +C0x621588cd8750 .class "uvm_objection" [0] + ; +C0x621588cd9520 .class "uvm_packer" [0] + ; +C0x621588d8f9a0 .class "uvm_phase" [7] + 0: "__m_uvm_status_container", "o" + 1: "m_inst_count", "sb32" + 2: "m_inst_id", "sb32" + 3: "m_leaf_name", "S" + 4: "use_uvm_seeding", "b1" + 5: "uvm_default_printer", "o" + 6: "uvm_global_copy_map", "o" + ; +C0x621588cd8b90 .class "uvm_printer" [0] + ; +C0x621588cd8fd0 .class "uvm_recorder" [0] + ; +C0x621588d8eed0 .class "uvm_report_object" [7] + 0: "__m_uvm_status_container", "o" + 1: "m_inst_count", "sb32" + 2: "m_inst_id", "sb32" + 3: "m_leaf_name", "S" + 4: "use_uvm_seeding", "b1" + 5: "uvm_default_printer", "o" + 6: "uvm_global_copy_map", "o" + ; +C0x621588d8e400 .class "uvm_sequence_item" [8] + 0: "__m_uvm_status_container", "o" + 1: "m_inst_count", "sb32" + 2: "m_inst_id", "sb32" + 3: "m_leaf_name", "S" + 4: "use_uvm_seeding", "b1" + 5: "uvm_default_printer", "o" + 6: "uvm_global_copy_map", "o" + 7: "sequence_id", "sb32" + ; +C0x621588d84700 .class "uvm_status_container" [0] + ; +C0x621588d92ff0 .class "uvm_test" [7] + 0: "__m_uvm_status_container", "o" + 1: "m_inst_count", "sb32" + 2: "m_inst_id", "sb32" + 3: "m_leaf_name", "S" + 4: "use_uvm_seeding", "b1" + 5: "uvm_default_printer", "o" + 6: "uvm_global_copy_map", "o" + ; +C0x621588d84b40 .class "uvm_void" [0] + ; +enum0x621588cc8a70 .enum2/s (32) + "UVM_BIN" 16777216, + "UVM_DEC" 33554432, + "UVM_UNSIGNED" 50331648, + "UVM_UNFORMAT2" 67108864, + "UVM_UNFORMAT4" 83886080, + "UVM_OCT" 100663296, + "UVM_HEX" 117440512, + "UVM_STRING" 134217728, + "UVM_TIME" 150994944, + "UVM_ENUM" 167772160, + "UVM_REAL" 184549376, + "UVM_REAL_DEC" 201326592, + "UVM_REAL_EXP" 218103808, + "UVM_NORADIX" 0 + ; +enum0x621588cc9490 .enum2/s (32) + "UVM_DEFAULT_POLICY" 0, + "UVM_DEEP" 1024, + "UVM_SHALLOW" 2048, + "UVM_REFERENCE" 4096 + ; +enum0x621588ccbd50 .enum2 (1) + "UVM_PASSIVE" 0, + "UVM_ACTIVE" 1 + ; +enum0x621588cccae0 .enum2 (2) + "UVM_INFO" 0, + "UVM_WARNING" 1, + "UVM_ERROR" 2, + "UVM_FATAL" 3 + ; +enum0x621588cccfb0 .enum2/s (32) + "UVM_NO_ACTION" 0, + "UVM_DISPLAY" 1, + "UVM_LOG" 2, + "UVM_COUNT" 4, + "UVM_EXIT" 8, + "UVM_CALL_HOOK" 16, + "UVM_STOP" 32 + ; +enum0x621588ccd610 .enum2/s (32) + "UVM_NONE" 0, + "UVM_LOW" 100, + "UVM_MEDIUM" 200, + "UVM_HIGH" 300, + "UVM_FULL" 400, + "UVM_DEBUG" 500 + ; +enum0x621588cceb30 .enum2/s (32) + "UVM_PORT" 0, + "UVM_EXPORT" 1, + "UVM_IMPLEMENTATION" 2 + ; +enum0x621588ccfd50 .enum2/s (32) + "SEQ_ARB_FIFO" 0, + "SEQ_ARB_WEIGHTED" 1, + "SEQ_ARB_RANDOM" 2, + "SEQ_ARB_STRICT_FIFO" 3, + "SEQ_ARB_STRICT_RANDOM" 4, + "SEQ_ARB_USER" 5 + ; +enum0x621588cd0500 .enum2/s (32) + "CREATED" 1, + "PRE_START" 2, + "PRE_BODY" 4, + "BODY" 8, + "POST_BODY" 16, + "POST_START" 32, + "ENDED" 64, + "STOPPED" 128, + "FINISHED" 256 + ; +enum0x621588cd12a0 .enum2/s (32) + "UVM_SEQ_LIB_RAND" 0, + "UVM_SEQ_LIB_RANDC" 1, + "UVM_SEQ_LIB_ITEM" 2, + "UVM_SEQ_LIB_USER" 3 + ; +enum0x621588cd2d20 .enum2/s (32) + "UVM_PHASE_IMP" 0, + "UVM_PHASE_NODE" 1, + "UVM_PHASE_TERMINAL" 2, + "UVM_PHASE_SCHEDULE" 3, + "UVM_PHASE_DOMAIN" 4, + "UVM_PHASE_GLOBAL" 5 + ; +enum0x621588cd36c0 .enum2/s (32) + "UVM_PHASE_DORMANT" 1, + "UVM_PHASE_SCHEDULED" 2, + "UVM_PHASE_SYNCING" 4, + "UVM_PHASE_STARTED" 8, + "UVM_PHASE_EXECUTING" 16, + "UVM_PHASE_READY_TO_END" 32, + "UVM_PHASE_ENDED" 64, + "UVM_PHASE_CLEANUP" 128, + "UVM_PHASE_DONE" 256, + "UVM_PHASE_JUMPING" 512 + ; +enum0x621588cd4480 .enum2/s (32) + "UVM_COMPLETED" 1, + "UVM_FORCED_STOP" 2, + "UVM_SKIPPED" 4, + "UVM_RERUN" 8 + ; +enum0x621588cd61c0 .enum2/s (32) + "UVM_LT" 0, + "UVM_LTE" 1, + "UVM_NE" 2, + "UVM_EQ" 3, + "UVM_GT" 4, + "UVM_GTE" 5 + ; +enum0x621588cd6ea0 .enum2/s (32) + "UVM_RAISED" 1, + "UVM_DROPPED" 2, + "UVM_ALL_DROPPED" 4 + ; +v0x621588e72b30_0 .var "ivl_uvm_glb_timeout", 63 0; +v0x621588e72c30_0 .var/2s "ivl_uvm_glb_verb", 31 0; +v0x621588e72d10_0 .var/2u "ivl_uvm_max_quit_count", 31 0; +v0x621588e72e00_0 .var/str "log_id"; +v0x621588e72ec0_0 .var/2u "report_summarize_done", 0 0; +v0x621588e72fd0_0 .var/str "uvm_aa_string_key"; +v0x621588e73090_0 .var/2s "uvm_err_counter", 31 0; +v0x621588e73170_0 .var/2s "uvm_fatal_counter", 31 0; +v0x621588e73250_0 .var/2s "uvm_info_counter", 31 0; +v0x621588e733c0_0 .var/2u "uvm_start_uvm_declarations", 0 0; +v0x621588e73480_0 .var/cobj "uvm_test_top"; +v0x621588e73540_0 .var/2s "uvm_warn_counter", 31 0; +S_0x621588e58f70 .scope function.str, "get_name" "get_name" 6 125, 6 125 0, S_0x621588d73510; + .timescale -9 -9; +; Variable get_name is string return value of scope S_0x621588e58f70 +TD_ivl_uvm_pkg.get_name ; + %pushi/str "IVL_GO2UVM"; + %ret/str 0; Assign to get_name + %disable/flow S_0x621588e58f70; + %end; +S_0x621588e591a0 .scope function.vec2.u32, "get_report_verbosity_level" "get_report_verbosity_level" 6 119, 6 119 0, S_0x621588d73510; + .timescale -9 -9; +; Variable get_report_verbosity_level is bool return value of scope S_0x621588e591a0 +v0x621588e59480_0 .var/str "id"; +v0x621588e59540_0 .var/2u "severity", 1 0; +TD_ivl_uvm_pkg.get_report_verbosity_level ; + %callf/void TD_ivl_uvm_pkg.m_check_verbosity, S_0x621588e5eff0; + %load/vec4 v0x621588e72c30_0; + %ret/vec4 0, 0, 32; Assign to get_report_verbosity_level (store_vec4_to_lval) + %disable/flow S_0x621588e591a0; + %end; +S_0x621588e59600 .scope function.str, "get_uvm_severity_type_str" "get_uvm_severity_type_str" 7 193, 7 193 0, S_0x621588d73510; + .timescale -9 -9; +; Variable get_uvm_severity_type_str is string return value of scope S_0x621588e59600 +v0x621588e598c0_0 .var/str "res"; +v0x621588e59980_0 .var/2u "severity", 1 0; +TD_ivl_uvm_pkg.get_uvm_severity_type_str ; + %load/vec4 v0x621588e59980_0; + %dup/vec4; + %pushi/vec4 0, 0, 2; + %cmp/u; + %jmp/1 T_2.0, 6; + %dup/vec4; + %pushi/vec4 1, 0, 2; + %cmp/u; + %jmp/1 T_2.1, 6; + %dup/vec4; + %pushi/vec4 2, 0, 2; + %cmp/u; + %jmp/1 T_2.2, 6; + %dup/vec4; + %pushi/vec4 3, 0, 2; + %cmp/u; + %jmp/1 T_2.3, 6; + %jmp T_2.4; +T_2.0 ; + %pushi/str "UVM_INFO"; + %store/str v0x621588e598c0_0; + %jmp T_2.4; +T_2.1 ; + %pushi/str "UVM_WARNING"; + %store/str v0x621588e598c0_0; + %jmp T_2.4; +T_2.2 ; + %pushi/str "UVM_ERROR"; + %store/str v0x621588e598c0_0; + %jmp T_2.4; +T_2.3 ; + %pushi/str "UVM_FATAL"; + %store/str v0x621588e598c0_0; + %jmp T_2.4; +T_2.4 ; + %pop/vec4 1; + %load/str v0x621588e598c0_0; + %ret/str 0; Assign to get_uvm_severity_type_str + %disable/flow S_0x621588e59600; + %end; +S_0x621588e59a70 .scope function.str, "ivl_uvm_compose_message" "ivl_uvm_compose_message" 7 206, 7 206 0, S_0x621588d73510; + .timescale -9 -9; +v0x621588e59c50_0 .var/str "filename"; +v0x621588e59d30_0 .var/str "id"; +; Variable ivl_uvm_compose_message is string return value of scope S_0x621588e59a70 +v0x621588e59ec0_0 .var/2s "line", 31 0; +v0x621588e59fa0_0 .var/str "line_str"; +v0x621588e5a0b0_0 .var/str "message"; +v0x621588e5a170_0 .var/str "name"; +v0x621588e5a230_0 .var/2u "severity", 1 0; +v0x621588e5a310_0 .var/str "sv"; +v0x621588e5a3d0_0 .var/str "time_str"; +TD_ivl_uvm_pkg.ivl_uvm_compose_message ; + %load/vec4 v0x621588e5a230_0; + %store/vec4 v0x621588e59980_0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_uvm_severity_type_str, S_0x621588e59600; + %store/str v0x621588e5a310_0; + %vpi_call/w 7 221 "$swrite", v0x621588e5a3d0_0, "%0t", $realtime {0 0 0}; + %pushi/vec4 1, 0, 32; + %dup/vec4; + %load/str v0x621588e5a170_0; + %pushi/str ""; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 8; + %flag_get/vec4 8; + %jmp/0 T_3.10, 8; + %load/str v0x621588e59c50_0; + %pushi/str ""; + %cmp/str; + %flag_get/vec4 4; + %and; +T_3.10; + %pad/u 32; + %cmp/u; + %jmp/1 T_3.5, 6; + %dup/vec4; + %load/str v0x621588e5a170_0; + %pushi/str ""; + %cmp/str; + %flag_inv 4; + %flag_get/vec4 4; + %flag_set/vec4 8; + %flag_get/vec4 8; + %jmp/0 T_3.11, 8; + %load/str v0x621588e59c50_0; + %pushi/str ""; + %cmp/str; + %flag_get/vec4 4; + %and; +T_3.11; + %pad/u 32; + %cmp/u; + %jmp/1 T_3.6, 6; + %dup/vec4; + %load/str v0x621588e5a170_0; + %pushi/str ""; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 8; + %flag_get/vec4 8; + %jmp/0 T_3.12, 8; + %load/str v0x621588e59c50_0; + %pushi/str ""; + %cmp/str; + %flag_inv 4; + %flag_get/vec4 4; + %and; +T_3.12; + %pad/u 32; + %cmp/u; + %jmp/1 T_3.7, 6; + %dup/vec4; + %load/str v0x621588e5a170_0; + %pushi/str ""; + %cmp/str; + %flag_inv 4; + %flag_get/vec4 4; + %flag_set/vec4 8; + %flag_get/vec4 8; + %jmp/0 T_3.13, 8; + %load/str v0x621588e59c50_0; + %pushi/str ""; + %cmp/str; + %flag_inv 4; + %flag_get/vec4 4; + %and; +T_3.13; + %pad/u 32; + %cmp/u; + %jmp/1 T_3.8, 6; + %jmp T_3.9; +T_3.5 ; + %load/str v0x621588e5a310_0; + %concati/str " @ "; + %load/str v0x621588e5a3d0_0; + %concat/str; + %concati/str " ["; + %load/str v0x621588e59d30_0; + %concat/str; + %concati/str "] "; + %load/str v0x621588e5a0b0_0; + %concat/str; + %ret/str 0; Assign to ivl_uvm_compose_message + %disable/flow S_0x621588e59a70; + %jmp T_3.9; +T_3.6 ; + %load/str v0x621588e5a310_0; + %concati/str " @ "; + %load/str v0x621588e5a3d0_0; + %concat/str; + %concati/str ": "; + %load/str v0x621588e5a170_0; + %concat/str; + %concati/str " ["; + %load/str v0x621588e59d30_0; + %concat/str; + %concati/str "] "; + %load/str v0x621588e5a0b0_0; + %concat/str; + %ret/str 0; Assign to ivl_uvm_compose_message + %disable/flow S_0x621588e59a70; + %jmp T_3.9; +T_3.7 ; + %vpi_call/w 7 230 "$swrite", v0x621588e59fa0_0, "%0d", v0x621588e59ec0_0 {0 0 0}; + %load/str v0x621588e5a310_0; + %concati/str " "; + %load/str v0x621588e59c50_0; + %concat/str; + %concati/str "("; + %load/str v0x621588e59fa0_0; + %concat/str; + %concati/str ")"; + %concati/str " @ "; + %load/str v0x621588e5a3d0_0; + %concat/str; + %concati/str " ["; + %load/str v0x621588e59d30_0; + %concat/str; + %concati/str "] "; + %load/str v0x621588e5a0b0_0; + %concat/str; + %ret/str 0; Assign to ivl_uvm_compose_message + %disable/flow S_0x621588e59a70; + %jmp T_3.9; +T_3.8 ; + %vpi_call/w 7 235 "$swrite", v0x621588e59fa0_0, "%0d", v0x621588e59ec0_0 {0 0 0}; + %load/str v0x621588e5a310_0; + %concati/str " "; + %load/str v0x621588e59c50_0; + %concat/str; + %concati/str "("; + %load/str v0x621588e59fa0_0; + %concat/str; + %concati/str ")"; + %concati/str " @ "; + %load/str v0x621588e5a3d0_0; + %concat/str; + %concati/str ": "; + %load/str v0x621588e5a170_0; + %concat/str; + %concati/str " ["; + %load/str v0x621588e59d30_0; + %concat/str; + %concati/str "] "; + %load/str v0x621588e5a0b0_0; + %concat/str; + %ret/str 0; Assign to ivl_uvm_compose_message + %disable/flow S_0x621588e59a70; + %jmp T_3.9; +T_3.9 ; + %pop/vec4 1; + %end; +S_0x621588e5a490 .scope class, "ivl_uvm_default_test" "ivl_uvm_default_test" 8 110, 8 110 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e5a620 .scope autofunction.obj, "new" "new" 8 111, 8 111 0, S_0x621588e5a490; + .timescale -9 -9; +v0x621588e5a7d0_0 .var/cobj "@"; +v0x621588e5a8b0_0 .var/str "name"; +v0x621588e5a970_0 .var/cobj "parent"; +TD_ivl_uvm_pkg.ivl_uvm_default_test.new ; + %alloc S_0x621588e72560; + %load/obj v0x621588e5a7d0_0; + %load/str v0x621588e5a8b0_0; + %load/obj v0x621588e5a970_0; + %store/obj v0x621588e72900_0; + %store/str v0x621588e72840_0; + %store/obj v0x621588e72760_0; + %callf/obj TD_ivl_uvm_pkg.uvm_test.new, S_0x621588e72560; + %load/obj v0x621588e72760_0; + %free S_0x621588e72560; + %store/obj v0x621588e5a7d0_0; + %end; +S_0x621588e5aa10 .scope class, "ivl_uvm_mbx" "ivl_uvm_mbx" 9 13, 9 13 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e5aba0 .scope autotask, "get" "get" 9 36, 9 36 0, S_0x621588e5aa10; + .timescale -9 -9; +v0x621588e5ada0_0 .var/cobj "@"; +v0x621588e5ae80_0 .var/2s "out_xn", 31 0; +TD_ivl_uvm_pkg.ivl_uvm_mbx.get ; +T_5.14 ; + %load/obj v0x621588e5ada0_0; + %prop/v 7; + %pop/obj 1, 0; + %pad/u 32; + %cmpi/e 1, 0, 32; + %jmp/0xz T_5.15, 4; + %delay 100, 0; + %jmp T_5.14; +T_5.15 ; + %load/obj v0x621588e5ada0_0; + %prop/v 9; + %pop/obj 1, 0; + %store/vec4 v0x621588e5ae80_0, 0, 32; + %pushi/vec4 0, 0, 1; + %load/obj v0x621588e5ada0_0; + %store/prop/v 8, 1; Store in bool property is_full + %pop/obj 1, 0; + %pushi/vec4 1, 0, 1; + %load/obj v0x621588e5ada0_0; + %store/prop/v 7, 1; Store in bool property is_empty + %pop/obj 1, 0; + %end; +S_0x621588e5af60 .scope autofunction.obj, "new" "new" 9 19, 9 19 0, S_0x621588e5aa10; + .timescale -9 -9; +v0x621588e5b160_0 .var/cobj "@"; +v0x621588e5b220_0 .var/str "name"; +TD_ivl_uvm_pkg.ivl_uvm_mbx.new ; + %alloc S_0x621588e68830; + %load/obj v0x621588e5b160_0; + %load/str v0x621588e5b220_0; + %store/str v0x621588e68af0_0; + %store/obj v0x621588e68a10_0; + %callf/obj TD_ivl_uvm_pkg.uvm_object.new, S_0x621588e68830; + %load/obj v0x621588e68a10_0; + %free S_0x621588e68830; + %store/obj v0x621588e5b160_0; + %pushi/vec4 0, 0, 1; + %load/obj v0x621588e5b160_0; + %store/prop/v 8, 1; Store in bool property is_full + %pop/obj 1, 0; + %pushi/vec4 1, 0, 1; + %load/obj v0x621588e5b160_0; + %store/prop/v 7, 1; Store in bool property is_empty + %pop/obj 1, 0; + %end; +S_0x621588e5b2e0 .scope autofunction.vec2.u32, "num" "num" 9 56, 9 56 0, S_0x621588e5aa10; + .timescale -9 -9; +v0x621588e5b4f0_0 .var/cobj "@"; +; Variable num is bool return value of scope S_0x621588e5b2e0 +TD_ivl_uvm_pkg.ivl_uvm_mbx.num ; + %load/obj v0x621588e5b4f0_0; + %prop/v 8; + %pop/obj 1, 0; + %pad/u 32; + %ret/vec4 0, 0, 32; Assign to num (store_vec4_to_lval) + %disable/flow S_0x621588e5b2e0; + %end; +S_0x621588e5b690 .scope autotask, "peek" "peek" 9 47, 9 47 0, S_0x621588e5aa10; + .timescale -9 -9; +v0x621588e5b870_0 .var/cobj "@"; +v0x621588e5b950_0 .var/2s "out_xn", 31 0; +TD_ivl_uvm_pkg.ivl_uvm_mbx.peek ; +T_8.16 ; + %load/obj v0x621588e5b870_0; + %prop/v 7; + %pop/obj 1, 0; + %pad/u 32; + %cmpi/e 1, 0, 32; + %jmp/0xz T_8.17, 4; + %delay 100, 0; + %jmp T_8.16; +T_8.17 ; + %load/obj v0x621588e5b870_0; + %prop/v 9; + %pop/obj 1, 0; + %store/vec4 v0x621588e5b950_0, 0, 32; + %end; +S_0x621588e5ba30 .scope autotask, "put" "put" 9 25, 9 25 0, S_0x621588e5aa10; + .timescale -9 -9; +v0x621588e5bc60_0 .var/cobj "@"; +v0x621588e5bd40_0 .var/2s "in_xn", 31 0; +TD_ivl_uvm_pkg.ivl_uvm_mbx.put ; +T_9.18 ; + %load/obj v0x621588e5bc60_0; + %prop/v 8; + %pop/obj 1, 0; + %pad/u 32; + %cmpi/e 1, 0, 32; + %jmp/0xz T_9.19, 4; + %delay 100, 0; + %jmp T_9.18; +T_9.19 ; + %load/vec4 v0x621588e5bd40_0; + %load/obj v0x621588e5bc60_0; + %store/prop/v 9, 32; Store in bool property m_mbx_val + %pop/obj 1, 0; + %pushi/vec4 1, 0, 1; + %load/obj v0x621588e5bc60_0; + %store/prop/v 8, 1; Store in bool property is_full + %pop/obj 1, 0; + %pushi/vec4 0, 0, 1; + %load/obj v0x621588e5bc60_0; + %store/prop/v 7, 1; Store in bool property is_empty + %pop/obj 1, 0; + %end; +S_0x621588e5be20 .scope class, "ivl_uvm_tlm_base" "ivl_uvm_tlm_base" 10 1, 10 1 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e5bfb0 .scope autofunction.obj, "new" "new" 10 2, 10 2 0, S_0x621588e5be20; + .timescale -9 -9; +v0x621588e5c1b0_0 .var/cobj "@"; +v0x621588e5c290_0 .var/str "name"; +v0x621588e5c350_0 .var/cobj "parent"; +TD_ivl_uvm_pkg.ivl_uvm_tlm_base.new ; + %alloc S_0x621588e61de0; + %load/obj v0x621588e5c1b0_0; + %load/str v0x621588e5c290_0; + %load/obj v0x621588e5c350_0; + %store/obj v0x621588e62160_0; + %store/str v0x621588e620a0_0; + %store/obj v0x621588e61fc0_0; + %callf/obj TD_ivl_uvm_pkg.uvm_component.new, S_0x621588e61de0; + %load/obj v0x621588e61fc0_0; + %free S_0x621588e61de0; + %store/obj v0x621588e5c1b0_0; + %end; +S_0x621588e5c3f0 .scope class, "ivl_uvm_tlm_pull_export" "ivl_uvm_tlm_pull_export" 10 8, 10 8 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e5c580 .scope autofunction.obj, "new" "new" 10 9, 10 9 0, S_0x621588e5c3f0; + .timescale -9 -9; +v0x621588e5c780_0 .var/cobj "@"; +v0x621588e5c860_0 .var/str "name"; +v0x621588e5c920_0 .var/cobj "parent"; +TD_ivl_uvm_pkg.ivl_uvm_tlm_pull_export.new ; + %alloc S_0x621588e5bfb0; + %load/obj v0x621588e5c780_0; + %load/str v0x621588e5c860_0; + %load/obj v0x621588e5c920_0; + %store/obj v0x621588e5c350_0; + %store/str v0x621588e5c290_0; + %store/obj v0x621588e5c1b0_0; + %callf/obj TD_ivl_uvm_pkg.ivl_uvm_tlm_base.new, S_0x621588e5bfb0; + %load/obj v0x621588e5c1b0_0; + %free S_0x621588e5bfb0; + %store/obj v0x621588e5c780_0; + %end; +S_0x621588e5c9f0 .scope class, "ivl_uvm_tlm_pull_port" "ivl_uvm_tlm_pull_port" 10 16, 10 16 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e5cb80 .scope autofunction.void, "connect" "connect" 10 74, 10 74 0, S_0x621588e5c9f0; + .timescale -9 -9; +v0x621588e5cd80_0 .var/cobj "@"; +v0x621588e5ce60_0 .var/cobj "unused_tlm_exp"; +TD_ivl_uvm_pkg.ivl_uvm_tlm_pull_port.connect ; + %end; +S_0x621588e5cf20 .scope autotask, "get" "get" 10 39, 10 39 0, S_0x621588e5c9f0; + .timescale -9 -9; +v0x621588e5d120_0 .var/cobj "@"; +v0x621588e5d1e0_0 .var/2s "out_xn", 31 0; +TD_ivl_uvm_pkg.ivl_uvm_tlm_pull_port.get ; +T_13.20 ; + %load/obj v0x621588e5d120_0; + %prop/v 7; + %pop/obj 1, 0; + %pad/u 32; + %cmpi/e 1, 0, 32; + %jmp/0xz T_13.21, 4; + %delay 100, 0; + %jmp T_13.20; +T_13.21 ; + %load/obj v0x621588e5d120_0; + %prop/v 9; + %pop/obj 1, 0; + %store/vec4 v0x621588e5d1e0_0, 0, 32; + %pushi/vec4 0, 0, 1; + %load/obj v0x621588e5d120_0; + %store/prop/v 8, 1; Store in bool property is_full + %pop/obj 1, 0; + %pushi/vec4 1, 0, 1; + %load/obj v0x621588e5d120_0; + %store/prop/v 7, 1; Store in bool property is_empty + %pop/obj 1, 0; + %pushi/vec4 200, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_13.22, 4; + %alloc S_0x621588e6d420; + %load/obj v0x621588e5d120_0; + %store/obj v0x621588e6d600_0; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6d7a0_0; + %vpi_func/s 10 50 "$sformatf", "%m Get: " {0 0 0}; + %store/str v0x621588e6d920_0; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e6daf0_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_tlm.svh"; + %store/str v0x621588e6d6e0_0; + %pushi/vec4 47, 0, 32; + %store/vec4 v0x621588e6d840_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_report_info, S_0x621588e6d420; + %free S_0x621588e6d420; +T_13.22 ; + %end; +S_0x621588e5d2c0 .scope autotask, "get_next_item" "get_next_item" 10 77, 10 77 0, S_0x621588e5c9f0; + .timescale -9 -9; +v0x621588e5d4d0_0 .var/cobj "@"; +v0x621588e5d590_0 .var/2s "x0", 31 0; +TD_ivl_uvm_pkg.ivl_uvm_tlm_pull_port.get_next_item ; + %pushi/vec4 200, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_14.24, 4; + %alloc S_0x621588e6d420; + %load/obj v0x621588e5d4d0_0; + %store/obj v0x621588e6d600_0; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6d7a0_0; + %vpi_func/s 10 81 "$sformatf", "%m get_next_item: " {0 0 0}; + %store/str v0x621588e6d920_0; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e6daf0_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_tlm.svh"; + %store/str v0x621588e6d6e0_0; + %pushi/vec4 78, 0, 32; + %store/vec4 v0x621588e6d840_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_report_info, S_0x621588e6d420; + %free S_0x621588e6d420; +T_14.24 ; + %alloc S_0x621588e5e2f0; + %load/obj v0x621588e5d4d0_0; + %store/obj v0x621588e5e4d0_0; + %fork TD_ivl_uvm_pkg.ivl_uvm_tlm_pull_port.peek, S_0x621588e5e2f0; + %join; + %load/vec4 v0x621588e5e5b0_0; + %store/vec4 v0x621588e5d590_0, 0, 32; + %free S_0x621588e5e2f0; + %end; +S_0x621588e5d670 .scope autofunction.void, "item_done" "item_done" 10 82, 10 82 0, S_0x621588e5c9f0; + .timescale -9 -9; +v0x621588e5d850_0 .var/cobj "@"; +v0x621588e5d930_0 .var/2u "rval", 0 0; +v0x621588e5d9f0_0 .var/2s "x0", 31 0; +TD_ivl_uvm_pkg.ivl_uvm_tlm_pull_port.item_done ; + %alloc S_0x621588e5ea30; + %load/obj v0x621588e5d850_0; + %load/vec4 v0x621588e5d9f0_0; + %store/vec4 v0x621588e5ed80_0, 0, 32; + %store/obj v0x621588e5eca0_0; + %callf/vec4 TD_ivl_uvm_pkg.ivl_uvm_tlm_pull_port.try_get, S_0x621588e5ea30; + %free S_0x621588e5ea30; + %store/vec4 v0x621588e5d930_0, 0, 1; + %end; +S_0x621588e5dae0 .scope autofunction.obj, "new" "new" 10 22, 10 22 0, S_0x621588e5c9f0; + .timescale -9 -9; +v0x621588e5dd10_0 .var/cobj "@"; +v0x621588e5ddf0_0 .var/str "name"; +v0x621588e5deb0_0 .var/cobj "parent"; +TD_ivl_uvm_pkg.ivl_uvm_tlm_pull_port.new ; + %alloc S_0x621588e5bfb0; + %load/obj v0x621588e5dd10_0; + %load/str v0x621588e5ddf0_0; + %load/obj v0x621588e5deb0_0; + %store/obj v0x621588e5c350_0; + %store/str v0x621588e5c290_0; + %store/obj v0x621588e5c1b0_0; + %callf/obj TD_ivl_uvm_pkg.ivl_uvm_tlm_base.new, S_0x621588e5bfb0; + %load/obj v0x621588e5c1b0_0; + %free S_0x621588e5bfb0; + %store/obj v0x621588e5dd10_0; + %pushi/vec4 0, 0, 1; + %load/obj v0x621588e5dd10_0; + %store/prop/v 8, 1; Store in bool property is_full + %pop/obj 1, 0; + %pushi/vec4 1, 0, 1; + %load/obj v0x621588e5dd10_0; + %store/prop/v 7, 1; Store in bool property is_empty + %pop/obj 1, 0; + %end; +S_0x621588e5df50 .scope autofunction.vec2.u32, "num" "num" 10 70, 10 70 0, S_0x621588e5c9f0; + .timescale -9 -9; +v0x621588e5e130_0 .var/cobj "@"; +; Variable num is bool return value of scope S_0x621588e5df50 +TD_ivl_uvm_pkg.ivl_uvm_tlm_pull_port.num ; + %load/obj v0x621588e5e130_0; + %prop/v 8; + %pop/obj 1, 0; + %pad/u 32; + %ret/vec4 0, 0, 32; Assign to num (store_vec4_to_lval) + %disable/flow S_0x621588e5df50; + %end; +S_0x621588e5e2f0 .scope autotask, "peek" "peek" 10 61, 10 61 0, S_0x621588e5c9f0; + .timescale -9 -9; +v0x621588e5e4d0_0 .var/cobj "@"; +v0x621588e5e5b0_0 .var/2s "out_xn", 31 0; +TD_ivl_uvm_pkg.ivl_uvm_tlm_pull_port.peek ; +T_18.26 ; + %load/obj v0x621588e5e4d0_0; + %prop/v 7; + %pop/obj 1, 0; + %pad/u 32; + %cmpi/e 1, 0, 32; + %jmp/0xz T_18.27, 4; + %delay 100, 0; + %jmp T_18.26; +T_18.27 ; + %load/obj v0x621588e5e4d0_0; + %prop/v 9; + %pop/obj 1, 0; + %store/vec4 v0x621588e5e5b0_0, 0, 32; + %pushi/vec4 200, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_18.28, 4; + %alloc S_0x621588e6d420; + %load/obj v0x621588e5e4d0_0; + %store/obj v0x621588e6d600_0; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6d7a0_0; + %vpi_func/s 10 70 "$sformatf", "%m Peek: " {0 0 0}; + %store/str v0x621588e6d920_0; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e6daf0_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_tlm.svh"; + %store/str v0x621588e6d6e0_0; + %pushi/vec4 67, 0, 32; + %store/vec4 v0x621588e6d840_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_report_info, S_0x621588e6d420; + %free S_0x621588e6d420; +T_18.28 ; + %end; +S_0x621588e5e690 .scope autotask, "put" "put" 10 28, 10 28 0, S_0x621588e5c9f0; + .timescale -9 -9; +v0x621588e5e870_0 .var/cobj "@"; +v0x621588e5e950_0 .var/2s "in_xn", 31 0; +TD_ivl_uvm_pkg.ivl_uvm_tlm_pull_port.put ; +T_19.30 ; + %load/obj v0x621588e5e870_0; + %prop/v 8; + %pop/obj 1, 0; + %pad/u 32; + %cmpi/e 1, 0, 32; + %jmp/0xz T_19.31, 4; + %delay 100, 0; + %jmp T_19.30; +T_19.31 ; + %load/vec4 v0x621588e5e950_0; + %load/obj v0x621588e5e870_0; + %store/prop/v 9, 32; Store in bool property m_mbx_val + %pop/obj 1, 0; + %pushi/vec4 200, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_19.32, 4; + %alloc S_0x621588e6d420; + %load/obj v0x621588e5e870_0; + %store/obj v0x621588e6d600_0; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6d7a0_0; + %vpi_func/s 10 37 "$sformatf", "%m Put: " {0 0 0}; + %store/str v0x621588e6d920_0; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e6daf0_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_tlm.svh"; + %store/str v0x621588e6d6e0_0; + %pushi/vec4 34, 0, 32; + %store/vec4 v0x621588e6d840_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_report_info, S_0x621588e6d420; + %free S_0x621588e6d420; +T_19.32 ; + %pushi/vec4 1, 0, 1; + %load/obj v0x621588e5e870_0; + %store/prop/v 8, 1; Store in bool property is_full + %pop/obj 1, 0; + %pushi/vec4 0, 0, 1; + %load/obj v0x621588e5e870_0; + %store/prop/v 7, 1; Store in bool property is_empty + %pop/obj 1, 0; + %end; +S_0x621588e5ea30 .scope autofunction.vec2.s1, "try_get" "try_get" 10 50, 10 50 0, S_0x621588e5c9f0; + .timescale -9 -9; +v0x621588e5eca0_0 .var/cobj "@"; +v0x621588e5ed80_0 .var/2s "out_xn", 31 0; +v0x621588e5ee60_0 .var/2u "rval", 0 0; +; Variable try_get is bool return value of scope S_0x621588e5ea30 +TD_ivl_uvm_pkg.ivl_uvm_tlm_pull_port.try_get ; + %load/obj v0x621588e5eca0_0; + %prop/v 7; + %pop/obj 1, 0; + %pad/u 32; + %cmpi/e 0, 0, 32; + %jmp/0xz T_20.34, 4; + %pushi/vec4 0, 0, 1; + %load/obj v0x621588e5eca0_0; + %store/prop/v 8, 1; Store in bool property is_full + %pop/obj 1, 0; + %pushi/vec4 1, 0, 1; + %load/obj v0x621588e5eca0_0; + %store/prop/v 7, 1; Store in bool property is_empty + %pop/obj 1, 0; + %load/obj v0x621588e5eca0_0; + %prop/v 9; + %pop/obj 1, 0; + %store/vec4 v0x621588e5ed80_0, 0, 32; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x621588e5ee60_0, 0, 1; +T_20.34 ; + %end; +S_0x621588e5eff0 .scope function.void, "m_check_verbosity" "m_check_verbosity" 6 49, 6 49 0, S_0x621588d73510; + .timescale -9 -9; +v0x621588e5f180_0 .var/2s "plusarg", 31 0; +v0x621588e5f280_0 .var/2s "verb_count", 31 0; +v0x621588e5f360_0 .var/str "verb_string"; +v0x621588e5f430_0 .var/2s "verbosity", 31 0; +TD_ivl_uvm_pkg.m_check_verbosity ; + %pushi/vec4 10, 0, 32; + %store/vec4 v0x621588e5f430_0, 0, 32; + %vpi_func 6 57 "$value$plusargs" 32, "UVM_VERBOSITY=%s", v0x621588e5f360_0 {0 0 0}; + %cast2; + %store/vec4 v0x621588e5f280_0, 0, 32; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e5f430_0, 0, 32; + %load/vec4 v0x621588e5f280_0; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_21.36, 4; + %load/str v0x621588e5f360_0; + %pushi/str "UVM_NONE"; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 8; + %jmp/1 T_21.40, 8; + %load/str v0x621588e5f360_0; + %pushi/str "NONE"; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 9; + %flag_or 8, 9; +T_21.40; + %jmp/0xz T_21.38, 8; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e5f430_0, 0, 32; +T_21.38 ; + %load/str v0x621588e5f360_0; + %pushi/str "UVM_LOW"; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 8; + %jmp/1 T_21.43, 8; + %load/str v0x621588e5f360_0; + %pushi/str "LOW"; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 9; + %flag_or 8, 9; +T_21.43; + %jmp/0xz T_21.41, 8; + %pushi/vec4 100, 0, 32; + %store/vec4 v0x621588e5f430_0, 0, 32; +T_21.41 ; + %load/str v0x621588e5f360_0; + %pushi/str "UVM_MEDIUM"; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 8; + %jmp/1 T_21.46, 8; + %load/str v0x621588e5f360_0; + %pushi/str "MEDIUM"; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 9; + %flag_or 8, 9; +T_21.46; + %jmp/0xz T_21.44, 8; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e5f430_0, 0, 32; +T_21.44 ; + %load/str v0x621588e5f360_0; + %pushi/str "UVM_HIGH"; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 8; + %jmp/1 T_21.49, 8; + %load/str v0x621588e5f360_0; + %pushi/str "HIGH"; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 9; + %flag_or 8, 9; +T_21.49; + %jmp/0xz T_21.47, 8; + %pushi/vec4 300, 0, 32; + %store/vec4 v0x621588e5f430_0, 0, 32; +T_21.47 ; + %load/str v0x621588e5f360_0; + %pushi/str "UVM_FULL"; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 8; + %jmp/1 T_21.52, 8; + %load/str v0x621588e5f360_0; + %pushi/str "FULL"; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 9; + %flag_or 8, 9; +T_21.52; + %jmp/0xz T_21.50, 8; + %pushi/vec4 400, 0, 32; + %store/vec4 v0x621588e5f430_0, 0, 32; +T_21.50 ; + %load/str v0x621588e5f360_0; + %pushi/str "UVM_DEBUG"; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 8; + %jmp/1 T_21.55, 8; + %load/str v0x621588e5f360_0; + %pushi/str "DEBUG"; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 9; + %flag_or 8, 9; +T_21.55; + %jmp/0xz T_21.53, 8; + %pushi/vec4 500, 0, 32; + %store/vec4 v0x621588e5f430_0, 0, 32; +T_21.53 ; +T_21.36 ; + %load/vec4 v0x621588e5f430_0; + %store/vec4 v0x621588e72c30_0, 0, 32; + %end; +S_0x621588e5f510 .scope function.void, "report_summarize" "report_summarize" 7 52, 7 52 0, S_0x621588d73510; + .timescale -9 -9; +v0x621588e5fcf0_0 .var/2s "num_errs", 31 0; +TD_ivl_uvm_pkg.report_summarize ; + %load/vec4 v0x621588e72ec0_0; + %nor/r; + %flag_set/vec4 8; + %jmp/0xz T_22.56, 8; + %fork t_1, S_0x621588e5f6f0; + %jmp t_0; + .scope S_0x621588e5f6f0; +t_1 ; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x621588e72ec0_0, 0, 1; + %vpi_call/w 7 57 "$display", "\000" {0 0 0}; + %vpi_call/w 7 58 "$display", "--- UVM Report Summary ---" {0 0 0}; + %vpi_call/w 7 59 "$display", "\000" {0 0 0}; + %vpi_call/w 7 60 "$display", "** Report counts by severity" {0 0 0}; + %vpi_call/w 7 61 "$display", "UVM_INFO : %0d", v0x621588e73250_0 {0 0 0}; + %vpi_call/w 7 62 "$display", "UVM_WARNING : %0d", v0x621588e73540_0 {0 0 0}; + %vpi_call/w 7 63 "$display", "UVM_ERROR : %0d", v0x621588e73090_0 {0 0 0}; + %vpi_call/w 7 64 "$display", "UVM_FATAL : %0d", v0x621588e73170_0 {0 0 0}; + %load/vec4 v0x621588e73090_0; + %store/vec4 v0x621588e5fcf0_0, 0, 32; + %load/vec4 v0x621588e5fcf0_0; + %cmpi/s 0, 0, 32; + %flag_or 5, 4; GT is !LE + %flag_inv 5; + %jmp/0xz T_22.58, 5; + %fork t_3, S_0x621588e5f8f0; + %jmp t_2; + .scope S_0x621588e5f8f0; +t_3 ; + %vpi_call/w 7 69 "$display", "%c[1;31m", 32'sb00000000000000000000000000011011 {0 0 0}; + %vpi_call/w 7 70 "$display", "Test FAILED with %0d error(s), look for UVM_ERROR in log file", v0x621588e5fcf0_0 {0 0 0}; + %vpi_call/w 7 72 "$display", "%c[0m", 32'sb00000000000000000000000000011011 {0 0 0}; + %end; + .scope S_0x621588e5f6f0; +t_2 %join; + %jmp T_22.59; +T_22.58 ; + %fork t_5, S_0x621588e5faf0; + %jmp t_4; + .scope S_0x621588e5faf0; +t_5 ; + %vpi_call/w 7 75 "$display", "%c[5;34m", 32'sb00000000000000000000000000011011 {0 0 0}; + %vpi_call/w 7 76 "$display", "*** Congratulations! Test PASSED with NO UVM_ERRORs ***" {0 0 0}; + %vpi_call/w 7 77 "$display", "%c[0m", 32'sb00000000000000000000000000011011 {0 0 0}; + %end; + .scope S_0x621588e5f6f0; +t_4 %join; +T_22.59 ; + %pushi/vec4 0, 0, 32; + %pushi/vec4 0, 0, 2; + %load/str v0x621588e72e00_0; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_22.60, 4; + %load/str v0x621588e72e00_0; + %store/str v0x621588e70cc0_0; + %pushi/str "Thanks for using IVL_UVM Package"; + %store/str v0x621588e70e40_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e71010_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_msg.svh"; + %store/str v0x621588e70be0_0; + %pushi/vec4 82, 0, 32; + %store/vec4 v0x621588e70d80_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_info, S_0x621588e70a00; +T_22.60 ; + %end; + .scope S_0x621588e5f510; +t_0 %join; +T_22.56 ; + %end; +S_0x621588e5f6f0 .scope begin, "do_it_only_once" "do_it_only_once" 7 55, 7 55 0, S_0x621588e5f510; + .timescale -9 -9; +S_0x621588e5f8f0 .scope begin, "fail" "fail" 7 68, 7 68 0, S_0x621588e5f6f0; + .timescale -9 -9; +S_0x621588e5faf0 .scope begin, "pass" "pass" 7 74, 7 74 0, S_0x621588e5f6f0; + .timescale -9 -9; +S_0x621588e5fdd0 .scope task, "run_test" "run_test" 4 47, 4 47 0, S_0x621588d73510; + .timescale -9 -9; +TD_ivl_uvm_pkg.run_test ; + %pushi/vec4 200, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_23.62, 4; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e70cc0_0; + %vpi_func/s 4 51 "$sformatf", "Using UVM_TESTNAME: %s", "ivl_uvm_default_test" {0 0 0}; + %store/str v0x621588e70e40_0; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e71010_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_pkg.sv"; + %store/str v0x621588e70be0_0; + %pushi/vec4 48, 0, 32; + %store/vec4 v0x621588e70d80_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_info, S_0x621588e70a00; +T_23.62 ; + %alloc S_0x621588e5a620; + %new/cobj C0x621588d93b00; + %pushi/str "uvm_test_top"; + %null; + %store/obj v0x621588e5a970_0; + %store/str v0x621588e5a8b0_0; + %store/obj v0x621588e5a7d0_0; + %callf/obj TD_ivl_uvm_pkg.ivl_uvm_default_test.new, S_0x621588e5a620; + %load/obj v0x621588e5a7d0_0; + %free S_0x621588e5a620; + %store/obj v0x621588e73480_0; + %alloc S_0x621588e61a60; + %load/obj v0x621588e73480_0; + %store/obj v0x621588e61c40_0; + %fork TD_ivl_uvm_pkg.uvm_component.ivl_uvm_run_all_phases, S_0x621588e61a60; + %join; + %free S_0x621588e61a60; + %end; +S_0x621588e5ffb0 .scope class, "uvm_comparer" "uvm_comparer" 6 140, 6 140 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e60350 .scope class, "uvm_component" "uvm_component" 8 50, 8 50 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e604e0 .scope autofunction.void, "build_phase" "build_phase" 8 55, 8 55 0, S_0x621588e60350; + .timescale -9 -9; +v0x621588e606e0_0 .var/cobj "@"; +v0x621588e607c0_0 .var/cobj "phase"; +TD_ivl_uvm_pkg.uvm_component.build_phase ; + %pushi/vec4 300, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_24.64, 4; + %alloc S_0x621588e6d420; + %load/obj v0x621588e606e0_0; + %store/obj v0x621588e6d600_0; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6d7a0_0; + %pushi/str "build_phase"; + %store/str v0x621588e6d920_0; + %pushi/vec4 300, 0, 32; + %store/vec4 v0x621588e6daf0_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_comps.svh"; + %store/str v0x621588e6d6e0_0; + %pushi/vec4 56, 0, 32; + %store/vec4 v0x621588e6d840_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_report_info, S_0x621588e6d420; + %free S_0x621588e6d420; + %alloc S_0x621588e6bd00; + %load/obj v0x621588e606e0_0; + %store/obj v0x621588e6bee0_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_count_info, S_0x621588e6bd00; + %free S_0x621588e6bd00; +T_24.64 ; + %end; +S_0x621588e60880 .scope autofunction.void, "check_phase" "check_phase" 8 77, 8 77 0, S_0x621588e60350; + .timescale -9 -9; +v0x621588e60a80_0 .var/cobj "@"; +v0x621588e60b40_0 .var/cobj "phase"; +TD_ivl_uvm_pkg.uvm_component.check_phase ; + %end; +S_0x621588e60c00 .scope autofunction.void, "connect_phase" "connect_phase" 8 59, 8 59 0, S_0x621588e60350; + .timescale -9 -9; +v0x621588e60e10_0 .var/cobj "@"; +v0x621588e60ed0_0 .var/cobj "phase"; +TD_ivl_uvm_pkg.uvm_component.connect_phase ; + %pushi/vec4 300, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_26.66, 4; + %alloc S_0x621588e6d420; + %load/obj v0x621588e60e10_0; + %store/obj v0x621588e6d600_0; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6d7a0_0; + %pushi/str "connect_phase"; + %store/str v0x621588e6d920_0; + %pushi/vec4 300, 0, 32; + %store/vec4 v0x621588e6daf0_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_comps.svh"; + %store/str v0x621588e6d6e0_0; + %pushi/vec4 60, 0, 32; + %store/vec4 v0x621588e6d840_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_report_info, S_0x621588e6d420; + %free S_0x621588e6d420; + %alloc S_0x621588e6bd00; + %load/obj v0x621588e60e10_0; + %store/obj v0x621588e6bee0_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_count_info, S_0x621588e6bd00; + %free S_0x621588e6bd00; +T_26.66 ; + %end; +S_0x621588e60f90 .scope autofunction.void, "end_of_elaboration_phase" "end_of_elaboration_phase" 8 63, 8 63 0, S_0x621588e60350; + .timescale -9 -9; +v0x621588e61170_0 .var/cobj "@"; +v0x621588e61250_0 .var/cobj "phase"; +TD_ivl_uvm_pkg.uvm_component.end_of_elaboration_phase ; + %pushi/vec4 300, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_27.68, 4; + %alloc S_0x621588e6d420; + %load/obj v0x621588e61170_0; + %store/obj v0x621588e6d600_0; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6d7a0_0; + %pushi/str "end_of_elaboration_phase"; + %store/str v0x621588e6d920_0; + %pushi/vec4 300, 0, 32; + %store/vec4 v0x621588e6daf0_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_comps.svh"; + %store/str v0x621588e6d6e0_0; + %pushi/vec4 64, 0, 32; + %store/vec4 v0x621588e6d840_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_report_info, S_0x621588e6d420; + %free S_0x621588e6d420; + %alloc S_0x621588e6bd00; + %load/obj v0x621588e61170_0; + %store/obj v0x621588e6bee0_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_count_info, S_0x621588e6bd00; + %free S_0x621588e6bd00; +T_27.68 ; + %end; +S_0x621588e61310 .scope autofunction.void, "extract_phase" "extract_phase" 8 75, 8 75 0, S_0x621588e60350; + .timescale -9 -9; +v0x621588e61540_0 .var/cobj "@"; +v0x621588e61620_0 .var/cobj "phase"; +TD_ivl_uvm_pkg.uvm_component.extract_phase ; + %end; +S_0x621588e616e0 .scope autofunction.void, "final_phase" "final_phase" 8 81, 8 81 0, S_0x621588e60350; + .timescale -9 -9; +v0x621588e618c0_0 .var/cobj "@"; +v0x621588e619a0_0 .var/cobj "phase"; +TD_ivl_uvm_pkg.uvm_component.final_phase ; + %end; +S_0x621588e61a60 .scope autotask, "ivl_uvm_run_all_phases" "ivl_uvm_run_all_phases" 8 84, 8 84 0, S_0x621588e60350; + .timescale -9 -9; +v0x621588e61c40_0 .var/cobj "@"; +v0x621588e61d20_0 .var/cobj "u_ph_0"; +TD_ivl_uvm_pkg.uvm_component.ivl_uvm_run_all_phases ; + %alloc S_0x621588e6ec20; + %new/cobj C0x621588d8f9a0; + %pushi/str "uvm_phase"; + %store/str v0x621588e6ef00_0; + %store/obj v0x621588e6ee20_0; + %callf/obj TD_ivl_uvm_pkg.uvm_phase.new, S_0x621588e6ec20; + %load/obj v0x621588e6ee20_0; + %free S_0x621588e6ec20; + %store/obj v0x621588e61d20_0; + %alloc S_0x621588e604e0; + %load/obj v0x621588e61c40_0; + %store/obj v0x621588e606e0_0; + %load/obj v0x621588e61d20_0; + %store/obj v0x621588e607c0_0; + %callf/void TD_ivl_uvm_pkg.uvm_component.build_phase, S_0x621588e604e0; + %free S_0x621588e604e0; + %alloc S_0x621588e60c00; + %load/obj v0x621588e61c40_0; + %store/obj v0x621588e60e10_0; + %load/obj v0x621588e61d20_0; + %store/obj v0x621588e60ed0_0; + %callf/void TD_ivl_uvm_pkg.uvm_component.connect_phase, S_0x621588e60c00; + %free S_0x621588e60c00; + %alloc S_0x621588e60f90; + %load/obj v0x621588e61c40_0; + %store/obj v0x621588e61170_0; + %load/obj v0x621588e61d20_0; + %store/obj v0x621588e61250_0; + %callf/void TD_ivl_uvm_pkg.uvm_component.end_of_elaboration_phase, S_0x621588e60f90; + %free S_0x621588e60f90; + %alloc S_0x621588e62940; + %load/obj v0x621588e61c40_0; + %store/obj v0x621588e62b20_0; + %load/obj v0x621588e61d20_0; + %store/obj v0x621588e62c00_0; + %callf/void TD_ivl_uvm_pkg.uvm_component.start_of_simulation_phase, S_0x621588e62940; + %free S_0x621588e62940; + %alloc S_0x621588e62610; + %load/obj v0x621588e61c40_0; + %store/obj v0x621588e627a0_0; + %load/obj v0x621588e61d20_0; + %store/obj v0x621588e62880_0; + %fork TD_ivl_uvm_pkg.uvm_component.run_phase, S_0x621588e62610; + %join; + %free S_0x621588e62610; + %end; +S_0x621588e61de0 .scope autofunction.obj, "new" "new" 8 51, 8 51 0, S_0x621588e60350; + .timescale -9 -9; +v0x621588e61fc0_0 .var/cobj "@"; +v0x621588e620a0_0 .var/str "name"; +v0x621588e62160_0 .var/cobj "parent"; +TD_ivl_uvm_pkg.uvm_component.new ; + %alloc S_0x621588e71280; + %load/obj v0x621588e61fc0_0; + %load/str v0x621588e620a0_0; + %store/str v0x621588e71560_0; + %store/obj v0x621588e71480_0; + %callf/obj TD_ivl_uvm_pkg.uvm_report_object.new, S_0x621588e71280; + %load/obj v0x621588e71480_0; + %free S_0x621588e71280; + %store/obj v0x621588e61fc0_0; + %end; +S_0x621588e62200 .scope autofunction.void, "report_phase" "report_phase" 8 79, 8 79 0, S_0x621588e60350; + .timescale -9 -9; +v0x621588e62470_0 .var/cobj "@"; +v0x621588e62550_0 .var/cobj "phase"; +TD_ivl_uvm_pkg.uvm_component.report_phase ; + %end; +S_0x621588e62610 .scope autotask, "run_phase" "run_phase" 8 70, 8 70 0, S_0x621588e60350; + .timescale -9 -9; +v0x621588e627a0_0 .var/cobj "@"; +v0x621588e62880_0 .var/cobj "phase"; +TD_ivl_uvm_pkg.uvm_component.run_phase ; + %pushi/vec4 300, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_33.70, 4; + %alloc S_0x621588e6d420; + %load/obj v0x621588e627a0_0; + %store/obj v0x621588e6d600_0; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6d7a0_0; + %pushi/str "run_phase"; + %store/str v0x621588e6d920_0; + %pushi/vec4 300, 0, 32; + %store/vec4 v0x621588e6daf0_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_comps.svh"; + %store/str v0x621588e6d6e0_0; + %pushi/vec4 71, 0, 32; + %store/vec4 v0x621588e6d840_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_report_info, S_0x621588e6d420; + %free S_0x621588e6d420; + %alloc S_0x621588e6bd00; + %load/obj v0x621588e627a0_0; + %store/obj v0x621588e6bee0_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_count_info, S_0x621588e6bd00; + %free S_0x621588e6bd00; +T_33.70 ; + %alloc S_0x621588e68bb0; + %load/obj v0x621588e627a0_0; + %store/obj v0x621588e68d90_0; + %load/obj v0x621588e627a0_0; + %prop/obj 5, 0; eval_object_property + %pop/obj 1, 1; + %store/obj v0x621588e68e70_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.print, S_0x621588e68bb0; + %free S_0x621588e68bb0; + %end; +S_0x621588e62940 .scope autofunction.void, "start_of_simulation_phase" "start_of_simulation_phase" 8 66, 8 66 0, S_0x621588e60350; + .timescale -9 -9; +v0x621588e62b20_0 .var/cobj "@"; +v0x621588e62c00_0 .var/cobj "phase"; +TD_ivl_uvm_pkg.uvm_component.start_of_simulation_phase ; + %pushi/vec4 300, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_34.72, 4; + %alloc S_0x621588e6d420; + %load/obj v0x621588e62b20_0; + %store/obj v0x621588e6d600_0; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6d7a0_0; + %pushi/str "start_of_simulation_phase"; + %store/str v0x621588e6d920_0; + %pushi/vec4 300, 0, 32; + %store/vec4 v0x621588e6daf0_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_comps.svh"; + %store/str v0x621588e6d6e0_0; + %pushi/vec4 67, 0, 32; + %store/vec4 v0x621588e6d840_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_report_info, S_0x621588e6d420; + %free S_0x621588e6d420; + %alloc S_0x621588e6bd00; + %load/obj v0x621588e62b20_0; + %store/obj v0x621588e6bee0_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_count_info, S_0x621588e6bd00; + %free S_0x621588e6bd00; +T_34.72 ; + %end; +S_0x621588e62cc0 .scope class, "uvm_copy_map" "uvm_copy_map" 6 144, 6 144 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e62e50 .scope function.void, "uvm_count_err" "uvm_count_err" 7 35, 7 35 0, S_0x621588d73510; + .timescale -9 -9; +TD_ivl_uvm_pkg.uvm_count_err ; + ; show_stmt_assign_vector: Get l-value for compressed += operand + %load/vec4 v0x621588e73090_0; + %pushi/vec4 1, 0, 32; + %add; + %cast2; + %store/vec4 v0x621588e73090_0, 0, 32; + %load/vec4 v0x621588e72d10_0; + %load/vec4 v0x621588e73090_0; + %cmp/u; + %flag_or 5, 4; + %jmp/0xz T_35.74, 5; + %vpi_call/w 7 39 "$display", "%c[1;31m", 32'sb00000000000000000000000000011011 {0 0 0}; + %vpi_call/w 7 40 "$display", "Reached UVM_MAX_QUIT_COUNT: %0d cur_num_err: %0d, ending simulation", v0x621588e72d10_0, v0x621588e73090_0 {0 0 0}; + %vpi_call/w 7 41 "$display", "%c[0m", 32'sb00000000000000000000000000011011 {0 0 0}; + %callf/void TD_ivl_uvm_pkg.report_summarize, S_0x621588e5f510; + %vpi_call/w 7 43 "$finish", 32'sb00000000000000000000000000000010 {0 0 0}; +T_35.74 ; + %end; +S_0x621588e63030 .scope function.void, "uvm_count_fatal" "uvm_count_fatal" 7 47, 7 47 0, S_0x621588d73510; + .timescale -9 -9; +TD_ivl_uvm_pkg.uvm_count_fatal ; + ; show_stmt_assign_vector: Get l-value for compressed += operand + %load/vec4 v0x621588e73170_0; + %pushi/vec4 1, 0, 32; + %add; + %cast2; + %store/vec4 v0x621588e73170_0, 0, 32; + %end; +S_0x621588e63210 .scope function.void, "uvm_count_info" "uvm_count_info" 7 27, 7 27 0, S_0x621588d73510; + .timescale -9 -9; +TD_ivl_uvm_pkg.uvm_count_info ; + ; show_stmt_assign_vector: Get l-value for compressed += operand + %load/vec4 v0x621588e73250_0; + %pushi/vec4 1, 0, 32; + %add; + %cast2; + %store/vec4 v0x621588e73250_0, 0, 32; + %end; +S_0x621588e633f0 .scope function.void, "uvm_count_warn" "uvm_count_warn" 7 31, 7 31 0, S_0x621588d73510; + .timescale -9 -9; +TD_ivl_uvm_pkg.uvm_count_warn ; + ; show_stmt_assign_vector: Get l-value for compressed += operand + %load/vec4 v0x621588e73540_0; + %pushi/vec4 1, 0, 32; + %add; + %cast2; + %store/vec4 v0x621588e73540_0, 0, 32; + %end; +S_0x621588e635d0 .scope class, "uvm_object" "uvm_object" 11 37, 11 37 0, S_0x621588d73510; + .timescale -9 -9; +v0x621588e6e380_0 .var/cobj "__m_uvm_status_container"; +v0x621588e6e460_0 .var/2s "m_inst_count", 31 0; +v0x621588e6e540_0 .var/2u "use_uvm_seeding", 0 0; +S_0x621588e63760 .scope autofunction.obj, "clone" "clone" 11 300, 11 300 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e63960_0 .var/cobj "@"; +v0x621588e63a40_0 .var/cobj "clone"; +v0x621588e63b00_0 .var/cobj "tmp"; +TD_ivl_uvm_pkg.uvm_object.clone ; + %load/obj v0x621588e63b00_0; + %store/obj v0x621588e63a40_0; + %disable/flow S_0x621588e63760; + %end; +S_0x621588e63bd0 .scope autofunction.vec2.s1, "compare" "compare" 11 625, 11 625 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e63dd0_0 .var/cobj "@"; +; Variable compare is bool return value of scope S_0x621588e63bd0 +v0x621588e63f50_0 .var/cobj "comparer"; +v0x621588e64020_0 .var/cobj "rhs"; +TD_ivl_uvm_pkg.uvm_object.compare ; + %end; +S_0x621588e640e0 .scope autofunction.str, "convert2string" "convert2string" 11 470, 11 470 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e642f0_0 .var/cobj "@"; +; Variable convert2string is string return value of scope S_0x621588e640e0 +TD_ivl_uvm_pkg.uvm_object.convert2string ; + %pushi/str ""; + %ret/str 0; Assign to convert2string + %disable/flow S_0x621588e640e0; + %end; +S_0x621588e64470 .scope autofunction.void, "copy" "copy" 11 553, 11 553 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e64650_0 .var/cobj "@"; +v0x621588e64730_0 .var/cobj "rhs"; +TD_ivl_uvm_pkg.uvm_object.copy ; + %end; +S_0x621588e647f0 .scope autofunction.obj, "create" "create" 11 287, 11 287 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e64a20_0 .var/cobj "@"; +v0x621588e64b00_0 .var/cobj "create"; +v0x621588e64bc0_0 .var/str "name"; +TD_ivl_uvm_pkg.uvm_object.create ; + %null; + %store/obj v0x621588e64b00_0; + %disable/flow S_0x621588e647f0; + %end; +S_0x621588e64c60 .scope autofunction.vec2.s1, "do_compare" "do_compare" 11 722, 11 722 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e64e40_0 .var/cobj "@"; +v0x621588e64f20_0 .var/cobj "comparer"; +; Variable do_compare is bool return value of scope S_0x621588e64c60 +v0x621588e650b0_0 .var/cobj "rhs"; +TD_ivl_uvm_pkg.uvm_object.do_compare ; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to do_compare (store_vec4_to_lval) + %disable/flow S_0x621588e64c60; + %end; +S_0x621588e65170 .scope autofunction.void, "do_copy" "do_copy" 11 601, 11 601 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e65350_0 .var/cobj "@"; +v0x621588e65430_0 .var/cobj "rhs"; +TD_ivl_uvm_pkg.uvm_object.do_copy ; + %disable/flow S_0x621588e65170; + %end; +S_0x621588e654f0 .scope autofunction.void, "do_print" "do_print" 11 413, 11 413 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e656d0_0 .var/cobj "@"; +v0x621588e657b0_0 .var/cobj "printer"; +TD_ivl_uvm_pkg.uvm_object.do_print ; + %disable/flow S_0x621588e654f0; + %end; +S_0x621588e65870 .scope autofunction.void, "do_record" "do_record" 11 538, 11 538 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e65ae0_0 .var/cobj "@"; +v0x621588e65bc0_0 .var/cobj "recorder"; +TD_ivl_uvm_pkg.uvm_object.do_record ; + %disable/flow S_0x621588e65870; + %end; +S_0x621588e65c80 .scope autofunction.str, "get_full_name" "get_full_name" 11 145, 11 145 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e65e10_0 .var/cobj "@"; +; Variable get_full_name is string return value of scope S_0x621588e65c80 +TD_ivl_uvm_pkg.uvm_object.get_full_name ; + %alloc S_0x621588e666f0; + %load/obj v0x621588e65e10_0; + %store/obj v0x621588e668d0_0; + %callf/str TD_ivl_uvm_pkg.uvm_object.get_name, S_0x621588e666f0; + %free S_0x621588e666f0; + %ret/str 0; Assign to get_full_name + %disable/flow S_0x621588e65c80; + %end; +S_0x621588e65fb0 .scope autofunction.vec2.u32, "get_inst_count" "get_inst_count" 11 167, 11 167 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e66190_0 .var/cobj "@"; +; Variable get_inst_count is bool return value of scope S_0x621588e65fb0 +TD_ivl_uvm_pkg.uvm_object.get_inst_count ; + %load/vec4 v0x621588e6e460_0; + %ret/vec4 0, 0, 32; Assign to get_inst_count (store_vec4_to_lval) + %disable/flow S_0x621588e65fb0; + %end; +S_0x621588e66350 .scope autofunction.vec2.u32, "get_inst_id" "get_inst_id" 11 154, 11 154 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e66530_0 .var/cobj "@"; +; Variable get_inst_id is bool return value of scope S_0x621588e66350 +TD_ivl_uvm_pkg.uvm_object.get_inst_id ; + %load/obj v0x621588e66530_0; + %prop/v 2; + %pop/obj 1, 0; + %ret/vec4 0, 0, 32; Assign to get_inst_id (store_vec4_to_lval) + %disable/flow S_0x621588e66350; + %end; +S_0x621588e666f0 .scope autofunction.str, "get_name" "get_name" 11 124, 11 124 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e668d0_0 .var/cobj "@"; +; Variable get_name is string return value of scope S_0x621588e666f0 +TD_ivl_uvm_pkg.uvm_object.get_name ; + %load/obj v0x621588e668d0_0; + %prop/str 3; + %pop/obj 1, 0; + %ret/str 0; Assign to get_name + %disable/flow S_0x621588e666f0; + %end; +S_0x621588e66a70 .scope autofunction.obj, "get_object_type" "get_object_type" 11 234, 11 234 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e66c50_0 .var/cobj "@"; +v0x621588e66d30_0 .var/cobj "get_object_type"; +TD_ivl_uvm_pkg.uvm_object.get_object_type ; + %alloc S_0x621588e67170; + %load/obj v0x621588e66c50_0; + %store/obj v0x621588e67350_0; + %callf/str TD_ivl_uvm_pkg.uvm_object.get_type_name, S_0x621588e67170; + %free S_0x621588e67170; + %pushi/str ""; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 8; + %jmp/0xz T_52.76, 8; + %null; + %store/obj v0x621588e66d30_0; + %disable/flow S_0x621588e66a70; +T_52.76 ; + %end; +S_0x621588e66df0 .scope autofunction.obj, "get_type" "get_type" 11 199, 11 199 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e66fd0_0 .var/cobj "@"; +v0x621588e670b0_0 .var/cobj "get_type"; +TD_ivl_uvm_pkg.uvm_object.get_type ; + %null; + %store/obj v0x621588e670b0_0; + %disable/flow S_0x621588e66df0; + %end; +S_0x621588e67170 .scope autofunction.str, "get_type_name" "get_type_name" 11 267, 11 267 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e67350_0 .var/cobj "@"; +; Variable get_type_name is string return value of scope S_0x621588e67170 +TD_ivl_uvm_pkg.uvm_object.get_type_name ; + %pushi/str ""; + %ret/str 0; Assign to get_type_name + %disable/flow S_0x621588e67170; + %end; +S_0x621588e674f0 .scope autofunction.str, "get_uvm_severity_type_str" "get_uvm_severity_type_str" 7 193, 7 193 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e676d0_0 .var/cobj "@"; +; Variable get_uvm_severity_type_str is string return value of scope S_0x621588e674f0 +v0x621588e67870_0 .var/str "res"; +v0x621588e67940_0 .var/2u "severity", 1 0; +TD_ivl_uvm_pkg.uvm_object.get_uvm_severity_type_str ; + %load/vec4 v0x621588e67940_0; + %dup/vec4; + %pushi/vec4 0, 0, 2; + %cmp/u; + %jmp/1 T_55.78, 6; + %dup/vec4; + %pushi/vec4 1, 0, 2; + %cmp/u; + %jmp/1 T_55.79, 6; + %dup/vec4; + %pushi/vec4 2, 0, 2; + %cmp/u; + %jmp/1 T_55.80, 6; + %dup/vec4; + %pushi/vec4 3, 0, 2; + %cmp/u; + %jmp/1 T_55.81, 6; + %jmp T_55.82; +T_55.78 ; + %pushi/str "UVM_INFO"; + %store/str v0x621588e67870_0; + %jmp T_55.82; +T_55.79 ; + %pushi/str "UVM_WARNING"; + %store/str v0x621588e67870_0; + %jmp T_55.82; +T_55.80 ; + %pushi/str "UVM_ERROR"; + %store/str v0x621588e67870_0; + %jmp T_55.82; +T_55.81 ; + %pushi/str "UVM_FATAL"; + %store/str v0x621588e67870_0; + %jmp T_55.82; +T_55.82 ; + %pop/vec4 1; + %load/str v0x621588e67870_0; + %ret/str 0; Assign to get_uvm_severity_type_str + %disable/flow S_0x621588e674f0; + %end; +S_0x621588e67a20 .scope autofunction.str, "ivl_uvm_compose_message" "ivl_uvm_compose_message" 7 206, 7 206 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e67c00_0 .var/cobj "@"; +v0x621588e67ce0_0 .var/str "filename"; +v0x621588e67da0_0 .var/str "id"; +; Variable ivl_uvm_compose_message is string return value of scope S_0x621588e67a20 +v0x621588e67f30_0 .var/2s "line", 31 0; +v0x621588e68060_0 .var/str "line_str"; +v0x621588e68120_0 .var/str "message"; +v0x621588e681e0_0 .var/str "name"; +v0x621588e682a0_0 .var/2u "severity", 1 0; +v0x621588e68380_0 .var/str "sv"; +v0x621588e68440_0 .var/str "time_str"; +TD_ivl_uvm_pkg.uvm_object.ivl_uvm_compose_message ; + %alloc S_0x621588e674f0; + %load/obj v0x621588e67c00_0; + %load/vec4 v0x621588e682a0_0; + %store/vec4 v0x621588e67940_0, 0, 2; + %store/obj v0x621588e676d0_0; + %callf/str TD_ivl_uvm_pkg.uvm_object.get_uvm_severity_type_str, S_0x621588e674f0; + %free S_0x621588e674f0; + %store/str v0x621588e68380_0; + %vpi_call/w 7 221 "$swrite", v0x621588e68440_0, "%0t", $realtime {0 0 0}; + %pushi/vec4 1, 0, 32; + %dup/vec4; + %load/str v0x621588e681e0_0; + %pushi/str ""; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 8; + %flag_get/vec4 8; + %jmp/0 T_56.88, 8; + %load/str v0x621588e67ce0_0; + %pushi/str ""; + %cmp/str; + %flag_get/vec4 4; + %and; +T_56.88; + %pad/u 32; + %cmp/u; + %jmp/1 T_56.83, 6; + %dup/vec4; + %load/str v0x621588e681e0_0; + %pushi/str ""; + %cmp/str; + %flag_inv 4; + %flag_get/vec4 4; + %flag_set/vec4 8; + %flag_get/vec4 8; + %jmp/0 T_56.89, 8; + %load/str v0x621588e67ce0_0; + %pushi/str ""; + %cmp/str; + %flag_get/vec4 4; + %and; +T_56.89; + %pad/u 32; + %cmp/u; + %jmp/1 T_56.84, 6; + %dup/vec4; + %load/str v0x621588e681e0_0; + %pushi/str ""; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 8; + %flag_get/vec4 8; + %jmp/0 T_56.90, 8; + %load/str v0x621588e67ce0_0; + %pushi/str ""; + %cmp/str; + %flag_inv 4; + %flag_get/vec4 4; + %and; +T_56.90; + %pad/u 32; + %cmp/u; + %jmp/1 T_56.85, 6; + %dup/vec4; + %load/str v0x621588e681e0_0; + %pushi/str ""; + %cmp/str; + %flag_inv 4; + %flag_get/vec4 4; + %flag_set/vec4 8; + %flag_get/vec4 8; + %jmp/0 T_56.91, 8; + %load/str v0x621588e67ce0_0; + %pushi/str ""; + %cmp/str; + %flag_inv 4; + %flag_get/vec4 4; + %and; +T_56.91; + %pad/u 32; + %cmp/u; + %jmp/1 T_56.86, 6; + %jmp T_56.87; +T_56.83 ; + %load/str v0x621588e68380_0; + %concati/str " @ "; + %load/str v0x621588e68440_0; + %concat/str; + %concati/str " ["; + %load/str v0x621588e67da0_0; + %concat/str; + %concati/str "] "; + %load/str v0x621588e68120_0; + %concat/str; + %ret/str 0; Assign to ivl_uvm_compose_message + %disable/flow S_0x621588e67a20; + %jmp T_56.87; +T_56.84 ; + %load/str v0x621588e68380_0; + %concati/str " @ "; + %load/str v0x621588e68440_0; + %concat/str; + %concati/str ": "; + %load/str v0x621588e681e0_0; + %concat/str; + %concati/str " ["; + %load/str v0x621588e67da0_0; + %concat/str; + %concati/str "] "; + %load/str v0x621588e68120_0; + %concat/str; + %ret/str 0; Assign to ivl_uvm_compose_message + %disable/flow S_0x621588e67a20; + %jmp T_56.87; +T_56.85 ; + %vpi_call/w 7 230 "$swrite", v0x621588e68060_0, "%0d", v0x621588e67f30_0 {0 0 0}; + %load/str v0x621588e68380_0; + %concati/str " "; + %load/str v0x621588e67ce0_0; + %concat/str; + %concati/str "("; + %load/str v0x621588e68060_0; + %concat/str; + %concati/str ")"; + %concati/str " @ "; + %load/str v0x621588e68440_0; + %concat/str; + %concati/str " ["; + %load/str v0x621588e67da0_0; + %concat/str; + %concati/str "] "; + %load/str v0x621588e68120_0; + %concat/str; + %ret/str 0; Assign to ivl_uvm_compose_message + %disable/flow S_0x621588e67a20; + %jmp T_56.87; +T_56.86 ; + %vpi_call/w 7 235 "$swrite", v0x621588e68060_0, "%0d", v0x621588e67f30_0 {0 0 0}; + %load/str v0x621588e68380_0; + %concati/str " "; + %load/str v0x621588e67ce0_0; + %concat/str; + %concati/str "("; + %load/str v0x621588e68060_0; + %concat/str; + %concati/str ")"; + %concati/str " @ "; + %load/str v0x621588e68440_0; + %concat/str; + %concati/str ": "; + %load/str v0x621588e681e0_0; + %concat/str; + %concati/str " ["; + %load/str v0x621588e67da0_0; + %concat/str; + %concati/str "] "; + %load/str v0x621588e68120_0; + %concat/str; + %ret/str 0; Assign to ivl_uvm_compose_message + %disable/flow S_0x621588e67a20; + %jmp T_56.87; +T_56.87 ; + %pop/vec4 1; + %end; +S_0x621588e68500 .scope autofunction.obj, "m_get_report_object" "m_get_report_object" 11 867, 11 867 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e68690_0 .var/cobj "@"; +v0x621588e68770_0 .var/cobj "m_get_report_object"; +TD_ivl_uvm_pkg.uvm_object.m_get_report_object ; + %null; + %store/obj v0x621588e68770_0; + %disable/flow S_0x621588e68500; + %end; +S_0x621588e68830 .scope autofunction.obj, "new" "new" 11 62, 11 62 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e68a10_0 .var/cobj "@"; +v0x621588e68af0_0 .var/str "name"; +TD_ivl_uvm_pkg.uvm_object.new ; + %load/vec4 v0x621588e6e460_0; + %dup/vec4; + %pushi/vec4 1, 0, 32; + %add; + %store/vec4 v0x621588e6e460_0, 0, 32; + %load/obj v0x621588e68a10_0; + %store/prop/v 2, 32; Store in bool property m_inst_id + %pop/obj 1, 0; + %load/str v0x621588e68af0_0; + %load/obj v0x621588e68a10_0; + %store/prop/str 3; + %pop/obj 1, 0; + %load/obj v0x621588e68a10_0; + %new/cobj C0x621588cd9630; + %store/prop/obj 6, 0; IVL_VT_CLASS + %pop/obj 1, 0; + %new/cobj C0x621588d84700; + %store/obj v0x621588e6e380_0; + %load/obj v0x621588e68a10_0; + %new/cobj C0x621588cd8b90; + %store/prop/obj 5, 0; IVL_VT_CLASS + %pop/obj 1, 0; + %end; +S_0x621588e68bb0 .scope autofunction.void, "print" "print" 11 330, 11 330 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e68d90_0 .var/cobj "@"; +v0x621588e68e70_0 .var/cobj "printer"; +TD_ivl_uvm_pkg.uvm_object.print ; + %test_nul v0x621588e68e70_0; + %flag_get/vec4 4; + %flag_set/vec4 8; + %jmp/0xz T_59.92, 8; + %load/obj v0x621588e68d90_0; + %prop/obj 5, 0; eval_object_property + %pop/obj 1, 1; + %store/obj v0x621588e68e70_0; +T_59.92 ; + %test_nul v0x621588e68e70_0; + %flag_get/vec4 4; + %flag_set/vec4 8; + %jmp/0xz T_59.94, 8; + %pushi/vec4 0, 0, 32; + %pushi/vec4 2, 0, 2; + %pushi/str "NULLPRINTER"; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_59.96, 4; + %alloc S_0x621588e6c490; + %load/obj v0x621588e68d90_0; + %store/obj v0x621588e6c670_0; + %pushi/str "NULLPRINTER"; + %store/str v0x621588e6c810_0; + %pushi/str "uvm_default_printer is null"; + %store/str v0x621588e6c9c0_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e6cb90_0, 0, 32; + %pushi/str "../../ivl_uvm_src/base/uvm_object.svh"; + %store/str v0x621588e6c750_0; + %pushi/vec4 334, 0, 32; + %store/vec4 v0x621588e6c8e0_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_report_error, S_0x621588e6c490; + %free S_0x621588e6c490; +T_59.96 ; +T_59.94 ; + %end; +S_0x621588e68f30 .scope autofunction.void, "record" "record" 11 494, 11 494 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e69110_0 .var/cobj "@"; +v0x621588e691f0_0 .var/cobj "recorder"; +TD_ivl_uvm_pkg.uvm_object.record ; + %end; +S_0x621588e692b0 .scope autofunction.void, "report_summarize" "report_summarize" 7 52, 7 52 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e69a90_0 .var/cobj "@"; +v0x621588e69b50_0 .var/2s "num_errs", 31 0; +TD_ivl_uvm_pkg.uvm_object.report_summarize ; + %load/vec4 v0x621588e72ec0_0; + %nor/r; + %flag_set/vec4 8; + %jmp/0xz T_61.98, 8; + %fork t_7, S_0x621588e69490; + %jmp t_6; + .scope S_0x621588e69490; +t_7 ; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x621588e72ec0_0, 0, 1; + %vpi_call/w 7 57 "$display", "\000" {0 0 0}; + %vpi_call/w 7 58 "$display", "--- UVM Report Summary ---" {0 0 0}; + %vpi_call/w 7 59 "$display", "\000" {0 0 0}; + %vpi_call/w 7 60 "$display", "** Report counts by severity" {0 0 0}; + %vpi_call/w 7 61 "$display", "UVM_INFO : %0d", v0x621588e73250_0 {0 0 0}; + %vpi_call/w 7 62 "$display", "UVM_WARNING : %0d", v0x621588e73540_0 {0 0 0}; + %vpi_call/w 7 63 "$display", "UVM_ERROR : %0d", v0x621588e73090_0 {0 0 0}; + %vpi_call/w 7 64 "$display", "UVM_FATAL : %0d", v0x621588e73170_0 {0 0 0}; + %load/vec4 v0x621588e73090_0; + %store/vec4 v0x621588e69b50_0, 0, 32; + %load/vec4 v0x621588e69b50_0; + %cmpi/s 0, 0, 32; + %flag_or 5, 4; GT is !LE + %flag_inv 5; + %jmp/0xz T_61.100, 5; + %fork t_9, S_0x621588e69690; + %jmp t_8; + .scope S_0x621588e69690; +t_9 ; + %vpi_call/w 7 69 "$display", "%c[1;31m", 32'sb00000000000000000000000000011011 {0 0 0}; + %vpi_call/w 7 70 "$display", "Test FAILED with %0d error(s), look for UVM_ERROR in log file", v0x621588e69b50_0 {0 0 0}; + %vpi_call/w 7 72 "$display", "%c[0m", 32'sb00000000000000000000000000011011 {0 0 0}; + %end; + .scope S_0x621588e69490; +t_8 %join; + %jmp T_61.101; +T_61.100 ; + %fork t_11, S_0x621588e69890; + %jmp t_10; + .scope S_0x621588e69890; +t_11 ; + %vpi_call/w 7 75 "$display", "%c[5;34m", 32'sb00000000000000000000000000011011 {0 0 0}; + %vpi_call/w 7 76 "$display", "*** Congratulations! Test PASSED with NO UVM_ERRORs ***" {0 0 0}; + %vpi_call/w 7 77 "$display", "%c[0m", 32'sb00000000000000000000000000011011 {0 0 0}; + %end; + .scope S_0x621588e69490; +t_10 %join; +T_61.101 ; + %pushi/vec4 0, 0, 32; + %pushi/vec4 0, 0, 2; + %load/str v0x621588e72e00_0; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_61.102, 4; + %alloc S_0x621588e6d420; + %load/obj v0x621588e69a90_0; + %store/obj v0x621588e6d600_0; + %load/str v0x621588e72e00_0; + %store/str v0x621588e6d7a0_0; + %pushi/str "Thanks for using IVL_UVM Package"; + %store/str v0x621588e6d920_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e6daf0_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_msg.svh"; + %store/str v0x621588e6d6e0_0; + %pushi/vec4 82, 0, 32; + %store/vec4 v0x621588e6d840_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_report_info, S_0x621588e6d420; + %free S_0x621588e6d420; +T_61.102 ; + %end; + .scope S_0x621588e692b0; +t_6 %join; +T_61.98 ; + %end; +S_0x621588e69490 .scope autobegin, "do_it_only_once" "do_it_only_once" 7 55, 7 55 0, S_0x621588e692b0; + .timescale -9 -9; +S_0x621588e69690 .scope autobegin, "fail" "fail" 7 68, 7 68 0, S_0x621588e69490; + .timescale -9 -9; +S_0x621588e69890 .scope autobegin, "pass" "pass" 7 74, 7 74 0, S_0x621588e69490; + .timescale -9 -9; +S_0x621588e69c30 .scope autofunction.void, "reseed" "reseed" 11 97, 11 97 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e69e10_0 .var/cobj "@"; +TD_ivl_uvm_pkg.uvm_object.reseed ; + %end; +S_0x621588e69ef0 .scope autofunction.void, "set_int_local" "set_int_local" 11 733, 11 733 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6a0d0_0 .var/cobj "@"; +v0x621588e6a1b0_0 .var/str "field_name"; +v0x621588e6a270_0 .var/2u "recurse", 0 0; +v0x621588e6a310_0 .var/s "value", 4095 0; +TD_ivl_uvm_pkg.uvm_object.set_int_local ; + %end; +S_0x621588e6a3f0 .scope autofunction.void, "set_name" "set_name" 11 113, 11 113 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6a5d0_0 .var/cobj "@"; +v0x621588e6a6b0_0 .var/str "name"; +TD_ivl_uvm_pkg.uvm_object.set_name ; + %load/str v0x621588e6a6b0_0; + %load/obj v0x621588e6a5d0_0; + %store/prop/str 3; + %pop/obj 1, 0; + %end; +S_0x621588e6a770 .scope autofunction.void, "set_object_local" "set_object_local" 11 838, 11 838 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6a950_0 .var/cobj "@"; +v0x621588e6aa30_0 .var/2u "clone", 0 0; +v0x621588e6aaf0_0 .var/str "field_name"; +v0x621588e6abc0_0 .var/2u "recurse", 0 0; +v0x621588e6ac80_0 .var/cobj "value"; +TD_ivl_uvm_pkg.uvm_object.set_object_local ; + %end; +S_0x621588e6ad90 .scope autofunction.void, "set_string_local" "set_string_local" 11 756, 11 756 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6af70_0 .var/cobj "@"; +v0x621588e6b050_0 .var/str "field_name"; +v0x621588e6b110_0 .var/2u "recurse", 0 0; +v0x621588e6b1b0_0 .var/str "value"; +TD_ivl_uvm_pkg.uvm_object.set_string_local ; + %end; +S_0x621588e6b270 .scope autofunction.str, "sprint" "sprint" 11 351, 11 351 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6b450_0 .var/cobj "@"; +v0x621588e6b530_0 .var/2u "p", 0 0; +v0x621588e6b5f0_0 .var/cobj "printer"; +; Variable sprint is string return value of scope S_0x621588e6b270 +TD_ivl_uvm_pkg.uvm_object.sprint ; + %test_nul v0x621588e6b5f0_0; + %flag_get/vec4 4; + %flag_set/vec4 8; + %jmp/0xz T_67.104, 8; + %load/obj v0x621588e6b450_0; + %prop/obj 5, 0; eval_object_property + %pop/obj 1, 1; + %store/obj v0x621588e6b5f0_0; +T_67.104 ; + %pushi/str "IVL_UVM"; + %ret/str 0; Assign to sprint + %disable/flow S_0x621588e6b270; + %end; +S_0x621588e6b780 .scope autofunction.void, "uvm_count_err" "uvm_count_err" 7 35, 7 35 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6b960_0 .var/cobj "@"; +TD_ivl_uvm_pkg.uvm_object.uvm_count_err ; + ; show_stmt_assign_vector: Get l-value for compressed += operand + %load/vec4 v0x621588e73090_0; + %pushi/vec4 1, 0, 32; + %add; + %cast2; + %store/vec4 v0x621588e73090_0, 0, 32; + %load/vec4 v0x621588e72d10_0; + %load/vec4 v0x621588e73090_0; + %cmp/u; + %flag_or 5, 4; + %jmp/0xz T_68.106, 5; + %vpi_call/w 7 39 "$display", "%c[1;31m", 32'sb00000000000000000000000000011011 {0 0 0}; + %vpi_call/w 7 40 "$display", "Reached UVM_MAX_QUIT_COUNT: %0d cur_num_err: %0d, ending simulation", v0x621588e72d10_0, v0x621588e73090_0 {0 0 0}; + %vpi_call/w 7 41 "$display", "%c[0m", 32'sb00000000000000000000000000011011 {0 0 0}; + %alloc S_0x621588e692b0; + %load/obj v0x621588e6b960_0; + %store/obj v0x621588e69a90_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.report_summarize, S_0x621588e692b0; + %free S_0x621588e692b0; + %vpi_call/w 7 43 "$finish", 32'sb00000000000000000000000000000010 {0 0 0}; +T_68.106 ; + %end; +S_0x621588e6ba40 .scope autofunction.void, "uvm_count_fatal" "uvm_count_fatal" 7 47, 7 47 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6bc20_0 .var/cobj "@"; +TD_ivl_uvm_pkg.uvm_object.uvm_count_fatal ; + ; show_stmt_assign_vector: Get l-value for compressed += operand + %load/vec4 v0x621588e73170_0; + %pushi/vec4 1, 0, 32; + %add; + %cast2; + %store/vec4 v0x621588e73170_0, 0, 32; + %end; +S_0x621588e6bd00 .scope autofunction.void, "uvm_count_info" "uvm_count_info" 7 27, 7 27 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6bee0_0 .var/cobj "@"; +TD_ivl_uvm_pkg.uvm_object.uvm_count_info ; + ; show_stmt_assign_vector: Get l-value for compressed += operand + %load/vec4 v0x621588e73250_0; + %pushi/vec4 1, 0, 32; + %add; + %cast2; + %store/vec4 v0x621588e73250_0, 0, 32; + %end; +S_0x621588e6bfc0 .scope autofunction.void, "uvm_count_warn" "uvm_count_warn" 7 31, 7 31 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6c3b0_0 .var/cobj "@"; +TD_ivl_uvm_pkg.uvm_object.uvm_count_warn ; + ; show_stmt_assign_vector: Get l-value for compressed += operand + %load/vec4 v0x621588e73540_0; + %pushi/vec4 1, 0, 32; + %add; + %cast2; + %store/vec4 v0x621588e73540_0, 0, 32; + %end; +S_0x621588e6c490 .scope autofunction.void, "uvm_report_error" "uvm_report_error" 7 127, 7 127 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6c670_0 .var/cobj "@"; +v0x621588e6c750_0 .var/str "filename"; +v0x621588e6c810_0 .var/str "id"; +v0x621588e6c8e0_0 .var/2s "line", 31 0; +v0x621588e6c9c0_0 .var/str "message"; +v0x621588e6cad0_0 .var/str "msg_str"; +v0x621588e6cb90_0 .var/2s "verbosity", 31 0; +TD_ivl_uvm_pkg.uvm_object.uvm_report_error ; + %alloc S_0x621588e67a20; + %load/obj v0x621588e6c670_0; + %pushi/vec4 2, 0, 2; + %load/str v0x621588e6c810_0; + %load/str v0x621588e6c9c0_0; + %load/str v0x621588e6c750_0; + %load/vec4 v0x621588e6c8e0_0; + %store/vec4 v0x621588e67f30_0, 0, 32; + %store/str v0x621588e67ce0_0; + %store/str v0x621588e68120_0; + %store/str v0x621588e67da0_0; + %store/vec4 v0x621588e682a0_0, 0, 2; + %store/obj v0x621588e67c00_0; + %callf/str TD_ivl_uvm_pkg.uvm_object.ivl_uvm_compose_message, S_0x621588e67a20; + %free S_0x621588e67a20; + %store/str v0x621588e6cad0_0; + %alloc S_0x621588e6b780; + %load/obj v0x621588e6c670_0; + %store/obj v0x621588e6b960_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_count_err, S_0x621588e6b780; + %free S_0x621588e6b780; + %vpi_call/w 7 139 "$display", v0x621588e6cad0_0 {0 0 0}; + %end; +S_0x621588e6cc70 .scope autofunction.void, "uvm_report_fatal" "uvm_report_fatal" 7 174, 7 174 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6ce50_0 .var/cobj "@"; +v0x621588e6cf30_0 .var/str "filename"; +v0x621588e6cff0_0 .var/str "id"; +v0x621588e6d090_0 .var/2s "line", 31 0; +v0x621588e6d170_0 .var/str "message"; +v0x621588e6d280_0 .var/str "msg_str"; +v0x621588e6d340_0 .var/2s "verbosity", 31 0; +TD_ivl_uvm_pkg.uvm_object.uvm_report_fatal ; + %alloc S_0x621588e67a20; + %load/obj v0x621588e6ce50_0; + %pushi/vec4 3, 0, 2; + %load/str v0x621588e6cff0_0; + %load/str v0x621588e6d170_0; + %load/str v0x621588e6cf30_0; + %load/vec4 v0x621588e6d090_0; + %store/vec4 v0x621588e67f30_0, 0, 32; + %store/str v0x621588e67ce0_0; + %store/str v0x621588e68120_0; + %store/str v0x621588e67da0_0; + %store/vec4 v0x621588e682a0_0, 0, 2; + %store/obj v0x621588e67c00_0; + %callf/str TD_ivl_uvm_pkg.uvm_object.ivl_uvm_compose_message, S_0x621588e67a20; + %free S_0x621588e67a20; + %store/str v0x621588e6d280_0; + %alloc S_0x621588e6ba40; + %load/obj v0x621588e6ce50_0; + %store/obj v0x621588e6bc20_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_count_fatal, S_0x621588e6ba40; + %free S_0x621588e6ba40; + %vpi_call/w 7 186 "$display", v0x621588e6d280_0 {0 0 0}; + %alloc S_0x621588e692b0; + %load/obj v0x621588e6ce50_0; + %store/obj v0x621588e69a90_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.report_summarize, S_0x621588e692b0; + %free S_0x621588e692b0; + %vpi_call/w 7 188 "$finish", 32'sb00000000000000000000000000000010 {0 0 0}; + %end; +S_0x621588e6d420 .scope autofunction.void, "uvm_report_info" "uvm_report_info" 7 87, 7 87 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6d600_0 .var/cobj "@"; +v0x621588e6d6e0_0 .var/str "filename"; +v0x621588e6d7a0_0 .var/str "id"; +v0x621588e6d840_0 .var/2s "line", 31 0; +v0x621588e6d920_0 .var/str "message"; +v0x621588e6da30_0 .var/str "msg_str"; +v0x621588e6daf0_0 .var/2s "verbosity", 31 0; +TD_ivl_uvm_pkg.uvm_object.uvm_report_info ; + %alloc S_0x621588e67a20; + %load/obj v0x621588e6d600_0; + %pushi/vec4 0, 0, 2; + %load/str v0x621588e6d7a0_0; + %load/str v0x621588e6d920_0; + %load/str v0x621588e6d6e0_0; + %load/vec4 v0x621588e6d840_0; + %store/vec4 v0x621588e67f30_0, 0, 32; + %store/str v0x621588e67ce0_0; + %store/str v0x621588e68120_0; + %store/str v0x621588e67da0_0; + %store/vec4 v0x621588e682a0_0, 0, 2; + %store/obj v0x621588e67c00_0; + %callf/str TD_ivl_uvm_pkg.uvm_object.ivl_uvm_compose_message, S_0x621588e67a20; + %free S_0x621588e67a20; + %store/str v0x621588e6da30_0; + %alloc S_0x621588e6bd00; + %load/obj v0x621588e6d600_0; + %store/obj v0x621588e6bee0_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_count_info, S_0x621588e6bd00; + %free S_0x621588e6bd00; + %vpi_call/w 7 100 "$display", v0x621588e6da30_0 {0 0 0}; + %end; +S_0x621588e6dbd0 .scope autofunction.void, "uvm_report_warning" "uvm_report_warning" 7 106, 7 106 0, S_0x621588e635d0; + .timescale -9 -9; +v0x621588e6ddb0_0 .var/cobj "@"; +v0x621588e6de90_0 .var/str "filename"; +v0x621588e6df50_0 .var/str "id"; +v0x621588e6dff0_0 .var/2s "line", 31 0; +v0x621588e6e0d0_0 .var/str "message"; +v0x621588e6e1e0_0 .var/str "msg_str"; +v0x621588e6e2a0_0 .var/2s "verbosity", 31 0; +TD_ivl_uvm_pkg.uvm_object.uvm_report_warning ; + %alloc S_0x621588e67a20; + %load/obj v0x621588e6ddb0_0; + %pushi/vec4 1, 0, 2; + %load/str v0x621588e6df50_0; + %load/str v0x621588e6e0d0_0; + %load/str v0x621588e6de90_0; + %load/vec4 v0x621588e6dff0_0; + %store/vec4 v0x621588e67f30_0, 0, 32; + %store/str v0x621588e67ce0_0; + %store/str v0x621588e68120_0; + %store/str v0x621588e67da0_0; + %store/vec4 v0x621588e682a0_0, 0, 2; + %store/obj v0x621588e67c00_0; + %callf/str TD_ivl_uvm_pkg.uvm_object.ivl_uvm_compose_message, S_0x621588e67a20; + %free S_0x621588e67a20; + %store/str v0x621588e6e1e0_0; + %alloc S_0x621588e6bfc0; + %load/obj v0x621588e6ddb0_0; + %store/obj v0x621588e6c3b0_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_count_warn, S_0x621588e6bfc0; + %free S_0x621588e6bfc0; + %vpi_call/w 7 119 "$display", v0x621588e6e1e0_0 {0 0 0}; + %end; +S_0x621588e6e5e0 .scope class, "uvm_object_wrapper" "uvm_object_wrapper" 6 131, 6 131 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e6e770 .scope class, "uvm_objection" "uvm_objection" 6 134, 6 134 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e6e900 .scope class, "uvm_packer" "uvm_packer" 6 142, 6 142 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e6ea90 .scope class, "uvm_phase" "uvm_phase" 8 43, 8 43 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e6ec20 .scope autofunction.obj, "new" "new" 8 44, 8 44 0, S_0x621588e6ea90; + .timescale -9 -9; +v0x621588e6ee20_0 .var/cobj "@"; +v0x621588e6ef00_0 .var/str "name"; +TD_ivl_uvm_pkg.uvm_phase.new ; + %alloc S_0x621588e68830; + %load/obj v0x621588e6ee20_0; + %load/str v0x621588e6ef00_0; + %store/str v0x621588e68af0_0; + %store/obj v0x621588e68a10_0; + %callf/obj TD_ivl_uvm_pkg.uvm_object.new, S_0x621588e68830; + %load/obj v0x621588e68a10_0; + %free S_0x621588e68830; + %store/obj v0x621588e6ee20_0; + %end; +S_0x621588e6efc0 .scope class, "uvm_printer" "uvm_printer" 6 136, 6 136 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e6f150 .scope function.str, "uvm_radix_to_string" "uvm_radix_to_string" 5 123, 5 123 0, S_0x621588d73510; + .timescale -9 -9; +v0x621588e6f330_0 .var/2s "radix", 31 0; +; Variable uvm_radix_to_string is string return value of scope S_0x621588e6f150 +TD_ivl_uvm_pkg.uvm_radix_to_string ; + %load/vec4 v0x621588e6f330_0; + %dup/vec4; + %pushi/vec4 16777216, 0, 32; + %cmp/u; + %jmp/1 T_77.108, 6; + %dup/vec4; + %pushi/vec4 100663296, 0, 32; + %cmp/u; + %jmp/1 T_77.109, 6; + %dup/vec4; + %pushi/vec4 33554432, 0, 32; + %cmp/u; + %jmp/1 T_77.110, 6; + %dup/vec4; + %pushi/vec4 117440512, 0, 32; + %cmp/u; + %jmp/1 T_77.111, 6; + %dup/vec4; + %pushi/vec4 50331648, 0, 32; + %cmp/u; + %jmp/1 T_77.112, 6; + %dup/vec4; + %pushi/vec4 67108864, 0, 32; + %cmp/u; + %jmp/1 T_77.113, 6; + %dup/vec4; + %pushi/vec4 83886080, 0, 32; + %cmp/u; + %jmp/1 T_77.114, 6; + %dup/vec4; + %pushi/vec4 134217728, 0, 32; + %cmp/u; + %jmp/1 T_77.115, 6; + %dup/vec4; + %pushi/vec4 150994944, 0, 32; + %cmp/u; + %jmp/1 T_77.116, 6; + %dup/vec4; + %pushi/vec4 167772160, 0, 32; + %cmp/u; + %jmp/1 T_77.117, 6; + %dup/vec4; + %pushi/vec4 184549376, 0, 32; + %cmp/u; + %jmp/1 T_77.118, 6; + %dup/vec4; + %pushi/vec4 201326592, 0, 32; + %cmp/u; + %jmp/1 T_77.119, 6; + %dup/vec4; + %pushi/vec4 218103808, 0, 32; + %cmp/u; + %jmp/1 T_77.120, 6; + %pushi/str "x"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.108 ; + %pushi/str "b"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.109 ; + %pushi/str "o"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.110 ; + %pushi/str "d"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.111 ; + %pushi/str "h"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.112 ; + %pushi/str "u"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.113 ; + %pushi/str "u"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.114 ; + %pushi/str "z"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.115 ; + %pushi/str "s"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.116 ; + %pushi/str "t"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.117 ; + %pushi/str "s"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.118 ; + %pushi/str "g"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.119 ; + %pushi/str "f"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.120 ; + %pushi/str "e"; + %ret/str 0; Assign to uvm_radix_to_string + %disable/flow S_0x621588e6f150; + %jmp T_77.122; +T_77.122 ; + %pop/vec4 1; + %end; +S_0x621588e6f4f0 .scope class, "uvm_recorder" "uvm_recorder" 6 138, 6 138 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e6f680 .scope function.vec2.u32, "uvm_report_enabled" "uvm_report_enabled" 6 39, 6 39 0, S_0x621588d73510; + .timescale -9 -9; +v0x621588e6f860_0 .var/str "id"; +v0x621588e6f940_0 .var/2u "severity", 1 0; +; Variable uvm_report_enabled is bool return value of scope S_0x621588e6f680 +v0x621588e6fb10_0 .var/2s "verbosity", 31 0; +TD_ivl_uvm_pkg.uvm_report_enabled ; + %load/vec4 v0x621588e6f940_0; + %load/str v0x621588e6f860_0; + %store/str v0x621588e59480_0; + %store/vec4 v0x621588e59540_0, 0, 2; + %callf/vec4 TD_ivl_uvm_pkg.get_report_verbosity_level, S_0x621588e591a0; + %load/vec4 v0x621588e6fb10_0; + %cmp/s; + %jmp/0xz T_78.123, 5; + %pushi/vec4 0, 0, 32; + %ret/vec4 0, 0, 32; Assign to uvm_report_enabled (store_vec4_to_lval) + %disable/flow S_0x621588e6f680; + %jmp T_78.124; +T_78.123 ; + %pushi/vec4 1, 0, 32; + %ret/vec4 0, 0, 32; Assign to uvm_report_enabled (store_vec4_to_lval) + %disable/flow S_0x621588e6f680; +T_78.124 ; + %end; +S_0x621588e6fbf0 .scope function.void, "uvm_report_error" "uvm_report_error" 7 127, 7 127 0, S_0x621588d73510; + .timescale -9 -9; +v0x621588e6fdd0_0 .var/str "filename"; +v0x621588e6feb0_0 .var/str "id"; +v0x621588e6ff70_0 .var/2s "line", 31 0; +v0x621588e70060_0 .var/str "message"; +v0x621588e70120_0 .var/str "msg_str"; +v0x621588e70230_0 .var/2s "verbosity", 31 0; +TD_ivl_uvm_pkg.uvm_report_error ; + %pushi/vec4 2, 0, 2; + %load/str v0x621588e6feb0_0; + %load/str v0x621588e70060_0; + %load/str v0x621588e6fdd0_0; + %load/vec4 v0x621588e6ff70_0; + %store/vec4 v0x621588e59ec0_0, 0, 32; + %store/str v0x621588e59c50_0; + %store/str v0x621588e5a0b0_0; + %store/str v0x621588e59d30_0; + %store/vec4 v0x621588e5a230_0, 0, 2; + %callf/str TD_ivl_uvm_pkg.ivl_uvm_compose_message, S_0x621588e59a70; + %store/str v0x621588e70120_0; + %callf/void TD_ivl_uvm_pkg.uvm_count_err, S_0x621588e62e50; + %vpi_call/w 7 139 "$display", v0x621588e70120_0 {0 0 0}; + %end; +S_0x621588e70310 .scope function.void, "uvm_report_fatal" "uvm_report_fatal" 7 174, 7 174 0, S_0x621588d73510; + .timescale -9 -9; +v0x621588e704f0_0 .var/str "filename"; +v0x621588e705d0_0 .var/str "id"; +v0x621588e70690_0 .var/2s "line", 31 0; +v0x621588e70750_0 .var/str "message"; +v0x621588e70810_0 .var/str "msg_str"; +v0x621588e70920_0 .var/2s "verbosity", 31 0; +TD_ivl_uvm_pkg.uvm_report_fatal ; + %pushi/vec4 3, 0, 2; + %load/str v0x621588e705d0_0; + %load/str v0x621588e70750_0; + %load/str v0x621588e704f0_0; + %load/vec4 v0x621588e70690_0; + %store/vec4 v0x621588e59ec0_0, 0, 32; + %store/str v0x621588e59c50_0; + %store/str v0x621588e5a0b0_0; + %store/str v0x621588e59d30_0; + %store/vec4 v0x621588e5a230_0, 0, 2; + %callf/str TD_ivl_uvm_pkg.ivl_uvm_compose_message, S_0x621588e59a70; + %store/str v0x621588e70810_0; + %callf/void TD_ivl_uvm_pkg.uvm_count_fatal, S_0x621588e63030; + %vpi_call/w 7 186 "$display", v0x621588e70810_0 {0 0 0}; + %callf/void TD_ivl_uvm_pkg.report_summarize, S_0x621588e5f510; + %vpi_call/w 7 188 "$finish", 32'sb00000000000000000000000000000010 {0 0 0}; + %end; +S_0x621588e70a00 .scope function.void, "uvm_report_info" "uvm_report_info" 7 87, 7 87 0, S_0x621588d73510; + .timescale -9 -9; +v0x621588e70be0_0 .var/str "filename"; +v0x621588e70cc0_0 .var/str "id"; +v0x621588e70d80_0 .var/2s "line", 31 0; +v0x621588e70e40_0 .var/str "message"; +v0x621588e70f00_0 .var/str "msg_str"; +v0x621588e71010_0 .var/2s "verbosity", 31 0; +TD_ivl_uvm_pkg.uvm_report_info ; + %pushi/vec4 0, 0, 2; + %load/str v0x621588e70cc0_0; + %load/str v0x621588e70e40_0; + %load/str v0x621588e70be0_0; + %load/vec4 v0x621588e70d80_0; + %store/vec4 v0x621588e59ec0_0, 0, 32; + %store/str v0x621588e59c50_0; + %store/str v0x621588e5a0b0_0; + %store/str v0x621588e59d30_0; + %store/vec4 v0x621588e5a230_0, 0, 2; + %callf/str TD_ivl_uvm_pkg.ivl_uvm_compose_message, S_0x621588e59a70; + %store/str v0x621588e70f00_0; + %callf/void TD_ivl_uvm_pkg.uvm_count_info, S_0x621588e63210; + %vpi_call/w 7 100 "$display", v0x621588e70f00_0 {0 0 0}; + %end; +S_0x621588e710f0 .scope class, "uvm_report_object" "uvm_report_object" 8 36, 8 36 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e71280 .scope autofunction.obj, "new" "new" 8 37, 8 37 0, S_0x621588e710f0; + .timescale -9 -9; +v0x621588e71480_0 .var/cobj "@"; +v0x621588e71560_0 .var/str "name"; +TD_ivl_uvm_pkg.uvm_report_object.new ; + %alloc S_0x621588e68830; + %load/obj v0x621588e71480_0; + %load/str v0x621588e71560_0; + %store/str v0x621588e68af0_0; + %store/obj v0x621588e68a10_0; + %callf/obj TD_ivl_uvm_pkg.uvm_object.new, S_0x621588e68830; + %load/obj v0x621588e68a10_0; + %free S_0x621588e68830; + %store/obj v0x621588e71480_0; + %end; +S_0x621588e71620 .scope function.void, "uvm_report_warning" "uvm_report_warning" 7 106, 7 106 0, S_0x621588d73510; + .timescale -9 -9; +v0x621588e71800_0 .var/str "filename"; +v0x621588e718e0_0 .var/str "id"; +v0x621588e719a0_0 .var/2s "line", 31 0; +v0x621588e71a60_0 .var/str "message"; +v0x621588e71b20_0 .var/str "msg_str"; +v0x621588e71c30_0 .var/2s "verbosity", 31 0; +TD_ivl_uvm_pkg.uvm_report_warning ; + %pushi/vec4 1, 0, 2; + %load/str v0x621588e718e0_0; + %load/str v0x621588e71a60_0; + %load/str v0x621588e71800_0; + %load/vec4 v0x621588e719a0_0; + %store/vec4 v0x621588e59ec0_0, 0, 32; + %store/str v0x621588e59c50_0; + %store/str v0x621588e5a0b0_0; + %store/str v0x621588e59d30_0; + %store/vec4 v0x621588e5a230_0, 0, 2; + %callf/str TD_ivl_uvm_pkg.ivl_uvm_compose_message, S_0x621588e59a70; + %store/str v0x621588e71b20_0; + %callf/void TD_ivl_uvm_pkg.uvm_count_warn, S_0x621588e633f0; + %vpi_call/w 7 119 "$display", v0x621588e71b20_0 {0 0 0}; + %end; +S_0x621588e71d10 .scope class, "uvm_sequence_item" "uvm_sequence_item" 8 27, 8 27 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e71ea0 .scope autofunction.obj, "new" "new" 8 30, 8 30 0, S_0x621588e71d10; + .timescale -9 -9; +v0x621588e720a0_0 .var/cobj "@"; +v0x621588e72180_0 .var/str "name"; +TD_ivl_uvm_pkg.uvm_sequence_item.new ; + %alloc S_0x621588e68830; + %load/obj v0x621588e720a0_0; + %load/str v0x621588e72180_0; + %store/str v0x621588e68af0_0; + %store/obj v0x621588e68a10_0; + %callf/obj TD_ivl_uvm_pkg.uvm_object.new, S_0x621588e68830; + %load/obj v0x621588e68a10_0; + %free S_0x621588e68830; + %store/obj v0x621588e720a0_0; + %end; +S_0x621588e72240 .scope class, "uvm_status_container" "uvm_status_container" 6 149, 6 149 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e723d0 .scope class, "uvm_test" "uvm_test" 8 101, 8 101 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e72560 .scope autofunction.obj, "new" "new" 8 102, 8 102 0, S_0x621588e723d0; + .timescale -9 -9; +v0x621588e72760_0 .var/cobj "@"; +v0x621588e72840_0 .var/str "name"; +v0x621588e72900_0 .var/cobj "parent"; +TD_ivl_uvm_pkg.uvm_test.new ; + %alloc S_0x621588e61de0; + %load/obj v0x621588e72760_0; + %load/str v0x621588e72840_0; + %load/obj v0x621588e72900_0; + %store/obj v0x621588e62160_0; + %store/str v0x621588e620a0_0; + %store/obj v0x621588e61fc0_0; + %callf/obj TD_ivl_uvm_pkg.uvm_component.new, S_0x621588e61de0; + %load/obj v0x621588e61fc0_0; + %free S_0x621588e61de0; + %store/obj v0x621588e72760_0; + %pushi/vec4 200, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_85.125, 4; + %alloc S_0x621588e6d420; + %load/obj v0x621588e72760_0; + %store/obj v0x621588e6d600_0; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6d7a0_0; + %pushi/str "%m"; + %store/str v0x621588e6d920_0; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e6daf0_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_comps.svh"; + %store/str v0x621588e6d6e0_0; + %pushi/vec4 104, 0, 32; + %store/vec4 v0x621588e6d840_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_report_info, S_0x621588e6d420; + %free S_0x621588e6d420; + %alloc S_0x621588e6bd00; + %load/obj v0x621588e72760_0; + %store/obj v0x621588e6bee0_0; + %callf/void TD_ivl_uvm_pkg.uvm_object.uvm_count_info, S_0x621588e6bd00; + %free S_0x621588e6bd00; +T_85.125 ; + %end; +S_0x621588e729a0 .scope class, "uvm_void" "uvm_void" 12 37, 12 37 0, S_0x621588d73510; + .timescale -9 -9; +S_0x621588e24300 .scope module, "ivl_uvm_cmdline_processor" "ivl_uvm_cmdline_processor" 3 49; + .timescale -9 -9; +v0x621588e77260_0 .var/queue "ivl_uvm_clp_args", 1; +v0x621588e77320_0 .var/queue "m_argv", 1; +v0x621588e773e0_0 .var/queue "m_plus_argv", 1; +v0x621588e774b0_0 .var/queue "m_uvm_argv", 1; +S_0x621588e73620 .scope function.vec2.u32, "get_arg_matches" "get_arg_matches" 3 130, 3 130 0, S_0x621588e24300; + .timescale -9 -9; +; Variable get_arg_matches is bool return value of scope S_0x621588e73620 +v0x621588e738d0_0 .var/str "match"; +v0x621588e73990_0 .var/queue "unused_args", 1; +TD_ivl_uvm_cmdline_processor.get_arg_matches ; + %vpi_func 3 158 "$size" 32, v0x621588e77260_0 {0 0 0}; + %ret/vec4 0, 0, 32; Assign to get_arg_matches (store_vec4_to_lval) + %disable/flow S_0x621588e73620; + %end; +S_0x621588e73a30 .scope function.vec2.u32, "get_arg_value" "get_arg_value" 3 172, 3 172 0, S_0x621588e24300; + .timescale -9 -9; +v0x621588e73ef0_0 .var/2s "chars", 31 0; +; Variable get_arg_value is bool return value of scope S_0x621588e73a30 +v0x621588e740d0_0 .var/2s "lv_argv_len", 31 0; +v0x621588e741c0_0 .var/str "lv_argv_s"; +v0x621588e74280_0 .var/str "lv_argv_substr"; +v0x621588e74390_0 .var/2s "lv_len_1", 31 0; +v0x621588e74470_0 .var/str "lv_val_s"; +v0x621588e74530_0 .var/str "match"; +v0x621588e745f0_0 .var/str "value"; +TD_ivl_uvm_cmdline_processor.get_arg_value ; + %vpi_func 0 0 "$ivl_string_method$len" 32, v0x621588e74530_0 {0 0 0}; + %store/vec4 v0x621588e73ef0_0, 0, 32; + %pushi/vec4 0, 0, 32; + %ret/vec4 0, 0, 32; Assign to get_arg_value (store_vec4_to_lval) + %fork t_13, S_0x621588e73c10; + %jmp t_12; + .scope S_0x621588e73c10; +t_13 ; + %vpi_func 3 182 "$low" 32, v0x621588e77320_0 {0 0 0}; + %store/vec4 v0x621588e73df0_0, 0, 32; +T_87.127 ; + %load/vec4 v0x621588e73df0_0; + %vpi_func 3 182 "$high" 32, v0x621588e77320_0 {0 0 0}; + %cmp/s; + %flag_or 5, 4; + %jmp/0xz T_87.128, 5; + %ix/getv/s 3, v0x621588e73df0_0; + %load/dar/str v0x621588e77320_0; + %store/str v0x621588e741c0_0; + %vpi_func 0 0 "$ivl_string_method$len" 32, v0x621588e741c0_0 {0 0 0}; + %store/vec4 v0x621588e740d0_0, 0, 32; + %load/vec4 v0x621588e73ef0_0; + %load/vec4 v0x621588e740d0_0; + %cmp/s; + %flag_or 5, 4; + %jmp/0xz T_87.129, 5; + %load/str v0x621588e741c0_0; + %ix/load 4, 0, 0; + %flag_set/imm 4, 0; + %load/vec4 v0x621588e73ef0_0; + %subi 1, 0, 32; + %cast2; + %ix/vec4/s 5; + %substr 4, 5; + %store/str v0x621588e74280_0; + %load/str v0x621588e74280_0; + %load/str v0x621588e74530_0; + %cmp/str; + %flag_get/vec4 4; + %flag_set/vec4 8; + %jmp/0xz T_87.131, 8; + ; show_stmt_assign_vector: Get l-value for compressed += operand + %retload/vec4 0; + %pushi/vec4 1, 0, 32; + %add; + %cast2; + %ret/vec4 0, 0, 32; + %retload/vec4 0; Load get_arg_value (draw_signal_vec4) + %cmpi/e 1, 0, 32; + %jmp/0xz T_87.133, 4; + %vpi_func 0 0 "$ivl_string_method$len" 32, v0x621588e741c0_0 {0 0 0}; + %subi 1, 0, 32; + %cast2; + %store/vec4 v0x621588e74390_0, 0, 32; + %load/str v0x621588e741c0_0; + %ix/getv/s 4, v0x621588e73ef0_0; + %ix/getv/s 5, v0x621588e74390_0; + %substr 4, 5; + %store/str v0x621588e74470_0; +T_87.133 ; +T_87.131 ; +T_87.129 ; + ; show_stmt_assign_vector: Get l-value for compressed += operand + %load/vec4 v0x621588e73df0_0; + %pushi/vec4 1, 0, 32; + %add; + %cast2; + %store/vec4 v0x621588e73df0_0, 0, 32; + %jmp T_87.127; +T_87.128 ; + %end; + .scope S_0x621588e73a30; +t_12 %join; + %end; +S_0x621588e73c10 .scope begin, "$ivl_foreach0" "$ivl_foreach0" 3 182, 3 182 0, S_0x621588e73a30; + .timescale -9 -9; +v0x621588e73df0_0 .var/2s "i", 31 0; +S_0x621588e74740 .scope function.vec2.u32, "get_arg_values" "get_arg_values" 3 225, 3 225 0, S_0x621588e24300; + .timescale -9 -9; +v0x621588e748d0_0 .var/2s "chars", 31 0; +; Variable get_arg_values is bool return value of scope S_0x621588e74740 +v0x621588e74a90_0 .var/str "match"; +v0x621588e74b60_0 .var/queue "values", 1; +TD_ivl_uvm_cmdline_processor.get_arg_values ; + %vpi_func 0 0 "$ivl_string_method$len" 32, v0x621588e74a90_0 {0 0 0}; + %store/vec4 v0x621588e748d0_0, 0, 32; + %delete/obj v0x621588e74b60_0; + %vpi_func 3 238 "$size" 32, v0x621588e74b60_0 {0 0 0}; + %ret/vec4 0, 0, 32; Assign to get_arg_values (store_vec4_to_lval) + %disable/flow S_0x621588e74740; + %end; +S_0x621588e74c00 .scope function.void, "get_args" "get_args" 3 78, 3 78 0, S_0x621588e24300; + .timescale -9 -9; +v0x621588e74de0_0 .var/queue "args", 1; +TD_ivl_uvm_cmdline_processor.get_args ; + %ix/load 4, 0, 0; + %load/obj v0x621588e77320_0; + %store/qobj/str v0x621588e77260_0, 4; + %end; +S_0x621588e74ea0 .scope function.void, "get_plusargs" "get_plusargs" 3 92, 3 92 0, S_0x621588e24300; + .timescale -9 -9; +v0x621588e750d0_0 .var/queue "args", 1; +TD_ivl_uvm_cmdline_processor.get_plusargs ; + %ix/load 4, 0, 0; + %load/obj v0x621588e773e0_0; + %store/qobj/str v0x621588e77260_0, 4; + %end; +S_0x621588e75190 .scope function.str, "get_tool_name" "get_tool_name" 3 248, 3 248 0, S_0x621588e24300; + .timescale -9 -9; +; Variable get_tool_name is string return value of scope S_0x621588e75190 +TD_ivl_uvm_cmdline_processor.get_tool_name ; + %callf/str TD_ivl_uvm_cmdline_processor.uvm_dpi_get_tool_name, S_0x621588e76ce0; + %ret/str 0; Assign to get_tool_name + %disable/flow S_0x621588e75190; + %end; +S_0x621588e75450 .scope function.str, "get_tool_version" "get_tool_version" 3 257, 3 257 0, S_0x621588e24300; + .timescale -9 -9; +; Variable get_tool_version is string return value of scope S_0x621588e75450 +TD_ivl_uvm_cmdline_processor.get_tool_version ; + %callf/str TD_ivl_uvm_cmdline_processor.uvm_dpi_get_tool_version, S_0x621588e76fa0; + %ret/str 0; Assign to get_tool_version + %disable/flow S_0x621588e75450; + %end; +S_0x621588e75710 .scope function.void, "get_uvm_args" "get_uvm_args" 3 104, 3 104 0, S_0x621588e24300; + .timescale -9 -9; +v0x621588e758f0_0 .var/queue "args", 1; +TD_ivl_uvm_cmdline_processor.get_uvm_args ; + %ix/load 4, 0, 0; + %load/obj v0x621588e774b0_0; + %store/qobj/str v0x621588e77260_0, 4; + %end; +S_0x621588e759b0 .scope function.void, "ivl_uvm_handle_clp_args" "ivl_uvm_handle_clp_args" 3 456, 3 456 0, S_0x621588e24300; + .timescale -9 -9; +v0x621588e75c20_0 .var/2s "lv_tmp_count", 31 0; +TD_ivl_uvm_cmdline_processor.ivl_uvm_handle_clp_args ; + %vpi_func 3 458 "$value$plusargs" 32, "UVM_MAX_QUIT_COUNT=%d", v0x621588e72d10_0 {0 0 0}; + %cast2; + %store/vec4 v0x621588e75c20_0, 0, 32; + %end; +S_0x621588e75d20 .scope function.vec2.s1, "m_convert_verb" "m_convert_verb" 3 434, 3 434 0, S_0x621588e24300; + .timescale -9 -9; +; Variable m_convert_verb is bool return value of scope S_0x621588e75d20 +v0x621588e75f90_0 .var/2s "verb_enum", 31 0; +v0x621588e76070_0 .var/str "verb_str"; +TD_ivl_uvm_cmdline_processor.m_convert_verb ; + %load/vec4 v0x621588e76070_0; + %dup/vec4; + %pushi/vec4 0, 0, 32; draw_string_vec4 + %pushi/vec4 20047, 0, 32; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %pushi/vec4 20037, 0, 16; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %cmp/u; + %jmp/1 T_95.135, 6; + %dup/vec4; + %pushi/vec4 21846, 0, 32; draw_string_vec4 + %pushi/vec4 1298091599, 0, 32; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %pushi/vec4 20037, 0, 16; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %cmp/u; + %jmp/1 T_95.136, 6; + %dup/vec4; + %pushi/vec4 0, 0, 32; draw_string_vec4 + %pushi/vec4 76, 0, 32; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %pushi/vec4 20311, 0, 16; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %cmp/u; + %jmp/1 T_95.137, 6; + %dup/vec4; + %pushi/vec4 85, 0, 32; draw_string_vec4 + %pushi/vec4 1447911244, 0, 32; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %pushi/vec4 20311, 0, 16; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %cmp/u; + %jmp/1 T_95.138, 6; + %dup/vec4; + %pushi/vec4 0, 0, 32; draw_string_vec4 + %pushi/vec4 1296385097, 0, 32; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %pushi/vec4 21837, 0, 16; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %cmp/u; + %jmp/1 T_95.139, 6; + %dup/vec4; + %pushi/vec4 1431719263, 0, 32; draw_string_vec4 + %pushi/vec4 1296385097, 0, 32; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %pushi/vec4 21837, 0, 16; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %cmp/u; + %jmp/1 T_95.140, 6; + %dup/vec4; + %pushi/vec4 0, 0, 32; draw_string_vec4 + %pushi/vec4 18505, 0, 32; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %pushi/vec4 18248, 0, 16; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %cmp/u; + %jmp/1 T_95.141, 6; + %dup/vec4; + %pushi/vec4 21846, 0, 32; draw_string_vec4 + %pushi/vec4 1298090057, 0, 32; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %pushi/vec4 18248, 0, 16; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %cmp/u; + %jmp/1 T_95.142, 6; + %dup/vec4; + %pushi/vec4 0, 0, 32; draw_string_vec4 + %pushi/vec4 18005, 0, 32; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %pushi/vec4 19532, 0, 16; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %cmp/u; + %jmp/1 T_95.143, 6; + %dup/vec4; + %pushi/vec4 21846, 0, 32; draw_string_vec4 + %pushi/vec4 1298089557, 0, 32; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %pushi/vec4 19532, 0, 16; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %cmp/u; + %jmp/1 T_95.144, 6; + %dup/vec4; + %pushi/vec4 0, 0, 32; draw_string_vec4 + %pushi/vec4 4474178, 0, 32; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %pushi/vec4 21831, 0, 16; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %cmp/u; + %jmp/1 T_95.145, 6; + %dup/vec4; + %pushi/vec4 5592653, 0, 32; draw_string_vec4 + %pushi/vec4 1598309698, 0, 32; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %pushi/vec4 21831, 0, 16; draw_string_vec4 + %concat/vec4; draw_string_vec4 + %cmp/u; + %jmp/1 T_95.146, 6; + %pushi/vec4 0, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.135 ; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e75f90_0, 0, 32; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.136 ; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e75f90_0, 0, 32; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.137 ; + %pushi/vec4 100, 0, 32; + %store/vec4 v0x621588e75f90_0, 0, 32; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.138 ; + %pushi/vec4 100, 0, 32; + %store/vec4 v0x621588e75f90_0, 0, 32; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.139 ; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e75f90_0, 0, 32; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.140 ; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e75f90_0, 0, 32; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.141 ; + %pushi/vec4 300, 0, 32; + %store/vec4 v0x621588e75f90_0, 0, 32; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.142 ; + %pushi/vec4 300, 0, 32; + %store/vec4 v0x621588e75f90_0, 0, 32; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.143 ; + %pushi/vec4 400, 0, 32; + %store/vec4 v0x621588e75f90_0, 0, 32; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.144 ; + %pushi/vec4 400, 0, 32; + %store/vec4 v0x621588e75f90_0, 0, 32; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.145 ; + %pushi/vec4 500, 0, 32; + %store/vec4 v0x621588e75f90_0, 0, 32; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.146 ; + %pushi/vec4 500, 0, 32; + %store/vec4 v0x621588e75f90_0, 0, 32; + %pushi/vec4 1, 0, 1; + %ret/vec4 0, 0, 1; Assign to m_convert_verb (store_vec4_to_lval) + %disable/flow S_0x621588e75d20; + %jmp T_95.148; +T_95.148 ; + %pop/vec4 1; + %end; +S_0x621588e76110 .scope function.void, "m_do_timeout_settings" "m_do_timeout_settings" 3 461, 3 461 0, S_0x621588e24300; + .timescale -9 -9; +v0x621588e76990_0 .var/str "timeout"; +v0x621588e76a70_0 .var/2s "timeout_count", 31 0; +v0x621588e76b50_0 .var "timeout_int", 63 0; +v0x621588e76c40_0 .var/queue "timeout_settings", 1; +TD_ivl_uvm_cmdline_processor.m_do_timeout_settings ; + %vpi_func 3 470 "$value$plusargs" 32, "UVM_TIMEOUT=%d", v0x621588e76b50_0 {0 0 0}; + %cast2; + %store/vec4 v0x621588e76a70_0, 0, 32; + %load/vec4 v0x621588e76a70_0; + %cmpi/e 0, 0, 32; + %jmp/0xz T_96.149, 4; + %pushi/vec4 1000000, 0, 64; + %store/vec4 v0x621588e72b30_0, 0, 64; + %pushi/vec4 1, 0, 64; + %store/vec4 v0x621588e76b50_0, 0, 64; + %jmp T_96.150; +T_96.149 ; + %ix/load 3, 0, 0; + %flag_set/imm 4, 0; + %load/dar/str v0x621588e76c40_0; + %store/str v0x621588e76990_0; + %vpi_func/s 3 477 "$sformatf", "%0d", v0x621588e76b50_0 {0 0 0}; + %store/str v0x621588e76990_0; + %load/vec4 v0x621588e76b50_0; + %cvt/rv; + %pushi/real 2048000000, 4085; load=1.00000e+06 + %mul/wr; + %cvt/vr 64; + %store/vec4 v0x621588e72b30_0, 0, 64; + %load/vec4 v0x621588e76a70_0; + %cmpi/s 1, 0, 32; + %flag_or 5, 4; GT is !LE + %flag_inv 5; + %jmp/0xz T_96.151, 5; + %fork t_15, S_0x621588e762f0; + %jmp t_14; + .scope S_0x621588e762f0; +t_15 ; + %fork t_17, S_0x621588e764f0; + %jmp t_16; + .scope S_0x621588e764f0; +t_17 ; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e766f0_0, 0, 32; +T_96.153 ; + %load/vec4 v0x621588e766f0_0; + %vpi_func 3 483 "$size" 32, v0x621588e76c40_0 {0 0 0}; + %cmp/s; + %jmp/0xz T_96.154, 5; + %load/vec4 v0x621588e766f0_0; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_96.155, 4; + %pushi/str "; "; + %store/str v0x621588e767f0_0; +T_96.155 ; + %load/str v0x621588e768d0_0; + %load/str v0x621588e767f0_0; + %concat/str; + %ix/getv/s 3, v0x621588e766f0_0; + %load/dar/str v0x621588e76c40_0; + %concat/str; + %store/str v0x621588e768d0_0; + ; show_stmt_assign_vector: Get l-value for compressed += operand + %load/vec4 v0x621588e766f0_0; + %pushi/vec4 1, 0, 32; + %add; + %cast2; + %store/vec4 v0x621588e766f0_0, 0, 32; + %jmp T_96.153; +T_96.154 ; + %end; + .scope S_0x621588e762f0; +t_16 %join; + %pushi/str "MULTTIMOUT"; + %store/str v0x621588e718e0_0; + %vpi_func/s 3 489 "$sformatf", "Multiple (%0d) +UVM_TIMEOUT arguments provided on the command line. '%s' will be used. Provided list: %s.", v0x621588e76a70_0, v0x621588e76990_0, v0x621588e768d0_0 {0 0 0}; + %store/str v0x621588e71a60_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e71c30_0, 0, 32; + %pushi/str ""; + %store/str v0x621588e71800_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e719a0_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_warning, S_0x621588e71620; + %end; + .scope S_0x621588e76110; +t_14 %join; +T_96.151 ; + %pushi/str "TIMOUTSET"; + %store/str v0x621588e70cc0_0; + %vpi_func/s 3 493 "$sformatf", "'+UVM_TIMEOUT=%s' provided on the command line is being applied.", v0x621588e76990_0 {0 0 0}; + %store/str v0x621588e70e40_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e71010_0, 0, 32; + %pushi/str ""; + %store/str v0x621588e70be0_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e70d80_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_info, S_0x621588e70a00; +T_96.150 ; + %load/vec4 v0x621588e76b50_0; + %load/vec4 v0x621588e72b30_0; + %mul; + %store/vec4 v0x621588e72b30_0, 0, 64; + %pushi/str "TIMOUTSET"; + %store/str v0x621588e70cc0_0; + %vpi_func/s 3 506 "$sformatf", "'+UVM_TIMEOUT=%0d' Global Timeout: %0t", v0x621588e76b50_0, v0x621588e72b30_0 {0 0 0}; + %store/str v0x621588e70e40_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e71010_0, 0, 32; + %pushi/str ""; + %store/str v0x621588e70be0_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e70d80_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_info, S_0x621588e70a00; + %end; +S_0x621588e762f0 .scope begin, "$unm_blk_62" "$unm_blk_62" 3 480, 3 480 0, S_0x621588e76110; + .timescale -9 -9; +v0x621588e767f0_0 .var/str "sep"; +v0x621588e768d0_0 .var/str "timeout_list"; +S_0x621588e764f0 .scope begin, "$ivl_for_loop0" "$ivl_for_loop0" 3 483, 3 483 0, S_0x621588e762f0; + .timescale -9 -9; +v0x621588e766f0_0 .var/2s "i", 31 0; +S_0x621588e76ce0 .scope function.str, "uvm_dpi_get_tool_name" "uvm_dpi_get_tool_name" 3 64, 3 64 0, S_0x621588e24300; + .timescale -9 -9; +; Variable uvm_dpi_get_tool_name is string return value of scope S_0x621588e76ce0 +TD_ivl_uvm_cmdline_processor.uvm_dpi_get_tool_name ; + %pushi/str "Icarus Verilog with IVL_UVM"; + %ret/str 0; Assign to uvm_dpi_get_tool_name + %disable/flow S_0x621588e76ce0; + %end; +S_0x621588e76fa0 .scope function.str, "uvm_dpi_get_tool_version" "uvm_dpi_get_tool_version" 3 60, 3 60 0, S_0x621588e24300; + .timescale -9 -9; +; Variable uvm_dpi_get_tool_version is string return value of scope S_0x621588e76fa0 +TD_ivl_uvm_cmdline_processor.uvm_dpi_get_tool_version ; + %pushi/str "Icarus Verilog version 12.0 (devel)"; + %ret/str 0; Assign to uvm_dpi_get_tool_version + %disable/flow S_0x621588e76fa0; + %end; +S_0x621588e24490 .scope module, "ivl_uvm_test_msg" "ivl_uvm_test_msg" 13 25; + .timescale -9 -9; +S_0x621588e77550 .scope begin, "test" "test" 13 32, 13 32 0, S_0x621588e24490; + .timescale -9 -9; +S_0x621588e24620 .scope module, "ivl_uvm_top" "ivl_uvm_top" 14 1; + .timescale -9 -9; + .scope S_0x621588e635d0; +T_99 ; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x621588e6e540_0, 0, 1; + %end; + .thread T_99; + .scope S_0x621588d73510; +T_100 ; + %pushi/vec4 1, 0, 1; + %store/vec4 v0x621588e733c0_0, 0, 1; + %pushi/vec4 4294967295, 0, 32; + %store/vec4 v0x621588e72d10_0, 0, 32; + %pushi/str "IVL_GO2UVM"; + %store/str v0x621588e72e00_0; + %end; + .thread T_100, $init; + .scope S_0x621588e24300; +T_101 ; + %vpi_call/w 3 514 "$timeformat", 32'sb11111111111111111111111111110111, 32'sb00000000000000000000000000000011, " ns", 32'sb00000000000000000000000000000011 {0 0 0}; + %delay 100, 0; + %pushi/vec4 200, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_101.0, 4; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e70cc0_0; + %pushi/str "CLP"; + %store/str v0x621588e70e40_0; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e71010_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_clp.svh"; + %store/str v0x621588e70be0_0; + %pushi/vec4 516, 0, 32; + %store/vec4 v0x621588e70d80_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_info, S_0x621588e70a00; + %callf/void TD_ivl_uvm_pkg.uvm_count_info, S_0x621588e63210; +T_101.0 ; + %callf/void TD_ivl_uvm_cmdline_processor.m_do_timeout_settings, S_0x621588e76110; + %callf/void TD_ivl_uvm_cmdline_processor.ivl_uvm_handle_clp_args, S_0x621588e759b0; + %load/vec4 v0x621588e72b30_0; + %muli 100, 0, 64; + %ix/vec4 4; + %delayx 4; + %pushi/vec4 0, 0, 32; + %pushi/vec4 2, 0, 2; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_101.2, 4; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6feb0_0; + %vpi_func/s 3 525 "$sformatf", "Reached Timeout value of: %0t ", v0x621588e72b30_0 {0 0 0}; + %store/str v0x621588e70060_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e70230_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_clp.svh"; + %store/str v0x621588e6fdd0_0; + %pushi/vec4 522, 0, 32; + %store/vec4 v0x621588e6ff70_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_error, S_0x621588e6fbf0; +T_101.2 ; + %pushi/vec4 200, 0, 32; + %pushi/vec4 0, 0, 2; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_101.4, 4; + %callf/str TD_ivl_uvm_pkg.get_name, S_0x621588e58f70; + %store/str v0x621588e70cc0_0; + %pushi/str "Ending the Simulation; Check for hanging threads/inactivity in your simulation run"; + %store/str v0x621588e70e40_0; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e71010_0, 0, 32; + %pushi/str "../../ivl_uvm_src/ivl_uvm_clp.svh"; + %store/str v0x621588e70be0_0; + %pushi/vec4 523, 0, 32; + %store/vec4 v0x621588e70d80_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_info, S_0x621588e70a00; + %callf/void TD_ivl_uvm_pkg.uvm_count_info, S_0x621588e63210; +T_101.4 ; + %vpi_call/w 3 525 "$finish", 32'sb00000000000000000000000000000010 {0 0 0}; + %end; + .thread T_101; + .scope S_0x621588e24300; +T_102 ; + %callf/void TD_ivl_uvm_pkg.report_summarize, S_0x621588e5f510; + %end; + .thread T_102, $final; + .scope S_0x621588e24490; +T_103 ; + %fork TD_ivl_uvm_pkg.run_test, S_0x621588e5fdd0; + %join; + %end; + .thread T_103; + .scope S_0x621588e24490; +T_104 ; + %fork t_19, S_0x621588e77550; + %jmp t_18; + .scope S_0x621588e77550; +t_19 ; + %delay 10000, 0; + %pushi/vec4 200, 0, 32; + %pushi/vec4 0, 0, 2; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_104.0, 4; + %pushi/str "IVL_UVM"; + %store/str v0x621588e70cc0_0; + %pushi/str "UVM_MEDIUM: Hello World"; + %store/str v0x621588e70e40_0; + %pushi/vec4 200, 0, 32; + %store/vec4 v0x621588e71010_0, 0, 32; + %pushi/str "../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv"; + %store/str v0x621588e70be0_0; + %pushi/vec4 34, 0, 32; + %store/vec4 v0x621588e70d80_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_info, S_0x621588e70a00; +T_104.0 ; + %pushi/vec4 300, 0, 32; + %pushi/vec4 0, 0, 2; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_104.2, 4; + %pushi/str "IVL_UVM"; + %store/str v0x621588e70cc0_0; + %pushi/str "UVM_HIGH: Hello World"; + %store/str v0x621588e70e40_0; + %pushi/vec4 300, 0, 32; + %store/vec4 v0x621588e71010_0, 0, 32; + %pushi/str "../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv"; + %store/str v0x621588e70be0_0; + %pushi/vec4 35, 0, 32; + %store/vec4 v0x621588e70d80_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_info, S_0x621588e70a00; +T_104.2 ; + %pushi/vec4 400, 0, 32; + %pushi/vec4 0, 0, 2; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_104.4, 4; + %pushi/str "IVL_UVM"; + %store/str v0x621588e70cc0_0; + %pushi/str "UVM_FULL: Hello World"; + %store/str v0x621588e70e40_0; + %pushi/vec4 400, 0, 32; + %store/vec4 v0x621588e71010_0, 0, 32; + %pushi/str "../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv"; + %store/str v0x621588e70be0_0; + %pushi/vec4 36, 0, 32; + %store/vec4 v0x621588e70d80_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_info, S_0x621588e70a00; +T_104.4 ; + %delay 10000, 0; + %pushi/vec4 0, 0, 32; + %pushi/vec4 0, 0, 2; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_104.6, 4; + %pushi/str "IVL_UVM"; + %store/str v0x621588e70cc0_0; + %pushi/str "NONE: Hello World"; + %store/str v0x621588e70e40_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e71010_0, 0, 32; + %pushi/str "../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv"; + %store/str v0x621588e70be0_0; + %pushi/vec4 37, 0, 32; + %store/vec4 v0x621588e70d80_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_info, S_0x621588e70a00; +T_104.6 ; + %delay 10000, 0; + %pushi/vec4 0, 0, 32; + %pushi/vec4 1, 0, 2; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_104.8, 4; + %pushi/str "IVL_UVM"; + %store/str v0x621588e718e0_0; + %pushi/str "Sample Warning!"; + %store/str v0x621588e71a60_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e71c30_0, 0, 32; + %pushi/str "../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv"; + %store/str v0x621588e71800_0; + %pushi/vec4 39, 0, 32; + %store/vec4 v0x621588e719a0_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_warning, S_0x621588e71620; +T_104.8 ; + %delay 10000, 0; + %pushi/vec4 0, 0, 32; + %pushi/vec4 2, 0, 2; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_104.10, 4; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6feb0_0; + %pushi/str "Sample Error!"; + %store/str v0x621588e70060_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e70230_0, 0, 32; + %pushi/str "../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv"; + %store/str v0x621588e6fdd0_0; + %pushi/vec4 40, 0, 32; + %store/vec4 v0x621588e6ff70_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_error, S_0x621588e6fbf0; +T_104.10 ; + %delay 10000, 0; + %pushi/vec4 0, 0, 32; + %pushi/vec4 2, 0, 2; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_104.12, 4; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6feb0_0; + %pushi/str "Sample Error!"; + %store/str v0x621588e70060_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e70230_0, 0, 32; + %pushi/str "../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv"; + %store/str v0x621588e6fdd0_0; + %pushi/vec4 41, 0, 32; + %store/vec4 v0x621588e6ff70_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_error, S_0x621588e6fbf0; +T_104.12 ; + %delay 10000, 0; + %pushi/vec4 0, 0, 32; + %pushi/vec4 2, 0, 2; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_104.14, 4; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6feb0_0; + %pushi/str "Sample Error!"; + %store/str v0x621588e70060_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e70230_0, 0, 32; + %pushi/str "../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv"; + %store/str v0x621588e6fdd0_0; + %pushi/vec4 42, 0, 32; + %store/vec4 v0x621588e6ff70_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_error, S_0x621588e6fbf0; +T_104.14 ; + %delay 10000, 0; + %pushi/vec4 0, 0, 32; + %pushi/vec4 3, 0, 2; + %pushi/str "IVL_UVM"; + %store/str v0x621588e6f860_0; + %store/vec4 v0x621588e6f940_0, 0, 2; + %store/vec4 v0x621588e6fb10_0, 0, 32; + %callf/vec4 TD_ivl_uvm_pkg.uvm_report_enabled, S_0x621588e6f680; + %cmpi/ne 0, 0, 32; + %jmp/0xz T_104.16, 4; + %pushi/str "IVL_UVM"; + %store/str v0x621588e705d0_0; + %pushi/str "Sample Fatal!"; + %store/str v0x621588e70750_0; + %pushi/vec4 0, 0, 32; + %store/vec4 v0x621588e70920_0, 0, 32; + %pushi/str "../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv"; + %store/str v0x621588e704f0_0; + %pushi/vec4 43, 0, 32; + %store/vec4 v0x621588e70690_0, 0, 32; + %callf/void TD_ivl_uvm_pkg.uvm_report_fatal, S_0x621588e70310; +T_104.16 ; + %end; + .scope S_0x621588e24490; +t_18 %join; + %end; + .thread T_104; + .scope S_0x621588e24620; +T_105 ; + %callf/void TD_ivl_uvm_pkg.report_summarize, S_0x621588e5f510; + %end; + .thread T_105, $final; +# The file index is used to find the file name in the following table. +:file_names 15; + "N/A"; + ""; + "-"; + "../../ivl_uvm_src/ivl_uvm_clp.svh"; + "../../ivl_uvm_src/ivl_uvm_pkg.sv"; + "../../ivl_uvm_src/base/uvm_object_globals.svh"; + "../../ivl_uvm_src/ivl_uvm_patches.svh"; + "../../ivl_uvm_src/ivl_uvm_msg.svh"; + "../../ivl_uvm_src/ivl_uvm_comps.svh"; + "../../ivl_uvm_src/ivl_uvm_mbx.svh"; + "../../ivl_uvm_src/ivl_uvm_tlm.svh"; + "../../ivl_uvm_src/base/uvm_object.svh"; + "../../ivl_uvm_src/base/uvm_misc.svh"; + "../../ivl_uvm_tests/ivl_uvm_test_0/ivl_uvm_test_msg.sv"; + "../../ivl_uvm_src/ivl_uvm_top.svh"; diff --git a/uvm/ivl_uvm_src/README.md b/uvm/ivl_uvm_src/README.md new file mode 100644 index 000000000..6e6dd3f0d --- /dev/null +++ b/uvm/ivl_uvm_src/README.md @@ -0,0 +1 @@ +Directory for IVL_UVM source code diff --git a/uvm/ivl_uvm_src/base/uvm_misc.svh b/uvm/ivl_uvm_src/base/uvm_misc.svh new file mode 100644 index 000000000..16e434f9a --- /dev/null +++ b/uvm/ivl_uvm_src/base/uvm_misc.svh @@ -0,0 +1,714 @@ +// +//------------------------------------------------------------------------------ +// Copyright 2007-2011 Mentor Graphics Corporation +// Copyright 2007-2011 Cadence Design Systems, Inc. +// Copyright 2010 Synopsys, Inc. +// All Rights Reserved Worldwide +// +// Licensed under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in +// writing, software distributed under the License is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See +// the License for the specific language governing +// permissions and limitations under the License. +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +// +// Topic: uvm_void +// +// The ~uvm_void~ class is the base class for all UVM classes. It is an abstract +// class with no data members or functions. It allows for generic containers of +// objects to be created, similar to a void pointer in the C programming +// language. User classes derived directly from ~uvm_void~ inherit none of the +// UVM functionality, but such classes may be placed in ~uvm_void~-typed +// containers along with other UVM objects. +// +//------------------------------------------------------------------------------ + +virtual class uvm_void; +endclass : uvm_void + +`ifndef IVL_UVM +// Append/prepend symbolic values for order-dependent APIs +typedef enum {UVM_APPEND, UVM_PREPEND} uvm_apprepend; + +// Forward declaration since scope stack uses uvm_objects now +typedef class uvm_object; + +//---------------------------------------------------------------------------- +// +// CLASS- uvm_scope_stack +// +//---------------------------------------------------------------------------- + +class uvm_scope_stack; + local string m_arg; + local string m_stack[$]; + + // depth + // ----- + + function int depth(); + return m_stack.size(); + endfunction + + + // scope + // ----- + + function string get(); + string v; + if(m_stack.size() == 0) return m_arg; + get = m_stack[0]; + for(int i=1; i"; + uvm_object_value_str.itoa(v.get_inst_id()); + uvm_object_value_str = {"@",uvm_object_value_str}; +endfunction + + +// Function- uvm_leaf_scope +// +// +function string uvm_leaf_scope (string full_name, byte scope_separator = "."); + byte bracket_match; + int pos; + int bmatches; + + bmatches = 0; + case(scope_separator) + "[": bracket_match = "]"; + "(": bracket_match = ")"; + "<": bracket_match = ">"; + "{": bracket_match = "}"; + default: bracket_match = ""; + endcase + + //Only use bracket matching if the input string has the end match + if(bracket_match != "" && bracket_match != full_name[full_name.len()-1]) + bracket_match = ""; + + for(pos=full_name.len()-1; pos!=0; --pos) begin + if(full_name[pos] == bracket_match) bmatches++; + else if(full_name[pos] == scope_separator) begin + bmatches--; + if(!bmatches || (bracket_match == "")) break; + end + end + if(pos) begin + if(scope_separator != ".") pos--; + uvm_leaf_scope = full_name.substr(pos+1,full_name.len()-1); + end + else begin + uvm_leaf_scope = full_name; + end +endfunction + + +// Function- uvm_vector_to_string +// +// +function string uvm_vector_to_string (uvm_bitstream_t value, int size, + uvm_radix_enum radix=UVM_NORADIX, + string radix_str=""); + + // sign extend & don't show radix for negative values + if (radix == UVM_DEC && value[size-1] === 1) + return $sformatf("%0d", value); + + value &= (1 << size)-1; + + case(radix) + UVM_BIN: return $sformatf("%0s%0b", radix_str, value); + UVM_OCT: return $sformatf("%0s%0o", radix_str, value); + UVM_UNSIGNED: return $sformatf("%0s%0d", radix_str, value); + UVM_STRING: return $sformatf("%0s%0s", radix_str, value); + UVM_TIME: return $sformatf("%0s%0t", radix_str, value); + UVM_DEC: return $sformatf("%0s%0d", radix_str, value); + default: return $sformatf("%0s%0x", radix_str, value); + endcase +endfunction + + +// Function- uvm_get_array_index_int +// +// The following functions check to see if a string is representing an array +// index, and if so, what the index is. + +function int uvm_get_array_index_int(string arg, output bit is_wildcard); + int i; + uvm_get_array_index_int = 0; + is_wildcard = 1; + i = arg.len() - 1; + if(arg[i] == "]") + while(i > 0 && (arg[i] != "[")) begin + --i; + if((arg[i] == "*") || (arg[i] == "?")) i=0; + else if((arg[i] < "0") || (arg[i] > "9") && (arg[i] != "[")) begin + uvm_get_array_index_int = -1; //illegal integral index + i=0; + end + end + else begin + is_wildcard = 0; + return 0; + end + + if(i>0) begin + arg = arg.substr(i+1, arg.len()-2); + uvm_get_array_index_int = arg.atoi(); + is_wildcard = 0; + end +endfunction + + +// Function- uvm_get_array_index_string +// +// +function string uvm_get_array_index_string(string arg, output bit is_wildcard); + int i; + uvm_get_array_index_string = ""; + is_wildcard = 1; + i = arg.len() - 1; + if(arg[i] == "]") + while(i > 0 && (arg[i] != "[")) begin + if((arg[i] == "*") || (arg[i] == "?")) i=0; + --i; + end + if(i>0) begin + uvm_get_array_index_string = arg.substr(i+1, arg.len()-2); + is_wildcard = 0; + end +endfunction + + +// Function- uvm_is_array +// +// +function bit uvm_is_array(string arg); + return arg[arg.len()-1] == "]"; +endfunction + + +// Function- uvm_has_wildcard +// +// +function automatic bit uvm_has_wildcard (string arg); + uvm_has_wildcard = 0; + + //if it is a regex then return true + if( (arg.len() > 1) && (arg[0] == "/") && (arg[arg.len()-1] == "/") ) + return 1; + + //check if it has globs + foreach(arg[i]) + if( (arg[i] == "*") || (arg[i] == "+") || (arg[i] == "?") ) + uvm_has_wildcard = 1; + +endfunction + +//------------------------------------------------------------------------------ +// CLASS: uvm_utils +// +// This class contains useful template functions. +// +//------------------------------------------------------------------------------ + +typedef class uvm_component; +typedef class uvm_root; +typedef class uvm_object; + +class uvm_utils #(type TYPE=int, string FIELD="config"); + + typedef TYPE types_t[$]; + + // Function: find_all + // + // Recursively finds all component instances of the parameter type ~TYPE~, + // starting with the component given by ~start~. Uses . + + static function types_t find_all(uvm_component start); + uvm_component list[$]; + types_t types; + uvm_root top; + top = uvm_root::get(); + top.find_all("*",list,start); + foreach (list[i]) begin + TYPE typ; + if ($cast(typ,list[i])) + types.push_back(typ); + end + if (types.size() == 0) begin + `uvm_warning("find_type-no match",{"Instance of type '",TYPE::type_name, + " not found in component hierarchy beginning at ",start.get_full_name()}) + end + return types; + endfunction + + static function TYPE find(uvm_component start); + types_t types = find_all(start); + if (types.size() == 0) + return null; + if (types.size() > 1) begin + `uvm_warning("find_type-multi match",{"More than one instance of type '",TYPE::type_name, + " found in component hierarchy beginning at ",start.get_full_name()}) + return null; + end + return types[0]; + endfunction + + static function TYPE create_type_by_name(string type_name, string contxt); + uvm_object obj; + TYPE typ; + obj = factory.create_object_by_name(type_name,contxt,type_name); + if (!$cast(typ,obj)) + uvm_report_error("WRONG_TYPE",{"The type_name given '",type_name, + "' with context '",contxt,"' did not produce the expected type."}); + return typ; + endfunction + + + // Function: get_config + // + // This method gets the object config of type ~TYPE~ + // associated with component ~comp~. + // We check for the two kinds of error which may occur with this kind of + // operation. + + static function TYPE get_config(uvm_component comp, bit is_fatal); + uvm_object obj; + TYPE cfg; + + if (!comp.get_config_object(FIELD, obj, 0)) begin + if (is_fatal) + comp.uvm_report_fatal("NO_SET_CFG", {"no set_config to field '", FIELD, + "' for component '",comp.get_full_name(),"'"}, + UVM_MEDIUM, `uvm_file , `uvm_line ); + else + comp.uvm_report_warning("NO_SET_CFG", {"no set_config to field '", FIELD, + "' for component '",comp.get_full_name(),"'"}, + UVM_MEDIUM, `uvm_file , `uvm_line ); + return null; + end + + if (!$cast(cfg, obj)) begin + if (is_fatal) + comp.uvm_report_fatal( "GET_CFG_TYPE_FAIL", + {"set_config_object with field name ",FIELD, + " is not of type '",TYPE::type_name,"'"}, + UVM_NONE , `uvm_file , `uvm_line ); + else + comp.uvm_report_warning( "GET_CFG_TYPE_FAIL", + {"set_config_object with field name ",FIELD, + " is not of type '",TYPE::type_name,"'"}, + UVM_NONE , `uvm_file , `uvm_line ); + end + + return cfg; + endfunction +endclass + +`ifdef UVM_USE_PROCESS_CONTAINER +class process_container_c; + process p; + function new(process p_); + p=p_; + endfunction +endclass +`endif + +`endif // IVL_UVM + diff --git a/uvm/ivl_uvm_src/base/uvm_object.svh b/uvm/ivl_uvm_src/base/uvm_object.svh new file mode 100644 index 000000000..6c61118c8 --- /dev/null +++ b/uvm/ivl_uvm_src/base/uvm_object.svh @@ -0,0 +1,1133 @@ +// +//----------------------------------------------------------------------------- +// Copyright 2007-2011 Mentor Graphics Corporation +// Copyright 2007-2011 Cadence Design Systems, Inc. +// Copyright 2010 Synopsys, Inc. +// All Rights Reserved Worldwide +// +// Licensed under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in +// writing, software distributed under the License is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See +// the License for the specific language governing +// permissions and limitations under the License. +//----------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------ +// +// CLASS: uvm_object +// +// The uvm_object class is the base class for all UVM data and hierarchical +// classes. Its primary role is to define a set of methods for such common +// operations as , , , , and . Classes +// deriving from uvm_object must implement the pure virtual methods such as +// and . +// +//------------------------------------------------------------------------------ + + +virtual class uvm_object extends uvm_void; + + + local string m_leaf_name; + local int m_inst_id; + static protected int m_inst_count; + uvm_copy_map uvm_global_copy_map; + static /*protected*/ uvm_status_container __m_uvm_status_container;// = new; + uvm_printer uvm_default_printer; + + `ifdef IVL_UVM_I419 + // IVL_UVM issue 416,418 etc. + `include "ivl_uvm_msg.svh" + `endif + + + + // Function: new + // + // Creates a new uvm_object with the given instance ~name~. If ~name~ is not + // supplied, the object is unnamed. + +// new +// --- + +function new (string name = "uvm_object"); + + m_inst_id = m_inst_count++; + m_leaf_name = name; + uvm_global_copy_map = new(); + __m_uvm_status_container = new (); + uvm_default_printer = new();; +endfunction + + + // Group: Seeding + + // Variable: use_uvm_seeding + // + // This bit enables or disables the UVM seeding mechanism. It globally affects + // the operation of the reseed method. + // + // When enabled, UVM-based objects are seeded based on their type and full + // hierarchical name rather than allocation order. This improves random + // stability for objects whose instance names are unique across each type. + // The class is an example of a type that has a unique + // instance name. + + static bit use_uvm_seeding = 1; + + + // Function: reseed + // + // Calls ~srandom~ on the object to reseed the object using the UVM seeding + // mechanism, which sets the seed based on type name and instance name instead + // of based on instance position in a thread. + // + // If the static variable is set to 0, then reseed() does + // not perform any function. + +function void reseed (); + `ifndef IVL_UVM + if(use_uvm_seeding) + this.srandom(uvm_create_random_seed(get_type_name(), get_full_name())); +`endif // IVL_UVM +endfunction + + + + // Group: Identification + + // Function: set_name + // + // Sets the instance name of this object, overwriting any previously + // given name. + +function void set_name (string name); + m_leaf_name = name; +endfunction + + + + // Function: get_name + // + // Returns the name of the object, as provided by the ~name~ argument in the + // constructor or method. + +function string get_name (); + return m_leaf_name; +endfunction + + + + // Function: get_full_name + // + // Returns the full hierarchical name of this object. The default + // implementation is the same as , as uvm_objects do not inherently + // possess hierarchy. + // + // Objects possessing hierarchy, such as , override the default + // implementation. Other objects might be associated with component hierarchy + // but are not themselves components. For example, + // classes are typically associated with a . In this + // case, it is useful to override get_full_name to return the sequencer's + // full name concatenated with the sequence's name. This provides the sequence + // a full context, which is useful when debugging. + + +function string get_full_name (); + return get_name(); +endfunction + + + // Function: get_inst_id + // + // Returns the object's unique, numeric instance identifier. + +function int get_inst_id(); + return m_inst_id; +endfunction + + + + // Function: get_inst_count + // + // Returns the current value of the instance counter, which represents the + // total number of uvm_object-based objects that have been allocated in + // simulation. The instance counter is used to form a unique numeric instance + // identifier. + +function int get_inst_count(); + return m_inst_count; +endfunction + + + + // Function: get_type + // + // Returns the type-proxy (wrapper) for this object. The 's + // type-based override and creation methods take arguments of + // . This method, if implemented, can be used as convenient + // means of supplying those arguments. + // + // The default implementation of this method produces an error and returns + // null. To enable use of this method, a user's subtype must implement a + // version that returns the subtype's wrapper. + // + // For example: + // + //| class cmd extends uvm_object; + //| typedef uvm_object_registry #(cmd) type_id; + //| static function type_id get_type(); + //| return type_id::get(); + //| endfunction + //| endclass + // + // Then, to use: + // + //| factory.set_type_override(cmd::get_type(),subcmd::get_type()); + // + // This function is implemented by the `uvm_*_utils macros, if employed. + +function uvm_object_wrapper get_type(); + //TBD uvm_report_error("NOTYPID", "get_type not implemented in derived class.", UVM_NONE); + return null; +endfunction + + + + // Function: get_object_type + // + // Returns the type-proxy (wrapper) for this object. The 's + // type-based override and creation methods take arguments of + // . This method, if implemented, can be used as convenient + // means of supplying those arguments. This method is the same as the static + // method, but uses an already allocated object to determine + // the type-proxy to access (instead of using the static object). + // + // The default implementation of this method does a factory lookup of the + // proxy using the return value from . If the type returned + // by is not registered with the factory, then a null + // handle is returned. + // + // For example: + // + //| class cmd extends uvm_object; + //| typedef uvm_object_registry #(cmd) type_id; + //| static function type_id get_type(); + //| return type_id::get(); + //| endfunction + //| virtual function type_id get_object_type(); + //| return type_id::get(); + //| endfunction + //| endclass + // + // This function is implemented by the `uvm_*_utils macros, if employed. + +function uvm_object_wrapper get_object_type(); + if(get_type_name() == "") return null; + `ifndef IVL_UVM + return factory.find_by_name(get_type_name()); + `endif // IVL_UVM +endfunction + + + + + // Function: get_type_name + // + // This function returns the type name of the object, which is typically the + // type identifier enclosed in quotes. It is used for various debugging + // functions in the library, and it is used by the factory for creating + // objects. + // + // This function must be defined in every derived class. + // + // A typical implementation is as follows: + // + //| class mytype extends uvm_object; + //| ... + //| const static string type_name = "mytype"; + //| + //| virtual function string get_type_name(); + //| return type_name; + //| endfunction + // + // We define the ~type_name~ static variable to enable access to the type name + // without need of an object of the class, i.e., to enable access via the + // scope operator, ~mytype::type_name~. + + virtual function string get_type_name (); return ""; endfunction + + + // Group: Creation + + // Function: create + // + // The create method allocates a new object of the same type as this object + // and returns it via a base uvm_object handle. Every class deriving from + // uvm_object, directly or indirectly, must implement the create method. + // + // A typical implementation is as follows: + // + //| class mytype extends uvm_object; + //| ... + //| virtual function uvm_object create(string name=""); + //| mytype t = new(name); + //| return t; + //| endfunction + + virtual function uvm_object create (string name=""); + return null; + endfunction + + + + // Function: clone + // + // The clone method creates and returns an exact copy of this object. + // + // The default implementation calls followed by . As clone is + // virtual, derived classes may override this implementation if desired. + +function uvm_object clone(); + uvm_object tmp; + // IVL Issue 441 + /* + tmp = this.create(get_name()); + if(tmp == null) + uvm_report_warning("CRFLD", $sformatf("The create method failed for %s, object cannot be cloned", get_name()), UVM_NONE); + else + tmp.copy(this); + */ + return(tmp); +endfunction + + + // Group: Printing + + // Function: print + // + // The print method deep-prints this object's properties in a format and + // manner governed by the given ~printer~ argument; if the ~printer~ argument + // is not provided, the global is used. See + // for more information on printer output formatting. See also + // , , and for details + // on the pre-defined printer "policies," or formatters, provided by the UVM. + // + // The ~print~ method is not virtual and must not be overloaded. To include + // custom information in the ~print~ and ~sprint~ operations, derived classes + // must override the method and use the provided printer policy + // class to format the output. + +function void print(uvm_printer printer = null); + if (printer==null) + printer = uvm_default_printer; + if (printer == null) + `uvm_error("NULLPRINTER","uvm_default_printer is null"); + // TBD $fwrite(printer.knobs.mcd,sprint(printer)); + // $display (sprint()); +endfunction + + + // Function: sprint + // + // The ~sprint~ method works just like the method, except the output + // is returned in a string rather than displayed. + // + // The ~sprint~ method is not virtual and must not be overloaded. To include + // additional fields in the ~print~ and ~sprint~ operation, derived classes + // must override the method and use the provided printer policy + // class to format the output. The printer policy will manage all string + // concatenations and provide the string to ~sprint~ to return to the caller. + +function string sprint(uvm_printer printer =null); + bit p; + + if(printer==null) + printer = uvm_default_printer; + + /* IVL_UVM TBD + * Need printer class for this to work + // not at top-level, must be recursing into sub-object + if(!printer.istop()) begin + __m_uvm_status_container.printer = printer; + __m_uvm_field_automation(null, UVM_PRINT, ""); + do_print(printer); + return ""; + end + + printer.print_object(get_name(), this); + // backward compat with sprint knob: if used, + // print that, do not call emit() + if (printer.m_string != "") + return printer.m_string; + + return printer.emit(); + */ + return "IVL_UVM"; + +endfunction + + + // Function: do_print + // + // The ~do_print~ method is the user-definable hook called by and + // that allows users to customize what gets printed or sprinted + // beyond the field information provided by the `uvm_field_* macros, + // . + // + // The ~printer~ argument is the policy object that governs the format and + // content of the output. To ensure correct and operation, + // and to ensure a consistent output format, the ~printer~ must be used + // by all implementations. That is, instead of using ~$display~ or + // string concatenations directly, a ~do_print~ implementation must call + // through the ~printer's~ API to add information to be printed or sprinted. + // + // An example implementation of ~do_print~ is as follows: + // + //| class mytype extends uvm_object; + //| data_obj data; + //| int f1; + //| virtual function void do_print (uvm_printer printer); + //| super.do_print(printer); + //| printer.print_int("f1", f1, $bits(f1), DEC); + //| printer.print_object("data", data); + //| endfunction + // + // Then, to print and sprint the object, you could write: + // + //| mytype t = new; + //| t.print(); + //| uvm_report_info("Received",t.sprint()); + // + // See for information about the printer API. + + virtual function void do_print (uvm_printer printer); + return; +endfunction + + + // Function: convert2string + // + // This virtual function is a user-definable hook, called directly by the + // user, that allows users to provide object information in the form of + // a string. Unlike , there is no requirement to use an + // policy object. As such, the format and content of the output is fully + // customizable, which may be suitable for applications not requiring the + // consistent formatting offered by the // + // API. + // + // Fields declared in macros (`uvm_field_*), if used, will + // not automatically appear in calls to convert2string. + // + // An example implementation of convert2string follows. + // + //| class base extends uvm_object; + //| string field = "foo"; + //| virtual function string convert2string(); + //| convert2string = {"base_field=",field}; + //| endfunction + //| endclass + //| + //| class obj2 extends uvm_object; + //| string field = "bar"; + //| virtual function string convert2string(); + //| convert2string = {"child_field=",field}; + //| endfunction + //| endclass + //| + //| class obj extends base; + //| int addr = 'h123; + //| int data = 'h456; + //| bit write = 1; + //| obj2 child = new; + //| virtual function string convert2string(); + //| convert2string = {super.convert2string(), + //| $sformatf(" write=%0d addr=%8h data=%8h ",write,addr,data), + //| child.convert2string()}; + //| endfunction + //| endclass + // + // Then, to display an object, you could write: + // + //| obj o = new; + //| uvm_report_info("BusMaster",{"Sending:\n ",o.convert2string()}); + // + // The output will look similar to: + // + //| UVM_INFO @ 0: reporter [BusMaster] Sending: + //| base_field=foo write=1 addr=00000123 data=00000456 child_field=bar + + +function string convert2string(); + return ""; +endfunction + + + + // Group: Recording + + // Function: record + // + // The record method deep-records this object's properties according to an + // optional ~recorder~ policy. The method is not virtual and must not be + // overloaded. To include additional fields in the record operation, derived + // classes should override the method. + // + // The optional ~recorder~ argument specifies the recording policy, which + // governs how recording takes place. If a recorder policy is not provided + // explicitly, then the global policy is used. See + // uvm_recorder for information. + // + // A simulator's recording mechanism is vendor-specific. By providing access + // via a common interface, the uvm_recorder policy provides vendor-independent + // access to a simulator's recording capabilities. + + function void record (uvm_recorder recorder =null); + + /* IVL_UVM TBD + if(recorder == null) + recorder = uvm_default_recorder; + + if(!recorder.tr_handle) return; + + __m_uvm_status_container.recorder = recorder; + recorder.recording_depth++; + __m_uvm_field_automation(null, UVM_RECORD, ""); + do_record(recorder); + + recorder.recording_depth--; + + if(recorder.recording_depth==0) begin + recorder.tr_handle = 0; + end + */ +endfunction + + + // Function: do_record + // + // The do_record method is the user-definable hook called by the + // method. A derived class should override this method to include its fields + // in a record operation. + // + // The ~recorder~ argument is policy object for recording this object. A + // do_record implementation should call the appropriate recorder methods for + // each of its fields. Vendor-specific recording implementations are + // encapsulated in the ~recorder~ policy, thereby insulating user-code from + // vendor-specific behavior. See for more information. + // + // A typical implementation is as follows: + // + //| class mytype extends uvm_object; + //| data_obj data; + //| int f1; + //| function void do_record (uvm_recorder recorder); + //| recorder.record_field_int("f1", f1, $bits(f1), DEC); + //| recorder.record_object("data", data); + //| endfunction + + virtual function void do_record (uvm_recorder recorder); + return; +endfunction + + + // Group: Copying + + // Function: copy + // + // The copy makes this object a copy of the specified object. + // + // The copy method is not virtual and should not be overloaded in derived + // classes. To copy the fields of a derived class, that class should override + // the method. + + function void copy (uvm_object rhs); + /* IVL_UVM TBD + //For cycle checking + static int depth; + if((rhs !=null) && (uvm_global_copy_map.get(rhs) != null)) begin + return; + end + + if(rhs==null) begin + uvm_report_warning("NULLCP", "A null object was supplied to copy; copy is ignored", UVM_NONE); + return; + end + + uvm_global_copy_map.set(rhs, this); + ++depth; + + __m_uvm_field_automation(rhs, UVM_COPY, ""); + do_copy(rhs); + + --depth; + if(depth==0) begin + uvm_global_copy_map.clear(); + end + */ +endfunction + + + // Function: do_copy + // + // The do_copy method is the user-definable hook called by the copy method. + // A derived class should override this method to include its fields in a copy + // operation. + // + // A typical implementation is as follows: + // + //| class mytype extends uvm_object; + //| ... + //| int f1; + //| function void do_copy (uvm_object rhs); + //| mytype rhs_; + //| super.do_copy(rhs); + //| $cast(rhs_,rhs); + //| field_1 = rhs_.field_1; + //| endfunction + // + // The implementation must call ~super.do_copy~, and it must $cast the rhs + // argument to the derived type before copying. + + virtual function void do_copy (uvm_object rhs); + return; +endfunction + + + + // Group: Comparing + + // Function: compare + // + // Deep compares members of this data object with those of the object provided + // in the ~rhs~ (right-hand side) argument, returning 1 on a match, 0 othewise. + // + // The compare method is not virtual and should not be overloaded in derived + // classes. To compare the fields of a derived class, that class should + // override the method. + // + // The optional ~comparer~ argument specifies the comparison policy. It allows + // you to control some aspects of the comparison operation. It also stores the + // results of the comparison, such as field-by-field miscompare information + // and the total number of miscompares. If a compare policy is not provided, + // then the global ~uvm_default_comparer~ policy is used. See + // for more information. + + function bit compare (uvm_object rhs, uvm_comparer comparer = null); + /* IVL_UVM TBD + bit t, dc; + static int style; + bit done; + done = 0; + if(comparer != null) + __m_uvm_status_container.comparer = comparer; + else + __m_uvm_status_container.comparer = uvm_default_comparer; + comparer = __m_uvm_status_container.comparer; + + if(!__m_uvm_status_container.scope.depth()) begin + comparer.compare_map.clear(); + comparer.result = 0; + comparer.miscompares = ""; + comparer.scope = __m_uvm_status_container.scope; + if(get_name() == "") + __m_uvm_status_container.scope.down(""); + else + __m_uvm_status_container.scope.down(this.get_name()); + end + if(!done && (rhs == null)) begin + if(__m_uvm_status_container.scope.depth()) begin + comparer.print_msg_object(this, rhs); + end + else begin + comparer.print_msg_object(this, rhs); + uvm_report_info("MISCMP", + $sformatf("%0d Miscompare(s) for object %s@%0d vs. null", + comparer.result, + __m_uvm_status_container.scope.get(), + this.get_inst_id()), + __m_uvm_status_container.comparer.verbosity); + done = 1; + end + end + + if(!done && (comparer.compare_map.get(rhs) != null)) begin + if(comparer.compare_map.get(rhs) != this) begin + comparer.print_msg_object(this, comparer.compare_map.get(rhs)); + end + done = 1; //don't do any more work after this case, but do cleanup + end + + if(!done && comparer.check_type && (rhs != null) && (get_type_name() != rhs.get_type_name())) begin + __m_uvm_status_container.stringv = { "lhs type = \"", get_type_name(), + "\" : rhs type = \"", rhs.get_type_name(), "\""}; + comparer.print_msg(__m_uvm_status_container.stringv); + end + + if(!done) begin + comparer.compare_map.set(rhs, this); + __m_uvm_field_automation(rhs, UVM_COMPARE, ""); + dc = do_compare(rhs, comparer); + end + + if(__m_uvm_status_container.scope.depth()==1) begin + __m_uvm_status_container.scope.up(); + end + + if(rhs != null) + comparer.print_rollup(this, rhs); + return (comparer.result == 0 && dc == 1); + */ +endfunction + + + // Function: do_compare + // + // The do_compare method is the user-definable hook called by the + // method. A derived class should override this method to include its fields + // in a compare operation. It should return 1 if the comparison succeeds, 0 + // otherwise. + // + // A typical implementation is as follows: + // + //| class mytype extends uvm_object; + //| ... + //| int f1; + //| virtual function bit do_compare (uvm_object rhs,uvm_comparer comparer); + //| mytype rhs_; + //| do_compare = super.do_compare(rhs,comparer); + //| $cast(rhs_,rhs); + //| do_compare &= comparer.compare_field_int("f1", f1, rhs_.f1); + //| endfunction + // + // A derived class implementation must call ~super.do_compare()~ to ensure its + // base class' properties, if any, are included in the comparison. Also, the + // rhs argument is provided as a generic uvm_object. Thus, you must ~$cast~ it + // to the type of this object before comparing. + // + // The actual comparison should be implemented using the uvm_comparer object + // rather than direct field-by-field comparison. This enables users of your + // class to customize how comparisons are performed and how much miscompare + // information is collected. See uvm_comparer for more details. + + virtual function bit do_compare (uvm_object rhs, + uvm_comparer comparer); + return 1; +endfunction + + + + // Group: Configuration + + // Function: set_int_local + + virtual function void set_int_local (string field_name, + uvm_bitstream_t value, + bit recurse=1); + + /* IVL_UVM TBD + __m_uvm_status_container.cycle_check.delete(); + __m_uvm_status_container.m_uvm_cycle_scopes.delete(); + + this.__m_uvm_status_container.status = 0; + this.__m_uvm_status_container.bitstream = value; + + __m_uvm_field_automation(null, UVM_SETINT, field_name); + + if(__m_uvm_status_container.warning && !this.__m_uvm_status_container.status) begin + uvm_report_error("NOMTC", $sformatf("did not find a match for field %s", field_name),UVM_NONE); + end + __m_uvm_status_container.cycle_check.delete(); + */ +endfunction + + + // Function: set_string_local + + virtual function void set_string_local (string field_name, + string value, + bit recurse=1); + /* IVL_UVM TBD + __m_uvm_status_container.cycle_check.delete(); + __m_uvm_status_container.m_uvm_cycle_scopes.delete(); + + this.__m_uvm_status_container.status = 0; + this.__m_uvm_status_container.stringv = value; + + __m_uvm_field_automation(null, UVM_SETSTR, field_name); + + if(__m_uvm_status_container.warning && !this.__m_uvm_status_container.status) begin + uvm_report_error("NOMTC", $sformatf("did not find a match for field %s (@%0d)", field_name, this.get_inst_id()), UVM_NONE); + end + __m_uvm_status_container.cycle_check.delete(); + */ +endfunction + + // Function: set_object_local + // + // These methods provide write access to integral, string, and + // uvm_object-based properties indexed by a ~field_name~ string. The object + // designer choose which, if any, properties will be accessible, and overrides + // the appropriate methods depending on the properties' types. For objects, + // the optional ~clone~ argument specifies whether to clone the ~value~ + // argument before assignment. + // + // The global function is used to match the field names, so + // ~field_name~ may contain wildcards. + // + // An example implementation of all three methods is as follows. + // + //| class mytype extends uvm_object; + //| + //| local int myint; + //| local byte mybyte; + //| local shortint myshort; // no access + //| local string mystring; + //| local obj_type myobj; + //| + //| // provide access to integral properties + //| function void set_int_local(string field_name, uvm_bitstream_t value); + //| if (uvm_is_match (field_name, "myint")) + //| myint = value; + //| else if (uvm_is_match (field_name, "mybyte")) + //| mybyte = value; + //| endfunction + //| + //| // provide access to string properties + //| function void set_string_local(string field_name, string value); + //| if (uvm_is_match (field_name, "mystring")) + //| mystring = value; + //| endfunction + //| + //| // provide access to sub-objects + //| function void set_object_local(string field_name, uvm_object value, + //| bit clone=1); + //| if (uvm_is_match (field_name, "myobj")) begin + //| if (value != null) begin + //| obj_type tmp; + //| // if provided value is not correct type, produce error + //| if (!$cast(tmp, value) ) + //| /* error */ + //| else begin + //| if(clone) + //| $cast(myobj, tmp.clone()); + //| else + //| myobj = tmp; + //| end + //| end + //| else + //| myobj = null; // value is null, so simply assign null to myobj + //| end + //| endfunction + //| ... + // + // Although the object designer implements these methods to provide outside + // access to one or more properties, they are intended for internal use (e.g., + // for command-line debugging and auto-configuration) and should not be called + // directly by the user. + + virtual function void set_object_local (string field_name, + uvm_object value, + bit clone=1, + bit recurse=1); + + /* IVL_UVM TBD + uvm_object cc; + __m_uvm_status_container.cycle_check.delete(); + __m_uvm_status_container.m_uvm_cycle_scopes.delete(); + + if(clone && (value!=null)) begin + cc = value.clone(); + if(cc != null) cc.set_name(field_name); + value = cc; + end + + this.__m_uvm_status_container.status = 0; + this.__m_uvm_status_container.object = value; + __m_uvm_status_container.clone = clone; + + __m_uvm_field_automation(null, UVM_SETOBJ, field_name); + + if(__m_uvm_status_container.warning && !this.__m_uvm_status_container.status) begin + uvm_report_error("NOMTC", $sformatf("did not find a match for field %s", field_name), UVM_NONE); + end + __m_uvm_status_container.cycle_check.delete(); + */ +endfunction + + virtual function uvm_report_object m_get_report_object(); + return null; + endfunction + + `ifndef IVL_UVM + //--------------------------------------------------------------------------- + // **** Internal Methods and Properties *** + // Do not use directly + //--------------------------------------------------------------------------- + + local function void m_pack (uvm_packer packer); + if(packer!=null) + __m_uvm_status_container.packer = packer; + else + __m_uvm_status_container.packer = uvm_default_packer; + packer = __m_uvm_status_container.packer; + + packer.reset(); + packer.scope.down(get_name()); + + __m_uvm_field_automation(null, UVM_PACK, ""); + do_pack(packer); + + packer.set_packed_size(); + + packer.scope.up(); + +endfunction + + local function void m_unpack_pre (uvm_packer packer); + if(packer!=null) + __m_uvm_status_container.packer = packer; + else + __m_uvm_status_container.packer = uvm_default_packer; + packer = __m_uvm_status_container.packer; + packer.reset(); +endfunction + + local function void m_unpack_post (uvm_packer packer); + int provided_size; + + provided_size = packer.get_packed_size(); + + //Put this object into the hierarchy + packer.scope.down(get_name()); + + __m_uvm_field_automation(null, UVM_UNPACK, ""); + + do_unpack(packer); + + //Scope back up before leaving + packer.scope.up(); + + if(packer.get_packed_size() != provided_size) begin + uvm_report_warning("BDUNPK", $sformatf("Unpack operation unsuccessful: unpacked %0d bits from a total of %0d bits", packer.get_packed_size(), provided_size), UVM_NONE); + end + +endfunction + + + virtual function void __m_uvm_field_automation (uvm_object tmp_data__, + int what__, + string str__); + return; +endfunction + + // Group: Packing + + // Function: pack + + function int pack (`IVL_UVM_REF bit bitstream[], + input uvm_packer packer=null); + m_pack(packer); + packer.get_bits(bitstream); + return packer.get_packed_size(); +endfunction + + // Function: pack_bytes + + function int pack_bytes (`IVL_UVM_REF byte unsigned bytestream[], + input uvm_packer packer=null); + m_pack(packer); + packer.get_bytes(bytestream); + return packer.get_packed_size(); +endfunction + + // Function: pack_ints + // + // The pack methods bitwise-concatenate this object's properties into an array + // of bits, bytes, or ints. The methods are not virtual and must not be + // overloaded. To include additional fields in the pack operation, derived + // classes should override the method. + // + // The optional ~packer~ argument specifies the packing policy, which governs + // the packing operation. If a packer policy is not provided, the global + // policy is used. See for more information. + // + // The return value is the total number of bits packed into the given array. + // Use the array's built-in ~size~ method to get the number of bytes or ints + // consumed during the packing process. + + function int pack_ints (`IVL_UVM_REF int unsigned intstream[], + input uvm_packer packer=null); + m_pack(packer); + packer.get_ints(intstream); + return packer.get_packed_size(); +endfunction + + + // Function: do_pack + // + // The do_pack method is the user-definable hook called by the methods. + // A derived class should override this method to include its fields in a pack + // operation. + // + // The ~packer~ argument is the policy object for packing. The policy object + // should be used to pack objects. + // + // A typical example of an object packing itself is as follows + // + //| class mysubtype extends mysupertype; + //| ... + //| shortint myshort; + //| obj_type myobj; + //| byte myarray[]; + //| ... + //| function void do_pack (uvm_packer packer); + //| super.do_pack(packer); // pack mysupertype properties + //| packer.pack_field_int(myarray.size(), 32); + //| foreach (myarray) + //| packer.pack_field_int(myarray[index], 8); + //| packer.pack_field_int(myshort, $bits(myshort)); + //| packer.pack_object(myobj); + //| endfunction + // + // The implementation must call ~super.do_pack~ so that base class properties + // are packed as well. + // + // If your object contains dynamic data (object, string, queue, dynamic array, + // or associative array), and you intend to unpack into an equivalent data + // structure when unpacking, you must include meta-information about the + // dynamic data when packing as follows. + // + // - For queues, dynamic arrays, or associative arrays, pack the number of + // elements in the array in the 32 bits immediately before packing + // individual elements, as shown above. + // + // - For string data types, append a zero byte after packing the string + // contents. + // + // - For objects, pack 4 bits immediately before packing the object. For null + // objects, pack 4'b0000. For non-null objects, pack 4'b0001. + // + // When the `uvm_field_* macros are used, + // , + // the above meta information is included provided the + // variable is set for the packer. + // + // Packing order does not need to match declaration order. However, unpacking + // order must match packing order. + + virtual function void do_pack (uvm_packer packer); + return; +endfunction + + + // Group: Unpacking + + // Function: unpack + + function int unpack (`IVL_UVM_REF bit bitstream[], + input uvm_packer packer=null); + m_unpack_pre(packer); + packer.put_bits(bitstream); + m_unpack_post(packer); + packer.set_packed_size(); + return packer.get_packed_size(); +endfunction + + // Function: unpack_bytes + + function int unpack_bytes (`IVL_UVM_REF byte unsigned bytestream[], + input uvm_packer packer=null); + m_unpack_pre(packer); + packer.put_bytes(bytestream); + m_unpack_post(packer); + packer.set_packed_size(); + return packer.get_packed_size(); +endfunction + + // Function: unpack_ints + // + // The unpack methods extract property values from an array of bits, bytes, or + // ints. The method of unpacking ~must~ exactly correspond to the method of + // packing. This is assured if (a) the same ~packer~ policy is used to pack + // and unpack, and (b) the order of unpacking is the same as the order of + // packing used to create the input array. + // + // The unpack methods are fixed (non-virtual) entry points that are directly + // callable by the user. To include additional fields in the + // operation, derived classes should override the method. + // + // The optional ~packer~ argument specifies the packing policy, which governs + // both the pack and unpack operation. If a packer policy is not provided, + // then the global ~uvm_default_packer~ policy is used. See uvm_packer for + // more information. + // + // The return value is the actual number of bits unpacked from the given array. + + function int unpack_ints (`IVL_UVM_REF int unsigned intstream[], + input uvm_packer packer=null); + m_unpack_pre(packer); + packer.put_ints(intstream); + m_unpack_post(packer); + packer.set_packed_size(); + return packer.get_packed_size(); +endfunction + + + + // Function: do_unpack + // + // The do_unpack method is the user-definable hook called by the + // method. A derived class should override this method to include its fields + // in an unpack operation. + // + // The ~packer~ argument is the policy object for both packing and unpacking. + // It must be the same packer used to pack the object into bits. Also, + // do_unpack must unpack fields in the same order in which they were packed. + // See for more information. + // + // The following implementation corresponds to the example given in do_pack. + // + //| function void do_unpack (uvm_packer packer); + //| int sz; + //| super.do_unpack(packer); // unpack super's properties + //| sz = packer.unpack_field_int(myarray.size(), 32); + //| myarray.delete(); + //| for(int index=0; index into an equivalent data + // structure, you must have included meta-information about the dynamic data + // when it was packed. + // + // - For queues, dynamic arrays, or associative arrays, unpack the number of + // elements in the array from the 32 bits immediately before unpacking + // individual elements, as shown above. + // + // - For string data types, unpack into the new string until a null byte is + // encountered. + // + // - For objects, unpack 4 bits into a byte or int variable. If the value + // is 0, the target object should be set to null and unpacking continues to + // the next property, if any. If the least significant bit is 1, then the + // target object should be allocated and its properties unpacked. + + virtual function void do_unpack (uvm_packer packer); + return; +endfunction +`endif // IVL_UVM +endclass : uvm_object + diff --git a/uvm/ivl_uvm_src/base/uvm_object_globals.svh b/uvm/ivl_uvm_src/base/uvm_object_globals.svh new file mode 100644 index 000000000..4f2b7829b --- /dev/null +++ b/uvm/ivl_uvm_src/base/uvm_object_globals.svh @@ -0,0 +1,706 @@ +// ========== Copyright Header Begin ========================== +// +// Project: IVL_UVM +// File: ivl_uvm_types.svh +// Author(s): Srinivasan Venkataramanan +// Modified from Accellera UVM 1.1d code base +// +// Copyright (c) VerifWorks 2016-2020 All Rights Reserved. +// Contact us via: support@verifworks.com +// +// ========== Copyright Header End ============================ +//////////////////////////////////////////////////////////////////////// +// +//------------------------------------------------------------------------------ +// Copyright 2007-2011 Mentor Graphics Corporation +// Copyright 2007-2010 Cadence Design Systems, Inc. +// Copyright 2010 Synopsys, Inc. +// All Rights Reserved Worldwide +// +// Licensed under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in +// writing, software distributed under the License is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See +// the License for the specific language governing +// permissions and limitations under the License. +//------------------------------------------------------------------------------ + +//This bit marks where filtering should occur to remove uvm stuff from a +//scope +bit uvm_start_uvm_declarations = 1; + +//------------------------------------------------------------------------------ +// +// Section: Types and Enumerations +// +//------------------------------------------------------------------------------ + +//------------------------ +// Group: Field automation +//------------------------ + +// Macro: `UVM_MAX_STREAMBITS +// +// Defines the maximum bit vector size for integral types. + +`ifndef UVM_MAX_STREAMBITS +`define UVM_MAX_STREAMBITS 4096 +`endif + + +// Macro: `UVM_PACKER_MAX_BYTES +// +// Defines the maximum bytes to allocate for packing an object using +// the . Default is <`UVM_MAX_STREAMBITS>, in ~bytes~. + +`ifndef UVM_PACKER_MAX_BYTES + `define UVM_PACKER_MAX_BYTES UVM_STREAMBITS +`endif + +parameter UVM_STREAMBITS = `UVM_MAX_STREAMBITS; + + +// Macro: `UVM_DEFAULT_TIMEOUT +// +// The default timeout for simulation, if not overridden by +// or <+UVM_TIMEOUT> +// + +`define UVM_DEFAULT_TIMEOUT 9200s + +// Type: uvm_bitstream_t +// +// The bitstream type is used as a argument type for passing integral values +// in such methods as set_int_local, get_int_local, get_config_int, report, +// pack and unpack. + +typedef logic signed [UVM_STREAMBITS-1:0] uvm_bitstream_t; + + + +// Enum: uvm_radix_enum +// +// Specifies the radix to print or record in. +// +// UVM_BIN - Selects binary (%b) format +// UVM_DEC - Selects decimal (%d) format +// UVM_UNSIGNED - Selects unsigned decimal (%u) format +// UVM_OCT - Selects octal (%o) format +// UVM_HEX - Selects hexidecimal (%h) format +// UVM_STRING - Selects string (%s) format +// UVM_TIME - Selects time (%t) format +// UVM_ENUM - Selects enumeration value (name) format + +typedef enum { + UVM_BIN = 'h1000000, + UVM_DEC = 'h2000000, + UVM_UNSIGNED = 'h3000000, + UVM_UNFORMAT2 = 'h4000000, + UVM_UNFORMAT4 = 'h5000000, + UVM_OCT = 'h6000000, + UVM_HEX = 'h7000000, + UVM_STRING = 'h8000000, + UVM_TIME = 'h9000000, + UVM_ENUM = 'ha000000, + UVM_REAL = 'hb000000, + UVM_REAL_DEC = 'hc000000, + UVM_REAL_EXP = 'hd000000, + UVM_NORADIX = 0 +} uvm_radix_enum; + +parameter UVM_RADIX = 'hf000000; //4 bits setting the radix + + +// Function- uvm_radix_to_string + +function string uvm_radix_to_string(uvm_radix_enum radix); + case(radix) + UVM_BIN: return "b"; + UVM_OCT: return "o"; + UVM_DEC: return "d"; + UVM_HEX: return "h"; + UVM_UNSIGNED: return "u"; + UVM_UNFORMAT2: return "u"; + UVM_UNFORMAT4: return "z"; + UVM_STRING: return "s"; + UVM_TIME: return "t"; + UVM_ENUM: return "s"; + UVM_REAL: return "g"; + UVM_REAL_DEC: return "f"; + UVM_REAL_EXP: return "e"; + default: return "x"; //hex + endcase +endfunction + + +// Enum: uvm_recursion_policy_enum +// +// Specifies the policy for copying objects. +// +// UVM_DEEP - Objects are deep copied (object must implement copy method) +// UVM_SHALLOW - Objects are shallow copied using default SV copy. +// UVM_REFERENCE - Only object handles are copied. + +typedef enum { + UVM_DEFAULT_POLICY = 0, + UVM_DEEP = 'h400, + UVM_SHALLOW = 'h800, + UVM_REFERENCE = 'h1000 + } uvm_recursion_policy_enum; + + +// Enum: uvm_active_passive_enum +// +// Convenience value to define whether a component, usually an agent, +// is in "active" mode or "passive" mode. + +typedef enum bit { UVM_PASSIVE=0, UVM_ACTIVE=1 } uvm_active_passive_enum; + + +// Parameter: `uvm_field_* macro flags +// +// Defines what operations a given field should be involved in. +// Bitwise OR all that apply. +// +// UVM_DEFAULT - All field operations turned on +// UVM_COPY - Field will participate in +// UVM_COMPARE - Field will participate in +// UVM_PRINT - Field will participate in +// UVM_RECORD - Field will participate in +// UVM_PACK - Field will participate in +// +// UVM_NOCOPY - Field will not participate in +// UVM_NOCOMPARE - Field will not participate in +// UVM_NOPRINT - Field will not participate in +// UVM_NORECORD - Field will not participate in +// UVM_NOPACK - Field will not participate in +// +// UVM_DEEP - Object field will be deep copied +// UVM_SHALLOW - Object field will be shallow copied +// UVM_REFERENCE - Object field will copied by reference +// +// UVM_READONLY - Object field will NOT be automatically configured. + + +parameter UVM_MACRO_NUMFLAGS = 17; +//A=ABSTRACT Y=PHYSICAL +//F=REFERENCE, S=SHALLOW, D=DEEP +//K=PACK, R=RECORD, P=PRINT, M=COMPARE, C=COPY +//--------------------------- AYFSD K R P M C +parameter UVM_DEFAULT = 'b000010101010101; +parameter UVM_ALL_ON = 'b000000101010101; +parameter UVM_FLAGS_ON = 'b000000101010101; +parameter UVM_FLAGS_OFF = 0; + +//Values are or'ed into a 32 bit value +//and externally +parameter UVM_COPY = (1<<0); +parameter UVM_NOCOPY = (1<<1); +parameter UVM_COMPARE = (1<<2); +parameter UVM_NOCOMPARE = (1<<3); +parameter UVM_PRINT = (1<<4); +parameter UVM_NOPRINT = (1<<5); +parameter UVM_RECORD = (1<<6); +parameter UVM_NORECORD = (1<<7); +parameter UVM_PACK = (1<<8); +parameter UVM_NOPACK = (1<<9); +//parameter UVM_DEEP = (1<<10); +//parameter UVM_SHALLOW = (1<<11); +//parameter UVM_REFERENCE = (1<<12); +parameter UVM_PHYSICAL = (1<<13); +parameter UVM_ABSTRACT = (1<<14); +parameter UVM_READONLY = (1<<15); +parameter UVM_NODEFPRINT = (1<<16); + +//Extra values that are used for extra methods +parameter UVM_MACRO_EXTRAS = (1< task is +// being executed. +// PRE_BODY - The sequence is started and the +// task is +// being executed. +// BODY - The sequence is started and the +// task is +// being executed. +// ENDED - The sequence has completed the execution of the +// task. +// POST_BODY - The sequence is started and the +// task is +// being executed. +// POST_START - The sequence is started and the +// task is +// being executed. +// STOPPED - The sequence has been forcibly ended by issuing a +// on the sequence. +// FINISHED - The sequence is completely finished executing. + +typedef enum +{ + CREATED = 1, + PRE_START = 2, + PRE_BODY = 4, + BODY = 8, + POST_BODY = 16, + POST_START= 32, + ENDED = 64, + STOPPED = 128, + FINISHED = 256 +} uvm_sequence_state; + +typedef uvm_sequence_state uvm_sequence_state_enum; // backward compat + + +// Enum: uvm_sequence_lib_mode +// +// Specifies the random selection mode of a sequence library +// +// UVM_SEQ_LIB_RAND - Random sequence selection +// UVM_SEQ_LIB_RANDC - Random cyclic sequence selection +// UVM_SEQ_LIB_ITEM - Emit only items, no sequence execution +// UVM_SEQ_LIB_USER - Apply a user-defined random-selection algorithm + +typedef enum +{ + UVM_SEQ_LIB_RAND, + UVM_SEQ_LIB_RANDC, + UVM_SEQ_LIB_ITEM, + UVM_SEQ_LIB_USER +} uvm_sequence_lib_mode; + + + +//--------------- +// Group: Phasing +//--------------- + +// Enum: uvm_phase_type +// +// This is an attribute of a object which defines the phase +// type. +// +// UVM_PHASE_IMP - The phase object is used to traverse the component +// hierarchy and call the component phase method as +// well as the ~phase_started~ and ~phase_ended~ callbacks. +// These nodes are created by the phase macros, +// `uvm_builtin_task_phase, `uvm_builtin_topdown_phase, +// and `uvm_builtin_bottomup_phase. These nodes represent +// the phase type, i.e. uvm_run_phase, uvm_main_phase. +// +// UVM_PHASE_NODE - The object represents a simple node instance in +// the graph. These nodes will contain a reference to +// their corresponding IMP object. +// +// UVM_PHASE_SCHEDULE - The object represents a portion of the phasing graph, +// typically consisting of several NODE types, in series, +// parallel, or both. +// +// UVM_PHASE_TERMINAL - This internal object serves as the termination NODE +// for a SCHEDULE phase object. +// +// UVM_PHASE_DOMAIN - This object represents an entire graph segment that +// executes in parallel with the 'run' phase. +// Domains may define any network of NODEs and +// SCHEDULEs. The built-in domain, ~uvm~, consists +// of a single schedule of all the run-time phases, +// starting with ~pre_reset~ and ending with +// ~post_shutdown~. +// +typedef enum { UVM_PHASE_IMP, + UVM_PHASE_NODE, + UVM_PHASE_TERMINAL, + UVM_PHASE_SCHEDULE, + UVM_PHASE_DOMAIN, + UVM_PHASE_GLOBAL +} uvm_phase_type; + + +// Enum: uvm_phase_state +// --------------------- +// +// The set of possible states of a phase. This is an attribute of a schedule +// node in the graph, not of a phase, to maintain independent per-domain state +// +// UVM_PHASE_DORMANT - Nothing has happened with the phase in this domain. +// +// UVM_PHASE_SCHEDULED - At least one immediate predecessor has completed. +// Scheduled phases block until all predecessors complete or +// until a jump is executed. +// +// UVM_PHASE_SYNCING - All predecessors complete, checking that all synced +// phases (e.g. across domains) are at or beyond this point +// +// UVM_PHASE_STARTED - phase ready to execute, running phase_started() callback +// +// UVM_PHASE_EXECUTING - An executing phase is one where the phase callbacks are +// being executed. It's process is tracked by the phaser. +// +// UVM_PHASE_READY_TO_END - no objections remain in this phase or in any +// predecessors of its successors or in any sync'd phases. This +// state indicates an opportunity for any phase that needs extra +// time for a clean exit to raise an objection, thereby causing a +// return to UVM_PHASE_EXECUTING. If no objection is raised, state +// will transition to UVM_PHASE_ENDED after a delta cycle. +// (An example of predecessors of successors: The successor to +// phase 'run' is 'extract', whose predecessors are 'run' and +// 'post_shutdown'. Therefore, 'run' will go to this state when +// both its objections and those of 'post_shutdown' are all dropped. +// +// UVM_PHASE_ENDED - phase completed execution, now running phase_ended() callback +// +// UVM_PHASE_CLEANUP - all processes related to phase are being killed +// +// UVM_PHASE_DONE - A phase is done after it terminated execution. Becoming +// done may enable a waiting successor phase to execute. +// +// The state transitions occur as follows: +// +//| DORMANT -> SCHED -> SYNC -> START -> EXEC -> READY -> END -> CLEAN -> DONE +//| ^ | +//| | <-- jump_to v +//| +------------------------------------------------------------+ + + typedef enum { UVM_PHASE_DORMANT = 1, + UVM_PHASE_SCHEDULED = 2, + UVM_PHASE_SYNCING = 4, + UVM_PHASE_STARTED = 8, + UVM_PHASE_EXECUTING = 16, + UVM_PHASE_READY_TO_END = 32, + UVM_PHASE_ENDED = 64, + UVM_PHASE_CLEANUP = 128, + UVM_PHASE_DONE = 256, + UVM_PHASE_JUMPING = 512 + } uvm_phase_state; + + + +// Enum: uvm_phase_transition +// +// These are the phase state transition for callbacks which provide +// additional information that may be useful during callbacks +// +// UVM_COMPLETED - the phase completed normally +// UVM_FORCED_STOP - the phase was forced to terminate prematurely +// UVM_SKIPPED - the phase was in the path of a forward jump +// UVM_RERUN - the phase was in the path of a backwards jump +// +typedef enum { UVM_COMPLETED = 'h01, + UVM_FORCED_STOP = 'h02, + UVM_SKIPPED = 'h04, + UVM_RERUN = 'h08 +} uvm_phase_transition; + + + +// Enum: uvm_wait_op +// +// Specifies the operand when using methods like . +// +// UVM_EQ - equal +// UVM_NE - not equal +// UVM_LT - less than +// UVM_LTE - less than or equal to +// UVM_GT - greater than +// UVM_GTE - greater than or equal to +// +typedef enum { UVM_LT, + UVM_LTE, + UVM_NE, + UVM_EQ, + UVM_GT, + UVM_GTE +} uvm_wait_op; + + +//------------------ +// Group: Objections +//------------------ + +// Enum: uvm_objection_event +// +// Enumerated the possible objection events one could wait on. See +// . +// +// UVM_RAISED - an objection was raised +// UVM_DROPPED - an objection was raised +// UVM_ALL_DROPPED - all objections have been dropped +// +typedef enum { UVM_RAISED = 'h01, + UVM_DROPPED = 'h02, + UVM_ALL_DROPPED = 'h04 +} uvm_objection_event; + + + +//------------------------------ +// Group: Default Policy Classes +//------------------------------ +// +// Policy classes copying, comparing, packing, unpacking, and recording +// -based objects. + + +typedef class uvm_printer; +typedef class uvm_table_printer; +typedef class uvm_tree_printer; +typedef class uvm_line_printer; +typedef class uvm_comparer; +typedef class uvm_packer; +typedef class uvm_recorder; + +// Variable: uvm_default_table_printer +// +// The table printer is a global object that can be used with +// to get tabular style printing. + +`ifndef IVL_UVM +uvm_table_printer uvm_default_table_printer = new(); +`endif + + +// Variable: uvm_default_tree_printer +// +// The tree printer is a global object that can be used with +// to get multi-line tree style printing. + +`ifndef IVL_UVM +uvm_tree_printer uvm_default_tree_printer = new(); +`endif + + +// Variable: uvm_default_line_printer +// +// The line printer is a global object that can be used with +// to get single-line style printing. + +`ifndef IVL_UVM +uvm_line_printer uvm_default_line_printer = new(); +`endif + + +// Variable: uvm_default_printer +// +// The default printer policy. Used when calls to +// or do not specify a printer policy. +// +// The default printer may be set to any legal derived type, +// including the global line, tree, and table printers described above. + +`ifndef IVL_UVM +uvm_printer uvm_default_printer = uvm_default_table_printer; +`endif + + +// Variable: uvm_default_packer +// +// The default packer policy. Used when calls to +// and do not specify a packer policy. + +`ifndef IVL_UVM +uvm_packer uvm_default_packer = new(); +`endif + + +// Variable: uvm_default_comparer +// +// +// The default compare policy. Used when calls to +// do not specify a comparer policy. + +`ifndef IVL_UVM +uvm_comparer uvm_default_comparer = new(); // uvm_comparer::init(); +`endif + + +// Variable: uvm_default_recorder +// +// The default recording policy. Used when calls to +// do not specify a recorder policy. + +`ifndef IVL_UVM +uvm_recorder uvm_default_recorder = new(); +`endif + + + + + diff --git a/uvm/ivl_uvm_src/ivl_uvm_clp.svh b/uvm/ivl_uvm_src/ivl_uvm_clp.svh new file mode 100644 index 000000000..08dd408e1 --- /dev/null +++ b/uvm/ivl_uvm_src/ivl_uvm_clp.svh @@ -0,0 +1,534 @@ +// +//------------------------------------------------------------------------------ +// Copyright 2011 Mentor Graphics Corporation +// Copyright 2011 Cadence Design Systems, Inc. +// Copyright 2011 Synopsys, Inc. +// All Rights Reserved Worldwide +// +// Licensed under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in +// writing, software distributed under the License is +// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See +// the License for the specific language governing +// permissions and limitations under the License. +//------------------------------------------------------------------------------ + +`ifndef UVM_CMDLINE_PROCESSOR_SV +`define UVM_CMDLINE_PROCESSOR_SV + +class uvm_cmd_line_verb; + string comp_path; + string id; + //TBD uvm_verbosity verb; + int exec_time; +endclass + +// Class: uvm_cmdline_processor +// +// This class provides an interface to the command line arguments that +// were provided for the given simulation. The class is intended to be +// used as a singleton, but that isn't required. The generation of the +// data structures which hold the command line argument information +// happens during construction of the class object. A global variable +// called ~uvm_cmdline_proc~ is created at initialization time and may +// be used to access command line information. +// +// The uvm_cmdline_processor class also provides support for setting various UVM +// variables from the command line such as components' verbosities and configuration +// settings for integral types and strings. Each of these capablities is described +// in the Built-in UVM Aware Command Line Arguments section. +// + +module ivl_uvm_cmdline_processor; + import ivl_uvm_pkg::*; + + string m_argv[$]; + string m_plus_argv[$]; + string m_uvm_argv[$]; + + string ivl_uvm_clp_args [$]; + + //`include "ivl_uvm_msg.svh" + + function string uvm_dpi_get_tool_version (); + return "Icarus Verilog version 12.0 (devel)"; + endfunction : uvm_dpi_get_tool_version + + function string uvm_dpi_get_tool_name (); + return "Icarus Verilog with IVL_UVM"; + endfunction : uvm_dpi_get_tool_name + + + // Group: Basic Arguments + + // Function: get_args + // + // This function returns a queue with all of the command line + // arguments that were used to start the simulation. Note that + // element 0 of the array will always be the name of the + // executable which started the simulation. + + function void get_args (string args[$]); + ivl_uvm_clp_args = m_argv; + endfunction + + // Function: get_plusargs + // + // This function returns a queue with all of the plus arguments + // that were used to start the simulation. Plusarguments may be + // used by the simulator vendor, or may be specific to a company + // or individiual user. Plusargs never have extra arguments + // (i.e. if there is a plusarg as the second argument on the + // command line, the third argument is unrelated); this is not + // necessarily the case with vendor specific dash arguments. + + function void get_plusargs (string args[$]); + ivl_uvm_clp_args = m_plus_argv; + endfunction + + // Function: get_uvmargs + // + // This function returns a queue with all of the uvm arguments + // that were used to start the simulation. An UVM argument is + // taken to be any argument that starts with a - or + and uses + // the keyword UVM (case insensitive) as the first three + // letters of the argument. + + function void get_uvm_args (string args[$]); + ivl_uvm_clp_args = m_uvm_argv; + endfunction + + // Function: get_arg_matches + // + // This function loads a queue with all of the arguments that + // match the input expression and returns the number of items + // that matched. If the input expression is bracketed + // with //, then it is taken as an extended regular expression + // otherwise, it is taken as the beginning of an argument to match. + // For example: + // + //| string myargs[$] + //| initial begin + //| void'(uvm_cmdline_proc.get_arg_matches("+foo",myargs)); //matches +foo, +foobar + //| //doesn't match +barfoo + //| void'(uvm_cmdline_proc.get_arg_matches("/foo/",myargs)); //matches +foo, +foobar, + //| //foo.sv, barfoo, etc. + //| void'(uvm_cmdline_proc.get_arg_matches("/^foo.*\.sv",myargs)); //matches foo.sv + //| //and foo123.sv, + //| //not barfoo.sv. + + `ifndef IVL_UVM + function int get_arg_matches (string match, ref string args[$]); + `else + function int get_arg_matches (string match, string unused_args[$]); + `endif // IVL_UVM + + `ifndef UVM_CMDLINE_NO_DPI + chandle exp_h = null; + int len = match.len(); + ivl_uvm_clp_args.delete(); + if((match.len() > 2) && (match[0] == "/") && (match[match.len()-1] == "/")) begin + match = match.substr(1,match.len()-2); + exp_h = uvm_dpi_regcomp(match); + if(exp_h == null) begin + uvm_report_error("UVM_CMDLINE_PROC", {"Unable to compile the regular expression: ", match}, UVM_NONE); + return 0; + end + end + foreach (m_argv[i]) begin + if(exp_h != null) begin + if(!uvm_dpi_regexec(exp_h, m_argv[i])) + ivl_uvm_clp_args.push_back(m_argv[i]); + end + else if((m_argv[i].len() >= len) && (m_argv[i].substr(0,len - 1) == match)) + ivl_uvm_clp_args.push_back(m_argv[i]); + end + + if(exp_h != null) + uvm_dpi_regfree(exp_h); + `endif + + return ivl_uvm_clp_args.size(); + endfunction + + + // Group: Argument Values + + // Function: get_arg_value + // + // This function finds the first argument which matches the ~match~ arg and + // returns the suffix of the argument. This is similar to the $value$plusargs + // system task, but does not take a formating string. The return value is + // the number of command line arguments that match the ~match~ string, and + // ~value~ is the value of the first match. + + function int get_arg_value (string match, string value); + int chars; + string lv_argv_s; + string lv_val_s; + string lv_argv_substr; + int lv_argv_len; + int lv_len_1; + + chars = match.len(); + get_arg_value = 0; + foreach (m_argv[i]) begin + // if(m_argv[i].len() >= chars) begin + lv_argv_s = m_argv[i]; + lv_argv_len = lv_argv_s.len(); + + if(lv_argv_len >= chars) begin + // if(m_argv[i].substr(0,chars-1) == match) begin + lv_argv_substr = lv_argv_s.substr(0,chars-1); + if(lv_argv_substr == match) begin + get_arg_value++; + if(get_arg_value == 1) begin + // value = m_argv[i].substr(chars,m_argv[i].len()-1); + lv_len_1 = lv_argv_s.len()-1; + lv_val_s = lv_argv_s.substr(chars,lv_len_1); + end + end + end + end + endfunction + + // Function: get_arg_values + // + // This function finds all the arguments which matches the ~match~ arg and + // returns the suffix of the arguments in a list of values. The return + // value is the number of matches that were found (it is the same as + // values.size() ). + // For example if '+foo=1,yes,on +foo=5,no,off' was provided on the command + // line and the following code was executed: + // + //| string foo_values[$] + //| initial begin + //| void'(uvm_cmdline_proc.get_arg_values("+foo=",foo_values)); + //| + // + // The foo_values queue would contain two entries. These entries are shown + // here: + // + // 0 - "1,yes,on" + // 1 - "5,no,off" + // + // Splitting the resultant string is left to user but using the + // uvm_split_string() function is recommended. + + function int get_arg_values (string match, string values[$]); + int chars; + + chars = match.len(); + values.delete(); + `ifndef IVL_UVM + foreach (m_argv[i]) begin + if(m_argv[i].len() >= chars) begin + if(m_argv[i].substr(0,chars-1) == match) + values.push_back(m_argv[i].substr(chars,m_argv[i].len()-1)); + end + end + `endif // IVL_UVM + return values.size(); + endfunction + + // Group: Tool information + + // Function: get_tool_name + // + // Returns the simulation tool that is executing the simlation. + // This is a vendor specific string. + + function string get_tool_name (); + return uvm_dpi_get_tool_name(); + endfunction + + // Function: get_tool_version + // + // Returns the version of the simulation tool that is executing the simlation. + // This is a vendor specific string. + + function string get_tool_version (); + return uvm_dpi_get_tool_version(); + endfunction + + // constructor + + `ifndef IVL_UVM + function void ivl_uvm_new (string name = ""); + string s; + string sub; + do begin + s = uvm_dpi_get_next_arg(); + if(s!="") begin + m_argv.push_back(s); + if(s[0] == "+") begin + m_plus_argv.push_back(s); + end + if(s.len() >= 4 && (s[0]=="-" || s[0]=="+")) begin + sub = s.substr(1,3); + sub = sub.toupper(); + if(sub == "UVM") + m_uvm_argv.push_back(s); + end + end + end while(s!=""); + + // Group: Command Line Debug + + // Variable: +UVM_DUMP_CMDLINE_ARGS + // + // ~+UVM_DUMP_CMDLINE_ARGS~ allows the user to dump all command line arguments to the + // reporting mechanism. The output in is tree format. + + // The implementation of this is in uvm_root. + + // Group: Built-in UVM Aware Command Line Arguments + + // Variable: +UVM_TESTNAME + // + // ~+UVM_TESTNAME=~ allows the user to specify which uvm_test (or + // uvm_component) should be created via the factory and cycled through the UVM phases. + // If multiple of these settings are provided, the first occurrence is used and a warning + // is issued for subsequent settings. For example: + // + //| +UVM_TESTNAME=read_modify_write_test + // + + // The implementation of this is in uvm_root since this is procedurally invoked via + // ovm_root::run_test(). + + // Variable: +UVM_VERBOSITY + // + // ~+UVM_VERBOSITY=~ allows the user to specify the initial verbosity + // for all components. If multiple of these settings are provided, the first occurrence + // is used and a warning is issued for subsequent settings. For example: + // + //| +UVM_VERBOSITY=UVM_HIGH + // + + // The implementation of this is in uvm_root since this is procedurally invoked via + // ovm_root::new(). + + // Variable: +uvm_set_verbosity + // + // ~+uvm_set_verbosity=,,,~ and + // ~+uvm_set_verbosity=,,,time,