blob: 59f5cae6d721f18e7e8cef3f7a2b15999d8b4eef (
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] src0, src1,
input [1:0] op, // 00: ADD, 01: SUB, 11: SLT
output [N-1:0] result
);
wire [N-1:0] src1_inv, sum;
wire cin, src0_lt_src1, overflow;
assign src1_inv = op[0] ? ~src1 : src1;
assign cin = op[0];
assign sum = src0 + src1_inv + cin;
assign overflow = ~(src0[N-1] ^ src1[N-1] ^ op[0]) & (src0[N-1] ^ sum[N-1]);
assign src0_lt_src1 = overflow ^ sum[N-1];
assign result = op[1] ? {{(N-1){1'b0}}, src0_lt_src1} : sum;
endmodule
|