Several comments on the code you have written:
-
You should never access interface signals outside of an agent’s driver. By doing this, you can cause undesired conflicts and code that is very difficult to debug.
-
You should never use ‘p_sequencer’. This results in code that is non-portable. You should use the standard UVM sequencer.
-
You should not use assert() around a randomize call. If you disable assertions, the randomize() call won’t happen.
-
The main issue is that you have a start_item()/finish_item() inside a fork/join_any block. When the second part of the fork completes and you disable the fork, it will terminate the first begin/end block which is when the start_item() is waiting for sequencer arbitration.