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
