What is the difference between m_sequencer and p_sequncer?
m_sequencer is the pointer to the generic sequencer base class, uvm_sequencer_base. p_sequencer is a handle to user defined sequencer class. m_sequencer always exists while running a sequence. p_sequencer will only exist if we declare it using the macro.
Here is a post in which tries to explain the difference between the two. Difference between m_sequencer and p_sequencer.