aboutsummaryrefslogtreecommitdiff
path: root/core/alu.v
blob: 439df083b058375d7aa1330448e79ae22863cf79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
module alu(
	   input wire [3:0]  op,
	   input wire [63:0] in_x,
	   input wire [63:0] in_y,
	   output reg [63:0] out
	   );

   always @* begin
      case (op)
	4'b0000: out = in_x & in_y;                     // and
	4'b0001: out = in_x | in_y;                     // or
	4'b0010: out = in_x + in_y;                     // add
	4'b0011: out = in_x - in_y;                     // sub
	4'b0100: out = $signed(in_x) >>> $signed(in_y); // sra signed
	4'b0101: out = in_x < in_y;                     // stlu
	4'b0110: out = in_x ^ in_y;                     // xor
	4'b0111: out = in_x >> in_y;                    // srl
	4'b1000: out = $signed(in_x) < $signed(in_y);   // slt signed
	4'b1001: out = in_x << in_y;                    // sll
	4'b1010: out = ~(in_x | in_y);                  // nor
	4'b1011: out = $signed(in_x) >= $signed(in_y);  // sge
	4'b1100: out = in_x >= in_y;                    // sgeu
	4'b1101: out = in_x == in_y;                    // seq
	4'b1110: out = in_x != in_y;                    // sne
	4'b1111: out = 0;                               // invalid
      endcase
   end // always @ *
   
endmodule // alu