How to improve the reuse of ISR(interrupt service routine) for a block?

In reply to pinegreen:

In your module level ISR, you’ll typically have a field for the block level register model:


class module_isr_sequece extends uvm_reg_sequence;
  module_reg_block regmodel;
  
  // ...
endclass

When doing register access, you dig into it to get the registers:


class module_isr_sequece extends uvm_reg_sequence;
  virtual task body();
    regmodel.some_reg.write(...);
    regmodel.some_other_reg.write(...);
  endtask
endclass

In your system level ISR, you’ll have a different register model:


class system_isr_sequece extends uvm_reg_sequence;
  system_reg_block regmodel;
  
  // ...
endclass

The system regmodel contains one (or more) instance(s) of the module register model. When figuring out that you need to start that certain ISR, you just need to provide it the appropriate module regmodel:


class system_isr_sequece extends uvm_reg_sequence;
  virtual task body();
    module_isr_sequence module_isr;
    
    // ... figure out what ISR to start and create it
    // assume it's 'module_isr'
    
    module_isr.regmodel = regmodel.module_block;
    `uvm_send(module_isr, ...)
  endtask
endclass

You shouldn’t have any problems with paths being different.