aboutsummaryrefslogtreecommitdiff
path: root/src/arithmetic_unit.v
blob: 71255c287b4cb725730a0a02962e9cbd7245a293 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module arithmetic_unit #(
  parameter N = 32
)(
  input [N-1:0] au_src0, au_src1,
  input [1:0] au_op, // 00: ADD, 01: SUB, 11: SLT
  output [N-1:0] au_result
);

wire [N-1:0] au_src1_inv, au_sum;
wire au_cin, au_src0_lt_src1, au_overflow;

assign au_src1_inv = au_op[0] ? ~au_src1 : au_src1;
assign au_cin = au_op[0];

assign au_sum = au_src0 + au_src1_inv + au_cin;

assign au_overflow = ~(au_src0[N-1] ^ au_src1[N-1] ^ au_op[0]) & (au_src0[N-1] ^ au_sum[N-1]);

assign au_src0_lt_src1 = au_overflow ^ au_sum[N-1];

assign au_result = au_op[1] ? {{(N-1){1'b0}}, au_src0_lt_src1} : au_sum;

endmodule