Learning Bluespec

Home‎ > ‎New and Prospective Users‎ > ‎

Multiplier Overview

module mkTest (Empty);

   Reg#(int) state <- mkReg(0);
   Mult_ifc m      <- mkMult1(0);

   rule go (state == 0);
      m.start(9, 5);
      state <= 1;
   endrule

   rule finish (state == 1);
      $display("Product = %d", m.result ());
      state <= 2;
   endrule

endmodule: mkTest

 

interface Mult_ifc;
   method Action start (Tin x, Tin y);
   method Tout   result();
endinterface:Mult_ifc


module mkMult1 (Mult_ifc);
   Reg#(Tout) product <- mkReg(0);
   Reg#(Tout) d       <- mkReg(0);
   Reg#(Tin) r        <- mkReg(0);

   rule cycle (r!=0 );
     if (r[0] == 1) product <= product + d'
     d <= d << 1;
     r <= r >> 1;
   endrule
 
  
method Action start (x,y) if (r==0);
     d <=x;
     r <= y;
     product <= 0;
   endmethod

   method result () if (r==0);
     return product;
   endmethod

endmodule: mkMult1