m_sequencer is the default handle for uvm_vitual_sequencer and p_sequencer is the hook up for child sequencer.
m_sequencer is the generic uvm_sequencer pointer. it will always exist for the uvm_sequence and is initialized when the sequence is started.
p_sequencer is a typed-specific sequencer pointer, created by registering the sequence to the sequencer using macros. It will not exist if we have not registered the sequence with macros.
As it is type-specific we can access almost everything added to the sequencer.
try to avoid using p_sequencer.
Regards
Ujjwal