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