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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
`include "gfx/gfx_defs.sv"
module gfx_raster
(
input logic clk,
rst_n,
input raster_xyzw vertex_a,
vertex_b,
vertex_c,
input logic in_valid,
output logic in_ready,
output frag_xy_lanes fragments,
output bary_lanes barys,
output fixed_tri ws,
input logic out_ready,
output paint_lanes out_valid
);
//TODO: Es exactamente el mismo asunto que offsets
assign ws[0] = vertex_a.zw.w;
assign ws[1] = vertex_b.zw.w;
assign ws[2] = vertex_c.zw.w;
logic setup_stall, setup_valid;
gfx_pipeline_flow #(.STAGES(`GFX_SETUP_STAGES)) setup_flow
(
.stall(setup_stall),
.out_ready(coarse_ready),
.out_valid(setup_valid),
.*
);
fixed_tri coarse_x_offsets, coarse_y_offsets, coarse_test_offsets, edge_refs;
raster_xy pos_ref;
coarse_dim span_x, span_y;
raster_offsets_tri offsets; //TODO: fsm con esto holdeado
gfx_setup setup
(
.stall(setup_stall),
.vertex_a(vertex_a.xy),
.vertex_b(vertex_b.xy),
.vertex_c(vertex_c.xy),
.*
);
logic coarse_ready, coarse_valid;
fixed_tri coarse_corners;
raster_xy coarse_pos;
gfx_raster_coarse coarse
(
.in_valid(setup_valid),
.in_ready(coarse_ready),
.out_ready(fine_ready),
.out_valid(coarse_valid),
.pos(coarse_pos),
.corners(coarse_corners),
.*
);
logic fine_ready, fine_stall, fine_valid;
always_comb
for (integer i = 0; i < `GFX_FINE_LANES; ++i)
out_valid[i] = fine_valid && skid_paint_ij[i];
gfx_pipeline_flow #(.STAGES(`GFX_FINE_STAGES)) fine_flow
(
.stall(fine_stall),
.in_ready(fine_ready),
.in_valid(coarse_valid),
.out_ready(out_ready || !(|skid_paint_ij)),
.out_valid(fine_valid),
.*
);
frag_xy fragment_ij[`GFX_RASTER_SIZE][`GFX_RASTER_SIZE];
fixed_tri barys_ij[`GFX_RASTER_SIZE][`GFX_RASTER_SIZE];
logic[`GFX_FINE_LANES - 1:0] paint_ij, skid_paint_ij;
gfx_skid_buf #(.WIDTH(`GFX_FINE_LANES)) skid_paint
(
.in(paint_ij),
.out(skid_paint_ij),
.stall(fine_stall),
.*
);
genvar i, j;
generate
for (i = 0; i < `GFX_RASTER_SIZE; ++i) begin: fine_x
for (j = 0; j < `GFX_RASTER_SIZE; ++j) begin: fine_y
gfx_raster_fine #(.X(i), .Y(j)) fine
(
.stall(fine_stall),
.pos(coarse_pos),
.corners(coarse_corners),
.barys(barys_ij[i][j]),
.paint(paint_ij[j * `GFX_RASTER_SIZE + i]),
.fragment(fragment_ij[i][j]),
.*
);
gfx_skid_buf #(.WIDTH($bits(frag_xy))) skid_fragment
(
.in(fragment_ij[i][j]),
.out(fragments[j * `GFX_RASTER_SIZE + i]),
.stall(fine_stall),
.*
);
gfx_skid_buf #(.WIDTH($bits(fixed_tri))) skid_barys
(
.in(barys_ij[i][j]),
.out(barys[j * `GFX_RASTER_SIZE + i]),
.stall(fine_stall),
.*
);
end
end
endgenerate
endmodule
|