Course pages 2015–16
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