$monitor vs uvm_info

In case of $monitor it prints the value whenever there is change in variable. Is there any alternate way in UVM to achieve the same functionality without writing any conditions?

$monitor is a very simplistic debugging task. It is almost equivalent to

fork
  forever @* $display(variables);
join_none 

Except that $monitor guarantees to print only once at the end of a timestep, and there can only be one `$monitor.

You could try

fork
  forever @*begin
        uvm_wait_for_nba_region(); // should eliminate most duplicate triggers
        `uvm_info(...)
join_none