Computer Laboratory

Course pages 2014–15

Advanced Computer Design

Example FibSimple

import FIFO::*;

// calculates fib(7) once and outputs result
module mkFibNoInterface(Empty);
   
   Reg#(UInt#(8)) a <- mkReg(1);
   Reg#(UInt#(8)) b <- mkReg(0);
   Reg#(UInt#(8)) j <- mkReg(7);
   
   rule loop (j>1);
      a <= a+b;
      b <= a;
      j <= j-1;
   endrule
   
   rule the_end(j<=1);
      $display("fib(7)=%d",a);
      $finish(); // stop simulation
   endrule
endmodule


/*****************************************************************************/

interface FibSimpleIfc;
   method Action start(UInt#(8) n);
   method ActionValue#(UInt#(8)) result;
endinterface

module mkFibSimple(FibSimpleIfc);

   Reg#(UInt#(8))  a           <- mkRegU;
   Reg#(UInt#(8))  b           <- mkRegU;
   Reg#(UInt#(8))  j           <- mkRegU;
   Reg#(Bool)      active      <- mkReg(False);
   FIFO#(UInt#(8)) result_fifo <- mkLFIFO;
   
   rule loop (active && (j>1));
      a <= a+b;
      b <= a;
      j <= j-1;
   endrule
   
   rule the_end (active && (j==1));
      result_fifo.enq(a);
      active <= False;
   endrule
   
   rule n_is_zero (active && (j==0));
      result_fifo.enq(0);
      active <= False;
   endrule
   
   method Action start(n) if (!active);
      j      <= n;
      a      <= 1;
      b      <= 0;
      active <= True;
   endmethod
   
   method ActionValue#(UInt#(8)) result;
      let r = result_fifo.first;
      result_fifo.deq;
      return r;
   endmethod

endmodule
   
module mkTestFibSimple(Empty);
   
   FibSimpleIfc    fib    <- mkFibSimple;
   Reg#(UInt#(8))  n      <- mkReg(0);
   FIFO#(UInt#(8)) inputs <- mkFIFO;
   
   rule loop (n<10);
      n <= n+1;
      fib.start(n);
      inputs.enq(n);
   endrule
   
   rule display_results;
      let r <- fib.result;
      inputs.deq;
      $display("%05t: result of fib(%1d)=%d",
	 $time, inputs.first, r);
   endrule
   
endmodule