In reply to Heisenberg:
interface itf;
bit inside_clk;
int inside_clk_period=5ns;
bit outside_clk;
// clock generated inside interface
always #(inside_clk_period/2) inside_clk = ! inside_clk;
endinterface
class driver;
...
virtual itf vif;
int period1,period2; // assume these are set from some configuration
function void driver::start_of_simulation(...);
vif.inside_clk_period = period1;
endfunction
task driver::run_phase(...);
fork // clock generated in driver
forever #(period2/2) vif.outside_clk = ! vif.outside_clk;
join_none
...
endtask
endclass