migrate verilog into ship files
[fleet.git] / src / edu / berkeley / fleet / slipway / alu2.v
1 `include "macros.v"
2
3 module alu2 (clk, 
4              a_r,    a_a_,  a_d,
5              b_r,    b_a_,  b_d,
6              op_r,   op_a_, op_d,
7              out_r_, out_a, out_d_);
8
9   input  clk;
10   `input(a_r,    a_a,    a_a_,  [(`DATAWIDTH-1):0], a_d)
11   `input(b_r,    b_a,    b_a_,  [(`DATAWIDTH-1):0], b_d)
12   `input(op_r,   op_a,   op_a_, [(`DATAWIDTH-1):0], op_d)
13   `output(out_r, out_r_, out_a, [(`DATAWIDTH-1):0], out_d_)
14   `defreg(out_d_, [(`DATAWIDTH-1):0], out_d)
15
16   reg                    have_a;
17   reg [(`DATAWIDTH-1):0] reg_a;
18   reg                    have_b;
19   reg [(`DATAWIDTH-1):0] reg_b;
20   reg                    have_op;
21   reg [(`DATAWIDTH-1):0] reg_op;
22
23   always @(posedge clk) begin
24     if (!have_a) begin
25       `onread(a_r, a_a) have_a = 1; reg_a = a_d; end
26       end
27     if (!have_b) begin
28       `onread(b_r, b_a) have_b = 1; reg_b = b_d; end
29       end
30     if (!have_op) begin
31       `onread(op_r, op_a) have_op = 1; reg_op = op_d; end
32       end
33   
34     if (have_a && have_b && have_op) begin
35       case (reg_op)
36         0: out_d = reg_a + reg_b;
37         1: out_d = reg_a - reg_b;
38         //2: out_d = reg_a * reg_b; // will not synthesize --AM
39         //3: out_d = reg_a / reg_b; // will not synthesize --AM
40         //4: out_d = reg_a % reg_b; // will not synthesize --AM
41         default: out_d = 0;
42       endcase        
43       `onwrite(out_r, out_a)
44         have_a  = 0;
45         have_b  = 0;
46         have_op = 0;
47       end
48     end
49   end
50
51 endmodule
52
53
54
55