/***************************************************************************** Examples of Fibonnaci Servers ============================= Simon Moore, January 2010 *****************************************************************************/ import FIFO::*; import GetPut::*; import ClientServer::*; import Vector::*; /***************************************************************************** Iterative Fib Server *****************************************************************************/ // specialisation of Server interface for Fib typedef Server#(UInt#(width), UInt#(TMul#(width,4))) FibServerT#(numeric type width); module mkFibServer(FibServerT#(width)) provisos (Add#(width,TMul#(width,3),TMul#(width,4))); Reg#(UInt#(TMul#(width,4))) a <- mkRegU; Reg#(UInt#(TMul#(width,4))) b <- mkRegU; Reg#(UInt#(TMul#(width,4))) j <- mkRegU; Reg#(Bool) active <- mkReg(False); FIFO#(UInt#(TMul#(width,4))) 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 // new interfaces interface Put request; method Action put(n) if (!active); j <= extend(n); a <= 1; b <= 0; active <= True; endmethod endinterface interface response = toGet(result_fifo); endmodule // simple test code for the above module mkTestFibServer(Empty); FibServerT#(8) fib <- mkFibServer; Reg#(UInt#(8)) n <- mkReg(0); FIFO#(UInt#(8)) inputs <- mkSizedFIFO(4); rule loop (n<10); n <= n+1; fib.request.put(n); inputs.enq(n); endrule rule display_results; let r <- fib.response.get(); inputs.deq; $display("%05t: result of fib(%1d)=%d", $time, inputs.first, r); endrule endmodule /***************************************************************************** Recursive and iterative functions for Fib used in static elaboration *****************************************************************************/ function Integer fib_func(Integer n); if(n<2) return n; else return fib_func(n-1)+fib_func(n-2); endfunction function Integer fib_func_iterative(Integer n); if(n<2) return n; else begin Integer a=1; Integer b=1; for(Integer j=2; j