OOPS model of a Follow Flip Flop

Hi,

I'm tying to model a follow FF as an object. But it fails to produce the right output.
Tried with three different test pattern, still no hope. Could you help me out.
class follow_ff;

function void delay_ff1 (input bit done, ref bit done_d);
  if (done)
    done_d = 1'b1;
  else
    done_d = 1'b0;
endfunction

function void delay_ff2 (input bit done_d, ref bit done_dd);
  if (done_d)
    done_dd = 1'b1;
  else
    done_dd = 1'b0;
endfunction

endclass

module test;

bit done, done_d, clk, done_dd;

initial clk = 1'b1;

always #10 clk = !clk;

initial
begin
  repeat (2) @ (posedge clk);
  done = 1'b0; done_d = 1'b0;
  repeat (10) @ (posedge clk);
  #1;
  done = 1'b1; 
  repeat (1) @ (posedge clk);
  #1;
  done = 1'b0; 

  repeat (5) @ (posedge clk);
  $stop; $finish;
end

initial
begin
  follow_ff ff;
  ff = new();

//***************           *************
//***************  Case1    *************
//***************           *************

  fork

  forever
  begin
    @ (posedge clk);
    ff.delay_ff1(done,    done_d);
  end

  forever
  begin
    @ (posedge clk);
    ff.delay_ff2(done_d, done_dd);
  end

  join

//***************           *************
//***************  Case2    *************
//***************           *************
/*
  forever
  begin
    @ (posedge clk);
    ff.delay_ff1(done,    done_d);
  end

  forever
  begin
    @ (posedge clk);
    ff.delay_ff2(done_d, done_dd);
  end
*/
//***************           *************
//***************  Case3    *************
//***************           *************
/*
  forever
  begin
    @ (posedge clk);
    ff.delay_ff1(done,    done_d);
    ff.delay_ff2(done_d, done_dd);
  end
*/
end

endmodule

Thanks

In reply to senthil_m:
It would really help when asking questions if you used code tags that makes your code more readable, and explain the results you expected versus the results you are seeing.

In reply to dave_59:

Hi,

My input is an (done)one shot pulse, what we needed is two clock delayed input.

done >> input
done_d >> one clock delayed pulse of done input >> function delay_ff1
done_dd >> two clock delayed pulse of done input. >> function delay_ff2

But what I’m getting is both done_d && done_dd are getting asserted at the same
clock edge. This could be done with task, but want through functions.

Looks like I need to learn tag modes.

Thanks