aboutsummaryrefslogtreecommitdiffstats
path: root/manual/CHAPTER_StateOfTheArt/forgen02.v
blob: 14af070c38efafd23a82da4f1d7961802e369173 (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
30
module uut_forgen02(a, b, cin, y, cout);

parameter WIDTH = 8;

input [WIDTH-1:0] a, b;
input cin;

output [WIDTH-1:0] y;
output cout;

genvar i;
wire [WIDTH-1:0] carry;

generate
	for (i = 0; i < WIDTH; i=i+1) begin:adder
		wire [2:0] D;
		assign D[1:0] = { a[i], b[i] };
		if (i == 0) begin:chain
			assign D[2] = cin;
		end else begin:chain
			assign D[2] = carry[i-1];
		end
		assign y[i] = ^D;
		assign carry[i] = &D[1:0] | (^D[1:0] & D[2]);
	end
endgenerate

assign cout = carry[WIDTH-1];

endmodule