diff options
| author | Alejandro Soto <alejandro@34project.org> | 2023-11-10 01:00:50 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2023-11-10 01:43:02 -0600 |
| commit | 39294ed7dbf2331651cd8fcca887e088bdcd2cfc (patch) | |
| tree | 0f6c3d590b1f1400f6c1f6ca98be1d0e15631312 /rtl | |
| parent | d5783a6ebde5d38fe72dd19293d9144827c35c56 (diff) | |
rtl/gfx: use packed arrays in module interfaces
Diffstat (limited to 'rtl')
| -rw-r--r-- | rtl/gfx/gfx_defs.sv | 56 | ||||
| -rw-r--r-- | rtl/gfx/gfx_fine.sv | 57 | ||||
| -rw-r--r-- | rtl/gfx/gfx_setup_offsets.sv | 14 |
3 files changed, 87 insertions, 40 deletions
diff --git a/rtl/gfx/gfx_defs.sv b/rtl/gfx/gfx_defs.sv index 45e1a63..60962e1 100644 --- a/rtl/gfx/gfx_defs.sv +++ b/rtl/gfx/gfx_defs.sv @@ -28,8 +28,9 @@ typedef logic[1:0] index4; `define INDEX4_MIN 2'b00 `define INDEX4_MAX 2'b11 -typedef logic[9:0] y_coord; 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; @@ -53,18 +54,65 @@ typedef struct packed `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_RASTER_BITS 2 -`define GFX_RASTER_SIZE (1 << GFX_RASTER_BITS) -`define GFX_RASTER_OFFSETS (1 << (2 * GFX_RASTER_BITS)) +`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 diff --git a/rtl/gfx/gfx_fine.sv b/rtl/gfx/gfx_fine.sv index 21292f2..6238025 100644 --- a/rtl/gfx/gfx_fine.sv +++ b/rtl/gfx/gfx_fine.sv @@ -3,46 +3,45 @@ module gfx_fine #(parameter X=0, Y=0) ( - input logic clk, - - input raster_xy pos, - input fixed corner_a, - corner_b, - corner_c, - input fixed offsets_a[`GFX_RASTER_OFFSETS], - offsets_b[`GFX_RASTER_OFFSETS], - offsets_c[`GFX_RASTER_OFFSETS], - input logic stall, - - output frag_xy fragment, - output logic paint + input logic clk, + + input raster_xy pos, + input fixed_tri corners, + input raster_offsets_tri offsets, + input logic stall, + + output frag_xy fragment, + output logic paint ); localparam INDEX = Y * `GFX_RASTER_SIZE + X; - fixed edge_a, edge_b, edge_c, offset_a, offset_b, offset_c; - logic sign_a, sign_b, sign_c; frag_xy fragment_hold; - - assign offset_a = offsets_a[INDEX]; - assign offset_b = offsets_b[INDEX]; - assign offset_c = offsets_c[INDEX]; - - assign sign_a = edge_a[$bits(edge_a) - 1]; - assign sign_b = edge_b[$bits(edge_b) - 1]; - assign sign_c = edge_c[$bits(edge_c) - 1]; + fixed_tri edges, per_edge_offsets; + logic[2:0] signs; + raster_xy_prec prec; + logic[`GFX_RASTER_BITS - 1:0] fine_x, fine_y; + + assign prec = pos; + assign fine_x = X; + assign fine_y = Y; + + always_comb + for (integer i = 0; i < 3; ++i) begin + signs[i] = edges[i][$bits(edges[0]) - 1]; + per_edge_offsets[i] = offsets[i][INDEX]; + end always_ff @(posedge clk) if (!stall) begin - paint <= !sign_a && !sign_b && !sign_c; + paint <= signs == 0; fragment <= fragment_hold; - fragment_hold.x <= pos.x.frag.num; - fragment_hold.y <= pos.y.frag.num; + fragment_hold.x <= {prec.x.coarse, fine_x}; + fragment_hold.y <= {prec.y.coarse, fine_y}; - edge_a <= corner_a + offset_a; - edge_b <= corner_b + offset_b; - edge_c <= corner_c + offset_c; + for (integer i = 0; i < 3; ++i) + edges[i] <= corners[i] + per_edge_offsets[i]; end endmodule diff --git a/rtl/gfx/gfx_setup_offsets.sv b/rtl/gfx/gfx_setup_offsets.sv index 3b615d5..a2a9415 100644 --- a/rtl/gfx/gfx_setup_offsets.sv +++ b/rtl/gfx/gfx_setup_offsets.sv @@ -2,13 +2,13 @@ module gfx_setup_offsets ( - input logic clk, + input logic clk, - input fixed inc_x, - inc_y, - input logic stall, + input fixed inc_x, + inc_y, + input logic stall, - output fixed offsets[`GFX_RASTER_OFFSETS] + output raster_offsets offsets ); fixed x_hold[`GFX_RASTER_SIZE], y_hold[`GFX_RASTER_SIZE], @@ -21,8 +21,8 @@ module gfx_setup_offsets assign y_multiples[1] = inc_y; assign x_multiples[2] = inc_x << 1; assign y_multiples[2] = inc_y << 1; - assign x_multiples[3] = (inc_x << 1) + a; - assign y_multiples[3] = (inc_y << 1) + b; + assign x_multiples[3] = (inc_x << 1) + inc_x; + assign y_multiples[3] = (inc_y << 1) + inc_y; genvar i; generate |
