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
|
`ifndef GFX_DEFS_SV
`define GFX_DEFS_SV
// Esto es arquitectural, no se puede ajustar sin cambiar otras cosas
`define FLOAT_BITS 16
`define FLOATS_PER_VEC 4
`define VECS_PER_MAT 4
// Target de 200MHz (reloj es 143MHz) con float16, rounding aproximado
`define FP_ADD_STAGES 10 // ~401 LUTs
`define FP_MUL_STAGES 5 // ~144 LUTs ~1 bloque DSP
`define FP_INV_STAGES 3 // ~178 LUTs ~1 bloque DSP
typedef logic[`FLOAT_BITS - 1:0] fp;
typedef fp vec2[2];
typedef fp vec4[`FLOATS_PER_VEC];
typedef vec4 mat4[`VECS_PER_MAT];
`define FP_UNIT 16'h3c00
typedef struct packed
{
fp x, y, z, w;
} attr4;
typedef logic[1:0] index4;
`define INDEX4_MIN 2'b00
`define INDEX4_MAX 2'b11
typedef logic[8:0] x_coord;
typedef logic[9:0] y_coord;
typedef logic[9:0] xy_coord;
typedef logic[18:0] linear_coord;
typedef logic[19:0] half_coord;
`define GFX_X_RES 640
`define GFX_Y_RES 480
`define GFX_LINEAR_RES (`GFX_X_RES * `GFX_Y_RES)
typedef struct packed
{
logic[7:0] r, g, b;
} rgb24;
typedef struct packed
{
logic[9:0] r, g, b;
} rgb30;
`define FIXED_FRAC 16
`define FIXED_FMA_STAGES 5
`define FIXED_FMA_DOT_STAGES (2 * `FIXED_FMA_STAGES)
typedef logic signed[31:0] fixed;
typedef fixed[2:0] fixed_tri;
typedef struct packed
{
fixed x, y;
} raster_xy;
typedef logic[7:0] coarse_dim;
`define GFX_MASK_SRAM_STAGES 3
`define GFX_MASK_STAGES (1 + `GFX_MASK_SRAM_STAGES + 1)
`define GFX_SCAN_STAGES 3 // Ajustable
`define GFX_SETUP_BOUNDS_STAGES 3
`define GFX_SETUP_EDGE_STAGES (1 + `FIXED_FMA_DOT_STAGES)
`define GFX_SETUP_OFFSETS_STAGES 2
`define GFX_SETUP_STAGES (`GFX_SETUP_BOUNDS_STAGES \
+ `GFX_SETUP_EDGE_STAGES \
+ `GFX_SETUP_OFFSETS_STAGES)
`define GFX_FINE_STAGES 2
`define GFX_RASTER_BITS 2
`define GFX_RASTER_SUB_BITS 4
`define GFX_RASTER_PAD_BITS ($bits(fixed) - $bits(coarse_dim) - `FIXED_FRAC - `GFX_RASTER_BITS - 1)
`define GFX_RASTER_SIZE (1 << `GFX_RASTER_BITS)
`define GFX_RASTER_OFFSETS (1 << (2 * `GFX_RASTER_BITS))
typedef struct packed
{
logic[`GFX_RASTER_SUB_BITS - 1:0] num;
logic[`FIXED_FRAC - `GFX_RASTER_SUB_BITS - 1:0] prec;
} raster_sub;
typedef struct packed
{
logic sign;
logic[`GFX_RASTER_PAD_BITS - 1:0] padding;
coarse_dim coarse;
logic[`GFX_RASTER_BITS - 1:0] fine;
raster_sub sub;
} raster_prec;
typedef struct packed
{
raster_prec x, y;
} raster_xy_prec;
typedef fixed[`GFX_RASTER_OFFSETS - 1:0] raster_offsets;
typedef raster_offsets[2:0] raster_offsets_tri;
`define GFX_FINE_LANES (`GFX_RASTER_SIZE * `GFX_RASTER_SIZE)
typedef struct packed
{
xy_coord x, y;
} frag_xy;
typedef frag_xy[`GFX_FINE_LANES - 1:0] frag_xy_lanes;
typedef logic[`GFX_FINE_LANES - 1:0] paint_lanes;
`endif
|