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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
`include "gfx/gfx_defs.sv"
// Asume que N es una potencia de 2
module horizontal_fold
#(parameter N=1)
(
input logic clk,
rst_n,
input logic start,
input fp vec[N - 1:0],
output logic done,
output fp q
);
fp q_left, q_right;
logic halves_done;
generate
if (N > 1) begin
horizontal_fold #(.N(N / 2)) left
(
.q(q_left),
.vec(vec[N - 1:N / 2]),
.done(halves_done),
.*
);
horizontal_fold #(.N(N / 2)) right
(
.q(q_right),
.vec(vec[N / 2 - 1:0]),
.done(),
.*
);
fp_add fold
(
.a(q_left),
.b(q_right),
.start(halves_done),
.*
);
end else begin
assign q = vec[0];
assign done = start;
end
endgenerate
endmodule
|