module alu (input [31:0] a, b, | |
input [3:0] alucont, | |
input sltunsigned, | |
output reg [31:0] result); | |
wire [32:0] a2, b2, sum; | |
wire [31:0] slt; | |
assign a2 = {sltunsigned ? 1'b0 : a[31], a}; | |
assign b2 = alucont[2] ? ~{sltunsigned ? 1'b0 : b[31], b} : | |
{sltunsigned ? 1'b0 : b[31], b}; | |
assign sum = a2 + b2 + alucont[2]; | |
assign slt = sum[32]; | |
always@(*) | |
case({alucont[3], alucont[1:0]}) | |
3'b000: result <= a2 & b2; | |
3'b001: result <= a2 | b2; | |
3'b010: result <= sum[31:0]; | |
3'b011: result <= slt; | |
3'b100: result <= a2 ^ b2; | |
default: result <= 32'h0; | |
endcase | |
endmodule // alu |