2022-11-26 10:44:00 +00:00
|
|
|
`timescale 1ns / 1ps
|
|
|
|
// N = Bit width
|
|
|
|
module ALU #(parameter N = 32)
|
|
|
|
(
|
|
|
|
input logic[N-1:0] a,
|
|
|
|
input logic[N-1:0] b,
|
2022-12-20 05:19:32 +00:00
|
|
|
input logic[2:0] opcode,
|
2022-11-26 10:44:00 +00:00
|
|
|
output logic[N-1:0] result,
|
|
|
|
output logic[3:0] status
|
|
|
|
);
|
|
|
|
logic n, z, c, v;
|
2022-12-24 01:13:40 +00:00
|
|
|
logic opsign_comp, v_value;
|
2022-11-26 10:44:00 +00:00
|
|
|
always_comb begin
|
2022-12-20 05:19:32 +00:00
|
|
|
// Check if the signs of the operands are equal considering substraction sign simplification over the B operand
|
2022-12-24 01:13:40 +00:00
|
|
|
opsign_comp = (a[N-1] == (b[N-1] ^ opcode[0]));
|
2022-12-20 05:19:32 +00:00
|
|
|
// There is an overflow if the signs are equal and the result differ from the operation sign
|
|
|
|
// The overflow flag only gets assign when the operation is either a sum or a substraction
|
2022-12-24 01:13:40 +00:00
|
|
|
v_value = opsign_comp && (result != a[N-1]);
|
2022-11-26 10:44:00 +00:00
|
|
|
case(opcode)
|
2022-12-20 05:19:32 +00:00
|
|
|
'b000: begin // Addition
|
2022-11-26 10:44:00 +00:00
|
|
|
{c, result} = a + b;
|
|
|
|
v = v_value;
|
|
|
|
end
|
2022-12-20 05:19:32 +00:00
|
|
|
'b001: begin // Substraction
|
2022-11-26 10:44:00 +00:00
|
|
|
{c, result} = a - b;
|
|
|
|
v = v_value;
|
|
|
|
end
|
2022-12-20 05:19:32 +00:00
|
|
|
'b011: begin // Or
|
2022-11-26 10:44:00 +00:00
|
|
|
result = a | b;
|
2022-12-20 05:19:32 +00:00
|
|
|
c = 'b0;
|
|
|
|
v = 'b0;
|
2022-11-26 10:44:00 +00:00
|
|
|
end
|
2022-12-20 05:19:32 +00:00
|
|
|
'b010: begin // And
|
2022-11-26 10:44:00 +00:00
|
|
|
result = a & b;
|
2022-12-20 05:19:32 +00:00
|
|
|
c = 'b0;
|
|
|
|
v = 'b0;
|
|
|
|
end
|
|
|
|
'b101: begin // Set less than
|
|
|
|
result = a < b;
|
|
|
|
c = 'b0;
|
|
|
|
v = 'b0;
|
|
|
|
end
|
|
|
|
default: begin
|
|
|
|
result = 'dx;
|
|
|
|
c = 'dx;
|
|
|
|
v = 'dx;
|
2022-11-26 10:44:00 +00:00
|
|
|
end
|
|
|
|
endcase
|
|
|
|
n = result[N-1];
|
|
|
|
z = (result == '0);
|
|
|
|
status = {n, z, c, v};
|
|
|
|
end
|
|
|
|
endmodule
|