title: Calling a Task Hierarchically without Defines
body: <p>I have a vendor-supplied BFM module instantiated deep in my hierarchy; let's call the path <code>top.dut.u1.u2.bfm1</code>.  The BFM's API is a little archaic and messy for our needs.  I would like to write an "object" (class? interface? something else?) that will provide tasks with a simpler calling interface, and can call the tasks of the specific BFM that it has been "linked" with.  It's this "linking" that I can't figure out.</p>
  
  <p>I have a simple version defined as a module, that uses a `define to specify the path to the BFM, something along the lines of:</p>
  
  <pre><code>`define BFM top.dut.u1.u2.bfm1
  module bfm_wrapper;
    ...
    task read_burst(...);
      ...
      `BFM.read_burst(...);
    endtask;
    ...
  endmodule
  </code></pre>
  
  <p>Obviously this isn't very reusable.  How do I replace `BFM with something more portable or abstracted to the next higher level?</p>
  
  <p>I'm a relative newbie with SystemVerilog, and I'm not even using UVM yet, but I'll take the plunge if there's something there that will help.  Any help is appreciated.</p>
  
  <p><em>[Update]</em> A couple of restrictions that I didn't mention:</p>
  
  <ol><li>I can't change or replace the vendor-supplied BFM.  I'd prefer to not even wrap it (i.e., instantiate it in my wrapper).
  <li>For reasons that I don't want to go into here, the BFM needs to be instantiated inside the DUT.  Changing that would require more effort than I can invest right now.
  </ol>